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

    Обзор

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

    Предварительные требования

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

    Процедура

    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. Настройте connection pooler (необязательно)

    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"
    '

    Ключевые параметры

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

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

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

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

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

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

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

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

    Рекомендации

    1. Для production-сред используйте SSD storage с подходящей конфигурацией IOPS
    2. Настраивайте лимиты ресурсов с запасом 20-30%
    3. Регулярно тестируйте процедуры failover и восстановления
    4. Настройте оповещения мониторинга для:
      • задержки между primary и replica
      • количества connections
      • использования disk
      • использования CPU/memory
    5. Включайте scheduled backups и тестируйте процедуры restore
    6. При использовании синхронной репликации настраивайте не менее 2 синхронных replicas
    7. Регулярно выполняйте настройку производительности и оптимизацию параметров

    Узнать больше