配置高可用 PostgreSQL 集群

功能简介

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

使用场景

  • 生产环境数据库部署
  • 关键业务系统数据库
  • 需要高可用保障的应用场景
  • 需要自动故障转移和恢复
  • 需要读写分离和负载均衡

前置条件

  1. 已安装 PostgreSQL Operator
  2. 配置了支持动态供给的存储类
  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: "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.parametersPostgreSQL 配置参数
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. 查看集群状态是否为 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% 的 buffer
  3. 定期测试故障转移和恢复流程
  4. 配置监控告警,包括:
    • 主从延迟
    • 连接数
    • 磁盘使用率
    • CPU/内存使用率
  5. 启用定期备份并测试恢复流程
  6. 使用同步复制时,建议配置至少 2 个同步副本
  7. 定期进行性能调优和参数优化

了解更多