Ответ
Patroni — это проект с открытым исходным кодом на Python для управления отказоустойчивыми (High Availability) кластерами PostgreSQL. Он не является частью PostgreSQL, а выступает как внешний оркестратор, автоматизирующий репликацию, переключение при отказе (failover) и восстановление (failback).
Ключевые принципы работы:
- Распределённое хранилище конфигурации (DCS): Patroni использует etcd, ZooKeeper или Consul как источник истины для хранения состояния кластера (кто мастер, кто реплики, конфигурация). Это предотвращает "split-brain" (ситуацию с двумя мастерами).
- Автоматический failover: Если мастер перестаёт отвечать, Patroni на основе консенсуса в DCS автоматически назначает новую мастер-реплику из числа синхронных или асинхронных.
- Управление PostgreSQL: Patroni напрямую управляет конфигурационными файлами PostgreSQL (
postgresql.conf,pg_hba.conf) и его процессом, запуская/останавливая сервис.
Пример базовой конфигурации patroni.yml для узла:
scope: production-cluster # Имя кластера
name: pg-node-1 # Уникальное имя узла
restapi: # API для управления и мониторинга
listen: 0.0.0.0:8008
connect_address: 10.0.1.1:8008
etcd: # Настройки DCS
hosts:
- 10.0.1.10:2379
- 10.0.1.11:2379
- 10.0.1.12:2379
bootstrap: # Конфигурация для инициализации нового кластера
dcs:
ttl: 30
loop_wait: 10
retry_timeout: 10
postgresql:
use_pg_rewind: true # Использовать pg_rewind для быстрого восстановления старого мастера
parameters:
wal_level: logical
hot_standby: "on"
max_wal_senders: 10
wal_keep_size: 1GB
postgresql: # Параметры конкретного экземпляра PostgreSQL
listen: 0.0.0.0:5432
connect_address: 10.0.1.1:5432
data_dir: /var/lib/postgresql/14/main
bin_dir: /usr/lib/postgresql/14/bin
Преимущества в DevOps-практике:
- Стандартизация: Конфигурация HA-кластера описывается в YAML.
- Интеграция с оркестраторами: Существуют готовые Helm-чарты для Kubernetes и интеграции с Ansible.
- Мониторинг через REST API: Легко интегрируется с Prometheus для сбора метрик о состоянии кластера и репликации.