PostgreSQL双节点高可用:流复制、pgpool与pg_rman 简介面向 PostgreSQL 运维与架构人员的高可用方案文档聚焦流复制与 pgpool-II 的组合部署覆盖主备库搭建、WAL 日志实时同步、同步与异步复制取舍、只读请求分流、读写分离及故障切换等核心问题。压缩包仅含 1 个 docx 文件大小约 773KB内容按方案介绍、实践环境、客户环境准备、资源调整等章节展开便于按部署阶段快速查阅。文档涉及连接池、复制、负载均衡、连接数限制与 pg_rman 备份并梳理主库 wal_level、synchronous_commit 配置、备库初始化、pgpool-II 参数设置和启动测试思路。已有 471 人学习适合需要实施主从复制与高可用架构的中级数据库从业者作为配置参考和排错索引。1. 双节点高可用不是“装完主从就收工”这份方案到底解决什么这套 PostgreSQL 主从流复制加 pgpool-II 的高可用方案第一次翻目录会觉得像标准实施手册流复制、连接池、读写分离、failover、pg_rman 备份一条线全串起来。真正落地时难点不在装软件而在版本差异、切换脚本和备份恢复的闭环。它适合正在 RHEL/CentOS 上维护 PostgreSQL 10 或 12、想把单机库改成双节点高可用又不想引入过重中间件的团队也适合需要内网离线部署、手里只有 rpm 包和几台 Linux 机器的运维。方案的核心不是某个参数而是把“实时同步、只读分流、故障切换、离线恢复”四段拼成一条能反复演练的链路。流复制负责数据不丢pgpool 负责连接入口和故障检测pg_rman 负责误操作后的后悔药三者缺一段高可用就只是纸面高可用。2. 版本与环境先把路铺平RHEL/CentOS 下的依赖、用户和内核参数2.1 版本组合和组件分工先确认 PostgreSQL 与 pgpool 对得上方案里给了新旧两套环境旧环境是 CentOS 6.5、PostgreSQL 10.3、pgpool-II 3.6.14新环境是 CentOS 7.5、PostgreSQL 12.2、pgpool-II 4.1.1。这个版本跨度不是随便写的PostgreSQL 12 取消了recovery.confpgpool 4.x 又把集群模式参数改成了backend_clustering_mode拿旧配置直接套新版本备库和 pgpool 都会起不来。组件旧环境新环境落地注意点PostgreSQL10.312.212 开始用standby.signal不再读recovery.confpgpool-II3.6.144.1.14.x 用backend_clustering_mode3.x 用master_slave_modepg_rman与 PostgreSQL 大版本匹配与 PostgreSQL 大版本匹配不要跨大版本混用备份工具操作系统CentOS 6.5CentOS 7.5内网离线源、依赖包和 cache 要提前准备组件分工也要先分清PostgreSQL 流复制只做数据同步备库默认只读pgpool-II 站在数据库前面做连接池、读写分离、健康检查和 VIP 漂移pg_rman 做的是离线备份和按时间点恢复不是替代流复制。常见误区是把 pgpool 当成“自动故障转移数据库”实际上 pgpool 只负责发现后端挂了并执行failover_command真正的备库提升要在脚本里做。方案选流复制而不是文件归档传送是因为流复制在 master 一产生 WAL 就通过 TCP 传给 standby延迟比“写完一个 WAL 文件再拷贝”低得多选 pgpool 而不是应用层双写是因为连接池和只读分流对应用侵入小改一个连接端口就能接进来。2.2 操作系统层六件事防火墙、SELinux、hosts、时钟、sysctl、limits方案把操作系统准备放在安装 PostgreSQL 之前这个顺序是对的。很多“主备连不上”最后查出来不是数据库参数而是防火墙没放行、SELinux 拦了 pgpool 绑 VIP或者两台机器时间差太大导致日志和切换判断对不上。内网环境可以简化但简化不等于跳过。# CentOS 7 示例内网方案文档为了省事会直接关防火墙和 SELinux systemctl stop firewalld systemctl disable firewalld setenforce 0 sed -i s/^SELINUX.*/SELINUXpermissive/ /etc/selinux/config # 主机名和 hosts 必须能互相解析主机名不要带下划线 cat /etc/hosts EOF 192.168.56.11 pg-master 192.168.56.12 pg-standby 192.168.56.13 pgpool-vip EOF # 时钟同步主备时间差控制在秒级以内 systemctl enable chronyd systemctl start chronyd chronyc sources -v上面这段是方案里“关闭防火墙、关闭 selinux、网络配置、配置 hosts、主备节点时钟同步”的合并写法。生产环境不建议永久关闭防火墙更稳的做法是只放行 PostgreSQL 5432、pgpool 9999、pcp 9898、SSH 22 以及 watchdog 心跳端口SELinux 至少设成 permissive或者按 pgpool 的启动脚本和 VIP 绑定动作单独放行。/etc/hosts里三个名字要能互相ping通后面primary_conninfo、backend_hostname、failover_command都靠主机名或 IP 定位别让一台机器用 IP、另一台用主机名排错时会多花很多时间。sysctl 和 limits 是方案里容易被跳过的部分。PostgreSQL 需要足够的共享内存和信号量pgpool 绑定非本地 VIP 需要ip_nonlocal_bind连接数上来后nofile不够会直接报“too many open files”。# /etc/sysctl.d/99-pgpool.conf cat /etc/sysctl.d/99-pgpool.conf EOF kernel.shmmax 68719476736 kernel.shmall 4294967296 kernel.sem 250 32000 100 128 vm.swappiness 10 net.ipv4.ip_nonlocal_bind 1 EOF sysctl --system # /etc/security/limits.d/20-postgres.conf cat /etc/security/limits.d/20-postgres.conf EOF postgres soft nproc 2048 postgres hard nproc 2048 postgres soft nofile 65536 postgres hard nofile 65536 EOFkernel.shmmax和kernel.shmall按机器内存调整不要照抄成大值把系统撑爆kernel.sem是信号量数组PostgreSQL 并行查询和连接数高时会用到vm.swappiness10是让数据库尽量不换页net.ipv4.ip_nonlocal_bind1允许 pgpool 在 VIP 还没漂过来时绑定地址watchdog 切换时更顺。limits里的nofile要大于max_connections加上 pgpool 连接池和后端进程的开销改完用su - postgres -c ulimit -n验证别只改文件不验证。2.3 目录、用户与权限安装路径和后续脚本的约定方案里创建postgres用户、配置安装文件夹、修改文件夹权限这些动作看起来琐碎但后面所有脚本都依赖这套路径约定。建议统一成PostgreSQL 装在/opt/pgsql数据目录/data/pgdata归档目录/data/pg_archivepg_rman 备份目录/data/pg_backuppgpool 工作目录/var/lib/pgpool日志目录/var/log/pgpool。路径一旦定下来postgresql.conf、pgpool.conf、备份脚本和附件里的安装脚本都按这个找后期换机器也容易复制。# 创建 postgres 用户和目录root 执行 groupadd -g 1001 postgres useradd -g postgres -u 1001 -m -s /bin/bash postgres passwd postgres mkdir -p /opt/pgsql /data/pgdata /data/pg_archive /data/pg_backup mkdir -p /var/lib/pgpool /var/log/pgpool chown -R postgres:postgres /opt/pgsql /data /var/lib/pgpool /var/log/pgpool chmod 700 /data/pgdata这里的关键是权限/data/pgdata必须 700属主是postgres不能用 root 跑initdb否则后面pg_ctl start会因为数据目录属主不对拒绝启动。/data/pg_archive和/data/pg_backup可以给 750但归档目录要允许 PostgreSQL 进程写入。pgpool 如果和 PostgreSQL 共用postgres用户启动/var/lib/pgpool和/var/log/pgpool也要归postgres如果单独建pgpool用户就要保证它能读pgpool.conf、写运行目录并且能通过 SSH 免密到备库执行提升命令。方案附件里的环境准备脚本和安装脚本本质上就是把这些路径、用户、权限和依赖包固定下来减少手工漏项。3. PostgreSQL 流复制从 initdb 到 walreceiver 跑通3.1 主库参数wal_level、max_wal_senders 与同步复制开关PostgreSQL 安装可以源码编译也可以用内网 rpm路径按/opt/pgsql走。依赖包常见的是readline-devel、zlib-devel、openssl-devel、libxml2-devel编译参数--prefix/opt/pgsql。装完先initdb -D /data/pgdata -E UTF8 --localeC再改postgresql.conf。流复制的核心参数不多但每一个都影响后面能不能跑通。# postgresql.conf 片段PostgreSQL 10/12 通用按内存和磁盘调整 listen_addresses * port 5432 wal_level replica max_wal_senders 10 wal_keep_segments 64 hot_standby on archive_mode on archive_command test ! -f /data/pg_archive/%f cp %p /data/pg_archive/%f # 同步复制先别开等备库跑通、压测后再开 synchronous_commit local # synchronous_standby_names standby1wal_levelreplica是流复制的最低要求记录足够多的 WAL 给备库重放max_wal_senders要大于备库数量加备份连接数只有一个备库时 10 足够后面加级联备库或 pg_basebackup 并发要往上调wal_keep_segments是主库保留的 WAL 段数备库落后太多时防止主库把还没传过去的 WAL 删掉小库 64 够用写入量大就加到 256 或者用复制槽hot_standbyon让备库可以接受只读查询这是后面 pgpool 读写分离的前提archive_modeon和archive_command是给 pg_rman 做归档备份用的归档目录要和数据目录分开。synchronous_commit先设local意思是主库本地写完就提交不等备库确认等主从稳定后再改成on并配synchronous_standby_names否则备库一挂主库写事务会卡住。参数改完重启主库pg_ctl start -D /data/pgdata -l /data/pgdata/startup.log。启动日志里看到database system is ready to accept connections才算起库成功不要只看命令返回值。listen_addresses改成*后要确认pg_hba.conf也本文还有配套的精品资源点击获取