Pgpool执行pcp_attach_node后主节点丢失问题求助(PostgreSQL9.4+Pgpool3.7)
分析与解决Pgpool执行
pcp_attach_node后主节点丢失问题 结合你给出的环境(PostgreSQL 9.4 + Pgpool-II 3.7)和操作流程,这个主节点丢失的问题,大概率是原主节点node0重新attach时,角色状态未正确同步,或者Pgpool的节点状态识别逻辑出现冲突导致的。下面我一步步给你拆解原因、排查方向和解决办法:
可能的核心原因
- node0重启后仍保持原主节点状态,没有正确转为新主node1的备库,导致Pgpool识别到多个主节点,进而无法确定有效主节点
- 故障转移脚本未完成完整的主备关系更新,比如没有修改node2的主库指向,或者未在Pgpool中正确标记节点状态
- Pgpool的节点状态缓存未及时刷新,
pcp_attach_node后没有重新识别节点角色
第一步:排查当前节点状态
先执行以下命令确认各个节点的状态,定位问题根源:
- 在Pgpool节点执行
show pool_nodes;,查看每个节点的status(up/down)和role(master/slave),重点看node0的角色 - 登录node0执行
SELECT pg_is_in_recovery();,如果返回false,说明它还是主节点状态,这就是冲突的根源 - 登录node1执行
SELECT * FROM pg_stat_replication;,确认node2和node0是否都在从node1同步数据
针对性解决方案
1. 先修复node0的备库状态
如果node0重启后还是主节点,必须先将它转为node1的备库:
- 停止node0的PostgreSQL服务:
pg_ctl stop -D /path/to/node0/data - 用
pg_rewind同步node0到node1的最新状态(如果开启了wal日志):pg_rewind -D /path/to/node0/data --source-server='host=node1 port=5432 user=postgres dbname=postgres' - 修改node0的
postgresql.conf,确保hot_standby = on,然后在recovery.conf中配置主库指向:standby_mode = 'on' primary_conninfo = 'host=node1 port=5432 user=postgres' - 启动node0的PostgreSQL服务:
pg_ctl start -D /path/to/node0/data - 再次在node1执行
SELECT * FROM pg_stat_replication;,确认node0已经开始同步
2. 正确执行pcp_attach_node
等node0确认是正常备库后,再执行attach操作:
pcp_attach_node -h <你的Pgpool节点IP> -p 9898 -U pcp_user 0
(注意:0是node0在Pgpool中的节点ID,你可以通过show pool_nodes确认ID)
执行后再次执行show pool_nodes;,确认node0的status为up,role为slave
3. 检查故障转移脚本的完整性
你的故障转移脚本需要确保以下操作都完成了:
- 将node1提升为主节点(
pg_ctl promote) - 修改node2的
recovery.conf,将主库指向node1 - 在Pgpool中标记node0为down(可以用
pcp_detach_node) - 重新加载Pgpool配置(
pcp_reload_config)
如果脚本遗漏了以上某一步,就会导致节点状态混乱
4. 刷新Pgpool状态缓存
如果attach后状态还是异常,可以执行:
pcp_reload_config -h <Pgpool节点IP> -p 9898 -U pcp_user
强制Pgpool重新加载配置并刷新节点状态
5. 考虑版本升级(可选但推荐)
你使用的PostgreSQL 9.4和Pgpool-II 3.7都是比较老旧的版本,存在不少已知的主备切换和节点attach相关的bug。如果业务允许,建议升级到较新的稳定版本(比如PostgreSQL 12+ + Pgpool-II 4.2+),能大幅减少这类兼容性问题
内容的提问来源于stack exchange,提问作者xudesheng
相关产品推荐
相关产品推荐

