アプリケーションをより分散されたアーキテクチャに移行する際に問題が発生しています。具体的には、最近、すべてのメンバーが仮想クラウド内のローカル サブネットを使用して通信する 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サーバー部分がありますが、問題なくプライマリ/マスターに正しく書き込むことができるため、そうすべきではありませんファイアウォールの問題。アイデアや助けをいただければ幸いです。