Debian 上的 PostgreSQL 集群部署方案
一、方案总览与适用场景
- 流复制 + 自动故障转移(Patroni + etcd/consul):适合需要自动主从切换、多节点统一管理的生产环境。Patroni负责实例生命周期与故障转移,DCS(如etcd/consul)保存集群状态与锁,支持读写分离与同步/异步复制策略。对于跨机房/跨云,可结合HAProxy/Keepalived做入口路由与健康检查。
- 流复制 + 手动切换(repmgr):适合倾向轻量可控、对自动切换要求不高的团队。repmgr提供节点注册、故障检测、切换与克隆能力,部署与运维简单,易于纳入现有体系。
- 分布式横向扩展(Citus):适合多租户 SaaS、实时分析等需要把查询分散到多节点的场景。Citus是PostgreSQL的扩展(extension),通过协调节点与数据分片实现并行查询与扩展。
二、方案一 流复制 + Patroni 自动故障转移(推荐)
- 组件与拓扑
- 数据库节点:建议至少3节点(奇数更易达成一致性),运行PostgreSQL流复制。
- DCS:etcd/consul 3节点(跨机架/可用区部署),保存集群状态与选主信息。
- 入口层:HAProxy/Keepalived(可选VIP),对外暴露读写端口与只读端口,实现读写分离与健康检查。
- 部署步骤(Debian)
- 安装 PostgreSQL 与 Patroni
- apt update && apt install -y postgresql postgresql-contrib
- apt install -y python3-pip && pip3 install patroni[etcd]
- 配置 DCS(以 etcd 为例)
- 在3台 etcd 节点部署集群(示例:/etc/default/etcd),确保 2379/2380 互通。
- 配置 Patroni(/etc/patroni.yml 示例)
- scope: postgres
- namespace: /db/
- name: pg1
- restapi: {listen: 0.0.0.0:8008, connect_address: 192.168.1.11:8008}
- etcd: {host: 192.168.1.21:2379}
- bootstrap:
- dcs: {ttl: 30, loop_wait: 10, retry_timeout: 10, maximum_lag_on_failover: 1048576, postgresql: {use_pg_rewind: true, use_slots: true}}
- initdb: [{encoding: UTF8, locale: en_US.UTF-8}]
- pg_hba: [{type: host, database: replication, user: replicator, address: 192.168.1.0/24, method: md5}]
- postgresql:
- parameters:
- wal_level: replica
- max_wal_senders: 10
- wal_keep_segments: 64
- hot_standby: on
- max_connections: 200
- effective_cache_size: 25%
- 初始化与启动
- 在第一个节点执行:patroni /etc/patroni.yml(引导集群)
- 其余节点启动后自动加入;通过 http://节点IP:8008 查看成员状态。
- 入口与读写分离(HAProxy 示例)
- listen postgres_write
- bind *:5432
- mode tcp
- option httpchk GET /master
- server pg1 192.168.1.11:5432 check port 8008 inter 3s fall 3 rise 2
- server pg2 192.168.1.12:5432 check port 8008 backup
- listen postgres_read
- bind *:5433
- mode tcp
- balance roundrobin
- server pg1 192.168.1.11:5432 check port 8008
- server pg2 192.168.1.12:5432 check port 8008
- server pg3 192.168.1.13:5432 check port 8008
- 关键要点
- 复制与一致性:按需配置 synchronous_standby_names 与 synchronous_commit(如 on/remote_write),在性能与零丢失间权衡。
- 回放加速:启用 use_pg_rewind: true,缩短故障后重建时间。
- 监控与告警:对接 Prometheus + Grafana(Patroni/etcd 均有指标端点),对复制延迟、连接数、WAL堆积设置阈值告警。
三、方案二 流复制 + repmgr 手动/半自动切换
- 适用场景:希望简化依赖(无需DCS),由运维在故障时手动执行切换或脚本化切换。
- 部署步骤(Debian)
- 安装 PostgreSQL 与 repmgr(以 PostgreSQL 14 为例)
- apt-get install -y postgresql-14 postgresql-14-repmgr rsync
- 配置 SSH 免密与 sudo 权限
- 三节点间 postgres 用户互相免密;visudo 授权 postgres 用户执行 systemctl 动作。
- 主库创建复制用户与 repmgr 库
- sudo -u postgres psql -c “CREATE ROLE replicator WITH LOGIN REPLICATION PASSWORD ‘repl_pass’;”
- sudo -u postgres psql -c “CREATE DATABASE repmgr OWNER repmgr;”
- 配置 repmgr(/etc/repmgr.conf)
- node_id=1
- node_name=‘node1’
- conninfo=‘host=192.168.1.11 user=repmgr dbname=repmgr password=repmgr_pass’
- data_directory=‘/var/lib/postgresql/14/main’
- pg_basebackup_options=‘–wal-method=stream’
- 注册主库与备库
- 主库:repmgr -f /etc/repmgr.conf primary register
- 备库:pg_basebackup -h 主库 -U replicator -D /var/lib/postgresql/14/main -P -X stream
- 备库:repmgr -f /etc/repmgr.conf standby register
- 切换与故障处理
- 手动切换:repmgr standby switchover -f /etc/repmgr.conf
- 故障提升:repmgr standby promote -f /etc/repmgr.conf
- 关键要点
- 依赖 rsync 与 SSH 做基础备份与节点克隆,网络与权限需严格收敛。
- 建议配合 虚拟IP/HAProxy 做入口漂移,减少应用改动。
四、方案三 分布式横向扩展 Citus(多租户/实时分析)
- 适用场景:需要跨节点并行查询、大表分片与协调节点路由的业务。
- 部署步骤(Debian)
- 安装 PostgreSQL 14 与 Citus 扩展
- curl https://install.citusdata.com/community/deb.sh | sudo bash
- apt-get -y install postgresql-14-citus-10.2
- 初始化协调节点
- sudo su - postgres
- echo “shared_preload_libraries = ‘citus’” >> $PGDATA/postgresql.conf
- pg_ctl -D $PGDATA -o “-p 5432” start
- psql -p 5432 -c “CREATE EXTENSION citus;”
- 添加工作节点
- psql -p 5432 -c “SELECT * from citus_add_node(‘192.168.1.12’, 5432);”
- psql -p 5432 -c “SELECT * from citus_add_node(‘192.168.1.13’, 5432);”
- 验证
- psql -p 5432 -c “SELECT citus_version();”
- 关键要点
- Citus 是 PostgreSQL 扩展,通过协调节点分发查询到分片节点,适合多租户与实时分析;开发/测试可用 Docker 快速体验,生产需部署多节点集群。
五、备份恢复与日常运维
- 备份策略
- 物理备份:基于 WAL 归档 的 pg_basebackup 全量 + 持续归档,支持时间点恢复(PITR)。
- 逻辑备份:使用 pg_dump/pg_dumpall 做对象级备份与迁移(不替代PITR)。
- 恢复演练
- 定期在隔离环境演练 PITR 与 备库重建,验证 WAL保留 与 恢复目标时间 是否满足 RPO/RTO。
- 监控与日志
- 关注 复制延迟、WAL堆积、连接数/锁、慢查询;结合 Prometheus/Grafana 与日志采集,建立阈值告警与容量水位预警。