Ubuntu 上的 PostgreSQL 集群部署方案
一、方案总览与选型
- 生产最通用:基于 Patroni + etcd + HAProxy/Keepalived + PgBouncer 的高可用集群,支持自动故障切换(failover/switchover)、同步/异步复制、通过 REST API 管理、可接入 Kubernetes,适合大多数业务场景。
- 轻量高可用:基于 repmgr 的集群(原生流复制 + 故障检测/切换),在容器化场景可用 Bitnami/postgresql-repmgr 镜像快速落地。
- 读写分离/分库分表:基于 PL/Proxy 的代理分片方案,适合按业务键做水平拆分与结果合并。
- 大规模 MPP/OLAP:基于 Postgres-XL(含 GTM/GTM-Proxy/Coordinator/Data Node),适合复杂查询与横向扩展,但组件多、运维复杂度高。
- 入门与测试:Docker 快速起一主一从,便于功能验证与演练,不建议直接用于生产。
上述方案在 Ubuntu 上均有成熟实践与文档支撑,可按规模与一致性要求选择其一或组合落地。
二、推荐方案 生产级 Patroni + etcd + HAProxy/Keepalived + PgBouncer
- 架构与端口
- 数据库层:3 节点运行 PostgreSQL + Patroni,通过 流复制 实现主从;Patroni 提供 REST API(默认 8008) 与健康检查。
- 一致性协调:3 节点 etcd(建议奇数)用于 DCS 元数据与选主;开放 2379/2380。
- 接入层:2 台 HAProxy 做读写分离与健康检查,配合 Keepalived VIP 对外提供稳定地址;开放 5432。
- 连接池:可选 PgBouncer 在 HAProxy 之后做会话/事务级连接复用。
- 关键配置要点(Patroni 示例)
- 复制与一致性:设置 wal_level=replica(或更高)、max_wal_senders、max_replication_slots、hot_standby=on;按需启用 synchronous_commit 与 synchronous_standby_names 实现强一致。
- 故障恢复:开启 use_pg_rewind=true,配合复制槽(use_slots)加速旧主回切;设置合理的 ttl/loop_wait/retry_timeout。
- 初始化与认证:bootstrap 阶段创建复制用户与基础对象;pg_hba.conf 放行复制与业务网段(建议用 scram-sha-256)。
- 服务与 API:Patroni 以 systemd 托管,REST API 用于查询成员状态、触发 switchover/failover。
- 快速验证
- 查看集群:patronictl -c /etc/patroni.yml list(应见 Leader/Replica 状态与延迟)。
- 切换演练:patronictl switchover/switchover --force(先在测试环境验证)。
- 连接测试:应用连接 VIP:5432,读请求可指向 replica 的 HAProxy 后端,写请求指向 leader 后端。
该方案在 Ubuntu 20.04 等版本已有完整实践,包含 etcd + Patroni + PgBouncer + HAProxy + Keepalived 的组合部署与端口规划,可直接按生产规范裁剪落地。
三、其他可选方案对比与适用场景
| 方案 |
架构要点 |
一致性/切换 |
适用场景 |
复杂度 |
| repmgr |
原生流复制 + repmgrd 监控/切换 |
自动故障检测与提升,支持见证节点 |
传统主从 HA、容器化(镜像) |
中 |
| PL/Proxy |
代理节点分发 SQL,后端分片执行并合并结果 |
应用侧分片逻辑,弱一致性需自洽 |
读写分离、水平拆分 |
中-高 |
| Postgres-XL |
GTM 全局事务、Coordinator/Data Node |
强一致依赖 GTM,单点风险需高可用设计 |
MPP/大数据量 OLAP |
高 |
| Docker 一主一从 |
容器快速部署,主从同步 |
手动/脚本切换,适合演练 |
测试/CI |
低 |
| 以上方案在 Ubuntu 上均有落地教程与示例,可按业务规模、一致性需求与运维能力选择。 |
|
|
|
|
四、部署与运维要点清单
- 基础与网络
- 所有节点启用 NTP/chrony 时钟同步;规划 VIP 与 安全组/防火墙 放行 5432(PostgreSQL)/8008(Patroni)/2379/2380(etcd)。
- 数据目录权限:0700,运行用户为 postgres;SSH 免密用于运维自动化(可选)。
- 复制与参数
- 建议:WAL 级别至少 replica;开启 hot_standby;按连接数调 max_wal_senders/replication_slots;使用 scram-sha-256 认证;必要时启用 synchronous_commit 与 synchronous_standby_names。
- 连接与负载
- 生产建议接入 PgBouncer(事务/会话池化),HAProxy 做读写分离与健康检查;对外暴露 VIP 提升可用性。
- 备份与恢复
- 结合 pgBackRest/Barman/WAL-G 做连续归档与时间点恢复(PITR);定期演练恢复流程与 RPO/RTO 评估。
- 监控与告警
- 监控 Patroni/etcd/HAProxy 指标与复制延迟;设置主从延迟、连接数、WAL 堆积等阈值告警;保留错误日志与审计日志。
- 切换与演练
- 定期执行 switchover/failover 演练,验证 pg_rewind 回切、复制槽重建、应用重连与 VIP 漂移是否正常。
这些要点与参数在 Patroni 实践文档、流复制部署与 Ubuntu 环境指南中均有体现,可作为上线前检查清单执行。