简而言之:就是阻止副本集的两个正常节点在失去联系时陷入裂脑状态。
MongoDB 副本集的设计是这样的,如果一个或多个成员出现故障或失去联系,其他成员只要在他们之间拥有多数就可以继续运行。多数条款很重要:没有它,您可能会遇到这样的情况:网络一分为二,并且分区两边的节点认为它们仍在进行副本集,并最终得到不同的副本集。数据。
因此,为了避免裂脑问题,如果副本集的节点不能获得绝对多数,它们将不会继续存在。例如,如果您有两个节点,在这样的副本集中:
如果他们失去沟通,结果是对称的:
每个人都会以同样的方式推理:
- 意识到它已经失去了与其他人的联系
- 评估是否有可能保持副本集运行
- 意识到 1 个节点(2 个)不构成多数
- 恢复到次要模式
仲裁者的不同之处
如果有第三个节点,那么即使两个主节点彼此失去联系,仍然会有一个与仲裁者联系。这允许两个主要节点做出不同的决定,并保持副本集继续运行,同时避免脑裂问题。
考虑以下 3 节点副本集的示例:
无论网络分区采用哪种方式,一个节点仍将与仲裁器保持联系;例如像这样:
节点 A 将:
- 意识到它既不能联系节点 B 也不能联系仲裁者
- 评估是否有可能保持副本集运行
- 意识到 1 个节点(3 个节点中的一个)不构成多数
- 恢复到次要模式
而节点 B 能够做出不同的反应:
- 意识到它无法联系节点 A,但仍与仲裁器有联系
- 评估是否有可能保持副本集运行
- 意识到 2 个节点(3 个中)确实构成多数
- 接任主要
这也说明了您应该如何部署仲裁程序以获得该好处:
- 尝试将仲裁器放在一个独立于两个数据承载节点的系统上,以最大限度地提高它仍然能够在整个网络问题中与任何一个进行通信的机会
- 它不需要存储数据,因此您不需要高规格的硬件
- 只需 1 个仲裁者就足以打破僵局;您不会从多个仲裁者中获得任何好处