Study/database

Galera Cluster๋ฅผ ํ†ตํ•œ MariaDB ํด๋Ÿฌ์Šคํ„ฐ๋ง ๊ตฌ์„ฑ (2) Galera Cluster ๋™์ž‘ ์›๋ฆฌ

Shinjio 2025. 2. 20. 22:03
๋ฐ˜์‘ํ˜•

์ง€๋‚œ ๊ธ€์—์„œ MariaDB ํด๋Ÿฌ์Šคํ„ฐ๋ง์„ ์œ„ํ•œ ๋‘๊ฐ€์ง€ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์•˜๋‹ค.

 

Galera Cluster๋ฅผ ํ†ตํ•œ MariaDB ์ด์ค‘ํ™” ๊ตฌ์„ฑ (1) MariaDB ์ด์ค‘ํ™” ์ข…๋ฅ˜(Replication, Galera Cluster)

DB ํ˜น์€ ์Šคํ”„๋ง ๋ถ€ํŠธ ์„œ๋ฒ„์™€ ๊ฐ™์€ ์‹œ์Šคํ…œ์„ ๊ตฌ์„ฑํ•  ๋•Œ, ๋‹จ ํ•˜๋‚˜์˜ ์„œ๋ฒ„๋ณด๋‹ค๋Š” ์ด์ค‘ํ™” ํ˜น์€ ๊ทธ ์ด์ƒ์œผ๋กœ ํ•˜์—ฌ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์„ค๊ณ„ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค. ์ด์ค‘ํ™”์˜ ๋ชฉ์ ์€ ๊ณ ๊ฐ€์šฉ์„ฑ์ธ๋ฐ, ์žฌํ•ด ๋ฐœ์ƒ์ด๋‚˜ ์˜ˆ

danyoujeong.tistory.com

 

Replication์„ ํ†ตํ•ด Master-Slave ๋ฐฉ์‹์œผ๋กœ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ Galera Cluster๋ฅผ ํ†ตํ•ด ๋ฉ€ํ‹ฐ ๋งˆ์Šคํ„ฐ ๋ฐฉ์‹์œผ๋กœ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ์‹์— ๋Œ€ํ•ด ๊ฐœ๋… ์ •๋„๋ฅผ ์•Œ์•„๋ณด์•˜๋Š”๋ฐ, ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ๊ทธ๋ž˜์„œ ์‹ค์ œ๋กœ Galera Cluster ์–ด๋–ค ๋™์ž‘ ๋ฐฉ์‹์œผ๋กœ ๋ณต์ œ๋ฅผ ์ง„ํ–‰ํ•˜๋Š”์ง€ ์ž‘์„ฑํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค. 

 

Galera Cluster ๋™์ž‘ ์›๋ฆฌ ์ดํ•ดํ•˜๊ธฐ

https://galeracluster.com/library/galera-documentation.pdf

 

 

โ€ป ํ•ด๋‹น ๊ทธ๋ฆผ์€ Galera Cluster ๋™์ž‘ ์ˆœ์„œ๋ฅผ ๊ฐ„๋žตํ•˜๊ฒŒ ๋‚˜ํƒ€๋‚ธ ๊ทธ๋ฆผ์œผ๋กœ ์‹ค์ œ์™€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž˜๋ชป๋œ ๋ถ€๋ถ„์ด ์žˆ๋‹ค๋ฉด ๋Œ“๊ธ€๋กœ ๋‚จ๊ฒจ์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. 

 

โœ… Galera Cluster์˜ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ(์“ฐ๊ธฐ ํŠธ๋žœ์žญ์…˜) ๊ณผ์ •

1. ํด๋ผ์ด์–ธํŠธ๊ฐ€ Primary ๋…ธ๋“œ์— ํŠธ๋žœ์žญ์…˜์„ ์š”์ฒญํ•œ๋‹ค. 

ํด๋ผ์ด์–ธํŠธ๊ฐ€ Primary ๋…ธ๋“œ(#1)์— ์“ฐ๊ธฐ ํŠธ๋žœ์žญ์…˜(ex. INSERT, UPDATE, DELETE)์„ ์š”์ฒญํ•œ๋‹ค. 

Primary ๋…ธ๋“œ๋Š” ์ด ํŠธ๋žœ์žญ์…˜์„ ๋กœ์ปฌ(MariaDB ์—”์ง„)์—์„œ ์‹คํ–‰ํ•˜๊ณ , ๋ณ€๊ฒฝ๋œ ๋ฐ์ดํ„ฐ๋ฅผ Write-Set์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ GCache์— ์ €์žฅํ•œ๋‹ค. ์ด ๋•Œ Commit์€ ํ•˜์ง€ ์•Š๋Š”๋‹ค. 

 

2. Write Set์„ gcomm์„ ํ†ตํ•ด ๋ชจ๋“  ๋…ธ๋“œ๋กœ ์ „ํŒŒํ•œ๋‹ค. (Broadcast)

Galera์˜ gcomm ๋ ˆ์ด์–ด๊ฐ€ Write Set์„ ๋ชจ๋“  ๋…ธ๋“œ์— ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ ํ•œ๋‹ค. 

์ด ๊ณผ์ •์—์„œ ๋ชจ๋“  ๋…ธ๋“œ๋Š” ๋™์ผํ•œ Global Order๋ฅผ ์ ์šฉ ๋ฐ›์•„ ๊ฐ™์€ ์ˆœ์„œ๋กœ Write Set์„ ์ˆ˜์‹ ํ•œ๋‹ค. 

Write Set์„ ์ˆ˜์‹ ํ•œ ๋…ธ๋“œ๋Š” Certification Queue์— ๋„ฃ๊ณ  ํŠธ๋žœ์žญ์…˜ ์ถฉ๋Œ ์—ฌ๋ถ€๋ฅผ ๊ฒ€์‚ฌํ•œ๋‹ค. 

 

Write-Set์€ ์•„๋ž˜์™€ ๊ฐ™์€ JSON ํ˜•ํƒœ๋กœ ๋˜์–ด์žˆ๋‹ค. Primary ๋…ธ๋“œ๋กœ๋ถ€ํ„ฐ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ๋ฅผ ๋ฐ›์•˜์„ ๋•Œ๋Š” ์•„์ง ์ธ์ฆ ๊ณผ์ •์ด ์ด๋ฃจ์–ด์ง€์ง€ ์•Š์•„ certification_Info๋Š” ๋น„์–ด์žˆ๋Š” ์ƒํƒœ์ด๋‹ค. 

{
  "GTID": "abc123-456-def789:10", //ํŠธ๋žœ์žญ์…˜ ์‹๋ณ„์„ ์œ„ํ•œ ๊ณ ์œ  ID
  "Seq_Num": 15, //ํŠธ๋žœ์žญ์…˜ ์‹คํ–‰ ์ˆœ์„œ(Global Order)
  "Table": "users", //ํ…Œ์ด๋ธ”๋ช…
  "Primary_Key": {"id": 1}, 
  "Row_Data": { //๋ณ€๊ฒฝ๋œ ํ–‰์˜ ๋ฐ์ดํ„ฐ
    "old": {"balance": 500},
    "new": {"balance": 400}
  },
  "Transaction_Type": "UPDATE", 
  "Binlog_Events": [ //Binlog ๊ธฐ๋ฐ˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ
    {
      "Type": "UPDATE",
      "Table": "users",
      "Set": {"balance": 400},
      "Where": {"id": 1}
    }
  ],
  "Certification_Info": { //์ถฉ๋Œ๊ฒ€์‚ฌ๊ฒฐ๊ณผ
  }
}

 

 

3. ๊ฐ ๋…ธ๋“œ(#1, #2, #3)์—์„œ Certification์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. 

๊ฐ ๋…ธ๋“œ๋Š” ์ž์‹ ์ด ๋ฐ›์€ Write Set์„ Certification์„ ์ง„ํ–‰ํ•œ๋‹ค. 

Cetification ๊ณผ์ •์—์„œ๋Š” ์•„๋ž˜์˜ ๋‚ด์šฉ์„ ํ™•์ธํ•œ๋‹ค. 

  • ์ถฉ๋Œ ๊ฒ€์‚ฌ (๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜๊ณผ ์ถฉ๋Œํ•˜๋Š”์ง€ ํ™•์ธ)
  • Write Set์ด ํ˜„์žฌ ํŠธ๋žœ์žญ์…˜ ์ˆœ์„œ์™€ ์ผ๊ด€์„ฑ์ด ์žˆ๋Š”์ง€ ๊ฒ€์ฆ

๊ฒฐ๊ณผ๋Š” ์ธ์ฆ์— ํ†ต๊ณผํ•˜๋ฉด OK, ์ถฉ๋Œ ๋ฐœ์ƒ์‹œ WF_ABORT๋กœ ์ •์˜ํ•œ๋‹ค. 

Galera๋Š” ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ๋ฉ”์‹œ์ง•์„ ํ†ตํ•ด ์ด Certification ๊ฒฐ๊ณผ๋ฅผ ๋ชจ๋“  ๋…ธ๋“œ์— ๊ณต์œ ํ•˜๋ฉฐ, ํ•œ ๋…ธ๋“œ๋ผ๋„ WF_ABORT์ด๋ฉด ํŠธ๋žœ์žญ์…˜์„ ํ๊ธฐํ•œ๋‹ค.

 

์ถฉ๋Œ ๊ฒ€์‚ฌ ๊ฒฐ๊ณผ๋ฅผ ํฌํ•จํ•œ Write Set ๋ฐ์ดํ„ฐ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค. 

{
  "GTID": "abc123-456-def789:10",
  "Seq_Num": 15,
  "Table": "users",
  "Primary_Key": {"id": 1},
  "Row_Data": {
    "old": {"balance": 500},
    "new": {"balance": 400}
  },
  "Transaction_Type": "UPDATE",
  "Binlog_Events": [
    {
      "Type": "UPDATE",
      "Table": "users",
      "Set": {"balance": 400},
      "Where": {"id": 1}
    }
  ],
  "Certification_Info": {
    "Status": "OK",
    "Conflict_Check": false
  }
}

 

 

4. ๊ฐ ๋…ธ๋“œ(#2, #3)๋Š” Certification์— ํ†ต๊ณผํ•œ Write Set์„ Apply Queue์— ์ถ”๊ฐ€ํ•œ๋‹ค. 

 

5. Apply Queue์— ์ €์žฅ๋œ Write Set์„ ํŠธ๋žœ์žญ์…˜์— ์ ์šฉํ•œ๋‹ค. 

๋ชจ๋“  ๋…ธ๋“œ๋Š” ์ž์‹ ์˜ Apply Queue์— ๋“ค์–ด์˜จ Write Set์„ ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ฐ˜์˜ํ•œ๋‹ค. 

 

8. Commit ์™„๋ฃŒ ํ›„ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. 

 

โญ ๊ฐ ๋…ธ๋“œ์—์„œ Certification ์ค‘ ์ถฉ๋Œ์„ ๊ฐ์ง€ํ•˜๋ฉด?

Certification ์ค‘ ์ถฉ๋Œ์„ ๊ฐ์ง€ํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌ๋ ๊นŒ?

์ถฉ๋Œ์ด ๋ฐœ์ƒํ•œ ๋…ธ๋“œ๋Š” WF_ABORT๋Š” Write-Set Certification_Info์— ์ถ”๊ฐ€ํ•œ๋‹ค. 

 

{
  "GTID": "abc123-456-def789:10",
  "Seq_Num": 15,
  "Table": "users",
  "Primary_Key": {"id": 1},
  "Row_Data": {
    "old": {"balance": 500},
    "new": {"balance": 400}
  },
  "Transaction_Type": "UPDATE",
  "Binlog_Events": [
    {
      "Type": "UPDATE",
      "Table": "users",
      "Set": {"balance": 400},
      "Where": {"id": 1}
    }
  ],
  "Certification_Info": {
    "Status": "WF_ABORT", 
    "Conflict_Check": true
  }
}

 

Galera๋Š” ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜๋ฉด ๋ชจ๋“  ๋…ธ๋“œ๊ฐ€ ์ด๋ฅผ ๋ฐ˜์˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋˜์—ˆ๋‹ค. Galera์˜ gcomm ๋ ˆ์ด์–ด๋ฅผ ํ†ตํ•ด ํŠธ๋žœ์žญ์…˜ ์‹คํŒจ ์ •๋ณด๊ฐ€ ๊ณต์œ ๋˜๊ณ  ๋ชจ๋“  ๋…ธ๋“œ๋Š” ํ•ด๋‹น Write Set์„ Apply Queue์— ๋„ฃ์ง€ ์•Š๊ณ  ํ๊ธฐํ•œ๋‹ค. 

 

์ด ๋•Œ Primary ๋…ธ๋“œ๋Š” ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ํŠธ๋žœ์žญ์…˜ ์‹คํŒจ ์‘๋‹ต์„ ํ•˜๊ณ  ํด๋ผ์ด์–ธํŠธ๋Š” ์ด ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์žฌ์‹œ๋„ํ•˜๊ฑฐ๋‚˜ ๋กค๋ฐฑ ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. 


 

์ง€๊ธˆ๊นŒ์ง€ Galera Cluster๊ฐ€ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚˜๋ฉด ์–ด๋–ป๊ฒŒ Replication์„ ์ง„ํ–‰ํ•˜๋Š”์ง€ ์•Œ์•„๋ณด์•˜๋‹ค. ๋‹ค์Œ ์‹œ๊ฐ„๋ถ€ํ„ฐ๋Š” ์‹ค์ œ Galera Cluster๋ฅผ ์–ด๋–ป๊ฒŒ ์ ์šฉํ•˜๋Š”์ง€ ์•Œ์•„๋ณด๊ณ ์ž ํ•œ๋‹ค.

๋ฐ˜์‘ํ˜•