2014-10-02 33 views
2

我创建了一个3成员的副本集,以便我可以使用其中一个成员读取操作,而不会干扰主数据库的性能。MongoDB,副本设置和防止主要成为中学

为了实现这个目标,主数据库系统被配置为主数据库,另一个是优先级为0的辅助数据库,以便在中断时不接管主要角色,第三个数据库是仲裁者以帮助打破平局根据MongoDB的要求有奇数个成员。

在使用设置时,我注意到,如果我杀死仲裁者和我的次要成员,则主要成为次要成员。这会影响主数据库的读写访问,因为它的角色已更改。要解决这个问题,我必须重新启动主数据库并将其从副本集中删除,直到我的辅助和/或仲裁者恢复联机。

虽然两个系统出现故障或出现网络连接问题的可能性很低,但我已将此漏洞引入主数据库。有没有办法解决这个问题。我想到的一个想法是在另一台机器上添加另一个仲裁器,但是我不确定这是否可行,然后将其设置为均匀。

回答

2

当辅助仲裁者副本被终止时,主要成为次要的,因为它没有得到大多数票(在这种情况下只有1/3的比例低于50%)成为主要票。目的是防止在网络中断期间多个副本成为主要副本,以保持数据一致性。

在这种情况下添加另一个仲裁器并没有帮助,因为您只有2/4票不超过50%。这就是我们不需要偶数副本集的原因。在这种情况下,您可以添加两个仲裁器来创建一个奇数。

如果您确实不希望次要服务器成为主服务器(例如,次要服务器为只读服务器)并阻止主服务器成为次服务器,则可以将次数和仲裁服务器的投票数设置为0(请参阅http://docs.mongodb.org/manual/reference/replica-configuration/#local.system.replset.members[n].votes) 。在这种情况下,您可以删除仲裁器,因为它变得毫无用处。

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) 
+0

与弃用同意,这是过去的实验我尝试之一,而它的工作,它的每个成员在投掷警告说票数是无效的,所以我偏离了这一点。无论如何,从迄今为止的声音来看,应该是在多台机器上添加多个仲裁器,总数为奇数,并便于主系统保持为主要系统。 – 2014-10-02 23:53:30

+1

另一种解决方法是将次数和仲裁者的投票数设置为0。仲裁者在这种情况下将变得毫无用处。 – anhlc 2014-10-03 00:03:58

+0

我删除了仲裁者,并设置了我的第二个投票权= 0。这解决了我的担忧,当我启动mongo控制台时没有发出警告。谢谢! – 2014-10-03 00:45:14

相关问题