我创建了一个3成员的副本集,因此我可以使用其中一个成员来读取操作,而不会干扰主数据库的性能。
为实现这一点,主数据库系统配置为主数据库,另一个是优先级为0的辅助系统,以便在发生中断时不接管主要角色,第三个是帮助打破平局的仲裁者MongoDB要求拥有奇数成员。
在玩设置时,我注意到如果我杀死Arbiter和我的辅助成员,则主要成为辅助。这会影响主数据库的读写访问权限,因为它的角色已经改变。要解决此问题,我必须重新启动主数据库并将其从副本集中删除,直到我的辅助和/或仲裁服务器重新联机。
虽然两个系统出现故障或网络问题的概率很低,但我已将此漏洞引入主数据库。有没有办法解决这个问题。我想到的一个想法就是在另一台机器上添加另一个仲裁器,但是我不确定这是否可行,然后才能使该设置均匀。
答案 0 :(得分:2)
当二级和仲裁副本被杀死时,主要副本成为次要的,因为它不能获得大多数选票(在这种情况下只有1/3,小于50%)成为主要选票。目的是防止在网络中断期间多个副本成为主副本以保持数据一致性。
在这种情况下添加另一个仲裁者没有用,因为你只有2/4票,不超过50%。这就是为什么我们不需要偶数副本集的原因。在这种情况下,你可以添加两个仲裁器来制作一个奇数。
如果您确实不希望辅助辅助设备成为主设备(例如,辅助设备是只读辅助设备)并且防止辅助设备成为辅助设备,则可以将辅助设备和仲裁设备的投票编号设置为0(参见{{3 }})。在这种情况下,您可以删除仲裁器,因为它变得无用。
cfg = rs.conf()
cfg.members[0].votes = 1 // the primary (by default votes = 1)
cfg.members[1].votes = 0 // the secondary
cfg.members[2].votes = 0 // the arbiter
rs.reconfig(cfg)
另一个解决方案是你可以给主要票3票。总票数是5,主要总是以至少3/5票赢得选举。但是从版本2.6开始不推荐使用,因为它不允许投票高于1。
cfg = rs.conf()
cfg.members[0].votes = 3 // the primary
cfg.members[1].votes = 1 // the secondary
cfg.members[2].votes = 1 // the arbiter
rs.reconfig(cfg)