Open Source
Patroni PostgreSQL HA
基于 Patroni、etcd、PgBouncer 和 HAProxy,只需运行一次 Ansible Playbook 即可构建 PostgreSQL 高可用(HA)集群的开源项目。
Apache License 2.0 · 开源GitHub 仓库
SQL 连接与集群控制
应用连接经过 VIP、HAProxy 和 PgBouncer 到达 PostgreSQL;Patroni 与 etcd 通过独立控制路径协调主节点状态。

- 1.选择连接端口
- 同一 VIP 的 5000 端口接收读写连接,5001 端口优先连接副本。Keepalived 管理 HAProxy 主机上的 VIP。
- 2.路由与连接池
- HAProxy 根据 Patroni 的 /primary 和 /replica 响应选择目标,再转发到目标数据库主机上的 PgBouncer 6432 端口。
- 3.存储与复制
- PgBouncer 连接本机 PostgreSQL 5432 端口。WAL 从主节点流式复制到副本;SQL 流量不经过 Patroni。
- 4.协调主节点状态
- 各数据库主机上的 Patroni 管理 etcd 主节点键,并控制本机 PostgreSQL 升级或降级。健康检查和控制与 SQL 连接路径分离。
默认采用异步复制;没有健康副本时,读取端口回退到主节点。3 个 etcd 成员的法定人数为 2。
查看GitHub文档与代码从主节点故障到重新连接
依次查看主节点租约过期、新主节点选举、健康检查以及应用重新连接的过程。

- 1.检测主节点故障
- 原主节点无法续期 etcd 租约后,租约过期。HAProxy 也通过健康检查移除故障连接目标。
- 2.获取主节点锁
- 符合升级条件的副本由 Patroni 获取 etcd 主节点键。切换依赖 etcd 法定人数和复制状态。
- 3.升级并调整路由
- 新主节点上的 PostgreSQL 完成升级,Patroni /primary 返回 200 后,HAProxy 将写入连接转发到该主机的 PgBouncer。
- 4.重新连接并验证
- 应用向同一 VIP:5000 建立新连接。通过 patronictl 和 SQL 检查角色与复制状态;原主节点重新加入属于后续恢复步骤。
默认主节点 TTL 为 30 秒,Patroni 检查周期为 10 秒。切换时间取决于状态和配置;数据库主节点变化不一定导致 VIP 迁移。
查看GitHub文档与代码选择部署拓扑并验证
选择独立 etcd 主机或三机融合部署,并验证生成的集群。

- 1.分离拓扑
- 使用三个独立 etcd 节点和至少两个数据库节点。
- 2.融合拓扑
- 将六个组件共置于三台服务器。
- 3.组件职责
- 区分 SQL 路由、连接池、存储与主节点协调。
- 4.自动化
- 配置清单、部署服务并验证路由与复制。
文档列出 PostgreSQL 14–17,默认 16。故障切换可能中断会话;同步复制和 pgBackRest 为可选项。
查看GitHub文档与代码