强制会员成为主要会员
在本页面
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: true
的replSetStepDown命令)时,降级的主节点将提名合格的辅助节点立即选举。否则,次要人员最多可以 awaitsettings.electionTimeoutMillis才能进行选举。降级的主服务器不 await 切换的效果。有关更多信息,请参见enableElectionHandoff。
通过将其优先级设置为高来强制其成为主要成员
此过程假定您当前的primary为m1.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.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
比m1.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:
要强制成员成为主要成员,请使用以下过程:
-
在mongo shell 中,运行rs.status()以确保您的副本集按预期运行。
-
在连接到在
mdb2.example.net
上运行的mongod实例的mongoShell 程序中,冻结mdb2.example.net
,以使其在 120 秒内不尝试成为主要实例。
rs.freeze(120)
rs.stepDown(120)
mdb1.example.net
成为主要用户。
Note
在过渡期间,会有一个短窗口,其中该集合没有主要窗口。
有关更多信息,请考虑包装replSetFreeze和replSetStepDown命令的rs.freeze()和rs.stepDown()方法。