Ubuntu 上搭建 PostgreSQL 集群的可落地方案
一、方案选型与架构
- 流复制一主多从(基础高可用):基于 PostgreSQL 原生 Streaming Replication,主库可读写,从库只读,部署与维护简单,适合大多数业务起步与中小规模场景。
- repmgr 管理的高可用集群:在流复制之上引入 repmgr 做节点注册、监控、切换与故障转移,提供 CLI 与守护进程,便于自动化运维与快速故障恢复。
- Patroni + etcd + HAProxy/Keepalived(企业级自动故障转移):由 Patroni 管理数据库实例生命周期与选主,etcd 保存集群状态,HAProxy/Keepalived 提供统一的读写分离入口与 VIP 漂移,适合对高可用与自动化要求较高的生产环境。
二、方案一 流复制一主多从(手动切换)
- 环境准备
- 节点示例:主库 192.168.1.10,从库 192.168.1.11(可扩展多从)。
- 建议 Ubuntu 22.04/24.04,PostgreSQL 14/15/16 保持一致;同步系统时间(如 NTP),放通 5432 端口(或内网互通)。
- 主库配置
- 安装
sudo apt update && sudo apt install -y postgresql postgresql-contrib
- 修改 postgresql.conf(路径随版本可能为 /etc/postgresql/15/main/ 或 /var/lib/postgresql/15/main/)
wal_level = replica
max_wal_senders = 10
wal_keep_size = 128MB
hot_standby = on
listen_addresses = ‘*’
- 创建复制用户并授权
sudo -u postgres psql -c “CREATE ROLE repl WITH REPLICATION LOGIN PASSWORD ‘replpass’;”
- 配置 pg_hba.conf(允许从库复制)
host replication all 192.168.1.11/32 md5
- 重启主库
sudo systemctl restart postgresql
- 从库配置
- 停止并清空数据目录
sudo systemctl stop postgresql
rm -rf /var/lib/postgresql/15/main/*
- 拉取主库基础备份(会自动创建 standby.signal 与 primary_conninfo)
pg_basebackup -h 192.168.1.10 -D /var/lib/postgresql/15/main -U repl -P -R
- 启动从库
sudo systemctl start postgresql
- 验证
- 主库:sudo -u postgres psql -c “SELECT pg_is_in_recovery();” 应返回 f
- 从库:sudo -u postgres psql -c “SELECT pg_is_in_recovery();” 应返回 t
- 在主库写入数据,在从库验证是否同步。
三、方案二 repmgr 高可用集群(自动故障转移)
- 安装组件
- 所有节点安装 PostgreSQL 与 repmgr(示例为 14/15/16):
sudo apt update && sudo apt install -y postgresql postgresql-contrib
sudo apt install -y repmgr # 或按发行版仓库/源码安装
- 主库配置
- 基本参数(同方案一):wal_level、max_wal_senders、hot_standby、listen_addresses 等。
- 创建 repmgr 用户与库并授权:
sudo -u postgres psql -c “CREATE USER repmgr WITH REPLICATION LOGIN PASSWORD ‘repmgrpass’;”
sudo -u postgres psql -c “CREATE DATABASE repmgr OWNER repmgr;”
- pg_hba.conf 增加:
host replication repmgr 192.168.1.0/24 md5
host repmgr repmgr 192.168.1.0/24 md5
- 修改 repmgr.conf(示例):
node_id=1
node_name=‘pg01’
conninfo=‘host=192.168.1.10 user=repmgr dbname=repmgr password=repmgrpass’
data_directory=‘/var/lib/postgresql/14/main’
service_start_command=‘sudo systemctl start postgresql’
service_stop_command=‘sudo systemctl stop postgresql’
- 注册主节点并启动守护进程:
sudo -u postgres repmgr -f /etc/repmgr/14/repmgr.conf primary register
repmgrd -f /etc/repmgr/14/repmgr.conf --daemonize
- 从库配置
- repmgr.conf(示例):
node_id=2
node_name=‘pg02’
conninfo=‘host=192.168.1.11 user=repmgr dbname=repmgr password=repmgrpass’
data_directory=‘/var/lib/postgresql/14/main’
- 克隆并注册为备库:
sudo -u postgres repmgr -f /etc/repmgr/14/repmgr.conf standby clone
sudo -u postgres repmgr -f /etc/repmgr/14/repmgr.conf standby register
repmgrd -f /etc/repmgr/14/repmgr.conf --daemonize
- 常用运维
- 查看集群状态:repmgr -f /etc/repmgr/14/repmgr.conf cluster show
- 手动切换主从:repmgr -f /etc/repmgr/14/repmgr.conf standby promote(在目标备库执行),其余备库执行 repmgr standby follow。
四、方案三 Patroni + etcd + HAProxy/Keepalived(企业级自动故障转移)
- 组件与端口
- Patroni(集群管理/选主)、etcd(分布式一致性存储)、HAProxy(读写分离与健康检查)、Keepalived(VIP 漂移);数据库 5432,Patroni REST API 8008,etcd 2379。
- 部署要点
- 至少 3 节点 etcd 形成 quorum;数据库节点部署 Patroni(配置 etcd 连接、复制参数、故障策略等);在 2 个入口节点部署 HAProxy 与 Keepalived,对外暴露 VIP。
- HAProxy 示例片段(简化):
listen postgres_write
bind :5432
mode tcp
option httpchk /master
http-check expect status 200
server pg01 192.168.1.10:5432 check fall 3 rise 2
server pg02 192.168.1.11:5432 check fall 3 rise 2 backup
listen postgres_read
bind :5433
mode tcp
balance roundrobin
server pg01 192.168.1.10:5432 check
server pg02 192.168.1.11:5432 check
- 启动顺序建议:etcd → Patroni → HAProxy → Keepalived;通过 Patroni API 或 patronictl 查看/切换集群状态。
五、关键参数与运维要点
- 基础参数建议
- postgresql.conf:
- wal_level = replica(或 logical,若需逻辑复制)
- max_wal_senders ≥ 10(按从库数量与备份并发调整)
- wal_keep_size = 128MB(或启用 WAL 归档与归档清理策略)
- hot_standby = on(从库只读)
- listen_addresses = ‘*’(按需限制网段)
- shared_buffers ≈ 物理内存的 25%(如 16GB 内存可设 4GB)
- work_mem 按负载与连接数调优(避免过大导致内存压力)
- 认证与安全
- pg_hba.conf 对复制用户与业务网段放行,使用 md5/ scram-sha-256;限制来源网段,避免 0.0.0.0/0 在生产环境开放。
- 时间同步与网络
- 启用 NTP/chrony 保证节点时间一致性;放通 5432(数据库)、8008(Patroni API)、2379(etcd)等端口。
- 备份与恢复
- 定期基础备份(如 pg_basebackup)与 WAL 归档;验证备份可恢复性;从库异常可重建:停库 → 清空数据目录 → pg_basebackup 拉取 → 启动。
- 监控与切换
- 流复制:监控复制延迟与从库恢复状态;repmgr/Patroni:监控节点健康、自动/手动切换、回切策略与最小可用备库数。