๊ด€๋ฆฌ ๋ฉ”๋‰ด

JiYoung Dev ๐Ÿ–ฅ

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

Study/database

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

Shinjio 2025. 2. 19. 22:24
๋ฐ˜์‘ํ˜•

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

 

์˜ค๋Š˜์€ DB ์ค‘์—์„œ๋„ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํ•œ ์ข…๋ฅ˜์ธ MariaDB๋ฅผ ์ด์ค‘ํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ณ ์ž ํ•œ๋‹ค. 

ํ•„์ž๋Š” MariaDB์˜ ์—ฌ๋Ÿฌ ์ด์ค‘ํ™” ๋ฐฉ๋ฒ• ์ค‘์—์„œ Galera Cluster๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด์ค‘ํ™”๋ฅผ ์‹œ๋„ํ–ˆ๊ณ , ๊ทธ ๊ณผ์ •๊ณผ ๊ด€๋ จ๋œ ์ด๋ก ์„ ์ •๋ฆฌํ•ด ๋ณด์•˜๋‹ค. 


โญMariaDB๋ฅผ ์ด์ค‘ํ™”ํ•˜๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฐฉ๋ฒ•๋“ค

๋ณธ๋ก ์— ๋“ค์–ด๊ฐ€๊ธฐ์— ์•ž์„œ MariaDB๋ฅผ ์ด์ค‘ํ™”ํ•˜๋Š” ์—ฌ๋Ÿฌ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋จผ์ € ์•Œ์•„๋ณด์ž. Galera Cluster๋ฅผ ํ†ตํ•œ ๋ฐฉ๋ฒ•๋„ ์žˆ์ง€๋งŒ, MariaDB ์ž์ฒด์—์„œ ์ง€์›ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ†ตํ•ด์„œ๋„ ์ด์ค‘ํ™”๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. 

 


1. MariaDB Replication

Master-Slave Replication (๋น„๋™๊ธฐ ๋ณต์ œ, ํ‘œ์ค€ ๋ฐฉ์‹)

MariaDB Replication์€ ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„œ๋ฒ„(Primary, Master)์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฅธ ์„œ๋ฒ„(Replica, Slave)๋กœ ๋ณต์ œํ•˜์—ฌ ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ์„ ์œ ์ง€ํ•˜๊ณ , ๊ณ ๊ฐ€์šฉ์„ฑ๊ณผ ๋ถ€ํ•˜๋ถ„์‚ฐ์„ ์ง€์›ํ•˜๋Š” ๊ธฐ์ˆ ์ด๋‹ค.  

 

๋ฐ”์ด๋„ˆ๋ฆฌ ๋กœ๊ทธ(Binary Log)๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ณต์ œ๊ฐ€ ์ด๋ฃจ์–ด์ง€๋Š” ๋ฐฉ์‹์ด๋‚˜ ์ฟผ๋ฆฌ ํ˜น์€ Row ๊ธฐ๋ฐ˜์˜ ๋ณต์ œ ๋ฐฉ์‹๋„ ์ง€์›ํ•œ๋‹ค. 

๋ฐ”์ด๋„ˆ๋ฆฌ ๋กœ๊ทธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ณต์ œ๊ฐ€ ์ด๋ฃจ์–ด์ง„๋‹ค๋Š” ๊ฒƒ์€ ์–ด๋–ค ์˜๋ฏธ์ผ๊นŒ? ๋™์ž‘ ๋ฐฉ์‹์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค. 

 

1) Master๊ฐ€ Insert, update, delete์™€ ๊ฐ™์€ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ฉด, ์ด๋ฅผ Binary Log์— ๊ธฐ๋กํ•œ๋‹ค. ์‹ค์ œ MariaDB์—์„œ๋Š” binlog ํŒŒ์ผ์„ ํ†ตํ•ด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋กœ๊ทธ๋กœ ๊ด€๋ฆฌํ•œ๋‹ค. 

2) Slave๋Š” Master์˜ Binary Log๋ฅผ I/O Thread๋ฅผ ํ†ตํ•ด ๊ฐ€์ ธ์™€ Relay Log์— ์ €์žฅํ•œ๋‹ค. 

3) Slave์˜ SQL Thread๊ฐ€ Relay Log๋ฅผ ์‹คํ–‰ํ•˜์—ฌ Master์˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๋ฐ˜์˜ํ•œ๋‹ค. 

4) Slave์˜ ๋ฐ์ดํ„ฐ๊ฐ€ Master์™€ ๋™๊ธฐํ™”๋œ๋‹ค. 

 

Replication์—์„œ Slave ์„œ๋ฒ„๋Š” Master ์„œ๋ฒ„์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ณต์ œํ•˜๊ธฐ ์œ„ํ•ด ๋‘ ๊ฐœ์˜ ์ฃผ์š” ์“ฐ๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. 

I/O Thread
- Master ์„œ๋ฒ„์— ์ ‘์†ํ•ด์„œ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋กœ๊ทธ(Binary Log)๋ฅผ ์ฝ์–ด์˜จ๋‹ค. 
- ๊ฐ€์ ธ์˜จ ๋กœ๊ทธ๋ฅผ Relay Log(์ค‘๊ฐ„ ๋กœ๊ทธ ํŒŒ์ผ)์— ์ €์žฅํ•œ๋‹ค.

SQL Thread
- Relay Log์— ๊ธฐ๋ก๋œ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์‹ค์ œ ๋ฐ์ดํ„ฐ์— ๋ณ€๊ฒฝ ์ ์šฉํ•œ๋‹ค. 

 

Slave๋Š” Master์—์„œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋ฐœ์ƒํ•จ์„ ๊ฐ์ง€ํ•˜๊ธฐ ์œ„ํ•ด Polling ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•œ๋‹ค. ์ฆ‰, Slave์˜ I/O Thread๋Š” Master์˜ Binary Log๋ฅผ "Polling" ๋ฐฉ์‹์œผ๋กœ ํ™•์ธํ•˜๊ณ  ๊ฐ€์ ธ์˜ค๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. 

 

Master ์„œ๋ฒ„์™€ Slave ์„œ๋ฒ„๋ฅผ ์„ค์ • ํ›„ START SLAVE; ๋ฅผ ํ†ตํ•ด Replication์„ ์‹œ์ž‘ํ•˜๋ฉด, Slave๊ฐ€ I/O Thread๊ฐ€ ์‹œ์ž‘๋˜๊ณ , ์“ฐ๋ ˆ๋“œ๊ฐ€ Master์— ์ฃผ๊ธฐ์ ์œผ๋กœ ์ƒˆ๋กœ์šด Binary Log๊ฐ€ ์žˆ๋Š”์ง€ ์š”์ฒญํ•˜๋Š” ๊ฒƒ์ด๋‹ค. 

 

 

Master-Slave ๋ฐฉ์‹์˜ ๋ณต์ œ ๋ฐฉ์‹ ์™ธ์— Master-Master, Multi-Source ๋“ฑ์˜ ๋ฐฉ์‹ ๋˜ํ•œ ์กด์žฌํ•œ๋‹ค. 

 


2.  MariaDB Galera Cluster

MariaDB Galera Cluster๋Š” ๋™๊ธฐ์‹ Multi-Master ๋ณต์ œ(Synchronous Multi-Master Replication)๋ฅผ ์ง€์›ํ•˜๋Š” ํด๋Ÿฌ์Šคํ„ฐ ์†”๋ฃจ์…˜์œผ๋กœ, ๋ชจ๋“  ๋…ธ๋“œ๊ฐ€ ๋™๋“ฑํ•œ Master ์—ญํ• ์„ ํ•˜๋ฉฐ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•˜๋Š” ๊ตฌ์กฐ์ด๋‹ค. 

 

Galera Cluster๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ช‡ ๊ฐ€์ง€ ๊ฐœ๋…์— ๋Œ€ํ•ด ์ดํ•ดํ•  ํ•„์š”์„ฑ์ด ์žˆ๋‹ค. ํ•ด๋‹น ๊ฐœ๋…๋“ค์„ ์ดํ•ดํ•จ์œผ๋กœ์จ ์–ด๋–ป๊ฒŒ Galera Cluster๊ฐ€ ๋™๊ธฐ์‹ ๋ฉ€ํ‹ฐ ๋งˆ์Šคํ„ฐ๋ฅผ ์ง€์›ํ•˜๋Š”์ง€์— ๋Œ€ํ•ด ๋Œ€๋žต์ ์œผ๋กœ ์•Œ์•„๋ณด์ž.

 

๐Ÿ”Ž ์ธ์ฆ ๊ธฐ๋ฐ˜ ๋ณต์ œ (Certification-Based Replication)

Galera Cluster๋Š” ๊ทธ๋ฃน ํ†ต์‹ ๊ณผ ํŠธ๋žœ์žญ์…˜ ์ •๋ ฌ ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ๋™๊ธฐ ๋ณต์ œ๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค. 

ํŠธ๋žœ์žญ์…˜์€ ๊ฐœ๋ณ„ ๋…ธ๋“œ์—์„œ ์‹คํ–‰๋˜๋ฉฐ, ์ปค๋ฐ‹ ์‹œ์ ์— ์ „์ฒด ํด๋Ÿฌ์Šคํ„ฐ์™€ ๋™๊ธฐํ™”๋˜์–ด ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•œ๋‹ค. 

์ด์— ๋Œ€ํ•œ ๋‚ด์šฉ์€ ์œ„์˜ ๋‘ ๋ฌธ์žฅ๋งŒ์œผ๋กœ ์ดํ•ดํ•˜๊ธฐ ํž˜๋“ค ๊ฒƒ์ด๋‹ค. ๊ด€๋ จ๋œ ๋‚ด์šฉ์€ ์•„๋ž˜์˜ Galera Cluster ๋ณต์ œ ๊ณผ์ •๊ณผ ํ†ต์‹  ๋ฐฉ์‹ ๋ถ€๋ถ„์„ ์ฝ์œผ๋ฉด ์–ด๋Š ์ •๋„ ์ดํ•ด๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค. 

 

๐Ÿ”Ž Replication API

Galera Cluster๋Š” wresp API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Write-set ๋ณต์ œ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค. 

1. ํ•œ ๋…ธ๋“œ์—์„œ ๋ฐ์ดํ„ฐ์˜ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋œ๋‹ค. 
2. wsrep API๊ฐ€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์“ฐ๊ธฐ ์ง‘ํ•ฉ(write-set)์œผ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค. 
3. Galera ๋ณต์ œ ํ”Œ๋Ÿฌ๊ทธ์ธ(Galera Replication Plugin)์ด ์ธ์ฆ ๋ฐ ๋ณต์ œ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค. 
4. ๋ชจ๋“  ๋…ธ๋“œ๊ฐ€ ๋™์ผํ•œ ์ˆœ์„œ๋กœ ํŠธ๋žœ์žญ์…˜์„ ์ ์šฉํ•œ๋‹ค. 

 

๐Ÿ”Ž ๊ฒฉ๋ฆฌ ์ˆ˜์ค€(Isolation Levels)

Galera Cluster๋Š” ์•„๋ž˜์˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์„ ์ง€์›ํ•œ๋‹ค. 

  • READ-UNCOMMITED: ํŠธ๋žœ์žญ์…˜์ด ์ปค๋ฐ‹๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๋„ ์ฝ์„ ์ˆ˜ ์žˆ์Œ
  • READ-COMMITED: ์ปค๋ฐ‹๋œ ๋ฐ์ดํ„ฐ๋งŒ ์ฝ์„ ์ˆ˜ ์žˆ์ง€๋งŒ, ๋ฐ˜๋ณต ๋ถˆ๊ฐ€๋Šฅํ•œ ์ฝ๊ธฐ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ
  • REPEATABLE-READ: ์ฒซ ๋ฒˆ์งธ SELECT ์‹คํ–‰ ์‹œ์ ์˜ ์Šค๋ƒ…์ƒท์„ ์œ ์ง€ํ•˜์—ฌ ๋ฐ˜๋ณต ๊ฐ€๋Šฅ์„ฑ์„ ๋ณด์žฅํ•จ
  • SERIALIZABLE: ํŠธ๋žœ์žญ์…˜ ๊ฐ„ ์™„์ „ํ•œ ๊ฒฉ๋ฆฌ๋ฅผ ๋ณด์žฅํ•˜์ง€๋งŒ ์„ฑ๋Šฅ์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ์Œ

๐Ÿ”Ž ์ƒํƒœ ์ „์†ก (State Transfer)

ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด ๋…ธ๋“œ ๊ฐ„ ๋™๊ธฐํ™”๋ฅผ ์œ„ํ•œ ๋‘๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค. 

  • State Snapshot Transfer (SST)
    • ๋…ธ๋“œ ์ „์ฒด ๋ฐ์ดํ„ฐ์˜ ์Šค๋ƒ…์ƒท์„ ์ „์†กํ•˜์—ฌ ๋™๊ธฐํ™”ํ•˜๋Š” ๋ฐฉ์‹
    • mysqldump, rsync, xtrabackup ๋“ฑ์„ ์‚ฌ์šฉ
    • ์ƒˆ ๋…ธ๋“œ๊ฐ€ ํด๋Ÿฌ์Šคํ„ฐ์— ์ถ”๊ฐ€๋  ๋•Œ ์‚ฌ์šฉ
  • Incremental State Transfer (IST)
    • ๊ธฐ์กด ๋…ธ๋“œ์˜ ๋ˆ„๋ฝ๋œ ํŠธ๋žœ์žญ์…˜๋งŒ ์ „์†กํ•˜์—ฌ ๋™๊ธฐํ™”
    • gcache๋ฅผ ์ด์šฉํ•ด ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ์ „๋‹ฌ
    • ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ์„ ์ค„์ด๊ณ  ์†๋„๋ฅผ ํ–ฅ์ƒ์‹œํ‚ด

๐Ÿ”Ž ํ๋ฆ„ ์ œ์–ด (Flow Control)

Galera Cluster๋Š” ํ”ผ๋“œ๋ฐฑ ๊ธฐ๋ฐ˜์˜ ํ๋ฆ„ ์ œ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋…ธ๋“œ ๊ฐ„ ๋™๊ธฐํ™”๋ฅผ ์กฐ์ •ํ•œ๋‹ค. 

๋…ธ๋“œ๊ฐ€ ๋„ˆ๋ฌด ๋Š๋ฆฌ๊ฒŒ ํŠธ๋žœ์žญ์…˜์„ ์ฒ˜๋ฆฌํ•˜๋ฉด ๋ณต์ œ๋ฅผ ์ผ์‹œ ์ค‘์ง€ํ•˜๊ณ  ๋”ฐ๋ผ์žก์„ ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค. 

gcs.fc_limit ๋“ฑ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํ†ตํ•ด ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ ์†๋„๋ฅผ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

๐Ÿ”Ž ๋…ธ๋“œ ์žฅ์•  ๋ฐ ๋ณต๊ตฌ (Node Failure & Recovery)

๋…ธ๋“œ๊ฐ€ ํด๋Ÿฌ์Šคํ„ฐ์™€์˜ ์—ฐ๊ฒฐ์„ ์žƒ์œผ๋ฉด ์žฅ์•  ์ƒํƒœ๋กœ ๊ฐ„์ฃผ๋˜๋Š”๋ฐ ์žฅ์•  ๋ฐœ์ƒ ์‹œ ์ฟผ๋Ÿผ(quorum) ๊ณ„์‚ฐ์„ ํ†ตํ•ด ํด๋Ÿฌ์Šคํ„ฐ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•œ๋‹ค. ๋…ธ๋“œ ๋ณต๊ตฌ ์‹œ์—๋Š” SST ๋˜๋Š” IST๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋™๊ธฐํ™”๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค. 

 

๐Ÿ”Ž ์ฟผ๋Ÿผ(Quorum) ๊ตฌ์„ฑ ์š”์†Œ

Galera Cluster์—์„œ๋Š” ํด๋Ÿฌ์Šคํ„ฐ์˜ ๊ฐ€์šฉ์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ฟผ๋Ÿผ ๊ธฐ๋ฐ˜์˜ ์˜์‚ฌ ๊ฒฐ์ •์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. 

  • ์ฟผ๋Ÿผ(Quorum): ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด์—์„œ ๊ณผ๋ฐ˜์ˆ˜ ์ด์ƒ(50% + 1)์˜ ๋…ธ๋“œ๊ฐ€ ๋™์ž‘ํ•˜๋Š” ๊ฒฝ์šฐ ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ์œ ์ง€๋œ๋‹ค. 
  • ๋ฌด๊ฒŒ ๊ธฐ๋ฐ˜ ์ฟผ๋Ÿผ(Weighted Quorum): ํŠน์ • ๋…ธ๋“œ์— ๋” ๋†’์€ ๊ฐ€์ค‘์น˜๋ฅผ ๋ถ€์—ฌํ•˜์—ฌ ์•ˆ์ •์„ฑ์„ ํ™•๋ณดํ•œ๋‹ค. 
  • ๋„คํŠธ์›Œํฌ ๋ถ„ํ•  ๋ฐœ์ƒ ์‹œ, ํด๋Ÿฌ์Šคํ„ฐ๋Š” Primary Component์™€ Non-Primary Component๋กœ ๋‚˜๋‰œ๋‹ค. 

Galera Cluster๋Š” ์ฟผ๋Ÿผ(Quorum) ๋ฌธ์ œ์™€ ๋„คํŠธ์›Œํฌ ๋ถ„ํ• (Split-Brain) ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด ์ตœ์†Œ 3๊ฐœ์˜ ๋…ธ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ํ™€์ˆ˜ ๊ฐœ์˜ ๋…ธ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์„ ๊ถŒ์žฅํ•œ๋‹ค.

 

โœ… 1. ํด๋Ÿฌ์Šคํ„ฐ ์ฟผ๋Ÿผ ๋ฌธ์ œ

Galera Cluster๋Š” ๊ณผ๋ฐ˜์ˆ˜ ํˆฌํ‘œ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ์˜ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•œ๋‹ค. 

๊ทธ๋Ÿฐ๋ฐ ๋งŒ์•ฝ ๋…ธ๋“œ๊ฐ€ 2๊ฐœ ๋ฟ์ด๋ผ๋ฉด, 1๊ฐœ์˜ ๋…ธ๋“œ๊ฐ€ ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•ด ๋‹ค์šด๋์„ ๊ฒฝ์šฐ ๋‚จ์€ ํ•œ ๊ฐœ์˜ ๋…ธ๋“œ๋Š” ๋‹จ๋…์œผ๋กœ Primary Component๊ฐ€ ๋  ์ˆ˜ ์—†๋‹ค. ์ฆ‰, ํ•œ ๊ฐœ์˜ ๋…ธ๋“œ๊ฐ€ ์ฃฝ์œผ๋ฉด ๋‚˜๋จธ์ง€ ๋…ธ๋“œ๋„ ๋น„ํ™œ์„ฑํ™” ์ƒํƒœ๊ฐ€ ๋˜๋Š” ๊ฒƒ์ด๋‹ค. 

๋”ฐ๋ผ์„œ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์œ ์ง€ํ•˜๋ ค๋ฉด ์ตœ์†Œ 3๊ฐœ์˜ ๋…ธ๋“œ๊ฐ€ ์žˆ์–ด์•ผ ๋‹ค์ˆ˜๊ฒฐ์„ ํ†ตํ•ด ์ •์ƒ์ ์ธ Primary Component๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

โœ… 2. ๋„คํŠธ์›Œํฌ ๋ถ„ํ• (Split Brain) ๋ฐฉ์ง€

๋„คํŠธ์›Œํฌ ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ 2๊ฐœ์˜ ๊ทธ๋ฃน์œผ๋กœ ๋‚˜๋‰  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค. ๋งŒ์•ฝ ์ง์ˆ˜๊ฐœ์˜ ๋…ธ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ์–ด๋Š ์ชฝ๋„ ๊ณผ๋ฐ˜์ˆ˜๋ฅผ ํ™•๋ณดํ•˜์ง€ ๋ชปํ•ด ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ๋น„ํ™œ์„ฑํ™” ๋  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ด 4๊ฐœ์˜ ๋…ธ๋“œ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์—ˆ๋Š”๋ฐ ๋„คํŠธ์›Œํฌ ๋ฌธ์ œ๋กœ 2๊ฐœ์˜ ๋…ธ๋“œ๋ผ๋ฆฌ๋งŒ ๋„คํŠธ์›Œํฌ ํ†ต์‹ ์ด ๋˜์–ด 2:2๋กœ ๋‚˜๋‰  ์ˆ˜ ์žˆ๋‹ค. 2:2์ธ ๊ฒฝ์šฐ ์–ด๋Š์ชฝ๋„ ๊ณผ๋ฐ˜์ˆ˜ ์ด์ƒ์ด ์•„๋‹ˆ๋ฏ€๋กœ ๋‘ ๊ฐœ์˜ ๊ทธ๋ฃน์ด ๋ชจ๋‘ ๋น„ํ™œ์„ฑํ™” ๋…ธ๋“œ๊ฐ€ ๋˜์–ด ๋ฒ„๋ฆฐ๋‹ค. 

๋ฐ˜๋ฉด, ์ด 5๊ฐœ์˜ ๋…ธ๋“œ๋กœ ๊ตฌ์„ฑ์ด ๋˜์—ˆ๋Š”๋ฐ ๋„คํŠธ์›Œํฌ ์žฅ์• ๋กœ ๊ทธ๋ฃน์ด 2๊ฐœ๋กœ ๋‚˜๋‰  ๊ฒฝ์šฐ ํ•˜๋‚˜์˜ ๊ทธ๋ฃน์€ 3๊ฐœ์˜ ๋…ธ๋“œ๋กœ ๊ตฌ์„ฑ๋˜๊ณ , ๋‹ค๋ฅธ ๋…ธ๋“œ๋Š” 2๊ฐœ์˜ ๋…ธ๋“œ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. ๊ทธ๋Ÿด ๊ฒฝ์šฐ 3๊ฐœ์˜ ๋…ธ๋“œ๊ฐ€ ์†ํ•œ ๊ทธ๋ฃน์ด ๊ณผ๋ฐ˜์ˆ˜ ์ด์ƒ์ด๊ธฐ ๋•Œ๋ฌธ์— 3๊ฐœ์˜ ๋…ธ๋“œ ๊ทธ๋ฃน์€ ๋น„ํ™œ์„ฑํ™” ๋˜์ง€ ์•Š๊ณ  ๊ณ„์† ์šด์˜์ด ๋œ๋‹ค. 

 

 

๐Ÿ”Ž ์ŠคํŠธ๋ฆฌ๋ฐ ๋ณต์ œ (Streaming Replication)

์ผ๋ฐ˜์ ์œผ๋กœ ํŠธ๋žœ์žญ์…˜์€ ์ปค๋ฐ‹๋  ๋•Œ๋งŒ ๋ณต์ œ ๋ฐ ์ธ์ฆ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋Œ€์šฉ๋Ÿ‰์˜ ํŠธ๋žœ์žญ์…˜์ด ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ ์ŠคํŠธ๋ฆฌ๋ฐ ๋ณต์ œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠธ๋žœ์žญ์…˜์„ ์—ฌ๋Ÿฌ ์กฐ๊ฐ์œผ๋กœ ๋‚˜๋ˆ  ๋ณต์ œํ•  ์ˆ˜ ์žˆ๋‹ค. 

 


 

๊ธฐ์กด Master-Slave ๋ฐฉ์‹๊ณผ์˜ ์ฐจ์ด์ 

๋น„๊ต ํ•ญ๋ชฉ Master-Slave ๋ฐฉ์‹ Galera Cluster
๋ณต์ œ ๋ฐฉ์‹ ๋น„๋™๊ธฐ(Asynchronous) ๋™๊ธฐ(Synchronous)
์“ฐ๊ธฐ ๊ฐ€๋Šฅ ๋…ธ๋“œ 1๊ฐœ(Master) ๋ชจ๋“  ๋…ธ๋“œ
Failover ์ˆ˜๋™์œผ๋กœ Slave๋ฅผ ์Šน๊ฒฉํ•ด์•ผ ํ•จ ์ž๋™ Failover ๊ฐ€๋Šฅ
๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ Replication Lag ๋ฐœ์ƒ ๊ฐ€๋Šฅ ๋ชจ๋“  ๋…ธ๋“œ๊ฐ€ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง
์„ฑ๋Šฅ ์“ฐ๊ธฐ๋Š” ๋‹จ์ผ Master๊ฐ€ ์ฒ˜๋ฆฌ ์—ฌ๋Ÿฌ Master์—์„œ ๋ถ„์‚ฐ ๊ฐ€๋Šฅ

 

๐Ÿ’– Galera Cluster๋Š” ๋ชจ๋“  ๋…ธ๋“œ๊ฐ€ ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์œ ์ง€ํ•˜๋ฏ€๋กœ, ์ฝ๊ธฐ/์“ฐ๊ธฐ๋ฅผ ๋ถ€ํ•˜ ๋ถ„์‚ฐํ•  ์ˆ˜ ์žˆ๊ณ , Master ์žฅ์•  ์‹œ์—๋„ ์ž๋™ ๋ณต๊ตฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. 

 

Galera Cluster ๋ณต์ œ ๊ณผ์ •

1. ํด๋ผ์ด์–ธํŠธ(์Šคํ”„๋ง๋ถ€ํŠธ ์„œ๋ฒ„)๊ฐ€ INSERT, UPDATE, DELETE์™€ ๊ฐ™์€ ์“ฐ๊ธฐ ์ž‘์—…์„ ์š”์ฒญํ•œ๋‹ค.  

 

2. ์š”์ฒญ ๋ฐ›์€ ๋…ธ๋“œ์˜ Galera Cluster์—์„œ ํŠธ๋žœ์žญ์…˜์ด ์ฒ˜๋ฆฌ๋˜๊ณ  Write Set์œผ๋กœ ๋ณ€ํ™˜๋œ๋‹ค. 

์•„๋ž˜์™€ ๊ฐ™์€ UPDATE ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด ํŠธ๋žœ์žญ์…˜์ด ์ฒ˜๋ฆฌ๋˜๊ณ 

UPDATE users SET email = 'bob.newemail@mail.com' WHERE id = 2;

 

ํ•ด๋‹น ์ฟผ๋ฆฌ์˜ ๊ฒฐ๊ณผ๋กœ Write Set์ด ์ƒ์„ฑ๋œ๋‹ค. 

{
    "transaction_id": 12345,
    "changes": [
        {
            "table": "users",
            "operation": "UPDATE",
            "primary_key": 2,
            "old_values": {
                "email": "bob@mail.com"
            },
            "new_values": {
                "email": "bob.newemail@mail.com"
            }
        }
    ]
}

 

3. Certification ๋‹จ๊ณ„์—์„œ ํŠธ๋žœ์žญ์…˜ ์ถฉ๋Œ์„ ๊ฒ€์ฆํ•œ ํ›„, Write set์ด Galera Cluster๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ์„œ๋ฒ„๋กœ ์ „ํŒŒ๋œ๋‹ค.  ๋งŒ์•ฝ ์ด ๋‹จ๊ณ„์—์„œ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜๋ฉด ํŠธ๋žœ์žญ์…˜์ด ๋กค๋ฐฑ๋œ๋‹ค. 

 

4. Galera Cluster๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๋…ธ๋“œ๊ฐ€ Write Set์„ ๋ฐ›์•„์„œ ํ•ด๋‹น ํŠธ๋žœ์žญ์…˜์„ ์‹คํ–‰ํ•œ๋‹ค. 

 

5. ๋ชจ๋“  ๋…ธ๋“œ์—์„œ ํ•ด๋‹น ํŠธ๋žœ์žญ์…˜์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋ฐ์ดํ„ฐ๊ฐ€ ๋™๊ธฐํ™”๋˜๋ฉด, MariaDB์— ์ปค๋ฐ‹์ด ์ด๋ฃจ์–ด์ง€๊ณ , ์ปค๋ฐ‹ ๊ฒฐ๊ณผ๋ฅผ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์‘๋‹ต ๋ฐ›๋Š”๋‹ค. 

 

6. ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด Galera Cluster๋Š” ๋‹ค๋ฅธ ๋…ธ๋“œ์—์„œ ํŠธ๋žœ์žญ์…˜์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ์ด๋ฅผ ๋™๊ธฐํ™”ํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ •์ƒ ์‘๋‹ต์„ ๋ณด๋‚ธ๋‹ค. 

 

Galera Cluster ๋…ธ๋“œ ๊ฐ„ ํ†ต์‹  ๋ฐฉ์‹

Galera Cluster์—์„œ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋…ธ๋“œ๋“ค์€ ์„œ๋กœ ๋ฐ์ดํ„ฐ ๋™๊ธฐํ™” ๋ฐ ํŠธ๋žœ์žญ์…˜ ๊ฒ€์ฆ์„ ์œ„ํ•ด ํŠน๋ณ„ํ•œ ๋ฐฉ์‹์œผ๋กœ ํ†ต์‹ ํ•œ๋‹ค. 

 

1. ํŠธ๋žœ์žญ์…˜ ์‹คํ–‰

๋…ธ๋“œ A์—์„œ INSERT ์ฟผ๋ฆฌ๊ฐ€ ์‹คํ–‰๋˜๋ฉด, ์ด ์ฟผ๋ฆฌ๋Š” Write Set์œผ๋กœ ๋ณ€ํ™˜๋˜์–ด Galera Cache(GCache)์— ์ €์žฅ๋œ๋‹ค. 

 

- GCache(Galera Cache)

GCache๋Š” Galera์˜ ์“ฐ๊ธฐ ์บ์‹œ๋กœ, ๋…ธ๋“œ ๊ฐ„์— ๋ฐ์ดํ„ฐ๋ฅผ ๋™๊ธฐํ™”ํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค. ๊ฐ ๋…ธ๋“œ๋Š” ์ž์‹ ์˜ ๋ณ€๊ฒฝ๋œ ๋ฐ์ดํ„ฐ๋ฅผ GCache์— ์ €์žฅํ•˜๊ณ , ์ด๋ฅผ ๋‹ค๋ฅธ ๋…ธ๋“œ๋“ค๊ณผ ๊ณต์œ ํ•˜์—ฌ ๋™๊ธฐํ™”ํ•œ๋‹ค. GCache๋Š” ํŠธ๋žœ์žญ์…˜์„ ๊ฒ€์ฆํ•˜๊ณ , Write Set๋ฅผ ์ €์žฅํ•œ๋‹ค. 

 

2. ํŠธ๋žœ์žญ์…˜ ์ „ํŒŒ(I/O Thread)

๋…ธ๋“œ A์—์„œ ๋ฐœ์ƒํ•œ Write Set์€ Replication Bus๋ฅผ ํ†ตํ•ด ๋‹ค๋ฅธ ๋…ธ๋“œ(์˜ˆ: ๋…ธ๋“œ B, ๋…ธ๋“œ C)๋กœ ์ „ํŒŒ๋œ๋‹ค. 

 

- Replication Bus

Galera Cluster์˜ ๋…ธ๋“œ๋“ค์€ Replication Bus๋ฅผ ํ†ตํ•ด ์„œ๋กœ ํ†ต์‹ ํ•œ๋‹ค. Replication Bus๋Š” ๋‚ด๋ถ€ ํ†ต์‹  ์ฑ„๋„๋กœ, ํŠธ๋žœ์žญ์…˜์„ ๋‹ค๋ฅธ ๋…ธ๋“œ์— ์ „๋‹ฌํ•˜๊ณ , ํŠธ๋žœ์žญ์…˜์„ ์ธ์ฆํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. 

Replication Bus๋Š” ํ†ต์‹  ํ”„๋กœํ† ์ฝœ๋กœ TCP/IP ๊ธฐ๋ฐ˜์˜ Gcomm(Galera Communication Protocol)์„ ์‚ฌ์šฉํ•œ๋‹ค. 

Gcomm์€ ๋‚ด๋ถ€ ํ†ต์‹ ์„ ์œ„ํ•ด ํฌํŠธ ๋ฒˆํ˜ธ(4567/UDP, 4568/TCP)

** ์ฐธ๊ณ : Gcomm์€ UDP๋กœ ๋…ธ๋“œ ๊ฒ€์ƒ‰๊ณผ ์—ฐ๊ฒฐ์„ ์ฒ˜๋ฆฌํ•˜์ง€๋งŒ, ๋ฐ์ดํ„ฐ ์ „ํŒŒ๋Š” TCP/IP๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค. 

 

- WSREP(Write Set Replication Protocol) 

WSREP๋Š” Write Set์„ ์ „ํŒŒํ•˜๊ณ  ๋™๊ธฐํ™”ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ํ”„๋กœํ† ์ฝœ๋กœ, Write Set ์ „ํŒŒ ์‹œ ํ•„์š”ํ•œ ์–‘์‹๊ณผ ๊ทœ์น™์„ ์ •์˜ํ•œ๋‹ค. 

 

3. ํŠธ๋žœ์žญ์…˜ ์ธ์ฆ(SQL Thread)

๋…ธ๋“œ B์™€ C๋Š” ํ•ด๋‹น Write Set์„ ์ธ์ฆํ•˜๊ณ , ์ถฉ๋Œ์ด ์—†์œผ๋ฉด ์ด๋ฅผ ์ฒ˜๋ฆฌํ•˜์—ฌ ๋™๊ธฐํ™”ํ•œ๋‹ค. 

 

4. ๋ฐ์ดํ„ฐ ๋™๊ธฐํ™” (SQL Thread)

ํŠธ๋žœ์žญ์…˜์ด ์ธ์ฆ๋˜๋ฉด, ๊ฐ ๋…ธ๋“œ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋™๊ธฐํ™”ํ•˜์—ฌ ๋™์ผํ•œ ๋ฐ์ดํ„ฐ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•œ๋‹ค. 

SQL Thread๋Š” ๊ฐ ๋…ธ๋“œ์—์„œ ์ˆ˜์‹ ๋œ Write Set์„ ์ ์šฉํ•˜๊ณ , ์ด๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ฐ˜์˜ํ•œ๋‹ค. 

 

5. ํŠธ๋žœ์žญ์…˜ ์ปค๋ฐ‹ (SQL Thread)

๋ชจ๋“  ๋…ธ๋“œ๊ฐ€ ํŠธ๋žœ์žญ์…˜์„ ์ฒ˜๋ฆฌํ•˜๊ณ , ์ปค๋ฐ‹์ด ์ด๋ฃจ์–ด์ง€๋ฉด ํด๋Ÿฌ์Šคํ„ฐ๋Š” ๋™๊ธฐํ™”๋œ ์ƒํƒœ๋กœ ์œ ์ง€๋œ๋‹ค.

 

garbd(Galera Arbitrator)

Galera Cluster์— ๋Œ€ํ•ด ์„ค๋ช…ํ•  ๋•Œ, Galera Cluster๋Š” ์ตœ์†Œ 3๊ฐœ์˜ ๋…ธ๋“œ๋กœ ๊ตฌ์„ฑํ•  ๊ฒƒ์„ ๊ถŒ์žฅํ–ˆ๋‹ค๊ณ  ์–ธ๊ธ‰ํ–ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋งŒ์•ฝ ์„œ๋ฒ„์˜ ์ž์›์ด ๋ถ€์กฑํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ๊ณต๊ฐ„์ด ๋ถ€์กฑํ•ด 2๊ฐœ์˜ DB๋งŒ ์„ค์น˜๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ํ•  ๊ฒƒ์ธ๊ฐ€? 

์ด๋Ÿด ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด garbd์ด๋‹ค. 

 

garbd๋Š” Galera Cluster์˜ ๋ณด์กฐ ๊ตฌ์„ฑ ์š”์†Œ๋กœ ๋ณต์ œ์—๋Š” ์ฐธ์—ฌํ•˜์ง€ ์•Š์ง€๋งŒ ํด๋Ÿฌ์Šคํ„ฐ์˜ ํˆฌํ‘œ์—๋Š” ์ฐธ์—ฌํ•ด ์‹ค์ œ ๋…ธ๋“œ๋Š” 2๊ฐœ๋ฟ์ด์ง€๋งŒ ํ•œ ๊ฐœ๊ฐ€ ์ฃฝ๋”๋ผ๋„ garbd๊ฐ€ ํˆฌํ‘œ์— ์ฐธ์—ฌํ•ด Quorum์„ ์œ ์ง€ํ•ด ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

Garbd๋Š” ํด๋Ÿฌ์Šคํ„ฐ์˜ ํˆฌํ‘œ ๊ฒฐ์ •์— ์‚ฌ์šฉ๋˜๋ฏ€๋กœ, ์‹ค์ œ ๋…ธ๋“œ๊ฐ€ ๋‹ค์šด๋˜๋„ ์ƒ๊ด€์ด ์—†๋Š” ๋ณ„๋„์˜ ์„œ๋ฒ„์— ์„ค์น˜ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ๋งŒ์•ฝ Mariadb๊ฐ€ ์„ค์น˜๋œ ๋…ธ๋“œ์— ์„ค์น˜ํ•˜๊ฒŒ ๋˜๋ฉด ํ•ด๋‹น ์„œ๋ฒ„๊ฐ€ ์ฃฝ๋Š” ๊ฒฝ์šฐ Garbd๋„ ํ•จ๊ป˜ ์ฃฝ๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋น„์Šค๊ฐ€ ์ค‘๋‹จ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋”ฐ๋ผ์„œ garbd๋Š” ๋ณ„๋„์˜ ์„œ๋ณด ๋˜๋Š” ๊ฐ€๋ฒผ์šด VM์— ์„ค์น˜ํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ด๋‹ค. 

 


์ฐธ๊ณ ์ž๋ฃŒ

1. https://mariadb.com/kb/en/replication-overview/

 

Replication Overview

Allow the contents of one or more primary servers to be mirrored on one or more replicas.

mariadb.com

 

๋ฐ˜์‘ํ˜•