强制指定某个节点为主节点¶
On this page
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¶
假设我们现在的 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)
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.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 成为主节点。
注解
在转变过程中,可能会有极短暂的时间会出现没有主节点的情况出现。
For more information, consider the rs.freeze() and rs.stepDown() methods that wrap the replSetFreeze and replSetStepDown commands.