【发布时间】:2018-08-06 10:07:57
【问题描述】:
我有 3 个 Postgresql DB 节点(node0、node1、node2,9.4 版)和 1 个 pgpool 节点(3.7 版)
第 1 步:
1.1) node0为主,node1和node2为备用。
1.2) “show pool_nodes”和“select * from pg_stat_replication”按预期工作。
1.3) “插入”和“选择”按预期工作。
第 2 步:
2.1) 我在 node0 中手动停止了 postgresql 服务。
2.2) PGPool 运行故障转移脚本,node1 成为主节点/node2 成为备用节点。
2.3) “Show pool_nodes”显示节点 0 已关闭,“select * from pg_stat_replication”仅显示一个备用节点 node2。他们是正确的。
2.4) “插入”和“选择”按预期工作。
第三步:
3.1) 我手动启动 node0 作为 node1 的备用。
3.2) "select * from pg_stat_replication" 显示node0和node2都是stand-by,按预期工作。
3.3) "show pool_nodes" 显示 node0 仍处于 "down" 状态,这是意料之中的。
3.4) “pcp_attach_node -n 0”,带回node0。 "show pool_nodes" 显示 node0 现在处于 "up" 状态,这是预期的。
3.5) 但是,“插入”将失败,并显示消息“错误:无法在只读事务中执行插入”。
3.6) "select * from pg_stat_replication" 显示0行,这意味着两个备用节点消失了。
3.7) 显然,所有“插入”和“选择”都转到 node0,而不是 node1。
PGPool 以主从流模式运行。
那么,我在步骤 3.4 中遗漏了什么以恢复故障节点?
【问题讨论】:
-
确保您的所有故障模式都首先工作。如果系统一开始就不能正确地进行故障转移,那么从故障状态中恢复是没有意义的。例如,如果您从
node0拉出网络电缆,而不是手动停止postgresql服务,那么在步骤 2 中会发生什么情况?如果您同时拔掉node0和node2的插头,模拟导致3 台服务器中的2 台出现电源故障,会发生什么情况?几年前,我花了 6 个多月的时间试图让 Pgpool 为客户工作...... -
@AndrewHenle,感谢您的快速回复。所有故障模式都能完美运行。我在 node0、node1 和 node2 上测试了不同的案例。现在我被困在这个简单的恢复场景中。
-
@AndrewHenle 是的,我从那篇文章中学到了 pcp_attach_node。 “pcp_attach_node -U pgpool -h localhost -p 9898 -n 0”在我的例子中带回了 node0,但 pgpool 将连接到这个现在处于待机状态的 node0。在这种情况下,它应该连接到 node1(新主节点)以进行“插入”。
标签: postgresql pgpool