对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。
Docs 菜单

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

您可以通过赋予副本集节点比集中任何其他节点更高的 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. In a mongosh session that is connected to the primary, use the following sequence of operations to make m3.example.net the primary:

    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. In mongosh, run rs.status() to ensure your replica set is running as expected.

  2. 在连接到mongosh 上运行的mongod 实例的mdb2.example.net 会话中,冻结mdb2.example.net ,使其在120 秒内不会尝试成为主节点 (primary node in the replica set)。

    rs.freeze(120)
  3. mongoshmongod在连接到mdb0.example.net 上运行的 的mongod 会话中,如果 在120 秒内没有资格成为主节点 (primary node in the replica set),则让该实例退出:

    rs.stepDown(120)

    mdb1.example.net 成为主节点。

    注意

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

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

给本页内容打分