web-dev-qa-db-ja.com

mongodbノードをレプリケーションセットのプライマリとして返すように設定するにはどうすればよいですか?

ここにこの質問があります:

mongodをレプリカセットのプライマリにする方法

しかし、それは私が探していた答えではありませんでした。

そして、以下の質問があります。これは関連している可能性がありますが、同じではありません。

mongodbで障害が発生した場合に遅延メンバーを強制的にプライマリにする方法

この質問はほぼ重複していますが、バージョン2.6.11を扱っており、私の質問はバージョン3.0および3.2です。加えて、私はforceを使いたくない:1必要がない限り。

mongodbでメンバーを強制的にプライマリにする

私はそこに答えで説明されているmajorityを実際に実行するのに苦労してきました。

レプリケーションは正常に機能し、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を再び開始したとき、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を元に戻し、このレプリケーションのプライマリとして設定するための正しい、最も安全な方法は何ですか?

3

通常、そうではありません。プライマリまたはセカンダリの観点からノードを考えることは、それに取り組むための間違った方法です。標準のデータベアリングノードは同じディメンションを持つ必要があるため、レプリカセットメンバーと見なし、そのうちの1つをプライマリに選択することをお勧めします。ドライバーはレプリカセットを認識しており、現在のプライマリがどれであるかを知っているため、次のような接続文字列で複数のサーバーを提供することになっています。

_mongodb://jpb01275:37001,jpb01275:37002/?replicaSet=Krishna
_

固定レプリカセットをプライマリに設定してもメリットはありません。

あなたが本当にそれをしなければならないなら、あなたはする必要があります

_rs.stepDown(90,30)
_

現在のプライマリで、選択したノードがプライマリになるまで、90秒以内に最初の数値セットを繰り返します。詳細については、 rs.stepDown() のドキュメントを参照してください。

5