์žฅ์•  ์กฐ์น˜ ํด๋Ÿฌ์Šคํ„ฐ PostgreSQL + Patroni. ๊ตฌํ˜„ ๊ฒฝํ—˜

์ด ๊ธฐ์‚ฌ์—์„œ๋Š” PostgreSQL ๋‚ด๊ฒฐํ•จ์„ฑ ๋ฌธ์ œ์— ์–ด๋–ป๊ฒŒ ์ ‘๊ทผํ–ˆ๋Š”์ง€, ์ด๊ฒƒ์ด ์šฐ๋ฆฌ์—๊ฒŒ ์™œ ์ค‘์š”ํ•ด์กŒ๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ๊ฒฐ๊ตญ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚ฌ๋Š”์ง€ ์•Œ๋ ค๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

์ „ ์„ธ๊ณ„์ ์œผ๋กœ 2,5๋งŒ ๋ช…์˜ ์‚ฌ์šฉ์ž, ๋งค์ผ 50๋ช… ์ด์ƒ์˜ ํ™œ์„ฑ ์‚ฌ์šฉ์ž๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„๋Š” ์•„์ผ๋žœ๋“œ์˜ ํ•œ ์ง€์—ญ์— ์žˆ๋Š” Amazone์— ์žˆ์Šต๋‹ˆ๋‹ค. 100๊ฐœ ์ด์ƒ์˜ ์„œ๋กœ ๋‹ค๋ฅธ ์„œ๋ฒ„๊ฐ€ ์ง€์†์ ์œผ๋กœ ์ž‘๋™ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ๊ทธ ์ค‘ ๊ฑฐ์˜ 50๊ฐœ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ํ•จ๊ป˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ „์ฒด ๋ฐฑ์—”๋“œ๋Š” ํด๋ผ์ด์–ธํŠธ์™€ ์ง€์†์ ์ธ ์›น ์†Œ์ผ“ ์—ฐ๊ฒฐ์„ ์œ ์ง€ํ•˜๋Š” ๋Œ€๊ทœ๋ชจ ๋ชจ๋†€๋ฆฌ์‹ ์ƒํƒœ ์ €์žฅ Java ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ž…๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ์‚ฌ์šฉ์ž๊ฐ€ ๋™์‹œ์— ๋™์ผํ•œ ๋ณด๋“œ์—์„œ ์ž‘์—…ํ•  ๋•Œ ๊ฐ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๊ธฐ๋กํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ์‚ฌ์šฉ์ž๊ฐ€ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ดˆ๋‹น ์•ฝ 10K ์š”์ฒญ์ด ์žˆ์Šต๋‹ˆ๋‹ค. Redis์˜ ์ตœ๋Œ€ ๋กœ๋“œ ์‹œ ์ดˆ๋‹น 80-100K ์š”์ฒญ์„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.
์žฅ์•  ์กฐ์น˜ ํด๋Ÿฌ์Šคํ„ฐ PostgreSQL + Patroni. ๊ตฌํ˜„ ๊ฒฝํ—˜

Redis์—์„œ PostgreSQL๋กœ ์ „ํ™˜ํ•œ ์ด์œ 

์ฒ˜์Œ์— ์šฐ๋ฆฌ ์„œ๋น„์Šค๋Š” ์„œ๋ฒ„์˜ RAM์— ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ํ‚ค-๊ฐ’ ์ €์žฅ์†Œ์ธ Redis์™€ ํ•จ๊ป˜ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ ˆ๋””์Šค์˜ ์žฅ์ :

  1. ์‘๋‹ต์†๋„๊ฐ€ ๋†’๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ๊ฒƒ์ด ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
  2. ๊ฐ„ํŽธํ•œ ๋ฐฑ์—… ๋ฐ ๋ณต์ œ.

Redis์˜ ๋‹จ์ :

  1. ์‹ค์ œ ๊ฑฐ๋ž˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ˆ˜์ค€์—์„œ ์‹œ๋ฎฌ๋ ˆ์ด์…˜์„ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„ ์ด๊ฒƒ์€ ํ•ญ์ƒ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์•˜๊ณ  ๋งค์šฐ ๋ณต์žกํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.
  2. ๋ฐ์ดํ„ฐ ์–‘์€ ๋ฉ”๋ชจ๋ฆฌ ์–‘์— ์˜ํ•ด ์ œํ•œ๋ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ์–‘์ด ๋Š˜์–ด๋‚ ์ˆ˜๋ก ๋ฉ”๋ชจ๋ฆฌ๋„ ๋Š˜์–ด๋‚˜๊ฒŒ ๋˜๊ณ , ๊ฒฐ๊ตญ ์„ ํƒํ•œ ์ธ์Šคํ„ด์Šค์˜ ํŠน์„ฑ์— ๋ถ€๋”ชํžˆ๊ฒŒ ๋˜๋Š”๋ฐ, AWS์—์„œ๋Š” ์ธ์Šคํ„ด์Šค ์œ ํ˜•์„ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•ด ์„œ๋น„์Šค๋ฅผ ์ค‘๋‹จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  3. ์ง€์†์ ์œผ๋กœ ๋‚ฎ์€ ๋Œ€๊ธฐ ์‹œ๊ฐ„ ์ˆ˜์ค€์„ ์œ ์ง€ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋งค์šฐ ๋งŽ์€ ์ˆ˜์˜ ์š”์ฒญ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ตœ์ ์˜ ์ง€์—ฐ ์ˆ˜์ค€์€ 17-20ms์ž…๋‹ˆ๋‹ค. 30-40ms ์ˆ˜์ค€์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์š”์ฒญ์— ๋Œ€ํ•œ ๊ธด ์‘๋‹ต๊ณผ ์„œ๋น„์Šค ์ €ํ•˜๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค. ์•ˆํƒ€๊น๊ฒŒ๋„ 2018๋…„ 2์›” Redis๊ฐ€ ์žˆ๋Š” ์ธ์Šคํ„ด์Šค ์ค‘ ํ•˜๋‚˜๊ฐ€ ์–ด๋–ค ์ด์œ ๋กœ ํ‰์†Œ๋ณด๋‹ค XNUMX๋ฐฐ ๋” ๋งŽ์€ ๋Œ€๊ธฐ ์‹œ๊ฐ„์„ ์ˆ˜์‹ ํ–ˆ์„ ๋•Œ ์ด๋Ÿฐ ์ผ์ด ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์˜ˆ์ •๋˜์ง€ ์•Š์€ ์œ ์ง€ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด ์ •์˜ค์— ์„œ๋น„์Šค๋ฅผ ์ค‘๋‹จํ•˜๊ณ  ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” Redis ์ธ์Šคํ„ด์Šค๋ฅผ ๊ต์ฒดํ–ˆ์Šต๋‹ˆ๋‹ค.
  4. ์ฝ”๋“œ์— ์‚ฌ์†Œํ•œ ์˜ค๋ฅ˜๊ฐ€ ์žˆ์–ด๋„ ๋ฐ์ดํ„ฐ ๋ถˆ์ผ์น˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์‰ฝ๊ณ  ์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐ ๋งŽ์€ ์‹œ๊ฐ„์„ ์†Œ๋น„ํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ๋‹จ์ ์„ ๊ณ ๋ คํ–ˆ๊ณ  ์ •์ƒ์ ์ธ ๊ฑฐ๋ž˜๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ณ  ๋Œ€๊ธฐ ์‹œ๊ฐ„์— ๋œ ์˜์กดํ•˜๋Š” ๋” ํŽธ๋ฆฌํ•œ ๊ฒƒ์œผ๋กœ ์ „ํ™˜ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. ์—ฐ๊ตฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ๋งŽ์€ ์˜ต์…˜์„ ๋ถ„์„ํ•œ ํ›„ PostgreSQL์„ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฏธ 1,5๋…„ ์ „๋ถ€ํ„ฐ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ์˜ฎ๊ฒจ์™”๊ณ  ๋ฐ์ดํ„ฐ์˜ ์ผ๋ถ€๋งŒ ์˜ฎ๊ฒผ๊ธฐ ๋•Œ๋ฌธ์— ์ง€๊ธˆ์€ Redis์™€ PostgreSQL์„ ๋™์‹œ์— ์ž‘์—…ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฐ„ ๋ฐ์ดํ„ฐ ์ด๋™ ๋ฐ ์ „ํ™˜ ๋‹จ๊ณ„์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋‹ค์Œ ๋ฌธ์„œ์— ๊ธฐ๋ก๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ๋™๋ฃŒ์˜ ๊ธฐ์‚ฌ.

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

PgBouncer ๊ตฌํ˜„

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

์—ฐ๊ฒฐ ๊ด€๋ฆฌ์ž์—๋Š” Pgpool๊ณผ PgBouncer๋ผ๋Š” ๋‘ ๊ฐ€์ง€ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ฒซ ๋ฒˆ์งธ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž‘์—…์˜ ํŠธ๋žœ์žญ์…˜ ๋ชจ๋“œ๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ PgBouncer๋ฅผ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ž‘์—… ์ฒด๊ณ„๋ฅผ ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ํ•˜๋‚˜์˜ PgBouncer์— ์•ก์„ธ์Šคํ•˜๊ณ  ๊ทธ ๋’ค์—๋Š” PostgreSQL ๋งˆ์Šคํ„ฐ๊ฐ€ ์žˆ๊ณ  ๊ฐ ๋งˆ์Šคํ„ฐ ๋’ค์—๋Š” ๋น„๋™๊ธฐ ๋ณต์ œ๊ฐ€ ์žˆ๋Š” ํ•˜๋‚˜์˜ ๋ณต์ œ๋ณธ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
์žฅ์•  ์กฐ์น˜ ํด๋Ÿฌ์Šคํ„ฐ PostgreSQL + Patroni. ๊ตฌํ˜„ ๊ฒฝํ—˜

๋™์‹œ์— PostgreSQL์— ์ „์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์—†์—ˆ๊ณ  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž‘์—… ์†๋„๊ฐ€ ์ค‘์š”ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ˆ˜์ค€์—์„œ PostgreSQL ์ƒค๋”ฉ์„ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ์œ„์—์„œ ์„ค๋ช…ํ•œ ์ฒด๊ณ„๋Š” ์ด๋ฅผ ์œ„ํ•ด ์ƒ๋Œ€์ ์œผ๋กœ ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ PostgreSQL ์ƒค๋“œ๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ PgBouncer ๊ตฌ์„ฑ์„ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ถฉ๋ถ„ํ•˜๋ฉฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ƒˆ ์ƒค๋“œ์™€ ์ฆ‰์‹œ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

PgBouncer ์žฅ์•  ์กฐ์น˜

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

๊ทธ ํ›„ PgBouncer ๋ฐ PostgreSQL ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋‚ด๊ฒฐํ•จ์„ฑ์— ๋Œ€ํ•ด ์ง„์ง€ํ•˜๊ฒŒ ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. AWS ๊ณ„์ •์˜ ๋ชจ๋“  ์ธ์Šคํ„ด์Šค์—์„œ ์œ ์‚ฌํ•œ ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด PgBouncer ๋‚ด๊ฒฐํ•จ์„ฑ ์ฒด๊ณ„๋ฅผ ๊ตฌ์ถ•ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„๋Š” Network Load Balancer์— ์•ก์„ธ์Šคํ•˜๊ณ  ๊ทธ ๋’ค์— ๋‘ ๊ฐœ์˜ PgBouncer๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ PgBouncer๋Š” ๊ฐ ์ƒค๋“œ์˜ ๋™์ผํ•œ PostgreSQL ๋งˆ์Šคํ„ฐ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. AWS ์ธ์Šคํ„ด์Šค ์ถฉ๋Œ์ด ๋‹ค์‹œ ๋ฐœ์ƒํ•˜๋ฉด ๋ชจ๋“  ํŠธ๋ž˜ํ”ฝ์ด ๋‹ค๋ฅธ PgBouncer๋ฅผ ํ†ตํ•ด ๋ฆฌ๋””๋ ‰์…˜๋ฉ๋‹ˆ๋‹ค. Network Load Balancer ์žฅ์•  ์กฐ์น˜๋Š” AWS์—์„œ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์ด ์ฒด๊ณ„๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ƒˆ PgBouncer ์„œ๋ฒ„๋ฅผ ์‰ฝ๊ฒŒ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์žฅ์•  ์กฐ์น˜ ํด๋Ÿฌ์Šคํ„ฐ PostgreSQL + Patroni. ๊ตฌํ˜„ ๊ฒฝํ—˜

PostgreSQL ์žฅ์•  ์กฐ์น˜ ํด๋Ÿฌ์Šคํ„ฐ ์ƒ์„ฑ

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ๋•Œ ์ž์ฒด ์ž‘์„ฑ ์žฅ์•  ์กฐ์น˜, repmgr, AWS RDS, Patroni์™€ ๊ฐ™์€ ๋‹ค์–‘ํ•œ ์˜ต์…˜์„ ๊ณ ๋ คํ–ˆ์Šต๋‹ˆ๋‹ค.

์ž์ฒด ์ž‘์„ฑ ์Šคํฌ๋ฆฝํŠธ

๋งˆ์Šคํ„ฐ์˜ ์ž‘์—…์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  ์‹คํŒจํ•  ๊ฒฝ์šฐ ๋ณต์ œ๋ณธ์„ ๋งˆ์Šคํ„ฐ๋กœ ์Šน๊ฒฉํ•˜๊ณ  PgBouncer ๊ตฌ์„ฑ์„ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์ ‘๊ทผ ๋ฐฉ์‹์˜ ์žฅ์ ์€ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ง์ ‘ ์ž‘์„ฑํ•˜๊ณ  ์ž‘๋™ ๋ฐฉ์‹์„ ์ •ํ™•ํžˆ ์ดํ•ดํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ตœ๋Œ€์˜ ๋‹จ์ˆœ์„ฑ์ž…๋‹ˆ๋‹ค.

๋‹จ์  :

  • ๋งˆ์Šคํ„ฐ๊ฐ€ ์ฃฝ์ง€ ์•Š์•˜์„ ์ˆ˜๋„ ์žˆ๊ณ  ๋Œ€์‹  ๋„คํŠธ์›Œํฌ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์ธ์‹ํ•˜์ง€ ๋ชปํ•˜๋Š” ํŽ˜์ผ์˜ค๋ฒ„๋Š” ์ด์ „ ๋งˆ์Šคํ„ฐ๊ฐ€ ๊ณ„์† ์ž‘๋™ํ•˜๋Š” ๋™์•ˆ ๋ณต์ œ๋ณธ์„ ๋งˆ์Šคํ„ฐ๋กœ ์Šน๊ฒฉํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ์šฐ๋ฆฌ๋Š” ๋งˆ์Šคํ„ฐ ์—ญํ• ์„ ํ•˜๋Š” ๋‘ ๊ฐœ์˜ ์„œ๋ฒ„๋ฅผ ๊ฐ–๊ฒŒ ๋˜๋ฉฐ ์–ด๋Š ๊ฒƒ์ด ์ตœ์‹  ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด ์ƒํ™ฉ์„ ์Šคํ”Œ๋ฆฟ ๋ธŒ๋ ˆ์ธ(split-brain)์ด๋ผ๊ณ ๋„ ํ•ฉ๋‹ˆ๋‹ค.
  • ์šฐ๋ฆฌ๋Š” ์‘๋‹ต ์—†์ด ๋‚จ๊ฒจ์กŒ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ๊ตฌ์„ฑ์—์„œ ๋งˆ์Šคํ„ฐ์™€ ํ•˜๋‚˜์˜ ๋ณต์ œ๋ณธ์€ ์ „ํ™˜ ํ›„ ๋ณต์ œ๋ณธ์ด ๋งˆ์Šคํ„ฐ๋กœ ์ด๋™ํ•˜๊ณ  ๋” ์ด์ƒ ๋ณต์ œ๋ณธ์ด ์—†์œผ๋ฏ€๋กœ ์ƒˆ ๋ณต์ œ๋ณธ์„ ์ˆ˜๋™์œผ๋กœ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • 12๊ฐœ์˜ PostgreSQL ์ƒค๋“œ๊ฐ€ ์žˆ๋Š” ๋™์•ˆ ์žฅ์•  ์กฐ์น˜ ์ž‘์—…์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ๋ชจ๋‹ˆํ„ฐ๋ง์ด ํ•„์š”ํ•˜๋ฏ€๋กœ 12๊ฐœ์˜ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ƒค๋“œ ์ˆ˜๊ฐ€ ์ฆ๊ฐ€ํ•˜๋ฉด ์žฅ์•  ์กฐ์น˜๋„ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ž์ฒด ์ž‘์„ฑ ์žฅ์•  ์กฐ์น˜๋Š” ๋งค์šฐ ๋ณต์žกํ•ด ๋ณด์ด๋ฉฐ ์ ์ง€ ์•Š์€ ์ง€์›์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋‹จ์ผ PostgreSQL ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ด๊ฒƒ์ด ๊ฐ€์žฅ ์‰ฌ์šด ์˜ต์…˜์ด์ง€๋งŒ ํ™•์žฅ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์šฐ๋ฆฌ์—๊ฒŒ ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Repmgr

PostgreSQL ํด๋Ÿฌ์Šคํ„ฐ์˜ ์ž‘์—…์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” Replication Manager for PostgreSQL ํด๋Ÿฌ์Šคํ„ฐ. ๋™์‹œ์— ์ž๋™ ์žฅ์•  ์กฐ์น˜ ๊ธฐ๋Šฅ์ด ์—†์œผ๋ฏ€๋กœ ์ž‘์—…์„ ์œ„ํ•ด ์™„์„ฑ๋œ ์†”๋ฃจ์…˜ ์œ„์— ๊ณ ์œ ํ•œ "๋ž˜ํผ"๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ชจ๋“  ๊ฒƒ์ด ์ง์ ‘ ์ž‘์„ฑํ•œ ์Šคํฌ๋ฆฝํŠธ๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋ณต์žกํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ Repmgr์„ ์‹œ๋„์กฐ์ฐจ ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

AWS RDS

ํ•„์š”ํ•œ ๋ชจ๋“  ๊ฒƒ์„ ์ง€์›ํ•˜๊ณ  ๋ฐฑ์—… ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ  ์—ฐ๊ฒฐ ํ’€์„ ์œ ์ง€ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ž๋™ ์ „ํ™˜ ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋งˆ์Šคํ„ฐ๊ฐ€ ์ฃฝ์œผ๋ฉด ๋ณต์ œ๋ณธ์ด ์ƒˆ ๋งˆ์Šคํ„ฐ๊ฐ€ ๋˜๊ณ  AWS๋Š” dns ๋ ˆ์ฝ”๋“œ๋ฅผ ์ƒˆ ๋งˆ์Šคํ„ฐ๋กœ ๋ณ€๊ฒฝํ•˜์ง€๋งŒ ๋ณต์ œ๋ณธ์€ ๋‹ค๋ฅธ AZ์— ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹จ์ ์€ ๋ฏธ์„ธ ์กฐ์ •์ด ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฏธ์„ธ ์กฐ์ •์˜ ์˜ˆ: ์ธ์Šคํ„ด์Šค์—๋Š” tcp ์—ฐ๊ฒฐ์— ๋Œ€ํ•œ ์ œํ•œ์ด ์žˆ์ง€๋งŒ ๋ถˆํ–‰ํžˆ๋„ RDS์—์„œ๋Š” ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

net.ipv4.tcp_keepalive_time=10
net.ipv4.tcp_keepalive_intvl=1
net.ipv4.tcp_keepalive_probes=5
net.ipv4.tcp_retries2=3

๋˜ํ•œ AWS RDS๋Š” ์ผ๋ฐ˜ ์ธ์Šคํ„ด์Šค ๊ฐ€๊ฒฉ๋ณด๋‹ค ๊ฑฐ์˜ ๋‘ ๋ฐฐ๋‚˜ ๋น„์‹ธ์„œ ์ด ์†”๋ฃจ์…˜์„ ํฌ๊ธฐํ•œ ์ฃผ๋œ ์ด์œ ์˜€์Šต๋‹ˆ๋‹ค.

ํŒจํŠธ๋กœ๋‹ˆ

์ด๊ฒƒ์€ ํ›Œ๋ฅญํ•œ ๋ฌธ์„œํ™”, ์ž๋™ ์žฅ์•  ์กฐ์น˜ ๋ฐ github์˜ ์†Œ์Šค ์ฝ”๋“œ๋กœ PostgreSQL์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ Python ํ…œํ”Œ๋ฆฟ์ž…๋‹ˆ๋‹ค.

Patroni์˜ ์žฅ์ :

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

๋‹จ์  :

  • PgBouncer๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌธ์„œ์—์„œ ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋งˆ์ด๋„ˆ์Šค๋ผ๊ณ  ๋ถ€๋ฅด๊ธฐ๋Š” ์–ด๋ ต์ง€๋งŒ Patroni์˜ ์ž„๋ฌด๋Š” PostgreSQL์„ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด๊ณ  Patroni์— ๋Œ€ํ•œ ์—ฐ๊ฒฐ์ด ์–ด๋–ป๊ฒŒ ์ง„ํ–‰๋ ์ง€๋Š” ์ด๋ฏธ ์šฐ๋ฆฌ์˜ ๋ฌธ์ œ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
  • Patroni๋ฅผ ๋Œ€๋Ÿ‰์œผ๋กœ ๊ตฌํ˜„ํ•œ ์˜ˆ๋Š” ๊ฑฐ์˜ ์—†์ง€๋งŒ ์ฒ˜์Œ๋ถ€ํ„ฐ ๊ตฌํ˜„ํ•œ ์˜ˆ๋Š” ๋งŽ์Šต๋‹ˆ๋‹ค.

๊ทธ ๊ฒฐ๊ณผ ์žฅ์•  ์กฐ์น˜ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด Patroni๋ฅผ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.

Patroni ๊ตฌํ˜„ ํ”„๋กœ์„ธ์Šค

Patroni ์ด์ „์—๋Š” ๋น„๋™๊ธฐ์‹ ๋ณต์ œ๊ฐ€ ํฌํ•จ๋œ ํ•˜๋‚˜์˜ ๋งˆ์Šคํ„ฐ์™€ ํ•˜๋‚˜์˜ ๋ณต์ œ๋ณธ ๊ตฌ์„ฑ์— 12๊ฐœ์˜ PostgreSQL ์ƒค๋“œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„๋Š” Network Load Balancer๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์•ก์„ธ์Šคํ–ˆ์œผ๋ฉฐ ๊ทธ ๋’ค์—๋Š” PgBouncer๊ฐ€ ์žˆ๋Š” ๋‘ ๊ฐœ์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ์žˆ์—ˆ๊ณ  ๊ทธ ๋’ค์—๋Š” ๋ชจ๋“  PostgreSQL ์„œ๋ฒ„๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
์žฅ์•  ์กฐ์น˜ ํด๋Ÿฌ์Šคํ„ฐ PostgreSQL + Patroni. ๊ตฌํ˜„ ๊ฒฝํ—˜

Patroni๋ฅผ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด ๋ถ„์‚ฐ ์Šคํ† ๋ฆฌ์ง€ ํด๋Ÿฌ์Šคํ„ฐ ๊ตฌ์„ฑ์„ ์„ ํƒํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. Patroni๋Š” etcd, Zookeeper, Consul๊ณผ ๊ฐ™์€ ๋ถ„์‚ฐ ๊ตฌ์„ฑ ์Šคํ† ๋ฆฌ์ง€ ์‹œ์Šคํ…œ๊ณผ ํ•จ๊ป˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” Vault์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋Š” ๋ณธ๊ฒฉ์ ์ธ Consul ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์‹œ์žฅ์— ๋ณด์œ ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ๋” ์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜๋„๋œ ๋ชฉ์ ์— ๋งž๊ฒŒ Consul์„ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋Š” ์ข‹์€ ์ด์œ ์ž…๋‹ˆ๋‹ค.

Patroni๊ฐ€ Consul๊ณผ ํ˜‘๋ ฅํ•˜๋Š” ๋ฐฉ์‹

์„ธ ๊ฐœ์˜ ๋…ธ๋“œ๋กœ ๊ตฌ์„ฑ๋œ Consul ํด๋Ÿฌ์Šคํ„ฐ์™€ ๋ฆฌ๋”์™€ ๋ณต์ œ๋ณธ์œผ๋กœ ๊ตฌ์„ฑ๋œ Patroni ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค(Patroni์—์„œ๋Š” ๋งˆ์Šคํ„ฐ๋ฅผ ํด๋Ÿฌ์Šคํ„ฐ ๋ฆฌ๋”๋ผ๊ณ  ํ•˜๊ณ  ์Šฌ๋ ˆ์ด๋ธŒ๋ฅผ ๋ณต์ œ๋ณธ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค). Patroni ํด๋Ÿฌ์Šคํ„ฐ์˜ ๊ฐ ์ธ์Šคํ„ด์Šค๋Š” ์ง€์†์ ์œผ๋กœ ํด๋Ÿฌ์Šคํ„ฐ ์ƒํƒœ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ Consul์— ๋ณด๋ƒ…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Consul์—์„œ Patroni ํด๋Ÿฌ์Šคํ„ฐ์˜ ํ˜„์žฌ ๊ตฌ์„ฑ๊ณผ ํ˜„์žฌ ๋ฆฌ๋”๊ฐ€ ๋ˆ„๊ตฌ์ธ์ง€ ํ•ญ์ƒ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์žฅ์•  ์กฐ์น˜ ํด๋Ÿฌ์Šคํ„ฐ PostgreSQL + Patroni. ๊ตฌํ˜„ ๊ฒฝํ—˜

Patroni๋ฅผ Consul์— ์—ฐ๊ฒฐํ•˜๋ ค๋ฉด Consul๊ณผ์˜ ์ž‘์—… ๋ฐฉ์‹ ๋ฐ ์„ ํƒ์ ์œผ๋กœ ์—ฐ๊ฒฐ ์ฒด๊ณ„์— ๋”ฐ๋ผ http ๋˜๋Š” https ํ˜•์‹์œผ๋กœ ํ˜ธ์ŠคํŠธ๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ์—ฐ๊ตฌํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

host: the host:port for the Consul endpoint, in format: http(s)://host:port
scheme: (optional) http or https, defaults to http

๊ฐ„๋‹จํ•ด ๋ณด์ด์ง€๋งŒ ์—ฌ๊ธฐ์„œ ํ•จ์ •์ด ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. Consul์„ ์‚ฌ์šฉํ•˜์—ฌ https๋ฅผ ํ†ตํ•œ ๋ณด์•ˆ ์—ฐ๊ฒฐ์„ ํ†ตํ•ด ์ž‘์—…ํ•˜๊ณ  ์—ฐ๊ฒฐ ๊ตฌ์„ฑ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

consul:
  host: https://server.production.consul:8080 
  verify: true
  cacert: {{ consul_cacert }}
  cert: {{ consul_cert }}
  key: {{ consul_key }}

๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‹œ์ž‘ ์‹œ Patroni๋Š” Consul์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์–ด์จŒ๋“  http๋ฅผ ํ†ตํ•ด ์ด๋™ํ•˜๋ ค๊ณ  ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

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

consul:
  host: server.production.consul:8080
  scheme: https
  verify: true
  cacert: {{ consul_cacert }}
  cert: {{ consul_cert }}
  key: {{ consul_key }}

์˜์‚ฌ ํ…œํ”Œ๋ฆฟ

๋”ฐ๋ผ์„œ ๊ตฌ์„ฑ์„ ์œ„ํ•œ ์Šคํ† ๋ฆฌ์ง€๋ฅผ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ Patroni ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ๋ฆฌ๋”๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ PgBouncer๊ฐ€ ๊ตฌ์„ฑ์„ ์ „ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ดํ•ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์„ค๋ช…์„œ์—๋Š” ์ด ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต๋ณ€์ด ์—†์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด. ์›์น™์ ์œผ๋กœ PgBouncer ์ž‘์—…์€ ์„ค๋ช…๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์†”๋ฃจ์…˜์„ ์ฐพ๊ธฐ ์œ„ํ•ด ์šฐ๋ฆฌ๋Š” ะกonsul-template์ด PgBouncer์™€ Patroni๋ฅผ ํŽ˜์–ด๋งํ•˜๋Š” ๋ฐ ๋งŽ์€ ๋„์›€์ด ๋˜์—ˆ๋‹ค๊ณ  ์“ฐ์—ฌ์ง„ ๊ธฐ์‚ฌ(๋ถˆํ–‰ํžˆ๋„ ์ œ๋ชฉ์ด ๊ธฐ์–ต๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค)๋ฅผ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด Consul-template์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์กฐ์‚ฌํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Consul-template์€ Consul์—์„œ PostgreSQL ํด๋Ÿฌ์Šคํ„ฐ์˜ ๊ตฌ์„ฑ์„ ์ง€์†์ ์œผ๋กœ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. ๋ฆฌ๋”๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด PgBouncer ๊ตฌ์„ฑ์„ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ๋‹ค์‹œ ๋กœ๋“œํ•˜๋ผ๋Š” ๋ช…๋ น์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.

์žฅ์•  ์กฐ์น˜ ํด๋Ÿฌ์Šคํ„ฐ PostgreSQL + Patroni. ๊ตฌํ˜„ ๊ฒฝํ—˜

ํ…œํ”Œ๋ฆฟ์˜ ํฐ ์žฅ์ ์€ ์ฝ”๋“œ๋กœ ์ €์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒˆ ์ƒค๋“œ๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ ์ƒˆ ์ปค๋ฐ‹์„ ๋งŒ๋“ค๊ณ  ํ…œํ”Œ๋ฆฟ์„ ์ž๋™์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ถฉ๋ถ„ํ•˜์—ฌ Infrastructure as Code ์›์น™์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

Patroni๋ฅผ ์‚ฌ์šฉํ•œ ์ƒˆ๋กœ์šด ์•„ํ‚คํ…์ฒ˜

๊ฒฐ๊ณผ์ ์œผ๋กœ ๋‹ค์Œ ์ž‘์—… ๊ณ„ํš์„ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค.
์žฅ์•  ์กฐ์น˜ ํด๋Ÿฌ์Šคํ„ฐ PostgreSQL + Patroni. ๊ตฌํ˜„ ๊ฒฝํ—˜

๋ชจ๋“  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„๊ฐ€ ๋ฐธ๋Ÿฐ์„œ์— ์•ก์„ธ์Šค โ†’ ๊ทธ ๋’ค์— ๋‘ ๊ฐœ์˜ PgBouncer ์ธ์Šคํ„ด์Šค๊ฐ€ ์žˆ์Œ โ†’ ๊ฐ ์ธ์Šคํ„ด์Šค์—์„œ ๊ฐ Patroni ํด๋Ÿฌ์Šคํ„ฐ์˜ ์ƒํƒœ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  ํ˜„์žฌ ๋ฆฌ๋”์—๊ฒŒ ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” PgBouncer ๊ตฌ์„ฑ์˜ ๊ด€๋ จ์„ฑ์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋Š” Consul ํ…œํ”Œ๋ฆฟ์ด ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. ๊ฐ ํด๋Ÿฌ์Šคํ„ฐ์˜.

์ˆ˜๋™ ํ…Œ์ŠคํŠธ

์†Œ๊ทœ๋ชจ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์—์„œ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ์ด ๊ตฌ์„ฑํ‘œ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์ž๋™ ์ „ํ™˜ ์ž‘๋™์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ๋ณด๋“œ๋ฅผ ์—ด๊ณ  ์Šคํ‹ฐ์ปค๋ฅผ ์˜ฎ๊ฒผ๊ณ  ๊ทธ ์ˆœ๊ฐ„ ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ฆฌ๋”๋ฅผ "์ฃฝ์˜€์Šต๋‹ˆ๋‹ค". AWS์—์„œ๋Š” ์ฝ˜์†”์„ ํ†ตํ•ด ์ธ์Šคํ„ด์Šค๋ฅผ ์ข…๋ฃŒํ•˜๋Š” ๊ฒƒ๋งŒํผ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

์žฅ์•  ์กฐ์น˜ ํด๋Ÿฌ์Šคํ„ฐ PostgreSQL + Patroni. ๊ตฌํ˜„ ๊ฒฝํ—˜

์Šคํ‹ฐ์ปค๋Š” 10-20์ดˆ ์ด๋‚ด์— ๋‹ค์‹œ ๋Œ์•„์˜ค๋”๋‹ˆ ๋‹ค์‹œ ์ •์ƒ์ ์œผ๋กœ ์›€์ง์ด๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” Patroni ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘๋™ํ–ˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋ฆฌ๋”๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  ์ •๋ณด๋ฅผ ะกonsul๋กœ ๋ณด๋ƒˆ์œผ๋ฉฐ ะกonsul-template์€ ์ฆ‰์‹œ ์ด ์ •๋ณด๋ฅผ ์„ ํƒํ•˜๊ณ  PgBouncer ๊ตฌ์„ฑ์„ ๊ต์ฒดํ•˜๊ณ  ๋‹ค์‹œ ๋กœ๋“œํ•˜๋ผ๋Š” ๋ช…๋ น์„ ๋ณด๋ƒˆ์Šต๋‹ˆ๋‹ค.

๋†’์€ ๋ถ€ํ•˜์—์„œ ์ƒ์กดํ•˜๊ณ  ๊ฐ€๋™ ์ค‘์ง€ ์‹œ๊ฐ„์„ ์ตœ์†Œํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

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

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

๋‘ ์ž‘์—… ๋ชจ๋‘ ์•ผ์‹ฌ์ฐจ๊ฒŒ ๋ณด์ด์ง€๋งŒ PostgreSQL 9.6์ด ์žˆ์Šต๋‹ˆ๋‹ค. 11.2๋กœ ์ฆ‰์‹œ ์—…๊ทธ๋ ˆ์ด๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

2๋‹จ๊ณ„๋กœ ์ง„ํ–‰ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋จผ์ € 11.2๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•œ ๋‹ค์Œ Patroni๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

PostgreSQL ์—…๋ฐ์ดํŠธ

PostgreSQL ๋ฒ„์ „์„ ๋น ๋ฅด๊ฒŒ ์—…๋ฐ์ดํŠธํ•˜๋ ค๋ฉด ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. -k, ํ•˜๋“œ ๋งํฌ๊ฐ€ ๋””์Šคํฌ์— ์ƒ์„ฑ๋˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์‚ฌํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. 300~400GB ๊ธฐ์ค€์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋ฐ 1์ดˆ๊ฐ€ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค.

์ƒค๋“œ๊ฐ€ ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— ์—…๋ฐ์ดํŠธ๋ฅผ ์ž๋™์œผ๋กœ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ์ „์ฒด ์—…๋ฐ์ดํŠธ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” Ansible ํ”Œ๋ ˆ์ด๋ถ์„ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

/usr/lib/postgresql/11/bin/pg_upgrade 
<b>--link </b>
--old-datadir='' --new-datadir='' 
 --old-bindir=''  --new-bindir='' 
 --old-options=' -c config_file=' 
 --new-options=' -c config_file='

์—ฌ๊ธฐ์„œ ์—…๊ทธ๋ ˆ์ด๋“œ๋ฅผ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ๋‹ค์Œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—…๊ทธ๋ ˆ์ด๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ์— ์œ ์˜ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. --ํ™•์ธํ•˜๋‹ค์—…๊ทธ๋ ˆ์ด๋“œํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์Šคํฌ๋ฆฝํŠธ๋Š” ์—…๊ทธ๋ ˆ์ด๋“œ ๊ธฐ๊ฐ„ ๋™์•ˆ ๊ตฌ์„ฑ์„ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ ์Šคํฌ๋ฆฝํŠธ๋Š” 30์ดˆ ๋งŒ์— ์™„๋ฃŒ๋˜์—ˆ์œผ๋ฉฐ ์ด๋Š” ํ›Œ๋ฅญํ•œ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค.

Patroni ์‹คํ–‰

๋‘ ๋ฒˆ์งธ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด Patroni ๊ตฌ์„ฑ์„ ์‚ดํŽด๋ณด์‹ญ์‹œ์˜ค. ๊ณต์‹ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์—๋Š” Patroni๋ฅผ ์ฒ˜์Œ ์‹œ์ž‘ํ•  ๋•Œ ์ƒˆ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ์—ญํ• ์„ ํ•˜๋Š” initdb๋ฅผ ์‚ฌ์šฉํ•œ ์˜ˆ์ œ ๊ตฌ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ธฐ์„ฑํ’ˆ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์ด๋ฏธ ์žˆ์œผ๋ฏ€๋กœ ๊ตฌ์„ฑ์—์„œ ์ด ์„น์…˜์„ ๊ฐ„๋‹จํžˆ ์ œ๊ฑฐํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฏธ ์กด์žฌํ•˜๋Š” PostgreSQL ํด๋Ÿฌ์Šคํ„ฐ์— Patroni๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์‹คํ–‰ํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์„ ๋•Œ ์ƒˆ๋กœ์šด ๋ฌธ์ œ์— ์ง๋ฉดํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‘ ์„œ๋ฒ„ ๋ชจ๋‘ ๋ฆฌ๋”๋กœ ์‹œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Patroni๋Š” ํด๋Ÿฌ์Šคํ„ฐ์˜ ์ดˆ๊ธฐ ์ƒํƒœ์— ๋Œ€ํ•ด ์•„๋ฌด๊ฒƒ๋„ ๋ชจ๋ฅด๊ณ  ๋‘ ์„œ๋ฒ„๋ฅผ ๋™์ผํ•œ ์ด๋ฆ„์„ ๊ฐ€์ง„ ๋‘ ๊ฐœ์˜ ๊ฐœ๋ณ„ ํด๋Ÿฌ์Šคํ„ฐ๋กœ ์‹œ์ž‘ํ•˜๋ ค๊ณ  ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ์Šฌ๋ ˆ์ด๋ธŒ์—์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š” ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์‚ญ์ œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

rm -rf /var/lib/postgresql/

์ด๊ฒƒ์€ ์Šฌ๋ ˆ์ด๋ธŒ์—์„œ๋งŒ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค!

ํด๋ฆฐ ๋ ˆํ”Œ๋ฆฌ์นด๊ฐ€ ์—ฐ๊ฒฐ๋˜๋ฉด ํŒจํŠธ๋กœ๋‹ˆ๋Š” ๋ฒ ์ด์Šค๋ฐฑ์—… ๋ฆฌ๋”๋ฅผ ๋งŒ๋“ค์–ด ๋ ˆํ”Œ๋ฆฌ์นด์— ๋ณต์›ํ•œ ํ›„ wallog์— ๋”ฐ๋ผ ํ˜„์žฌ ์ƒํƒœ๋ฅผ ๋”ฐ๋ผ์žก๋Š”๋‹ค.

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

๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ

๋ณด๋“œ์—์„œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜๋Š” ํ…Œ์ŠคํŠธ๋ฅผ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ถ€ํ•˜๊ฐ€ ์ผ์ผ ํ‰๊ท  ๊ฐ’์— ๋„๋‹ฌํ–ˆ์„ ๋•Œ ์ •ํ™•ํžˆ ๋™์ผํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ๋ฐ˜๋ณตํ•˜๊ณ  PostgreSQL ๋ฆฌ๋”๊ฐ€ ์žˆ๋Š” ์ธ์Šคํ„ด์Šค ํ•˜๋‚˜๋ฅผ ๋•๋‹ˆ๋‹ค. ์ž๋™ ์žฅ์•  ์กฐ์น˜๋Š” ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค. Patroni๋Š” ๋ฆฌ๋”๋ฅผ ๋ณ€๊ฒฝํ–ˆ๊ณ  Consul-template์€ PgBouncer ๊ตฌ์„ฑ์„ ์—…๋ฐ์ดํŠธํ–ˆ์œผ๋ฉฐ ๋‹ค์‹œ ๋กœ๋“œํ•˜๋ผ๋Š” ๋ช…๋ น์„ ๋ณด๋ƒˆ์Šต๋‹ˆ๋‹ค. Grafana์˜ ๊ทธ๋ž˜ํ”„์— ๋”ฐ๋ฅด๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ๊ณผ ๊ด€๋ จ๋œ ์„œ๋ฒ„์—์„œ 20-30์ดˆ์˜ ์ง€์—ฐ๊ณผ ์•ฝ๊ฐ„์˜ ์˜ค๋ฅ˜๊ฐ€ ์žˆ์Œ์ด ๋ถ„๋ช…ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ •์ƒ์ ์ธ ์ƒํ™ฉ์ด๋ฉฐ ์ด๋Ÿฌํ•œ ๊ฐ’์€ ์žฅ์•  ์กฐ์น˜์— ํ—ˆ์šฉ๋˜๋ฉฐ ์„œ๋น„์Šค ์ค‘๋‹จ ์‹œ๊ฐ„๋ณด๋‹ค ํ™•์‹คํžˆ ๋‚ซ์Šต๋‹ˆ๋‹ค.

Patroni๋ฅผ ํ”„๋กœ๋•์…˜์œผ๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ

๊ทธ ๊ฒฐ๊ณผ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ณ„ํš์„ ์„ธ์› ์Šต๋‹ˆ๋‹ค.

  • Consul-template์„ PgBouncer ์„œ๋ฒ„์— ๋ฐฐํฌํ•˜๊ณ  ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฒ„์ „ 11.2๋กœ PostgreSQL ์—…๋ฐ์ดํŠธ;
  • ํด๋Ÿฌ์Šคํ„ฐ์˜ ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•˜์‹ญ์‹œ์˜ค.
  • Patroni ํด๋Ÿฌ์Šคํ„ฐ ์‹œ์ž‘.

๋™์‹œ์— ์šฐ๋ฆฌ์˜ ์ฒด๊ณ„๋ฅผ ํ†ตํ•ด ๊ฑฐ์˜ ์–ธ์ œ๋“ ์ง€ ์ฒซ ๋ฒˆ์งธ ์š”์ ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ž‘์—…์—์„œ ๊ฐ PgBouncer๋ฅผ ์ฐจ๋ก€๋กœ ์ œ๊ฑฐํ•˜๊ณ  consul-template์„ ๋ฐฐํฌํ•˜๊ณ  ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ํ–ˆ๋‹ค.

๋น ๋ฅธ ๋ฐฐํฌ๋ฅผ ์œ„ํ•ด ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์—์„œ ๋ชจ๋“  ํ”Œ๋ ˆ์ด๋ถ์„ ์ด๋ฏธ ํ…Œ์ŠคํŠธํ–ˆ์œผ๋ฉฐ ์ „์ฒด ์Šคํฌ๋ฆฝํŠธ์˜ ์‹คํ–‰ ์‹œ๊ฐ„์ด ๊ฐ ์ƒค๋“œ์— ๋Œ€ํ•ด 1,5~2๋ถ„์ด์—ˆ๊ธฐ ๋•Œ๋ฌธ์— Ansible์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ์„œ๋น„์Šค๋ฅผ ์ค‘๋‹จํ•˜์ง€ ์•Š๊ณ  ๊ฐ ์ƒค๋“œ์— ์ฐจ๋ก€๋กœ ๋ชจ๋“  ๊ฒƒ์„ ๋กค์•„์›ƒํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ฐ PostgreSQL์„ ๋ช‡ ๋ถ„ ๋™์•ˆ ๊บผ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์ด ์ƒค๋“œ์— ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š” ์‚ฌ์šฉ์ž๋Š” ํ˜„์žฌ ์™„์ „ํžˆ ์ž‘๋™ํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ์ด๋Š” ํ—ˆ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

์šฐ๋ฆฌ๋Š” ์„œ๋น„์Šค๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ–ˆ๊ณ  ๋ชจ๋“  ๊ฒƒ์ด ์ œ๋Œ€๋กœ ์ž‘๋™ํ–ˆ๊ณ  ์‚ฌ์šฉ์ž๋Š” ๊ณ„์† ์ž‘๋™ํ–ˆ์ง€๋งŒ ๊ทธ๋ž˜ํ”„์—์„œ Consul ์„œ๋ฒ„์— ๋น„์ •์ƒ์ ์œผ๋กœ ๋†’์€ ๋ถ€ํ•˜๊ฐ€ ์žˆ์Œ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.
์žฅ์•  ์กฐ์น˜ ํด๋Ÿฌ์Šคํ„ฐ PostgreSQL + Patroni. ๊ตฌํ˜„ ๊ฒฝํ—˜

ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์—์„œ ์ด๊ฒƒ์„ ๋ณด์ง€ ๋ชปํ•œ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ด ๋ฌธ์ œ๋Š” Infrastructure as Code ์›์น™์„ ๋”ฐ๋ฅด๊ณ  ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์—์„œ ํ”„๋กœ๋•์…˜์— ์ด๋ฅด๊ธฐ๊นŒ์ง€ ์ „์ฒด ์ธํ”„๋ผ๋ฅผ ๊ฐœ์„ ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์ž˜ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์šฐ๋ฆฌ๊ฐ€ ๊ฐ€์ง„ ๋ฌธ์ œ๋ฅผ ์–ป๋Š” ๊ฒƒ์ด ๋งค์šฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. ๋ฌด์Šจ ์ผ์ด์—์š”? Consul์€ ํ”„๋กœ๋•์…˜์— ์ฒ˜์Œ ๋“ฑ์žฅํ•œ ๋‹ค์Œ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์— ๋‚˜ํƒ€ ๋‚ฌ์œผ๋ฉฐ ๊ฒฐ๊ณผ์ ์œผ๋กœ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์—์„œ Consul ๋ฒ„์ „์ด ํ”„๋กœ๋•์…˜๋ณด๋‹ค ๋†’์•˜์Šต๋‹ˆ๋‹ค. ๋ฆด๋ฆฌ์Šค ์ค‘ ํ•˜๋‚˜์—์„œ consul-template์œผ๋กœ ์ž‘์—…ํ•  ๋•Œ CPU ๋ˆ„์ˆ˜๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐ„๋‹จํžˆ Consul์„ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

Patroni ํด๋Ÿฌ์Šคํ„ฐ ๋‹ค์‹œ ์‹œ์ž‘

๊ทธ๋Ÿฌ๋‚˜ ์˜์‹ฌ์กฐ์ฐจ ํ•˜์ง€ ์•Š์•˜๋˜ ์ƒˆ๋กœ์šด ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค. Consul์„ ์—…๋ฐ์ดํŠธํ•  ๋•Œ consul leave ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ Consul ๋…ธ๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. โ†’ Patroni๊ฐ€ ๋‹ค๋ฅธ Consul ์„œ๋ฒ„์— ์—ฐ๊ฒฐ โ†’ ๋ชจ๋“  ๊ฒƒ์ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Consul ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋งˆ์ง€๋ง‰ ์ธ์Šคํ„ด์Šค์— ๋„๋‹ฌํ•˜์—ฌ consul leave ๋ช…๋ น์„ ๋ณด๋ƒˆ์„ ๋•Œ ๋ชจ๋“  Patroni ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ๋‹ค์‹œ ์‹œ์ž‘๋˜์—ˆ๊ณ  ๋กœ๊ทธ์— ๋‹ค์Œ ์˜ค๋ฅ˜๊ฐ€ ํ‘œ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

ERROR: get_cluster
Traceback (most recent call last):
...
RetryFailedError: 'Exceeded retry deadline'
ERROR: Error communicating with DCS
<b>LOG: database system is shut down</b>

Patroni ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ํ•ด๋‹น ํด๋Ÿฌ์Šคํ„ฐ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์—†์–ด ๋‹ค์‹œ ์‹œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ๊ธฐ ์œ„ํ•ด github์˜ ๋ฌธ์ œ๋ฅผ ํ†ตํ•ด Patroni ์ž‘์„ฑ์ž์—๊ฒŒ ์—ฐ๋ฝํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ตฌ์„ฑ ํŒŒ์ผ์— ๋Œ€ํ•œ ๊ฐœ์„  ์‚ฌํ•ญ์„ ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค.

consul:
 consul.checks: []
bootstrap:
 dcs:
   retry_timeout: 8

์šฐ๋ฆฌ๋Š” ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์—์„œ ๋ฌธ์ œ๋ฅผ ์žฌํ˜„ํ•  ์ˆ˜ ์žˆ์—ˆ๊ณ  ๊ทธ๊ณณ์—์„œ ์ด๋Ÿฌํ•œ ์˜ต์…˜์„ ํ…Œ์ŠคํŠธํ–ˆ์ง€๋งŒ ์•ˆํƒ€๊น๊ฒŒ๋„ ์ž‘๋™ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ๋Š” ์—ฌ์ „ํžˆ ๋ฏธํ•ด๊ฒฐ ์ƒํƒœ๋กœ ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ์†”๋ฃจ์…˜์„ ์‹œ๋„ํ•  ๊ณ„ํš์ž…๋‹ˆ๋‹ค.

  • ๊ฐ Patroni ํด๋Ÿฌ์Šคํ„ฐ ์ธ์Šคํ„ด์Šค์—์„œ Consul-agent๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.
  • ์ฝ”๋“œ์—์„œ ๋ฌธ์ œ๋ฅผ ์ˆ˜์ •ํ•˜์‹ญ์‹œ์˜ค.

์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ ์œ„์น˜๋ฅผ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ์•„๋งˆ๋„ ๊ตฌ์„ฑ ํŒŒ์ผ์„ ํ†ตํ•ด ์žฌ์ •์˜๋˜์ง€ ์•Š์€ ๊ธฐ๋ณธ ์‹œ๊ฐ„ ์ดˆ๊ณผ ์‚ฌ์šฉ ๋•Œ๋ฌธ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰ Consul ์„œ๋ฒ„๊ฐ€ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์ œ๊ฑฐ๋˜๋ฉด ์ „์ฒด Consul ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ XNUMX์ดˆ ์ด์ƒ ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด Patroni๋Š” ํด๋Ÿฌ์Šคํ„ฐ์˜ ์ƒํƒœ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์—†์œผ๋ฉฐ ์ „์ฒด ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์™„์ „ํžˆ ๋‹ค์‹œ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

๋‹คํ–‰ํžˆ ๋” ์ด์ƒ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

Patroni ์‚ฌ์šฉ ๊ฒฐ๊ณผ

Patroni๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ์ถœ์‹œํ•œ ํ›„ ๊ฐ ํด๋Ÿฌ์Šคํ„ฐ์— ์ถ”๊ฐ€ ๋ณต์ œ๋ณธ์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ๊ฐ ํด๋Ÿฌ์Šคํ„ฐ์—๋Š” ์ „ํ™˜ ์‹œ ์Šคํ”Œ๋ฆฟ ๋ธŒ๋ ˆ์ธ์˜ ๊ฒฝ์šฐ ์•ˆ์ „๋ง์„ ์œ„ํ•œ ํ•˜๋‚˜์˜ ๋ฆฌ๋”์™€ ๋‘ ๊ฐœ์˜ ๋ณต์ œ๋ณธ๊ณผ ๊ฐ™์€ ์ฟผ๋Ÿผ๊ณผ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.
์žฅ์•  ์กฐ์น˜ ํด๋Ÿฌ์Šคํ„ฐ PostgreSQL + Patroni. ๊ตฌํ˜„ ๊ฒฝํ—˜

Patroni๋Š” XNUMX๊ฐœ์›” ์ด์ƒ ํ”„๋กœ๋•์…˜ ์ž‘์—…์„ ์ง„ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ๊ฐ„ ๋™์•ˆ ๊ทธ๋Š” ์ด๋ฏธ ์šฐ๋ฆฌ๋ฅผ ๋„์™€์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ์ตœ๊ทผ ํด๋Ÿฌ์Šคํ„ฐ ์ค‘ ํ•˜๋‚˜์˜ ๋ฆฌ๋”๊ฐ€ AWS์—์„œ ์‚ฌ๋งํ–ˆ๊ณ  ์ž๋™ ์žฅ์•  ์กฐ์น˜๊ฐ€ ์ž‘๋™ํ–ˆ์œผ๋ฉฐ ์‚ฌ์šฉ์ž๋Š” ๊ณ„์† ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค. Patroni๋Š” ์ฃผ์š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

Patroni ์‚ฌ์šฉ์— ๋Œ€ํ•œ ๊ฐ„๋žตํ•œ ์š”์•ฝ:

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

์ถœ์ฒ˜ : habr.com

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