30

假设我们设置了一个没有仲裁器的 MongoDB 复制,如果主节点不可用,则副本集将选择一个从节点作为主节点。所以我认为这是一种隐含的仲裁者,因为副本会自动选择一个主节点。

所以我想知道为什么我们需要一个专用的仲裁节点?谢谢!

4

4 回答 4

16

创建了一个电子表格来更好地说明副本集中仲裁节点的效果。

在此处输入图像描述

它基本上归结为以下几点:

  1. 对于2 个数据节点的 RS ,失去 1 个服务器会使您低于您的投票最小值(“大于 N/2”)。仲裁器解决了这个问题。
  2. 对于偶数数据节点的 RS ,添加仲裁器可将容错度提高 1,而不会因拆分而拥有 2 个投票集群。
  3. 对于奇数数据节点的 RS ,添加仲裁器将允许拆分创建 2 个具有“大于 N/2”票数的隔离集群,因此会出现裂脑场景。

此处[详细] 解释了选举。在该文件中,它指出一个 RS 可以有 50 个成员(偶数)和 7 个投票成员。我强调“状态”,因为它没有解释它是如何工作的。在我看来,如果你发生分裂,一方有 4 名成员(全部投票),另一方有 46 名成员(3 名投票),你宁愿让 46 人选举初选而 4 人作为阅读 -只有集群。但是,这正是“有限投票”所阻止的。在这种情况下,您实际上将拥有一个 4 成员集群,其中一个主集群和一个 46 成员集群是只读的。解释这是怎么回事超出了这个问题的范围,也超出了我的知识范围。

于 2017-03-29T16:34:15.833 回答
9

这实际上归结为 CAP 定理,即如果分区两侧的服务器数量相等,则数据库无法维护 CAP(一致性、可用性和分区容限)。仲裁器专门设计用于在一侧创建“不平衡”或多数,以便在这种情况下可以选择主节点。

如果您在任一侧获得偶数个节点,MongoDB 将不会选择主节点,并且您的集合将不接受写入。

编辑

我的意思是,例如,一侧有 2 个,另一侧有 2 个。我的英语在那儿听不懂。

所以我真正的意思是双方。

编辑

维基百科为解释 CAP 提供了一个很好的案例:http ://en.wikipedia.org/wiki/CAP_theorem

于 2013-08-13T14:04:03.827 回答
8

由于以下原因,在复制中必须有一个仲裁器:

  • 如果具有奇数个副本集,则复制更可靠。如果有偶数个副本集,最好在复制中添加一个仲裁器。
  • 仲裁者不保存数据,他们只是在有任何节点故障时投票选举。
  • Arbiter 是一个轻量级的进程,它们不会消耗太多的硬件资源。
  • 仲裁者只是在加密的副本集之间交换用户凭据数据。
  • 选举期间的投票、心跳和配置数据在副本集之间通信时未加密。
  • 最好在单独的机器上运行仲裁程序,而不是与任何一个副本集一起运行以保持高可用性。

希望这可以帮助 !!!

于 2018-03-13T05:19:11.500 回答
4

仲裁器是一种可选机制,当您在副本集中部署了偶数个 mongod 时,它允许投票成功。仲裁器是轻量级的,意味着部署在不是专用 mongo 副本的服务器上,即:服务器的主要角色是其他一些任务,例如 redis 服务器。由于它们很轻,它们不会(明显)干扰系统的资源。

从文档:

仲裁者没有数据集的副本,也不能成为主节点。副本集可能有仲裁者在主节点选举中添加投票。仲裁器允许副本集具有奇数数量的成员,而不会产生复制数据的成员的开销。

于 2013-08-13T14:06:22.623 回答