简介:本资源是一份面向数据库运维工程师与PostgreSQL高可用架构实践者的完整技术方案文档,聚焦Postgres主从流复制与pgpool-II协同构建生产级高可用数据库集群。内容系统覆盖流复制原理(WAL日志实时同步、同步/异步模式对比)、pgpool-II核心能力(连接池管理、自动故障切换、读写分离与负载均衡)及全链路部署实操,包含环境准备、主备库配置、pgpool参数调优、健康检查与故障模拟等关键环节。资源为单个773KB的Word文档(.docx),结构清晰,含四章二十余节,含版本控制表、详细目录、hosts与sysctl配置示例、防火墙与SELinux调整说明等实用细节,便于按步骤复现与工程落地。目前已有472人学习下载,适合中高级DBA及云原生数据库架构师快速掌握PostgreSQL高可用建设方法论与实操要点。
1. 主从流复制+pgpool高可用:装错一个参数,主库切不走、读写全堵死
去年帮某高校实验室部署一套 PostgreSQL 高可用环境,三台 RHEL 7.6 虚拟机,目标是「主库挂了自动切备库,读请求自动分发,写请求只打主库」。结果上线前压测时,主库 kill -9 一执行,pgpool 日志疯狂刷all backend nodes are down,应用连不上,监控告警炸了一整晚。查了 6 小时,发现是pgpool.conf里backend_flag0写成了ALLOW_TO_FAILOVER而不是ALLOW_TO_FAILOVER | DISALLOW_TO_FOLLOW_MASTER——就差这半句标志,备库压根不被 pgpool 当成可接管的候选节点。这种坑,文档里不写、报错不提示、日志不报具体哪台节点被忽略,纯靠翻源码注释和反复试。这不是玄学,是版本演进埋下的兼容性黑匣子:PostgreSQL 12+ 和 pgpool 4.1+ 的 standby 标识逻辑、failover 触发条件、甚至recovery.signal文件的生成时机,全变了。本文档就是为踩过这些坑的人写的——不讲原理,只列实操步骤;不画架构图,只给能粘贴执行的命令;不承诺“一键部署”,但保证你照着做,每一步都有回滚路径、每个报错都有定位线索。适合正在搭建生产级 PostgreSQL 高可用环境的 DBA、运维或全栈工程师,尤其当你已卡在「备库启动后 walreceiver 进程消失」「pgpool 启动后 show pool_nodes 返回空」「failover 脚本执行完虚拟 IP 不漂移」这类问题上。
2. 环境准备与系统调优:RHEL/CentOS 下必须硬改的 7 项内核参数
提示:所有操作需以 root 用户执行。若客户环境禁止 root 登录,请先用 sudo su - 切换,后续命令中涉及权限变更的步骤均需确认生效。
2.1 关闭防火墙与 SELinux:不是可选项,是必选项
PostgreSQL 流复制依赖 5432 端口(主库监听)、pgpool 默认监听 9999(PCP 管理端口)和 5432(客户端连接端口),而 watchdog 节点间心跳默认走 9000 端口。SELinux 若启用,会拦截walreceiver进程对$PGDATA/pg_wal目录的写入,导致备库无法接收日志。
# 关闭 firewalld(RHEL7+/CentOS7+) systemctl stop firewalld systemctl disable firewalld # 永久禁用 SELinux(修改配置文件后必须重启) sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config # 注意:此处不执行 setenforce 0,因重启后才生效,避免临时策略与永久策略不一致逻辑说明:
systemctl disable是为防止系统重启后 firewalld 自启;/etc/selinux/config修改是唯一可靠方式,setenforce 0仅临时生效且易被其他服务重置。若客户明确要求 SELinux 保持 enforcing,则需额外配置布尔值setsebool -P postgresql_connect_any on及自定义策略,但本文档默认按生产环境常见实践处理——禁用。
2.2 网络与 hosts 绑定:别让 DNS 成为高可用的单点故障
流复制与 pgpool 节点发现严重依赖主机名解析。若/etc/hosts未精确映射 IP 与主机名,pgpool启动时会卡在waiting for backend node connection,psql连接主库时可能解析出错误 IP 导致连接拒绝。
# 假设三节点规划如下(请按实际IP替换): # 192.168.10.101 pgsql-master # 192.168.10.102 pgsql-standby # 192.168.10.103 pgpool-node1 # 所有节点(master/standby/pgpool)均执行: cat >> /etc/hosts << 'EOF' 192.168.10.101 pgsql-master 192.168.10.102 pgsql-standby 192.168.10.103 pgpool-node1 EOF参数说明:
cat >>追加而非覆盖,避免破坏原有本地解析;使用单引号<< 'EOF'防止变量展开;主机名必须全小写且无下划线(PostgreSQL 对 hostname 校验严格);若有多网卡,确保hostname -i返回的是用于数据库通信的内网 IP。
2.3 时钟同步:主从延迟超 1 秒,PITR 备份就可能失效
WAL 日志时间戳是 PITR(基于时间点恢复)的核心依据。若主备节点系统时间偏差 > 1 秒,pg_rman归档日志校验会失败,recovery_target_time恢复可能定位到错误事务点。
# 安装 chrony(RHEL7+/CentOS7+ 默认) yum install -y chrony # 配置 master 作为 NTP server(仅 master 执行) cat > /etc/chrony.conf << 'EOF' server 0.centos.pool.ntp.org iburst server 1.centos.pool.ntp.org iburst server 2.centos.pool.ntp.org iburst server 3.centos.pool.ntp.org iburst allow 192.168.10.0/24 local stratum 10 keyfile /etc/chrony.keys driftfile /var/lib/chrony/drift logdir /var/log/chrony EOF # 配置 standby/pgpool 作为 client(所有非 master 节点执行) cat > /etc/chrony.conf << 'EOF' server pgsql-master iburst keyfile /etc/chrony.keys driftfile /var/lib/chrony/drift logdir /var/log/chrony EOF # 启动并设开机自启 systemctl enable chronyd systemctl restart chronyd # 等待同步完成(执行后约 30 秒,检查 offset 应 < 10ms) chronyc sources -v chronyc tracking逻辑说明:
allow 192.168.10.0/24开放内网段访问,避免 standby 无法向 master 同步;iburst加速初始同步;chronyc tracking中Offset字段是关键指标,> 100ms 即需排查网络抖动。
2.4 内核参数调优:不调kernel.shmmax,PostgreSQL 启动直接报out of memory
PostgreSQL 共享内存段大小由shared_buffers控制,而内核shmmax必须 ≥shared_buffers值。默认shmmax=33554432(32MB),但生产环境shared_buffers通常设为 2GB(2147483648),不调则 initdb 失败。
# 所有节点执行(以 2GB shared_buffers 为例) echo 'kernel.shmmax = 2147483648' >> /etc/sysctl.conf echo 'kernel.shmall = 524288' >> /etc/sysctl.conf # shmall = shmmax / PAGE_SIZE (4096) echo 'vm.swappiness = 1' >> /etc/sysctl.conf # 降低 swap 使用倾向 echo 'net.ipv4.tcp_tw_reuse = 1' >> /etc/sysctl.conf # 加快 TIME_WAIT socket 复用 sysctl -p # 立即生效参数说明:
shmall计算公式为shmmax / 4096(x86_64 页面大小);vm.swappiness=1是 PostgreSQL 官方推荐值,避免内存压力下频繁 swap;tcp_tw_reuse对 pgpool 高并发连接池至关重要,减少端口耗尽风险。
2.5 ulimit 限制:不改nofile,pgpool 启动后扛不住 500 并发连接
pgpool 默认最大连接数num_init_children = 300,若系统nofile限制为 1024,则实际可用连接数 ≈ 1024 / 3 ≈ 340(每个 pgpool 进程需 3 个 fd:client、backend、watchdog)。超限后新连接被拒绝,日志报too many connections。
# 所有节点执行 echo 'postgres soft nofile 65536' >> /etc/security/limits.conf echo 'postgres hard nofile 65536' >> /etc/security/limits.conf echo 'postgres soft nproc 65536' >> /etc/security/limits.conf echo 'postgres hard nproc 65536' >> /etc/security/limits.conf # 生效方式:需重新登录 postgres 用户或重启系统 # 验证:su - postgres -c 'ulimit -n'逻辑说明:
nofile设为 65536 是保守值,满足 2000+ 并发需求;nproc限制进程数,防止单用户 fork 爆炸;注意limits.conf修改后,su - postgres会话才能加载新限制,sudo -u postgres不生效。
2.6 避坑:常见问题与排查(系统层)
现象 1:chronyc tracking显示Leap status : Not synchronised,offset 持续 > 1s
→ 原因:/etc/chrony.conf中server行末尾多了一个空格,导致解析失败;或 firewall 未关,UDP 123 端口被阻。
→ 解决:chronyc sources -v查看MS列是否为^*(表示当前源),若全为?则配置错误;用nc -uz pgsql-master 123测试连通性。
现象 2:sysctl -p报错error: "net.ipv4.tcp_tw_reuse" is an unknown key
→ 原因:RHEL/CentOS 6 内核不支持该参数(仅 2.6.32-431+ 支持)。
→ 解决:注释掉该行,或升级内核;替代方案是调大net.ipv4.tcp_fin_timeout = 30。
现象 3:ulimit -n显示仍是 1024,未生效
→ 原因:/etc/security/limits.conf仅对 login shell 生效,systemd 服务绕过此机制。
→ 解决:对 pgpool 服务单独配置,在/usr/lib/systemd/system/pgpool.service中添加:
[Service] LimitNOFILE=65536 LimitNPROC=65536然后systemctl daemon-reload && systemctl restart pgpool。
现象 4:hostname -i返回 127.0.0.1,而非真实 IP
→ 原因:/etc/hosts中127.0.0.1 localhost行在真实 IP 映射之前,glibc 解析优先匹配。
→ 解决:将真实 IP 映射行置于127.0.0.1行之前;或删除127.0.0.1行(不推荐,影响本地服务)。
3. PostgreSQL 安装与初始化:12.2 版本下必须避开的 recovery.conf 陷阱
提示:本文档以 PostgreSQL 12.2 为基准(对应 pgpool-II 4.1.1),若使用 10.3/11.x,请跳至第 6 章末尾的「旧版本适配说明」。
3.1 依赖安装与用户创建:用 yum groupinstall 一步到位
PostgreSQL 12+ 编译依赖gcc,readline-devel,zlib-devel,openssl-devel,但直接yum install易漏包。@development-tools组已包含 gcc,@postgresql组则预装了所有运行时依赖。
# 所有节点执行(master/standby) yum groupinstall -y "Development Tools" yum groupinstall -y "PostgreSQL Database Server" # 创建 postgres 用户(若不存在) getent passwd postgres > /dev/null || useradd -r -m -U -d /var/lib/pgsql -s /bin/bash postgres # 设置密码(生产环境建议用 ssh-key 或 vault 管理,此处为演示) echo "postgres:MyPass123!" | chpasswd逻辑说明:
useradd -r创建系统用户,-m创建 home 目录,-U创建同名组;chpasswd直接设置密码,避免交互式passwd;密码强度需满足password-authPAM 策略(含大小写字母、数字、特殊字符)。
3.2 下载与解压:从官网获取二进制包,跳过编译玄学
PostgreSQL 官方提供 RHEL/CentOS 二进制包,比源码编译稳定,且initdb路径统一。12.2 版本下载地址为https://ftp.postgresql.org/pub/source/v12.2/postgresql-12.2.tar.gz,但生产环境常离线,故采用 rpm 包。
# 下载 rpm(master/standby 均需) wget https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm rpm -ivh pgdg-redhat-repo-latest.noarch.rpm # 安装 PostgreSQL 12(自动解决依赖) yum install -y postgresql12-server postgresql12-contrib # 初始化数据库集群(仅 master 执行!) /usr/pgsql-12/bin/postgresql-12-setup initdb # 此命令等价于:/usr/pgsql-12/bin/initdb -D /var/lib/pgsql/12/data --auth-local peer --auth-host md5参数说明:
postgresql-12-setup initdb是 Red Hat 官方封装脚本,自动创建目录、设权限、生成基础配置;--auth-host md5强制远程连接用 md5 密码认证,避免 trust 认证的安全风险。
3.3 环境变量配置:.bash_profile里只写三行,少一行都启动失败
PostgreSQL 12+ 的pg_ctl,psql等命令必须在PATH中,且PGDATA必须指向数据目录,否则pg_ctl start报no database directory specified。
# 仅 postgres 用户执行(su - postgres) cat >> ~/.bash_profile << 'EOF' # PostgreSQL 12 environment export PGHOME=/usr/pgsql-12 export PATH=$PGHOME/bin:$PATH export PGDATA=/var/lib/pgsql/12/data export PGPORT=5432 export PGUSER=postgres EOF source ~/.bash_profile逻辑说明:
PGHOME是二进制路径,PGDATA是数据目录,二者缺一不可;PGPORT和PGUSER是可选但强烈建议,避免后续命令反复指定-p-U;source立即生效,无需登出。
3.4 初始化备库:pg_basebackup是唯一正解,rsync是定时炸弹
PostgreSQL 12+ 废弃recovery.conf,备库通过standby.signal文件 +postgresql.conf中primary_conninfo启动。pg_basebackup自动生成正确结构,rsync手动同步极易遗漏global/pg_control或权限错误。
# 在 standby 节点,切换到 postgres 用户 su - postgres # 执行基础备份(从 master 拉取) pg_basebackup -h pgsql-master -D $PGDATA -P -X stream -R -C -S pgsql-standby # 解释参数: # -h pgsql-master:主库主机名(必须与 hosts 一致) # -D $PGDATA:备库数据目录(必须为空) # -P:显示进度 # -X stream:同时拉取 WAL 日志流(关键!) # -R:自动生成 standby.signal 和 primary_conninfo(12+ 新特性) # -C:创建触发 failover 的 trigger_file(可选,本文档用 pgpool 管理)逻辑说明:
-R是 12+ 的核心,它自动写入standby.signal并在postgresql.conf末尾追加primary_conninfo;-X stream确保备库启动时能立即接收 WAL,而非等待归档;执行后$PGDATA下会生成standby.signal文件,这是备库身份的唯一标识。
3.5 避坑:常见问题与排查(PostgreSQL 层)
现象 1:pg_basebackup报错FATAL: no pg_hba.conf entry for replication connection
→ 原因:master 的pg_hba.conf未添加 replication 用户规则。
→ 解决:在 master 的pg_hba.conf末尾添加:
# TYPE DATABASE USER ADDRESS METHOD host replication replicator 192.168.10.0/24 md5然后pg_ctl reload生效。
现象 2:standby 启动后ps aux | grep walreceiver无进程,pg_stat_replication为空
→ 原因:primary_conninfo中 host 写成了 IP 而非主机名,或pgsql-standby主机名未在 master 的pg_hba.conf中允许。
→ 解决:检查$PGDATA/postgresql.conf中primary_conninfo的host=值,必须与pg_hba.conf的ADDRESS匹配;用psql -h pgsql-master -U replicator -c "IDENTIFY_SYSTEM;"测试 replication 连接。
现象 3:pg_basebackup执行卡住,日志显示waiting for checkpoint
→ 原因:master 上有长事务阻塞 checkpoint。
→ 解决:psql -c "SELECT pid, now() - backend_start, state FROM pg_stat_activity WHERE state = 'active';"找出长事务并 kill;或临时调大checkpoint_timeout = 30min。
现象 4:pg_ctl start报错could not change permissions of "/var/lib/pgsql/12/data": Operation not permitted
→ 原因:/var/lib/pgsql/12/data目录属主不是 postgres,或 SELinux 未禁用。
→ 解决:chown -R postgres:postgres /var/lib/pgsql/12/data;确认sestatus输出disabled。
4. PostgreSQL 流复制配置:同步 vs 异步,就差一个synchronous_standby_names
4.1 主库postgresql.conf核心参数:12+ 版本只需改 5 处
PostgreSQL 12+ 的流复制配置大幅简化,wal_level、max_wal_senders、archive_mode(PITR 需要)是基础,synchronous_commit和synchronous_standby_names决定同步模式。
# master 节点,postgres 用户下编辑 vi $PGDATA/postgresql.conf # 修改以下参数(取消注释并赋值): wal_level = replica # 必须,12+ 不再支持 'hot_standby' max_wal_senders = 10 # 允许最多 10 个 walsender 进程(备库+pgpool 监控) max_replication_slots = 10 # 为每个备库预留 slot,防主库清理 WAL archive_mode = on # 启用归档(pg_rman 备份必需) archive_command = 'cp %p /var/lib/pgsql/12/archive/%f' # 归档命令,目录需提前创建 synchronous_commit = on # 同步模式开关(on=同步,off=异步) synchronous_standby_names = 'FIRST 1 (pgsql-standby)' # 同步备库列表,主机名必须与 standby.signal 中一致参数说明:
wal_level = replica是最低要求,logical用于逻辑复制;max_wal_senders必须 ≥ 备库数 + pgpool watchdog 数;synchronous_standby_names语法:FIRST 1 (...)表示任一备库即可,ANY 1 (...)同理,但FIRST更常用;主机名pgsql-standby必须与 standby 的recovery.signal中primary_conninfo的application_name一致(pg_basebackup -R已自动设置)。
4.2 主库pg_hba.conf:两条规则定生死
pg_hba.conf控制谁可以连、用什么方式连。流复制需要两个独立规则:一是 replication 用户连主库拉 WAL,二是普通用户连主库写数据。
# master 节点,postgres 用户下编辑 vi $PGDATA/pg_hba.conf # 在文件末尾添加(注意顺序,精确匹配优先): # TYPE DATABASE USER ADDRESS METHOD host replication replicator 192.168.10.0/24 md5 host all all 192.168.10.0/24 md5 # 保存后重载配置 pg_ctl reload逻辑说明:
replication数据库是虚拟库,专供 walsender 使用;replicator是我们创建的复制用户(见 4.3);all规则允许应用服务器连接,md5强制密码认证;192.168.10.0/24是内网段,严禁写0.0.0.0/0。
4.3 创建流复制用户:replicator是专用账号,绝不用postgres
PostgreSQL 要求 replication 连接必须使用REPLICATION权限用户,且不能是超级用户(安全最佳实践)。
# master 节点,psql 中执行 psql -c " CREATE USER replicator WITH REPLICATION ENCRYPTED PASSWORD 'ReplicaPass123!'; ALTER USER replicator SET search_path TO public; "参数说明:
WITH REPLICATION授予复制权限;ENCRYPTED PASSWORD确保密码存储为密文;search_path避免后续建表时 schema 错误;密码强度同 3.1 要求。
4.4 备库配置验证:pg_is_in_recovery()是唯一真理
备库启动后,不能只看进程,必须用 SQL 确认其状态。pg_is_in_recovery()返回t表示正常备库,f表示已提升为主库。
# standby 节点,postgres 用户执行 psql -c "SELECT pg_is_in_recovery(), now();" # 正常输出应为:t | 2023-10-01 10:00:00.123456+08 # 检查复制延迟(单位:字节) psql -c "SELECT pg_wal_lsn_diff(pg_current_wal_lsn(), replay_lsn) AS lag_bytes FROM pg_stat_replication;" # 检查主库上是否有复制连接 psql -c "SELECT application_name, client_addr, state, sync_state FROM pg_stat_replication;" # 正常应看到 application_name='pgsql-standby', state='streaming', sync_state='sync'逻辑说明:
pg_wal_lsn_diff返回延迟字节数,< 1MB 为健康;pg_stat_replication在主库查询,sync_state为sync表示该备库是同步备库;若state为startup,说明备库未连接上主库。
4.5 避坑:常见问题与排查(流复制层)
现象 1:pg_stat_replication中state = 'start',且replay_lsn为空
→ 原因:备库primary_conninfo中password错误,或 master 的pg_hba.conf未允许该用户。
→ 解决:检查$PGDATA/postgresql.conf中primary_conninfo的password=值;在 master 上psql -U replicator -h 127.0.0.1 -c "SELECT 1;"测试。
现象 2:pg_is_in_recovery()返回f,备库意外提升为主库
→ 原因:standby.signal文件被误删,或recovery_target_timeline = 'latest'导致自动提升。
→ 解决:立即停止备库pg_ctl stop;检查$PGDATA/standby.signal是否存在;若已提升,需手动降级:touch $PGDATA/standby.signal && pg_ctl start。
现象 3:pg_wal_lsn_diff返回负数或极大值(如 10GB)
→ 原因:主库archive_command失败,WAL 未及时归档,备库无法追赶。
→ 解决:检查/var/lib/pgsql/12/archive/目录权限(应为 postgres:postgres);tail -f $PGDATA/log/postgresql-*.log查archive command failed错误。
现象 4:synchronous_commit = on但写入性能暴跌,TPS 下降 50%
→ 原因:synchronous_standby_names指定了不存在的备库名,主库无限等待。
→ 解决:SHOW synchronous_standby_names;确认值;pg_stat_replication中application_name必须完全匹配(区分大小写)。
5. pgpool-II 安装与配置:4.1.1 版本下pcp密码与pool_hba的生死绑定
提示:pgpool-II 4.1+ 与 3.6+ 配置差异巨大,本文档仅覆盖 4.1.1。若用 3.6.14,请参考附件中的旧版配置。
5.1 下载与安装:rpm 包安装,避免make install权限地狱
pgpool 官方提供 RHEL/CentOS rpm,比源码安装省心。4.1.1 版本需从http://www.pgpool.net/mediawiki/index.php/Downloads获取。
# 所有 pgpool 节点(本文档为单 pgpool 节点,即 pgpool-node1)执行 wget http://www.pgpool.net/download.php?f=pgpool-II-4.1.1.tar.gz -O pgpool-II-4.1.1.tar.gz tar -xzf pgpool-II-4.1.1.tar.gz cd pgpool-II-4.1.1 # 配置编译(指定 PostgreSQL 12 路径) ./configure --prefix=/usr/local/pgpool --with-pgsql=/usr/pgsql-12 --with-openssl # 编译安装(耗时约 3 分钟) make && make install # 创建符号链接,统一路径 ln -sf /usr/local/pgpool /usr/pgpool逻辑说明:
--with-pgsql=/usr/pgsql-12指向 PostgreSQL 12 的安装目录,确保pgpool能调用libpq;--with-openssl启用 SSL 连接;make install默认装到/usr/local/pgpool,ln -sf方便后续脚本引用。
5.2 初始化 pgpool 环境:pgpool_setup是官方脚本,别手写目录
pgpool 4.1+ 提供pgpool_setup脚本,自动生成pgpool.conf、pcp.conf、pool_hba.conf及目录结构,比手动配置少 90% 错误。
# pgpool-node1 节点,root 用户执行 /usr/pgpool/etc/pgpool_setup -i -m fast -n 2 \ -h1 pgsql-master -p1 5432 -w1 /var/lib/pgsql/12/data \ -h2 pgsql-standby -p2 5432 -w2 /var/lib/pgsql/12/data \ -a "host all all 0.0.0.0/0 md5" \ -k /tmp # 参数说明: # -i:交互模式(此处实际非交互) # -m fast:快速模式(不检查 PostgreSQL 版本) # -n 2:配置 2 个后端节点 # -h1/-h2:节点主机名 # -p1/-p2:端口 # -w1/-w2:数据目录(用于 health check) # -a:pool_hba.conf 的默认规则 # -k /tmp:工作目录逻辑说明:
pgpool_setup会生成/usr/pgpool/etc/下的全部配置文件,并创建/var/log/pgpool/日志目录;-a规则允许所有 IP 用 md5 连接,生产环境应改为192.168.10.0/24;执行后检查/usr/pgpool/etc/pgpool.conf中backend_hostname0是否为pgsql-master。
5.3 配置pgpool.conf:4.1.1 版本必须启用health_check_period
pgpool 4.1+ 的健康检查机制重构,health_check_period是心跳开关,不设则节点永远显示down。
# pgpool-node1,编辑主配置 vi /usr/pgpool/etc/pgpool.conf # 修改关键参数(搜索定位): listen_addresses = '0.0.0.0' # 允许所有 IP 连接(生产环境建议 '192.168.10.103') port = 9999 # pgpool 监听端口(客户端连接用) pcp_port = 9898 # PCP 管理端口(监控/切换用) backend_hostname0 = 'pgsql-master' # 节点0主机名 backend_port0 = 5432 backend_weight0 = 1 backend_data_directory0 = '/var/lib/pgsql/12/data' backend_flag0 = 'ALLOW_TO_FAILOVER | DISALLOW_TO_FOLLOW_MASTER' # 关键!备库可接管,但不跟随新主 backend_hostname1 = 'pgsql-standby' backend_port1 = 5432 backend_weight1 = 1 backend_data_directory1 = '/var/lib/pgsql/12/data' backend_flag1 = 'ALLOW_TO_FAILOVER | DISALLOW_TO_FOLLOW_MASTER' enable_pool_hba = on # 启用 pool_hba.conf 认证 pool_hba_file = '/usr/pgpool/etc/pool_hba.conf' health_check_period = 10 # 每10秒检查一次节点健康 health_check_timeout = 20 # 检查超时20秒 health_check_user = 'pgpool' # 健康检查用户(需在 PostgreSQL 中创建) health_check_password = 'PgpoolPass123!' # 密码参数说明:
backend_flag1中DISALLOW_TO_FOLLOW_MASTER是重点,它阻止 pgpool 在 failover 后让原备库去同步新主库(因新主库可能已是原备库,形成环路);health_check_user必须在 PostgreSQL 中存在,且有CONNECT权限。
5.4 创建 pgpool 管理用户:pgpool用户需在 PostgreSQL 中显式创建
pgpool 的健康检查、在线恢复、PCP 命令均需数据库用户权限。pgpool是约定俗成的用户名,密码需与pgpool.conf中health_check_password一致。
# 在 master 和 standby 的 PostgreSQL 中均执行(因 pgpool 会轮询检查) psql -c " CREATE USER pgpool WITH PASSWORD 'PgpoolPass123!'; GRANT CONNECT ON DATABASE postgres TO pgpool; "逻辑说明:
GRANT CONNECT是最低权限,足够健康检查;若需在线恢复(online recovery),还需pg_read_all_data角色,但本文档 failover 用脚本,故不授。
5.5 配置pcp.conf:pcp_node_info命令依赖的密码文件
PCP(Process Control Protocol)是 pgpool 的管理协议,pcp_node_info、pcp_attach_node等命令需pcp.conf中的用户密码。
# 生成 pcp.conf(pgpool 安装后自带工具) /usr/pgpool/bin/pg_md5 -m -f /usr/pgpool/etc/pcp.conf -u pgpool "PgpoolPass123!" # 验证内容(应为:pgpool:md5d1b2e3 <p> <a href="https://download.csdn.net/download/Jay_Fred/88477949" style="color:#ec7500;font-size:14px;"> 本文还有配套的精品资源,点击获取 </a> <img alt="menu-r.4af5f7ec.gif" src="https://csdnimg.cn/release/wenkucmsfe/public/img/menu-r.4af5f7ec.gif" style="width:16px;margin-left:4px;vertical-align:text-bottom;cursor:text;"> </p>