ืกืงื™ืจื” ืงืฆืจื” ืฉืœ ืžืคืขื™ืœื™ PostgreSQL ืขื‘ื•ืจ Kubernetes, ื”ื‘ื—ื™ืจื” ื•ื”ื ื™ืกื™ื•ืŸ ืฉืœื ื•

ืกืงื™ืจื” ืงืฆืจื” ืฉืœ ืžืคืขื™ืœื™ PostgreSQL ืขื‘ื•ืจ Kubernetes, ื”ื‘ื—ื™ืจื” ื•ื”ื ื™ืกื™ื•ืŸ ืฉืœื ื•

ื™ื•ืชืจ ื•ื™ื•ืชืจ, ืœืงื•ื—ื•ืช ืžืงื‘ืœื™ื ืืช ื”ื‘ืงืฉื•ืช ื”ื‘ืื•ืช: "ืื ื—ื ื• ืจื•ืฆื™ื ืืช ื–ื” ื›ืžื• Amazon RDS, ืื‘ืœ ื–ื•ืœ ื™ื•ืชืจ"; "ืื ื—ื ื• ืจื•ืฆื™ื ืืช ื–ื” ื›ืžื• RDS, ืื‘ืœ ื‘ื›ืœ ืžืงื•ื, ื‘ื›ืœ ืชืฉืชื™ืช." ื›ื“ื™ ืœื™ื™ืฉื ืคืชืจื•ืŸ ืžื ื•ื”ืœ ื›ื–ื” ืขืœ Kubernetes, ื‘ื“ืงื ื• ืืช ื”ืžืฆื‘ ื”ื ื•ื›ื—ื™ ืฉืœ ื”ืžืคืขื™ืœื™ื ื”ืคื•ืคื•ืœืจื™ื™ื ื‘ื™ื•ืชืจ ืขื‘ื•ืจ PostgreSQL (Solon, ืžืคืขื™ืœื™ื ืž-Crunchy Data ื•-Zalando) ื•ื‘ื—ืจื ื•.

ืžืืžืจ ื–ื” ื”ื•ื ื”ื ื™ืกื™ื•ืŸ ืฉืฆื‘ืจื ื• ื”ืŸ ืžื ืงื•ื“ืช ืžื‘ื˜ ืชื™ืื•ืจื˜ื™ืช (ืกืงื™ืจืช ืคืชืจื•ื ื•ืช) ื•ื”ืŸ ืžื”ืฆื“ ื”ืžืขืฉื™ (ืžื” ื ื‘ื—ืจ ื•ืžื” ื™ืฆื ืžื–ื”). ืื‘ืœ ืจืืฉื™ืช, ื‘ื•ืื• ื ืงื‘ืข ืžื”ืŸ ื”ื“ืจื™ืฉื•ืช ื”ื›ืœืœื™ื•ืช ืœืชื—ืœื™ืฃ ืคื•ื˜ื ืฆื™ืืœื™ ืœ-RDS...

ืžื” ื–ื” RDS

ื›ืฉืื ืฉื™ื ืžื“ื‘ืจื™ื ืขืœ RDS, ืžื ื™ืกื™ื•ื ื ื•, ื”ื ืžืชื›ื•ื•ื ื™ื ืœืฉื™ืจื•ืช DBMS ืžื ื•ื”ืœ ืฉ:

  1. ืงืœ ืœื”ื’ื“ืจื”;
  2. ื™ืฉ ืืช ื”ื™ื›ื•ืœืช ืœืขื‘ื•ื“ ืขื ืฆื™ืœื•ืžื™ ืžืฆื‘ ื•ืœื”ืชืื•ืฉืฉ ืžื”ื (ืจืฆื•ื™ ืขื ืชืžื™ื›ื” PITR);
  3. ืžืืคืฉืจ ืœืš ืœื™ืฆื•ืจ ื˜ื•ืคื•ืœื•ื’ื™ื•ืช ืžืืกื˜ืจ-ืขื‘ื“;
  4. ื™ืฉ ืจืฉื™ืžื” ืขืฉื™ืจื” ืฉืœ ื”ืจื—ื‘ื•ืช;
  5. ืžืกืคืง ื‘ื™ืงื•ืจืช ื•ื ื™ื”ื•ืœ ืžืฉืชืžืฉื™ื/ื’ื™ืฉื”.

ื‘ืื•ืคืŸ ื›ืœืœื™, ื”ื’ื™ืฉื•ืช ืœื™ื™ืฉื•ื ื”ืžืฉื™ืžื” ืฉืขืœ ื”ืคืจืง ืขืฉื•ื™ื•ืช ืœื”ื™ื•ืช ืฉื•ื ื•ืช ืžืื•ื“, ืื‘ืœ ื”ื“ืจืš ืขื Ansible ืžื•ืชื ื™ืช ืื™ื ื” ืงืจื•ื‘ื” ืืœื™ื ื•. (ืขืžื™ืชื™ื ืž-2GIS ื”ื’ื™ืขื• ืœืžืกืงื ื” ื“ื•ืžื” ื›ืชื•ืฆืื” ืžื›ืš ื”ื ื™ืกื™ื•ืŸ ืฉืœื• ืฆื•ืจ "ื›ืœื™ ืœืคืจื™ืกื” ืžื”ื™ืจื” ืฉืœ ืืฉื›ื•ืœ ื›ืฉืœ ืžื‘ื•ืกืก Postgres."

ืžืคืขื™ืœื™ื ื”ื ื’ื™ืฉื” ื ืคื•ืฆื” ืœืคืชืจื•ืŸ ื‘ืขื™ื•ืช ื“ื•ืžื•ืช ื‘ืžืขืจื›ืช ื”ืืงื•ืœื•ื’ื™ืช ืฉืœ Kubernetes. ื”ืžื ื”ืœ ื”ื˜ื›ื ื™ ืฉืœ "ืคืœื ื˜ื”" ื›ื‘ืจ ื“ื™ื‘ืจ ืขืœื™ื”ื ื‘ื™ืชืจ ืคื™ืจื•ื˜ ื‘ื™ื—ืก ืœืžืื’ืจื™ ืžื™ื“ืข ืฉื”ื•ืฉืงื• ื‘ืชื•ืš Kubernetes. ื“ื™ืกื˜ื•ืœื‘ืชื•ืš ืื—ื“ ื”ื“ื™ื•ื•ื—ื™ื ืฉืœื•.

NB: ื›ื“ื™ ืœื™ืฆื•ืจ ื‘ืžื”ื™ืจื•ืช ืื•ืคืจื˜ื•ืจื™ื ืคืฉื•ื˜ื™ื, ืื ื• ืžืžืœื™ืฆื™ื ืœืฉื™ื ืœื‘ ืœื›ืœื™ ื”ืฉื™ืจื•ืช ืฉืœื ื• ื‘ืงื•ื“ ืคืชื•ื— ืžืคืขื™ืœ ืžืขื˜ืคืช. ื‘ืืžืฆืขื•ืชื• ืชื•ื›ืœื• ืœืขืฉื•ืช ื–ืืช ืœืœื ื™ื“ื™ืขืช Go, ืืš ื‘ื“ืจื›ื™ื ื”ืžื•ื›ืจื•ืช ื™ื•ืชืจ ืœืžื ื”ืœื™ ืžืขืจื›ืช: ื‘-Bash, Python ื•ื›ื•'.

ื™ืฉื ื ืžืกืคืจ ืžืคืขื™ืœื™ K8s ืคื•ืคื•ืœืจื™ื™ื ืขื‘ื•ืจ PostgreSQL:

  • ืกื˜ื•ืœื•ืŸ;
  • ืื•ืคืจื˜ื•ืจ PostgreSQL ื ืชื•ื ื™ื ืคืจื™ื›ื™ื;
  • ืžืคืขื™ืœ Zalando Postgres.

ื‘ื•ืื• ื ืกืชื›ืœ ืขืœื™ื”ื ื™ื•ืชืจ ืžืงืจื•ื‘.

ื‘ื—ื™ืจืช ื”ืžืคืขื™ืœ

ื‘ื ื•ืกืฃ ืœืชื›ื•ื ื•ืช ื”ื—ืฉื•ื‘ื•ืช ืฉื›ื‘ืจ ืฆื•ื™ื ื• ืœืขื™ืœ, ืื ื• - ื›ืžื”ื ื“ืกื™ ืชืคืขื•ืœ ืชืฉืชื™ื•ืช Kubernetes - ืฆื™ืคื™ื ื• ื’ื ืžื”ืžืคืขื™ืœื™ื ื”ื‘ืื™ื:

  • ืคืจื™ืกื” ืž-Git ื•ืขื ืžืฉืื‘ื™ื ืžื•ืชืืžื™ื ืื™ืฉื™ืช;
  • ืชืžื™ื›ื” ื ื’ื“ ื–ื™ืงื” ืชืจืžื™ืœ;
  • ื”ืชืงื ืช ื–ื™ืงื” ืœืฆื•ืžืช ืื• ื‘ื•ืจืจ ื”ืฆื•ืžืช;
  • ื”ืชืงื ื” ืฉืœ ืกื•ื‘ืœื ื•ืช;
  • ื–ืžื™ื ื•ืช ื™ื›ื•ืœื•ืช ื›ื•ื•ื ื•ืŸ;
  • ื˜ื›ื ื•ืœื•ื’ื™ื•ืช ืžื•ื‘ื ื•ืช ื•ืืคื™ืœื• ืคืงื•ื“ื•ืช.

ืžื‘ืœื™ ืœื”ื™ื›ื ืก ืœืคืจื˜ื™ื ืขืœ ื›ืœ ืื—ืช ืžื”ื ืงื•ื“ื•ืช (ืฉืืœื• ื‘ื”ืขืจื•ืช ืื ืขื“ื™ื™ืŸ ื™ืฉ ืœื›ื ืฉืืœื•ืช ืœื’ื‘ื™ื”ืŸ ืœืื—ืจ ืงืจื™ืืช ื”ืžืืžืจ ื›ื•ืœื•), ืืฆื™ื™ืŸ ื‘ืื•ืคืŸ ื›ืœืœื™ ื›ื™ ื™ืฉ ืฆื•ืจืš ื‘ืคืจืžื˜ืจื™ื ืืœื• ืขืœ ืžื ืช ืœืชืืจ ื‘ืฆื•ืจื” ืžื“ื•ื™ืงืช ื™ื•ืชืจ ืืช ื”ื”ืชืžื—ื•ืช ืฉืœ ืฆืžืชื™ ืืฉื›ื•ืœื•ืช ืขืœ ืžื ืช ืœืืคืฉืจ ืœื”ื–ืžื™ืŸ ืื•ืชื ืขื‘ื•ืจ ื™ื™ืฉื•ืžื™ื ืกืคืฆื™ืคื™ื™ื. ื›ืš ื ื•ื›ืœ ืœื”ื’ื™ืข ืœืื™ื–ื•ืŸ ื”ืื•ืคื˜ื™ืžืœื™ ืžื‘ื—ื™ื ืช ื‘ื™ืฆื•ืขื™ื ื•ืขืœื•ืช.

ื›ืขืช ื ืขื‘ื•ืจ ืœืื•ืคืจื˜ื•ืจื™ื ืฉืœ PostgreSQL ืขืฆืžื.

1. ืกื˜ื•ืœื•ืŸ

ืกื˜ื•ืœื•ืŸ ืžื—ื‘ืจืช Sorint.lab ื”ืื™ื˜ืœืงื™ืช ื‘ ื“ื•ื— ืฉื›ื‘ืจ ื”ื•ื–ื›ืจ ื ื—ืฉื‘ ื›ืกื•ื’ ืฉืœ ืชืงืŸ ื‘ืงืจื‘ ืžืคืขื™ืœื™ DBMS. ื–ื”ื• ืคืจื•ื™ืงื˜ ื™ืฉืŸ ืœืžื“ื™: ื”ื”ื•ืฆืื” ื”ืคื•ืžื‘ื™ืช ื”ืจืืฉื•ื ื” ืฉืœื• ื”ืชืจื—ืฉื” ื‘ื ื•ื‘ืžื‘ืจ 2015(!), ื•ืžืื’ืจ GitHub ืžืชื’ืื” ื‘ื›ืžืขื˜ 3000 ื›ื•ื›ื‘ื™ื ื•ื‘ืžืขืœ 40 ืชื•ืจืžื™ื.

ื•ืื›ืŸ, ืกื˜ื•ืœื•ืŸ ื”ื•ื ื“ื•ื’ืžื” ืžืฆื•ื™ื ืช ืœืืจื›ื™ื˜ืงื˜ื•ืจื” ืžื”ื•ืจื”ืจืช:

ืกืงื™ืจื” ืงืฆืจื” ืฉืœ ืžืคืขื™ืœื™ PostgreSQL ืขื‘ื•ืจ Kubernetes, ื”ื‘ื—ื™ืจื” ื•ื”ื ื™ืกื™ื•ืŸ ืฉืœื ื•
ื ื™ืชืŸ ืœืžืฆื•ื ืืช ื”ืžื›ืฉื™ืจ ืฉืœ ืžืคืขื™ืœ ื–ื” ื‘ืคื™ืจื•ื˜ ื‘ื“ื•ื— ืื• ืชื™ืขื•ื“ ื”ืคืจื•ื™ืงื˜. ื‘ืื•ืคืŸ ื›ืœืœื™, ื“ื™ ืื ื ืืžืจ ืฉื”ื•ื ื™ื›ื•ืœ ืœืขืฉื•ืช ืืช ื›ืœ ืžื” ืฉืชื•ืืจ: failover, ืคืจื•ืงืกื™ ืœื’ื™ืฉื” ืฉืงื•ืคื” ืœืœืงื•ื—, ื’ื™ื‘ื•ื™ื™ื... ื™ืชืจื” ืžื›ืš, ืคืจื•ืงืกื™ ืžืกืคืงื™ื ื’ื™ืฉื” ื“ืจืš ืฉื™ืจื•ืช ื ืงื•ื“ืช ืงืฆื” ืื—ื“ - ื‘ื ื™ื’ื•ื“ ืœืฉื ื™ ื”ืคืชืจื•ื ื•ืช ื”ืื—ืจื™ื ื”ื ื™ื“ื•ื ื™ื ืœื”ืœืŸ (ืœื›ืœ ืื—ื“ ื™ืฉ ืฉื ื™ ืฉื™ืจื•ืชื™ื ืขื‘ื•ืจ ื‘ืกื™ืก ื’ื™ืฉื”).

ืขื ื–ืืช, ืกื˜ื•ืœื•ืŸ ืื™ืŸ ืžืฉืื‘ื™ื ืžื•ืชืืžื™ื ืื™ืฉื™ืช, ื•ื–ื• ื”ืกื™ื‘ื” ืฉืœื ื ื™ืชืŸ ืœืคืจื•ืก ืื•ืชื• ื‘ืฆื•ืจื” ื›ื–ื• ืฉื™ื”ื™ื” ืงืœ ื•ืžื”ื™ืจ - "ื›ืžื• ืœื—ืžื ื™ื•ืช ื—ืžื•ืช" - ืœื™ืฆื•ืจ ืžื•ืคืขื™ DBMS ื‘-Kubernetes. ื”ื ื™ื”ื•ืœ ืžืชื‘ืฆืข ื‘ืืžืฆืขื•ืช ื”ืฉื™ืจื•ืช stolonctl, ื”ืคืจื™ืกื” ื ืขืฉื™ืช ื‘ืืžืฆืขื•ืช ืชืจืฉื™ื Helm, ื•ืืœื” ืžื•ืชืืžื™ื ืื™ืฉื™ืช ืžื•ื’ื“ืจื™ื ื•ืžืฆื•ื™ื ื™ื ื‘-ConfigMap.

ืžืฆื“ ืื—ื“, ืžืกืชื‘ืจ ืฉื”ืžืคืขื™ืœ ื”ื•ื ืœื ื‘ืืžืช ืื•ืคืจื˜ื•ืจ (ื”ืจื™ ื”ื•ื ืœื ืžืฉืชืžืฉ ื‘-CRD). ืื‘ืœ ืžืฆื“ ืฉื ื™, ื–ื• ืžืขืจื›ืช ื’ืžื™ืฉื” ืฉืžืืคืฉืจืช ืœืš ืœื”ื’ื“ื™ืจ ืžืฉืื‘ื™ื ื‘-K8s ื›ืจืื•ืช ืขื™ื ื™ืš.

ืœืกื™ื›ื•ื, ืœื ื• ื‘ืื•ืคืŸ ืื™ืฉื™ ื–ื” ืœื ื ืจืื” ืื•ืคื˜ื™ืžืœื™ ืœื™ืฆื•ืจ ืชืจืฉื™ื ื ืคืจื“ ืœื›ืœ ื‘ืกื™ืก ื ืชื•ื ื™ื. ืœื›ืŸ, ื”ืชื—ืœื ื• ืœื—ืคืฉ ื—ืœื•ืคื•ืช.

2. ืžืคืขื™ืœ ื ืชื•ื ื™ื ืคืจื™ืš PostgreSQL

ืžืคืขื™ืœ ืžื‘ื™ืช Crunchy Data, ืกื˜ืืจื˜ืืค ืืžืจื™ืงืื™ ืฆืขื™ืจ, ื ืจืื” ื›ืžื• ืืœื˜ืจื ื˜ื™ื‘ื” ื”ื’ื™ื•ื ื™ืช. ื”ื”ื™ืกื˜ื•ืจื™ื” ื”ืฆื™ื‘ื•ืจื™ืช ืฉืœื• ืžืชื—ื™ืœื” ื‘ืžื”ื“ื•ืจื” ื”ืจืืฉื•ื ื” ื‘ืžืจืฅ 2017, ืžืื– ืžืื’ืจ GitHub ืงื™ื‘ืœ ืงืฆืช ืคื—ื•ืช ืž-1300 ื›ื•ื›ื‘ื™ื ื•-50+ ืชื•ืจืžื™ื. ื”ืžื”ื“ื•ืจื” ื”ืื—ืจื•ื ื” ืžืกืคื˜ืžื‘ืจ ื ื‘ื“ืงื” ืœืขื‘ื•ื“ ืขื Kubernetes 1.15-1.18, OpenShift 3.11+ ื•-4.4+, GKE ื•-VMware Enterprise PKS 1.3+.

ื”ืืจื›ื™ื˜ืงื˜ื•ืจื” ืฉืœ Crunchy Data PostgreSQL Operator ืขื•ืžื“ืช ื’ื ื‘ื“ืจื™ืฉื•ืช ื”ืžื•ืฆื”ืจื•ืช:

ืกืงื™ืจื” ืงืฆืจื” ืฉืœ ืžืคืขื™ืœื™ PostgreSQL ืขื‘ื•ืจ Kubernetes, ื”ื‘ื—ื™ืจื” ื•ื”ื ื™ืกื™ื•ืŸ ืฉืœื ื•

ื”ื ื™ื”ื•ืœ ืžืชืจื—ืฉ ื‘ืืžืฆืขื•ืช ื›ืœื™ ื”ืฉื™ืจื•ืช pgoืขื ื–ืืช, ื–ื” ื‘ืชื•ืจื• ืžื™ื™ืฆืจ ืžืฉืื‘ื™ื ืžื•ืชืืžื™ื ืื™ืฉื™ืช ืขื‘ื•ืจ Kubernetes. ืœื›ืŸ, ื”ืžืคืขื™ืœ ืฉื™ืžื— ืื•ืชื ื• ื›ืžืฉืชืžืฉื™ื ืคื•ื˜ื ืฆื™ืืœื™ื™ื:

  • ื™ืฉ ืฉืœื™ื˜ื” ื‘ืืžืฆืขื•ืช CRD;
  • ื ื™ื”ื•ืœ ื ื•ื— ืฉืœ ืžืฉืชืžืฉื™ื (ื’ื ื‘ืืžืฆืขื•ืช CRD);
  • ืื™ื ื˜ื’ืจืฆื™ื” ืขื ืจื›ื™ื‘ื™ื ืื—ืจื™ื ื—ื‘ื™ืœืช ืžื™ื›ืœ ื ืชื•ื ื™ื ืคืจื™ืš - ืื•ืกืฃ ืžื™ื•ื—ื“ ืฉืœ ืชืžื•ื ื•ืช ืžื™ื›ืœ ืขื‘ื•ืจ PostgreSQL ื•ื›ืœื™ ืขื–ืจ ืœืขื‘ื•ื“ื” ืื™ืชื” (ื›ื•ืœืœ pgBackRest, pgAudit, ื”ืจื—ื‘ื•ืช ืž-contrib ื•ื›ื•').

ืขื ื–ืืช, ื ื™ืกื™ื•ื ื•ืช ืœื”ืชื—ื™ืœ ืœื”ืฉืชืžืฉ ื‘ืžืคืขื™ืœ ืž-Crunchy Data ื—ืฉืคื• ืžืกืคืจ ื‘ืขื™ื•ืช:

  • ืœื ื”ื™ื™ืชื” ืืคืฉืจื•ืช ืœืกื‘ื•ืœื•ืช - ืจืง nodeSelector ืžืกื•ืคืง.
  • ื”ืชืจืžื™ืœื™ื ืฉื ื•ืฆืจื• ื”ื™ื• ื—ืœืง ืž-Deployment, ืœืžืจื•ืช ื”ืขื•ื‘ื“ื” ืฉืคืจืกื ื• ื™ื™ืฉื•ื ืกื˜ื˜ื™ืกื˜ื™. ืฉืœื ื›ืžื• StatefulSets, Deployments ืœื ื™ื›ื•ืœ ืœื™ืฆื•ืจ ื“ื™ืกืงื™ื.

ื”ื—ื™ืกืจื•ืŸ ื”ืื—ืจื•ืŸ ืžื•ื‘ื™ืœ ืœืจื’ืขื™ื ืžืฆื—ื™ืงื™ื: ื‘ืกื‘ื™ื‘ืช ื”ื‘ื“ื™ืงื” ื”ืฆืœื—ื ื• ืœื”ืจื™ืฅ 3 ื”ืขืชืงื™ื ืขื ื“ื™ืกืง ืื—ื“ ืื—ืกื•ืŸ ืžืงื•ืžื™, ืžื” ืฉื’ื•ืจื ืœืžืคืขื™ืœ ืœื“ื•ื•ื— ืฉ-3 ื”ืขืชืงื™ื ืคื•ืขืœื™ื (ืœืžืจื•ืช ืฉืœื ื”ื™ื•).

ืชื›ื•ื ื” ื ื•ืกืคืช ืฉืœ ืžืคืขื™ืœ ื–ื” ื”ื™ื ื”ืฉื™ืœื•ื‘ ื”ืžื•ื›ืŸ ืฉืœื• ืขื ืžืขืจื›ื•ืช ืขื–ืจ ืฉื•ื ื•ืช. ืœื“ื•ื’ืžื”, ืงืœ ืœื”ืชืงื™ืŸ ืืช pgAdmin ื•-pgBounce, ื•ื›ืŸ ื‘ ืชื™ืขื•ื“ Grafana ื•-Prometheus ืžื•ื’ื“ืจื™ื ืžืจืืฉ ื ื—ืฉื‘ื™ื. ืœืื—ืจื•ื ื” ื’ืจืกื” 4.5.0-beta1 ืฉื™ืœื•ื‘ ืžืฉื•ืคืจ ืขื ื”ืคืจื•ื™ืงื˜ ืžืฆื•ื™ืŸ ื‘ื ืคืจื“ pgMonitor, ืฉื‘ื–ื›ื•ืชื• ื”ืžืคืขื™ืœ ืžืฆื™ืข ื”ื“ืžื™ื” ื‘ืจื•ืจื” ืฉืœ ืžื“ื“ื™ PgSQL ืžื—ื•ืฅ ืœืงื•ืคืกื”.

ืขื ื–ืืช, ื”ื‘ื—ื™ืจื” ื”ืžื•ื–ืจื” ืฉืœ ืžืฉืื‘ื™ื ืฉื ื•ืฆืจื• ืขืœ ื™ื“ื™ Kubernetes ื”ื•ื‘ื™ืœื” ืื•ืชื ื• ืœืฆื•ืจืš ืœืžืฆื•ื ืคืชืจื•ืŸ ืื—ืจ.

3. ืžืคืขื™ืœ Zalando Postgres

ืื ื—ื ื• ืžื›ื™ืจื™ื ืืช ืžื•ืฆืจื™ Zalando ื›ื‘ืจ ื–ืžืŸ ืจื‘: ื™ืฉ ืœื ื• ื ื™ืกื™ื•ืŸ ื‘ืฉื™ืžื•ืฉ ื‘-Zelenium ื•ื›ืžื•ื‘ืŸ ืฉื ื™ืกื™ื ื• ืคื˜ืจื•ื ื™ ื”ื•ื ืคืชืจื•ืŸ ื”-HA ื”ืคื•ืคื•ืœืจื™ ืฉืœื”ื ืขื‘ื•ืจ PostgreSQL. ืขืœ ื’ื™ืฉืช ื”ื—ื‘ืจื” ืœื™ืฆื™ืจื” ืžืคืขื™ืœ Postgres ืื—ื“ ืžืžื—ื‘ืจื™ื•, ืืœื›ืกื™ื™ ืงืœื™ื•ืงื™ืŸ, ืืžืจ ื‘ืฉื™ื“ื•ืจ ืคื•ืกื˜ ื’ืจืก-ืฉืœื™ืฉื™ ืžืก' 5, ื•ืื”ื‘ื ื• ืืช ื–ื”.

ื–ื”ื• ื”ืคืชืจื•ืŸ ื”ืฆืขื™ืจ ื‘ื™ื•ืชืจ ืฉื ื“ื•ืŸ ื‘ืžืืžืจ: ื”ืฉื—ืจื•ืจ ื”ืจืืฉื•ืŸ ื”ืชืจื—ืฉ ื‘ืื•ื’ื•ืกื˜ 2018. ืขื ื–ืืช, ืœืžืจื•ืช ื”ืžืกืคืจ ื”ืงื˜ืŸ ืฉืœ ืžื”ื“ื•ืจื•ืช ืจืฉืžื™ื•ืช, ื”ืคืจื•ื™ืงื˜ ืขื‘ืจ ื›ื‘ืจืช ื“ืจืš, ื•ื›ื‘ืจ ืขื‘ืจ ื‘ืคื•ืคื•ืœืจื™ื•ืช ืืช ื”ืคืชืจื•ืŸ ืฉืœ Crunchy Data ืขื 1300+ ื›ื•ื›ื‘ื™ื ื‘- GitHub ื•ืžืกืคืจ ื”ืชื•ืจืžื™ื ื”ืžืงืกื™ืžืœื™ (70+).

"ืžืชื—ืช ืœืžื›ืกื” ื”ืžื ื•ืข" ืžืคืขื™ืœ ื–ื” ืžืฉืชืžืฉ ื‘ืคืชืจื•ื ื•ืช ืฉื ื‘ื“ืงื• ื‘ื–ืžืŸ:

  • ืคื˜ืจื•ื ื™ ื• ืกืคื™ืœื• ืœื ื”ื™ื’ื”,
  • WAL-E - ืœื’ื™ื‘ื•ื™ื™ื,
  • PgBouncer - ื›ื‘ืจื™ื›ืช ื—ื™ื‘ื•ืจ.

ื›ืš ืžื•ืฆื’ืช ืืจื›ื™ื˜ืงื˜ื•ืจืช ื”ืžืคืขื™ืœ ืž- Zalando:

ืกืงื™ืจื” ืงืฆืจื” ืฉืœ ืžืคืขื™ืœื™ PostgreSQL ืขื‘ื•ืจ Kubernetes, ื”ื‘ื—ื™ืจื” ื•ื”ื ื™ืกื™ื•ืŸ ืฉืœื ื•

ื”ืžืคืขื™ืœ ืžื ื•ื”ืœ ื‘ืžืœื•ืื• ื‘ืืžืฆืขื•ืช ืžืฉืื‘ื™ื ืžื•ืชืืžื™ื ืื™ืฉื™ืช, ื™ื•ืฆืจ ืื•ื˜ื•ืžื˜ื™ืช StatefulSet ืžืžื›ื•ืœื•ืช, ืฉืื•ืชื• ื ื™ืชืŸ ืœื”ืชืื™ื ืื™ืฉื™ืช ืขืœ ื™ื“ื™ ื”ื•ืกืคืช ืงืจื•ื ื•ืช ืฆื“ ืฉื•ื ื™ื ืœืชืจืžื™ืœ. ื›ืœ ื–ื” ืžื”ื•ื•ื” ื™ืชืจื•ืŸ ืžืฉืžืขื•ืชื™ ื‘ื”ืฉื•ื•ืื” ืœืžืคืขื™ืœ ืžื‘ื™ืช Crunchy Data.

ืžื›ื™ื•ื•ืŸ ืฉื‘ื—ืจื ื• ื‘ืคืชืจื•ืŸ ืฉืœ Zalando ื‘ื™ืŸ 3 ื”ืืคืฉืจื•ื™ื•ืช ื”ื ื‘ื“ืงื•ืช, ืชื™ืื•ืจ ื ื•ืกืฃ ืฉืœ ื™ื›ื•ืœื•ืชื™ื• ื™ื•ืฆื’ ืœื”ืœืŸ, ืžื™ื“ ื™ื—ื“ ืขื ืชืจื’ื•ืœ ื”ื™ื™ืฉื•ื.

ืชืจื’ื•ืœ ืขื Postgres Operator ืž- Zalando

ืคืจื™ืกืช ื”ืžืคืขื™ืœ ื”ื™ื ืคืฉื•ื˜ื” ืžืื•ื“: ืคืฉื•ื˜ ื”ื•ืจื“ ืืช ื”ืžื”ื“ื•ืจื” ื”ื ื•ื›ื—ื™ืช ืž-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. ื–ื” ืžื’ื™ืข ืขื ื”ืžืคืขื™ืœ ื•ืžืืคืฉืจ ืœื™ืฆื•ืจ ื•ืœืžื—ื•ืง ืืฉื›ื•ืœื•ืช, ื›ืžื• ื’ื ืœืขื‘ื•ื“ ืขื ื’ื™ื‘ื•ื™ื™ื ืฉื ืขืฉื• ืขืœ ื™ื“ื™ ื”ืžืคืขื™ืœ.

ืกืงื™ืจื” ืงืฆืจื” ืฉืœ ืžืคืขื™ืœื™ PostgreSQL ืขื‘ื•ืจ Kubernetes, ื”ื‘ื—ื™ืจื” ื•ื”ื ื™ืกื™ื•ืŸ ืฉืœื ื•
ืจืฉื™ืžื” ืฉืœ ืืฉื›ื•ืœื•ืช PostgreSQL

ืกืงื™ืจื” ืงืฆืจื” ืฉืœ ืžืคืขื™ืœื™ PostgreSQL ืขื‘ื•ืจ Kubernetes, ื”ื‘ื—ื™ืจื” ื•ื”ื ื™ืกื™ื•ืŸ ืฉืœื ื•
ื ื™ื”ื•ืœ ื’ื™ื‘ื•ื™ื™ื

ืชื›ื•ื ื” ืžืขื ื™ื™ื ืช ื ื•ืกืคืช ื”ื™ื ื”ืชืžื™ื›ื” Teams API. ืžื ื’ื ื•ืŸ ื–ื” ื™ื•ืฆืจ ื‘ืื•ืคืŸ ืื•ื˜ื•ืžื˜ื™ ืชืคืงื™ื“ื™ื ื‘-PostgreSQL, ื‘ื”ืชื‘ืกืก ืขืœ ืจืฉื™ืžืช ืฉืžื•ืช ื”ืžืฉืชืžืฉ ืฉื”ืชืงื‘ืœื”. ืœืื—ืจ ืžื›ืŸ, ื”-API ืžืืคืฉืจ ืœืš ืœื”ื—ื–ื™ืจ ืจืฉื™ืžื” ืฉืœ ืžืฉืชืžืฉื™ื ืฉืขื‘ื•ืจื ื ื•ืฆืจื™ื ืชืคืงื™ื“ื™ื ื‘ืื•ืคืŸ ืื•ื˜ื•ืžื˜ื™.

ื‘ืขื™ื•ืช ื•ืคืชืจื•ื ื•ืช

ืขื ื–ืืช, ื”ืฉื™ืžื•ืฉ ื‘ืžืคืขื™ืœ ื—ืฉืฃ ื‘ืžื”ืจื” ื›ืžื” ื—ืกืจื•ื ื•ืช ืžืฉืžืขื•ืชื™ื™ื:

  1. ื”ื™ืขื“ืจ ืชืžื™ื›ื” ื‘-nodeSelector;
  2. ื—ื•ืกืจ ื™ื›ื•ืœืช ืœื”ืฉื‘ื™ืช ื’ื™ื‘ื•ื™ื™ื;
  3. ื‘ืขืช ืฉื™ืžื•ืฉ ื‘ืคื•ื ืงืฆื™ื™ืช ื™ืฆื™ืจืช ืžืกื“ ื”ื ืชื•ื ื™ื, ื”ืจืฉืื•ืช ื‘ืจื™ืจืช ื”ืžื—ื“ืœ ืื™ื ืŸ ืžื•ืคื™ืขื•ืช;
  4. ืœืคืขืžื™ื ืชื™ืขื•ื“ ื—ืกืจ ืื• ืœื ืžืขื•ื“ื›ืŸ.

ืœืžืจื‘ื” ื”ืžื–ืœ, ืจื‘ื™ื ืžื”ื ื ื™ืชื ื™ื ืœืคืชืจื•ืŸ. ื ืชื—ื™ืœ ืžื”ืกื•ืฃ - ื‘ืขื™ื•ืช ืขื ืชื™ืขื•ื“.

ืกื‘ื™ืจ ืœื”ื ื™ื— ืฉืชืชืงืœื• ื‘ืขื•ื‘ื“ื” ืฉืœื ืชืžื™ื“ ื‘ืจื•ืจ ื›ื™ืฆื“ ืœืจืฉื•ื ื’ื™ื‘ื•ื™ ื•ื›ื™ืฆื“ ืœื—ื‘ืจ ืืช ื“ืœื™ ื”ื’ื™ื‘ื•ื™ ืœ-Operator UI. ื”ืชื™ืขื•ื“ ืžื“ื‘ืจ ืขืœ ื›ืš ื‘ื˜ืขื•ืช, ืื‘ืœ ื”ืชื™ืื•ืจ ื”ืืžื™ืชื™ ื ืžืฆื ื‘ืคื ื™ื PR:

  1. ืฆืจื™ืš ืœืขืฉื•ืช ืกื•ื“;
  2. ืœื”ืขื‘ื™ืจ ืื•ืชื• ืœืžืคืขื™ืœ ื›ืคืจืžื˜ืจ pod_environment_secret_name ื‘-CRD ืขื ื”ื’ื“ืจื•ืช ืžืคืขื™ืœ ืื• ื‘-ConfigMap (ืชืœื•ื™ ืื™ืš ืชื—ืœื™ื˜ ืœื”ืชืงื™ืŸ ืืช ื”ืžืคืขื™ืœ).

ืขื ื–ืืช, ื›ืคื™ ืฉืžืชื‘ืจืจ, ื–ื” ื›ืจื’ืข ื‘ืœืชื™ ืืคืฉืจื™. ื‘ื’ืœืœ ื–ื” ืืกืคื ื• ื”ื’ืจืกื” ืฉืœืš ืฉืœ ื”ืžืคืขื™ืœ ืขื ื›ืžื” ืคื™ืชื•ื—ื™ื ื ื•ืกืคื™ื ืฉืœ ืฆื“ ืฉืœื™ืฉื™. ืœืžื™ื“ืข ื ื•ืกืฃ ืขืœ ื–ื”, ืจืื” ืœื”ืœืŸ.

ืื ืชืขื‘ื™ืจ ืืช ื”ืคืจืžื˜ืจื™ื ืœื’ื™ื‘ื•ื™ ืœืžืคืขื™ืœ, ื›ืœื•ืžืจ - wal_s3_bucket ื•ืžืคืชื—ื•ืช ื’ื™ืฉื” ื‘-AWS S3, ื•ืื– ื–ื” ื™ื’ื‘ื” ื”ื›ืœ: ืœื ืจืง ื‘ืกื™ืกื™ื ื‘ื”ืคืงื”, ืืœื ื’ื ื‘ื™ืžื•ื™. ื–ื” ืœื ื”ืชืื™ื ืœื ื•.

ื‘ืชื™ืื•ืจ ื”ืคืจืžื˜ืจื™ื ืฉืœ Spilo, ืฉื”ื•ื ื”-Docker Wrapper ื”ื‘ืกื™ืกื™ ืขื‘ื•ืจ PgSQL ื‘ืขืช ืฉื™ืžื•ืฉ ื‘ืื•ืคืจื˜ื•ืจ, ื”ืชื‘ืจืจ: ื ื™ืชืŸ ืœื”ืขื‘ื™ืจ ืคืจืžื˜ืจ WAL_S3_BUCKET ืจื™ืง, ื•ื‘ื›ืš ืžืฉื‘ื™ืช ื’ื™ื‘ื•ื™ื™ื. ื™ืชืจ ืขืœ ื›ืŸ, ืœืฉืžื—ื” ืจื‘ื”, ืžืฆืืชื™ ื™ื—ืกื™ ืฆื™ื‘ื•ืจ ืžื•ื›ื ื™ื, ืฉืื•ืชื” ืงื™ื‘ืœื ื• ืžื™ื“ ืœืžื–ืœื’ื ื•. ืขื›ืฉื™ื• ืจืง ืฆืจื™ืš ืœื”ื•ืกื™ืฃ enableWALArchiving: false ืœืžืฉืื‘ ืืฉื›ื•ืœ PostgreSQL.

ื›ืŸ, ื”ื™ื™ืชื” ื”ื–ื“ืžื ื•ืช ืœืขืฉื•ืช ืืช ื–ื” ืื—ืจืช ืขืœ ื™ื“ื™ ื”ืคืขืœืช 2 ืื•ืคืจื˜ื•ืจื™ื: ืื—ื“ ืœืกื˜ื™ื ื’ (ืœืœื ื’ื™ื‘ื•ื™ื™ื), ื•ื”ืฉื ื™ ืœื™ื™ืฆื•ืจ. ืื‘ืœ ื”ืฆืœื—ื ื• ืœื”ืกืชืคืง ื‘ืื—ื“.

ืื•ืงื™, ืœืžื“ื ื• ื›ื™ืฆื“ ืœื”ืขื‘ื™ืจ ื’ื™ืฉื” ืœื‘ืกื™ืกื™ ื”ื ืชื•ื ื™ื ืขื‘ื•ืจ S3 ื•ื”ื’ื™ื‘ื•ื™ื™ื ื”ื—ืœื• ืœื”ื™ื›ื ืก ืœืื—ืกื•ืŸ. ื›ื™ืฆื“ ืœื’ืจื•ื ืœื“ืคื™ ื’ื™ื‘ื•ื™ ืœืขื‘ื•ื“ ื‘ืžืžืฉืง ื”ืžืฉืชืžืฉ ืฉืœ ื”ืžืคืขื™ืœ?

ืกืงื™ืจื” ืงืฆืจื” ืฉืœ ืžืคืขื™ืœื™ PostgreSQL ืขื‘ื•ืจ Kubernetes, ื”ื‘ื—ื™ืจื” ื•ื”ื ื™ืกื™ื•ืŸ ืฉืœื ื•

ืชืฆื˜ืจืš ืœื”ื•ืกื™ืฃ 3 ืžืฉืชื ื™ื ืœืžืžืฉืง ื”ืžืฉืชืžืฉ ืฉืœ ื”ืžืคืขื™ืœ:

  • SPILO_S3_BACKUP_BUCKET
  • AWS_ACCESS_KEY_ID
  • AWS_SECRET_ACCESS_KEY

ืœืื—ืจ ืžื›ืŸ, ื™ืชืืคืฉืจ ื ื™ื”ื•ืœ ื’ื™ื‘ื•ื™ื™ื, ืžื” ืฉื‘ืžืงืจื” ืฉืœื ื• ื™ืคืฉื˜ ืืช ื”ืขื‘ื•ื“ื” ืขื ื”ื‘ืžื”, ื•ื™ืืคืฉืจ ืœื ื• ืœื”ืขื‘ื™ืจ ืฉื ืคืจื•ืกื•ืช ืžื”ื”ืคืงื” ืœืœื ืกืงืจื™ืคื˜ื™ื ื ื•ืกืคื™ื.

ื™ืชืจื•ืŸ ื ื•ืกืฃ ื”ื™ื” ื”ืขื‘ื•ื“ื” ืขื ื”-API ืฉืœ Teams ื•ื”ื–ื“ืžื ื•ื™ื•ืช ืจื‘ื•ืช ืœื™ืฆื™ืจืช ืžืกื“ื™ ื ืชื•ื ื™ื ื•ืชืคืงื™ื“ื™ื ื‘ืืžืฆืขื•ืช ื›ืœื™ ืžืคืขื™ืœ. ืขื ื–ืืช, ื ื•ืฆืจ ืœืชืคืงื™ื“ื™ื ืœื ื”ื™ื• ื–ื›ื•ื™ื•ืช ื›ื‘ืจื™ืจืช ืžื—ื“ืœ. ื‘ื”ืชืื ืœื›ืš, ืžืฉืชืžืฉ ื‘ืขืœ ื–ื›ื•ื™ื•ืช ืงืจื™ืื” ืœื ื™ื›ื•ืœ ื”ื™ื” ืœืงืจื•ื ื˜ื‘ืœืื•ืช ื—ื“ืฉื•ืช.

ืœืžื”? ืœืžืจื•ืช ื”ืขื•ื‘ื“ื” ืฉื‘ืงื•ื“ ื™ืฉ ื”ื›ืจื—ื™ GRANT, ืœื ืชืžื™ื“ ืžืฉืชืžืฉื™ื ื‘ื”ื. ื™ืฉ 2 ืฉื™ื˜ื•ืช: syncPreparedDatabases ะธ syncDatabases. ื‘ืชื•ืš syncPreparedDatabases - ืœืžืจื•ืช ื”ืขื•ื‘ื“ื” ืฉื‘ืกืขื™ืฃ preparedDatabases ื™ืฉ ื™ืฉ ืชื ืื™ defaultRoles ะธ defaultUsers ื›ื“ื™ ืœื™ืฆื•ืจ ืชืคืงื™ื“ื™ื, ื–ื›ื•ื™ื•ืช ื‘ืจื™ืจืช ืžื—ื“ืœ ืื™ื ืŸ ืžื•ื—ืœื•ืช. ืื ื• ื ืžืฆืื™ื ื‘ืชื”ืœื™ืš ืฉืœ ื”ื›ื ืช ืชื™ืงื•ืŸ ื›ืš ืฉื”ื–ื›ื•ื™ื•ืช ื”ืœืœื• ื™ื—ื•ืœื• ืื•ื˜ื•ืžื˜ื™ืช.

ื•ื”ื ืงื•ื“ื” ื”ืื—ืจื•ื ื” ื‘ืฉื™ืคื•ืจื™ื ื”ืจืœื•ื•ื ื˜ื™ื™ื ืœื ื• - ืชื™ืงื•ืŸ, ืฉืžื•ืกื™ืฃ Node Affinity ืœ-StatefulSet ืฉื ื•ืฆืจ. ื”ืœืงื•ื—ื•ืช ืฉืœื ื• ืžืขื“ื™ืคื™ื ืœืขืชื™ื ืงืจื•ื‘ื•ืช ืœื”ืคื—ื™ืช ืขืœื•ื™ื•ืช ืขืœ ื™ื“ื™ ืฉื™ืžื•ืฉ ื‘ืžื•ืคืขื™ื ื ืงื•ื“ืชื™ื™ื, ื•ื‘ืจื•ืจ ืฉื”ื ืœื ืฉื•ื•ื™ื ืœืืจื— ืฉื™ืจื•ืชื™ ืžืกื“ ื ืชื•ื ื™ื. ื ื™ืชืŸ ืœืคืชื•ืจ ื‘ืขื™ื” ื–ื• ื‘ืืžืฆืขื•ืช ืกื•ื‘ืœื ื•ืช, ืืš ื”ื ื•ื›ื—ื•ืช ืฉืœ Node Affinity ืžืขื ื™ืงื” ื‘ื™ื˜ื—ื•ืŸ ืจื‘ ื™ื•ืชืจ.

ืžื” ืงืจื”?

ื‘ื”ืชื‘ืกืก ืขืœ ื”ืชื•ืฆืื•ืช ืฉืœ ืคืชืจื•ืŸ ื”ื‘ืขื™ื•ืช ืœืขื™ืœ, ื—ื™ืœืงื ื• ืืช Postgres Operator ืž- Zalando ื”ืžืื’ืจ ืฉืœืš, ืฉื ื”ื•ื ื ืืกืฃ ืขื ื˜ืœืื™ื ืฉื™ืžื•ืฉื™ื™ื ื›ืืœื”. ื•ืœื™ืชืจ ื ื•ื—ื•ืช, ื’ื ืืกืคื ื• ืชืžื•ื ืช ื“ื•ืงืจ.

ืจืฉื™ืžืช ืื ืฉื™ ื™ื—ืกื™ ื”ืฆื™ื‘ื•ืจ ืฉื”ืชืงื‘ืœื• ืœืžื–ืœื’:

ื–ื” ื™ื”ื™ื” ื ื”ื“ืจ ืื ื”ืงื”ื™ืœื” ืชืชืžื•ืš ื‘-PRs ืืœื” ื›ื“ื™ ืฉื™ื’ื™ืขื• ื‘ืžืขืœื” ื”ื–ืจื ืขื ื”ื’ืจืกื” ื”ื‘ืื” ืฉืœ ื”ืžืคืขื™ืœ (1.6).

ืžึทืขึฒื ึธืง! ืกื™ืคื•ืจ ื”ืฆืœื—ื” ืฉืœ ื”ืขื‘ืจืช ื™ื™ืฆื•ืจ

ืื ืืชื” ืžืฉืชืžืฉ ื‘ืคื˜ืจื•ื ื™, ื ื™ืชืŸ ืœื”ืขื‘ื™ืจ ื™ื™ืฆื•ืจ ื—ื™ ืœืžืคืขื™ืœ ืขื ื–ืžืŸ ื”ืฉื‘ืชื” ืžื™ื ื™ืžืœื™.

Spilo ืžืืคืฉืจ ืœืš ืœื™ืฆื•ืจ ืืฉื›ื•ืœื•ืช ื”ืžืชื ื” ื‘ืืžืฆืขื•ืช ืื—ืกื•ืŸ S3 ืขื ื•ื•ืœ-ืื™, ื›ืืฉืจ ื”ื™ื•ืžืŸ ื”ื‘ื™ื ืืจื™ ืฉืœ PgSQL ืžืื•ื—ืกืŸ ืœืจืืฉื•ื ื” ื‘-S3 ื•ืœืื—ืจ ืžื›ืŸ ื ืฉืื‘ ื”ื—ื•ืฆื” ืขืœ ื™ื“ื™ ื”ืขืชืง. ืื‘ืœ ืžื” ืœืขืฉื•ืช ืื ื™ืฉ ืœืš ืœื ื‘ืฉื™ืžื•ืฉ ืขืœ ื™ื“ื™ Wal-E ืขืœ ืชืฉืชื™ืช ื™ืฉื ื”? ื”ืคืชืจื•ืŸ ืœื‘ืขื™ื” ื–ื• ื›ื‘ืจ ื–ื” ื”ื•ืฆืข ืขืœ ื”ืจื›ื–ืช.

ืฉื›ืคื•ืœ ืœื•ื’ื™ PostgreSQL ื‘ื ืœื”ืฆื™ืœ. ืขื ื–ืืช, ืœื ื ืคืจื˜ ื›ื™ืฆื“ ืœื™ืฆื•ืจ ืคืจืกื•ืžื™ื ื•ืžื ื•ื™ื™ื, ื›ื™... ื”ืชื•ื›ื ื™ืช ืฉืœื ื• ื”ื™ื™ืชื” ืคื™ืืกืงื•.

ื”ืขื•ื‘ื“ื” ื”ื™ื ืฉื‘ื‘ืกื™ืก ื”ื ืชื•ื ื™ื ื”ื™ื• ื›ืžื” ื˜ื‘ืœืื•ืช ื˜ืขื•ื ื•ืช ืขื ืžื™ืœื™ื•ื ื™ ืฉื•ืจื•ืช, ืืฉืจ ื™ืชืจ ืขืœ ื›ืŸ, ื”ืชื—ื“ืฉื• ื•ื ืžื—ืงื• ื›ืœ ื”ื–ืžืŸ. ืžื ื•ื™ ืคืฉื•ื˜ ั copy_data, ื›ืืฉืจ ื”ืขืชืง ื”ื—ื“ืฉ ืžืขืชื™ืง ืืช ื›ืœ ื”ืชื•ื›ืŸ ืžื”ืžืืกื˜ืจ, ื”ื•ื ืคืฉื•ื˜ ืœื ื™ื›ื•ืœ ืœืขืžื•ื“ ื‘ืงืฆื‘ ืฉืœ ื”ืžืืกื˜ืจ. ื”ืขืชืงืช ื”ืชื•ื›ืŸ ืขื‘ื“ื” ื‘ืžืฉืš ืฉื‘ื•ืข, ืืš ืžืขื•ืœื ืœื ื”ื“ื‘ื™ืงื” ืืช ื”ืžืืกื˜ืจ. ื‘ืกื•ืคื• ืฉืœ ื“ื‘ืจ, ื–ื” ืขื–ืจ ืœื™ ืœืคืชื•ืจ ืืช ื”ื‘ืขื™ื” ืžืืžืจ ืขืžื™ืชื™ื ืž-Avito: ืืชื” ื™ื›ื•ืœ ืœื”ืขื‘ื™ืจ ื ืชื•ื ื™ื ื‘ืืžืฆืขื•ืช pg_dump. ืื ื™ ืืชืืจ ืืช ื”ื’ืจืกื” (ื”ืฉืชื•ื ืชื” ืžืขื˜) ืฉืœ ื”ืืœื’ื•ืจื™ืชื ื”ื–ื”.

ื”ืจืขื™ื•ืŸ ื”ื•ื ืฉืืชื” ื™ื›ื•ืœ ืœื™ืฆื•ืจ ืžื ื•ื™ ืžื•ืฉื‘ืช ื”ืงืฉื•ืจ ืœืžืฉื‘ืฆืช ืฉื›ืคื•ืœ ืกืคืฆื™ืคื™ืช, ื•ืœืื—ืจ ืžื›ืŸ ืœืชืงืŸ ืืช ืžืกืคืจ ื”ืขืกืงื”. ื”ื™ื• ื”ืขืชืงื™ื ื–ืžื™ื ื™ื ืœืขื‘ื•ื“ื•ืช ื™ื™ืฆื•ืจ. ื–ื” ื—ืฉื•ื‘ ื›ื™ ื”ืขืชืง ื™ืขื–ื•ืจ ืœื™ืฆื•ืจ 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. ื”ืขืœื” ืืช ื”-dump ืœืฉืจืช ื”ื—ื“ืฉ:

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

7. ืœืื—ืจ ื”ื•ืจื“ืช ื”-dump, ืืชื” ื™ื›ื•ืœ ืœื”ืชื—ื™ืœ ืจืคืœื™ืงืฆื™ื” ืขืœ ื”ืขืชืง ื”ืกื˜ืจื™ืžื™ื ื’:

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. ืขื ื–ืืช, ืœืื—ืจ ืฉื”ืฉื™ื’ ืื•ื˜ื•ืžืฆื™ื” ื™ื•ืฆืืช ื“ื•ืคืŸ ื‘ืขื–ืจืชื, ื›ื“ืื™ ืœื–ื›ื•ืจ ืฉื–ื” ื™ื›ื•ืœ ืœื”ื‘ื™ื ื’ื ืžืกืคืจ ื ื™ื•ืื ืกื™ื ื‘ืœืชื™ ืฆืคื•ื™ื™ื, ืื– ื‘ื—ืจ ืืช ื”ืžืคืขื™ืœื™ื ืฉืœืš ื‘ื—ื•ื›ืžื”.

ืœืื—ืจ ืฉืงืœื˜ื ื• ืืช ืฉืœื•ืฉืช ื”ืžืคืขื™ืœื™ื ื”ืคื•ืคื•ืœืจื™ื™ื ื‘ื™ื•ืชืจ ืฉืœ Kubernetes ืขื‘ื•ืจ PostgreSQL, ื‘ื—ืจื ื• ื‘ืคืจื•ื™ืงื˜ ืž- Zalando. ื•ื”ื™ื™ื ื• ืฆืจื™ื›ื™ื ืœื”ืชื’ื‘ืจ ืขืœ ืงืฉื™ื™ื ืžืกื•ื™ืžื™ื ืขื ื–ื”, ืื‘ืœ ื”ืชื•ืฆืื” ื”ื™ื™ืชื” ืžืžืฉ ืžืขื ื’ืช, ืื– ืื ื—ื ื• ืžืชื›ื ื ื™ื ืœื”ืจื—ื™ื‘ ืืช ื”ื—ื•ื•ื™ื” ื”ื–ื• ืœื›ืžื” ื”ืชืงื ื•ืช PgSQL ืื—ืจื•ืช. ืื ื™ืฉ ืœืš ื ื™ืกื™ื•ืŸ ื‘ืฉื™ืžื•ืฉ ื‘ืคืชืจื•ื ื•ืช ื“ื•ืžื™ื, ื ืฉืžื— ืœืจืื•ืช ืืช ื”ืคืจื˜ื™ื ื‘ื”ืขืจื•ืช!

ื .ื‘.

ืงืจื ื’ื ื‘ื‘ืœื•ื’ ืฉืœื ื•:

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”