MySQL ํด๋Ÿฌ์Šคํ„ฐ์šฉ HA ์†”๋ฃจ์…˜์ธ Orchestrator ๋ฐ VIP

Citymobil์—์„œ๋Š” MySQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ฃผ์š” ์˜๊ตฌ ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋‹ค์–‘ํ•œ ์„œ๋น„์Šค์™€ ๋ชฉ์ ์„ ์œ„ํ•œ ์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋ณด์œ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋งˆ์Šคํ„ฐ์˜ ์ง€์†์ ์ธ ๊ฐ€์šฉ์„ฑ์€ ์ „์ฒด ์‹œ์Šคํ…œ๊ณผ ๊ฐœ๋ณ„ ๋ถ€ํ’ˆ์˜ ์„ฑ๋Šฅ์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ค‘์š”ํ•œ ์ง€ํ‘œ์ž…๋‹ˆ๋‹ค. ๋งˆ์Šคํ„ฐ ์žฅ์•  ๋ฐœ์ƒ ์‹œ ์ž๋™ ํด๋Ÿฌ์Šคํ„ฐ ๋ณต๊ตฌ๋Š” ์‚ฌ๊ณ  ๋Œ€์‘ ์‹œ๊ฐ„๊ณผ ์‹œ์Šคํ…œ ๊ฐ€๋™ ์ค‘์ง€ ์‹œ๊ฐ„์„ ํฌ๊ฒŒ ์ค„์—ฌ์ค๋‹ˆ๋‹ค. ์ด ๊ธฐ์‚ฌ์—์„œ๋Š” ๋‹ค์Œ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” MySQL ํด๋Ÿฌ์Šคํ„ฐ์˜ ๊ณ ๊ฐ€์šฉ์„ฑ(HA) ์„ค๊ณ„๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. MySQL ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ ๋ฐ ๊ฐ€์ƒ IP ์ฃผ์†Œ(VIP).

MySQL ํด๋Ÿฌ์Šคํ„ฐ์šฉ HA ์†”๋ฃจ์…˜์ธ Orchestrator ๋ฐ VIP

VIP ๊ธฐ๋ฐ˜ HA ์†”๋ฃจ์…˜

๋จผ์ €, ๋‹น์‚ฌ์˜ ๋ฐ์ดํ„ฐ ์ €์žฅ ์‹œ์Šคํ…œ์ด ๋ฌด์—‡์ธ์ง€ ๊ฐ„๋žตํ•˜๊ฒŒ ๋ง์”€๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

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

๋ณต์ œ๋Š” ๋‹ค์Œ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฐ˜๋™๊ธฐ ๋ชจ๋“œ๋กœ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. GTID. ์ด๋Š” ์„ฑ๊ณต์œผ๋กœ ๊ฐ„์ฃผ๋˜๊ธฐ ์ „์— ์ ์–ด๋„ ํ•˜๋‚˜์˜ ๋ณต์ œ๋ณธ์ด ํŠธ๋žœ์žญ์…˜์„ ๊ธฐ๋กํ•ด์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ณต์ œ ๋ชจ๋“œ๋Š” ๋งˆ์Šคํ„ฐ ๋…ธ๋“œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ ์„ฑ๋Šฅ๊ณผ ๋ฐ์ดํ„ฐ ์•ˆ์ „ ๊ฐ„์˜ ์ตœ์ ์˜ ๊ท ํ˜•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋“  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋งˆ์Šคํ„ฐ์—์„œ ๋ณต์ œ๋ณธ์œผ๋กœ ์ „์†ก๋ฉ๋‹ˆ๋‹ค. Row Based Replication (RBR)ํ•˜์ง€๋งŒ ์ผ๋ถ€ ๋…ธ๋“œ์—๋Š” mixed binlog format.

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

๋งˆ์Šคํ„ฐ๊ฐ€ ์‹คํŒจํ•œ ๊ฒฝ์šฐ ๋งˆ์Šคํ„ฐ๋ฅผ ๋ณต์›ํ•˜๋Š” ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋Š” ์œ ๋™ VIP ์ฃผ์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ณ„์† ์ง„ํ–‰ํ•˜๊ธฐ ์ „์— ์ด ์†”๋ฃจ์…˜์— ๋Œ€ํ•ด ์•Œ์•„์•ผ ํ•  ์‚ฌํ•ญ:

  • VIP๋Š” ํŠน์ • ๋ฌผ๋ฆฌ์  ๋„คํŠธ์›Œํฌ ์ธํ„ฐํŽ˜์ด์Šค์™€ ์—ฐ๊ฒฐ๋˜์ง€ ์•Š์€ IP ์ฃผ์†Œ์ž…๋‹ˆ๋‹ค. ๋…ธ๋“œ์— ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฑฐ๋‚˜ ์˜ˆ์ •๋œ ์œ ์ง€ ๊ด€๋ฆฌ ๊ธฐ๊ฐ„ ๋™์•ˆ ๊ฐ€๋™ ์ค‘์ง€ ์‹œ๊ฐ„์„ ์ตœ์†Œํ™”ํ•˜๋ฉด์„œ VIP๋ฅผ ๋‹ค๋ฅธ ๋ฆฌ์†Œ์Šค๋กœ ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ฐ€์ƒ IP ์ฃผ์†Œ๋ฅผ ํ•ด์ œํ•˜๊ณ  ๋ฐœ๊ธ‰ํ•˜๋Š” ๊ฒƒ์€ ์ €๋ ดํ•˜๊ณ  ๋น ๋ฅธ ์ž‘์—…์ž…๋‹ˆ๋‹ค.
  • VIP๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด SSH๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„์— ์•ก์„ธ์Šคํ•˜๊ฑฐ๋‚˜ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŠน์ˆ˜ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. keepalived.

๋งˆ๋ฒ•์‚ฌ์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋ฅผ ์‚ดํŽด๋ณด๊ณ  ์ž๋™ ๋ณต๊ตฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•ด์•ผ ํ•˜๋Š”์ง€ ์ƒ์ƒํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋งˆ์Šคํ„ฐ์™€์˜ ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ์ด ๋Š์–ด์กŒ๊ฑฐ๋‚˜, ํ•˜๋“œ์›จ์–ด ์ฐจ์›์—์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ

  1. ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ๋Š” ํด๋Ÿฌ์Šคํ„ฐ ํ† ํด๋กœ์ง€๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ๊ฐ ๋ณต์ œ๋ณธ์€ ๋งˆ์Šคํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ์„ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค. ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ๋Š” ์ƒˆ๋กœ์šด ๋งˆ์Šคํ„ฐ์˜ ์—ญํ• ์— ์ ํ•ฉํ•œ ๋ณต์ œ๋ณธ์„ ์„ ํƒํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹œ์ž‘ํ•˜๊ณ  ๋ณต๊ตฌ๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  2. ์šฐ๋ฆฌ๋Š” ์ด์ „ ๋งˆ์Šคํ„ฐ์—์„œ VIP๋ฅผ ์ œ๊ฑฐํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜๊ณ  ์žˆ์ง€๋งŒ ์„ฑ๊ณตํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.
  3. ๋ณต์ œ๋ณธ์ด ๋งˆ์Šคํ„ฐ ์—ญํ• ๋กœ ์ „ํ™˜๋ฉ๋‹ˆ๋‹ค. ํ† ํด๋กœ์ง€๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ•˜๋Š” ์ค‘์ž…๋‹ˆ๋‹ค.
  4. VIP๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ๋กœ์šด ๋„คํŠธ์›Œํฌ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. VIP๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์ฃผ๊ธฐ์ ์œผ๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๋ฌด๋ฃŒ ARP. ์ด๋Ÿฌํ•œ ์œ ํ˜•์˜ ์š”์ฒญ/์‘๋‹ต์„ ํ†ตํ•ด ์—ฐ๊ฒฐ๋œ ์Šค์œ„์น˜์˜ IP ๋ฐ MAC ์ฃผ์†Œ ๋งคํ•‘ ํ…Œ์ด๋ธ”์„ ์—…๋ฐ์ดํŠธํ•˜์—ฌ VIP๊ฐ€ ์ด๋™ํ–ˆ์Œ์„ ์•Œ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๊ฐ€๋Šฅ์„ฑ์ด ์ตœ์†Œํ™”๋ฉ๋‹ˆ๋‹ค. split brain ์˜› ์ฃผ์ธ์„ ๋˜๋Œ๋ฆด ๋•Œ.
  5. ๋ชจ๋“  ์ƒˆ๋กœ์šด ์—ฐ๊ฒฐ์€ ์ฆ‰์‹œ ์ƒˆ๋กœ์šด ๋งˆ์Šคํ„ฐ๋กœ ๋ฆฌ๋””๋ ‰์…˜๋ฉ๋‹ˆ๋‹ค. ์ด์ „ ์—ฐ๊ฒฐ์ด ์‹คํŒจํ•˜๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ˆ˜์ค€์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋Œ€ํ•œ ๋ฐ˜๋ณต ํ˜ธ์ถœ์ด ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.

์„œ๋ฒ„๊ฐ€ ์ •์ƒ ๋ชจ๋“œ๋กœ ์ž‘๋™ ์ค‘์ธ๋ฐ DBMS ์ˆ˜์ค€์—์„œ ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ด์ „ ์‚ฌ๋ก€์™€ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค: ํ† ํด๋กœ์ง€ ์—…๋ฐ์ดํŠธ ๋ฐ ๋ณต๊ตฌ ํ”„๋กœ์„ธ์Šค ์‹œ์ž‘. ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ด์ „ ๋งˆ์Šคํ„ฐ์—์„œ VIP๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ํ•ด์ œํ•˜๊ณ  ์ƒˆ ๋งˆ์Šคํ„ฐ๋กœ ์ „์†กํ•œ ํ›„ ์—ฌ๋Ÿฌ ARP ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ์ด์ „ ๋งˆ์Šคํ„ฐ์˜ ๋ฐ˜ํ™˜ ๊ฐ€๋Šฅ์„ฑ์€ ์žฌ๊ตฌ์ถ•๋œ ํด๋Ÿฌ์Šคํ„ฐ ๋ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ž‘๋™์— ์˜ํ–ฅ์„ ์ฃผ์–ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

๊ธฐํƒ€ ๋ฌธ์ œ

๋ณต์ œ๋ณธ ๋˜๋Š” ์ค‘๊ฐ„ ๋งˆ์Šคํ„ฐ ์˜ค๋ฅ˜ ์ด๋Œ์ง€ ์•Š๋Š”๋‹ค ์ž๋™ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์ˆ˜๋™ ๊ฐœ์ž…์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ€์ƒ ๋„คํŠธ์›Œํฌ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ํ•ญ์ƒ ์ž„์‹œ๋กœ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์„œ๋ฒ„ ์žฌ๋ถ€ํŒ… ํ›„ VIP๊ฐ€ ์ž๋™์œผ๋กœ ํ• ๋‹น๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ธ์Šคํ„ด์Šค๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ฝ๊ธฐ ์ „์šฉ ๋ชจ๋“œ์—์„œ ์‹œ์ž‘๋˜๋ฉฐ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ๋Š” ์ž๋™์œผ๋กœ ์ƒˆ ๋งˆ์Šคํ„ฐ๋ฅผ ์“ฐ๊ธฐ ๋ชจ๋“œ๋กœ ์ „ํ™˜ํ•˜๊ณ  ์„ค์น˜๋ฅผ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. read only ์˜› ์ฃผ์ธ์—๊ฒŒ. ์ด๋Ÿฌํ•œ ์กฐ์น˜๋Š” ๊ฐ€๋Šฅ์„ฑ์„ ์ค„์ด๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•ฉ๋‹ˆ๋‹ค. split brain.

๋ณต๊ตฌ ํ”„๋กœ์„ธ์Šค ์ค‘์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ํ‘œ์ค€ ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ ์™ธ์— ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ UI๋ฅผ ํ†ตํ•ด์„œ๋„ ์•Œ๋ ค์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜์—ฌ REST API๋ฅผ ํ™•์žฅํ–ˆ์Šต๋‹ˆ๋‹ค(PR ํ˜„์žฌ ๊ฒ€ํ† ์ค‘).

HA ์†”๋ฃจ์…˜์˜ ์ผ๋ฐ˜์ ์ธ ๋‹ค์ด์–ด๊ทธ๋žจ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

MySQL ํด๋Ÿฌ์Šคํ„ฐ์šฉ HA ์†”๋ฃจ์…˜์ธ Orchestrator ๋ฐ VIP

์ƒˆ๋กœ์šด ๋งˆ์Šคํ„ฐ ์„ ํƒ

์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ๋Š” ์ถฉ๋ถ„ํžˆ ๋˜‘๋˜‘ํ•˜๊ณ  ์„ ํƒ์„ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ ํ•ฉํ•œ ๋ณต์ œํ’ˆ ๋‹ค์Œ ๊ธฐ์ค€์— ๋”ฐ๋ผ ์ƒˆ๋กœ์šด ๋งˆ์Šคํ„ฐ๋กœ ์ง€์ •๋ฉ๋‹ˆ๋‹ค.

  • ๋ณต์ œ๋ณธ์€ ๋งˆ์Šคํ„ฐ๋ณด๋‹ค ๋’ค์ณ์ง‘๋‹ˆ๋‹ค.
  • ๋งˆ์Šคํ„ฐ ๋ฐ ๋ณต์ œ๋ณธ์˜ MySQL ๋ฒ„์ „.
  • ๋ณต์ œ ์œ ํ˜•(RBR, SBR ๋˜๋Š” ํ˜ผํ•ฉ)
  • ๋™์ผํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ ์„ผํ„ฐ์˜ ์œ„์น˜
  • ๊ฐ€์šฉ์„ฑ errant GTID โ€” ๋งˆ์Šคํ„ฐ์—๋Š” ์—†๊ณ  ๋ณต์ œ๋ณธ์—์„œ ์‹คํ–‰๋œ ํŠธ๋žœ์žญ์…˜
  • ์‚ฌ์šฉ์ž ์ •์˜ ์„ ํƒ ๊ทœ์น™๋„ ๊ณ ๋ ค๋ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  ํ๊ฐ€ ๋งˆ์Šคํ„ฐ์—๊ฒŒ ์ด์ƒ์ ์ธ ํ›„๋ณด๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ณต์ œ๋ณธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐฑ์—…ํ•  ์ˆ˜ ์žˆ๊ฑฐ๋‚˜ ์„œ๋ฒ„์˜ ํ•˜๋“œ์›จ์–ด ๊ตฌ์„ฑ์ด ๋” ์ทจ์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ ะฟะพะดะดะตั€ะถะธะฒะฐะตั‚ ๊ฐ€์žฅ ์„ ํ˜ธํ•˜๋Š” ๊ฒƒ๋ถ€ํ„ฐ ๋ฌด์‹œํ•˜๋Š” ๊ฒƒ๊นŒ์ง€ ํ›„๋ณด์ž ์„ ํƒ ๊ธฐ๋ณธ ์„ค์ •์„ ์‚ฌ์šฉ์ž ์ •์˜ํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜๋™ ๊ทœ์น™์ž…๋‹ˆ๋‹ค.

์‘๋‹ต ๋ฐ ๋ณต๊ตฌ ์‹œ๊ฐ„

์‚ฌ๊ณ  ๋ฐœ์ƒ ์‹œ ์‹œ์Šคํ…œ ๊ฐ€๋™ ์ค‘์ง€ ์‹œ๊ฐ„์„ ์ตœ์†Œํ™”ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋ฏ€๋กœ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ์˜ ํด๋Ÿฌ์Šคํ„ฐ ํ† ํด๋กœ์ง€ ์ƒ์„ฑ ๋ฐ ์—…๋ฐ์ดํŠธ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” MySQL ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ณ ๋ คํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  • slave_net_timeout โ€” ์—ฐ๊ฒฐ์ด ๋Š์–ด์ง„ ๊ฒƒ์œผ๋กœ ์ธ์‹๋˜๊ณ  ๋‹ค์‹œ ์—ฐ๊ฒฐ๋˜๊ธฐ ์ „์— ๋ณต์ œ๋ณธ์ด ๋งˆ์Šคํ„ฐ์—์„œ ๋„์ฐฉํ•˜๋Š” ์ƒˆ ๋ฐ์ดํ„ฐ ๋˜๋Š” ํ•˜ํŠธ๋น„ํŠธ ์‹ ํ˜ธ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์‹œ๊ฐ„(์ดˆ)์ž…๋‹ˆ๋‹ค. ๊ฐ’์ด ๋‚ฎ์„์ˆ˜๋ก ๋ณต์ œ๋ณธ์ด ๋งˆ์Šคํ„ฐ์™€์˜ ํ†ต์‹ ์ด ๋Š์–ด์กŒ์Œ์„ ๋” ๋นจ๋ฆฌ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฐ’์„ 5์ดˆ๋กœ ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • MASTER_CONNECT_RETRY โ€” ์žฌ์—ฐ๊ฒฐ ์‹œ๋„ ์‚ฌ์ด์˜ ์‹œ๊ฐ„(์ดˆ)์ž…๋‹ˆ๋‹ค. ๋„คํŠธ์›Œํฌ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ ์ด ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ฐ’์ด ๋‚ฎ์œผ๋ฉด ๋น ๋ฅด๊ฒŒ ๋‹ค์‹œ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ํด๋Ÿฌ์Šคํ„ฐ ๋ณต๊ตฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹œ์ž‘๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ถŒ์žฅ ๊ฐ’์€ 1์ดˆ์ž…๋‹ˆ๋‹ค.
  • MASTER_RETRY_COUNT โ€” ์ตœ๋Œ€ ์žฌ์—ฐ๊ฒฐ ์‹œ๋„ ํšŸ์ˆ˜.
  • MASTER_HEARTBEAT_PERIOD โ€” ๋งˆ์Šคํ„ฐ๊ฐ€ ํ•˜ํŠธ๋น„ํŠธ ์‹ ํ˜ธ๋ฅผ ๋ณด๋‚ด๋Š” ๊ฐ„๊ฒฉ(์ดˆ)์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ ์ ˆ๋ฐ˜ ๊ฐ’ slave_net_timeout.

์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ ๋งค๊ฐœ๋ณ€์ˆ˜:

  • DelayMasterPromotionIfSQLThreadNotUpToDate - ๊ฐ™๋‹ค๋ฉด true, ๊ทธ๋Ÿฌ๋ฉด ๋ณต์ œ๋ณธ์˜ SQL ์Šค๋ ˆ๋“œ๊ฐ€ ๋ฆด๋ ˆ์ด ๋กœ๊ทธ์—์„œ ์ ์šฉ๋˜์ง€ ์•Š์€ ๋ชจ๋“  ํŠธ๋žœ์žญ์…˜์„ ์™„๋ฃŒํ•  ๋•Œ๊นŒ์ง€ ๋งˆ์Šคํ„ฐ ์—ญํ• ์ด ํ›„๋ณด ๋ณต์ œ๋ณธ์— ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ํ›„๋ณด ๋ณต์ œ๋ณธ์ด ๋’ค์ณ์งˆ ๋•Œ ํŠธ๋žœ์žญ์…˜ ์†์‹ค์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ด ์˜ต์…˜์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • InstancePollSeconds โ€” ํ† ํด๋กœ์ง€๋ฅผ ๊ตฌ์ถ•ํ•˜๊ณ  ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋นˆ๋„.
  • RecoveryPollSeconds - ํ† ํด๋กœ์ง€ ๋ถ„์„ ๋นˆ๋„. ๋ฌธ์ œ๊ฐ€ ๊ฐ์ง€๋˜๋ฉด ํ† ํด๋กœ์ง€ ๋ณต๊ตฌ๊ฐ€ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ ์ผ์ •ํ•œ, 1์ดˆ์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ฐ ํด๋Ÿฌ์Šคํ„ฐ ๋…ธ๋“œ๋Š” ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ์— ์˜ํ•ด ํ•œ ๋ฒˆ์”ฉ ํด๋ง๋ฉ๋‹ˆ๋‹ค. InstancePollSeconds ์ดˆ ๋ฌธ์ œ๊ฐ€ ๊ฐ์ง€๋˜๋ฉด ํด๋Ÿฌ์Šคํ„ฐ ์ƒํƒœ๊ฐ€ ๊ฐ•์ œ๋ฉ๋‹ˆ๋‹ค. ์—…๋ฐ์ดํŠธ, ๋ณต๊ตฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ๋กœ ์ตœ์ข… ๊ฒฐ์ •์ด ๋‚ด๋ ค์ง‘๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฐ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‹คํ—˜ํ•˜์—ฌ ์‘๋‹ต ๋ฐ ๋ณต๊ตฌ ์‹œ๊ฐ„์„ 30์ดˆ๋กœ ์ค„์ผ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŠธ ๋ฒค์น˜

์šฐ๋ฆฌ๋Š” ๋กœ์ปฌ ๊ฐœ๋ฐœ๋กœ HA ์ฒด๊ณ„๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ ๋ฒค์น˜ ํ…Œ์ŠคํŠธ ๋ฐ ์ƒ์‚ฐ ํ™˜๊ฒฝ์—์„œ์˜ ์ถ”๊ฐ€ ๊ตฌํ˜„. ๋กœ์ปฌ ์Šคํƒ ๋“œ๋Š” Docker ๊ธฐ๋ฐ˜์œผ๋กœ ์™„์ „ ์ž๋™ํ™”๋˜์–ด ์žˆ์–ด ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ ๋ฐ ๋„คํŠธ์›Œํฌ ๊ตฌ์„ฑ์„ ์‹คํ—˜ํ•˜๊ณ , ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ 2~3๊ฐœ ์„œ๋ฒ„์—์„œ ์ˆ˜์‹ญ ๊ฐœ๋กœ ํ™•์žฅํ•˜๊ณ , ์•ˆ์ „ํ•œ ํ™˜๊ฒฝ์—์„œ ์—ฐ์Šต์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฐ์Šต ์ค‘์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ์—๋ฎฌ๋ ˆ์ด์…˜ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. kill -9, ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ์ข…๋ฃŒํ•˜๊ณ  ์„œ๋ฒ„๋ฅผ ์ค‘์ง€ํ•ฉ๋‹ˆ๋‹ค(docker-compose stop), ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋„คํŠธ์›Œํฌ ๋ฌธ์ œ๋ฅผ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•ฉ๋‹ˆ๋‹ค. iptables -j REJECT ๋˜๋Š” iptables -j DROP. ์šฐ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค:

  • ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ๋Š” ๋งˆ์Šคํ„ฐ์˜ ๋ฌธ์ œ๋ฅผ ๊ฐ์ง€ํ•˜๊ณ  10์ดˆ ์ด๋‚ด์— ํ† ํด๋กœ์ง€๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.
  • ๋ณต๊ตฌ ์ ˆ์ฐจ๊ฐ€ ์ž๋™์œผ๋กœ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. ๋„คํŠธ์›Œํฌ ๊ตฌ์„ฑ์ด ๋ณ€๊ฒฝ๋˜๊ณ  ๋งˆ์Šคํ„ฐ์˜ ์—ญํ• ์ด ๋ณต์ œ๋ณธ์œผ๋กœ ์ „๋‹ฌ๋˜๋ฉฐ ํ† ํด๋กœ์ง€๊ฐ€ ๋‹ค์‹œ ๊ตฌ์ถ•๋ฉ๋‹ˆ๋‹ค.
  • ์ƒˆ ๋งˆ์Šคํ„ฐ๋Š” ์“ฐ๊ธฐ ๊ฐ€๋Šฅํ•ด์ง€๋ฉฐ ์žฌ๊ตฌ์ถ• ํ”„๋กœ์„ธ์Šค ์ค‘์— ๋ผ์ด๋ธŒ ๋ณต์ œ๋ณธ์ด ์†์‹ค๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ๊ฐ€ ์ƒˆ ๋งˆ์Šคํ„ฐ์— ๊ธฐ๋ก๋˜๊ณ  ๋ณต์ œ๋˜๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  • ์ด ๋ณต๊ตฌ ์‹œ๊ฐ„์€ 30์ดˆ๋ฅผ ๋„˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

์กฐ์‚ฌ ๊ฒฐ๊ณผ

๊ธฐ๋ณธ ์Šคํ† ๋ฆฌ์ง€ ์‹œ์Šคํ…œ ๋…ธ๋“œ์˜ ์ƒํƒœ๋Š” SRE ๋ฐ ์šด์˜ํŒ€์˜ ์ฃผ์š” ๋ชฉํ‘œ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. VIP ๊ธฐ๋ฐ˜์˜ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ์™€ HA ์†”๋ฃจ์…˜์„ ๊ตฌํ˜„ํ•˜์—ฌ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํด๋Ÿฌ์Šคํ„ฐ์˜ ํ† ํด๋กœ์ง€ ๋ฌธ์ œ๋ฅผ ์•ˆ์ •์ ์œผ๋กœ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • ๋งˆ์Šคํ„ฐ ๊ด€๋ จ ์‚ฌ๊ณ ์— ์ž๋™์œผ๋กœ ์‹ ์†ํ•˜๊ฒŒ ๋Œ€์‘ํ•˜์—ฌ ์‹œ์Šคํ…œ ๊ฐ€๋™ ์ค‘์ง€ ์‹œ๊ฐ„์„ ์ค„์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด ์†”๋ฃจ์…˜์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ•œ๊ณ„์™€ ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • HA ์ฒด๊ณ„๋ฅผ ์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ ์„ผํ„ฐ๋กœ ํ™•์žฅํ•˜๋ ค๋ฉด ์ด๋“ค ์‚ฌ์ด์— ๋‹จ์ผ L2 ๋„คํŠธ์›Œํฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • ์ƒˆ ๋งˆ์Šคํ„ฐ์— VIP๋ฅผ ํ• ๋‹นํ•˜๊ธฐ ์ „์— ์ด์ „ ๋งˆ์Šคํ„ฐ์—์„œ ์ด๋ฅผ ํ•ด์ œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์„ธ์Šค๋Š” ์ˆœ์ฐจ์ ์ด๋ฏ€๋กœ ๋ณต๊ตฌ ์‹œ๊ฐ„์ด ๋Š˜์–ด๋‚ฉ๋‹ˆ๋‹ค.
  • VIP๋ฅผ ํ•ด์ œํ•˜๋ ค๋ฉด ์„œ๋ฒ„์— ๋Œ€ํ•œ SSH ์•ก์„ธ์Šค ๋˜๋Š” ์›๊ฒฉ ์ ˆ์ฐจ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„ ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ณต๊ตฌ ํ”„๋กœ์„ธ์Šค๋ฅผ ์œ ๋ฐœํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— VIP ์ œ๊ฑฐ๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋ ์ง€ ํ™•์‹ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋กœ ์ธํ•ด ๋™์ผํ•œ ๊ฐ€์ƒ IP ์ฃผ์†Œ๋ฅผ ๊ฐ€์ง„ ๋‘ ๊ฐœ์˜ ์„œ๋ฒ„๊ฐ€ ๋‚˜ํƒ€๋‚˜ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. split brain.

ํ”ผํ•˜๊ธฐ ์œ„ํ•ด split brain, ๋‹น์‹ ์€ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ์Šคํ† ๋‹ˆ์Šค (โ€œShoot The Other Node In The Headโ€), ๋ฌธ์ œ ๋…ธ๋“œ๋ฅผ ์™„์ „ํžˆ ๊ฒฉ๋ฆฌํ•˜๊ฑฐ๋‚˜ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. ํด๋Ÿฌ์Šคํ„ฐ ๊ณ ๊ฐ€์šฉ์„ฑ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” VIP์™€ DNS์˜ ์กฐํ•ฉ, ์„œ๋น„์Šค ๊ฒ€์ƒ‰๊ณผ ํ”„๋ก์‹œ ์„œ๋น„์Šค, ๋™๊ธฐ์‹ ๋ณต์ œ ๋ฐ ๊ณ ์œ ํ•œ ๋‹จ์ ๊ณผ ์žฅ์ ์ด ์žˆ๋Š” ๊ธฐํƒ€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ €๋Š” MySQL ์žฅ์•  ์กฐ์น˜ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ ‘๊ทผ ๋ฐฉ์‹์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ตฌํ˜„ํ•˜๊ธฐ ์‰ฝ๊ณ  ํ˜„์žฌ ์กฐ๊ฑด์—์„œ ํ—ˆ์šฉ ๊ฐ€๋Šฅํ•œ ์ˆ˜์ค€์˜ ์‹ ๋ขฐ์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ „์ฒด ์‹œ์Šคํ…œ๊ณผ ํŠนํžˆ ์ธํ”„๋ผ๊ฐ€ ๋ฐœ์ „ํ•จ์— ๋”ฐ๋ผ ์ด ์ ‘๊ทผ ๋ฐฉ์‹์€ ์˜์‹ฌํ•  ์—ฌ์ง€ ์—†์ด ๋ฐœ์ „ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€