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

    Содержание

    Обзор

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

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

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

    Процедура

    CLI
    Веб-консоль

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

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

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

    ПараметрЗначение по умолчаниюОписание
    numberOfInstances3Количество узлов кластера (рекомендуется нечётное число)
    postgresql.version"14"Основная версия PostgreSQL
    postgresql.parametersПараметры конфигурации PostgreSQL
    resources-Запросы и ограничения ресурсов
    volume.size-Размер тома хранилища
    volume.storageClass-Название класса хранения
    volume.iops-IOPS (только для классов хранения, поддерживающих 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-Пространство имен конфигурации хранилища

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

    1. Проверьте, что статус кластера - Рабочий
    2. Подтвердите, что все Pods работают нормально
    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. Настройте системы мониторинга для предупреждений о:
      • Задержке между основным узлом и репликами
      • Количестве соединений
      • Использовании диска
      • Использовании CPU/памяти
    5. Включите запланированные резервные копирования и протестируйте процедуры восстановления
    6. При использовании синхронной репликации настройте как минимум 2 синхронные реплики
    7. Регулярно проводите оптимизацию производительности и настройку параметров

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