gpt4 book ai didi

mongodb - 为什么 mongodb 副本集需要奇数个投票成员?

转载 作者:可可西里 更新时间:2023-11-01 09:51:23 30 4
gpt4 key购买 nike

如果发现副本集要求有点困惑,我可能遗漏了一些明显的东西(比如在什么条件下有选举)。

我知道在正常操作中您需要法定人数,并进行投票并获得所需的多数和奇数的机器。

但是由于我们使用副本集进行故障转移,如果主节点死亡,那么我们剩下的投票成员数量为偶数,根据我有限的经验,这会延长选举主节点的时间。

此外,根据文档,添加投票成员不会启动选举,似乎启动(启动)具有偶数节点的副本集更有意义?

所以如果我们从副本集中的 4 台机器开始说,并且一台机器死了,就会有 3 台机器重新选举,快速仲裁。我们加一台机器回到我们正常的运行状态,没有重新选举,我们回到我们正常的运行状态。

有人可以阐明这一点吗?

最佳答案

TL;DR:对于单主系统,即使是分区也无法确定哪个剩余部分仍然占多数,从而导致两个系统都崩溃。

设 N 是一个由四台机器组成的集群:

  • 一台机器死机,其他机器恢复运转。好。
  • 两台机器挂了,我们下线了,因为我们不再占多数。不好。

令 M 为三台机器组成的集群:

  • 一台机器死机,其他机器恢复运转。好。
  • 两台机器挂了,我们下线了,因为我们不再占多数。不好。

=> 以 3/4 的成本获得相同的结果。

现在,让我们添加一两个假设:

  • 我们还将运行某种使用数据库的服务器应用程序
  • 网络可以分区

假设您有两个数据中心,一个有两个数据库实例和后端服务器机器。如果与备份中心(有一个 MongoDB 实例)的连接失败,您仍然在线。

现在,如果您在备份数据中心添加第二个 MongoDB 实例,尽管看起来冗余度更高,但网络分区会产生较低的可用性,因为在网络分区的情况下我们会失去大部分无法继续经营。

=> 可用性越差成本越高。但这还没有回答问题。

假设您真的很担心可用性:您有两个数据中心,两个数据中心都有后端服务器,任播 IP,整个交易。现在两个 DC 之间的网络是分区的,但是一些客户端连接到 DC A,而其他客户端连接到 DC B。您现在如何确定哪个数据中心可以接受写入?这是不可能的 - 这就是奇数是必需的原因。

您实际上不需要 Anycast IP、BGP 或任何奇特的东西来使问题成为现实,任何编写应用程序(如工作人员、陈旧的请求等)都需要稍后合并不同的写,这是一个完全不同的并发方案。

关于mongodb - 为什么 mongodb 副本集需要奇数个投票成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29654886/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com