0

アプリケーションをより分散されたアーキテクチャに移行する際に問題が発生しています。具体的には、最近、すべてのメンバーが仮想クラウド内のローカル サブネットを使用して通信する MongoDB replicaSet にアプリケーションを移行し始めました。プライマリからセカンダリに書き込まれたデータを伝播する限り、replicaSet は正常に機能します。主に読み取り操作を実行する 2 つの Java アプリケーション サーバーがありますが、場合によっては書き込み操作も実行する必要があります。Java アプリケーション サーバーをホストする各サーバーには、ローカルで実行される独自のセカンダリ mongodb インスタンスも含まれます。

具体的には、私が抱えている問題は、Jongo でラップされた MongoDB ドライバーを使用する Java に関するものです。レイテンシが最小になるため、ローカル マシンで実行されている mongodb インスタンスから通常読み取る必要があるものMongoClientOptions.Builder()を設定するために使用しています。readPreference(ReadPreference.nearest());とにかく、読み取り操作はこれら 2 つの Java サーバー間で問題なく機能し、rs.status()コマンドは正常な構成を返します。

書き込み操作を実行しようとすると失敗し、次のエラーが表示 {"timestamp":1427131553387,"status":500,"error":"Internal Server Error","exception":"com.mongodb.CommandFailureException","message":"{ \"serverUsed\" : \"localhost:27017\" , \"note\" : \"from execCommand\" , \"ok\" : 0.0 , \"errmsg\" : \"not master\"}", ...} されます。ローカル mongodb インスタンス (replicaSet のセカンダリ メンバー) で書き込み操作を実行しようとしていることを示唆しています。MongoDB replicaSet の任意のメンバーに接続すると、書き込み操作がマスター/プライマリとしてマークされたメンバーに自動的に送信されることを理解していましたか?

詳細:

MongoDB はバージョン 2.6.7 です

設定は単純な YAML ファイルから取得されます

アプリケーション.yml

mapserver.mongo:
  database: "maps"
  port: 27017
  host: "localhost"

次に、次の呼び出しでインスタンス化されたアプリケーションで:
return new MongoClient(new ServerAddress(this.getHost(), this.getPort()), this.getOptions());


おそらく、Java MongoDB ドライバー (および/または Jongo) が replicaSet 内のメンバーとその役割を決定し、書き込み操作をセット内の現在のマスターに送るために必要な設定が欠けているのでしょうか? 明確にするために、これらのJava/Seconday-MongoDBサーバーのいずれとも別のサーバーインスタンスであり、プライマリMongoDBインスタンスとは別のNodeJSサーバー部分がありますが、問題なくプライマリ/マスターに正しく書き込むことができるため、そうすべきではありませんファイアウォールの問題。アイデアや助けをいただければ幸いです。

4

0 に答える 0