MySQL Orchestrator๋กœ High Availability(HA) ๊ตฌ์ถ•

MySQL Orchestroator๋ž€?

MySQL Orchestrator๋Š” GitHub์˜ openark/orchestrator ํ”„๋กœ์ ํŠธ์—์„œ ํ˜ธ์ŠคํŒ… ๋˜๊ณ  ์žˆ๋Š” ์˜คํ”ˆ์†Œ์Šค ๋„๊ตฌ๋กœ, MySQL ๋ณต์ œ(Replication) ํ† ํด๋กœ์ง€๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ๊ณ ๊ฐ€์šฉ์„ฑ(HA)์„ ํ™•๋ณดํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

Orchestrator๋ฅผ ๋„์ž…ํ•˜๋ฉด ๋ณต์žกํ•œ MySQL ๋ณต์ œ ๊ตฌ์กฐ๋ฅผ ์ง๊ด€์ ์ธ UI๋กœ ์‹œ๊ฐํ™”ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ƒˆ๋กœ ์ถ”๊ฐ€๋˜๋Š” ์ธ์Šคํ„ด์Šค๋„ ์ž๋™์œผ๋กœ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, UI ์ƒ์—์„œ ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ๋งŒ์œผ๋กœ ๋ณต์ œ ์—ฐ๊ฒฐ ๊ตฌ์กฐ๋ฅผ ์†์‰ฝ๊ฒŒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ ์žฅ์ ์ด ์žˆ์ง€๋งŒ, Orchestrator์˜ ๊ฐ€์žฅ ํ•ต์‹ฌ์ ์ธ ๊ธฐ๋Šฅ์€ ์ž๋™ํ™”๋œ ๋ณต๊ตฌ(Auto Failover)์ž…๋‹ˆ๋‹ค. Master/Slave ๊ตฌ์กฐ์—์„œ Master ์„œ๋ฒ„์— ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ, ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ฏธ๋ฆฌ ์„ค์ •ํ•œ ๊ทœ์น™์— ๋”ฐ๋ผ ๊ฐ€์žฅ ์ ํ•ฉํ•œ Slave๋ฅผ ์ฐพ์•„ Master๋กœ ์Šน๊ฒฉ์‹œํ‚ต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ˆ˜๋™ ๊ฐœ์ž… ์—†์ด ์„œ๋น„์Šค์˜ ๊ฐ€์šฉ์„ฑ์„ ์ง€์†์ ์œผ๋กœ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Orchestrator GUI

๊ทธ๋ฆผ 1

master db์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋“ฑ๋กํ•˜๋ฉด ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ํด๋Ÿฌ์Šคํ„ฐ ํ˜„ํ™ฉ์ด ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

  • ํŒŒ๋ž€์ƒ‰ ์›: ํ˜„์žฌ ๊ตฌ์„ฑ๋œ ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด์˜ ์ •์ƒ์ ์ธ ์ธ์Šคํ„ด์Šค๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์ฃผํ™ฉ์ƒ‰/๋นจ๊ฐ„์ƒ‰ ์›์€ ๋ณต์ œ ์ง€์—ฐ์ด ๋ฐœ์ƒํ•˜๊ฑฐ๋‚˜, ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋Š” ๋“ฑ ์ƒํƒœ๊ฐ€ ์ข‹์ง€ ์•Š์€ Slave ์ธ์Šคํ„ด์Šค๋ฅผ ๋‚˜ํƒ€๋‚ด๊ณ , ๊ฒ€์€์ƒ‰ ์›: ์‘๋‹ต์ด ์—†๊ฑฐ๋‚˜(Down), ๊ด€๋ฆฌ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•œ ์„œ๋ฒ„๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์ƒ์„ธ ๋Œ€์‹œ๋ณด๋“œ ํ™”๋ฉด์„ ๋ณด๋ฉด, Master DB๋งŒ ๋“ฑ๋กํ•˜๋”๋ผ๋„ ์—ฐ๊ฒฐ๋œ Slave DB๊นŒ์ง€ ์ž๋™์œผ๋กœ ํƒ์ง€ํ•˜์—ฌ ํ† ํด๋กœ์ง€ ํŠธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด 1090b:3306(Master)๊ณผ 428c4:3306(Slave)์˜ ๊ด€๊ณ„๊ฐ€ ์—ฐ๊ฒฐ์„ ์œผ๋กœ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค.

์ˆ˜๋™ Failover

Orchestrator์˜ Failover ๋ชจ๋“œ๋Š” ๊ธฐ๋ณธ๊ฐ’(Default)์ด '์ˆ˜๋™'์œผ๋กœ ์„ค์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ณ„๋„ ์„ค์ • ์—†์ด๋Š” ์žฅ์•  ๋ฐœ์ƒ ์‹œ ๊ด€๋ฆฌ์ž๊ฐ€ ์ง์ ‘ ์ธ์ง€ํ•˜๊ณ  ์กฐ์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ์กด Master DB ์„œ๋ฒ„๋ฅผ ์ข…๋ฃŒํ•˜๋ฉด ๋Œ€์‹œ๋ณด๋“œ์— ์‘๋‹ต ์—†์Œ(๊ฒ€์€์ƒ‰ ๋“ฑ)์œผ๋กœ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค.

์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•œ Master ์ธ์Šคํ„ด์Šค ๋ฉ”๋‰ด์—์„œ Recover๋ฅผ ํด๋ฆญํ•˜๋ฉด, Failover ์กฐ์น˜๊ฐ€ ๊ฐ€๋Šฅํ•œ ์„œ๋ฒ„ ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. (Master 1๋Œ€, Slave 1๋Œ€ ๊ตฌ์„ฑ์ด์—ˆ๋‹ค๋ฉด Slave ์ธ์Šคํ„ด์Šค๊ฐ€ ํ›„๋ณด๋กœ ๋…ธ์ถœ๋ฉ๋‹ˆ๋‹ค.)

์ˆ˜๋™์œผ๋กœ Failover๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด ์„ ํƒ๋œ Slave ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒˆ๋กœ์šด Master๋กœ ์Šน๊ฒฉ๋˜๋ฉฐ, ๊ธฐ์กด ํด๋Ÿฌ์Šคํ„ฐ ๊ตฌ์กฐ์—์„œ ๋ถ„๋ฆฌ๋˜์–ด ๋…๋ฆฝ์ ์ธ Master ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ด ๊ณผ์ •์—์„œ ๋ˆˆ์—ฌ๊ฒจ๋ณผ ์ ์€ read_only ์†์„ฑ์ž…๋‹ˆ๋‹ค.

๊ธฐ์กด Slave 428c4 ์ธ์Šคํ„ด์Šค๋Š” read_only๊ฐ€ ์ผœ์ ธ ์žˆ์—ˆ์ง€๋งŒ, Master๋กœ ์Šน๊ฒฉ๋˜๋Š” ์ˆœ๊ฐ„ Orchestrator๊ฐ€ ์ด๋ฅผ ์ž๋™์œผ๋กœ ํ•ด์ œํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ApplyMySQLPromotionAfterMasterFailover ์„ค์ •(๊ธฐ๋ณธ๊ฐ’ true)์— ์˜ํ•ด ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

์ž๋™ Failover

์ž๋™ ๋ณต๊ตฌ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Orchestrator์˜ ์„ค์ • ํŒŒ์ผ์„ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ƒ์„ธํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜์‹ค ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ฃผ์š” ์„ค์ •๊ฐ’์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

parameter
descripition
before
after

RecoveryPeriodBlockSeconds

๋…ธ๋“œ์— ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•ด์„œ ๋ณต๊ตฌ๋œ๋‹ค๋ฉด, ํ•ด๋‹น ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ’(์‹œ๊ฐ„) ๋™์•ˆ ๋ณต๊ตฌ๋ฅผ block ํ•œ๋‹ค. ์ฆ‰, ํ•œ๋ฒˆ recover๊ฐ€ ๋˜๊ณ  ์ง€์ •ํ•œ ์‹œ๊ฐ„๋™์•ˆ ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•ด๋„ ๋ณต๊ตฌ๋˜์ง€ ์•Š๋Š”๋‹ค.

3600

30

RecoverMasterClusterFilters

๋งˆ์Šคํ„ฐ ์žฅ์• ์— ๋Œ€ํ•ด์„œ auto failover๋ฅผ ์ง„ํ–‰ํ•  ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์ง€์ •ํ•˜๋Š” ์˜ต์…˜์ด๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด "slave1"๋กœ ๋ช…์‹œํ–ˆ๋‹ค๋ฉด ์—ฌ๋Ÿฌ ํด๋Ÿฌ์Šคํ„ฐ(Replica Set)์ด ์กด์žฌํ•  ๋•Œ, "slave1"์— ๋Œ€ํ•ด์„œ๋งŒ ์ž๋™ ๋งˆ์Šคํ„ฐ ์žฅ์•  ๋ณต๊ตฌ๊ฐ€ ์‹คํ–‰๋œ๋‹ค.

[ "master_pattern" ]

["*"]

RecoverIntermediateMasterClusterFilters

๋ณต์ œ ํ† ํด๋กœ์ง€์—์„œ ์ค‘๊ฐ„ ๋งˆ์Šคํ„ฐ ์„œ๋ฒ„์— ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ, ์–ด๋–ค ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์ž๋™ ๋ณต๊ตฌ๋ฅผ ์ˆ˜ํ–‰ํ• ์ง€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ํ•„ํ„ฐ์ด๋‹ค.

["intermediate_master_pattern" ]

["*"]

PromotionIgnoreHostnameFilters

์ด ํ•„ํ„ฐ์— ์ง€์ •ํ•œ slave ๋…ธ๋“œ๋Š” ๋งˆ์Šคํ„ฐ๋กœ ์Šน๊ฒฉ๋˜์ง€ ์•Š๋Š”๋‹ค.

[]

[]

auto failover๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋ณ€๊ฒฝํ•œ ๊ตฌ์„ฑ์ด๋ฉฐ, ์ง์ ‘ ๊ฐ’์„ ๋ช…์‹œํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ํŒจํ„ด์ด๋‚˜ ์ •๊ทœ์‹์œผ๋กœ๋„ ํ‘œํ˜„์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด "*"๋Š” ๋ชจ๋“  ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

RecoverIntermediateMasterClusterFilters์— ๋Œ€ํ•ด์„œ ์ข€๋” ๋‹ค๋ฃจ์ž๋ฉด,

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

์„ค์ •์„ ๋ณ€๊ฒฝํ•˜๊ณ  ์ ์šฉํ•˜๋ฉด, ๋Œ€์‹œ๋ณด๋“œ ์šฐ์ธก ์ƒ๋‹จ์— ํ•˜ํŠธ ์•„์ด์ฝ˜์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํ•ด๋‹น ํด๋Ÿฌ์Šคํ„ฐ์— ๋Œ€ํ•ด ์ž๋™ ๋ณต๊ตฌ(Auto Failover)๊ฐ€ ํ™œ์„ฑํ™”๋˜์—ˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด ์ƒํƒœ์—์„œ Master ๋…ธ๋“œ๋ฅผ ๊ฐ•์ œ๋กœ ๋‹ค์šด์‹œํ‚ค๋ฉด, Orchestrator๊ฐ€ ์ฆ‰์‹œ ๊ฐ์ง€ํ•˜์—ฌ Slave๋ฅผ Master๋กœ ์Šน๊ฒฉ์‹œํ‚ค๋Š” ๊ณผ์ •์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ถ”๊ฐ€ ๊ณ ๋ ค ์‚ฌํ•ญ

1. ์—”๋“œํฌ์ธํŠธ ๋ณ€๊ฒฝ

Orchestrator๋Š” DB ์ž์ฒด์˜ ์Šน๊ฒฉ์€ ์•„์ฃผ ์ž˜ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(WAS)์ด ๋ฐ”๋ผ๋ณด๋Š” DB ์ฃผ์†Œ๊นŒ์ง€ ์ž๋™์œผ๋กœ ๋ฐ”๊ฟ”์ฃผ์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

  • ๋ฌธ์ œ์ : DB๋Š” Failover ๋˜์—ˆ์ง€๋งŒ, ์›น ์„œ๋ฒ„๋Š” ์—ฌ์ „ํžˆ ์ฃฝ์–ด์žˆ๋Š” ๊ตฌ(Old) Master์˜ IP๋ฅผ ๋ฐ”๋ผ๋ณด๊ณ  ์žˆ์–ด ์„œ๋น„์Šค ์žฅ์• ๊ฐ€ ์ง€์†๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • Orchestrator์˜ Hooks ๊ธฐ๋Šฅ(PostMasterFailoverProcesses)์„ ํ™œ์šฉํ•˜๊ธฐ

    • ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋“ฑ๋กํ•˜์—ฌ DNS ๋ ˆ์ฝ”๋“œ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ฑฐ๋‚˜,

    • HAProxy ์„ค์ •์„ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜,

    • VIP(Virtual IP)๋ฅผ ์ƒˆ๋กœ์šด Master๋กœ ์ด๋™์‹œํ‚ค๋Š” ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹คํ–‰๋˜๋„๋ก ์„ค์ •ํ•ด์•ผ HA๋ฅผ ์™„์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2. ๊ณ ๊ฐ€์šฉ์„ฑ ํ™•๋ณด

Orchestrator ์„œ๋ฒ„ ์ž์ฒด๊ฐ€ ์ฃฝ์œผ๋ฉด ๋ณต๊ตฌ๋ฅผ ํ•ด์ค„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์‹ค๋ฌด์—์„œ๋Š” Orchestrator ์„œ๋ฒ„๋„ ์—ฌ๋Ÿฌ ๋Œ€๋กœ ๊ตฌ์„ฑํ•˜์—ฌ Orchestrator ์ž์ฒด์˜ ๊ณ ๊ฐ€์šฉ์„ฑ์„ ํ™•๋ณดํ•˜๋Š” ๊ฒƒ์ด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค.

Last updated