我倾向于集群计算的一些基本概念,我有一些问题要问。
如果群集分成两个(或更多)不能再相互通信的节点组(aka.partitions),则使用仲裁来阻止资源在比预期更多的节点上启动,这会冒数据损坏的风险。 当超过一半的所有已知节点在同一分区中处于联机状态时,群集具有仲裁,或者对于数学倾向,只要下面的等式为真,则群集具有仲裁:
total_nodes < 2 * active_nodes
例如,如果将5节点群集拆分为3节点和2节点分区,则3节点分区将具有仲裁并可继续提供资源。如果一个6节点集群分成两个3节点分区,那么这两个分区都不会有仲裁;在这种情况下,起搏器的默认行为是停止所有资源,以防止数据损坏。
双节点群集是一种特殊情况。 通过上面的定义,当两个节点都在运行时,双节点集群只具有仲裁。这将使双节点集群的创建毫无意义
问题:
从上面,我出现了一些混淆,为什么我们无法阻止所有群集资源,如“ 6节点群集”?两个节点群集的特殊之处在哪里?
答案 0 :(得分:1)
正确的说,双节点群集在通信时只能具有仲裁。因此,如果要使用默认行为拆分群集,则资源将停止。
解决方案是不使用默认行为。只需将Pacemaker设置为no-quorum-policy=ignore
即可。这将指示Pacemaker即使在法定人数丢失时也能继续运行资源。
...但是等等,现在如果群集通信中断但两个节点仍然可以运行会发生什么。他们会不会认为他们的同伴死了,他们都成为活跃的节点?现在我有两个初选,可能有不同的数据或我的网络上的冲突,对吧?这个问题通过STONITH解决。正确配置的STONITH将确保在给定时间内只有一个节点处于活动状态,并且基本上可以防止甚至发生分裂。
一篇优秀的文章进一步解释了STONITH,它的重要性是由LMB在2010年写的:http://advogato.org/person/lmb/diary/105.html