MongoDB replica set强制重新配置

MongoDB的replica set是一种取代了master-slave的replication的架构,具备自动failover的能力。因此,其可靠性和可管理性比master-slave更高。replica set的failover依靠少数服从多数的选举票机制来推选新的主节点。为了从术语上与master-slave进行区分,在replica set中,我们把主节点成为primary,把从节点成为secondary。

少数服从多数的机制意味着我们应该有奇数个节点。但是,我们可能会遇到只有两个节点的情况。

两个节点的情况下,我们可以将其中一个节点设置为不具备投票权的节点,只负责复制数据,以避免数据丢失的情况发生。一旦主节点不可用,我们可以手工将不具备投票权的节点重新配置为主节点。

强制重新配置,能将一个secondary的节点,强制变为master节点。

一种方法是将坏掉的那个节点从集合中删除,从而重新达到平衡。

cfg = rs.config()
cfg.members = [ cfg.members[i], cfg.members[j], ...]
rs.reconfig(cfg, {force: true})

另一种方法是调整节点的priority和votes。可以将其priority和votes都设置为0,从而使它不具备被选举权。priority是被选举权,而votes是选票。

cfg = rs.config()
cfg.member[i].priority = 0
cfg.member[i].votes = 0
rs.reconfig(cfg, {force: true})

我们在新增节点时,为了避免触发选举过程,导致选举出的节点并非当前节点的情况发生。我们可以在添加时,使新节点没有投票权。然后再通过重新配置的方式,赋予节点正常的优先级和投票权。

rs.add( {_id: i, host: "hostname i", priority: 0, votes: 0})
rs.add( {_id: j, host: "hostname j", priority: 0, votes: 0})
cfg = rs.config()
cfg.members[index i].priority = 1
cfg.members[index i].votes =1
cfg.members[index j].priority = 1
cfg.members[index j].votes = 1
rs.reconfig(cfg, {force: true})