Docs 菜单
Docs 主页
/
MongoDB Manual
/ / /

强制自管理副本集节点成为主节点

在此页面上

  • 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"
}
]
}
  1. 在连接到主节点的 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.netm2.example.netm1.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 设置成为主节点。

  2. (可选)如果 m3.example.netm1.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 数据库命令进行封装。

考虑一个具有以下节点的副本集

  • mdb0.example.net -当前主节点

  • mdb1.example.net - 一个从节点

  • mdb2.example.net - 从节点。

若要强制某个成员成为主节点,请执行以下步骤:

  1. mongosh 中,运行 rs.status() 确保副本集按预期运行。

  2. 在连接到 mongod 实例的 mongosh 会话中,如果该示例在 mdb2.example.net 上运行,则冻结 mdb2.example.net,以便它在 120 秒内不会尝试成为主节点。

    rs.freeze(120)
  3. 在连接到 mongodmongosh 会话中,如果前者在 mdb0.example.net 上运行,则降级该实例,使得 mongod 在 120 秒内无资格成为主节点:

    rs.stepDown(120)

    mdb1.example.net 成为主节点。

    注意

    在这个过渡期间,存在一个没有主节点的短窗口期。

如需更多信息,请考虑封装 replSetFreezereplSetStepDown 命令的 rs.freeze()rs.stepDown() 方法。

后退

维护成员