5

テスト目的で、slaveDelay=n でスレーブをセットアップすることにより、mongodb クラスターでのレプリケーション ラグをシミュレートしようとしています。結局のところ、これにより魔法のようにスレーブが非表示になるため、私のテストではスレーブにアクセスできません。

mongodbのドキュメントには、「通常、slaveOkay 読み取りに遅延メンバーを使用することは望ましくありません。したがって、slaveDelay を設定すると、hidden:true も設定したかのように、アプリケーションからメンバーが非表示になります。」と記載されています。

私の「非典型的な」ユースケースを構成する方法はありますか? または、タイムラグが異なるさまざまなスレーブからの読み取りをシミュレートするより良い方法はありますか?

TaggedReadPreference を使用してテスト コードを強制的に遅延スレーブに接続しようとしましたが、これは

com.mongodb.MongoException: Could not find any valid secondaries with the supplied tags ('{ "delayed" : "true"}'

どうやら、Java ドライバーはセカンダリを認識できません。「slaveDelay」設定を削除すると、正常に接続されます。

これが私のクラスター構成です。

rs.reconfig({
"_id" : "rs0",
"version" : 4,
"members" : [
    {   "_id" : 0,
        "host" : "localhost:27017",
        "priority" : 0,
        slaveDelay: 10,
        tags: { delayed: "true" }
    },
    {   "_id" : 1,
        "host" : "localhost:27018"
    },
    {   "_id" : 2,
        "host" : "localhost:27019",
        "arbiterOnly" : true
    }
]
})
4

2 に答える 2

1

私の知る限り、これは不可能です。唯一のルートは、たとえばプロキシを介して、プライマリと遅延セカンダリ間の実際のネットワーク遅延をシミュレート/強制することです。利用可能なそのようなツールはたくさんあり、それらはあなたにもっと正確なテストを与えるでしょう。

于 2012-05-14T09:31:52.773 に答える
1

一時的にセカンダリを fsync およびロックして、強制的に遅れさせることができます。

http://www.mongodb.org/display/DOCS/fsync+Command#fsyncCommand-v2.0注意事項

ロックを解除するとすぐに追いつきますが、まともな oplog と大きな挿入レートを使用すると、遅延効果を繰り返しシミュレートできます。テストなどを開始する前に、遅れるのを待つことを意味します。

プライマリ、1 つのセカンダリ、アービターがあり、選択した言語で W=2 に相当するもの (REPLICAS_SAFE など) を使用し、セカンダリがロックされている場合、wtimeout を設定しない限り無期限にブロックされます (設定する必要があり、 W=2 を使用している場合は例外をキャッチします)。

于 2012-05-15T18:07:10.057 に答える