节点之间是专用的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个节点.但我不想添加第三个节点只是为了计算正确的仲裁.
有什么想法可以解决这个问题吗?
解决方法
要点是:您不能通过禁用两个节点之间的通信来进行故障转移测试.这样做会产生你所看到的,一个带有额外的,相互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代理登录到另一个节点并发出一个shutdown命令,比如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堆栈”的大部分人员编写和维护.
TL; DR:如果要切断节点之间的集群通信以测试防护设置,那么您做错了.请改用killall -9 corosync,crm node fence或stonith_admin -F.切割群集通信只会导致裂脑情况,这会导致数据损坏.