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

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

我正在尝试使用 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 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 就可以发挥作用了。请记住两个都节点现在正在玩同样的游戏:试图变得活跃(或保持活跃)并接管所有集群资源,以及攻击其他节点。

您大概能猜到现在发生了什么。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 corosynccrm node fencestonith_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 时遇到了困难:即使我禁用它,我也会收到错误消息。)

相关内容