• Русский
  • Настройка кластера PostgreSQL с высокой доступностью

    Overview

    В этом руководстве описывается, как настроить высокодоступный кластер PostgreSQL в Kubernetes с использованием Patroni для автоматического переключения и управления кластером, с поддержкой синхронной репликации, пуллинга подключений, мониторинга и других функций.

    Prerequisites

    1. Должен быть установлен PostgreSQL Operator
    2. Должен быть настроен storage class с поддержкой динамического выделения
    3. Должны быть предоставлены права на создание ресурсов CRD
    4. Убедитесь, что в Kubernetes кластере достаточно ресурсов (не менее 3 доступных узлов)
    5. Должено быть настроено хранилище для бэкапов (S3 или совместимое хранилище)

    Procedure

    CLI
    Web Console

    1. Создайте кластер с высокой доступностью

    cat <<EOF | kubectl create -n $NAMESPACE -f -
    apiVersion: acid.zalan.do/v1
    kind: postgresql
    metadata:
      name: pg-ha-cluster
    spec:
      teamId: ACID
      enableExporter: true
      enablePgpool2: false
      spiloPrivileged: false
      spiloRunAsGroup: 103
      spiloRunAsUser: 101
      spiloAllowPrivilegeEscalation: false
      enableReadinessProbe: true
      numberOfInstances: 3
      postgresql:
        version: "16"
        parameters:
          shared_buffers: "1GB"
          work_mem: "64MB"
      resources:
        requests:
          cpu: "1"
          memory: 2Gi
        limits:
          cpu: "2"
          memory: 4Gi
      volume:
        size: 50Gi
        storageClass: ssd
        iops: 3000
        throughput: 125
      patroni:
        ttl: 30
        loop_wait: 10
        retry_timeout: 10
        maximum_lag_on_failover: 1048576
        synchronous_mode: true
        synchronous_node_count: 2
        pg_hba:
          - host all all 0.0.0.0/0 md5
      backup:
        schedule: "0 0 * * *"
        retainDay: 7
        storage:
          bucket: "my-backups"
          name: "backup-storage"
          namespace: "default"
    EOF

    2. Проверьте статус кластера

    kubectl -n $NAMESPACE get postgresql pg-ha-cluster -o yaml

    Пример вывода:

    status:
      PostgresClusterStatus: Running
      pods:
      - pg-ha-cluster-0
      - pg-ha-cluster-1
      - pg-ha-cluster-2
      master: pg-ha-cluster-0
      patroniStatus:
        pg-ha-cluster-0:
          role: leader
          state: running
          replication:
            state: streaming
            sync_state: sync
        pg-ha-cluster-1:
          role: replica
          state: running
          replication:
            state: streaming
            sync_state: async

    3. Настройте пуллинг подключений (опционально)

    kubectl patch postgresql pg-ha-cluster --type='merge' -p '
    spec:
      enableConnectionPooler: true
      connectionPooler:
        numberOfInstances: 2
        mode: "transaction"
        resources:
          requests:
            cpu: "500m"
            memory: "512Mi"
          limits:
            cpu: "1"
            memory: "1Gi"
    '

    4. Настройте мониторинг (опционально)

    kubectl patch postgresql pg-ha-cluster --type='merge' -p '
    spec:
      enableExporter: true
      exporter:
        resources:
          requests:
            cpu: "200m"
            memory: "256Mi"
          limits:
            cpu: "500m"
            memory: "512Mi"
    '

    Key Parameters

    Конфигурация кластера

    ПараметрЗначение по умолчаниюОписание
    numberOfInstances3Количество узлов кластера (рекомендуется нечетное число)
    postgresql.version"16"Основная версия PostgreSQL (14 или 16)
    postgresql.parametersПараметры конфигурации PostgreSQL
    resources-Запросы и лимиты ресурсов
    volume.size-Размер тома хранилища
    volume.storageClass-Имя storage class
    volume.iops-IOPS (только для storage class с поддержкой IOPS)

    Конфигурация Patroni

    ПараметрЗначение по умолчаниюОписание
    patroni.ttl30Время аренды мастера (в секундах)
    patroni.loop_wait10Интервал проверки состояния (в секундах)
    patroni.retry_timeout10Таймаут повторной попытки (в секундах)
    patroni.maximum_lag_on_failover1048576Максимально допустимая задержка репликации (в байтах)
    patroni.synchronous_modefalseВключение синхронной репликации
    patroni.synchronous_node_count1Количество узлов синхронной репликации
    patroni.pg_hba[]Пользовательская конфигурация pg_hba

    Конфигурация бэкапов

    ПараметрЗначение по умолчаниюОписание
    backup.schedule-Расписание бэкапов (cron-формат)
    backup.retainDay7Количество дней хранения бэкапов
    backup.storage.bucket-Имя бакета для хранения бэкапов
    backup.storage.name-Имя конфигурации хранилища
    backup.storage.namespace-Namespace конфигурации хранилища

    Проверка результата

    1. Убедитесь, что статус кластера — Running
    2. Проверьте, что все Pod работают нормально
    3. Проверьте статус Patroni:
      kubectl exec pg-ha-cluster-0 -- patronictl list
    4. Проверьте переключение мастера:
      kubectl delete pod pg-ha-cluster-0
      Наблюдайте процесс выбора нового лидера
    5. Проверьте статус синхронной репликации:
      kubectl exec pg-ha-cluster-0 -- psql -c "SELECT * FROM pg_stat_replication;"

    Рекомендации по эксплуатации

    1. Для продакшен-сред используйте SSD-хранилище с соответствующей конфигурацией IOPS
    2. Настраивайте лимиты ресурсов с запасом 20-30%
    3. Регулярно тестируйте процедуры переключения и восстановления
    4. Настройте оповещения мониторинга по:
      • Задержке между primary и replica
      • Количеству подключений
      • Использованию диска
      • Использованию CPU и памяти
    5. Включайте плановые бэкапы и проверяйте процедуры восстановления
    6. При использовании синхронной репликации настраивайте не менее 2 синхронных реплик
    7. Регулярно выполняйте оптимизацию производительности и настройку параметров

    Learn More