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

MMo*_*ore 12 cluster high-availability drbd pacemaker

我正在尝试使用 corosync 和起搏器设置一个主动/被动(2 个节点)Linux-HA 集群来启动和运行 PostgreSQL 数据库。它通过 DRBD 和 service-ip 工作。如果节点 1 失败,节点 2 应该接管。如果 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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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 ]
Run Code Online (Sandbox Code Playgroud)

问题是:当我切断 eth0 接口之间的连接时,它会杀死两个节点。我认为这是法定人数的问题,因为只有 2 个节点。但我不想仅仅为了计算正确的法定人数而添加第三个节点。

有什么想法可以解决这个问题吗?

daf*_*aff 22

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

要点是:您不能通过禁用两个节点之间的通信来进行故障转移测试。这样做将导致您所看到的情况,即具有额外的、相互的 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 似乎也解析了像node1172.10.10.1这样的节点主机名。

您已将 STONITH 配置为使用 SSH,这本身并不是一个好主意,但您可能只是在进行测试。我自己没有使用过它,但我假设 SSH STONITH 代理登录到另一个节点并发出关闭命令,例如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 的情况下,您最终可能会使两个节点都成为主节点。可能会发生数据损坏,必须手动解决裂脑问题。

我建议阅读http://www.hastexo.com/resources/hints-and-kinks上的材料,这些材料由贡献(并且仍然贡献)大量我们今天称为“Linux HA”的人编写和维护堆”。

TL;DR:如果您为了测试您的防护设置而切断节点之间的集群通信,那么您就做错了。使用killall -9 corosync,crm node fencestonith_admin -F代替。切断集群通信只会导致裂脑场景,这可能并且将会导致数据损坏。


lar*_*sks 0

尝试阅读Pacemaker 文档的仲裁和两节点集群章节。