Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MongoDB ReplicaSet-当只剩下主角色时,主角色下降到辅助角色_Mongodb_Configuration_Master Slave_Replicaset - Fatal编程技术网

MongoDB ReplicaSet-当只剩下主角色时,主角色下降到辅助角色

MongoDB ReplicaSet-当只剩下主角色时,主角色下降到辅助角色,mongodb,configuration,master-slave,replicaset,Mongodb,Configuration,Master Slave,Replicaset,我正在研究使用MongoDB ReplicaSet实现高可用性 但刚刚发现,在具有3个节点的ReplicaSet中,如果只剩下主mongod(即另外2个mongod实例已死亡或已关闭),则几秒钟后,它将角色切换到辅助,不再接受写入。这使得副本集的价值低于单个实例 我知道并理解PRIMARY election,但PRIMARY角色固定在一台服务器上(使用优先级设置为10),并且(例如,由于网络问题)其他服务器无法访问,为什么主服务器只是放弃 在Windows(mongodb-win32-x86_6

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

但刚刚发现,在具有3个节点的ReplicaSet中,如果只剩下主mongod(即另外2个
mongod
实例已死亡或已关闭),则几秒钟后,它将角色切换到辅助,不再接受写入。这使得副本集的价值低于单个实例

我知道并理解PRIMARY election,但PRIMARY角色固定在一台服务器上(使用
优先级设置为10),并且(例如,由于网络问题)其他服务器无法访问,为什么主服务器只是放弃

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

赏金开始:

如果副本集在主服务器感觉单独时放弃,有什么替代方案可以确保100%可用性?或者可能有特殊的配置需要的情况。当前的实现使ReplicaSet在出现网络问题时变得脆弱

更新:

唉,我以前没有说过#3下降的情景(小学和中学都不在了) 然后过了一段时间,二级考试就开始了。那么小学真的只是“放弃”,因为大家都知道#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(即仲裁者)放在同一台服务器上, 但由于标题中的问题,我们不能使用这种配置


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

这是意料之中的,因为大多数成员都不支持MongoDB,所以MongoDB并不认为最后剩下的成员是一致的


当你有大多数成员在下面时,有两种选择:

只是为了插话回答问题。此场景中的行为是预期的。MongoDB使用领导人选举算法来选举新领导人。因此,如果没有多数票,你就不能选出一位领导人,因此也就不会有人写信


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

您说,当主节点与其他两个节点断开时,它应保持不动,否则写可用性将丢失,但情况并非如此。如果其他两个节点实际上处于网络分区的另一侧,则它们已经选择了一个新的主节点(因为三分之二的节点是多数节点),并且正是该主节点接受新的写操作

如果上一个主服务器继续接受写操作,则可能会有冲突的数据,并且没有解决机制。由于MongoDB副本集是一个单一的主架构(与多主系统相反),因此选择机制确保不能同时有两个主架构

从两个辅助设备的角度来看,网络分区与主设备不可用是相同的,从主设备的角度来看,网络分区与“其他两个节点都已关闭”是无法区分的。它将退出,因为在网络分区的情况下,它的另一侧可能已经有另一个主节点,并且它通过退出来确保不会有两个主节点

这并不是说“副本集”在primary感到孤独时放弃,primary感到孤独时退出的原因恰恰是为了保持副本集作为一个整体的完整性。设置高优先级分数并不能确定节点的角色-只能通过多数人的一致意见选举初选-所有优先级分数所做的都是在所有其他事情都相同的情况下影响选举

我强烈推荐优秀的“call me maybe”系列作为阅读,以了解分布式系统中写可用性的挑战:

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

发件人:

副本集的容错性是可以访问的成员数 变得不可用,但仍有足够的成员可供选择 初选。换言之,这是数量之间的差异 集合中的成员和多数人需要选举一名初选成员。没有 主副本集不能接受写入操作。过错 容差是副本集大小的影响,但关系是 不直接

有关选举的更多信息:


关于仲裁人的更多信息:

想象和模拟的情况是,只剩下主设备(例如,其他设备无法解决网络问题)。PRIMARY是唯一接受写入的mongod实例,因此它始终具有最新的数据。当前MongoDB实现的结果是,在5-10秒内,ReplicateSet抓取操作。@palverest当3个成员的副本集只剩下主副本时,多数副本已关闭…我不明白您的意思problem@PaulVerest-有一个很好的理由让主修生放弃主修。。。由于它看不到大多数人,它不知道他们是否都还活着,是否可以看到对方,是否已经选出了一个新的初选——因此,本文提到的网络划分问题Sammaye@PaulVerest请看我的答案——选举需要多数票,但初选也需要多数票才能保持初选。也就是说,如果一个节点不能当选,那么它就不能保持主节点。@AsyaKamsky,但有一个主节点……那么,主节点在意识到多数节点已经下台后,不是已经下台了吗?它使用了一个:不确定领导人选举算法是什么,如果它存在,请告诉我,如果我错了,但他没有处理网络分区。这不是关于一致性的答案吗?复制副本中的任何节点都将如何实现一致性