5

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

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

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

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

赏金开始:

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

更新:

唉,我之前没有说过 #3 发生故障(留下主要和次要),然后过了一段时间,次要发生故障。然后 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

4 回答 4

8

这是意料之中的,因为大多数成员都关闭了 MongoDB 并不假设最后一个剩余成员是一致的。

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

于 2013-11-15T12:29:43.797 回答
7

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

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

从两个从节点的角度来看,网络分区与主节点不可用相同,从主节点的角度来看,网络分区与“其他两个节点都关闭”没有区别。它会降级,因为在网络分区的情况下,它的另一侧可能已经有另一个主节点,并且它通过降级来确保不会有两个主节点。

当主节点感到孤独时,“副本集”不会放弃——主节点在感到孤独时下台的原因恰恰是为了保持副本集作为一个整体的完整性。设置高优先级分数固定一个节点的角色是不正确的——一个主节点只能通过多数人的共识来选举——所有优先级分数所做的就是在所有其他条件都相同时影响选举。

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

于 2013-11-24T00:45:42.693 回答
1

只是为了回答答案。这种情况下的行为是预期的。MongoDB 使用领导者选举算法来选举新的领导者。因此,如果没有多数,您就无法选举领导者,因此就不会写入。

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

于 2013-11-20T21:06:43.757 回答
-1

Try to use arbiters , most documents say to use just one, but in you case, you need to win the election.

来自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

于 2013-11-24T20:41:34.737 回答