mongodb副本集数量为一定要为奇数?

大神好,我有些疑问,按mongodb官方的说话,当多于2个节点时。推荐副本集成员为奇数个成员,而不使用仲裁。
这个奇数个成员数量是指副本集初始化的数量吧? 还是有节点挂掉后参与选举的数量
比如我部署一个副本集3个成员包括一个master,两个secondary?如果master 挂 了,还剩下两个secondary,这两个secondary会完成选举出来个master来么?
如果是不按官方推荐,我部署偶数个,4台机,1个master 3个secondary。master挂掉后,剩下 三个secondary难道选举不出一个Master?

我认为不管你部署多少台机(只讨论2台以上不需要仲裁的情况),最重要的是有成员(不管master or secondary)挂掉后,剩下未挂的机子能成功选举就可,所以跟部署多少台机关系不大。就算你一开始部署奇数台,如果挂掉一台,剩下的机子一样是偶数。

--后面补充:
后来我在网上看了一些文章,这个奇数个节点的建议应该是在跨机房部署时才有意义的,因为如果两个房机A,B,4台机AB中平衡分布也就是两边各2台,当网络故障时,AB会中的节点们会同时进行各自选举?因为没有达到4台机中的过半数量,AB两机房中的节点们都选举失败(或选举不会发生)这时如果不是4台机而是5台,那么其中有一个机房是3台机,达到了过半,选举则成功。这个理解对吗?

有没有哪个大神给我举个例子说明一下。在同一个机房中 节点数量与选举是否成功的关系 ?

阅读 9.6k
3 个回答

我把以上两位的回答综合一下给出完整的解答

大神好,我有些疑问,按mongodb官方的说话,当多于2个节点时。推荐副本集成员为奇数个成员,而不使用仲裁。
这个奇数个成员数量是指副本集初始化的数量吧? 还是有节点挂掉后参与选举的数量?

这里是指集群中有投票权(rs.conf(){vote: 1})的结点总数,不是有机器当掉之后的结点数量。
注意选出主结点的条件是“大多数结点存活”,所谓大多数,3个结点的时候是2,4个结点的时候是3,5个结点的时候也是3。而需要大多数的原因则是防止平均分的情况(比如2:2分,两边都没有大多数)。这在同一个机房中虽然不常见,但是MongoDB是支持异地多机房部署的(我在9月份的MongoDB China上会讨论这个主题,有兴趣有时间可以来听),在异地的情况下就更容易出现机房与机房之间网络断开的情况。但是不管怎么说,就算同一个机房一样会有这样的情况发生,比如4台机器正好在2个机柜里,而这两个机柜因为某种原因连接断开了。因此最简单的解决办法就是避免偶数台机器的场景。

不只是mongodb,你会发现几乎所有的带选举功能的集群都会要求奇数个节点。这是为了防止脑裂

如果是不按官方推荐,我部署偶数个,4台机,1个master 3个secondary。master挂掉后,剩下 三个secondary难道选举不出一个Master?

可以。

但是你看啊,你部署四台,最多能容忍挂掉一台。部署三台,最多也是能容忍挂掉一台。那你干嘛要部署第四台机器呢?(可以分担读压力,但是如果你需要第四台机器来分担的话,挂一台集群就会超负荷从而无法正常工作了。)

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进