Kubernetes์šฉ PostgreSQL ๋ฌธ์— ๋Œ€ํ•œ ๊ฐ„๋žตํ•œ ๊ฐœ์š”, ์šฐ๋ฆฌ์˜ ์„ ํƒ ๋ฐ ๊ฒฝํ—˜

Kubernetes์šฉ PostgreSQL ๋ฌธ์— ๋Œ€ํ•œ ๊ฐ„๋žตํ•œ ๊ฐœ์š”, ์šฐ๋ฆฌ์˜ ์„ ํƒ ๋ฐ ๊ฒฝํ—˜

๊ณ ๊ฐ์œผ๋กœ๋ถ€ํ„ฐ ์ด๋Ÿฌํ•œ ์š”์ฒญ์„ ์ ์  ๋” ๋งŽ์ด ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. "์šฐ๋ฆฌ๋Š” Amazon RDS์™€ ๋น„์Šทํ•˜์ง€๋งŒ ๋” ์ €๋ ดํ•˜๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค." "์šฐ๋ฆฌ๋Š” RDS์ฒ˜๋Ÿผ ๋ชจ๋“  ์ธํ”„๋ผ์—์„œ ์–ด๋””์„œ๋‚˜ ์ด๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค." Kubernetes์—์„œ ์ด๋Ÿฌํ•œ ๊ด€๋ฆฌํ˜• ์†”๋ฃจ์…˜์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์šฐ๋ฆฌ๋Š” PostgreSQL์—์„œ ๊ฐ€์žฅ ์ธ๊ธฐ ์žˆ๋Š” ์—ฐ์‚ฐ์ž(Stolon, Crunchy Data ๋ฐ Zalando์˜ ์—ฐ์‚ฐ์ž)์˜ ํ˜„์žฌ ์ƒํƒœ๋ฅผ ์‚ดํŽด๋ณด๊ณ  ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ธฐ์‚ฌ๋Š” ์ด๋ก ์  ๊ด€์ (์†”๋ฃจ์…˜ ๊ฒ€ํ† )๊ณผ ์‹ค์ œ ๊ด€์ (๋ฌด์—‡์„ ์„ ํƒํ–ˆ๊ณ  ๊ฒฐ๊ณผ๋Š” ๋ฌด์—‡์ธ์ง€)์—์„œ ์šฐ๋ฆฌ๊ฐ€ ๊ฒฝํ—˜ํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋จผ์ € RDS๋ฅผ ์ž ์žฌ์ ์œผ๋กœ ๋Œ€์ฒดํ•˜๊ธฐ ์œ„ํ•œ ์ผ๋ฐ˜์ ์ธ ์š”๊ตฌ ์‚ฌํ•ญ์ด ๋ฌด์—‡์ธ์ง€ ์ •์˜ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

RDS ๋ž€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์‚ฌ๋žŒ๋“ค์ด RDS์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•  ๋•Œ ์šฐ๋ฆฌ ๊ฒฝํ—˜์— ๋”ฐ๋ฅด๋ฉด ์ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ด€๋ฆฌํ˜• DBMS ์„œ๋น„์Šค๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

  1. ์„ค์ •์ด ์‰ฝ์Šต๋‹ˆ๋‹ค.
  2. ์Šค๋ƒ…์ƒท์œผ๋กœ ์ž‘์—…ํ•˜๊ณ  ์Šค๋ƒ…์ƒท์—์„œ ๋ณต๊ตฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค(๋ฐ”๋žŒ์งํ•˜๊ฒŒ๋Š” PITR);
  3. ๋งˆ์Šคํ„ฐ-์Šฌ๋ ˆ์ด๋ธŒ ํ† ํด๋กœ์ง€๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  4. ํ’๋ถ€ํ•œ ํ™•์žฅ ๊ธฐ๋Šฅ ๋ชฉ๋ก์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  5. ๊ฐ์‚ฌ ๋ฐ ์‚ฌ์šฉ์ž/์•ก์„ธ์Šค ๊ด€๋ฆฌ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ์ž‘์—… ๊ตฌํ˜„์— ๋Œ€ํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์€ ๋งค์šฐ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์ง€๋งŒ ์กฐ๊ฑด๋ถ€ Ansible์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ๋กœ๋Š” ์šฐ๋ฆฌ์—๊ฒŒ ๊ฐ€๊น์ง€ ์•Š์Šต๋‹ˆ๋‹ค. (2GIS์˜ ๋™๋ฃŒ๋“ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๋กœ ๋น„์Šทํ•œ ๊ฒฐ๋ก ์— ๋„๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ์˜ ์‹œ๋„ "Postgres ๊ธฐ๋ฐ˜ ์žฅ์•  ์กฐ์น˜ ํด๋Ÿฌ์Šคํ„ฐ ๋น ๋ฅธ ๋ฐฐํฌ ๋„๊ตฌ"๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.)

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

NB: ๊ฐ„๋‹จํ•œ ์—ฐ์‚ฐ์ž๋ฅผ ๋น ๋ฅด๊ฒŒ ์ƒ์„ฑํ•˜๋ ค๋ฉด ์˜คํ”ˆ ์†Œ์Šค ์œ ํ‹ธ๋ฆฌํ‹ฐ์— ์ฃผ์˜ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์‰˜ ์—ฐ์‚ฐ์ž. ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Go์— ๋Œ€ํ•œ ์ง€์‹ ์—†์ด๋„ Bash, Python ๋“ฑ ์‹œ์Šคํ…œ ๊ด€๋ฆฌ์ž์—๊ฒŒ ๋” ์นœ์ˆ™ํ•œ ๋ฐฉ์‹์œผ๋กœ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

PostgreSQL์—๋Š” ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” K8s ์—ฐ์‚ฐ์ž๊ฐ€ ๋ช‡ ๊ฐ€์ง€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์Šคํ†จ๋ก ;
  • ๋ฐ”์‚ญ๋ฐ”์‚ญํ•œ ๋ฐ์ดํ„ฐ PostgreSQL ์šด์˜์ž;
  • Zalando Postgres ์šด์˜์ž.

์ข€ ๋” ์ž์„ธํžˆ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์šด์˜์ž ์„ ํƒ

์œ„์—์„œ ์ด๋ฏธ ์–ธ๊ธ‰ํ•œ ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ ์™ธ์—๋„ Kubernetes์˜ ์ธํ”„๋ผ ์—”์ง€๋‹ˆ์–ด๋กœ์„œ ์šฐ๋ฆฌ๋Š” ์šด์˜์ž๋กœ๋ถ€ํ„ฐ ๋‹ค์Œ์„ ๊ธฐ๋Œ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

  • Git์—์„œ ๋ฐฐํฌ ๋ฐ ๋งž์ถคํ˜• ๋ฆฌ์†Œ์Šค;
  • ํฌ๋“œ ๋ฐ˜์นœํ™”์„ฑ ์ง€์›;
  • ๋…ธ๋“œ ์„ ํ˜ธ๋„ ๋˜๋Š” ๋…ธ๋“œ ์„ ํƒ๊ธฐ ์„ค์น˜
  • ๊ณต์ฐจ ์„ค์ •;
  • ํŠœ๋‹ ๊ธฐ๋Šฅ์˜ ๊ฐ€์šฉ์„ฑ;
  • ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ์ˆ , ์‹ฌ์ง€์–ด ๋ช…๋ น๊นŒ์ง€.

๊ฐ ์š”์ ์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์„ค๋ช…ํ•˜์ง€ ์•Š๊ณ (์ „์ฒด ๊ธฐ์‚ฌ๋ฅผ ์ฝ์€ ํ›„์—๋„ ์—ฌ์ „ํžˆ ์งˆ๋ฌธ์ด ์žˆ์œผ๋ฉด ์˜๊ฒฌ์— ์งˆ๋ฌธํ•˜์‹ญ์‹œ์˜ค) ์ผ๋ฐ˜์ ์œผ๋กœ ํด๋Ÿฌ์Šคํ„ฐ ๋…ธ๋“œ์˜ ์ „๋ฌธํ™”์— ๋Œ€ํ•œ๋ณด๋‹ค ๋ฏธ๋ฌ˜ํ•œ ์„ค๋ช…์„ ์œ„ํ•ด ์ด๋Ÿฌํ•œ ๋งค๊ฐœ ๋ณ€์ˆ˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ์ ์— ์œ ์˜ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŠน์ • ์šฉ๋„๋ฅผ ์œ„ํ•ด ์ฃผ๋ฌธํ•˜์‹ญ์‹œ์˜ค. ์ด๋ฅผ ํ†ตํ•ด ์„ฑ๋Šฅ๊ณผ ๋น„์šฉ ๊ฐ„์˜ ์ตœ์ ์˜ ๊ท ํ˜•์„ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ PostgreSQL ์šด์˜์ž ์ž์‹ ์—๊ฒŒ.

1. ์Šคํ†จ๋ก 

์Šคํ†จ๋ก  ์ดํƒˆ๋ฆฌ์•„ ํšŒ์‚ฌ์ธ Sorint.lab์—์„œ ์ด๋ฏธ ์–ธ๊ธ‰๋œ ๋ณด๊ณ ์„œ DBMS ์šด์˜์ž๋“ค ์‚ฌ์ด์—์„œ๋Š” ์ผ์ข…์˜ ํ‘œ์ค€์œผ๋กœ ์—ฌ๊ฒจ์กŒ๋‹ค. ์ด๊ฒƒ์€ ์ƒ๋‹นํžˆ ์˜ค๋ž˜๋œ ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ๊ณต๊ฐœ ๋ฆด๋ฆฌ์Šค๋Š” 2015๋…„ 3000์›”(!)์— ์ด๋ฃจ์–ด์กŒ์œผ๋ฉฐ GitHub ์ €์žฅ์†Œ๋Š” ๊ฑฐ์˜ 40๋ช…์˜ ๋ณ„๊ณผ XNUMX๋ช… ์ด์ƒ์˜ ๊ธฐ์—ฌ์ž๋ฅผ ์ž๋ž‘ํ•ฉ๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ Stolon์€ ์‚ฌ๋ ค ๊นŠ์€ ์•„ํ‚คํ…์ฒ˜์˜ ํ›Œ๋ฅญํ•œ ์˜ˆ์ž…๋‹ˆ๋‹ค.

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

๊ทธ๋Ÿฌ๋‚˜ ์Šคํ†จ๋ก ์€ ์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์†Œ์Šค ์—†์Œ, ์ด๋Š” Kubernetes์—์„œ DBMS ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด "๋ถˆํƒ€์˜ค๋ฅด๋Š” ์ผ€์ดํฌ์ฒ˜๋Ÿผ" ์‰ฝ๊ณ  ๋น ๋ฅธ ๋ฐฉ์‹์œผ๋กœ ๋ฐฐํฌํ•  ์ˆ˜ ์—†๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค. ๊ด€๋ฆฌ๋Š” ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ํ†ตํ•ด ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. stolonctl, ๋ฐฐํฌ - Helm ์ฐจํŠธ๋ฅผ ํ†ตํ•ด, ์‚ฌ์šฉ์ž ์ •์˜ ํ•ญ๋ชฉ์€ ConfigMap์— ์ •์˜๋ฉ๋‹ˆ๋‹ค.

ํ•œํŽธ์œผ๋กœ๋Š” ์—ฐ์‚ฐ์ž๊ฐ€ ์‹ค์ œ๋กœ๋Š” ์—ฐ์‚ฐ์ž๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์ด ๋ฐํ˜€์กŒ์Šต๋‹ˆ๋‹ค(CRD๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค). ํ•˜์ง€๋งŒ ํ•œํŽธ์œผ๋กœ๋Š” K8s์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ์›ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์—ฐํ•œ ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค.

์š”์•ฝํ•˜์ž๋ฉด, ๊ฐœ์ธ์ ์œผ๋กœ ๊ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋Œ€ํ•ด ๋ณ„๋„์˜ ์ฐจํŠธ๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ ์•„๋‹Œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ๋Œ€์•ˆ์„ ์ฐพ๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

2. ๋ฐ”์‚ญ๋ฐ”์‚ญํ•œ ๋ฐ์ดํ„ฐ PostgreSQL ์—ฐ์‚ฐ์ž

Crunchy Data์˜ ์—ฐ์‚ฐ์ž๋ฏธ๊ตญ์˜ ์ Š์€ ์Šคํƒ€ํŠธ์—…์ธ ๋Š” ๋…ผ๋ฆฌ์ ์ธ ๋Œ€์•ˆ์ฒ˜๋Ÿผ ๋ณด์˜€์Šต๋‹ˆ๋‹ค. ๊ณต๊ฐœ ์—ญ์‚ฌ๋Š” 2017๋…„ 1300์›” ์ฒซ ๋ฒˆ์งธ ๋ฆด๋ฆฌ์Šค๋ถ€ํ„ฐ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. ์ดํ›„ GitHub ์ €์žฅ์†Œ๋Š” 50๊ฐœ ๋ฏธ๋งŒ์˜ ๋ณ„๊ณผ 1.15๋ช… ์ด์ƒ์˜ ๊ธฐ์—ฌ์ž๋ฅผ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. 1.18์›”์˜ ์ตœ์‹  ๋ฆด๋ฆฌ์Šค๋Š” Kubernetes 3.11-4.4, OpenShift 1.3+ ๋ฐ XNUMX+, GKE ๋ฐ VMware Enterprise PKS XNUMX+์—์„œ ์ž‘๋™ํ•˜๋„๋ก ํ…Œ์ŠคํŠธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Crunchy Data PostgreSQL Operator ์•„ํ‚คํ…์ฒ˜๋Š” ๋ช…์‹œ๋œ ์š”๊ตฌ ์‚ฌํ•ญ๋„ ์ถฉ์กฑํ•ฉ๋‹ˆ๋‹ค.

Kubernetes์šฉ PostgreSQL ๋ฌธ์— ๋Œ€ํ•œ ๊ฐ„๋žตํ•œ ๊ฐœ์š”, ์šฐ๋ฆฌ์˜ ์„ ํƒ ๋ฐ ๊ฒฝํ—˜

๊ด€๋ฆฌ๋Š” ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. pgo๊ทธ๋Ÿฌ๋‚˜ Kubernetes์šฉ ์‚ฌ์šฉ์ž ์ง€์ • ๋ฆฌ์†Œ์Šค๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์šด์˜์ž๋Š” ์šฐ๋ฆฌ๋ฅผ ์ž ์žฌ์  ์‚ฌ์šฉ์ž๋กœ ๊ธฐ์˜๊ฒŒ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

  • CRD๋ฅผ ํ†ตํ•œ ์ œ์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํŽธ๋ฆฌํ•œ ์‚ฌ์šฉ์ž ๊ด€๋ฆฌ(CRD๋ฅผ ํ†ตํ•ด์„œ๋„ ๊ฐ€๋Šฅ)
  • ๋‹ค๋ฅธ ๊ตฌ์„ฑ์š”์†Œ์™€์˜ ํ†ตํ•ฉ ํฌ๋Ÿฐ์น˜ ๋ฐ์ดํ„ฐ ์ปจํ…Œ์ด๋„ˆ ์ œํ’ˆ๊ตฐ - PostgreSQL์šฉ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€ ๋ฐ ์ด๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์œ ํ‹ธ๋ฆฌํ‹ฐ(pgBackRest, pgAudit, contrib์˜ ํ™•์žฅ ๋“ฑ ํฌํ•จ)์˜ ํŠน์ˆ˜ ์ปฌ๋ ‰์…˜์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ Crunchy Data์—์„œ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜๋ฉด ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ๋“œ๋Ÿฌ๋‚ฌ์Šต๋‹ˆ๋‹ค.

  • ํ—ˆ์šฉ ๊ฐ€๋Šฅ์„ฑ์€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. nodeSelector๋งŒ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.
  • ์ƒ์„ฑ๋œ ํฌ๋“œ๋Š” ์ƒํƒœ ์ €์žฅ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•˜๊ณ  ์žˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋ฐฐํฌ์˜ ์ผ๋ถ€์˜€์Šต๋‹ˆ๋‹ค. StatefulSet์™€ ๋‹ฌ๋ฆฌ ๋ฐฐํฌ๋Š” ๋””์Šคํฌ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

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

์ด ์˜คํผ๋ ˆ์ดํ„ฐ์˜ ๋˜ ๋‹ค๋ฅธ ํŠน์ง•์€ ๋‹ค์–‘ํ•œ ๋ณด์กฐ ์‹œ์Šคํ…œ๊ณผ์˜ ์‚ฌ์ „ ํ†ตํ•ฉ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด pgAdmin๊ณผ pgBounce๋ฅผ ์„ค์น˜ํ•˜๋Š” ๊ฒƒ์€ ์‰ฝ์Šต๋‹ˆ๋‹ค. ์„ ์  ์„œ๋ฅ˜ ๋น„์น˜ ์‚ฌ์ „ ๊ตฌ์„ฑ๋œ Grafana ๋ฐ Prometheus๊ฐ€ ๊ณ ๋ ค๋ฉ๋‹ˆ๋‹ค. ์ตœ๊ทผ์—๋Š” ๋ฆด๋ฆฌ์Šค 4.5.0-beta1 ๋ณ„๋„๋กœ ์–ธ๊ธ‰๋œ ํ”„๋กœ์ ํŠธ์™€์˜ ํ–ฅ์ƒ๋œ ํ†ตํ•ฉ pg๋ชจ๋‹ˆํ„ฐ, ๋•๋ถ„์— ์šด์˜์ž๋Š” ์ฆ‰์‹œ PgSQL ๋ฉ”ํŠธ๋ฆญ์˜ ์‹œ๊ฐ์  ์‹œ๊ฐํ™”๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ Kubernetes ์ƒ์„ฑ ๋ฆฌ์†Œ์Šค์˜ ์ด์ƒํ•œ ์„ ํƒ์œผ๋กœ ์ธํ•ด ์šฐ๋ฆฌ๋Š” ๋‹ค๋ฅธ ์†”๋ฃจ์…˜์„ ์ฐพ์•„์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

3. Zalando Postgres ์šด์˜์ž

Zalando ์ œํ’ˆ์€ ์˜ค๋žซ๋™์•ˆ ์šฐ๋ฆฌ์—๊ฒŒ ์•Œ๋ ค์ ธ ์™”์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” Zalenium์„ ์‚ฌ์šฉํ•œ ๊ฒฝํ—˜์ด ์žˆ์œผ๋ฉฐ ๋ฌผ๋ก  ๋‹ค์Œ์„ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค. ํŒจํŠธ๋กœ๋‹ˆ PostgreSQL์šฉ์œผ๋กœ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” HA ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค. ํšŒ์‚ฌ์˜ ์ฐฝ์ž‘ ์ ‘๊ทผ ๋ฐฉ์‹์— ๋Œ€ํ•ด ํฌ์ŠคํŠธ๊ทธ๋ ˆ์Šค ์—ฐ์‚ฐ์ž ์ž‘๊ฐ€ ์ค‘ ํ•œ ๋ช…์ธ Alexei Klyukin์ด ๋ฐฉ์†ก์—์„œ ๋งํ–ˆ์Šต๋‹ˆ๋‹ค. ํฌ์ŠคํŠธ๊ทธ๋ ˆ์Šค-ํ™”์š”์ผ #5์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ์ข‹์•„ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๋Š” ๊ธฐ์‚ฌ์—์„œ ๋…ผ์˜๋œ ๊ฐ€์žฅ ์ตœ๊ทผ์˜ ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ๋ฆด๋ฆฌ์Šค๋Š” 2018๋…„ 1300์›”์— ์ด๋ฃจ์–ด์กŒ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ณต์‹ ๋ฆด๋ฆฌ์Šค ์ˆ˜๊ฐ€ ์ ์—ˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ด ํ”„๋กœ์ ํŠธ๋Š” ์ด๋ฏธ GitHub์—์„œ ๋ณ„ 70๊ฐœ ์ด์ƒ, ์ตœ๋Œ€ ๊ธฐ์—ฌ์ž ์ˆ˜(XNUMX๋ช… ์ด์ƒ)๋กœ Crunchy Data ์†”๋ฃจ์…˜์˜ ์ธ๊ธฐ๋ฅผ ๋Šฅ๊ฐ€ํ•˜๋Š” ๋“ฑ ํฐ ๋ฐœ์ „์„ ์ด๋ฃจ์—ˆ์Šต๋‹ˆ๋‹ค.

์ด ์šด์˜์ž์˜ "๋‚ด๋ถ€"์—๋Š” ์˜ค๋žœ ํ…Œ์ŠคํŠธ๋ฅผ ๊ฑฐ์นœ ์†”๋ฃจ์…˜์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

Zalando์˜ ์—ฐ์‚ฐ์ž ์•„ํ‚คํ…์ฒ˜๊ฐ€ ์ œ์‹œ๋˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Kubernetes์šฉ PostgreSQL ๋ฌธ์— ๋Œ€ํ•œ ๊ฐ„๋žตํ•œ ๊ฐœ์š”, ์šฐ๋ฆฌ์˜ ์„ ํƒ ๋ฐ ๊ฒฝํ—˜

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

์šฐ๋ฆฌ๋Š” ๊ณ ๋ ค๋œ 3๊ฐ€์ง€ ์˜ต์…˜ ์ค‘์—์„œ Zalando์˜ ์†”๋ฃจ์…˜์„ ์„ ํƒํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์„ค๋ช…์ด ์ ์šฉ ์‚ฌ๋ก€์™€ ํ•จ๊ป˜ ์•„๋ž˜์— ์ฆ‰์‹œ ์ œ์‹œ๋ฉ๋‹ˆ๋‹ค.

Zalando์˜ Postgres ์—ฐ์‚ฐ์ž ์—ฐ์Šต

Operator ๋ฐฐํฌ๋Š” ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. GitHub์—์„œ ํ˜„์žฌ ๋ฆด๋ฆฌ์Šค๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ๋””๋ ‰ํ„ฐ๋ฆฌ์—์„œ YAML ํŒŒ์ผ์„ ์ ์šฉํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋ช…๋‹จ. ๋˜๋Š” ๋‹ค์Œ์„ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์šด์˜์ž ํ—ˆ๋ธŒ.

์„ค์น˜ ํ›„ ์„ค์ •์„ ์ž˜ ๊ด€๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋กœ๊ทธ ๋ฐ ๋ฐฑ์—…์šฉ ์Šคํ† ๋ฆฌ์ง€. ConfigMap์„ ํ†ตํ•ด ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. postgres-operator ์—ฐ์‚ฐ์ž๋ฅผ ์„ค์ •ํ•œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๊ฐ€ ๊ตฌ์„ฑ๋˜๋ฉด ์ฒซ ๋ฒˆ์งธ PostgreSQL ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ํ‘œ์ค€ ๋ฐฐํฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

apiVersion: acid.zalan.do/v1
kind: postgresql
metadata:
 name: staging-db
spec:
 numberOfInstances: 3
 patroni:
   synchronous_mode: true
 postgresql:
   version: "12"
 resources:
   limits:
     cpu: 100m
     memory: 1Gi
   requests:
     cpu: 100m
     memory: 1Gi
 sidecars:
 - env:
   - name: DATA_SOURCE_URI
     value: 127.0.0.1:5432
   - name: DATA_SOURCE_PASS
     valueFrom:
       secretKeyRef:
         key: password
         name: postgres.staging-db.credentials
   - name: DATA_SOURCE_USER
     value: postgres
   image: wrouesnel/postgres_exporter
   name: prometheus-exporter
   resources:
     limits:
       cpu: 500m
       memory: 100Mi
     requests:
       cpu: 100m
       memory: 100Mi
 teamId: staging
 volume:
   size: 2Gi

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

์ฃผ๋ชฉํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค ๊ด€๋ฆฌ์šฉ ์›น ํŒจ๋„ - postgres-operator-ui. ์šด์˜์ž์™€ ํ•จ๊ป˜ ์ œ๊ณต๋˜๋ฉฐ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์ƒ์„ฑ ๋ฐ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์šด์˜์ž๊ฐ€ ๋งŒ๋“  ๋ฐฑ์—…์œผ๋กœ ์ž‘์—…ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

Kubernetes์šฉ PostgreSQL ๋ฌธ์— ๋Œ€ํ•œ ๊ฐ„๋žตํ•œ ๊ฐœ์š”, ์šฐ๋ฆฌ์˜ ์„ ํƒ ๋ฐ ๊ฒฝํ—˜
PostgreSQL ํด๋Ÿฌ์Šคํ„ฐ ๋ชฉ๋ก

Kubernetes์šฉ PostgreSQL ๋ฌธ์— ๋Œ€ํ•œ ๊ฐ„๋žตํ•œ ๊ฐœ์š”, ์šฐ๋ฆฌ์˜ ์„ ํƒ ๋ฐ ๊ฒฝํ—˜
๋ฐฑ์—… ๊ด€๋ฆฌ

๋˜ ๋‹ค๋ฅธ ํฅ๋ฏธ๋กœ์šด ๊ธฐ๋Šฅ์€ ์ง€์›์ž…๋‹ˆ๋‹ค. ํŒ€ API. ์ด ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. PostgreSQL์˜ ์—ญํ• , ์‚ฌ์šฉ์ž ์ด๋ฆ„ ๊ฒฐ๊ณผ ๋ชฉ๋ก์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ API๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์—ญํ• ์ด ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋œ ์‚ฌ์šฉ์ž ๋ชฉ๋ก์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ ๋ฐ ํ•ด๊ฒฐ์ฑ…

๊ทธ๋Ÿฌ๋‚˜ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ๊ณง ๋ช‡ ๊ฐ€์ง€ ์ค‘์š”ํ•œ ๋‹จ์ ์ด ๋“œ๋Ÿฌ๋‚ฌ์Šต๋‹ˆ๋‹ค.

  1. nodeSelector ์ง€์› ๋ถ€์กฑ;
  2. ๋ฐฑ์—…์„ ๋น„ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์—†์Œ
  3. ๊ธฐ์ง€ ์ƒ์„ฑ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ๋•Œ ๊ธฐ๋ณธ ๊ถŒํ•œ์ด ๋‚˜ํƒ€๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  4. ์ฃผ๊ธฐ์ ์œผ๋กœ ๋ฌธ์„œ๊ฐ€ ์ถฉ๋ถ„ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ์˜ค๋ž˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋‹คํ–‰ํžˆ๋„ ๊ทธ ์ค‘ ๋งŽ์€ ๋ถ€๋ถ„์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์ž - ๋ฌธ์ œ ์„ ์  ์„œ๋ฅ˜ ๋น„์น˜.

์•„๋งˆ๋„ ๋ฐฑ์—…์„ ๋“ฑ๋กํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ๋ฐฑ์—… ๋ฒ„ํ‚ท์„ ์šด์˜์ž UI์— ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ํ•ญ์ƒ ๋ช…ํ™•ํ•˜์ง€๋Š” ์•Š๋‹ค๋Š” ์‚ฌ์‹ค์„ ์ ‘ํ•˜๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฌธ์„œ์—์„œ๋Š” ์ด์— ๋Œ€ํ•ด ์ง€๋‚˜๊ฐ€๋Š” ๋ง๋กœ ์„ค๋ช…ํ•˜์ง€๋งŒ ์‹ค์ œ ์„ค๋ช…์€ PR:

  1. ๋น„๋ฐ€์„ ๋งŒ๋“ค์–ด์•ผ ํ•ด์š”.
  2. ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์—ฐ์‚ฐ์ž์— ์ „๋‹ฌ pod_environment_secret_name ์—ฐ์‚ฐ์ž ์„ค์ •์ด ์žˆ๋Š” CRD ๋˜๋Š” ConfigMap(์—ฐ์‚ฐ์ž ์„ค์น˜ ๋ฐฉ๋ฒ•์— ๋”ฐ๋ผ ๋‹ค๋ฆ„).

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

๋ฐฑ์—…์„ ์œ„ํ•ด ์šด์˜์ž์—๊ฒŒ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒฝ์šฐ, ์ฆ‰ - wal_s3_bucket AWS S3์˜ ์•ก์„ธ์Šค ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ชจ๋“  ๊ฒƒ์„ ๋ฐฑ์—…ํ•  ๊ฑฐ์•ผ: ํ”„๋กœ๋•์…˜ ๊ธฐ๋ฐ˜๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์Šคํ…Œ์ด์ง• ๊ธฐ๋ฐ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์šฐ๋ฆฌ์—๊ฒŒ ์ ํ•ฉํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์—ฐ์‚ฐ์ž ์‚ฌ์šฉ ์‹œ PgSQL์˜ ๊ธฐ๋ณธ Docker ๋ž˜ํผ์ธ Spilo์— ๋Œ€ํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜ ์„ค๋ช…์—์„œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋‚˜์™€ ์žˆ์Šต๋‹ˆ๋‹ค. WAL_S3_BUCKET ๋น„์–ด ์žˆ์œผ๋ฏ€๋กœ ๋ฐฑ์—…์ด ๋น„ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค. ๋”์šฑ์ด ๋‚˜๋Š” ํฐ ๊ธฐ์จ์„ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค. ์ค€๋น„๋œ ํ™๋ณด, ์šฐ๋ฆฌ๋Š” ์ฆ‰์‹œ ํฌํฌ์— ๋ฐ›์•„๋“ค์˜€์Šต๋‹ˆ๋‹ค. ์ด์ œ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ์ถฉ๋ถ„ํžˆ ์‰ฝ์Šต๋‹ˆ๋‹ค enableWALArchiving: false PostgreSQL ํด๋Ÿฌ์Šคํ„ฐ ๋ฆฌ์†Œ์Šค์—.

์˜ˆ, 2๋ช…์˜ ์šด์˜์ž๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ๋‹ค๋ฅด๊ฒŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜๋Š” ์Šคํ…Œ์ด์ง•(๋ฐฑ์—… ์—†์Œ)์šฉ์ด๊ณ  ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ํ”„๋กœ๋•์…˜์šฉ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๋Š” XNUMX๊ฐœ๋กœ ๋ฒ„ํ‹ธ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์ข‹์•„, ์šฐ๋ฆฌ๋Š” S3์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ์ „์†กํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์› ๊ณ  ๋ฐฑ์—…์ด ์Šคํ† ๋ฆฌ์ง€์— ๋“ค์–ด๊ฐ€๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ์šด์˜์ž UI์—์„œ ๋ฐฑ์—… ํŽ˜์ด์ง€๋ฅผ ์ž‘๋™์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

Kubernetes์šฉ PostgreSQL ๋ฌธ์— ๋Œ€ํ•œ ๊ฐ„๋žตํ•œ ๊ฐœ์š”, ์šฐ๋ฆฌ์˜ ์„ ํƒ ๋ฐ ๊ฒฝํ—˜

Operator UI์—์„œ๋Š” 3๊ฐœ์˜ ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • SPILO_S3_BACKUP_BUCKET
  • AWS_ACCESS_KEY_ID
  • AWS_SECRET_ACCESS_KEY

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

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

์™œ ๊ทธ๋Ÿฐ ๊ฒ๋‹ˆ๊นŒ? ์ฝ”๋“œ์— ์žˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ด ํ•„์š”ํ•œ GRANTํ•ญ์ƒ ์ ์šฉ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. 2๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค: syncPreparedDatabases ะธ syncDatabases. ์— syncPreparedDatabases - ์„น์…˜์— ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  preparedDatabases ์ด ์กฐ๊ฑด์ด ์žˆ์–ด์š” defaultRoles ะธ defaultUsers ์—ญํ• ์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐ์—๋Š” ๊ธฐ๋ณธ ๊ถŒํ•œ์ด ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ๊ถŒํ•œ์ด ์ž๋™์œผ๋กœ ์ ์šฉ๋˜๋„๋ก ํŒจ์น˜๋ฅผ ์ค€๋น„ ์ค‘์ž…๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ์™€ ๊ด€๋ จ๋œ ๊ฐœ์„ ์˜ ๋งˆ์ง€๋ง‰ ์ˆœ๊ฐ„์€ - ํŒจ์น˜์ƒ์„ฑ๋œ StatefulSet์— ๋…ธ๋“œ ์„ ํ˜ธ๋„๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” A์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ๊ณ ๊ฐ์€ ์ข…์ข… ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„œ๋น„์Šค๋ฅผ ํ˜ธ์ŠคํŒ…ํ•  ๊ฐ€์น˜๊ฐ€ ์—†๋Š” ์ŠคํŒŸ ์ธ์Šคํ„ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„์šฉ์„ ์ ˆ๊ฐํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” ๊ด€์šฉ์„ ํ†ตํ•ด ํ•ด๊ฒฐ๋  ์ˆ˜ ์žˆ์ง€๋งŒ ๋…ธ๋“œ ์„ ํ˜ธ๋„๊ฐ€ ์žˆ์œผ๋ฉด ๋” ๋งŽ์€ ํ™•์‹ ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌด์Šจ ์ผ์ด์•ผ?

์œ„์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ ๊ฒฐ๊ณผ, ์šฐ๋ฆฌ๋Š” Zalando์˜ Postgres Operator๋ฅผ ๋‹น์‹ ์˜ ์ €์žฅ์†Œ๋งค์šฐ ์œ ์šฉํ•œ ํŒจ์น˜๊ฐ€ ์ง„ํ–‰๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋” ํฐ ํŽธ์˜๋ฅผ ์œ„ํ•ด ์šฐ๋ฆฌ๋Š” ๋˜ํ•œ ์ˆ˜์ง‘ํ–ˆ์Šต๋‹ˆ๋‹ค ๋„์ปค ์ด๋ฏธ์ง€.

ํฌํฌ์— ํ—ˆ์šฉ๋œ PR ๋ชฉ๋ก:

์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ์ด๋Ÿฌํ•œ PR์„ ์ง€์›ํ•˜์—ฌ ๋‹ค์Œ ๋ฒ„์ „์˜ ์šด์˜์ž(1.6)๋กœ ์—…์ŠคํŠธ๋ฆผํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ณด๋„ˆ์Šค! ํ”„๋กœ๋•์…˜ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์„ฑ๊ณต ์‚ฌ๋ก€

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

Spilo๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด S3 ์Šคํ† ๋ฆฌ์ง€๋ฅผ ํ†ตํ•ด ๋Œ€๊ธฐ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์›จ์ผPgSQL ๋ฐ”์ด๋„ˆ๋ฆฌ ๋กœ๊ทธ๊ฐ€ S3์— ์ฒ˜์Œ ์ €์žฅ๋œ ํ›„ ๋ณต์ œ๋ณธ์— ์˜ํ•ด ํŽŒํ•‘๋  ๋•Œ. ํ•˜์ง€๋งŒ ๋งŒ์•ฝ ๋‹น์‹ ์ด ์žˆ๋‹ค๋ฉด ์–ด๋–จ๊นŒ์š”? ์•„๋‹ˆ ์˜ค๋ž˜๋œ ์ธํ”„๋ผ์—์„œ Wal-E๊ฐ€ ์‚ฌ์šฉํ•ฉ๋‹ˆ๊นŒ? ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์€ ์ด๋ฏธ ๊ทธ๊ฒƒ์€ ์ œ์•ˆ๋˜์—ˆ๋‹ค ํ—ˆ๋ธŒ์—.

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

์‚ฌ์‹ค ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—๋Š” ์ˆ˜๋ฐฑ๋งŒ ๊ฐœ์˜ ํ–‰์ด ํฌํ•จ๋œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋กœ๋“œ๋œ ํ…Œ์ด๋ธ”์ด ์žˆ์—ˆ๊ณ , ๊ฒŒ๋‹ค๊ฐ€ ์ง€์†์ ์œผ๋กœ ๋ณด์ถฉ๋˜๊ณ  ์‚ญ์ œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ„ํŽธ๊ฐ€์ž… ั copy_data, ์ƒˆ ๋ณต์ œ๋ณธ์ด ๋งˆ์Šคํ„ฐ์˜ ๋ชจ๋“  ์ฝ˜ํ…์ธ ๋ฅผ ๋ณต์‚ฌํ•˜๋ฉด ๋งˆ์Šคํ„ฐ๋ฅผ ๋”ฐ๋ผ์žก์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ฝ˜ํ…์ธ  ๋ณต์‚ฌ๋Š” ์ผ์ฃผ์ผ ๋™์•ˆ ์ง„ํ–‰๋˜์—ˆ์ง€๋งŒ ๋งˆ์Šคํ„ฐ๋ฅผ ๋”ฐ๋ผ์žก์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ ๋ฌธ์ œ ํ•ด๊ฒฐ์— ๋„์›€์ด ๋์–ด์š” ๊ธฐ์‚ฌ Avito์˜ ๋™๋ฃŒ: ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. pg_dump. ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ (์•ฝ๊ฐ„ ์ˆ˜์ •๋œ) ๋ฒ„์ „์„ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

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

๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ์„ค๋ช…ํ•˜๋Š” ํ›„์† ๋ช…๋ น์€ ํ˜ธ์ŠคํŠธ์— ๋Œ€ํ•ด ๋‹ค์Œ ํ‘œ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  1. ์„์‚ฌ โ€” ์†Œ์Šค ์„œ๋ฒ„
  2. ๋ณต์ œ๋ณธ1 - ์ด์ „ ํ”„๋กœ๋•์…˜์˜ ์ŠคํŠธ๋ฆฌ๋ฐ ๋ณต์ œ๋ณธ
  3. ๋ณต์ œ๋ณธ2 - ์ƒˆ๋กœ์šด ๋…ผ๋ฆฌ์  ๋ณต์ œ๋ณธ.

๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ณ„ํš

1. ๋งˆ๋ฒ•์‚ฌ์—์„œ ์Šคํ‚ค๋งˆ์˜ ๋ชจ๋“  ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ ๊ตฌ๋…์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. public ๊ธฐ์ดˆ dbname:

psql -h master -d dbname -c "CREATE PUBLICATION dbname FOR ALL TABLES;"

2. ๋งˆ์Šคํ„ฐ์— ๋ณต์ œ ์Šฌ๋กฏ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

psql -h master -c "select pg_create_logical_replication_slot('repl', 'pgoutput');"

3. ์ด์ „ ๋ณต์ œ๋ณธ์—์„œ ๋ณต์ œ๋ฅผ ์ค‘์ง€ํ•ฉ๋‹ˆ๋‹ค.

psql -h replica1 -c "select pg_wal_replay_pause();"

4. ๋งˆ์Šคํ„ฐ๋กœ๋ถ€ํ„ฐ ํŠธ๋žœ์žญ์…˜ ๋ฒˆํ˜ธ๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค.

psql -h master -c "select replay_lsn from pg_stat_replication where client_addr = 'replica1';"

5. ์ด์ „ ๋ณต์ œ๋ณธ์—์„œ ๋คํ”„ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ํ”„๋กœ์„ธ์Šค ์†๋„๋ฅผ ๋†’์ด๋Š” ๋ฐ ๋„์›€์ด ๋  ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ์—์„œ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

pg_dump -h replica1 --no-publications --no-subscriptions -O -C -F d -j 8 -f dump/ dbname

6. ๋คํ”„๋ฅผ ์ƒˆ ์„œ๋ฒ„์— ์—…๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.

pg_restore -h replica2 -F d -j 8 -d dbname dump/

7. ๋คํ”„๋ฅผ ๋‹ค์šด๋กœ๋“œํ•œ ํ›„ ์ŠคํŠธ๋ฆฌ๋ฐ ๋ณต์ œ๋ณธ์—์„œ ๋ณต์ œ๋ฅผ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

psql -h replica1 -c "select pg_wal_replay_resume();"

7. ์ƒˆ ๋…ผ๋ฆฌ์  ๋ณต์ œ๋ณธ์— ๊ตฌ๋…์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

psql -h replica2 -c "create subscription oldprod connection 'host=replica1 port=5432 user=postgres password=secret dbname=dbname' publication dbname with (enabled = false, create_slot = false, copy_data = false, slot_name='repl');"

8. ๋ฐ›๊ธฐ oid ๊ตฌ๋…:

psql -h replica2 -d dbname -c "select oid, * from pg_subscription;"

9. ๋ฐ›์•˜๋‹ค๊ณ  ํ•˜์ž oid=1000. ๊ตฌ๋…์— ๊ฑฐ๋ž˜ ๋ฒˆํ˜ธ๋ฅผ ์ ์šฉํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

psql -h replica2 -d dbname -c "select pg_replication_origin_advance('pg_1000', 'AA/AAAAAAAA');"

10. ๋ณต์ œ๋ฅผ ์‹œ์ž‘ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

psql -h replica2 -d dbname -c "alter subscription oldprod enable;"

11. ๊ตฌ๋… ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜์„ธ์š”. ๋ณต์ œ๊ฐ€ ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

psql -h replica2 -d dbname -c "select * from pg_replication_origin_status;"
psql -h master -d dbname -c "select slot_name, restart_lsn, confirmed_flush_lsn from pg_replication_slots;"

12. ๋ณต์ œ๊ฐ€ ์‹œ์ž‘๋˜๊ณ  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ๋™๊ธฐํ™”๋œ ํ›„ ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

13. ๋ณต์ œ๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•œ ํ›„ ์‹œํ€€์Šค๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ž˜ ์„ค๋ช…๋˜์–ด ์žˆ์–ด์š” wiki.postgresql.org ๊ธฐ์‚ฌ์—์„œ.

์ด ๊ณ„ํš ๋•๋ถ„์— ์ „ํ™˜์ด ์ตœ์†Œํ•œ์˜ ์ง€์—ฐ์œผ๋กœ ์ง„ํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๋ก 

Kubernetes ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์–‘ํ•œ ์ž‘์—…์„ K8s ๋ฆฌ์†Œ์Šค ์ƒ์„ฑ์œผ๋กœ ์ค„์—ฌ ๋‹จ์ˆœํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๋“ค์˜ ๋„์›€์œผ๋กœ ๋†€๋ผ์šด ์ž๋™ํ™”๋ฅผ ๋‹ฌ์„ฑํ•œ ํ›„์—๋Š” ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฏธ๋ฌ˜ํ•œ ์ฐจ์ด๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜๋„ ์žˆ๋‹ค๋Š” ์ ์„ ๊ธฐ์–ตํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ์šด์˜์ž๋ฅผ ํ˜„๋ช…ํ•˜๊ฒŒ ์„ ํƒํ•˜์‹ญ์‹œ์˜ค.

PostgreSQL์— ๋Œ€ํ•ด ๊ฐ€์žฅ ์ธ๊ธฐ ์žˆ๋Š” ์„ธ ๊ฐ€์ง€ Kubernetes ์—ฐ์‚ฐ์ž๋ฅผ ๊ฒ€ํ† ํ•œ ํ›„ ์šฐ๋ฆฌ๋Š” Zalando์˜ ํ”„๋กœ์ ํŠธ๋ฅผ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๋Š” ๋ช‡ ๊ฐ€์ง€ ์–ด๋ ค์›€์„ ๊ทน๋ณตํ•ด์•ผ ํ–ˆ์ง€๋งŒ ๊ฒฐ๊ณผ๋Š” ์ •๋ง ๋งŒ์กฑ์Šค๋Ÿฌ์› ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ์ด ๊ฒฝํ—˜์„ ๋‹ค๋ฅธ PgSQL ์„ค์น˜๋กœ ํ™•์žฅํ•  ๊ณ„ํš์ž…๋‹ˆ๋‹ค. ์œ ์‚ฌํ•œ ์†”๋ฃจ์…˜์„ ์‚ฌ์šฉํ•ด ๋ณธ ๊ฒฝํ—˜์ด ์žˆ๋‹ค๋ฉด ๋Œ“๊ธ€์„ ํ†ตํ•ด ์ž์„ธํ•œ ๋‚ด์šฉ์„ ์•Œ๋ ค๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค!

PS

๋ธ”๋กœ๊ทธ์—์„œ๋„ ์ฝ์–ด๋ณด์„ธ์š”.

์ถœ์ฒ˜ : habr.com

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