强制指定某个节点为主节点¶
纲要¶
我们可以通过赋予节点更高的 priority 来将 replica set 中的某个节点强制指定成为 primary 。
我们也可以通过将某个节点的 priority 设置为 ``0``来让该节点不能在 election 中成为主节点。参见 优先级为0的复制集成员 。
流程¶
通过将节点的优先级提高来强制其成为主节点¶
在 2.0 版更改.
关于优先级的更多信息,请参考 priority 。
假设我们现在的 primary 是 m1.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"
}
]
}
在 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.net 的 local.system.replset.members[n].priority 比 其他 mongod 实例都要高。
将会发生下面这些事件:
m3.example.net 和 m2.example.net 从 m1.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 为新的主节点。
如果 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.net 在 m3.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 。
通过如下流程来强制某个节点成为主节点:
在 mongo 窗口中,执行 rs.status() 来确定我们的复制集状态。
连接到 mdb2.example.net ,并在 mongo 窗口中 ,将 mdb2.example.net 冻结,使其无法在120秒内成为主节点。
rs.freeze(120)
连接到 mdb0.example.net ,并在 mongo 窗口中使其降职,并无法在120秒内成为主节点:
rs.stepDown(120)
mdb1.example.net 成为主节点。
注解
在转变过程中,可能会有极短暂的时间会出现没有主节点的情况出现。
有关 rs.freeze() 和 rs.stepDown() 请参考 replSetFreeze 和 replSetStepDown 。