强制自管理副本集节点成为主节点
Overview
您可以通过赋予 副本集成员比集中任何其他成员更高的值来强制其成为 members[n].priority
主节点。
或者,您也可以通过将节点的 members[n].priority
值设置为 0
来强制该节点永不成为主节点,这意味着该节点永远无法寻求选举成为主节点。更多信息,请参阅优先级 0 副本集节点。
有关优先级的更多信息,请参阅 members[n].priority
。
考虑因素
副本集的大多数已配置节点必须可用,以便重新配置副本集或者选举主节点。更多信息,请参阅副本集选举。
步骤
注意
当您使用rs.stepDown()
或replSetStepDown
退出主节点而未将force
字段设置为true
时,退出的主节点会指定一个符合条件的从节点来立即进行选举。
将成员的优先级设置为“高”以强制其成为主节点
此步骤假设当前的主节点是 m1.example.net
,并且您希望将 m3.example.net
设为主节点。此步骤还假设您有一个配置如下的三节点副本集。有关配置的更多信息,请参阅副本集配置用途。
此过程假定以下配置:
{ "_id" : "rs", "version" : 7, "members" : [ { "_id" : 0, "host" : "m1.example.net:27017" }, { "_id" : 1, "host" : "m2.example.net:27017" }, { "_id" : 2, "host" : "m3.example.net:27017" } ] }
在连接到主节点的
mongosh
会话中,使用以下操作顺序将m3.example.net
设为主节点:cfg = rs.conf() cfg.members[0].priority = 0.5 cfg.members[1].priority = 0.5 cfg.members[2].priority = 1 rs.reconfig(cfg) 最后一条语句使用修改后的配置文档调用
rs.reconfig()
,从而将m3.example.net
配置为members[n].priority
高于其他所有mongod
实例。事件发生的顺序如下:
m3.example.net
和m2.example.net
与m1.example.net
同步(通常在 10 秒内)。m1.example.net
发现它不再具有最高优先级,并且在大多数情况下会降级。如果m3.example.net
的同步远远落后,则m1.example.net
不会降级。在这种情况下,m1.example.net
会等到m3.example.net
距离其 ops/sec 不超过 10 秒,然后降级。这样可以最大限度地减少故障转移后没有主节点的时间。降级会强制进行选举,在选举中,
m3.example.net
根据其priority
设置成为主节点。
(可选)如果
m3.example.net
比m1.example.net
的 ops/sec 晚 10 秒以上,并且您不需要在 10 秒内指定主节点,则可以通过运行以下命令强制m1.example.net
退出:db.adminCommand({replSetStepDown: 86400, force: 1}) 这会阻止
m1.example.net
在 86,400 秒(24 小时)内成为主节点,即使没有其他成员可以成为主节点。当m3.example.net
赶上m1.example.net
时,它将成为主节点。如果您稍后希望在
m1.example.net
等待m3.example.net
追赶期间,让m1.example.net
再次成为主节点,那么请发出以下命令,让其再次寻求选举:rs.freeze() rs.freeze()
对replSetFreeze
数据库命令进行封装。
使用数据库命令强制节点为主节点
考虑一个具有以下节点的副本集:
若要强制某个成员成为主节点,请执行以下步骤:
在
mongosh
中,运行rs.status()
确保副本集按预期运行。在连接到
mongod
实例的mongosh
会话中,如果该示例在mdb2.example.net
上运行,则冻结mdb2.example.net
,以便它在 120 秒内不会尝试成为主节点。rs.freeze(120) 在连接到
mongod
的mongosh
会话中,如果前者在mdb0.example.net
上运行,则降级该实例,使得mongod
在 120 秒内无资格成为主节点:rs.stepDown(120) mdb1.example.net
成为主节点。注意
在这个过渡期间,存在一个没有主节点的短窗口期。
如需更多信息,请考虑封装 replSetFreeze
和 replSetStepDown
命令的 rs.freeze()
和 rs.stepDown()
方法。