ProxySQL

์ด ๊ตฌ์„ฑ์€ DB๋ฅผ ์“ฐ๊ธฐ(Write)์™€ ์ฝ๊ธฐ(Read)๋กœ ๋ถ„๋ฆฌํ•˜๊ณ , GTID ๊ธฐ๋ฐ˜์˜ ๋ณต์ œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ™˜๊ฒฝ์„ ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ํฐ ํŠน์ง•์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด DB์— ์ง์ ‘ ๋ถ™๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์ค‘๊ฐ„์— ์œ„์น˜ํ•œ ProxySQL์„ ํ†ตํ•ด ์—ฐ๊ฒฐํ•œ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ProxySQL์ด ์—์ด์ „ํŠธ๊ฐ€ ๋˜์–ด DB ์ปค๋„ฅ์…˜๊ณผ ์ฟผ๋ฆฌ ๋ผ์šฐํŒ…์„ ๊ด€์žฅํ•ฉ๋‹ˆ๋‹ค.

  • ํด๋ผ์ด์–ธํŠธ๋Š” DB ์„œ๋ฒ„์— ์ง์ ‘ ์—ฐ๊ฒฐํ•˜์ง€ ์•Š๊ณ  ProxySQL์„ ํ†ตํ•ด ์—ฐ๊ฒฐ๋˜๋ฉฐ, ProxySQL์ด ์ค‘๊ฐ„ ๊ณ„์ธต์œผ๋กœ์„œ ๋ชจ๋“  ์ฟผ๋ฆฌ์™€ ์ปค๋„ฅ์…˜์„ ๊ด€๋ฆฌ ๋ฐ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค.

์™œ ProxySQL์ด ํ•„์š”ํ•œ๊ฐ€์š”?

1. DB Failover ์‹œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์˜ํ–ฅ ์ตœ์†Œํ™”

Primary ์„œ๋ฒ„์— ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์“ฐ๊ธฐ ์ž‘์—…์ด ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค. Orchestrator ๊ฐ™์€ ๋„๊ตฌ๊ฐ€ Replica๋ฅผ Primary๋กœ ์Šน๊ฒฉ์‹œ์ผœ DB๋‹จ์€ ๋ณต๊ตฌ๋˜์–ด ์„œ๋น„์Šค๊ฐ€ ์ง€์†๋˜์ง€๋งŒ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์—ฌ์ „ํžˆ ์ฃฝ์€ Primary IP๋ฅผ ๋ฐ”๋ผ๋ณด๊ณ  ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ๋Š” ์ด๋•Œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์—ฌ์ „ํžˆ ์ด์ „ Primary์˜ IP๋กœ ์ ‘์†์„ ์‹œ๋„ํ•œ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค.

์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š”

  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ค์ •์„ ๋ณ€๊ฒฝํ•˜๊ณ  ์žฌ๋ฐฐํฌ(Reload)ํ•˜๊ฑฐ๋‚˜,

  • DNS๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, DNS ์บ์‹œ(TTL) ๋ฌธ์ œ๋กœ ์ธํ•ด ์ฆ‰๊ฐ์ ์ธ ๋ฐ˜์˜์ด ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2. ์œ ์—ฐํ•œ ์•„ํ‚คํ…์ฒ˜ ๊ตฌ์„ฑ (DB๊ฐ€ ์ถ”๊ฐ€๋˜๋Š” ๊ฒฝ์šฐ)

DB ์„œ๋ฒ„๋ฅผ ์ฆ์„ค(Scale-out)ํ•˜๋”๋ผ๋„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์„ ๋•Œ๊ฐ€ ์žˆ์ง€๋งŒ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๋‚˜ ์„ค์ •์—์„œ ํ•ด๋‹น DB ์ •๋ณด๋ฅผ ๊ฐฑ์‹ ํ•˜๊ณ  ์žฌ๋ฐฐํฌํ•˜๋Š” ๊ณผ์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

  • ๊ธฐ์กด: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด Primary/Replica IP๋ฅผ ๋ชจ๋‘ ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•˜๋ฏ€๋กœ DB ๋ณ€๊ฒฝ ์‹œ ์•ฑ ์„ค์ •๋„ ๋ฐ”๊ฟ”์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ๊ฐœ์„ : ProxySQL์„ ๋„์ž…ํ•˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ProxySQL๋งŒ ๋ฐ”๋ผ๋ณด๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋’ค๋‹จ์— DB๊ฐ€ 10๋Œ€๊ฐ€ ๋˜๋“ , IP๊ฐ€ ๋ฐ”๋€Œ๋“  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์•Œ ํ•„์š”๊ฐ€ ์—†์–ด์ง‘๋‹ˆ๋‹ค.

์ด์ฒ˜๋Ÿผ IP ๊ธฐ๋ฐ˜ ์ ‘๊ทผ ๊ตฌ์กฐ์—์„œ๋Š” ํด๋Ÿฌ์Šคํ„ฐ ํ™•์žฅ ์‹œ๋งˆ๋‹ค ๋ฐฐํฌ ์ž‘์—…์ด ๋ฐ˜๋ณต๋˜๋Š” ๋น„ํšจ์œจ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ค‘๊ฐ„ ๊ณ„์ธต ํ”„๋ก์‹œ(ProxySQL)๋ฅผ ๋‘ ์œผ๋กœ์จ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ํ•ญ์ƒ ProxySQL๋งŒ ๋ฐ”๋ผ๋ณด๊ณ  ์ ‘์†ํ•˜๋ฉฐ ํ”„๋ก์‹œ๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ํŠธ๋ž˜ํ”ฝ์„ DB๋กœ ๋ผ์šฐํŒ…ํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ตฌ์กฐ๋Š” ์„œ๋น„์Šค ์šด์˜ ์ค‘์—๋„ ์œ ์—ฐํ•œ DB ์ฆ์„ค, ์žฅ์•  ์ „ํ™˜, ๋ผ์šฐํŒ… ์ •์ฑ… ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

๊ธฐ์กด MHA ๊ตฌ์„ฑ์˜ ํ•œ๊ณ„์™€ ProxySQL ๋„์ž… ๋ฐฐ๊ฒฝ

MHA๋Š” MySQL ๊ณ ๊ฐ€์šฉ์„ฑ ํ™˜๊ฒฝ์—์„œ ๋น„๊ต์  ๋‹จ์ˆœํ•œ ๊ตฌ์„ฑ๊ณผ ์ž๋™ํ™”๋กœ ์„œ๋น„์Šค ๋‹ค์šดํƒ€์ž„์„ ํฌ๊ฒŒ ์ค„์ผ ์ˆ˜ ์žˆ๋Š” Failover ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค.

์ด์ „์— Orchestrator๋ฅผ ์‚ฌ์šฉํ•ด MySQL ๋ณต์ œ ํ™˜๊ฒฝ์—์„œ ์ž๋™ Failover๋ฅผ ๊ตฌ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๊ณ ๊ฐ€์šฉ์„ฑ์€ ํ™•๋ณดํ–ˆ์ง€๋งŒ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‹จ์˜ ์ปค๋„ฅ์…˜ ๊ด€๋ฆฌ ๋ฌธ์ œ๋Š” ์—ฌ์ „ํžˆ ๋‚จ์•„ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • Primary๊ฐ€ ์žฅ์•  ๋ฐœ์ƒ โ†’ Replica๊ฐ€ Primary๋กœ ์Šน๊ฒฉ๋จ

  • ๊ทธ๋Ÿฌ๋‚˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์—ฌ์ „ํžˆ ์ด์ „ Primary์— write ์š”์ฒญ์„ ๋ณด๋ƒ„

  • Read ์š”์ฒญ์€ ์ƒˆ๋กœ์šด Primary(slave1)์— ์ „๋‹ฌ๋˜์–ด consistency ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒ

์ด์ฒ˜๋Ÿผ ํด๋ผ์ด์–ธํŠธ ๋ ˆ๋ฒจ์—์„œ DB ์—ฐ๊ฒฐ์„ ๋งค๋ฒˆ ์ˆ˜์ •ํ•ด์•ผ ํ•˜๋Š” ๋ถˆํŽธํ•จ์„ ์ค„์ด๊ธฐ ์œ„ํ•ด ProxySQL์„ ๋„์ž…ํ•˜์—ฌ ๋ฏธ๋“ค์›จ์–ด ๊ณ„์ธต์—์„œ ์ปค๋„ฅ์…˜๊ณผ ์ฟผ๋ฆฌ ๋ผ์šฐํŒ…์„ ํ†ตํ•ฉ ๊ด€๋ฆฌํ•˜๋„๋ก ๊ตฌ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

ProxySQL ๊ฐœ์š”

ProxySQL์€ ํด๋ผ์ด์–ธํŠธ์™€ DB ์„œ๋ฒ„ ์‚ฌ์ด์˜ ์ค‘๊ฐœ์ž(Proxy) ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฏธ๋“ค์›จ์–ด์ž…๋‹ˆ๋‹ค.

์ด ์‹œ์Šคํ…œ์€ ๋‹จ์ˆœ ์ปค๋„ฅ์…˜ ํ”„๋ก์‹œ๋ฅผ ๋„˜์–ด์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค:

  • Connection multiplexing (๋‹ค์ค‘ ์—ฐ๊ฒฐ ์žฌ์‚ฌ์šฉ)

    • ์ˆ˜์ฒœ ๊ฐœ์˜ ํด๋ผ์ด์–ธํŠธ ์—ฐ๊ฒฐ์„ ์†Œ์ˆ˜์˜ DB ์ปค๋„ฅ์…˜์œผ๋กœ ์žฌ์‚ฌ์šฉํ•˜์—ฌ DB ๋ถ€ํ•˜๋ฅผ ์ค„์ž…๋‹ˆ๋‹ค.

  • Query rule-based ๋ผ์šฐํŒ…

    • ์ฟผ๋ฆฌ ๋‚ด์šฉ์— ๋”ฐ๋ผ Primary(์“ฐ๊ธฐ)๋‚˜ Replica(์ฝ๊ธฐ)๋กœ ๋ณด๋ƒ…๋‹ˆ๋‹ค.

  • Query ์บ์‹ฑ ๋ฐ ๋ฏธ๋Ÿฌ๋ง

  • ํŠธ๋ž˜ํ”ฝ ๊ธฐ๋ฐ˜ ๋™์  ์šฐ์„ ์ˆœ์œ„ ์ œ์–ด

  • ๋‹ค์ค‘ ์„œ๋น„์Šค ์šด์šฉ์„ ์œ„ํ•œ ํ™•์žฅ์„ฑ ๊ตฌ์กฐ

์ฃผ์š” ๋ชจ๋“ˆ ๊ตฌ์„ฑ

User autehnstication:

  • ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž ์ž๊ฒฉ ์ฆ๋ช…์ด ํ•ด์‹œ๋˜์–ด ํ”„๋ก์‹œ์— ์ €์žฅ

Hostgroup manager:

  • ํŠธ๋ž˜ํ”ฝ์„ ๋ณด๋‚ผ ์„œ๋ฒ„ ๊ทธ๋ฃน์„ ๊ด€๋ฆฌํ•˜๊ณ  ํ•ด๋‹น ์ƒํƒœ๋ฅผ ์ถ”์ 

Connection pool:

  • ๋ฐฑ์—”๋“œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋Œ€ํ•œ ์—ฐ๊ฒฐ์„ ๊ด€๋ฆฌ. ์—ฐ๊ฒฐ ํ’€์€ ๋ฐฑ์—”๋“œ๋ฅผ ํ–ฅํ•ด ์„ค์ •๋˜๋ฉฐ ๋ชจ๋“  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๊ณต์œ /์žฌ์‚ฌ์šฉ

Monitoring:

  • ๋ฐฑ์—”๋“œ DB๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  ์ง€ํ‘œ๋ฅผ ์ˆ˜์ง‘. ์‘๋‹ตํ•˜์ง€ ์•Š๋Š” ํ˜ธ์ŠคํŠธ ๋˜๋Š” ๋ณต์ œ ์ง€์—ฐ์— ๋Œ€ํ•ด ํ•„์š”์— ๋”ฐ๋ผ ํŠธ๋ž˜ํ”ฝ์„ ์ œ์–ด

Query processor/rules engine:

  • Mysql ํ”„๋กœํ† ์ฝœ(์ฟผ๋ฆฌ)๋ฅผ ํ•ด์„

  • ๋ฃฐ ์—”์ง„์€ ๋“ค์–ด์˜ค๋Š” ํŠธ๋ž˜ํ”ฝ์„ ์ผ์น˜์‹œํ‚ค๊ณ  ์ฟผ๋ฆฌ๋ฅผ ์บ์‹œํ• ์ง€ ๋˜๋Š” ํ˜ธ์ŠคํŠธ ๊ทธ๋ฃน ๋Œ€์ƒ์— ์ฟผ๋ฆฌ๋ฅผ ์ฐจ๋‹จ, ๊ฒฝ๋กœ ์žฌ์ง€์ •, ์ฟผ๋ฆฌ ์žฌ์ž‘์„ฑ ๋˜๋Š” ๋ฏธ๋Ÿฌ๋ง ํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ์ •์˜

Queries Cache:

  • ์ฟผ๋ฆฌ ๋Œ€๊ธฐ ์‹œ๊ฐ„์„ ์ค„์ผ ์ˆ˜ ์žˆ๋„๋ก ์ •์˜๋œ ์‹œ๊ฐ„(TTL) ๋™์•ˆ ์บ์‹œ, ์‚ฌ์šฉ์ž์˜ ์ •์˜์— ๋”ฐ๋ผ ์ฟผ๋ฆฌ ์ œํ•œ ๊ฐ€๋Šฅ

  • ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ๋ฌด๊ฑฐ์šด ์ฟผ๋ฆฌ๋“ค์„ ์ดˆ๋‹น ํ•œ ๋ฒˆ ๋˜๋Š” ๋ถ„๋‹น ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰๋˜๋„๋ก ์ปค์Šคํ…€ํ•˜๊ฒŒ ์„ค์ • ๊ฐ€๋Šฅ

๋ชจ๋“ˆ
์„ค๋ช…

User Authentication

DB ์‚ฌ์šฉ์ž ์ž๊ฒฉ ์ฆ๋ช…์„ Proxy์— ์ €์žฅํ•˜์—ฌ ์ธ์ฆ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

Hostgroup Manager

๋ž˜ํ”ฝ์„ ๋ณด๋‚ผ ์„œ๋ฒ„ ๊ทธ๋ฃน(Writer ๊ทธ๋ฃน, Reader ๊ทธ๋ฃน ๋“ฑ)์„ ๊ด€๋ฆฌํ•˜๊ณ  ์ƒํƒœ๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ถ”์ ํ•ฉ๋‹ˆ๋‹ค.

Connection Pool

๋ฐฑ์—”๋“œ DB์™€์˜ ์—ฐ๊ฒฐ์„ ๋ฏธ๋ฆฌ ๋งบ์–ด๋‘๊ณ  ์žฌ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

Monitoring

DB ์ƒํƒœ(Ping, Replication Lag ๋“ฑ)๋ฅผ ์ฃผ๊ธฐ์ ์œผ๋กœ ์ฒดํฌํ•˜์—ฌ, ์‘๋‹ต ์—†๋Š” ์„œ๋ฒ„๋‚˜ ์ง€์—ฐ์ด ์‹ฌํ•œ ์„œ๋ฒ„๋ฅผ ํŠธ๋ž˜ํ”ฝ์—์„œ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค.

Query Processor / Rules Engine

๋“ค์–ด์˜ค๋Š” SQL์„ ๋ถ„์„ํ•˜์—ฌ ์บ์‹ฑํ•˜๊ฑฐ๋‚˜, ํŠน์ • ํ˜ธ์ŠคํŠธ ๊ทธ๋ฃน์œผ๋กœ ๋ผ์šฐํŒ…ํ•˜๊ฑฐ๋‚˜, ์ฟผ๋ฆฌ๋ฅผ ์žฌ์ž‘์„ฑ(Rewrite)ํ•ฉ๋‹ˆ๋‹ค.

์ฟผ๋ฆฌ ๊ทœ์น™(match/filter)์— ๋”ฐ๋ผ ํŠธ๋ž˜ํ”ฝ์„ ์ฐจ๋‹จ, ์žฌ์ž‘์„ฑ, ๋ฏธ๋Ÿฌ๋ง, ๋˜๋Š” ํŠน์ • Hostgroup์œผ๋กœ ๋ผ์šฐํŒ…

Query Cache

๋ฐ˜๋ณต์ ์ธ ์ฝ๊ธฐ ์ฟผ๋ฆฌ๋ฅผ ์„ค์ •๋œ ์‹œ๊ฐ„(TTL) ๋™์•ˆ ์บ์‹ฑํ•˜์—ฌ DB ๋ถ€ํ•˜๋ฅผ ์ค„์ž…๋‹ˆ๋‹ค. ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ์ฃผ๋Š” ๋ฌด๊ฑฐ์šด ์ฟผ๋ฆฌ๋“ค์„ ์ดˆ๋‹น ํ•œ ๋ฒˆ ๋˜๋Š” ๋ถ„๋‹น ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰๋˜๋„๋ก ์ปค์Šคํ…€ํ•˜๊ฒŒ ์„ค์ • ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

ProxySQL ์„ค์ •

ProxySQL์˜ ์„ค์ •์€ Runtime, Memory, Disk ์„ธ ์˜์—ญ์œผ๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์„ค์ •์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒฝ์šฐ, ๋ณ€๊ฒฝ๋œ ๋‚ด์šฉ์€ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋˜๋ฉฐ ์‹ค์ œ ์„œ๋ฒ„์— ๋ฐ”๋กœ ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋Ÿฐํƒ€์ž„์œผ๋กœ ๋ถˆ๋Ÿฌ์™€์•ผ proxysql ์„œ๋ฒ„์— ์‹ค์ œ๋กœ ์ ์šฉ๋˜๋ฉฐ, ๋””์Šคํฌ๋Š” ๋ฉ”๋ชจ๋ฆฌ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์˜๊ตฌ์ ์œผ๋กœ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ๊ณต๊ฐ„์œผ๋กœ, proxysql ์„œ๋ฒ„๋ฅผ ์žฌ์‹œ์ž‘ํ•  ๋•Œ ์ด ์ •๋ณด๋ฅผ ๋ถˆ๋Ÿฌ์™€ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

์˜์—ญ
์„ค๋ช…

Runtime

ํ˜„์žฌ ์„œ๋ฒ„์— ์ ์šฉ๋˜์–ด ์‹คํ–‰ ์ค‘์ธ ์„ค์ •

Memory

๋ณ€๊ฒฝ ์ดํ›„ ๋ฉ”๋ชจ๋ฆฌ์— ๋ฐ˜์˜๋œ ์ž„์‹œ ์„ค์ • (์‹คํ–‰ ์ „ ๋‹จ๊ณ„)

Disk

์˜๊ตฌ ์ €์žฅ์†Œ. ์žฌ์‹œ์ž‘ ์‹œ Memory๋กœ ๋กœ๋“œ๋จ

  • Runtime: ํ˜„์žฌ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œ๋˜์–ด ์‹ค์ œ๋กœ ๋™์ž‘ ์ค‘์ธ ์„ค์ •์ž…๋‹ˆ๋‹ค.

  • Memory: ์‚ฌ์šฉ์ž๊ฐ€ ์ˆ˜์ • ๋ช…๋ น์„ ๋‚ด๋ฆฌ๋ฉด ์ €์žฅ๋˜๋Š” ์˜์—ญ์ž…๋‹ˆ๋‹ค. (์•„์ง ๋ฐ˜์˜ ์•ˆ ๋จ)

  • Disk: ์žฌ์‹œ์ž‘ ์‹œ์—๋„ ์„ค์ •์ด ์œ ์ง€๋˜๋„๋ก ์˜๊ตฌ ์ €์žฅํ•˜๋Š” ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.

์„ค์ • ํ๋ฆ„: ์ˆ˜์ •(Memory) โ†’ LOAD to RUNTIME(์ ์šฉ) โ†’ SAVE to DISK(์˜๊ตฌ์ €์žฅ)

1. ์ฟผ๋ฆฌ ์ „์†ก DB ์„œ๋ฒ„ ์„ค์ •

ProxySQL CLI(admin interface, ๊ธฐ๋ณธ ํฌํŠธ 6032)์— ์ ‘์† ํ›„ ์„œ๋ฒ„๋ฅผ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.

proxysql์€ ์„ค์ • ์ •๋ณด๋ฅผ ํ…Œ์ด๋ธ”์— ๋ ˆ์ฝ”๋“œ ํ˜•ํƒœ๋กœ ์ €์žฅํ•˜๋ฉฐ insert ์ฟผ๋ฆฌ๋ฅผ ํ†ตํ•ด ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ hostgroup_id๋Š” read/write ์ž‘์—…์„ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•œ ์„ค์ • ๊ฐ’์ž…๋‹ˆ๋‹ค.

hostgroup_id=1๋กœ ์ฟผ๋ฆฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด Write db๋กœ, id=2์œผ๋กœ ์ฟผ๋ฆฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด Read๋กœ ์ฟผ๋ฆฌ๋ฅผ ๋ถ„์‚ฐ๋ฉ๋‹ˆ๋‹ค.

2. ๋ชจ๋‹ˆํ„ฐ๋ง ์‚ฌ์šฉ์ž ์„ค์ •

ProxySQL์ด DB ์ƒํƒœ๋ฅผ ์ฒดํฌํ•  ๋•Œ ์‚ฌ์šฉํ•  ๊ณ„์ •์„ DB์— ์ƒ์„ฑํ•˜๊ณ , ProxySQL ์„ค์ • ํŒŒ์ผ(/etc/proxysql.cnf)์ด๋‚˜ ๋ณ€์ˆ˜ ์„ค์ •์„ ํ†ตํ•ด ์•Œ๋ ค์ค๋‹ˆ๋‹ค.

์„ค์ • ๊ฒฐ๊ณผ๋Š” ProxySQL ๋กœ๊ทธ ๋˜๋Š” MySQL general log์—์„œ ์ ‘์† ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3. ์œ ์ € ๋งคํ•‘ ์„ค์ •

ProxySQL์ด MySQL์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ์‚ฌ์šฉ์ž ๋งคํ•‘์„ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.

mysql์˜ ๊ณ„์ • ์ •๋ณด๋ฅผ ํ™•์ธํ•˜๊ณ  proxysql์—์„œ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŠธ: (6033์€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ProxySQL์„ ํ†ตํ•ด ์ ‘์†ํ•˜๋Š” ํฌํŠธ์ž…๋‹ˆ๋‹ค.)

4. ์ฟผ๋ฆฌ ๋ผ์šฐํŒ… ์„ค์ •

hostgroup_id=0 ์€ ์“ฐ๊ธฐ ์ž‘์—…์„ Primary db๋กœ ํ–ฅํ•˜๋„๋ก ์„ค์ •ํ•œ ์„ค์ • ๊ฐ’์ž…๋‹ˆ๋‹ค.

๊ทธ๋ ‡๊ฒŒํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์“ฐ๊ธฐ ์ฟผ๋ฆฌ๋ฅผ Primary ๊ทธ๋ฃน์œผ๋กœ ๋ผ์šฐํŒ…ํ•˜๋„๋ก ํŒจํ„ด ๊ธฐ๋ฐ˜ ๊ทœ์น™์„ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. ์„ค์ •์€ mysql_query_rules ํ…Œ์ด๋ธ”์˜ ๋ ˆ์ฝ”๋“œ๋กœ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฒ„์ „ ํ˜ธํ™˜ ๋ฌธ์ œ

Flyway๋‚˜ ํŠน์ • ๋“œ๋ผ์ด๋ฒ„ ์‚ฌ์šฉ ์‹œ Unknown system variable 'query_cache_size' ๊ฐ™์€ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ProxySQL์ด ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ž์‹ ์„ ์‹ ๊ณ ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” MySQL ๋ฒ„์ „๊ณผ, ์‹ค์ œ ๋ฐฑ์—”๋“œ MySQL ๋ฒ„์ „ ํ˜น์€ ๋“œ๋ผ์ด๋ฒ„๊ฐ€ ๊ธฐ๋Œ€ํ•˜๋Š” ๋ฒ„์ „์ด ๋‹ฌ๋ผ์„œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ProxySQL ๊ด€๋ฆฌ ํŽ˜์ด์ง€๋‚˜ ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์—ฌ mysql-server_version ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‹ค์ œ ํ™˜๊ฒฝ์— ๋งž๊ฒŒ ์กฐ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ProxySQL์˜ mysql-server_version ๋ณ€์ˆ˜ ๊ฐ’์„ ์‹ค์ œ ์‚ฌ์šฉํ•˜๋Š” MySQL ๋ฒ„์ „(์˜ˆ: 8.0.28)๊ณผ ๋น„์Šทํ•˜๊ฒŒ ๋งž์ถฐ์ฃผ๋ฉด ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

์“ฐ๊ธฐ/์ฝ๊ธฐ ๋ถ„๋ฆฌ ๊ฒฐ๊ณผ ํ™•์ธ

MySQL general log๋ฅผ ๋ณด๋ฉด write ์ฟผ๋ฆฌ(INSERT)๋Š” Primary ์„œ๋ฒ„์—์„œ, read ์ฟผ๋ฆฌ(SELECT)๋Š” Replica ์„œ๋ฒ„์—์„œ ์ฒ˜๋ฆฌ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Auto Failover ์‹œ๋‚˜๋ฆฌ์˜ค

์‹œ๋‚˜๋ฆฌ์˜ค 1. Replica DB ์žฅ์• 

Replica ์„œ๋ฒ„๊ฐ€ ์žฅ์• ๋กœ ์‘๋‹ตํ•˜์ง€ ์•Š์œผ๋ฉด ProxySQL์ด ํŠธ๋ž˜ํ”ฝ์„ ํ•ด๋‹น ์„œ๋ฒ„์—์„œ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ, ์ฝ๊ธฐ ๊ทธ๋ฃน(Hostgroup 1)์— ์„œ๋ฒ„๊ฐ€ Replica ๋‹จ ํ•œ ๋Œ€๋ฟ์ด๋ผ๋ฉด, ํ•ด๋‹น ๊ทธ๋ฃน์œผ๋กœ ํ–ฅํ•˜๋Š” ๋ชจ๋“  SELECT ์ฟผ๋ฆฌ๋Š” ์ฒ˜๋ฆฌ๋  ๊ณณ์ด ์—†์–ด ์‹คํŒจํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ์œ„์™€ ๊ฐ™์ด ์ปค๋„ฅ์…˜ ํ’€์„ ์–ป์ง€ ๋ชปํ–ˆ๋‹ค๋Š” ํƒ€์ž„์•„์›ƒ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์ด์ฒ˜๋Ÿผ Replica๊ฐ€ ์žฅ์• ๋กœ ์‘๋‹ตํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ, ProxySQL์€ read ๋ผ์šฐํŒ… ํŠธ๋ž˜ํ”ฝ์˜ ๋Œ€์ƒ์—์„œ ํ•ด๋‹น ๋…ธ๋“œ๋ฅผ ์ œ๊ฑฐํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ๋Œ€์ฒด ๋…ธ๋“œ๊ฐ€ ์—†๋‹ค๋ฉด ์ฟผ๋ฆฌ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด Primary ์„œ๋ฒ„๋ฅผ Replica ๊ทธ๋ฃน(hostgroup_id=1) ์— ๋‚ฎ์€ ๊ฐ€์ค‘์น˜(weight) ๋กœ ์ถ”๊ฐ€ํ•˜์—ฌ Replica ์žฅ์•  ์‹œ ์ฝ๊ธฐ ํŠธ๋ž˜ํ”ฝ์ด Primary๋กœ ์ž๋™ ์šฐํšŒ๋˜๋„๋ก ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

๊ฐ€์ค‘์น˜ ์„ค์ • ๋กœ์ง

ProxySQL์€ ๊ฐ ์„œ๋ฒ„์— ์„ค์ •๋œ weight ๋น„์œจ์— ๋”ฐ๋ผ ํŠธ๋ž˜ํ”ฝ์„ ๋ถ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. Primary 1๋Œ€, Replica 2๋Œ€๋กœ ๊ตฌ์„ฑ๋œ ํ™˜๊ฒฝ์—์„œ, ProxySQL์ด ์–ด๋–ป๊ฒŒ ํŠธ๋ž˜ํ”ฝ์„ ๋ถ„๋ฐฐํ•˜๋Š”์ง€ ๊ณ„์‚ฐํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์„ค์ • ์ƒํ™ฉ

  • Primary: ๊ฐ€์ค‘์น˜ 1

  • Replica 1: ๊ฐ€์ค‘์น˜ 100

  • Replica 2: ๊ฐ€์ค‘์น˜ 100

ํŠธ๋ž˜ํ”ฝ ๋ถ„์‚ฐ ๋น„์œจ ๊ณ„์‚ฐ

  • ์ด ๊ฐ€์ค‘์น˜ ํ•ฉ: 1(Primary) + 100(Replica) + 100(Replica) = 201

  • Replica 1 ์ ์œ ์œจ: 100 / 201 โ‰ˆ 49.75%

  • Replica 2 ์ ์œ ์œจ: 100 / 201 โ‰ˆ 49.75%

  • Primary ์ ์œ ์œจ: 1 / 201 โ‰ˆ 0.5%

์ฆ‰, ์ „์ฒด ์ฝ๊ธฐ ํŠธ๋ž˜ํ”ฝ์˜ 99.5%๋Š” ๋‘ ๋Œ€์˜ Replica๊ฐ€ ๋‚˜๋ˆ„์–ด ์ฒ˜๋ฆฌํ•˜๊ณ , Primary๋Š” ์•ฝ 0.5%์˜ ์•„์ฃผ ๋ฏธ๋ฏธํ•œ ํŠธ๋ž˜ํ”ฝ๋งŒ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ Replica๋“ค์ด ์žฅ์• ๋กœ ์ธํ•ด ์ œ์™ธ๋˜๋ฉด, ๋‚จ์€ Primary๊ฐ€ ์œ ์ผํ•œ ์ฒ˜๋ฆฌ ๋Œ€์ƒ(100%)์ด ๋˜์–ด ์ฝ๊ธฐ ํŠธ๋ž˜ํ”ฝ์„ ๋ฐ›์•„๋‚ด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๊ฐ€์ค‘์น˜ ์„ค์ • ์ ์šฉ (SQL)

MySQL ์„œ๋ฒ„๋ฅผ Primary์™€ Replica๋กœ ๊ตฌ์„ฑํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

  • Primary(hostgroup_id=0)๋Š” ์“ฐ๊ธฐ ๋Œ€์ƒ

  • Replica(hostgroup_id=1)๋Š” ์ฝ๊ธฐ ๋Œ€์ƒ

Replica ๊ทธ๋ฃน์— Primary๋ฅผ ๋‚ฎ์€ ๊ฐ€์ค‘์น˜๋กœ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

์„ค์ • ํ›„ ์กฐํšŒํ•ด๋ณด๋ฉด ์œ„์™€ ๊ฐ™์ด ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

์žฅ์•  ํ…Œ์ŠคํŠธ ๋ฐ ๊ฒ€์ฆ

์ด์ œ ๊ฐ•์ œ๋กœ Replica ์„œ๋ฒ„๋ฅผ ๋‹ค์šด์‹œํ‚ค๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ๊ทธ๋‚˜ ProxySQL ๋ชจ๋‹ˆํ„ฐ๋ง์„ ํ™•์ธํ•ด ๋ด…๋‹ˆ๋‹ค. Replica๊ฐ€ ์ฃฝ์ž๋งˆ์ž ์ฝ๊ธฐ ์š”์ฒญ์ด Primary๋กœ ๋ผ์šฐํŒ…๋˜์–ด ์—๋Ÿฌ ์—†์ด ์„œ๋น„์Šค๊ฐ€ ์œ ์ง€๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ณต๊ตฌ ํ›„์—๋„ ํŠธ๋ž˜ํ”ฝ์ด ๋Œ์•„์˜ค์ง€ ์•Š๋Š”๋‹ค๋ฉด? (๋ณต์ œ ์ƒํƒœ์™€ ๋ผ์šฐํŒ… ์กฐ๊ฑด)

Replica ์„œ๋ฒ„๋ฅผ ๋‹ค์‹œ ์‚ด๋ ธ๋Š”๋ฐ๋„ ๋ถˆ๊ตฌํ•˜๊ณ , ์—ฌ์ „ํžˆ ๋ชจ๋“  ์ฝ๊ธฐ ํŠธ๋ž˜ํ”ฝ์ด Primary๋กœ๋งŒ ๊ฐ€๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋•Œ๋Š” **๋ณต์ œ ์ง€์—ฐ(Replication Lag)**์„ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ProxySQL์€ max_replication_lag ์„ค์ •๊ฐ’(๊ธฐ๋ณธ๊ฐ’ ๋“ฑ)์„ ์ดˆ๊ณผํ•˜์—ฌ ์ง€์—ฐ์ด ๋ฐœ์ƒํ•˜๋Š” ์„œ๋ฒ„๋Š” **'๋ฐ์ดํ„ฐ๊ฐ€ ์ตœ์‹ ์ด ์•„๋‹ˆ๋‹ค'**๋ผ๊ณ  ํŒ๋‹จํ•˜์—ฌ ํŠธ๋ž˜ํ”ฝ์„ ๋ณด๋‚ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค (Shunned ์ƒํƒœ). ๋”ฐ๋ผ์„œ Replica๊ฐ€ ๋ง‰ ๊ธฐ๋™๋˜์–ด ๋ฐ€๋ฆฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋™๊ธฐํ™”ํ•˜๋Š” ์ค‘์ด๋ผ๋ฉด, ์ด ์ง€์—ฐ์ด ํ•ด์†Œ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๊ฑฐ๋‚˜ ๋ณต์ œ ์˜ค๋ฅ˜๊ฐ€ ์—†๋Š”์ง€ SHOW REPLICA STATUS ๋ช…๋ น์–ด๋กœ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋งŒ์•ฝ Replica๋ฅผ ๋ณต๊ตฌ์‹œ์ผฐ์Œ์—๋„ ์—ฌ์ „ํžˆ ์ฝ๊ธฐ ํŠธ๋ž˜ํ”ฝ์ด Primary๋กœ ํ–ฅํ•œ๋‹ค๋ฉด, ํ•ด๋‹น Replica์˜ ๋ณต์ œ ์ƒํƒœ(Replication Delay, Error) ๋ฅผ ์ ๊ฒ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ProxySQL์€ Replica๊ฐ€ ONLINE ์ƒํƒœ๋กœ ํ‘œ์‹œ๋˜์–ด ์žˆ์–ด๋„ ๋‹ค์Œ ์กฐ๊ฑด ์ค‘ ํ•˜๋‚˜๋ผ๋„ ํ•ด๋‹น๋˜๋ฉด ์ฝ๊ธฐ ๋ผ์šฐํŒ… ๋Œ€์ƒ์—์„œ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค.

  • ๋ณต์ œ ์ง€์—ฐ(Seconds_Behind_Master)์ด ํ—ˆ์šฉ ๋ฒ”์œ„๋ฅผ ์ดˆ๊ณผํ•œ ๊ฒฝ์šฐ

    • ProxySQL์€ max_replication_lag ์„ค์ •๊ฐ’(๊ธฐ๋ณธ๊ฐ’ ๋“ฑ)์„ ์ดˆ๊ณผํ•˜์—ฌ ์ง€์—ฐ์ด ๋ฐœ์ƒํ•˜๋Š” ์„œ๋ฒ„๋Š” '๋ฐ์ดํ„ฐ๊ฐ€ ์ตœ์‹ ์ด ์•„๋‹ˆ๋‹ค'๋ผ๊ณ  ํŒ๋‹จํ•˜์—ฌ ํŠธ๋ž˜ํ”ฝ์„ ๋ณด๋‚ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค (Shunned ์ƒํƒœ).

    • ์ด ์ง€์—ฐ์ด ํ•ด์†Œ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๊ฑฐ๋‚˜ ๋ณต์ œ ์˜ค๋ฅ˜๊ฐ€ ์—†๋Š”์ง€ SHOW REPLICA STATUS ๋ช…๋ น์–ด๋กœ ํ™•์ธ

  • ๋ณต์ œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ

  • ๋„คํŠธ์›Œํฌ ping ์‹คํŒจ๋กœ ์‘๋‹ต์ด ๋ถˆ์•ˆ์ •ํ•œ ๊ฒฝ์šฐ

์ด๋Ÿฐ ์กฐ๊ฑด ๋•๋ถ„์— ProxySQL์€ ๋‹จ์ˆœํ•œ ์žฅ์•  ๊ฐ์ง€๋งŒ์ด ์•„๋‹ˆ๋ผ, ๋ณต์ œ ์ƒํƒœ์˜ ๊ฑด์ „์„ฑ์„ ๊ธฐ์ค€์œผ๋กœ ํŠธ๋ž˜ํ”ฝ์„ ์ž๋™์œผ๋กœ ์ตœ์  ๋ถ„๋ฐฐํ•˜๋Š” ์—ญํ• ๊นŒ์ง€ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์‹œ๋‚˜๋ฆฌ์˜ค 2. ๋งˆ์Šคํ„ฐ DB ์žฅ์• 

์ด๋ฒˆ ์‹œ๋‚˜๋ฆฌ์˜ค๋Š” ์“ฐ๊ธฐ ์ž‘์—…์„ ๋‹ด๋‹นํ•˜๋Š” Primary ์„œ๋ฒ„๋ฅผ ๊ฐ•์ œ๋กœ ๋‹ค์šด์‹œ์ผœ, ์‹ค์ œ ์„œ๋น„์Šค ํ™˜๊ฒฝ์—์„œ์˜ Failover ๋™์ž‘์„ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด Primary๊ฐ€ ๋‹ค์šด๋œ ์ƒํƒœ์—์„œ ์“ฐ๊ธฐ(Write) ์š”์ฒญ์ด ํฌํ•จ๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ API๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

Primary ์„œ๋ฒ„๊ฐ€ ์‘๋‹ตํ•˜์ง€ ์•Š์œผ๋ฉด Orchestrator๋Š” ์ฆ‰์‹œ ์žฅ์• ๋ฅผ ๊ฐ์ง€ํ•˜๊ณ  Auto Failover ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

  • ์‘๋‹ต ์—†๋Š” ๊ธฐ์กด Primary๋Š” ํด๋Ÿฌ์Šคํ„ฐ ํ† ํด๋กœ์ง€์—์„œ ๋ถ„๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

  • ๊ฐ€์žฅ ์ ํ•ฉํ•œ Replica ์„œ๋ฒ„๊ฐ€ ์„ ์ •๋˜์–ด ์ƒˆ๋กœ์šด Primary๋กœ ์Šน๊ฒฉ๋ฉ๋‹ˆ๋‹ค.

MySQL General Log๋ฅผ ํ™•์ธํ•ด ๋ณด๋ฉด, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ณด๋‚ธ INSERT ์ฟผ๋ฆฌ๊ฐ€ ์œ ์‹ค๋˜์ง€ ์•Š๊ณ  ์ƒˆ๋กœ์šด Primary ์„œ๋ฒ„์˜ ๋กœ๊ทธ์— ์ •์ƒ์ ์œผ๋กœ ๊ธฐ๋ก๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ProxySQL์ด ์ ์ ˆํ•œ ๊ณณ์œผ๋กœ ํŠธ๋ž˜ํ”ฝ์„ ๋Œ๋ ค์ฃผ์—ˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ณผ์ •์—์„œ ProxySQL ๋‚ด๋ถ€์—์„œ๋Š” ์–ด๋–ค ์ผ์ด ์ผ์–ด๋‚ฌ๋Š”์ง€ ๋Ÿฐํƒ€์ž„ ์„œ๋ฒ„ ์ƒํƒœ๋ฅผ ํ†ตํ•ด ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๊ธฐ์กด Primary: ์—ฐ๊ฒฐ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ ์ƒํƒœ๊ฐ€ SHUNNED(์ผ์‹œ์  ๊ฒฉ๋ฆฌ)๋กœ ๋ณ€๊ฒฝ๋˜์–ด, ๋” ์ด์ƒ ํŠธ๋ž˜ํ”ฝ์„ ๋ฐ›์ง€ ์•Š๊ฒŒ ์„œ๋น„์Šค์—์„œ ์ œ์™ธ๋ฉ๋‹ˆ๋‹ค.

  • ์ƒˆ๋กœ์šด Primary (๊ตฌ Replica): read_only๊ฐ€ ํ•ด์ œ๋œ ๊ฒƒ์„ ProxySQL์ด ๊ฐ์ง€ํ•˜๊ณ , hostgroup_id=0 (Writer ๊ทธ๋ฃน)์œผ๋กœ ์—ญํ• ์„ ๋ณ€๊ฒฝํ•˜์—ฌ ์“ฐ๊ธฐ ํŠธ๋ž˜ํ”ฝ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

์ด ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ๋ฅผ ํ†ตํ•ด mysql_servers ํ…Œ์ด๋ธ”์€ ๊ด€๋ฆฌ์ž๊ฐ€ ์ดˆ๊ธฐ์— ์„ค์ •ํ•œ ํ˜ธ์ŠคํŠธ ๊ทธ๋ฃน ์ •๋ณด(์ •์  ์„ค์ •)๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ์šฉ๋„๋กœ ํ™œ์šฉ๋˜๊ณ , runtime_mysql_servers ํ…Œ์ด๋ธ”์€ ํ˜„์žฌ ์‹ค์ œ๋กœ ์„œ๋น„์Šค๋˜๊ณ  ์žˆ๋Š” DB์˜ ์ƒํƒœ(Status)์™€ ๋ชฉ๋ก์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

Last updated