我正在尝试使用 corosync 和 pacemaker 设置主动/被动(2 个节点)Linux-HA 集群,以使 PostgreSQL 数据库正常运行。它通过 DRBD 和服务 IP 工作。如果节点 1 发生故障,节点 2 应该接管。如果 PG 在节点 2 上运行并且发生故障,情况也是如此。除了 STONITH 之外,一切都正常。
节点之间有一个专用的 HA 连接(10.10.10.X),因此我有以下接口配置:
eth0 eth1 host
10.10.10.251 172.10.10.1 node1
10.10.10.252 172.10.10.2 node2
Stonith 已启用,我正在测试使用 ssh-agent 来杀死节点。
crm configure property stonith-enabled=true
crm configure property stonith-action=poweroff
crm configure rsc_defaults resource-stickiness=100
crm configure property no-quorum-policy=ignore
crm configure primitive stonith_postgres stonith:external/ssh \
params hostlist="node1 node2"
crm configure clone fencing_postgres stonith_postgres
crm_mon -1
显示:
============
Last updated: Mon Mar 19 15:21:11 2012
Stack: openais
Current DC: node2 - partition with quorum
Version: 1.0.9-74392a28b7f31d7ddc86689598bd23114f58978b
2 Nodes configured, 2 expected votes
4 Resources configured.
============
Online: [ node2 node1 ]
Full list of resources:
Master/Slave Set: ms_drbd_postgres
Masters: [ node1 ]
Slaves: [ node2 ]
Resource Group: postgres
fs_postgres (ocf::heartbeat:Filesystem): Started node1
virtual_ip_postgres (ocf::heartbeat:IPaddr2): Started node1
postgresql (ocf::heartbeat:pgsql): Started node1
Clone Set: fencing_postgres
Started: [ node2 node1 ]
问题是:当我切断 eth0 接口之间的连接时,它会杀死两个节点。我认为这是仲裁问题,因为只有 2 个节点。但我不想仅仅为了计算正确的仲裁而添加第 3 个节点。
有什么办法可以解决这个问题吗?
答案1
这是一个稍微老一点的问题,但这里提出的问题是基于对集群(尤其是双节点集群)中的故障转移如何以及何时工作的误解。
要点是:您无法通过禁用两个节点之间的通信来进行故障转移测试。这样做会导致您看到的情况,即出现具有额外相互 STONITH 的裂脑场景。如果您想测试隔离功能,只需killall -9 corosync
在活动节点上执行简单操作即可。其他方法是crm node fence
或stonith_admin -F
。
crm configure show
从您集群的不太完整的描述(和的输出在哪里cat /etc/corosync/corosync.conf
?)来看,您似乎使用 10.10.10.xx 地址进行消息传递,即 Corosync/集群通信。172.10.10.xx 地址是您的常规/服务网络地址,您可以通过其 172.10.10.xx 地址访问给定节点,例如使用 SSH。DNS 似乎还可以将节点主机名解析为node1
172.10.10.1。
您已将 STONITH 配置为使用 SSH,这本身并不是一个好主意,但您可能只是在测试。我自己没有使用过,但我假设 SSH STONITH 代理登录到另一个节点并发出关机命令,例如ssh root@node2 "shutdown -h now"
或类似的东西。
现在,当你切断节点之间的集群通信时会发生什么?节点不再认为每个节点都活着并且运行良好,因为它们之间不再有通信。因此,每个节点都认为自己是某些不幸事件的唯一幸存者,并试图成为(或保持)活动或主节点。这是经典而可怕的脑裂场景。
其中一部分是确保另一个显然可能出现故障的节点已经彻底关闭,这时 STONITH 就可以发挥作用了。请记住两个都节点现在正在玩同样的游戏:试图变得活跃(或保持活跃)并接管所有集群资源,以及攻击其他节点。
您大概能猜到现在发生了什么。node1
执行ssh root@node2 "shutdown -h now"
并node2
执行ssh root@node1 "shutdown -h now"
。 这不使用集群通信网络 10.10.10.xx,而是使用服务网络 172.10.10.xx。 由于两个节点实际上都运行良好,它们可以毫无问题地发出命令或接收 SSH 连接,因此两个节点同时互相攻击。 这会杀死两个节点。
如果您不使用 STONITH,那么裂脑可能会带来更糟糕的后果,尤其是在 DRBD 的情况下,最终可能会导致两个节点都成为主节点。数据损坏可能会发生,并且必须手动解决裂脑。
我建议阅读http://www.hastexo.com/resources/hints-and-kinks它是由那些为我们今天所称的“Linux HA 堆栈”做出过大量贡献(并且仍在做出贡献)的人编写和维护的。
总结:如果您为了测试隔离设置而切断节点之间的集群通信,你做错了。请改用killall -9 corosync
、crm node fence
或stonith_admin -F
。切断集群通信只会导致脑裂的情况,这会导致数据损坏。
答案2
您可以尝试添加auto_tie_breaker: 1
到 /etc/corosync/corosync.conf 的仲裁部分
启用 ATB 后,集群最多可承受 50% 的节点同时发生故障,这是确定性的情况。集群分区或仍与具有最低 nodeid 的节点保持联系的节点集将保持多数席位。其他节点将不占多数席位。
答案3
尝试阅读仲裁和双节点群集Pacemaker 文档的章节。
答案4
这更像是一个问题,而不是答案。我正在尝试设置一个与 Mmore 非常相似的 hacluster 配置。我非常希望获得他的配置文件(conf 文件、脚本或用于配置和启动集群的 pcs 命令等)。我此刻正在尝试找到一个独立于可用硬件和底层操作系统的 stonith 配置(有几个站点可以配备,具有不同的基础设施和 Linux 版本,我自己在运行 openindiana 的一对笔记本电脑上进行测试:我让 corosync 和 pacemaker 运行,但我目前在使用 stonith 时遇到了困难:即使我禁用它,我也会收到错误消息。)