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

时间:2015-04-15 15:48:03

标签: mongodb

如果发现副本集要求有点混乱,我可能会遗漏一些明显的东西(比如在哪种条件下有选举)。

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

但是,由于我们使用副本集进行故障转移,如果主人死亡,那么我们会留下偶数个投票成员,这是基于我有限的经验,延长了选举主要成员的时间。

同样根据文档,添加一个投票成员并没有开始选举,似乎启动(启动)你的副本集与偶数个节点会更有意义吗?

因此,如果我们开始说副本集中有4台机器,并且一台机器死机,则会有3台机器重新选举,快速定额。我们添加了一台机器以恢复正常运行状态,没有重新选举,我们又恢复了正常运行状态。

有人可以对此有所了解吗?

1 个答案:

答案 0 :(得分:1)

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

让N成为四台机器的集群:

  • 一台机器死机,其他机器恢复运行。好。
  • 两台机器死机,我们已离线,因为我们不再获得多数票。坏。

让M成为三台机器的集群:

  • 一台机器死机,其他机器恢复运行。好。
  • 两台机器死机,我们已离线,因为我们不再获得多数票。坏。

<强> =&GT;相同的结果是成本的3/4。

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

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

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

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

<强> =&GT; 较少的可用性,成本较高。但那还没有回答这个问题。

让我们说你真的担心可用性:你有两个数据中心,两个数据中心的后端服务器,任播IP,整个交易。现在两个DC之间的网络是分区的,但是一些客户端连接到DC A,而另一些客户端连接到DC B.现在,您如何确定哪个数据中心可以接受写入?这是不可能的 - 这就是为什么奇数是必要的

你实际上并不需要Anycast IP,BGP或任何花哨的东西来解决问题,任何写作应用程序(如工人,陈旧请求,任何东西)都需要稍后合并不同的写入,这是一种完全不同的并发方案。