7

レプリカ セットのノードを停止して再起動すると、プライマリ ノードのステータスが「回復中」になります。

レプリカ セットを作成し、承認なしで実行しています。承認を使用するために、ユーザー「db.createUser(...)」を追加し、構成ファイルで承認を有効にしました。

security:
   authorization: "enabled"

レプリカ セットを停止する前 (セキュリティ パラメータを追加せずにクラスターを再起動しても)、rs.status() は次のように表示されます。

{
        "set" : "REPLICASET",
        "date" : ISODate("2016-09-08T09:57:50.335Z"),
        "myState" : 1,
        "term" : NumberLong(7),
        "heartbeatIntervalMillis" : NumberLong(2000),
        "members" : [
                {
                        "_id" : 0,
                        "name" : "192.168.1.167:27017",
                        "health" : 1,
                        "state" : 1,
                        "stateStr" : "PRIMARY",
                        "uptime" : 301,
                        "optime" : {
                                "ts" : Timestamp(1473328390, 2),
                                "t" : NumberLong(7)
                        },
                        "optimeDate" : ISODate("2016-09-08T09:53:10Z"),
                        "electionTime" : Timestamp(1473328390, 1),
                        "electionDate" : ISODate("2016-09-08T09:53:10Z"),
                        "configVersion" : 1,
                        "self" : true
                },
                {
                        "_id" : 1,
                        "name" : "192.168.1.168:27017",
                        "health" : 1,
                        "state" : 2,
                        "stateStr" : "SECONDARY",
                        "uptime" : 295,
                        "optime" : {
                                "ts" : Timestamp(1473328390, 2),
                                "t" : NumberLong(7)
                        },
                        "optimeDate" : ISODate("2016-09-08T09:53:10Z"),
                        "lastHeartbeat" : ISODate("2016-09-08T09:57:48.679Z"),
                        "lastHeartbeatRecv" : ISODate("2016-09-08T09:57:49.676Z"),
                        "pingMs" : NumberLong(0),
                        "syncingTo" : "192.168.1.167:27017",
                        "configVersion" : 1
                },
                {
                        "_id" : 2,
                        "name" : "192.168.1.169:27017",
                        "health" : 1,
                        "state" : 2,
                        "stateStr" : "SECONDARY",
                        "uptime" : 295,
                        "optime" : {
                                "ts" : Timestamp(1473328390, 2),
                                "t" : NumberLong(7)
                        },
                        "optimeDate" : ISODate("2016-09-08T09:53:10Z"),
                        "lastHeartbeat" : ISODate("2016-09-08T09:57:48.680Z"),
                        "lastHeartbeatRecv" : ISODate("2016-09-08T09:57:49.054Z"),
                        "pingMs" : NumberLong(0),
                        "syncingTo" : "192.168.1.168:27017",
                        "configVersion" : 1
                }
        ],
        "ok" : 1
}

この構成の使用を開始するために、次のように各ノードを停止しました。

[root@n--- etc]# mongo --port 27017 --eval 'db.adminCommand("shutdown")'
MongoDB shell version: 3.2.9
connecting to: 127.0.0.1:27017/test
2016-09-02T14:26:15.784+0200 W NETWORK  [thread1] Failed to connect to 127.0.0.1:27017, reason: errno:111 Connection refused
2016-09-02T14:26:15.785+0200 E QUERY    [thread1] Error: couldn't connect to server 127.0.0.1:27017, connection attempt failed :
connect@src/mongo/shell/mongo.js:231:14

このシャットダウン後、 の出力を確認してプロセスが存在しないことを確認しましたps -ax | grep mongo

しかし、ノードを再起動して資格情報でログインすると、rs.status() は次のことを示します。

{
        "set" : "REPLICASET",
        "date" : ISODate("2016-09-08T13:19:12.963Z"),
        "myState" : 3,
        "term" : NumberLong(7),
        "heartbeatIntervalMillis" : NumberLong(2000),
        "members" : [
                {
                        "_id" : 0,
                        "name" : "192.168.1.167:27017",
                        "health" : 1,
                        "state" : 3,
                        "stateStr" : "RECOVERING",
                        "uptime" : 42,
                        "optime" : {
                                "ts" : Timestamp(1473340490, 6),
                                "t" : NumberLong(7)
                        },
                        "optimeDate" : ISODate("2016-09-08T13:14:50Z"),
                        "infoMessage" : "could not find member to sync from",
                        "configVersion" : 1,
                        "self" : true
                },
                {
                        "_id" : 1,
                        "name" : "192.168.1.168:27017",
                        "health" : 0,
                        "state" : 6,
                        "stateStr" : "(not reachable/healthy)",
                        "uptime" : 0,
                        "optime" : {
                                "ts" : Timestamp(0, 0),
                                "t" : NumberLong(-1)
                        },
                        "optimeDate" : ISODate("1970-01-01T00:00:00Z"),
                        "lastHeartbeat" : ISODate("2016-09-08T13:19:10.553Z"),
                        "lastHeartbeatRecv" : ISODate("1970-01-01T00:00:00Z"),
                        "pingMs" : NumberLong(0),
                        "authenticated" : false,
                        "configVersion" : -1
                },
                {
                        "_id" : 2,
                        "name" : "192.168.1.169:27017",
                        "health" : 0,
                        "state" : 6,
                        "stateStr" : "(not reachable/healthy)",
                        "uptime" : 0,
                        "optime" : {
                                "ts" : Timestamp(0, 0),
                                "t" : NumberLong(-1)
                        },
                        "optimeDate" : ISODate("1970-01-01T00:00:00Z"),
                        "lastHeartbeat" : ISODate("2016-09-08T13:19:10.552Z"),
                        "lastHeartbeatRecv" : ISODate("1970-01-01T00:00:00Z"),
                        "pingMs" : NumberLong(0),
                        "authenticated" : false,
                        "configVersion" : -1
                }
        ],
        "ok" : 1
}

なんで?おそらく、シャットダウンは mongod を停止する良い方法ではありません。ただし、「kill pid」も使用してテストしましたが、再起動しても同じ状態になります。

この状態では、クラスターを修復する方法がわかりません。再び開始しました (dbpath ファイルの削除とレプリカ セットの再構成)。「--repair」を試しましたが、うまくいきませんでした。

私のシステムに関する情報:

  • モンゴのバージョン: 3.2
  • ルートとしてプロセスを開始しますが、おそらく「mongod」ユーザーとして開始する必要がありますか?
  • これは私の開始コマンドです:mongod --conf /etc/mongod.conf
  • keyFile 構成が機能しません。「--keyFile /path/to/file」を追加すると、「
    プロセスをフォークしようとしています。サーバーの接続準備が整うまで待機しています。」このファイルにはすべての権限がありますが、keyFile を使用できません。
  • 1 台のマシンの mongod.conf からの「net.bindIp」構成の例:

    net:
      port: 27017
      bindIp: 127.0.0.1,192.168.1.167
    
4

3 に答える 3

1

注: このソリューションは Windows 固有のものですが、*nix ベースのシステムに簡単に移植できます。

順番に手順を実行する必要があります。まず、mongod インスタンスを起動します。

start "29001" mongod --dbpath "C:\data\db\r1" --port 29001
start "29002" mongod --dbpath "C:\data\db\r2" --port 29002
start "29003" mongod --dbpath "C:\data\db\r3" --port 29003 

mongo で各ノードに接続し、管理者ユーザーを作成します。私はスーパーユーザーを作成することを好みます。

> use admin
> db.createUser({user: "root", pwd: "123456", roles:["root"]})

必要に応じて、他のユーザーを作成することができます。

キーファイルを作成します。有効なキー ファイルの内容については、ドキュメントを参照してください。

注: *nix ベースのシステムでは、キー ファイルの chmod を 400 に設定します。

私の場合、キーファイルを次のように作成しました

echo mysecret==key > C:\data\key\key.txt

フラグを有効にし--keyFileてMongoDB サーバーを再起動します。--replSet

start "29001" mongod --dbpath "C:\data\db\r1" --port 29001 --replSet "rs1" --keyFile C:\data\key\key.txt
start "29002" mongod --dbpath "C:\data\db\r2" --port 29002 --replSet "rs1" --keyFile C:\data\key\key.txt
start "29003" mongod --dbpath "C:\data\db\r3" --port 29003 --replSet "rs1" --keyFile C:\data\key\key.txt

すべてのmongodインスタンスが起動して実行されたら、いずれかを認証に接続します。

mongo --port 29001 -u "root" -p "123456" --authenticationDatabase "admin"

レプリカセットを開始し、

> use admin
> rs.initiate()
> rs1:PRIMARY> rs.add("localhost:29002")
{ "ok" : 1 }
> rs1:PRIMARY> rs.add("localhost:29003")
{ "ok" : 1 }

localhost注:マシン名または IP アドレスに置き換える必要がある場合があります。

于 2016-09-04T15:26:01.173 に答える
0

ノードは一度に 1 つずつシャットダウンする必要があるため、他のセカンダリ メンバーがプライマリに選択されます。また、他のメンバーに同期している間はリカバリ ノードになります。この 1 つずつのシャットダウンでは、ノードを再追加する必要はありません。

于 2016-09-06T07:59:59.217 に答える