大神好,我有些疑问,按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台机,达到了过半,选举则成功。这个理解对吗?
有没有哪个大神给我举个例子说明一下。在同一个机房中 节点数量与选举是否成功的关系 ?
我把以上两位的回答综合一下给出完整的解答
这里是指集群中有投票权(
rs.conf()
中{vote: 1}
)的结点总数,不是有机器当掉之后的结点数量。注意选出主结点的条件是“大多数结点存活”,所谓大多数,3个结点的时候是2,4个结点的时候是3,5个结点的时候也是3。而需要大多数的原因则是防止平均分的情况(比如2:2分,两边都没有大多数)。这在同一个机房中虽然不常见,但是MongoDB是支持异地多机房部署的(我在9月份的MongoDB China上会讨论这个主题,有兴趣有时间可以来听),在异地的情况下就更容易出现机房与机房之间网络断开的情况。但是不管怎么说,就算同一个机房一样会有这样的情况发生,比如4台机器正好在2个机柜里,而这两个机柜因为某种原因连接断开了。因此最简单的解决办法就是避免偶数台机器的场景。