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 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 代理登录到另一个节点并发出关闭命令,例如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
代替。切断集群通信只会导致裂脑场景,这可能并且将会导致数据损坏。
归档时间: |
|
查看次数: |
38511 次 |
最近记录: |