Ubuntu 下 PostgreSQL 集群搭建指南
一 方案选型与适用场景
- 原生流复制 Streaming Replication:一主多备,支持同步/异步复制,部署简单,适合高可用 + 读写分离。
- 逻辑复制 Logical Replication:表级复制,支持跨版本/跨库,适合迁移/分发/部分表同步。
- 自动化高可用:
- Patroni + etcd/ZooKeeper:自动故障切换、弹性伸缩、REST API 与监控集成。
- pg_repmgr:围绕流复制的集群管理工具,提供克隆/跟随/故障转移与守护进程。
- Pgpool-II:连接池、读写分离、负载均衡与高可用中间件。
- 分布式数据库:
- Citus:PostgreSQL 扩展,实现自动分片 + 协调节点,适合大规模 OLAP/HTAP。
- Postgres-XL/XC:多组件架构(含 GTM/GTM-Proxy/Coordinator/Data Node),适合大规模 OLTP。
- 选型建议:
- 以高可用与读写分离为主:优先选流复制 + Patroni/pg_repmgr。
- 需要跨库/跨版本/部分表同步:选逻辑复制。
- 需要水平扩展与透明分片:选Citus;若已有历史沉淀或特定需求,再考虑 Postgres-XL/XC。
二 快速落地 一主一从流复制
- 环境准备(示例):
- 主库:192.168.22.131,备库:192.168.22.215,版本:PostgreSQL 14。
- 安装 PostgreSQL 14(两台机器):
- 添加官方源并安装:
- echo “deb https://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main” | sudo tee /etc/apt/sources.list.d/pgdg.list
- wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
- sudo apt update && sudo apt install -y postgresql-14 postgresql-client-14
- sudo systemctl start postgresql@14-main && sudo systemctl enable postgresql@14-main
- 主库配置:
- 创建复制用户:
- sudo -u postgres psql -c “CREATE USER replicator WITH REPLICATION ENCRYPTED PASSWORD ‘StrongPass123’;”
- 修改 /etc/postgresql/14/main/postgresql.conf:
- listen_addresses = ‘*’
- wal_level = replica
- max_wal_senders = 10
- max_replication_slots = 10(可选,强烈建议启用)
- hot_standby = on
- 修改 /etc/postgresql/14/main/pg_hba.conf(允许备库复制):
- host replication replicator 192.168.22.215/32 md5
- 重启主库:sudo systemctl restart postgresql@14-main
- 备库配置:
- 清空数据目录并拉取基础备份:
- sudo systemctl stop postgresql@14-main
- sudo -u postgres rm -rf /var/lib/postgresql/14/main/*
- sudo -u postgres pg_basebackup -h 192.168.22.131 -U replicator -D /var/lib/postgresql/14/main -F p -X stream -v -R -P
- 说明:-R 会自动在备库生成 standby.signal 与 primary_conninfo。
- 验证:
- 主库:sudo -u postgres psql -c “SELECT * FROM pg_stat_replication;”(应看到备库连接与状态)
- 备库:sudo -u postgres psql -c “SELECT pg_is_in_recovery();”(应返回 t)
- 可选增强:
- 启用同步复制(零数据丢失,性能下降):
- 主库 postgresql.conf:synchronous_standby_names = ‘standby1’(备库名可在 recovery.conf 的 primary_slot_name 设置)
- synchronous_commit = on
- 使用复制槽避免 WAL 过早回收:
- 主库:SELECT pg_create_physical_replication_slot(‘standby1_slot’);
- 备库 recovery.conf/standby.signal 同级目录创建 standby.slot_name = ‘standby1_slot’。
三 自动化高可用与中间件
- Patroni(推荐):
- 组件:Patroni + etcd/ZooKeeper/Consul(DCS)。
- 特性:自动故障切换、弹性伸缩、REST API、与 Ansible/K8s 友好。
- 快速要点:
- 安装:sudo apt install -y patroni
- 配置 /etc/patroni.yml(定义 scope、etcd、bootstrap、postgresql 参数、HA 策略等)
- 启动:patroni /etc/patroni.yml
- 建议开启:use_pg_rewind、use_slots、ttl/loop_wait 等参数。
- pg_repmgr:
- 安装:sudo apt install -y postgresql--repmgr(或社区包)。
- 主库:创建 repmgr 库与用户,配置 repmgr.conf(node_id、node_name、conninfo、data_directory)。
- 备库:repmgr standby clone 拉取数据,repmgr standby follow 跟随;启动 repmgrd 守护进程实现自动故障转移。
- Pgpool-II:
- 作用:连接池、负载均衡、健康检查、自动故障转移(配合流复制)。
- 部署:安装 pgpool2,配置后端节点与健康检查,启用 pgpool_hba.conf 与 pc.conf,建议与 Patroni/pg_repmgr 分工(Pgpool-II 负责连接与负载,Patroni/pg_repmgr 负责选主与切换)。
四 分布式与分片方案
- Citus:
- 特性:PostgreSQL 扩展,提供分布式表/引用表、协调节点、分片并行查询,对多租户与实时分析友好。
- 部署:在协调节点与数据节点安装 Citus 扩展,使用 CREATE DISTRIBUTED TABLE 分布数据,结合复制与分片策略实现高可用与扩展。
- Postgres-XL/XC:
- 架构:包含 GTM(全局事务管理)/GTM-Proxy/Coordinator/Data Node。
- 特点:支持分布式事务与 SQL 解析分离,适合大规模 OLTP;部署与运维复杂度较高,需关注 GTM 单点与扩展策略。
五 运维与故障演练清单
- 日常巡检:
- 复制状态:SELECT * FROM pg_stat_replication;(检查 state、sent_lsn、write_lsn、flush_lsn、replay_lsn)
- 备库恢复:SELECT pg_is_in_recovery();(t 表示在恢复)
- 复制槽:SELECT * FROM pg_replication_slots;(确认 active、restart_lsn)
- WAL 与空间:监控 pg_wal/ 目录与 archive_command 成功与否。
- 安全加固:
- 仅开放必要网段与账户;使用强口令/证书;限制 replication 权限;pg_hba.conf 采用最小权限原则。
- 备份恢复:
- 物理备份:pg_basebackup + WAL 归档(PITR);定期验证备份可恢复性。
- 逻辑备份:pg_dump/pg_dumpall 用于迁移与部分对象恢复。
- 切换与演练:
- 计划内切换(switchover):主备角色平滑切换,验证应用无感。
- 故障演练(failover):停主库或断网,验证 Patroni/pg_repmgr 自动切换与数据一致性;演练后复盘并修正参数(如超时、重试、slots、网络)。