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: ๊ฐ์ค์น
1Replica 1: ๊ฐ์ค์น
100Replica 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