我爱编程

MongDB强制指定某个成员成为Primary

2018-02-25  本文已影响0人  ChanZeeBm

利用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

连接至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})的话)

上一篇下一篇

猜你喜欢

热点阅读