1

私はEventmachine で Ruby MongoDB クライアントに取り組んでおり、mongo インスタンスの障害、レプリカ セットの投票 (プライマリ障害) などをテストする方法を知りたいと思っていました。

例では。クライアントはレプリカ セットへの接続を確立する必要があります。次にプライマリが失敗し、クライアントは次のプライマリを見つけて、そこにすべてのクエリをリダイレクトする必要があります。

インスタンスを一時停止/再開するmongodbコマンドがあるかもしれません。または、プロセスと sigstop/sigcont をフォークする必要があります (ただし、これは OS に依存するソリューションになります)。

UPD

どのようmongodb-ruby-driverに機能するかを見て、同じ https://github.com/mongodb/mongo-ruby-driver/blob/master/test/tools/mongo_config.rbを実行します

4

2 に答える 2

1

私が Mongo レプリカ セットをテストして行ったことに基づいて、いくつかのアドバイスを与えることができますが、それはクラウドでノードをホストすることにかなり固有のものであると思います。それでも、そこから何かを奪うことができるかもしれません。

レプリカがセットアップされていると仮定します。

  1. すべてのノードの優先度が同じであることを確認してください。レプリカ セットに対して読み込みが遅いクライアントを作成します (3 台のマシンすべてがクライアント構成に含まれていることを確認してください)。読み込みが遅いとは、大きなクエリを作成してから、カーソルをゆっくりと反復することを意味します。プライマリをオフラインにして、何が起こるか見てみましょう。他のノードのログ ファイルを追跡して、それらが新しいプライマリに投票するのを監視できます。

  2. 各ノードにホスト名を使用している場合は、実行速度の遅いクエリを実行してから、ホスト名が新しい IP アドレスを取得するようにノードを停止/開始します。Mongo クライアントが DNS キャッシュを更新せ、古い IP アドレスのままになっていることがわかりました。(これは Java クライアント用です - Jira バグを提出しました)。

  3. レプリカ セット内のすべてのノードを再起動すると、プライマリが移動することに注意してください。ノード 1 の場合もあれば、ノード 2 の場合もあります。これは、すべてのノードの優先度が同じであることを前提としています。あなたのクライアントはこれをうまく処理していますか?以前は、書き込み用に 1 つのノードをハードコーディングしたところ、突然すべての書き込みが失敗したため、問題が発生していました。

  4. 継続的な書き込みをシミュレートするツールを作成してから、ノードをオフラインにし、プライマリを強制終了し、新しい IP でマシンを再起動します。書き込みを削除する予定はありますか?

  5. mongod を停止する以外に、インスタンスを一時停止/再開するコマンドはありません。個人的にテストするためにマシンの電源を切るのが好きです。

于 2013-03-29T23:25:51.553 に答える
0

最後に、必要なポートにバインドする偽の Mongodb サーバーを実装し、クエリに対する偽の応答で応答します。また、「isMaster」クエリにも応答します。したがって、いつでもプライマリ/セカンダリを停止したり、次のプライマリにする投票を開始したりできます。これは、約 100 行のコードであり、どの OS でも完全に動作するため、最良の選択に見えます。:)

https://github.com/fl00r/monga/blob/master/spec/helpers/mongodb.rb

于 2013-04-22T21:57:54.493 に答える