如何在2节点主动/被动linux HA起搏器群集中设置STONITH?


12

我正在尝试使用corosync和心脏起搏器设置主动/被动(2个节点)Linux-HA集群,以保持PostgreSQL数据库的正常运行。它通过DRBD和service-ip起作用。如果node1发生故障,则node2应该接管。如果PG在node2上运行并且失败,则相同。除了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-interface之间的连接时,它将杀死两个节点。我认为仲裁有问题,因为只有2个节点。但我不想添加第3个节点,仅用于计算正确的仲裁。

有解决这个问题的想法吗?


crm_mon当群集处于故障状态时,输出会是什么样?
larsk's

1
现在,我正在使用一个stonith设备,该设备不能在与postgres相同的节点上运行。这项工作符合预期!
MMore 2012年

Answers:


21

这是一个稍旧的问题,但此处提出的问题是基于对群集(尤其是两节点群集)中的故障转移如何以及何时工作的误解。

要点是:您不能通过禁用两个节点之间的通信来进行故障转移测试。这样做将导致您所看到的完全一样,一个带有额外的相互STONITH的裂脑场景。如果要测试隔离功能,则可以killall -9 corosync在活动节点上进行简单操作。其他方式是crm node fencestonith_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进入的地方。请记住,两个节点现在正在玩同一游戏:试图变得(或保持)活跃并采取行动覆盖所有群集资源,以及拍摄头中的另一个节点。

您可能会猜到现在会发生什么。node1ssh root@node2 "shutdown -h now"node2ssh root@node1 "shutdown -h now"。这不使用群集通信网络10.10.10.xx,而是使用服务网络172.10.10.xx。由于两个节点实际上都还活着,因此它们发出命令或接收SSH连接都没有问题,因此两个节点可以同时相互射击。这会杀死两个节点。

如果不使用STONITH,则裂脑的后果可能更糟,尤其是在DRBD的情况下,最终结局是两个节点都将成为Primary。可能会发生数据损坏,并且必须手动解决裂脑问题。

我建议阅读http://www.hastexo.com/resources/hints-and-kinks上的资料,这些资料是由贡献(并仍在贡献)的人们编写并维护的,这些东西我们今天称之为“ Linux HA”堆”。

TL; DR:如果要切断节点之间的群集通信以测试防护设置,那么这样做是错误的。使用killall -9 corosynccrm node fencestonith_admin -F代替。中断群集通信只会导致脑裂的情况,这会并且将导致数据损坏。


2

您可以尝试将其添加auto_tie_breaker: 1到/etc/corosync/corosync.conf的法定部分中

启用ATB后,群集可以确定性方式同时遭受多达50%的节点故障。群集分区或仍与节点ID最低的节点保持联系的节点集将保持原来的状态。其他节点将是隔离的。


0

尝试阅读Pacemaker文档的Quorum和两节点群集


认为您的意思是“ no-quorum-policy = ignore”。我已经设置好了(也编辑了我的第一篇文章)。在这里对我没有帮助。请给我一点点好吗?
MMore 2012年

很好,该文档建议,如果集群存在仲裁问题,则起搏器将记录一些特定的消息。您在日志中看到了吗?是什么crm_mon节目?
larsk's

我找不到…… 在日志中有趣。我用的信息编辑了第一篇文章crm_mon -1
MMore 2012年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.