显示仲裁状态
Red Hat High Availability Add-on 提供了一个综合实用程序来显示集群中仲裁的当前状态: corosync-quorumtool 。
corosync-quorumtool 提供了与仲裁相关的信息的概述,例如 Total Votes 和 Expected Votes ,并一目了然地显示集群是否有仲裁。
# corosync-quorumtool Quorum information ----------------- Date: Thu Sep 25 05:02:00 2014 Quorum provider: corosync_votequorum Nodes: 4 [1] Node ID: 1 [2] Ring ID: 4648 Quorate: Yes [3] Votequorum information --------------------- Expected votes: 4 [4] Highest expected: 4 [5] Total votes: 4 [6] Quorum: 3 [7] Flags: Quorate [8] Membership information --------------------- Nodeid Votes Name 1 1 nodea.private.example.com (local) 2 1 nodeb.private.example.com 3 1 nodec.private.example.com 4 1 noded.private.example:com
- 节点条目提供属于集群的节点的节点数。
- 节点 ID 条目显示执行 corosync-quorumtool 的节点的 ID。
- Quorate 条目显示集群是否是quorate。
- 如果所有已配置的集群成员在集群中都处于活动状态,则预期投票条目会显示存在的投票数。
- 最高预期条目显示集群中看到的最大预期投票数。
- Total votes 条目显示集群中当前存在的投票数。
- Quorum 条目显示最少需要多少票才能使集群保持定额。
- Flags 条目显示当前在集群上设置的任何与仲裁相关的属性。如果集群是 quorate,则 Quorate 属性将显示。设置后,其他特殊功能也将显示在此字段中,例如 LastManstanding 或者 WaitForAll 。
什么是quorum(仲裁)?
为了使集群按预期工作,节点必须就某些事实达成一致,例如哪些机器当前是集群成员、服务在何处运行以及哪些机器正在使用哪些资源。
在 Red Hat High Availability Add-on 中实现这一点的方法是使用多数投票方案。
如果每个集群节点成功加入 corosync 网络通信并且能够与已经加入集群的其他节点通信,则每个集群节点投一票。
如果成功投出所有可能投票的一半以上,则集群可运行。
获得超过一半票数所需的最低票数称为法定人数。
如果达到法定人数,则群集被视为法定人数。
如果一半或者更多节点无法相互通信,则集群将失去仲裁。
当集群启动时,所有集群节点都会尝试相互通信并旨在实现仲裁。
一旦形成多数,就会有一个法定集群。
未成功加入仲裁集群的所有其他节点将被具有仲裁的节点保护。
如果属于仲裁集群一部分的节点无法再与集群通信,则该节点将被隔离。
计算仲裁人数
仲裁在红帽高可用性添加组件中由 corosync 组件投票仲裁计算和管理。
votequorum 组件使用两个值来计算集群是否为法定人数:
- 预期票数:如果所有集群节点都完全正常运行并相互通信,则预期的票数。
- 总票数:当前存在的票数。如果某些节点未启动或者未与集群通信,这可能低于预期的投票数。
达到法定人数所需的投票数基于预期投票数。
以下公式显示法定人数需要多少票。
在这个计算中, floor() 意味着总是向下取整。
Quorum = floor(expected votes / 2 + 1)
仲裁人数计算示例
在以下示例中,假设集群具有三个节点。
三节点集群的预期投票数为 3.
Quorum= floor(expected votes / 2 + 1) Quorum = floor(3 / 2 + 1) Quorum = floor(1.5 + 1) Quorum = floor(2.5) Quorum = 2
在三节点集群中,至少需要有两个节点在运行才能达到仲裁。
在以下示例中,假设集群具有四个节点。
四节点集群的预期投票数为四。
Quorum = floor(expected votes / 2 + 1} Quorum = floor(4 / 2 + 1) Quorum = floor(2 + 1} Quorum = floor(3) Quorum = 3
在四节点集群中,至少需要运行三个节点才能达到仲裁。
为什么需要计算仲裁人数?
在集群中的某些节点无法与某些其他节点通信的情况下,需要仲裁。
下图显示了一个由节点 A、B、c、D 和 E 组成的五节点集群,其服务在共享存储上使用 ext4 文件系统。
此服务当前正在节点 A 上运行。
节点 D 和 Eget 从主专用网络中分离出来,无法与节点 A、B 和 c 通信。
在没有仲裁的情况下,这两个节点将决定 A、B 和 C 都出现故障,需要进行隔离(远程断电),以便可以恢复其资源。
通过这种方式,法定人数在围列之前充当了重要的大门。
如果集群没有 fencing 设备,节点 D 和 E 将立即开始恢复资源,导致相同的 ext4 文件系统同时挂载在两个地方,这不是一个健康的情况。
这种集群的两半彼此独立运行的情况被称为裂脑。
裂脑是双节点集群中的一个特殊问题,因为如果其中一个节点出现故障,另一个节点将不包含集群中的大多数节点。
需要采取特殊步骤来允许双节点集群操作并仍然避免裂脑.”
假设本例中所有节点都拥有一票,则不会出现这种情况,因为节点 D 和节点 E 一共只有两票,不超过总票数(五)的一半。
这将导致节点 D 和节点 E 停止运行,直到至少添加另一票为止。
另一方面,节点 A、B 和 c 保持活跃提供服务,因为它们总共有三票,占总票数的一半以上。