利用priority指定:
假如现在有三个成员:
{
"_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"
}
]
}
假如现在m1是primary,而我们想让m3成为primary,执行以下步骤:
cfg=re.conf()
cfg.members[0].priority=1
cfg.members[1].priority=1
cfg.members[2].priority=2
re.reconfig(cfg)
re.config(cfg)会强制MongoDB进行primary选举,一般情况下m3会直接成为primary。
但前提是m3成员的数据不能落后于m1太多。
如果不幸m3落后太多了,那么这时候m1会跟m3同步10秒,然后退位。
但如果你不需要这10秒,或者说这10秒内不需要primary,那么可以强制m1退位:
db.adminCommand({replSetStepDown:1800,force:1})
执行了以上命令后,m1在1800s内都不会成为primary(即便数据集里已经没有primary了),m3上位。
如果你在这1800s内需要m1重新或者说可以通过选举成为primary,可以执行以下命令:
rs.freeze()
PS: rs.freeze()是
replSetFreeze
的封装。
利用命令来进行强制primary
- 设置除当前primary以外的其他非目标成员在特定时间内不能成为primary
- 强制primary退位
- ok
连接至m2实例,执行:
rs.freeze(120)
120s内m2不能成为primary
连接至m1实例,执行:
rs.stepDown(120)
120s内m1不能成为primary
m3上位。
该方法会导致短时间内没有primary,不建议使用,而且120s过后,还是priority高的成员继续成为primary(如果没有执行db.adminCommand({replSetStepDown:1800,force:1})的话)
网友评论