文档菜单
文档首页
/
MongoDB 手册
/ / /

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

本页面内容

  • 概述
  • 注意事项
  • 步骤

您可以通过将其副本集成员的主节点优先级设置为比副本集中任何其他成员更高的值来强制该成员成为主节点。

可选地,您还可以通过将其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.netmembers[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 的 optime 与其相差在 10 秒之内,然后降级。这最大限度地减少了故障转移后没有主节点的时长。

    • 降级会强制进行选举,其中基于其 priority 设置,m3.example.net 成为主节点。

  2. 可选地,如果 m3.example.netm1.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 的封装。

考虑一个以下成员组成的 副本集

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

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

  • mdb2.example.net - 一个副节点。

要强制一个成员成为主节点,请使用以下步骤:

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

  2. 在一个连接到运行在 mdb2.example.net 上的 mongod 实例的 mongosh 会话中,冻结 mdb2.example.net,使其在 120 秒内不尝试成为主节点。

    rs.freeze(120)
  3. 在连接到在 mdb0.example.net 运行的 mongodmongosh 会话中,将此实例降级,使得 mongod 在120秒内无权成为主节点

    rs.stepDown(120)

    mdb1.example.net 成为主节点。

    注意

    在转换过程中,存在一个短暂的时间窗口,此时集合没有主节点。

有关更多信息,请考虑使用包装了 replSetFreezereplSetStepDown 命令的 rs.freeze()rs.stepDown() 方法。

返回

维护成员