如何将 mongodb 节点设置为作为复制集的主节点返回?

Mar*_*lli 4 replication mongodb mongodb-3.0

这里有这个问题:

如何强制 mongod 成为副本集中的主节点?

但这不是我要找的答案。

下面有一个问题,这可能是相关的,但不一样。

在mongodb失败的情况下如何强制延迟成员成为主要成员

这个问题几乎是重复的,但涉及 2.6.11 版,我的是 3.0 版和 3.2 版。另外,除非我需要,否则我不想使用force : 1

强制成员成为 mongodb 中的主要成员

我一直在努力将答案中描述的大多数内容付诸实践,也许有一个例子或澄清,因此是这个问题。

我的复制工作正常,3 个节点,node1 是主节点。

当我运行以下命令时

//-----------------------------
//check the status of the replication
//-----------------------------
rs.status()
Run Code Online (Sandbox Code Playgroud)

我得到这个结果:

{
    "set" : "Krishna",
    "date" : ISODate("2016-04-26T14:59:40.263Z"),
    "myState" : 1,
    "members" : [
        {
            "_id" : 0,
            "name" : "jpb01275:37001",
            "health" : 1,
            "state" : 1,
            "stateStr" : "PRIMARY",
            "uptime" : 1022,
            "optime" : Timestamp(1461678841, 1),
            "optimeDate" : ISODate("2016-04-26T13:54:01Z"),
            "electionTime" : Timestamp(1461682464, 1),
            "electionDate" : ISODate("2016-04-26T14:54:24Z"),
            "configVersion" : 239068,
            "self" : true
        },
        {
            "_id" : 1,
            "name" : "jpb01275:37002",
            "health" : 1,
            "state" : 2,
            "stateStr" : "SECONDARY",
            "uptime" : 1022,
            "optime" : Timestamp(1461678841, 1),
            "optimeDate" : ISODate("2016-04-26T13:54:01Z"),
            "lastHeartbeat" : ISODate("2016-04-26T14:59:40.206Z"),
            "lastHeartbeatRecv" : ISODate("2016-04-26T14:59:40.179Z"),
            "pingMs" : 0,
            "configVersion" : 239068
        },
        {
            "_id" : 2,
            "name" : "jpb01275:37003",
            "health" : 1,
            "state" : 2,
            "stateStr" : "SECONDARY",
            "uptime" : 1022,
            "optime" : Timestamp(1461678841, 1),
            "optimeDate" : ISODate("2016-04-26T13:54:01Z"),
            "lastHeartbeat" : ISODate("2016-04-26T14:59:40.238Z"),
            "lastHeartbeatRecv" : ISODate("2016-04-26T14:59:39.593Z"),
            "pingMs" : 0,
            "configVersion" : 239068
        }
    ],
    "ok" : 1
}
Run Code Online (Sandbox Code Playgroud)

发生的事情是我不得不停止 node1 (jpb01275:37001) 并且 node2 成为主要的。当我再次启动 node1 时,我希望它再次成为主节点。

我所做的是

登录到 node2 和 node3 然后依次运行以下命令:

rs.stepDown()
Run Code Online (Sandbox Code Playgroud)

并且 node1 作为主节点返回。

我还在 node1 上尝试了以下操作,但它对我不起作用。

//-----------------------------
// reconfigure the replica set
// because I stopped this server and now it is secondary
// I want it back to primary
//-----------------------------

cfg = rs.conf()

printjson(cfg)

cfg.members = [cfg.members[0] , cfg.members[1] , cfg.members[2]]

rs.reconfig(cfg, {force : true})
Run Code Online (Sandbox Code Playgroud)

带回 node1 并将其设置为此复制的主节点的正确、最安全的方法是什么?

Mar*_*erg 5

通常,您不会。从主要或次要的角度考虑您的节点是错误的处理方式。由于标准数据承载节点应该具有相同的维度,因此最好将它们视为副本集成员,其中一个被选为主节点。由于驱动程序具有副本集意识并且知道当前主服务器是哪个,因此您应该在连接字符串中提供多个服务器,例如

mongodb://jpb01275:37001,jpb01275:37002/?replicaSet=Krishna
Run Code Online (Sandbox Code Playgroud)

设置固定副本集主节点没有优势。

如果你真的必须这样做,你需要做一个

rs.stepDown(90,30)
Run Code Online (Sandbox Code Playgroud)

在当前主节点上重复该操作,直到您选择的节点在 90 秒内成为主节点(设置的第一个数值)。有关详细信息,请参阅的文档rs.stepDown()