强制会员成为主要会员

在本页面

Overview

您可以通过为replica set成员提供比集合中其他任何成员更高的members[n].priority值来使其成为primary

(可选)您还可以通过将成员的members[n].priority值设置为0来强制成员永不成为主要成员,这意味着该成员永远不会将election当作主要成员。有关更多信息,请参见优先级 0 副本集成员

有关优先级的更多信息,请参见members[n].priority

Consideration

副本集的大多数已配置成员必须可用于集合重新配置集合或选择主副本。有关更多信息,请参见副本集选举

Procedures

Note

在版本 3.6.7 中进行了更改:如果参数enableElectionHandoff为 true(默认值),则当主节点从rs.stepDown()降级(或没有force: truereplSetStepDown命令)时,降级的主节点将提名合格的辅助节点立即选举。否则,次要人员最多可以 awaitsettings.electionTimeoutMillis才能进行选举。降级的主服务器不 await 切换的效果。有关更多信息,请参见enableElectionHandoff

通过将其优先级设置为高来强制其成为主要成员

此过程假定您当前的primarym1.example.net,并且您希望将m3.example.net设置为主。该过程还假定您具有三名成员replica set,其配置如下。有关配置的更多信息,请参见副本集配置使用

此过程假定此配置:

{
    "_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"
        }
    ]
}
  • 在连接到主数据库的mongo shell 中,使用以下操作序列将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配置为具有比其他mongod实例更高的members[n].priority值。

发生以下事件序列:

  • 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.netm1.example.net的操作时间晚 10 秒钟以上,并且如果不需要在 10 秒钟内指定主数据库,则可以通过运行m1.example.net使其下台:

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

即使没有其他成员可以成为主要成员,这也会阻止m1.example.net成为主要成员 86,400 秒(24 小时)。当m3.example.net跟上m1.example.net时,它将成为主要对象。

如果您稍后要在 awaitm3.example.net赶上时再次使其成为m1.example.net主节点,请发出以下命令以使m1.example.net再次寻求选举:

rs.freeze()

rs.freeze()replSetFreeze数据库命令提供了包装。

使用数据库命令强制成员成为主要成员

考虑具有以下成员的replica set

  • mdb0.example.net-当前的primary

  • mdb1.example.net-a secondary

  • mdb2.example.net-中学。

要强制成员成为主要成员,请使用以下过程:

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

  • 在连接到在mdb2.example.net上运行的mongod实例的mongoShell 程序中,冻结mdb2.example.net,以使其在 120 秒内不尝试成为主要实例。

rs.freeze(120)
  • 在连接mdb0.example.net并在mdb0.example.net上运行的mongodmongo shell 中,退出此实例,表明mongod在 120 秒内没有资格成为主要对象:
rs.stepDown(120)

mdb1.example.net成为主要用户。

Note

在过渡期间,会有一个短窗口,其中该集合没有主要窗口。

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