强制自管理副本集成员成为主节点
概述
您可以通过将其副本集成员的主节点优先级设置为比副本集中任何其他成员更高的值来强制该成员成为主节点。
可选地,您还可以通过将其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
的 optime 与其相差在 10 秒之内,然后降级。这最大限度地减少了故障转移后没有主节点的时长。降级会强制进行选举,其中基于其
priority
设置,m3.example.net
成为主节点。
可选地,如果
m3.example.net
比m1.example.net
的 optime 滞后超过 10 秒,并且您不需要在 10 秒内指定主节点,可以通过运行以下命令强制m1.example.net
降级:db.adminCommand({replSetStepDown: 86400, force: 1}) 这会阻止
m1.example.net
在 86,400 秒(24 小时)内成为主节点,即使没有其他成员可以成为主节点。当m3.example.net
追赶上m1.example.net
时,它将变成主节点。如果您稍后想在
m3.example.net
追赶上时再次将m1.example.net
设置为主节点,请使用以下命令使m1.example.net
再次寻求选举:rs.freeze() rs.freeze()
是对数据库命令replSetFreeze
的封装。
使用数据库命令强制成员成为主节点
考虑一个以下成员组成的 副本集:
要强制一个成员成为主节点,请使用以下步骤:
在
mongosh
中,运行rs.status()
以确保您的副本集按预期运行。在一个连接到运行在
mdb2.example.net
上的mongod
实例的mongosh
会话中,冻结mdb2.example.net
,使其在 120 秒内不尝试成为主节点。rs.freeze(120) 在连接到在
mdb0.example.net
运行的mongod
的mongosh
会话中,将此实例降级,使得mongod
在120秒内无权成为主节点rs.stepDown(120) mdb1.example.net
成为主节点。注意
在转换过程中,存在一个短暂的时间窗口,此时集合没有主节点。
有关更多信息,请考虑使用包装了 replSetFreeze
和 replSetStepDown
命令的 rs.freeze()
和 rs.stepDown()
方法。