Что такое Patroni для PostgreSQL?

«Что такое Patroni для PostgreSQL?» — вопрос из категории Базы данных, который задают на 24% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Patroni — это проект с открытым исходным кодом на Python для управления отказоустойчивыми (High Availability) кластерами PostgreSQL. Он не является частью PostgreSQL, а выступает как внешний оркестратор, автоматизирующий репликацию, переключение при отказе (failover) и восстановление (failback).

Ключевые принципы работы:

  1. Распределённое хранилище конфигурации (DCS): Patroni использует etcd, ZooKeeper или Consul как источник истины для хранения состояния кластера (кто мастер, кто реплики, конфигурация). Это предотвращает "split-brain" (ситуацию с двумя мастерами).
  2. Автоматический failover: Если мастер перестаёт отвечать, Patroni на основе консенсуса в DCS автоматически назначает новую мастер-реплику из числа синхронных или асинхронных.
  3. Управление 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 для сбора метрик о состоянии кластера и репликации.