2017-12-07 13 views
0

私はJavaでレプリカセットのステータスをチェックする機能を実装しています。これを行うには、レプリカセットの1つのメンバーに接続する必要があります。 mongosから各レプリカセットの情報を抽出し、それらを配列に格納しました。その配列から、すべてのレプリカメンバーのURIを取得できます。問題は、uriが動作するかどうかを検出する方法がわからないことです。私は2つのレプリカメンバを停止するとMongoDBは、Javaドライバと接続する前にレプリカメンバーの接続を確認します

MongoClient shard = new MongoClient(Arrays.asList(
       new ServerAddress(replicaUriTemp[0]), 
       new ServerAddress(replicaUriTemp[1]), 
       new ServerAddress(replicaUriTemp[2]))); 

[0]と[1]、プログラムは、[2]に接続し、replSetGetStatusコマンドを実行できません:現在、私はこれをやっています。 [2]直接私がレプリカメンバに接続しようとすると、

MongoTimeoutException: A server error occurred: Timed out after 30000 ms while waiting for a server that matches ReadPreferenceServerSelector{readPreference=primary}. Client view of cluster state is {type=REPLICA_SET, servers=[{address=dockerbox:21100, type=UNKNOWN, state=CONNECTING, exception={com.mongodb.MongoSocketOpenException: Exception opening socket}, caused by {java.net.ConnectException: Connection refused: connect}}, {address=dockerbox:21200, type=UNKNOWN, state=CONNECTING, exception={com.mongodb.MongoSocketOpenException: Exception opening socket}, caused by {java.net.ConnectException: Connection refused: connect}}, {address=dockerbox:21300, type=REPLICA_SET_SECONDARY, roundTripTime=1.0 ms, state=CONNECTED}] 

しかし、それは正常に動作します:

MongoClient shard = new MongoClient(new ServerAddress(replicaUriTemp[2])); 

がそれぞれに接続することによってこの問題を解決する方法はありますそれは、常にこの例外をスローしますレプリカメンバーを動的に作成するか、メンバーに接続する前にpingを実行しますか?プライマリ/セカンダリのメンバーがどれであるかを事前に知らなくても、盲目的にレプリカセットの状態をテストしたい。

編集:私は2つのレプリカメンバをオフにしているので、左の1が二次になります

Document replStatus = shard.getDatabase("admin").runCommand(replStatCmd); 

と私はrunCommand関数を実行できない理由です:エラーコードの私の次の行に表示されますようは思えますこのメンバーの

答えて

0

私がオプションrunCommandをReadPreference.secondaryPreferred()に設定した後、プログラムは正常に動作します。

関連する問題