๊ณ ๊ฐ์ผ๋ก๋ถํฐ ์ด๋ฌํ ์์ฒญ์ ์ ์ ๋ ๋ง์ด ๋ฐ๊ณ ์์ต๋๋ค. "์ฐ๋ฆฌ๋ Amazon RDS์ ๋น์ทํ์ง๋ง ๋ ์ ๋ ดํ๊ธฐ๋ฅผ ์ํฉ๋๋ค." "์ฐ๋ฆฌ๋ RDS์ฒ๋ผ ๋ชจ๋ ์ธํ๋ผ์์ ์ด๋์๋ ์ด๋ฅผ ์ํฉ๋๋ค." Kubernetes์์ ์ด๋ฌํ ๊ด๋ฆฌํ ์๋ฃจ์
์ ๊ตฌํํ๊ธฐ ์ํด ์ฐ๋ฆฌ๋ PostgreSQL์์ ๊ฐ์ฅ ์ธ๊ธฐ ์๋ ์ฐ์ฐ์(Stolon, Crunchy Data ๋ฐ Zalando์ ์ฐ์ฐ์)์ ํ์ฌ ์ํ๋ฅผ ์ดํด๋ณด๊ณ ์ ํํ์ต๋๋ค.
์ด ๊ธฐ์ฌ๋ ์ด๋ก ์ ๊ด์ (์๋ฃจ์
๊ฒํ )๊ณผ ์ค์ ๊ด์ (๋ฌด์์ ์ ํํ๊ณ ๊ฒฐ๊ณผ๋ ๋ฌด์์ธ์ง)์์ ์ฐ๋ฆฌ๊ฐ ๊ฒฝํํ ๋ด์ฉ์
๋๋ค. ํ์ง๋ง ๋จผ์ RDS๋ฅผ ์ ์ฌ์ ์ผ๋ก ๋์ฒดํ๊ธฐ ์ํ ์ผ๋ฐ์ ์ธ ์๊ตฌ ์ฌํญ์ด ๋ฌด์์ธ์ง ์ ์ํด ๋ณด๊ฒ ์ต๋๋ค.
RDS ๋ ๋ฌด์์ ๋๊น?
์ฌ๋๋ค์ด RDS์ ๋ํด ์ด์ผ๊ธฐํ ๋ ์ฐ๋ฆฌ ๊ฒฝํ์ ๋ฐ๋ฅด๋ฉด ์ด๋ ๋ค์๊ณผ ๊ฐ์ ๊ด๋ฆฌํ DBMS ์๋น์ค๋ฅผ ์๋ฏธํฉ๋๋ค.
- ์ค์ ์ด ์ฝ์ต๋๋ค.
- ์ค๋
์ท์ผ๋ก ์์
ํ๊ณ ์ค๋
์ท์์ ๋ณต๊ตฌํ ์ ์๋ ๊ธฐ๋ฅ์ด ์์ต๋๋ค(๋ฐ๋์งํ๊ฒ๋
PITR ); - ๋ง์คํฐ-์ฌ๋ ์ด๋ธ ํ ํด๋ก์ง๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
- ํ๋ถํ ํ์ฅ ๊ธฐ๋ฅ ๋ชฉ๋ก์ด ์์ต๋๋ค.
- ๊ฐ์ฌ ๋ฐ ์ฌ์ฉ์/์ก์ธ์ค ๊ด๋ฆฌ๋ฅผ ์ ๊ณตํฉ๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ์์
๊ตฌํ์ ๋ํ ์ ๊ทผ ๋ฐฉ์์ ๋งค์ฐ ๋ค๋ฅผ ์ ์์ง๋ง ์กฐ๊ฑด๋ถ Ansible์ ์ฌ์ฉํ๋ ๊ฒฝ๋ก๋ ์ฐ๋ฆฌ์๊ฒ ๊ฐ๊น์ง ์์ต๋๋ค. (2GIS์ ๋๋ฃ๋ค์ ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๋ก ๋น์ทํ ๊ฒฐ๋ก ์ ๋๋ฌํ์ต๋๋ค.
Kubernetes ์ํ๊ณ์์ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ผ๋ฐ์ ์ผ๋ก ์์ฉ๋๋ ์ ๊ทผ ๋ฐฉ์์ ์ด์์์
๋๋ค. Kubernetes ๋ด๋ถ์์ ์คํ๋๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ด๋ จํ์ฌ ์ด์ ๋ํ ์์ธํ ๋ด์ฉ์ Flant์ ๊ธฐ์ ์ด์ฌ๊ฐ ์ด๋ฏธ ๋ค์๊ณผ ๊ฐ์ด ๋งํ์ต๋๋ค.
NB: ๊ฐ๋จํ ์ฐ์ฐ์๋ฅผ ๋น ๋ฅด๊ฒ ์์ฑํ๋ ค๋ฉด ์คํ ์์ค ์ ํธ๋ฆฌํฐ์ ์ฃผ์ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
PostgreSQL์๋ ๋๋ฆฌ ์ฌ์ฉ๋๋ K8s ์ฐ์ฐ์๊ฐ ๋ช ๊ฐ์ง ์์ต๋๋ค.
- ์คํจ๋ก ;
- ๋ฐ์ญ๋ฐ์ญํ ๋ฐ์ดํฐ PostgreSQL ์ด์์;
- Zalando Postgres ์ด์์.
์ข ๋ ์์ธํ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
์ด์์ ์ ํ
์์์ ์ด๋ฏธ ์ธ๊ธํ ์ค์ํ ๊ธฐ๋ฅ ์ธ์๋ Kubernetes์ ์ธํ๋ผ ์์ง๋์ด๋ก์ ์ฐ๋ฆฌ๋ ์ด์์๋ก๋ถํฐ ๋ค์์ ๊ธฐ๋ํ์ต๋๋ค.
- Git์์ ๋ฐฐํฌ ๋ฐ
๋ง์ถคํ ๋ฆฌ์์ค ; - ํฌ๋ ๋ฐ์นํ์ฑ ์ง์;
- ๋ ธ๋ ์ ํธ๋ ๋๋ ๋ ธ๋ ์ ํ๊ธฐ ์ค์น
- ๊ณต์ฐจ ์ค์ ;
- ํ๋ ๊ธฐ๋ฅ์ ๊ฐ์ฉ์ฑ;
- ์ดํดํ ์ ์๋ ๊ธฐ์ , ์ฌ์ง์ด ๋ช ๋ น๊น์ง.
๊ฐ ์์ ์ ๋ํด ์์ธํ ์ค๋ช ํ์ง ์๊ณ (์ ์ฒด ๊ธฐ์ฌ๋ฅผ ์ฝ์ ํ์๋ ์ฌ์ ํ ์ง๋ฌธ์ด ์์ผ๋ฉด ์๊ฒฌ์ ์ง๋ฌธํ์ญ์์ค) ์ผ๋ฐ์ ์ผ๋ก ํด๋ฌ์คํฐ ๋ ธ๋์ ์ ๋ฌธํ์ ๋ํ๋ณด๋ค ๋ฏธ๋ฌํ ์ค๋ช ์ ์ํด ์ด๋ฌํ ๋งค๊ฐ ๋ณ์๊ฐ ํ์ํ๋ค๋ ์ ์ ์ ์ํ ๊ฒ์ ๋๋ค. ํน์ ์ฉ๋๋ฅผ ์ํด ์ฃผ๋ฌธํ์ญ์์ค. ์ด๋ฅผ ํตํด ์ฑ๋ฅ๊ณผ ๋น์ฉ ๊ฐ์ ์ต์ ์ ๊ท ํ์ ๋ฌ์ฑํ ์ ์์ต๋๋ค.
์ด์ PostgreSQL ์ด์์ ์์ ์๊ฒ.
1. ์คํจ๋ก
์ค์ ๋ก Stolon์ ์ฌ๋ ค ๊น์ ์ํคํ ์ฒ์ ํ๋ฅญํ ์์ ๋๋ค.
์ด ์ด์์์ ์ฅ์น๋ ๋ณด๊ณ ์ ๋๋
๊ทธ๋ฌ๋ ์คํจ๋ก ์ stolonctl
, ๋ฐฐํฌ - Helm ์ฐจํธ๋ฅผ ํตํด, ์ฌ์ฉ์ ์ ์ ํญ๋ชฉ์ ConfigMap์ ์ ์๋ฉ๋๋ค.
ํํธ์ผ๋ก๋ ์ฐ์ฐ์๊ฐ ์ค์ ๋ก๋ ์ฐ์ฐ์๊ฐ ์๋๋ผ๋ ๊ฒ์ด ๋ฐํ์ก์ต๋๋ค(CRD๋ฅผ ์ฌ์ฉํ์ง ์๊ธฐ ๋๋ฌธ์ ๋๋ค). ํ์ง๋ง ํํธ์ผ๋ก๋ K8s์ ๋ฆฌ์์ค๋ฅผ ์ํ๋ ๋ฐฉ์์ผ๋ก ๊ตฌ์ฑํ ์ ์๋ ์ ์ฐํ ์์คํ ์ ๋๋ค.
์์ฝํ์๋ฉด, ๊ฐ์ธ์ ์ผ๋ก ๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ํด ๋ณ๋์ ์ฐจํธ๋ฅผ ์์ํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋์ ์ฐ๋ฆฌ๋ ๋์์ ์ฐพ๊ธฐ ์์ํ์ต๋๋ค.
2. ๋ฐ์ญ๋ฐ์ญํ ๋ฐ์ดํฐ PostgreSQL ์ฐ์ฐ์
Crunchy Data PostgreSQL Operator ์ํคํ ์ฒ๋ ๋ช ์๋ ์๊ตฌ ์ฌํญ๋ ์ถฉ์กฑํฉ๋๋ค.
๊ด๋ฆฌ๋ ์ ํธ๋ฆฌํฐ๋ฅผ ํตํด ์ด๋ฃจ์ด์ง๋๋ค. pgo
๊ทธ๋ฌ๋ Kubernetes์ฉ ์ฌ์ฉ์ ์ง์ ๋ฆฌ์์ค๊ฐ ์์ฑ๋ฉ๋๋ค. ๋ฐ๋ผ์ ์ด์์๋ ์ฐ๋ฆฌ๋ฅผ ์ ์ฌ์ ์ฌ์ฉ์๋ก ๊ธฐ์๊ฒ ์๊ฐํฉ๋๋ค.
- CRD๋ฅผ ํตํ ์ ์ด๊ฐ ์์ต๋๋ค.
- ํธ๋ฆฌํ ์ฌ์ฉ์ ๊ด๋ฆฌ(CRD๋ฅผ ํตํด์๋ ๊ฐ๋ฅ)
- ๋ค๋ฅธ ๊ตฌ์ฑ์์์์ ํตํฉ
ํฌ๋ฐ์น ๋ฐ์ดํฐ ์ปจํ ์ด๋ ์ ํ๊ตฐ - PostgreSQL์ฉ ์ปจํ ์ด๋ ์ด๋ฏธ์ง ๋ฐ ์ด๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํ ์ ํธ๋ฆฌํฐ(pgBackRest, pgAudit, contrib์ ํ์ฅ ๋ฑ ํฌํจ)์ ํน์ ์ปฌ๋ ์ ์ ๋๋ค.
๊ทธ๋ฌ๋ Crunchy Data์์ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ ค๊ณ ์๋ํ๋ฉด ๋ช ๊ฐ์ง ๋ฌธ์ ๊ฐ ๋๋ฌ๋ฌ์ต๋๋ค.
- ํ์ฉ ๊ฐ๋ฅ์ฑ์ ์์์ต๋๋ค. nodeSelector๋ง ์ ๊ณต๋ฉ๋๋ค.
- ์์ฑ๋ ํฌ๋๋ ์ํ ์ ์ฅ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐฐํฌํ๊ณ ์์์๋ ๋ถ๊ตฌํ๊ณ ๋ฐฐํฌ์ ์ผ๋ถ์์ต๋๋ค. StatefulSet์ ๋ฌ๋ฆฌ ๋ฐฐํฌ๋ ๋์คํฌ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
๋ง์ง๋ง ๊ฒฐํจ์ ์ฌ๋ฏธ์๋ ์๊ฐ์ผ๋ก ์ด์ด์ง๋๋ค. ํ ์คํธ ํ๊ฒฝ์์ ์ฐ๋ฆฌ๋ ํ๋์ ๋์คํฌ๋ก 3๊ฐ์ ๋ณต์ ๋ณธ์ ์คํํ์ต๋๋ค. ๋ก์ปฌ ์ ์ฅ์, ๊ทธ ๊ฒฐ๊ณผ ์ด์์๋ 3๊ฐ์ ๋ณต์ ๋ณธ์ด ์๋ ์ค์ด๋ผ๊ณ ๋ณด๊ณ ํ์ต๋๋ค(๊ทธ๋ฌ๋ ์ฌ์ค์ ๊ทธ๋ ์ง ์์์ต๋๋ค).
์ด ์คํผ๋ ์ดํฐ์ ๋ ๋ค๋ฅธ ํน์ง์ ๋ค์ํ ๋ณด์กฐ ์์คํ
๊ณผ์ ์ฌ์ ํตํฉ์
๋๋ค. ์๋ฅผ ๋ค์ด pgAdmin๊ณผ pgBounce๋ฅผ ์ค์นํ๋ ๊ฒ์ ์ฝ์ต๋๋ค.
๊ทธ๋ฌ๋ Kubernetes ์์ฑ ๋ฆฌ์์ค์ ์ด์ํ ์ ํ์ผ๋ก ์ธํด ์ฐ๋ฆฌ๋ ๋ค๋ฅธ ์๋ฃจ์ ์ ์ฐพ์์ผ ํ์ต๋๋ค.
3. Zalando Postgres ์ด์์
Zalando ์ ํ์ ์ค๋ซ๋์ ์ฐ๋ฆฌ์๊ฒ ์๋ ค์ ธ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ Zalenium์ ์ฌ์ฉํ ๊ฒฝํ์ด ์์ผ๋ฉฐ ๋ฌผ๋ก ๋ค์์ ์๋ํ์ต๋๋ค.
์ด๋ ๊ธฐ์ฌ์์ ๋ ผ์๋ ๊ฐ์ฅ ์ต๊ทผ์ ์๋ฃจ์ ์ ๋๋ค. ์ฒซ ๋ฒ์งธ ๋ฆด๋ฆฌ์ค๋ 2018๋ 1300์์ ์ด๋ฃจ์ด์ก์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ณต์ ๋ฆด๋ฆฌ์ค ์๊ฐ ์ ์์์๋ ๋ถ๊ตฌํ๊ณ ์ด ํ๋ก์ ํธ๋ ์ด๋ฏธ GitHub์์ ๋ณ 70๊ฐ ์ด์, ์ต๋ ๊ธฐ์ฌ์ ์(XNUMX๋ช ์ด์)๋ก Crunchy Data ์๋ฃจ์ ์ ์ธ๊ธฐ๋ฅผ ๋ฅ๊ฐํ๋ ๋ฑ ํฐ ๋ฐ์ ์ ์ด๋ฃจ์์ต๋๋ค.
์ด ์ด์์์ "๋ด๋ถ"์๋ ์ค๋ ํ ์คํธ๋ฅผ ๊ฑฐ์น ์๋ฃจ์ ์ด ์ฌ์ฉ๋ฉ๋๋ค.
Zalando์ ์ฐ์ฐ์ ์ํคํ ์ฒ๊ฐ ์ ์๋๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ด์์๋ ์ฌ์ฉ์ ์ ์ ๋ฆฌ์์ค๋ฅผ ํตํด ์์ ํ ๊ด๋ฆฌ๋๊ณ , ์ปจํ
์ด๋์์ StatefulSet์ ์๋์ผ๋ก ์์ฑํ ๋ค์, ํฌ๋์ ๋ค์ํ ์ฌ์ด๋์นด๋ฅผ ์ถ๊ฐํ์ฌ ์ฌ์ฉ์ ์ ์ํ ์ ์์ต๋๋ค. ์ด ๋ชจ๋ ๊ฒ์ Crunchy Data์ ์ฐ์ฐ์์ ๋น๊ตํ ๋ ์ค์ํ ์ฅ์ ์
๋๋ค.
์ฐ๋ฆฌ๋ ๊ณ ๋ ค๋ 3๊ฐ์ง ์ต์ ์ค์์ Zalando์ ์๋ฃจ์ ์ ์ ํํ๊ธฐ ๋๋ฌธ์ ํด๋น ๊ธฐ๋ฅ์ ๋ํ ์ถ๊ฐ ์ค๋ช ์ด ์ ์ฉ ์ฌ๋ก์ ํจ๊ป ์๋์ ์ฆ์ ์ ์๋ฉ๋๋ค.
Zalando์ Postgres ์ฐ์ฐ์ ์ฐ์ต
Operator ๋ฐฐํฌ๋ ๋งค์ฐ ๊ฐ๋จํฉ๋๋ค. GitHub์์ ํ์ฌ ๋ฆด๋ฆฌ์ค๋ฅผ ๋ค์ด๋ก๋ํ๊ณ ๋๋ ํฐ๋ฆฌ์์ YAML ํ์ผ์ ์ ์ฉํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
์ค์น ํ ์ค์ ์ ์ ๊ด๋ฆฌํด์ผ ํฉ๋๋ค. 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๊ฐ๋ก ๊ตฌ์ฑ๋ ํด๋ฌ์คํฐ๋ฅผ ๋ฐฐํฌํฉ๋๋ค.
์ฃผ๋ชฉํ ๊ฐ์น๊ฐ ์์ต๋๋ค ๊ด๋ฆฌ์ฉ ์น ํจ๋ -
PostgreSQL ํด๋ฌ์คํฐ ๋ชฉ๋ก
๋ฐฑ์
๊ด๋ฆฌ
๋ ๋ค๋ฅธ ํฅ๋ฏธ๋ก์ด ๊ธฐ๋ฅ์ ์ง์์
๋๋ค.
๋ฌธ์ ๋ฐ ํด๊ฒฐ์ฑ
๊ทธ๋ฌ๋ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ฉด์ ๊ณง ๋ช ๊ฐ์ง ์ค์ํ ๋จ์ ์ด ๋๋ฌ๋ฌ์ต๋๋ค.
- nodeSelector ์ง์ ๋ถ์กฑ;
- ๋ฐฑ์ ์ ๋นํ์ฑํํ ์ ์์
- ๊ธฐ์ง ์์ฑ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ๋ ๊ธฐ๋ณธ ๊ถํ์ด ๋ํ๋์ง ์์ต๋๋ค.
- ์ฃผ๊ธฐ์ ์ผ๋ก ๋ฌธ์๊ฐ ์ถฉ๋ถํ์ง ์๊ฑฐ๋ ์ค๋๋์์ต๋๋ค.
๋คํํ๋ ๊ทธ ์ค ๋ง์ ๋ถ๋ถ์ ํด๊ฒฐํ ์ ์์ต๋๋ค. ๋๋ถํฐ ์์ํ์ - ๋ฌธ์ ์ ์ ์๋ฅ ๋น์น.
์๋ง๋ ๋ฐฑ์
์ ๋ฑ๋กํ๋ ๋ฐฉ๋ฒ๊ณผ ๋ฐฑ์
๋ฒํท์ ์ด์์ UI์ ์ฐ๊ฒฐํ๋ ๋ฐฉ๋ฒ์ด ํญ์ ๋ช
ํํ์ง๋ ์๋ค๋ ์ฌ์ค์ ์ ํ๊ฒ ๋ ๊ฒ์
๋๋ค. ๋ฌธ์์์๋ ์ด์ ๋ํด ์ง๋๊ฐ๋ ๋ง๋ก ์ค๋ช
ํ์ง๋ง ์ค์ ์ค๋ช
์
- ๋น๋ฐ์ ๋ง๋ค์ด์ผ ํด์.
- ๋งค๊ฐ๋ณ์๋ก ์ฐ์ฐ์์ ์ ๋ฌ
pod_environment_secret_name
์ฐ์ฐ์ ์ค์ ์ด ์๋ CRD ๋๋ ConfigMap(์ฐ์ฐ์ ์ค์น ๋ฐฉ๋ฒ์ ๋ฐ๋ผ ๋ค๋ฆ).
๊ทธ๋ฌ๋ ๊ฒฐ๊ณผ์ ์ผ๋ก ํ์ฌ๋ก์๋ ์ด๊ฒ์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ฐ๋ฆฌ๋ ์์งํ์ต๋๋ค.
๋ฐฑ์
์ ์ํด ์ด์์์๊ฒ ๋งค๊ฐ๋ณ์๋ฅผ ์ ๋ฌํ๋ ๊ฒฝ์ฐ, ์ฆ - wal_s3_bucket
AWS S3์ ์ก์ธ์ค ํค๋ฅผ ์ฌ์ฉํ๋ฉด ๋ชจ๋ ๊ฒ์ ๋ฐฑ์
ํ ๊ฑฐ์ผ: ํ๋ก๋์
๊ธฐ๋ฐ๋ฟ๋ง ์๋๋ผ ์คํ
์ด์ง ๊ธฐ๋ฐ๋ ์์ต๋๋ค. ๊ทธ๊ฒ์ ์ฐ๋ฆฌ์๊ฒ ์ ํฉํ์ง ์์์ต๋๋ค.
์ฐ์ฐ์ ์ฌ์ฉ ์ PgSQL์ ๊ธฐ๋ณธ Docker ๋ํผ์ธ Spilo์ ๋ํ ๋งค๊ฐ๋ณ์ ์ค๋ช
์์ ๋งค๊ฐ๋ณ์๋ฅผ ์ ๋ฌํ ์ ์๋ค๊ณ ๋์ ์์ต๋๋ค. WAL_S3_BUCKET
๋น์ด ์์ผ๋ฏ๋ก ๋ฐฑ์
์ด ๋นํ์ฑํ๋ฉ๋๋ค. ๋์ฑ์ด ๋๋ ํฐ ๊ธฐ์จ์ ์ป์์ต๋๋ค. enableWALArchiving: false
PostgreSQL ํด๋ฌ์คํฐ ๋ฆฌ์์ค์.
์, 2๋ช ์ ์ด์์๋ฅผ ์คํํ์ฌ ๋ค๋ฅด๊ฒ ์ํํ ์ ์์์ต๋๋ค. ํ๋๋ ์คํ ์ด์ง(๋ฐฑ์ ์์)์ฉ์ด๊ณ ๋ค๋ฅธ ํ๋๋ ํ๋ก๋์ ์ฉ์ ๋๋ค. ํ์ง๋ง ์ฐ๋ฆฌ๋ XNUMX๊ฐ๋ก ๋ฒํธ ์ ์์์ต๋๋ค.
์ข์, ์ฐ๋ฆฌ๋ S3์ ๋ํ ์ก์ธ์ค๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ์ ์กํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ ๊ณ ๋ฐฑ์ ์ด ์คํ ๋ฆฌ์ง์ ๋ค์ด๊ฐ๊ธฐ ์์ํ์ต๋๋ค. ์ด์์ UI์์ ๋ฐฑ์ ํ์ด์ง๋ฅผ ์๋์ํค๋ ๋ฐฉ๋ฒ์ ๋ฌด์์ ๋๊น?
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
์ญํ ์ ์์ฑํ๋ ๋ฐ์๋ ๊ธฐ๋ณธ ๊ถํ์ด ์ ์ฉ๋์ง ์์ต๋๋ค. ํด๋น ๊ถํ์ด ์๋์ผ๋ก ์ ์ฉ๋๋๋ก ํจ์น๋ฅผ ์ค๋น ์ค์
๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ์ ๊ด๋ จ๋ ๊ฐ์ ์ ๋ง์ง๋ง ์๊ฐ์ -
๋ฌด์จ ์ผ์ด์ผ?
์์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๊ฒฐ๊ณผ, ์ฐ๋ฆฌ๋ Zalando์ Postgres Operator๋ฅผ
ํฌํฌ์ ํ์ฉ๋ PR ๋ชฉ๋ก:
์ด์์๋ฅผ ์ํ ์์ ํ ๊ฒฝ๋ Docker ์ด๋ฏธ์ง ๊ตฌ์ถ ;๋ฐฑ์ ๋นํ์ฑํ ;k8s์ ํ์ฌ ๋ฒ์ ์ ๋ํ ๋ฆฌ์์ค ๋ฒ์ ์ ๋ฐ์ดํธ ;๋ ธ๋ ์ดํผ๋ํฐ ๊ตฌํ .
์ปค๋ฎค๋ํฐ๊ฐ ์ด๋ฌํ PR์ ์ง์ํ์ฌ ๋ค์ ๋ฒ์ ์ ์ด์์(1.6)๋ก ์ ์คํธ๋ฆผํ ์ ์๋ค๋ฉด ์ข์ ๊ฒ์ ๋๋ค.
๋ณด๋์ค! ํ๋ก๋์ ๋ง์ด๊ทธ๋ ์ด์ ์ฑ๊ณต ์ฌ๋ก
Patroni๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ๋ ์ค์ง ์๊ฐ์ ์ต์ํํ๋ฉด์ ๋ผ์ด๋ธ ํ๋ก๋์ ์ ์ด์์์๊ฒ ๋ง์ด๊ทธ๋ ์ด์ ํ ์ ์์ต๋๋ค.
Spilo๋ฅผ ์ฌ์ฉํ๋ฉด S3 ์คํ ๋ฆฌ์ง๋ฅผ ํตํด ๋๊ธฐ ํด๋ฌ์คํฐ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
PostgreSQL ๋ ผ๋ฆฌ์ ๋ณต์ ๊ฐ ๊ตฌ์ถ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ์ฐ๋ฆฌ ๊ณํ์ด ์คํจํ๊ธฐ ๋๋ฌธ์ ๋ฐํ๋ฌผ ๋ฐ ๊ตฌ๋ ์ ๋ง๋๋ ๋ฐฉ๋ฒ์ ๋ํด ์์ธํ ์ค๋ช ํ์ง ์๊ฒ ์ต๋๋ค.
์ฌ์ค ๋ฐ์ดํฐ๋ฒ ์ด์ค์๋ ์๋ฐฑ๋ง ๊ฐ์ ํ์ด ํฌํจ๋ ์ฌ๋ฌ ๊ฐ์ ๋ก๋๋ ํ
์ด๋ธ์ด ์์๊ณ , ๊ฒ๋ค๊ฐ ์ง์์ ์ผ๋ก ๋ณด์ถฉ๋๊ณ ์ญ์ ๋์์ต๋๋ค. copy_data
, ์ ๋ณต์ ๋ณธ์ด ๋ง์คํฐ์ ๋ชจ๋ ์ฝํ
์ธ ๋ฅผ ๋ณต์ฌํ๋ฉด ๋ง์คํฐ๋ฅผ ๋ฐ๋ผ์ก์ ์ ์์ต๋๋ค. ์ฝํ
์ธ ๋ณต์ฌ๋ ์ผ์ฃผ์ผ ๋์ ์งํ๋์์ง๋ง ๋ง์คํฐ๋ฅผ ๋ฐ๋ผ์ก์ง ๋ชปํ์ต๋๋ค. ๊ฒฐ๊ตญ ๋ฌธ์ ํด๊ฒฐ์ ๋์์ด ๋์ด์ pg_dump
. ์ด ์๊ณ ๋ฆฌ์ฆ์ (์ฝ๊ฐ ์์ ๋) ๋ฒ์ ์ ์ค๋ช
ํ๊ฒ ์ต๋๋ค.
ํน์ ๋ณต์ ์ฌ๋กฏ์ ์ฐ๊ฒฐ๋ ๋นํ์ฑํ๋ ๊ตฌ๋ ์ ๋ง๋ ๋ค์ ํธ๋์ญ์ ๋ฒํธ๋ฅผ ์์ ํ ์ ์๋ค๋ ์์ด๋์ด์ ๋๋ค. ์์ฐ ์์ ์ ์ํ ๋ณต์ ๋ณธ์ด ์์์ต๋๋ค. ๋ณต์ ๋ณธ์ ์ผ๊ด๋ ๋คํ๋ฅผ ์์ฑํ๊ณ ๋ง์คํฐ๋ก๋ถํฐ ๋ณ๊ฒฝ ์ฌํญ์ ๊ณ์ ์์ ํ๋ ๋ฐ ๋์์ด ๋๊ธฐ ๋๋ฌธ์ ์ด๋ ์ค์ํฉ๋๋ค.
๋ง์ด๊ทธ๋ ์ด์ ํ๋ก์ธ์ค๋ฅผ ์ค๋ช ํ๋ ํ์ ๋ช ๋ น์ ํธ์คํธ์ ๋ํด ๋ค์ ํ๊ธฐ๋ฒ์ ์ฌ์ฉํฉ๋๋ค.
- ์์ฌ โ ์์ค ์๋ฒ
- ๋ณต์ ๋ณธ1 - ์ด์ ํ๋ก๋์ ์ ์คํธ๋ฆฌ๋ฐ ๋ณต์ ๋ณธ
- ๋ณต์ ๋ณธ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. ๋ณต์ ๋ฅผ ๋นํ์ฑํํ ํ ์ํ์ค๋ฅผ ์์ ํด์ผ ํฉ๋๋ค. ์ ์ค๋ช
๋์ด ์์ด์
์ด ๊ณํ ๋๋ถ์ ์ ํ์ด ์ต์ํ์ ์ง์ฐ์ผ๋ก ์งํ๋์์ต๋๋ค.
๊ฒฐ๋ก
Kubernetes ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ฉด ๋ค์ํ ์์ ์ K8s ๋ฆฌ์์ค ์์ฑ์ผ๋ก ์ค์ฌ ๋จ์ํํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๋ค์ ๋์์ผ๋ก ๋๋ผ์ด ์๋ํ๋ฅผ ๋ฌ์ฑํ ํ์๋ ์์์น ๋ชปํ ์ฌ๋ฌ ๊ฐ์ง ๋ฏธ๋ฌํ ์ฐจ์ด๊ฐ ๋ฐ์ํ ์๋ ์๋ค๋ ์ ์ ๊ธฐ์ตํ ๊ฐ์น๊ฐ ์์ผ๋ฏ๋ก ์ด์์๋ฅผ ํ๋ช ํ๊ฒ ์ ํํ์ญ์์ค.
PostgreSQL์ ๋ํด ๊ฐ์ฅ ์ธ๊ธฐ ์๋ ์ธ ๊ฐ์ง Kubernetes ์ฐ์ฐ์๋ฅผ ๊ฒํ ํ ํ ์ฐ๋ฆฌ๋ Zalando์ ํ๋ก์ ํธ๋ฅผ ์ ํํ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๋ ๋ช ๊ฐ์ง ์ด๋ ค์์ ๊ทน๋ณตํด์ผ ํ์ง๋ง ๊ฒฐ๊ณผ๋ ์ ๋ง ๋ง์กฑ์ค๋ฌ์ ์ต๋๋ค. ๊ทธ๋์ ์ฐ๋ฆฌ๋ ์ด ๊ฒฝํ์ ๋ค๋ฅธ PgSQL ์ค์น๋ก ํ์ฅํ ๊ณํ์ ๋๋ค. ์ ์ฌํ ์๋ฃจ์ ์ ์ฌ์ฉํด ๋ณธ ๊ฒฝํ์ด ์๋ค๋ฉด ๋๊ธ์ ํตํด ์์ธํ ๋ด์ฉ์ ์๋ ค๋๋ฆฌ๊ฒ ์ต๋๋ค!
PS
๋ธ๋ก๊ทธ์์๋ ์ฝ์ด๋ณด์ธ์.
- ยซ
๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฐ Kubernetes(๊ฐ์ ๋ฐ ๋์์ ๋ณด๊ณ ์) "; - ยซ
Postgres ํ์์ผ #5: PostgreSQL ๋ฐ Kubernetes. CI/CD. ํ ์คํธ ์๋ํ "; - ยซ
K8s์ Redis ์ด์์์ ๋ํ ์ด์ผ๊ธฐ์ ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ดํฐ๋ฅผ ๋ถ์ํ๊ธฐ ์ํ ์ ํธ๋ฆฌํฐ์ ๋ํ ๊ฐ๋ตํ ๊ฒํ ".
์ถ์ฒ : habr.com