Отказоустойчивый кластер PostgreSQL с автоматическим промоутом через Patroni и etcd
- Единая точка отказа (SPOF) в standalone инстансе PostgreSQL.
- Необходимость ручного переключения реплики (promote) при падении primary ноды.
- Риск возникновения ситуации Split-Brain при сетевых изолированностях (Network Partitioning).
- Рассинхронизация конфигураций реплик в кластере.
1. Архитектура решения
Кластер строится на базе 3 нод с etcd (Distributed Configuration Store) и демонов Patroni, управляющих жизненным циклом экземпляров PostgreSQL.
2. Конфигурация Patroni (/etc/patroni/patroni.yml)
scope: pg-cluster
namespace: /service
name: pg-node-01
restapi:
listen: 0.0.0.0:8008
connect_address: 192.168.10.11:8008
etcd3:
hosts:
- 192.168.10.11:2379
- 192.168.10.12:2379
- 192.168.10.13:2379
bootstrap:
dcs:
ttl: 30
loop_wait: 10
retry_timeout: 10
maximum_lag_on_failover: 1048576
postgresql:
use_pg_rewind: true
use_slots: true
parameters:
wal_level: replica
max_wal_senders: 10
max_replication_slots: 10
hot_standby: "on"
postgresql:
listen: 0.0.0.0:5432
connect_address: 192.168.10.11:5432
data_dir: /var/lib/postgresql/15/main
bin_dir: /usr/lib/postgresql/15/bin
pgpass: /var/lib/postgresql/.pgpass
authentication:
replication:
username: replicator
password: Replicat0rStrongPass
superuser:
username: postgres
password: PostgresSuperSecretPass3. Управление кластером через patronictl
# Проверка статуса всех нод и лидера кластера
patronictl -c /etc/patroni/patroni.yml list
# Безопасный плановый перенос роли Master (Switchover)
patronictl -c /etc/patroni/patroni.yml switchover
# Просмотр топологии и параметров DCS
patronictl -c /etc/patroni/patroni.yml topology4. Интеграция с балансировщиком HAProxy
HAProxy опрашивает REST API Patroni на порту 8008 для маршрутизации трафика:
backend pg_cluster_primary
mode tcp
option httpchk GET /primary
http-check expect status 200
server pg1 192.168.10.11:5432 check port 8008
server pg2 192.168.10.12:5432 check port 8008
server pg3 192.168.10.13:5432 check port 8008 Частые вопросы (FAQ)
Что предотвращает Split-Brain в связке Patroni + etcd?
Лидер удерживает ключ блокировки (Leader Lock) в etcd через регулярный heartbeat. Если связь с etcd теряется, Patroni автоматически понижает локальный Master до Read-Only (demote) до истечения TTL.
Зачем в Patroni включать параметр use_pg_rewind: true?
pg_rewind позволяет бывшему Master, отставшему от нового лидера после failover, синхронизировать разницу журналов WAL без полной повторной инициализации через pg_basebackup.