我正在研究使用 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 采用的逻辑。