配置高可用 PostgreSQL 集群

概述

本指南介绍如何在 Kubernetes 上配置高可用 PostgreSQL 集群,使用 Patroni 实现自动故障转移和集群管理,并支持同步复制、连接池、监控等功能。

前提条件

  1. 必须已安装 PostgreSQL Operator
  2. 必须配置支持动态供给的 storage class
  3. 必须授予创建 CRD 资源的权限
  4. 确保 Kubernetes 集群具有充足的资源(至少 3 个可用节点)
  5. 必须配置备份存储(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. 配置连接池器(可选)

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集群节点数量(建议为奇数)
postgresql.version"16"PostgreSQL 主版本(13、14、15 或 16)。
postgresql.parametersPostgreSQL 配置参数
resources-资源请求和限制
volume.size-存储卷大小
volume.storageClass-storage class 名称
volume.iops-IOPS(仅适用于支持 IOPS 的 storage class)

Patroni 配置

ParameterDefault ValueDescription
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 配置

备份配置

ParameterDefault ValueDescription
backup.schedule-备份计划(cron 格式)
backup.retainDay7备份保留天数
backup.storage.bucket-备份存储桶名称
backup.storage.name-存储配置名称
backup.storage.namespace-存储配置 namespace

结果验证

  1. 验证集群状态为 Running
  2. 确认所有 Pods 都正常运行
  3. 检查 Patroni 状态:
    kubectl exec pg-ha-cluster-0 -- patronictl list
  4. 测试故障转移:
    kubectl delete pod pg-ha-cluster-0
    观察新的 leader 选举过程
  5. 验证同步复制状态:
    kubectl exec pg-ha-cluster-0 -- psql -c "SELECT * FROM pg_stat_replication;"

最佳实践

  1. 在生产环境中,使用配置了合适 IOPS 的 SSD 存储
  2. 配置资源限制时保留 20-30% 的缓冲
  3. 定期测试故障转移和恢复操作步骤
  4. 为以下内容配置监控告警:
    • 主从延迟
    • 连接数
    • 磁盘使用率
    • CPU/内存使用率
  5. 启用定时备份并测试恢复操作步骤
  6. 使用同步复制时,至少配置 2 个同步副本
  7. 定期进行性能调优和参数优化

了解更多