OPTIONS
翻译或纠错本页面

强制指定某个节点为主节点

纲要

我们可以通过赋予节点更高的 priority 来将 replica set 中的某个节点强制指定成为 primary

我们也可以通过将某个节点的 priority 设置为 ``0``来让该节点不能在 election 中成为主节点。参见 优先级为0的复制集成员

流程

通过将节点的优先级提高来强制其成为主节点

在 2.0 版更改.

关于优先级的更多信息,请参考 priority

假设我们现在的 primarym1.example.net ,我们想将 m3.example.net 变为主节点。假设我们的 replica set 由如下配置的三个节点组成。有关复制集配置的更多信息,参见 Replica Set Configuration Use

复制集配置如下:

{
    "_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. mongo 窗口中,使用如下的命令来让 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)
    

    这将让 m3.example.netlocal.system.replset.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 的optime 落后其小于10秒时降职。这是在没有主节点发生故障的时候最小的时间需求。

    • 由于``m3.example.net`` 的 priority 设定,会降职选举 m3.example.net 为新的主节点。

  2. 如果 m3.example.net 落后于 m1.example.net 超过10秒,或者我们10秒内都不需要新的主节点,我们可以通过如下操作让 m1.example.net 辞职:

    db.adminCommand({replSetStepDown: 86400, force: 1})
    

    这将防止 m1.example.net 在86400秒(24小时)内成为主节点,即使没有其他节点成为主节点。当 m3.example.net 追上 m1.example.net 的时候,其将成为主节点。

    如果我们希望让 m1.example.netm3.example.net 追赶的时候重新成为主节点,可以使用如下命令:

    rs.freeze()
    

    The rs.freeze() provides a wrapper around the replSetFreeze database command.

通过数据库命令强制某个节点成为主节点

在 1.8 版更改.

假设我们 replica set 中有如下成员:

  • mdb0.example.net - 现在的 primary

  • mdb1.example.net - 一个 secondary

  • mdb2.example.net - 一个 secondary 。

通过如下流程来强制某个节点成为主节点:

  1. mongo 窗口中,执行 rs.status() 来确定我们的复制集状态。

  2. 连接到 mdb2.example.net ,并在 mongo 窗口中 ,将 mdb2.example.net 冻结,使其无法在120秒内成为主节点。

    rs.freeze(120)
    
  3. 连接到 mdb0.example.net ,并在 mongo 窗口中使其降职,并无法在120秒内成为主节点:

    rs.stepDown(120)
    

    mdb1.example.net 成为主节点。

    注解

    在转变过程中,可能会有极短暂的时间会出现没有主节点的情况出现。

有关 rs.freeze()rs.stepDown() 请参考 replSetFreezereplSetStepDown