【发布时间】:2013-12-31 12:20:09
【问题描述】:
当使用具有 2 个服务器的副本集的 MongoDB 时,如果辅助服务器出现故障,则主服务器将变为辅助服务器。即使辅助服务器关闭,我也希望它保持其主要状态。显然,由于该集合中没有其他成员,因此选举过程不能将超过 50% 的选票给予主节点成为主节点,它成为次节点。
【问题讨论】:
标签: mongodb replication database
当使用具有 2 个服务器的副本集的 MongoDB 时,如果辅助服务器出现故障,则主服务器将变为辅助服务器。即使辅助服务器关闭,我也希望它保持其主要状态。显然,由于该集合中没有其他成员,因此选举过程不能将超过 50% 的选票给予主节点成为主节点,它成为次节点。
【问题讨论】:
标签: mongodb replication database
这就是为什么具有两个活动节点的副本集应始终在单独的服务器上包含arbiter 作为第三个成员。仲裁者是一个 mongod 实例,它不保存任何数据,但允许在初选中投票。
当Secondary宕机时,仍然会有arbiter来选举剩余节点为主。
仲裁器是一个非常轻量级的进程,因此它不需要专用服务器。但由于显而易见的原因,它不应该与副本集的另一个成员共享硬件。
【讨论】:
我在 Mongodb 网站上找到了这个 sn-p,它使用投票权重和优先级轻松解决了这个问题: { _id : 'setName', 成员:[ {_id:0,主机:“”,优先级:1}, { _id:1,主机:“”,优先级:0,投票:0 } ] }
我试过了,效果很好!我可以在不影响主节点的情况下关闭辅助节点。
【讨论】:
由于该集合的大多数未在线,您无法选择新的主节点 (http://en.wikipedia.org/wiki/Quorum) 或保留当前主节点。
您必须始终让大部分集合在线,否则您需要:http://docs.mongodb.org/manual/tutorial/reconfigure-replica-set-with-unavailable-members/
如果我使用我的记忆力,我记得@Asya 特别指出这是因为在一天结束时 MongoDB 无法知道是否存在网络分区或者该服务器实际上是那里的最后一个服务器,因此没有大多数MongoDB 中配置的成员不会尝试猜测一致性。
它归结为一个古老的问题,“如果某些东西无法 ping 通,是不是已经关闭了?”
【讨论】: