Replication

如何設置 mongodb 節點作為複制集的主節點返回?

  • June 8, 2018

這裡有這個問題:

如何強制 mongod 成為副本集中的主節點?

但這不是我想要的答案。

還有下面的問題,可能是相關的,但不一樣。

如何在mongodb失敗的情況下強制延遲成員成為主要成員

這個問題幾乎是重複的,但處理的是 2.6.11 版,而我的是 3.0 版和 3.2 版。另外,除非需要,否則我不想使用force : 1 。

強製成員成為 mongodb 中的主要成員

我一直在努力將答案中描述的大多數內容付諸實踐,也許有一個例子或澄清,因此這個問題。

我的複制工作正常,3 個節點,node1 是主節點。

當我執行以下命令時

//-----------------------------
//check the status of the replication
//-----------------------------
rs.status()

我得到這個結果:

{
   "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
}

發生的事情是我不得不停止 node1 (jpb01275:37001) 並且 node2 成為主節點。當我再次啟動 node1 時,我希望它再次成為主節點。

我所做的是

登錄到node2和node3然後依次執行以下命令:

rs.stepDown()

並且 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})

什麼是帶回 node1 並將其設置為主複製的正確、最安全的方法?

通常,您不會。從主要或次要方面考慮您的節點是錯誤的處理方式。由於標準數據承載節點應該具有相同的維度,因此最好將它們視為副本集成員,其中一個被選為主節點。由於驅動程序可以辨識副本集並且知道目前的主伺服器是哪個,並且您應該在連接字元串中提供多個伺服器,例如

mongodb://jpb01275:37001,jpb01275:37002/?replicaSet=Krishna

設置固定的副本集主副本沒有優勢。

如果你真的必須這樣做,你需要做一個

rs.stepDown(90,30)

在目前主節點上並重複此操作,直到您選擇的節點在 90 秒內成為主節點(第一個數值集)。有關詳細資訊,請參閱的文件**rs.stepDown()**

引用自:https://dba.stackexchange.com/questions/136621