MongoDB レプリカ セットには、STARTUP 状態を通過できないセカンダリが含まれています。データベースは大きいですが、すでに STARTUP2 に移行しているはずです。プライマリからセカンダリに接続でき、その逆も可能なので、正しいポートが開いています。
答え1
次の手順で同様のトラブルは解決しました。
PRIMARY メンバーの場合:
rs.status() { "set" : "ShardD", "date" : ISODate("2015-08-28T17:01:40.647Z"), "myState" : 1, "members" : [ { "_id" : 0, "name" : "host.example.com:27017", "health" : 1, "state" : 1, "stateStr" : "PRIMARY", "uptime" : 1167, "optime" : Timestamp(1440780623, 1), "optimeDate" : ISODate("2015-08-28T16:50:23Z"), "electionTime" : Timestamp(1440780252, 2), "electionDate" : ISODate("2015-08-28T16:44:12Z"), "configVersion" : 3, "self" : true }, { "_id" : 1, "name" : "192.0.2.222:27017", "health" : 1, "state" : 0, "stateStr" : "STARTUP", "uptime" : 584, "optime" : Timestamp(0, 0), "optimeDate" : ISODate("1970-01-01T00:00:00Z"), "lastHeartbeat" : ISODate("2015-08-28T17:01:40.601Z"), "lastHeartbeatRecv" : ISODate("1970-01-01T00:00:00Z"), "pingMs" : 0, "configVersion" : -2 }, { "_id" : 2, "name" : "192.0.2.223:27017", "health" : 1, "state" : 0, "stateStr" : "STARTUP", "uptime" : 676, "lastHeartbeat" : ISODate("2015-08-28T17:01:40.643Z"), "lastHeartbeatRecv" : ISODate("1970-01-01T00:00:00Z"), "pingMs" : 0, "configVersion" : -2 } ], "ok" : 1
}
プライマリメンバーの名前を確認します(通常は「_id」:0に等しい)
名前がドメイン名形式である場合は、名前を IP アドレスに書き換えてみてください。レプリカ セット内のホスト名を変更する:
cfg = rs.conf() cfg.members[0].host = "192.0.2.221" rs.reconfig(cfg)
その後、レプリカ セットは正常な状態に戻りました。
PS host.example.com はすべてのホスト上の IP アドレスに解決されました。
答え2
プライマリがホスト名をセカンダリの IP に解決し、セカンダリがプライマリのホスト名を IP に解決する必要があります。
私の場合、プライマリのホスト名を解決するためにセカンダリの hosts ファイルを追加するのを忘れていました。セカンダリの hosts ファイルを更新すると、セカンダリの状態が STARTUP2 に変わり、その後 SECONDARY に変わりました。
答え3
この問題は、mongo ホスト間の接続に問題がある場合に発生します。
たとえば、プライマリはセカンダリに接続できるが、セカンダリはプライマリに接続できない場合などです。
この場合、プライマリはセカンダリに接続できるためレプリカ セット構成を受け入れますが、セカンダリからプライマリへの接続がないため、セカンダリはプライマリに同期できません。