ΠšΡ€Π°Ρ‚ΠΊΠΈΠΉ ΠΎΠ±Π·ΠΎΡ€ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² PostgreSQL для Kubernetes, наш Π²Ρ‹Π±ΠΎΡ€ ΠΈ ΠΎΠΏΡ‹Ρ‚

ΠšΡ€Π°Ρ‚ΠΊΠΈΠΉ ΠΎΠ±Π·ΠΎΡ€ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² PostgreSQL для Kubernetes, наш Π²Ρ‹Π±ΠΎΡ€ ΠΈ ΠΎΠΏΡ‹Ρ‚

Всё Ρ‡Π°Ρ‰Π΅ ΠΎΡ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ² ΠΏΠΎΡΡ‚ΡƒΠΏΠ°ΡŽΡ‚ Ρ‚Π°ΠΊΠΈΠ΅ запросы: Β«Π₯ΠΎΡ‚ΠΈΠΌ ΠΊΠ°ΠΊ Amazon RDS, Π½ΠΎ дСшСвлС»; Β«Π₯ΠΎΡ‚ΠΈΠΌ ΠΊΠ°ΠΊ RDS, Π½ΠΎ Π²Π΅Π·Π΄Π΅, Π² любой инфраструктурС». Π§Ρ‚ΠΎΠ±Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅ managed-Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π½Π° Kubernetes, ΠΌΡ‹ посмотрСли Π½Π° Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ состояниС Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ популярных ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² для PostgreSQL (Stolon, ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΎΡ‚ Crunchy Data ΠΈ Zalando) ΠΈ сдСлали свой Π²Ρ‹Π±ΠΎΡ€.

Π­Ρ‚Π° ΡΡ‚Π°Ρ‚ΡŒΡ β€” ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ Π½Π°ΠΌΠΈ ΠΎΠΏΡ‹Ρ‚ ΠΈ с тСорСтичСской Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния (ΠΎΠ±Π·ΠΎΡ€ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ), ΠΈ с практичСской стороны (Ρ‡Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ Π²Ρ‹Π±Ρ€Π°Π½ΠΎ ΠΈ Ρ‡Ρ‚ΠΎ ΠΈΠ· этого ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ). Но для Π½Π°Ρ‡Π°Π»Π° Π΄Π°Π²Π°ΠΉΡ‚Π΅ опрСдСлимся, ΠΊΠ°ΠΊΠΈΠ΅ Π²ΠΎΠΎΠ±Ρ‰Π΅ трСбования ΠΏΡ€Π΅Π΄ΡŠΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΊ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ Π·Π°ΠΌΠ΅Π½Π΅ RDS…

Π§Ρ‚ΠΎ ΠΆΠ΅ Ρ‚Π°ΠΊΠΎΠ΅ RDS

Когда люди говорят ΠΏΡ€ΠΎ RDS, ΠΏΠΎ Π½Π°ΡˆΠ΅ΠΌΡƒ ΠΎΠΏΡ‹Ρ‚Ρƒ, ΠΎΠ½ΠΈ ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°ΡŽΡ‚ управляСмый (managed) сСрвис Π‘Π£Π‘Π”, которая:

  1. Π»Π΅Π³ΠΊΠΎ настраиваСтся;
  2. ΠΈΠΌΠ΅Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ со ΡΠ½Π°ΠΏΡˆΠΎΡ‚Π°ΠΌΠΈ ΠΈ Π²ΠΎΡΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒΡΡ ΠΈΠ· Π½ΠΈΡ… (ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ β€” с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ PITR);
  3. позволяСт ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Ρ‚ΠΎΠΏΠΎΠ»ΠΎΠ³ΠΈΠΈ master-slave;
  4. ΠΈΠΌΠ΅Π΅Ρ‚ Π±ΠΎΠ³Π°Ρ‚Ρ‹ΠΉ список Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ;
  5. прСдоставляСт Π°ΡƒΠ΄ΠΈΡ‚ ΠΈ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌΠΈ/доступами.

Если Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ Π²ΠΎΠΎΠ±Ρ‰Π΅, Ρ‚ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Ρ‹ ΠΊ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ поставлСнной Π·Π°Π΄Π°Ρ‡ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ вСсьма Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ, ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΏΡƒΡ‚ΡŒ с условным Ansible Π½Π°ΠΌ Π½Π΅ Π±Π»ΠΈΠ·ΠΎΠΊ. (К схоТСму Π²Ρ‹Π²ΠΎΠ΄Ρƒ ΠΏΡ€ΠΈΡˆΠ»ΠΈ ΠΈ ΠΊΠΎΠ»Π»Π΅Π³ΠΈ ΠΈΠ· 2GIS Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ своСй ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΈ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ «инструмСнт для быстрого развСртывания отказоустойчивого кластСра Π½Π° основС PostgresΒ».)

ИмСнно ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ β€” общСпринятый ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡ Π² экосистСмС Kubernetes. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΎ Π½ΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΊ Π±Π°Π·Π°ΠΌ Π΄Π°Π½Π½Ρ‹Ρ…, запускаСмым Π²Π½ΡƒΡ‚Ρ€ΠΈ Kubernetes, ΡƒΠΆΠ΅ рассказывал Ρ‚Π΅Ρ…Π΄ΠΈΡ€ Β«Π€Π»Π°Π½Ρ‚Π°Β», distol, Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· своих Π΄ΠΎΠΊΠ»Π°Π΄ΠΎΠ².

NB: Для быстрого создания нСслоТных ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Π½Π°ΡˆΡƒ Open Source-ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρƒ shell-operator. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π΅Ρ‘, ΠΌΠΎΠΆΠ½ΠΎ это Π΄Π΅Π»Π°Ρ‚ΡŒ Π±Π΅Π· Π·Π½Π°Π½ΠΈΠΉ Go, Π° Π±ΠΎΠ»Π΅Π΅ ΠΏΡ€ΠΈΠ²Ρ‹Ρ‡Π½Ρ‹ΠΌΠΈ для сисадминов способами: Π½Π° Bash, Python ΠΈ Ρ‚.ΠΏ.

Для PostgreSQL сущСствуСт нСсколько популярных K8s-ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ²:

  • Stolon;
  • Crunchy Data PostgreSQL Operator;
  • Zalando Postgres Operator.

ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ Π½Π° Π½ΠΈΡ… Π±ΠΎΠ»Π΅Π΅ Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎ.

Π’Ρ‹Π±ΠΎΡ€ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°

Помимо Ρ‚Π΅Ρ… Π²Π°ΠΆΠ½Ρ‹Ρ… возмоТностСй, Ρ‡Ρ‚ΠΎ ΡƒΠΆΠ΅ Π±Ρ‹Π»ΠΈ упомянуты Π²Ρ‹ΡˆΠ΅, ΠΌΡ‹ β€” ΠΊΠ°ΠΊ ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€Ρ‹ ΠΏΠΎ эксплуатации инфраструктуры Π² Kubernetes β€” Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠΆΠΈΠ΄Π°Π»ΠΈ ΠΎΡ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ:

  • Π΄Π΅ΠΏΠ»ΠΎΠΉ ΠΈΠ· Git ΠΈ с Custom Resources;
  • ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ pod anti-affinity;
  • установку node affinity ΠΈΠ»ΠΈ node selector;
  • установку tolerations;
  • Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ возмоТностСй Ρ‚ΡŽΠ½ΠΈΠ½Π³Π°;
  • понятныС Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ ΠΈ Π΄Π°ΠΆΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹.

НС вдаваясь Π² Π΄Π΅Ρ‚Π°Π»ΠΈ ΠΏΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ ΠΈΠ· ΠΏΡƒΠ½ΠΊΡ‚ΠΎΠ² (ΡΠΏΡ€Π°ΡˆΠΈΠ²Π°ΠΉΡ‚Π΅ Π² коммСнтариях, Ссли останутся вопросы ΠΏΠΎ Π½ΠΈΠΌ послС прочтСния всСй ΡΡ‚Π°Ρ‚ΡŒΠΈ), ΠΎΡ‚ΠΌΠ΅Ρ‡Ρƒ Π² Ρ†Π΅Π»ΠΎΠΌ, Ρ‡Ρ‚ΠΎ эти ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π½ΡƒΠΆΠ½Ρ‹ для Π±ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ½ΠΊΠΎΠ³ΠΎ описания спСциализации ΡƒΠ·Π»ΠΎΠ² кластСра с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΈΡ… ΠΏΠΎΠ΄ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ прилоТСния. Π’Π°ΠΊ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ баланса Π² вопросах ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈ стоимости.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ β€” ΠΊ самим ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌ PostgreSQL.

1. Stolon

Stolon ΠΎΡ‚ ΠΈΡ‚Π°Π»ΡŒΡΠ½ΡΠΊΠΎΠΉ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ Sorint.lab Π² ΡƒΠΆΠ΅ упомянутом Π΄ΠΎΠΊΠ»Π°Π΄Π΅ рассматривался ΠΊΠ°ΠΊ Π½Π΅ΠΊΠΈΠΉ эталон срСди ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² для Π‘Π£Π‘Π”. Π­Ρ‚ΠΎ довольно старый ΠΏΡ€ΠΎΠ΅ΠΊΡ‚: ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π΅Π³ΠΎ ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹ΠΉ Ρ€Π΅Π»ΠΈΠ· состоялся Π΅Ρ‰Π΅ Π² ноябрС 2015 Π³ΠΎΠ΄Π°(!), Π° GitHub-Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ…Π²Π°ΡΡ‚Π°Ρ‚ΡŒ ΠΏΠΎΡ‡Ρ‚ΠΈ 3000 Π·Π²Ρ‘Π·Π΄Π°ΠΌΠΈ ΠΈ 40+ ΠΊΠΎΠ½Ρ‚Ρ€ΠΈΠ±ΡŒΡŽΡ‚ΠΎΡ€Π°ΠΌΠΈ.

И Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, Stolon β€” ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΠ΄ΡƒΠΌΠ°Π½Π½ΠΎΠΉ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹:

ΠšΡ€Π°Ρ‚ΠΊΠΈΠΉ ΠΎΠ±Π·ΠΎΡ€ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² PostgreSQL для Kubernetes, наш Π²Ρ‹Π±ΠΎΡ€ ΠΈ ΠΎΠΏΡ‹Ρ‚
Π‘ устройством этого ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° Π² подробностях ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒΡΡ Π² Π΄ΠΎΠΊΠ»Π°Π΄Π΅ ΠΈΠ»ΠΈ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. Π’ Ρ†Π΅Π»ΠΎΠΌ ΠΆΠ΅, достаточно ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ ΡƒΠΌΠ΅Π΅Ρ‚ всё описанноС: failover, прокси для ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½ΠΎΠ³ΠΎ доступа ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ², бэкапы… ΠŸΡ€ΠΈΡ‡Π΅ΠΌ прокси ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ доступ Ρ‡Π΅Ρ€Π΅Π· ΠΎΠ΄ΠΈΠ½ сСрвис endpoint β€” Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Π΄Π²ΡƒΡ… Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ, рассмотрСнных дальшС (Ρƒ Π½ΠΈΡ… ΠΏΠΎ Π΄Π²Π° сСрвиса для доступа ΠΊ Π±Π°Π·Π΅).

Однако Ρƒ Stolon Π½Π΅Ρ‚ Custom Resources, ΠΈΠ·-Π·Π° Ρ‡Π΅Π³ΠΎ Π΅Π³ΠΎ нСльзя Ρ‚Π°ΠΊ Π΄Π΅ΠΏΠ»ΠΎΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ просто ΠΈ быстро β€” Β«ΠΊΠ°ΠΊ горячиС ΠΏΠΈΡ€ΠΎΠΆΠΊΠΈΒ» β€” ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ экзСмпляры Π‘Π£Π‘Π” Π² Kubernetes. Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ осущСствляСтся Ρ‡Π΅Ρ€Π΅Π· ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρƒ stolonctl, Π΄Π΅ΠΏΠ»ΠΎΠΉ β€” Ρ‡Π΅Ρ€Π΅Π· Helm-Ρ‡Π°Ρ€Ρ‚, Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ Π·Π°Π΄Π°ΡŽΡ‚ΡΡ Π² ConfigMap.

Π‘ ΠΎΠ΄Π½ΠΎΠΉ стороны, получаСтся, Ρ‡Ρ‚ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ-Ρ‚ΠΎ являСтся ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ (вСдь ΠΎΠ½ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ CRD). Но с Π΄Ρ€ΡƒΠ³ΠΎΠΉ β€” это гибкая систСма, которая позволяСт Π½Π°ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒ рСсурсы Π² K8s Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ Π²Π°ΠΌ ΡƒΠ΄ΠΎΠ±Π½ΠΎ.

Π Π΅Π·ΡŽΠΌΠΈΡ€ΡƒΡ, Π»ΠΈΡ‡Π½ΠΎ для нас Π½Π΅ показался ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΠΏΡƒΡ‚ΡŒ Π·Π°Π²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ‡Π°Ρ€Ρ‚ ΠΏΠΎΠ΄ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ Π‘Π”. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΌΡ‹ стали ΠΈΡΠΊΠ°Ρ‚ΡŒ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹.

2. Crunchy Data PostgreSQL Operator

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΎΡ‚ 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, ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΎΠ½Π° Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ Custom Resources для Kubernetes. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ нас ΠΊΠ°ΠΊ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΏΠΎΡ€Π°Π΄ΠΎΠ²Π°Π»:

  • Π΅ΡΡ‚ΡŒ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Ρ‡Π΅Ρ€Π΅Π· CRD;
  • ΡƒΠ΄ΠΎΠ±Π½ΠΎΠ΅ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌΠΈ (Ρ‚ΠΎΠΆΠ΅ Ρ‡Π΅Ρ€Π΅Π· CRD);
  • интСграция с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ Crunchy Data Container Suite β€” спСциализированной ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ ΠΎΠ±Ρ€Π°Π·ΠΎΠ² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ² для PostgreSQL ΠΈ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π½Π΅ΠΉ (Π²ΠΊΠ»ΡŽΡ‡Π°Ρ pgBackRest, pgAudit, Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ ΠΈΠ· contrib ΠΈ Ρ‚.Π΄.).

Однако ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΈ Π½Π°Ρ‡Π°Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΎΡ‚ Crunchy Data выявили нСсколько ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ:

  • НС оказалось возмоТности tolerations β€” прСдусмотрСн Ρ‚ΠΎΠ»ΡŒΠΊΠΎ nodeSelector.
  • Π‘ΠΎΠ·Π΄Π°Π²Π°Π΅ΠΌΡ‹Π΅ pod’ы Π±Ρ‹Π»ΠΈ Ρ‡Π°ΡΡ‚ΡŒΡŽ Deployment’а, нСсмотря Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π΄Π΅ΠΏΠ»ΠΎΠΈΠ»ΠΈ stateful-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ StatefulSet, Deployment’ы Π½Π΅ ΡƒΠΌΠ΅ΡŽΡ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ диски.

ПослСдний нСдостаток ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Π·Π°Π±Π°Π²Π½Ρ‹ΠΌ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π°ΠΌ: Π½Π° тСстовой срСдС ΡƒΠ΄Π°Π»ΠΎΡΡŒ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ 3 Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ с ΠΎΠ΄Π½ΠΈΠΌ диском local storage, Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Ρ‡Π΅Π³ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ сообщал, Ρ‡Ρ‚ΠΎ 3 Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ (хотя это Π±Ρ‹Π»ΠΎ Π½Π΅ Ρ‚Π°ΠΊ).

Π•Ρ‰Ρ‘ ΠΎΠ΄Π½ΠΎΠΉ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒΡŽ этого ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° являСтся Π΅Π³ΠΎ готовая интСграция с Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ систСмами. НапримСр, Π»Π΅Π³ΠΊΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ pgAdmin ΠΈ pgBounce, Π° Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ΡΡ прСднастроСнныС Grafana ΠΈ Prometheus. Π’ Π½Π΅Π΄Π°Π²Π½Π΅ΠΌ Ρ€Π΅Π»ΠΈΠ·Π΅ 4.5.0-beta1 ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ отмСчаСтся ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½Π½Π°Ρ интСграция с ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠΌ pgMonitor, благодаря Ρ‡Π΅ΠΌΡƒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ Π½Π°Π³Π»ΡΠ΄Π½ΡƒΡŽ Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊ ΠΏΠΎ PgSQL Β«ΠΈΠ· ΠΊΠΎΡ€ΠΎΠ±ΠΊΠΈΒ».

Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, странный Π²Ρ‹Π±ΠΎΡ€ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… Kubernetes-рСсурсов ΠΏΡ€ΠΈΠ²Π΅Π» нас ΠΊ нСобходимости Π½Π°ΠΉΡ‚ΠΈ ΠΈΠ½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅.

3. Zalando Postgres Operator

ΠŸΡ€ΠΎΠ΄ΡƒΠΊΡ‚Ρ‹ Zalando Π½Π°ΠΌ извСстны Π΄Π°Π²Π½ΠΎ: Π΅ΡΡ‚ΡŒ ΠΎΠΏΡ‹Ρ‚ использования Zalenium ΠΈ, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΌΡ‹ ΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Π»ΠΈ Patroni β€” ΠΈΡ… популярноС HA-Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ для PostgreSQL. О ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π΅ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ ΠΊ созданию Postgres Operator рассказывал ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π΅Π³ΠΎ Π°Π²Ρ‚ΠΎΡ€ΠΎΠ² β€” АлСксСй Клюкин β€” Π² эфирС Postgres-Π²Ρ‚ΠΎΡ€Π½ΠΈΠΊΠ° β„–5, ΠΈ Π½Π°ΠΌ ΠΎΠ½ приглянулся.

Π­Ρ‚ΠΎ самоС ΠΌΠΎΠ»ΠΎΠ΄ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΈΠ· рассматриваСмых Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅: ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Ρ€Π΅Π»ΠΈΠ· состоялся Π² августС 2018 Π³ΠΎΠ΄Π°. Однако, Π΄Π°ΠΆΠ΅ нСсмотря Π½Π° нСбольшоС количСство Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ€Π΅Π»ΠΈΠ·ΠΎΠ², ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΏΡ€ΠΎΡˆΡ‘Π» большой ΠΏΡƒΡ‚ΡŒ, ΡƒΠΆΠ΅ ΠΎΠΏΠ΅Ρ€Π΅Π΄ΠΈΠ² ΠΏΠΎ популярности Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΎΡ‚ Crunchy Data с 1300+ Π·Π²Ρ‘Π·Π΄Π°ΠΌΠΈ Π½Π° GitHub ΠΈ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ числом ΠΊΠΎΠ½Ρ‚Ρ€ΠΈΠ±ΡŒΡŽΡ‚ΠΎΡ€ΠΎΠ² (70+).

«Под ΠΊΠ°ΠΏΠΎΡ‚ΠΎΠΌΒ» этого ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ, ΠΏΡ€ΠΎΠ²Π΅Ρ€Π΅Π½Π½Ρ‹Π΅ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ:

  • Patroni ΠΈ Spilo для управлСния,
  • WAL-E β€” для бэкапов,
  • PgBouncer β€” Π² качСствС ΠΏΡƒΠ»Π° ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ.

Π’ΠΎΡ‚ ΠΊΠ°ΠΊ прСдставлСна Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π° ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° ΠΎΡ‚ Zalando:

ΠšΡ€Π°Ρ‚ΠΊΠΈΠΉ ΠΎΠ±Π·ΠΎΡ€ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² PostgreSQL для Kubernetes, наш Π²Ρ‹Π±ΠΎΡ€ ΠΈ ΠΎΠΏΡ‹Ρ‚

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ управляСтся Ρ‡Π΅Ρ€Π΅Π· Custom Resources, автоматичСски создаСт StatefulSet ΠΈΠ· ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π·Π°Ρ‚Π΅ΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΊΠ°ΡΡ‚ΠΎΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, добавляя Π² pod Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ sidecar’ы. Всё это β€” Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ плюс Π² сравнСнии с ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ ΠΎΡ‚ Crunchy Data.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΎΡ‚ Zalando ΠΌΡ‹ Π²Ρ‹Π±Ρ€Π°Π»ΠΈ срСди 3 рассматриваСмых Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ², дальнСйшСС описаниС Π΅Π³ΠΎ возмоТностСй Π±ΡƒΠ΄Π΅Ρ‚ прСдставлСно Π½ΠΈΠΆΠ΅, сразу вмСстС с ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΎΠΉ примСнСния.

ΠŸΡ€Π°ΠΊΡ‚ΠΈΠΊΠ° с Postgres Operator ΠΎΡ‚ Zalando

Π”Π΅ΠΏΠ»ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° происходит ΠΎΡ‡Π΅Π½ΡŒ просто: достаточно ΡΠΊΠ°Ρ‡Π°Ρ‚ΡŒ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π΅Π»ΠΈΠ· с GitHub ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ YAML-Ρ„Π°ΠΉΠ»Ρ‹ ΠΈΠ· Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ manifests. Как Π²Π°Ρ€ΠΈΠ°Π½Ρ‚, ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ OperatorHub.

ПослС установки стоит ΠΎΠ·Π°Π±ΠΎΡ‚ΠΈΡ‚ΡŒΡΡ настройкой Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰ для Π»ΠΎΠ³ΠΎΠ² ΠΈ бэкапов. Она производится Ρ‡Π΅Ρ€Π΅Π· 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 экзСмпляров с sidecar Π² Π²ΠΈΠ΄Π΅ 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, Ρ‚ΠΎ ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ Π±ΡΠΊΠ°ΠΏΠΈΡ‚ΡŒ всё: Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π±Π°Π·Ρ‹ Π² production, Π½ΠΎ ΠΈ staging. Нас это Π½Π΅ устроило.

Π’ описании ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΊ Spilo, Ρ‡Ρ‚ΠΎ являСтся Π±Π°Π·ΠΎΠ²ΠΎΠΉ Docker-ΠΎΠ±Ρ‘Ρ€Ρ‚ΠΊΠΎΠΉ для PgSQL ΠΏΡ€ΠΈ использовании ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°, Π²Ρ‹ΡΡΠ½ΠΈΠ»ΠΎΡΡŒ: ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ WAL_S3_BUCKET пустым, Ρ‚Π΅ΠΌ самым ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΠ² бэкапы. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, ΠΊ большой радости Π½Π°ΡˆΡ‘Π»ΡΡ ΠΈ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΉ PR, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ Ρ‚ΡƒΡ‚ ΠΆΠ΅ приняли Π² свой Ρ„ΠΎΡ€ΠΊ. Π’Π΅ΠΏΠ΅Ρ€ΡŒ достаточно просто Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ enableWALArchiving: false Π² рСсурс кластСра PostgreSQL.

Π”Π°, Π±Ρ‹Π»Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΈΠ½Π°Ρ‡Π΅, запустив 2 ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°: ΠΎΠ΄ΠΈΠ½ для staging (Π±Π΅Π· бэкапов), Π° Π²Ρ‚ΠΎΡ€ΠΎΠΉ β€” для production. Но Ρ‚Π°ΠΊ ΠΌΡ‹ смогли ΠΎΠ±ΠΎΠΉΡ‚ΠΈΡΡŒ ΠΎΠ΄Π½ΠΈΠΌ.

Ок, ΠΌΡ‹ Π½Π°ΡƒΡ‡ΠΈΠ»ΠΈΡΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Π² Π±Π°Π·Ρ‹ доступ для S3 ΠΈ бэкапы Π½Π°Ρ‡Π°Π»ΠΈ ΠΏΠΎΠΏΠ°Π΄Π°Ρ‚ΡŒ Π² Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅. Как Π·Π°ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ страницы бэкапов Π² Operator UI?

ΠšΡ€Π°Ρ‚ΠΊΠΈΠΉ ΠΎΠ±Π·ΠΎΡ€ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² PostgreSQL для Kubernetes, наш Π²Ρ‹Π±ΠΎΡ€ ΠΈ ΠΎΠΏΡ‹Ρ‚

Π’ Operator UI потрСбуСтся Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ 3 ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅:

  • SPILO_S3_BACKUP_BUCKET
  • AWS_ACCESS_KEY_ID
  • AWS_SECRET_ACCESS_KEY

ПослС этого ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ бэкапами станСт доступно, Ρ‡Ρ‚ΠΎ Π² нашСм случаС упростит Ρ€Π°Π±ΠΎΡ‚Ρƒ со staging, ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ² Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ Ρ‚ΡƒΠ΄Π° срСзы с production Π±Π΅Π· Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… скриптов.

Π’ качСствС Π΅Ρ‰Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ плюса Π½Π°Π·Ρ‹Π²Π°Π»Π°ΡΡŒ Ρ€Π°Π±ΠΎΡ‚Π° с Teams API ΠΈ ΡˆΠΈΡ€ΠΎΠΊΠΈΠ΅ возмоТности для создания Π±Π°Π· ΠΈ Ρ€ΠΎΠ»Π΅ΠΉ срСдствами ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°. Однако создаваСмыС Ρ€ΠΎΠ»ΠΈ Π½Π΅ ΠΈΠΌΠ΅Π»ΠΈ ΠΏΡ€Π°Π² ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. БоотвСтствСнно, ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ с ΠΏΡ€Π°Π²Π°ΠΌΠΈ Π½Π° Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ Π½Π΅ ΠΌΠΎΠ³ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹.

ΠŸΠΎΡ‡Π΅ΠΌΡƒ Ρ‚Π°ΠΊ? НСсмотря Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π² ΠΊΠΎΠ΄Π΅ Π΅ΡΡ‚ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ GRANT, ΠΎΠ½ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ Π΄Π°Π»Π΅ΠΊΠΎ Π½Π΅ всСгда. Π•ΡΡ‚ΡŒ 2 ΠΌΠ΅Ρ‚ΠΎΠ΄Π°: syncPreparedDatabases ΠΈ syncDatabases. Π’ syncPreparedDatabases β€” нСсмотря Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π² сСкции preparedDatabases Π΅ΡΡ‚ΡŒ Π΅ΡΡ‚ΡŒ условиС defaultRoles ΠΈ defaultUsers для создания Ρ€ΠΎΠ»Π΅ΠΉ, β€” ΠΏΡ€Π°Π²Π° ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π½Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ. ΠœΡ‹ Π² процСссС ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠΈ ΠΏΠ°Ρ‚Ρ‡Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΡ€Π°Π²Π° автоматичСски ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΠ»ΠΈΡΡŒ.

И послСдний ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π² Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… для нас Π΄ΠΎΡ€Π°Π±ΠΎΡ‚ΠΊΠ°Ρ… β€” ΠΏΠ°Ρ‚Ρ‡, Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ Node Affinity Π² создаваСмый StatefulSet. Наши ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρ‹ Π·Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°ΡŽΡ‚ ΡΠΎΠΊΡ€Π°Ρ‰Π°Ρ‚ΡŒ расходы, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ spot-инстансы, Π° Π½Π° Π½ΠΈΡ… явно Π½Π΅ стоит Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ сСрвисы Π‘Π”. Π­Ρ‚ΠΎΡ‚ вопрос ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΠΈ Ρ‡Π΅Ρ€Π΅Π· tolerations, Π½ΠΎ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Node Affinity Π΄Π°Ρ‘Ρ‚ Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ ΡƒΠ²Π΅Ρ€Π΅Π½Π½ΠΎΡΡ‚ΡŒ.

Π§Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ?

По ΠΈΡ‚ΠΎΠ³Π°ΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ пСрСчислСнных ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ ΠΌΡ‹ Ρ„ΠΎΡ€ΠΊΠ½ΡƒΠ»ΠΈ Postgres Operator ΠΎΡ‚ Zalando Π² свой Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ, Π³Π΄Π΅ ΠΎΠ½ собираСтся со ΡΡ‚ΠΎΠ»ΡŒ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌΠΈ ΠΏΠ°Ρ‚Ρ‡Π°ΠΌΠΈ. А для ΠΏΡƒΡ‰Π΅Π³ΠΎ удобства собрали ΠΈ Docker-ΠΎΠ±Ρ€Π°Π·.

Бписок PR, принятых Π² Ρ„ΠΎΡ€ΠΊ:

Π‘ΡƒΠ΄Π΅Ρ‚ Π·Π΄ΠΎΡ€ΠΎΠ²ΠΎ, Ссли сообщСство ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΡ‚ эти PR, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΈ ΠΏΠΎΠΏΠ°Π»ΠΈ Π² upstream со ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ вСрсиСй ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° (1.6).

Бонус! Π˜ΡΡ‚ΠΎΡ€ΠΈΡ успСха с ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠ΅ΠΉ production

Если Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Patroni, Π½Π° ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΌΠΎΠΆΠ½ΠΎ ΠΌΠΈΠ³Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΆΠΈΠ²ΠΎΠΉ production с ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ простоСм.

Spilo позволяСт Π΄Π΅Π»Π°Ρ‚ΡŒ standby-кластСры Ρ‡Π΅Ρ€Π΅Π· S3-Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° с Wal-E, ΠΊΠΎΠ³Π΄Π° Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ Π»ΠΎΠ³ PgSQL сначала сохраняСтся Π² S3, Π° Π·Π°Ρ‚Π΅ΠΌ выкачиваСтся Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΎΠΉ. Но Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ, Ссли Ρƒ вас Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Wal-E Π² старой инфраструктурС? РСшСниС этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΡƒΠΆΠ΅ Π±Ρ‹Π»ΠΎ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΎ Π½Π° Ρ…Π°Π±Ρ€Π΅.

На ΠΏΠΎΠΌΠΎΡ‰ΡŒ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ логичСская рСпликация PostgreSQL. Однако Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ Π²Π΄Π°Π²Π°Ρ‚ΡŒΡΡ Π² Π΄Π΅Ρ‚Π°Π»ΠΈ, ΠΊΠ°ΠΊ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΈ подписки, ΠΏΠΎΡ‚ΠΎΠΌΡƒ что… наш ΠΏΠ»Π°Π½ ΠΏΠΎΡ‚Π΅Ρ€ΠΏΠ΅Π» фиаско.

Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π² Π‘Π” Π±Ρ‹Π»ΠΎ нСсколько Π½Π°Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹Ρ… Ρ‚Π°Π±Π»ΠΈΡ† с ΠΌΠΈΠ»Π»ΠΈΠΎΠ½Π°ΠΌΠΈ строк, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅, ΠΊ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅, постоянно пополнялись ΠΈ ΡƒΠ΄Π°Π»ΡΠ»ΠΈΡΡŒ. ΠŸΡ€ΠΎΡΡ‚Π°Ρ подписка с copy_data, ΠΊΠΎΠ³Π΄Π° новая Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ° ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅Ρ‚ всё содСрТимоС с мастСра, просто Π½Π΅ успСвала Π·Π° мастСром. ΠšΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π° Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΎ нСдСлю, Π½ΠΎ Ρ‚Π°ΠΊ ΠΈ Π½Π΅ Π΄ΠΎΠ³Π½Π°Π»ΠΎ мастСр. Π’ ΠΈΡ‚ΠΎΠ³Π΅, Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ с ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ ΠΏΠΎΠΌΠΎΠ³Π»Π° ΡΡ‚Π°Ρ‚ΡŒΡ ΠΊΠΎΠ»Π»Π΅Π³ ΠΈΠ· Avito: ΠΌΠΎΠΆΠ½ΠΎ пСрСнСсти Π΄Π°Π½Π½Ρ‹Π΅, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ pg_dump. ΠžΠΏΠΈΡˆΡƒ наш (Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π΄ΠΎΡ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹ΠΉ) Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ этого Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°.

ИдСя Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½Π½ΡƒΡŽ подписку, ΠΏΡ€ΠΈΠ²ΡΠ·Π°Π½Π½ΡƒΡŽ ΠΊ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΌΡƒ слоту Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Π½ΠΎΠΌΠ΅Ρ€ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ. Π’ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ Π±Ρ‹Π»ΠΈ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ production’а. Π­Ρ‚ΠΎ Π²Π°ΠΆΠ½ΠΎ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ° ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ консистСнтный dump ΠΈ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ измСнСния ΠΈΠ· мастСра.

Π’ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ…, ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰ΠΈΡ… процСсс ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΈ, Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ обозначСния для хостов:

  1. master β€” исходный сСрвСр;
  2. replica1 β€” потоковая Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ° Π½Π° старом production;
  3. replica2 β€” новая логичСская Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°.

План ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΈ

1. Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Π½Π° мастСрС подписку Π½Π° всС Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π² схСмС public Π±Π°Π·Ρ‹ dbname:

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

2. CΠΎΠ·Π΄Π°Π΄ΠΈΠΌ слот Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π½Π° мастСрС:

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. Π‘Π½ΠΈΠΌΠ΅ΠΌ dump со старой Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ. Π‘ΡƒΠ΄Π΅ΠΌ Π΄Π΅Π»Π°Ρ‚ΡŒ это Π² нСсколько ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², Ρ‡Ρ‚ΠΎ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΡΠΊΠΎΡ€ΠΈΡ‚ΡŒ процСсс:

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. ПослС Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Π΄Π°ΠΌΠΏΠ° ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡŽ Π½Π° ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²ΠΎΠΉ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ΅:

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. Если Ρƒ вас Π΅ΡΡ‚ΡŒ ΠΎΠΏΡ‹Ρ‚ использования схоТих Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ β€” Π±ΡƒΠ΄Π΅ΠΌ Ρ€Π°Π΄Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ подробности Π² коммСнтариях!

P.S.

Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ Ρ‚Π°ΠΊΠΆΠ΅ Π² нашСм Π±Π»ΠΎΠ³Π΅:

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

ΠšΡƒΠΏΠΈΡ‚ΡŒ Π½Π°Π΄Π΅ΠΆΠ½Ρ‹ΠΉ хостинг для сайтов с Π·Π°Ρ‰ΠΈΡ‚ΠΎΠΉ ΠΎΡ‚ DDoS, VPS VDS сСрвСры πŸ”₯ ΠšΡƒΠΏΠΈΡ‚ΡŒ Π½Π°Π΄Π΅ΠΆΠ½Ρ‹ΠΉ хостинг для сайтов с Π·Π°Ρ‰ΠΈΡ‚ΠΎΠΉ ΠΎΡ‚ DDoS, VPS VDS сСрвСры | ProHoster