翻译或纠错本页面

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

Overview

You can force a replica set member to become primary by giving it a higher members[n].priority value than any other member in the set.

Optionally, you also can force a member never to become primary by setting its members[n].priority value to 0, which means the member can never seek election as primary. For more information, see 优先级为0的复制集成员.

For more information on priorities, see members[n].priority.

Consideration

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

Procedures

Force a Member to be Primary by Setting its Priority High

假设我们现在的 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)
    

    The last statement calls rs.reconfig() with the modified configuration document to configure m3.example.net to have a higher members[n].priority value than the other mongod instances.

    将会发生下面这些事件:

    • 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 成为主节点。

    注解

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

For more information, consider the rs.freeze() and rs.stepDown() methods that wrap the replSetFreeze and replSetStepDown commands.