ãŸããŸãå€ãã®å Žåã次ã®èŠæ±ã顧客ããå¯ããããŸãããAmazon RDSã®ããã«ããããããã£ãšå®ããããç§ãã¡ã¯ãããRDSã®ããã«æãã§ããŸãããã©ãã§ããã©ã®ã€ã³ãã©ã¹ãã©ã¯ãã£ã§ããããã®ãããªãããŒãžããœãªã¥ãŒã·ã§ã³ãKubernetesã«å®è£ ããããã«ãPostgreSQLã§æã人æ°ã®ãããªãã¬ãŒã¿ãŒïŒStolonãCrunchy Dataããã³Zalandoã®ãªãã¬ãŒã¿ãŒïŒã®çŸåšã®ç¶æ ã調ã¹ãŠãéžæããŸããã
ãã®èšäºã¯ãçè«çãªèŠ³ç¹ïŒãœãªã¥ãŒã·ã§ã³ã®ã¬ãã¥ãŒïŒãšå®è·µçãªèŠ³ç¹ïŒäœãéžæãããäœãããããããã®ãïŒã®äž¡æ¹ããã®ç§ãã¡ã®çµéšã§ããããããæåã«ãRDSã®æœåšçãªä»£æ¿åã®äžè¬çãªèŠä»¶ã決å®ããŸããã...
RDSãšã¯
人ã ãRDSã«ã€ããŠè©±ããšããç§ãã¡ã®çµéšã§ã¯ããããã¯æ¬¡ã®ãããªãããŒãžãDBMSãµãŒãã¹ãæå³ããŸãã
- ç°¡åã«ã«ã¹ã¿ãã€ãºå¯èœã
- ã¹ãããã·ã§ãããæäœããŠã¹ãããã·ã§ããããå埩ããæ©èœããããŸãïŒã§ããã°PITRãµããŒãã䜿çšïŒã
- ãã¹ã¿ãŒã¹ã¬ãŒãããããžãäœæã§ããŸãã
- æ¡åŒµæ©èœã®è±å¯ãªãªã¹ãããããŸãã
- ç£æ»ãšãŠãŒã¶ãŒ/ã¢ã¯ã»ã¹ç®¡çãæäŸããŸãã
äžè¬çã«èšã£ãŠãã¿ã¹ã¯ã®å®è£ ãžã®ã¢ãããŒãã¯éåžžã«ç°ãªãå¯èœæ§ããããŸãããæ¡ä»¶ä»ãAnsibleã䜿çšãããã¹ã¯ç§ãã¡ã®è¿ãã«ã¯ãããŸãããïŒ2GISã®ååã¯ããPostgresã«åºã¥ããŠãã§ã€ã«ãªãŒããŒã¯ã©ã¹ã¿ãŒãè¿ éã«å±éããããã®ããŒã«ããäœæããããšããçµæãåæ§ã®çµè«ã«éããŸãããïŒ
ãªãã¬ãŒã¿ãŒã¯ãKubernetesãšã³ã·ã¹ãã ã§ãã®ãããªåé¡ã解決ããããã®äžè¬çã«åãå ¥ããããŠããã¢ãããŒãã§ããKuberneteså ã§å®è¡ãããŠããããŒã¿ããŒã¹ã«é¢é£ãããããã®è©³çŽ°ã¯ãFlantæè¡éšéã«ãã£ãŠãã§ã«äŒããããŠããŸããdistolã圌ã®ã¬ããŒãã®1ã€ã§ã
泚æïŒç°¡åãªæŒç®åããã°ããäœæããã«ã¯ããªãŒãã³ãœãŒã¹ã®ã·ã§ã«æŒç®åãŠãŒãã£ãªãã£ã«æ³šæãæãããšããå§ãããŸããããã䜿çšãããšãGoã®ç¥èããªããŠããããå®è¡ã§ããŸãããBashãPythonãªã©ã®sysadminã«éŠŽæã¿ã®ããæ¹æ³ã§å®è¡ã§ããŸãã
PostgreSQLã«ã¯ããã€ãã®äººæ°ã®ããK8sæŒç®åããããŸãã
- ã¹ããã³;
- ã«ãªã«ãªããŒã¿PostgreSQLãªãã¬ãŒã¿ãŒ;
- ZalandoPostgresãªãã¬ãŒã¿ãŒã
ãããã詳ããèŠãŠã¿ãŸãããã
ãªãã¬ãŒã¿ãŒã®éžæ
ãã§ã«äžã§è¿°ã¹ãéèŠãªæ©èœã«å ããŠãKubernetesã®ã€ã³ãã©ã¹ãã©ã¯ãã£éçšãšã³ãžãã¢ãšããŠãç§ãã¡ã¯ãªãã¬ãŒã¿ãŒãã次ã®ããšãæåŸ ããŠããŸããã
- Gitããã³ã«ã¹ã¿ã ãªãœãŒã¹ãããããã€ããŸãã
- ãããã®é芪åæ§ãµããŒãã
- ããŒãã¢ãã£ããã£ãŸãã¯ããŒãã»ã¬ã¯ã¿ã®ã€ã³ã¹ããŒã«ã
- 蚱容å€ã®èšå®;
- ãã¥ãŒãã³ã°ã®æ©äŒã®å©çšå¯èœæ§;
- ç解ã§ãããã¯ãããžãŒãããã«ã¯ã³ãã³ãã
åãã€ã³ãã®è©³çŽ°ã«ç«ã¡å ¥ãããšãªãïŒèšäºå šäœãèªãã åŸã§ãããã«ã€ããŠè³ªåãããå Žåã¯ã³ã¡ã³ãã§å°ããŠãã ããïŒãç¹å®ã®ã¢ããªã±ãŒã·ã§ã³çšã«ãããã泚æããããã«ãã¯ã©ã¹ã¿ãŒããŒãã®ç¹æ®åã®ãã詳现ãªèª¬æã«ãããã®ãã©ã¡ãŒã¿ãŒãå¿ èŠã§ããããšã«äžè¬çã«æ³šæããŸãããã®ããã«ããŠãããã©ãŒãã³ã¹ãšã³ã¹ãã®æé©ãªãã©ã³ã¹ãå®çŸã§ããŸãã
ããŠãPostgreSQLãªãã¬ãŒã¿ãŒèªèº«ã®ããã«ã
1. Stolon
ã¹ããã³ã§ã€ã¿ãªã¢ã®äŒç€ŸSorint.labãããæ¢ã«è¿°ã¹ãå ±åã¯ãããDBMSã®ããã«äºæ¥è éã®ãã³ãããŒã¯ã®äžçš®ãšèããããŠãããã¯ããªãå€ããããžã§ã¯ãã§ããæåã®å ¬éãªãªãŒã¹ã¯2015幎11æã«è¡ãããŸããïŒïŒïŒãGitHubãªããžããªã«ã¯ãçŽ3000ã®ã¹ã¿ãŒãš40以äžã®è²¢ç®è ãããŸãã
確ãã«ãStolonã¯ããèããããã¢ãŒããã¯ãã£ã®çŽ æŽãããäŸã§ãã
ãã®ãªãã¬ãŒã¿ãŒã®ããã€ã¹ã®è©³çŽ°ã¯ãã¬ããŒããŸãã¯ãããžã§ã¯ãã®ããã¥ã¡ã³ãã«èšèŒãããŠããŸããäžè¬ã«ã圌ã¯èª¬æãããŠãããã¹ãŠãå®è¡ã§ãããšèšãã°ååã§ãïŒãã§ã€ã«ãªãŒããŒãééçãªã¯ã©ã€ã¢ã³ãã¢ã¯ã»ã¹ã®ããã®ãããã·ãããã¯ã¢ãã...ããã«ããããã·ã¯ãããã«æ€èšãããŠããä»ã®2ã€ã®ãœãªã¥ãŒã·ã§ã³ãšã¯ç°ãªãã1ã€ã®ãšã³ããã€ã³ããµãŒãã¹ãä»ããŠã¢ã¯ã»ã¹ãæäŸããŸãïŒã¢ã¯ã»ã¹ããããã®2ã€ã®ãµãŒãã¹ããããŸãïŒããŒã¹ïŒã
ãã ããStolonã«ã¯ã«ã¹ã¿ã ãªãœãŒã¹ããªããããããããã±ãŒãã®ããã«ãç°¡åãã€è¿ éã«Kubernetesã§DBMSã€ã³ã¹ã¿ã³ã¹ãäœæãããããªæ¹æ³ã§å±éããããšã¯ã§ããŸããã管çã¯ãŠãŒãã£ãªãã£
stolonctl
ãå±éããã«ã ãã£ãŒããä»ããŠå®è¡ããããŠãŒã¶ãŒèšå®ã¯ConfigMapã§å®çŸ©ãããŸãã
äžæ¹ã§ã¯ããªãã¬ãŒã¿ãŒã¯ããŸããªãã¬ãŒã¿ãŒã§ã¯ãªãããšãããããŸãïŒçµå±ã®ãšãããCRDã䜿çšããŠããŸããïŒããããäžæ¹ã§ãããã¯ããªãã奜ããªããã«K8sã®ãªãœãŒã¹ãã«ã¹ã¿ãã€ãºããããšãå¯èœã«ããæè»ãªã·ã¹ãã ã§ãã
èŠçŽãããšãç§ãã¡å人ãšããŠã¯ãããŒã¿ããŒã¹ããšã«åå¥ã®ãã£ãŒããäœæããããšã¯æé©ã§ã¯ãªãããã«æãããŸããããããã£ãŠãç§ãã¡ã¯ä»£æ¿æ¡ãæ¢ãå§ããŸããã
2.ã«ãªã«ãªããŒã¿PostgreSQLãªãã¬ãŒã¿ãŒ
è¥ãã¢ã¡ãªã«äººã®ã¹ã¿ãŒãã¢ããã§ããCrunchyDataã®ãªãã¬ãŒã¿ãŒã¯ãè«ççãªä»£æ¿æ段ã®ããã«èŠããŸããããã®å ¬éã®æŽå²ã¯2017幎3æã®æåã®ãªãªãŒã¹ããå§ãŸãããã以æ¥ãGitHubãªããžããªã¯1300ããããã«äžåãæãš50以äžã®è²¢ç®è ãåãå ¥ããŠããŸããææ°ã®9æã®ãªãªãŒã¹ã¯ãKubernetes 1.15-1.18ãOpenShift 3.11以éããã³4.4以éãGKEããã³VMware Enterprise PKS1.3以éã§ãã¹ããããŠããŸãã
Crunchy Data PostgreSQL Operatorã¢ãŒããã¯ãã£ã¯ã次ã®èŠä»¶ãæºãããŠããŸãã
管çã¯ãŠãŒãã£ãªãã£ãä»ããŠè¡ãããŸãã
pgo
ãKubernetesã®ã«ã¹ã¿ã ãªãœãŒã¹ãçæãããŸãããããã£ãŠããªãã¬ãŒã¿ãŒã¯æœåšçãªãŠãŒã¶ãŒãšããŠç§ãã¡ãåã°ããŸããïŒ
- CRDãä»ããå¶åŸ¡ããããŸãã
- 䟿å©ãªãŠãŒã¶ãŒç®¡çïŒãããCRDçµç±ïŒã
- Crunchy Data Container Suiteã®ä»ã®ã³ã³ããŒãã³ããšã®çµ±å-PostgreSQLã³ã³ããã€ã¡ãŒãžãšãããæäœããããã®ãŠãŒãã£ãªãã£ïŒpgBackRestãpgAuditãcontribæ¡åŒµæ©èœãªã©ãå«ãïŒã®ç¹æ®ãªã³ã¬ã¯ã·ã§ã³ã
ãã ããCrunchy DataããæŒç®åã®äœ¿çšãéå§ããããšãããšãããã€ãã®åé¡ãæããã«ãªããŸããã
- 蚱容ã®å¯èœæ§ã¯ãããŸããã§ãã-nodeSelectorã®ã¿ãæäŸãããŸãã
- ã¹ããŒããã«ã¢ããªã±ãŒã·ã§ã³ããããã€ããã«ãããããããäœæãããããã¯ãããã€ã¡ã³ãã®äžéšã§ãããStatefulSetsãšã¯ç°ãªããDeploymentsã¯ãã£ã¹ã¯ãäœæã§ããŸããã
æåŸã®æ¬ ç¹ã¯ããããªç¬éã«ã€ãªãããŸãããã¹ãç°å¢ã§ã¯ã1ã€ã®ããŒã«ã«ã¹ãã¬ãŒãžãã£ã¹ã¯ã§3ã€ã®ã¬ããªã«ãå®è¡ã§ããŸããããã®çµæããªãã¬ãŒã¿ãŒã¯3ã€ã®ã¬ããªã«ãæ©èœããŠãããšå ±åããŸããïŒãã ããããã§ã¯ãããŸããã§ããïŒã
ãã®ãªãã¬ãŒã¿ãŒã®ãã1ã€ã®ç¹åŸŽã¯ãããŸããŸãªè£å©ã·ã¹ãã ãšã®æ¢è£œã®çµ±åã§ããããšãã°ãpgAdminãšpgBounceãã€ã³ã¹ããŒã«ããã®ã¯ç°¡åã§ãããã¥ã¡ã³ãã«ã¯äºåèšå®ãããGrafanaãšPrometheusãå«ãŸããŠããŸããæè¿ã®ãªãªãŒã¹4.5.0- beta1ã¯ãpgMonitorãããžã§ã¯ããšã®çµ±åãæ¹åãããããšãåå¥ã«ç€ºããŠããŸããããã«ããããªãã¬ãŒã¿ãŒã¯ãPgSQLã®ã¡ããªãã¯ãããã«èŠèŠçã«èŠèŠåã§ããŸãã
ããããçæãããKubernetesãªãœãŒã¹ã®å¥åŠãªéžæã«ãããå¥ã®è§£æ±ºçãèŠã€ããããšã«ãªããŸããã
3. ZalandoPostgresãªãã¬ãŒã¿ãŒ
ç§ãã¡ã¯é·ãéZalandoã®è£œåãç¥ã£ãŠããïŒç§ãã¡ã¯Zaleniumã䜿çšããçµéšãæã£ãŠãããšãåœç¶ã®ããšãªãããæã ã¯è©ŠããŠã¿ãŸããPatroniã- PostgreSQLã®ããã®åœŒãã®äººæ°ã®HAãœãªã¥ãŒã·ã§ã³ããã®äœè ã®1人ã§ããAlekseyKlyukinããPostgres-TuesdayïŒ5ã«Postgres Operatorãäœæããããã®å瀟ã®ã¢ãããŒãã«ã€ããŠè©±ããç§ãã¡ã¯ãããæ°ã«å ¥ããŸããã ããã¯ãèšäºã§èª¬æãããŠããæãè¥ããœãªã¥ãŒã·ã§ã³ã§ããæåã®ãªãªãŒã¹ã¯2018幎8æã«è¡ãããŸããããã ããæ£åŒãªãªãªãŒã¹ã®æ°ãå°ãªãã«ããããããããããžã§ã¯ãã¯é·ãéã®ããæ©ãã§ããŸãããGitHubã«1300以äžã®æããããè²¢ç®è ã®æ倧æ°ïŒ70以äžïŒã§ãCrunchyDataã®ãœãªã¥ãŒã·ã§ã³ã®äººæ°ããã§ã«äžåã£ãŠããŸãã ãã®ãªãã¬ãŒã¿ãŒã®å éšã§ã¯ãå®çžŸã®ãããœãªã¥ãŒã·ã§ã³ã䜿çšãããŸãã
- å¶åŸ¡ã®ããã®ãããããšã¹ããã
- WAL-E-ããã¯ã¢ããçšã
- PgBouncer-æ¥ç¶ããŒã«ãšããŠã
Zalandoã®ãªãã¬ãŒã¿ãŒã¢ãŒããã¯ãã£ã¯æ¬¡ã®ããã«è¡šç€ºãããŸã
ããªãã¬ãŒã¿ãŒã¯ã«ã¹ã¿ã ãªãœãŒã¹ãéããŠå®å šã«ç®¡çãããã³ã³ãããŒããStatefulSetãèªåçã«äœæããŸããããã¯ããããã«ããŸããŸãªãµã€ãã«ãŒãè¿œå ããããšã§ã«ã¹ã¿ãã€ãºã§ããŸããCrunchy Dataã®ãªãã¬ãŒã¿ãŒãšæ¯èŒãããšãããã¯ãã¹ãŠéèŠãªãã©ã¹ã§ãã
æ€èšäžã®3ã€ã®ãªãã·ã§ã³ããéžæããã®ã¯Zalandoã®ãœãªã¥ãŒã·ã§ã³ã§ãã£ãããããã®æ©èœã®è©³çŽ°ããã¢ããªã±ãŒã·ã§ã³ã®å®è·µãšãšãã«ä»¥äžã«ç€ºããŸãã
Zalandoã®Postgresãªãã¬ãŒã¿ãŒã§ç·Žç¿ãã
ãªãã¬ãŒã¿ãŒã®ãããã€ã¯éåžžã«ç°¡åã§ããGitHubããçŸåšã®ãªãªãŒã¹ãããŠã³ããŒãããmanifestsãã£ã¬ã¯ããªããYAMLãã¡ã€ã«ãé©çšããã ãã§ãããŸãã¯ãOperatorHubã䜿çšããããšãã§ããŸãã
ã€ã³ã¹ããŒã«åŸããã°ãšããã¯ã¢ããçšã®ã¹ãã¬ãŒãžã®èšå®ã«ã€ããŠå¿é ããå¿ èŠããããŸããããã¯
postgres-operator
ãã¹ããŒãã¡ã³ããã€ã³ã¹ããŒã«ããåååã®ConfigMapãä»ããŠè¡ãããŸãããªããžããªãæ§æããããæåã®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
ãã®ãããã§ã¹ãã¯ãpostgres_exporterã®åœ¢åŒã®ãµã€ãã«ãŒãåãã3ã€ã®ã€ã³ã¹ã¿ã³ã¹ã®ã¯ã©ã¹ã¿ãŒããããã€ããããããã¢ããªã±ãŒã·ã§ã³ã¡ããªãã¯ãååŸããŸããã芧ã®ãšããããã¹ãŠãéåžžã«åçŽã§ãããå¿ èŠã«å¿ããŠãæåéãç¡å¶éã®æ°ã®ã¯ã©ã¹ã¿ãŒãäœæã§ããŸããWeb管çããã«ïŒpostgres-operator-uiïŒ
ã«æ³šæãæã䟡å€ããããŸãããªãã¬ãŒã¿ãŒã«ä»å±ããŠãããã¯ã©ã¹ã¿ãŒãäœæããã³åé€ãããããªãã¬ãŒã¿ãŒãäœæããããã¯ã¢ãããæäœãããã§ããŸããPostgreSQLã¯ã©ã¹ã¿ãŒãªã¹ãã®ããã¯ã¢ãã管ç ãã1ã€ã®èå³æ·±ãæ©èœã¯ãTeamsAPIã®ãµããŒãã§ãããã®ã¡ã«ããºã ã«ãããPostgreSQLã§ããŒã«ãèªåçã«äœæãããŸã
çµæã®ãŠãŒã¶ãŒåã®ãªã¹ãã«åºã¥ããŸãããã®åŸãAPIã䜿çšãããšã圹å²ãèªåçã«äœæããããŠãŒã¶ãŒã®ãªã¹ããè¿ãããšãã§ããŸãã
åé¡ãšè§£æ±ºç
ãã ããæŒââç®åã䜿çšãããšãããã«ããã€ãã®é倧ãªæ¬ ç¹ãæããã«ãªããŸããã
- nodeSelectorã®ãµããŒãã®æ¬ åŠã
- ããã¯ã¢ãããç¡å¹ã«ã§ããªãã
- ããŒã¿ããŒã¹äœææ©èœã䜿çšããå Žåãããã©ã«ãã®æš©éã¯è¡šç€ºãããŸããã
- å®æçã«ååãªããã¥ã¡ã³ãããªãããå€ããªã£ãŠããŸãã
幞ããªããšã«ããããã®å€ãã¯è§£æ±ºã§ããŸããæåŸããå§ããŸããã-ããã¥ã¡ã³ãã®åé¡ã
ã»ãšãã©ã®å Žåãããã¯ã¢ãããç»é²ããæ¹æ³ãšãããã¯ã¢ãããã±ãããOperatorUIã«æ¥ç¶ããæ¹æ³ãå¿ ãããæ確ã§ã¯ãªããšããäºå®ã«ééããã§ããããããã¥ã¡ã³ãã§ã¯ããã«ã€ããŠèª¬æããŠããŸãããå®éã®èª¬æã¯PRã«ãããŸãã
- ããªãã¯ç§å¯ãäœãå¿ èŠããããŸãã
-
pod_environment_secret_name
CRD ConfigMap ( , ).
ããããçµå±ã®ãšãããããã¯çŸåšäžå¯èœã§ãããã®ãããç¬èªã®ããŒãžã§ã³ã®ãªãã¬ãŒã¿ãŒãšããã€ãã®è¿œå ã®ãµãŒãããŒãã£éçºãçµã¿åãããŸããã詳现ã«ã€ããŠã¯ã以äžãåç §ããŠãã ããã
ããã¯ã¢ããã®ãã©ã¡ãŒã¿ãŒãã€ãŸã
wal_s3_bucket
AWS S3ã®ã¢ã¯ã»ã¹ããŒããªãã¬ãŒã¿ãŒã«æž¡ããšããªãã¬ãŒã¿ãŒã¯ãã¹ãŠãããã¯ã¢ããããŸããå®çšŒåäžã®ããŒã¹ã ãã§ãªããã¹ããŒãžã³ã°ãããã¯ã¢ããããŸããããã¯ç§ãã¡ã«åããŸããã§ããã
æŒç®åã䜿çšããå Žåã®PgSQLã®åºæ¬çãªDockerã©ãããŒã§ããSpiloãžã®ãã©ã¡ãŒã¿ãŒã®èª¬æã§ã¯ããã©ã¡ãŒã¿ãŒã
WAL_S3_BUCKET
空ã«æž¡ããŠããã¯ã¢ãããç¡å¹ã«ã§ããããšãããããŸãããããã«ãç§ãã¡ã®å€§ããªåã³ãšããŠãæ¢è£œã®PRãèŠã€ãããããã«ãã©ãŒã¯ã«åãå
¥ããŸãããããã§ãenableWALArchiving: false
PostgreSQLã¯ã©ã¹ã¿ãŒããªãœãŒã¹ã«è¿œå ããã ãã§ååã§ãã
ã¯ãã2ã€ã®ãªãã¬ãŒã¿ãŒãå®è¡ããããšã§å¥ã®æ¹æ³ã§ãããè¡ãæ©äŒããããŸããã1ã€ã¯ã¹ããŒãžã³ã°ïŒããã¯ã¢ãããªãïŒçšã§ããã1ã€ã¯æ¬çªçšã§ããããããããã§ç§ãã¡ã¯1ã€ã§ããŸãããããšãã§ããŸããã
ããŠãS3ã®ã¢ã¯ã»ã¹ãããŒã¿ããŒã¹ã«è»¢éããæ¹æ³ãåŠã³ãããã¯ã¢ãããã¹ãã¬ãŒãžã«å ¥ãå§ããŸããããªãã¬ãŒã¿ãŒUIã§ããã¯ã¢ããããŒãžãæ©èœãããæ¹æ³ã¯ïŒ
ãªãã¬ãŒã¿ãŒUIã§ã¯ã次ã®3ã€ã®å€æ°ãè¿œå ããå¿ èŠããããŸãã
-
SPILO_S3_BACKUP_BUCKET
-
AWS_ACCESS_KEY_ID
-
AWS_SECRET_ACCESS_KEY
ãã®åŸãããã¯ã¢ããã®ç®¡çãå©çšå¯èœã«ãªããŸããããã«ãããã¹ããŒãžã³ã°ã®äœæ¥ãç°¡çŽ åãããè¿œå ã®ã¹ã¯ãªãããªãã§æ¬çªç°å¢ããã¹ã©ã€ã¹ãé ä¿¡ã§ããããã«ãªããŸãã
Teams APIã䜿çšãããªãã¬ãŒã¿ãŒããŒã«ã䜿çšããŠããŒã¹ãšããŒã«ãäœæããå¹ åºãæ©äŒããã1ã€ã®å©ç¹ãšããŠæããããŸããããã ããäœæãããããŒã«ã«ã¯ããã©ã«ãã®æš©éããããŸããã§ããããããã£ãŠãèªã¿åãæš©éãæã€ãŠãŒã¶ãŒã¯æ°ããããŒãã«ãèªã¿åãããšãã§ããŸããã§ããã
äœæ ã§ããïŒã³ãŒãã«å¿ èŠãªãã®ãå«ãŸããŠããã«ãããããã
GRANT
ãããããåžžã«äœ¿çšããããšã¯éããŸããã 2ã€ã®æ¹æ³ããããŸãïŒsyncPreparedDatabases
ãšsyncDatabases
ã B syncPreparedDatabases
-ãšããäºå®ã«ãããããããpreparedDatabases
ããã«æ¡ä»¶ãããã»ã¯ã·ã§ã³ã«defaultRoles
ããdefaultUsers
ããŒã«ãäœæããããã«ãããã©ã«ãã®æš©éã¯é©çšãããŸããããããã®æš©å©ãèªåçã«é©çšãããããã«ãããããæºåäžã§ãã
ãããŠãç§ãã¡ã«é¢é£ããæ¹åã®æåŸã®ç¬éã¯ãäœæãããStatefulSetã«ããŒãã¢ãã£ããã£ãè¿œå ãããããã§ããç§ãã¡ã®ã¯ã©ã€ã¢ã³ãã¯ãã¹ãããã€ã³ã¹ã¿ã³ã¹ã䜿çšããŠã³ã¹ããåæžããããšã奜ãããšãå€ããããŒã¿ããŒã¹ãµãŒãã¹ããã¹ãããã¹ãã§ã¯ãªãããšã¯æããã§ãããã®åé¡ã¯èš±å®¹ç¯å²ã«ãã£ãŠè§£æ±ºã§ããŸãããããŒãã¢ãã£ããã£ã®ååšã¯å€ãã®èªä¿¡ãäžããŸãã
ã©ãããïŒ
äžèšã®åé¡ã解決ããçµæãPostgresOperatorãZalandoãããªããžããªã«ãã©ãŒã¯ããŸããããªããžããªã«ã¯ãã®ãããªäŸ¿å©ãªããããçµã¿èŸŒãŸããŠããŸãããŸãã䟿å®äžãDockerã€ã¡ãŒãžãã¢ã»ã³ãã«ããŸããã
ãã©ãŒã¯ãããPRãªã¹ãïŒ
- Dockerã§ãªãã¬ãŒã¿ãŒçšã®å®å šã§è»œéãªã€ã¡ãŒãžãæ§ç¯ããã
- ããã¯ã¢ãããç¡å¹ã«ãã;
- çŸåšã®k8sããŒãžã§ã³ã®ãªãœãŒã¹ããŒãžã§ã³ãæŽæ°ãã;
- ããŒãã¢ãã£ããã£ã®å®è£ ã
ã³ãã¥ããã£ããããã®PRããµããŒãããŠã次ã®ããŒãžã§ã³ã®ãªãã¬ãŒã¿ãŒïŒ1.6ïŒã§ã¢ããã¹ããªãŒã ã«ãªãããã«ãããšçŽ æŽãããã§ãããã
ããŒãã¹ïŒãããã¯ã·ã§ã³ç§»è¡ã®ãµã¯ã»ã¹ã¹ããŒãªãŒ
Patroniã䜿çšããŠããå Žåã¯ãæå°éã®ããŠã³ã¿ã€ã ã§ã©ã€ããããã¯ã·ã§ã³ããªãã¬ãŒã¿ãŒã«ç§»è¡ã§ããŸãã
Spiloã䜿çšãããšãPgSQLãã€ããªãã°ãæåã«S3ã«ä¿åããã次ã«ã¬ããªã«ã«ãã£ãŠããŠã³ããŒãããããšãã«ãWal-Eã䜿çšããŠS3ã¹ãã¬ãŒãžãä»ããŠã¹ã¿ã³ãã€ã¯ã©ã¹ã¿ãŒãäœæã§ããŸããããããå€ãã€ã³ãã©ã¹ãã©ã¯ãã£ã«Wal-Eããªãå Žåã¯ã©ããªãã§ããããããã®åé¡ã®è§£æ±ºçã¯ãHabréã§ãã§ã«ææ¡ãããŠããŸãã
PostgreSQLã®è«çã¬ããªã±ãŒã·ã§ã³ã圹ã«ç«ã¡ãŸãããã ããèšç»ã倱æããããããããªã±ãŒã·ã§ã³ãšãµãã¹ã¯ãªãã·ã§ã³ã®äœææ¹æ³ã®è©³çŽ°ã«ã€ããŠã¯èª¬æããŸããã
äºå®ãããŒã¿ããŒã¹ã«ã¯æ°çŸäžè¡ã®ããŒããããããŒãã«ãããã€ããããããã«ããããã¯çµ¶ããè£å ããã³åé€ãããŠããŸãããã·ã³ãã«ãªãµãã¹ã¯ãªãã·ã§ã³ä»ã
copy_data
ãæ°ããã¬ããªã«ããã¹ã¿ãŒãããã¹ãŠã®ã³ã³ãã³ããã³ããŒãããšããããã¯åã«ãã¹ã¿ãŒã«è¿œãã€ããŠããªããã³ã³ãã³ãã®ã³ããŒã¯1é±éæ©èœããŸãããããã¹ã¿ãŒã«è¿œãã€ãããšã¯ãããŸããã§ããããã®çµæãAvitoã®ååã«ããèšäºãåé¡ã®è§£æ±ºã«åœ¹ç«ã¡ãŸããpg_dump
ãã䜿çšããŠããŒã¿ã転éã§ããŸãããã®ã¢ã«ãŽãªãºã ã®ïŒãããã«å€æŽãããïŒããŒãžã§ã³ã«ã€ããŠèª¬æããŸãã
ã¢ã€ãã¢ã¯ãç¹å®ã®ã¬ããªã±ãŒã·ã§ã³ã¹ãããã«é¢é£ä»ãããããªããµãã¹ã¯ãªãã·ã§ã³ãäœæããŠããããã©ã³ã¶ã¯ã·ã§ã³çªå·ãä¿®æ£ã§ãããšããããšã§ããçç£äœæ¥çšã®ã¬ããªã«ããããŸãããã¬ããªã«ã¯äžè²«ãããã³ããäœæãããã¹ã¿ãŒããå€æŽãåãåãç¶ããã®ã«åœ¹ç«ã€ãããããã¯éèŠã§ãã
移è¡ããã»ã¹ã説æããåŸç¶ã®ã³ãã³ãã§ã¯ã次ã®ãã¹ãè¡šèšã䜿çšãããŸãã
- ãã¹ã¿ãŒ-ãœãŒã¹ãµãŒããŒ;
- Replica1-å€ããããã¯ã·ã§ã³ã§ã®ã¹ããªãŒãã³ã°ã¬ããªã«ã
- Replica2ã¯æ°ããè«çã¬ããªã«ã§ãã
移è¡èšç»
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ã§æã人æ°ã®ãã3ã€ã®Kubernetesãªãã¬ãŒã¿ãŒã確èªããåŸãZalandoã®ãããžã§ã¯ããéžæããŸããããããŠãç§ã¯ããã«é¢ããç¹å®ã®å°é£ãå æããªããã°ãªããŸããã§ããããçµæã¯æ¬åœã«æºè¶³ããŠããã®ã§ããã®çµéšãä»ã®ããã€ãã®PgSQLã€ã³ã¹ããŒã«ã«æ¡åŒµããäºå®ã§ããåæ§ã®ãœãªã¥ãŒã·ã§ã³ã䜿çšããçµéšãããå Žåã¯ãã³ã¡ã³ãã§è©³çŽ°ã確èªã§ããŸãã
PS
ç§ãã¡ã®ããã°ãèªãã§ãã ããïŒ