高可用性 – 如何在双节点主动/被动Linux HA起搏器群集中设置STONITH?

我正在尝试使用corosync和pacemaker设置主动/被动(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接口之间的连接时,它会杀死两个节点.我认为这是法定人数的问题,因为只有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.切割群集通信只会导致裂脑情况,这会导致数据损坏.

相关文章

linux常用进程通信方式包括管道(pipe)、有名管道(FIFO)、...
Linux性能观测工具按类别可分为系统级别和进程级别,系统级别...
本文详细介绍了curl命令基础和高级用法,包括跳过https的证书...
本文包含作者工作中常用到的一些命令,用于诊断网络、磁盘占满...
linux的平均负载表示运行态和就绪态及不可中断状态(正在io)的...
CPU上下文频繁切换会导致系统性能下降,切换分为进程切换、线...