MongoDB副本集 - 当只剩下PRIMARY时,PRIMARY角色落到SECONDARY

时间:2013-11-15 12:25:50

标签: mongodb configuration master-slave replicaset

我正在研究使用MongoDB ReplicaSet实现高可用性。

但是刚刚发现在具有3个节点的ReplicaSet中,如果PRIMARY mongod是剩下的唯一一个(其他2个mongod实例已经死亡或被关闭),那么几秒后它会将角色切换到SECONDARY并接受不再写了。这使副本集的价值低于单个实例。

我知道&了解PRIMARY选举,但是PRIMARY角色是固定在服务器上的(通过使用priority设置为,例如10)和(例如由于网络问题)其他服务器变得无法访问,为什么主服务器只是放弃?!

在Windows上测试2.4.8(mongodb-win32-x86_64-2008plus-2.4.8)和Linux上的Linux(CentOS)和2.0.x

BOUNTY STARTED:

如果PRIMARY感到孤独时副本集放弃了,那么确保100%可用性的替代方案是什么?或者可能需要特殊配置。当网络出现问题时,当前的实现会使ReplicaSet变得脆弱。

更新:

唉,在#3发生故障的情况之前我还没有说过(剩下PRIMARY& SECONDARY) 然后过了一会儿SECONDARY下降了。然后PRIMARY真的只是“放弃”,因为已经知道#3在一段时间内不可用。这实际上是在我的测试环境中测试的。

var rsconfig = {"_id":"rs4","members":[{"_id":0,"host":"localhost:27041","priority":10},{"_id":1,"host":"localhost:27042"},{"_id":2,"host":"localhost:27043","arbiterOnly":true}]}
printjson(rsconfig)
rs.initiate(rsconfig)

我们最初想把SECONDARY和#3(即ARBITER)放在同一台服务器上, 但由于标题中的问题,我们无法使用此类配置。

感谢Alan Spencer首先解释MongoDB采用的逻辑。

4 个答案:

答案 0 :(得分:8)

这是预料之中的,因为大部分成员都失败了,MongoDB并没有假设最后剩下的成员是一致的。

当您有大多数成员时,有几个选项:http://docs.mongodb.org/manual/tutorial/reconfigure-replica-set-with-unavailable-members/

答案 1 :(得分:7)

你说当主节点从其他两个节点切断时它应该保持不变,否则写入可用性会丢失,但情况并非如此。如果其他两个节点实际上是在网络分区的另一侧,那么他们已经选择了一个新的主节点(三个中有两个是多数),并且它是接受新写入的主节点。

如果先前的主数据库继续接受写入,则可能存在潜在冲突的数据,而这些数据无法解决。由于MongoDB副本集是单一主要架构(与多主机系统相对),因此选举机制可确保不会同时存在两个主要架构。

从两个辅助站点的角度来看,网络分区与主站点不可用相同,从主站点的角度来看,网络分区与“其他两个节点都断开”无法区分。它逐步降级,因为在网络分区的情况下,它的另一侧可能已经有另一个主要部分,并且它确保通过降级不能有两个初选。

当主要感觉单独时,“副本集”放弃的情况并非如此 - 当感觉孤立时主要降级的原因正是为了保持副本集整体的完整性。设置高优先级得分并不能确定某个节点的角色 - 主要只能通过多数人的共识来选举 - 所有优先级得分都会影响所有其他事物相等时的选举。

我强烈推荐优秀的“给我打电话”系列作为阅读,以了解分布式系统中写入可用性的挑战:http://aphyr.com/posts/281-call-me-maybe-carly-rae-jepsen-and-the-perils-of-network-partitions

答案 2 :(得分:1)

只是为了回答问题。此方案中的行为是预期的。 MongoDB使用领导者选举算法来选举新的领导者。因此,如果没有多数人,你就不能选出领导者,因此不能写作。

在2个节点关闭时,您唯一的选择是将副本集重新配置为1节点副本集以使其可写。您只需使用一台服务器即可使用rs.reconfig cmd执行此操作。但请注意,这应该只是一个临时和紧急配置。对于较长的持续时间,您的副本集配置中应该有一个奇数的总节点数(3+)。

答案 3 :(得分:-1)

尝试使用arbiters,大多数文档都说只使用一个,但在你的情况下,你需要赢得选举。

来自http://docs.mongodb.org/manual/core/replica-set-architectures/

  

副本集的容错是可以的成员数   变得无法使用,仍然留下足够的成员来选举   小学。换句话说,它是数量之差   集合中的成员和大多数人需要选出小学。没有   一个主副本,一个副本集不能接受写操作。故障   容差是副本集大小的影响,但关系是   不直接。

有关选举的更多信息:http://docs.mongodb.org/manual/core/replica-set-elections/

有关仲裁者的更多信息:http://docs.mongodb.org/manual/faq/replica-sets/#how-many-arbiters-do-replica-sets-need