0

ServerAddresses のリスト (この関数を使用) を使用して Java で MongoDB へのレプリカ セットへの接続を作成するとReadPreference.SECONDARY、クライアントはレプリカ セット全体で読み取りのバランスを取り、ラウンドトリップ時間が短いノードを優先することを知っています (同じコロなど)。

しかし、MongoS サーバーの束に MongoDB クライアントを作成するとReadPreference.SECONDARY、すべての読み取り/書き込みは、アクセスがクロスコロであり、MongoS が同じコロに存在する場合でも、リストの最初のサーバーに移動します。

たとえば、3 つの MongoS サーバー (SF1、SF2、および NYC1 (この順序)) がある場合、クライアントは、SF にあるか NYC にあるかに関係なく、SF1 とのみ通信します。

MongoS サーバーと通信するときに、クライアントを設定するために何か構成する必要があるか、別の方法がありますか? 私は何が欠けていますか?

4

1 に答える 1

2

これは、ドライバーの意図しない動作です。ドライバー コードは、mongos サーバーのリストを渡していることを検出せず、それらをレプリカ セットとして扱っています。ReadPreference.SECONDARY は、セカンダリが検出されない場合、クエリをプライマリに送信します。それがここで起こっていることです。検出された最初の「プライマリ」は、リスト内の最初の mongos サーバーです。mongos サーバーはいずれもセカンダリとして識別されないため、無視されます。

そのため、現在のところ、複数の mongos サーバー間で負荷を分散する唯一の方法は、それぞれに Mongo のインスタンスを作成し、アプリケーション コードでそれぞれへのクエリの分散を処理することです。

また、Java ドライバーの次のリリースには、https: //jira.mongodb.org/browse/JAVA-381 の修正が含まれ、 mongos フェールオーバーのサポートが追加されることに注意してください (ただし、まだ負荷分散は行われていません)。

于 2012-07-20T16:04:35.440 に答える