搭建 PostgreSQL 高可用集群

适用场景

用 Patroni + etcd + HAProxy/VIP 搭建 1 主多从的 PostgreSQL 高可用集群,支持自动故障切换和读写分离。

前置条件

步骤

  1. 安装 PostgreSQL、Patroni、etcd 和 HAProxy。

  2. 配置 etcd 集群(3 节点奇数)。

  3. 配置 /etc/patroni.yml:

scope: pg-cluster
name: pg1
restapi:
  listen: 0.0.0.0:8008
  connect_address: 10.0.0.11:8008
etcd3:
  hosts: 10.0.0.11:2379,10.0.0.12:2379,10.0.0.13:2379
bootstrap:
  dcs:
    ttl: 30
    loop_wait: 10
    retry_timeout: 10
    maximum_lag_on_failover: 1048576
postgresql:
  listen: 0.0.0.0:5432
  data_dir: /var/lib/postgresql/16/main
  authentication:
    replication:
      username: replicator
      password: secret
  1. 启动第一个节点并初始化,其他节点用相同配置加入。

  2. 验证集群:

patronictl -c /etc/patroni.yml list
patronictl -c /etc/patroni.yml topology
  1. 配置 HAProxy 指向 Patroni REST API 或主库端口,提供读写/只读入口。

  2. 测试切换:

patronictl -c /etc/patroni.yml switchover
patronictl -c /etc/patroni.yml failover

验证

回滚

常见坑

相关命令

读完自测

合上页面,先回答,再展开对照。

  1. 搭建 PostgreSQL 高可用集群前,对节点、DCS 和负载均衡有什么要求?
  2. 如何验证集群的高可用和切换确实有效?
  3. 回滚到旧集群或旧主库时要注意什么?
答案
  1. 至少 3 台数据库节点,准备 3 节点奇数 etcd/Consul DCS、时间同步、稳定网络、独立数据盘,以及 HAProxy+Keepalived 或云 LB 和备份方案。
  2. 用 patronictl list 确认 1 leader + N replica,验证主库写入、备库只读和复制延迟,做一次计划内 switchover 确认无数据丢失且 VIP/LB 正常切换,并确认备份和 WAL 归档正常。
  3. 保留原单机/旧集群和备份,关闭 Patroni 自动切换并手动指向旧主库,恢复连接串和负载均衡配置;旧主回退需要 pg_rewind,不一定总能成功。