1

私はかなり複雑な問題を抱えており、要約すると次のようになります。今朝、ホスト A、B、および C で構成されるレプリカ セットがあり、A がプライマリでした。その後、私は A を完全に失い、B はしばらくダウンしていた可能性があります (わかりません)。これはec2インスタンスであるため、戻ってきたときは別のホスト名を持っていました(ただし、まったく同じebsボリュームと同じファイル構造を持っていました)。

この時点で、ホスト名 A がなくなり、B、C、および D ができました。D の内容は A と同じですが、外部の世界ではそれらを 2 つの異なるホスト (つまり、ホスト名) と見なします。B と C の mongo にログインすると、それらがセカンダリ (優先度 0) であることが示され、優先度が示されていない古いホスト A が引き続きリストされます。

SECONDARY> rs.conf() //this is from C
{
"_id" : "rs_0",
"version" : 1,
"members" : [
    {
        "_id" : 0,
        "host" : "A:27018"  //this is the dead guy ....
    },
    {
        "_id" : 1,
        "host" : "C:27019",
        "priority" : 0
    },
    {
        "_id" : 2,
        "host" : "B:27020",
        "priority" : 0
    }
]
}

B または C からコマンドを発行すると、自分がマスターではないというメッセージが表示されるため、このレプリカ セットの conf レコード内のホストを変更できません。

最悪のシナリオはmongoexport、すべてを使用してjsonにダンプできることです。これは、(a)お尻が痛い、(b)非常に醜い、(c)本番環境では実際には実用的ではありません。

基本的には、これに要約されます。レプリカ セットがあり、プライマリへの制御/アクセスを失い、その機能を引き継ぐために別のホストを追加したい場合はどうすればよいですか?

ありがとう!

4

1 に答える 1

2

プライマリを使用せずに再構成する必要がある場合は、コマンドをセカンダリに送信できますが、追加のオプション {force:true} を含める必要があります。これは、プライマリと通信していないことはわかっているが、とにかく再構成を強制したいことを示しています。

ただし、先に進む前に、すべてのセカンダリで優先度 0 を設定すると、プライマリに障害が発生した場合の自動フェイルオーバー用にレプリカを設定するという点が無効になることを指摘しておきます。プライオリティ 0 は、ノードがプライマリになることができないことを意味します。0 以外のノードのみが失敗したため、レプリカ セットにはプライマリがありませんでした。

優先度スコアが 0 より大きいセカンダリを少なくとも 1 つ用意することをお勧めします (1 がデフォルトです)。また、AWS 名ではなく、ホストに外部/解決可能な DNS 名を使用することをお勧めします。これにより、この状況が再び発生した場合に、現在停止しているホストを指すために使用されていた名前を、代わりの新しいホストに再割り当てできます。その場合、レプリカ セットを再構成する必要はまったくありません。

さらに読むには、http: //docs.mongodb.org/manual/tutorial/reconfigure-replica-set-with-unavailable-members/をお勧めします。

于 2012-10-23T04:34:55.167 に答える