2017-12-07 15 views
0

복제 세트의 상태를 확인하기 위해 Java에서 기능을 구현 중입니다. 이렇게하려면 복제본 집합의 한 구성원에 연결해야합니다. mongos에서 각 복제본 세트의 정보를 추출하여 배열에 저장했습니다. 배열에서 모든 복제 멤버의 URI를 얻을 수 있습니다. 문제는 내가 uri가 작동하는지 여부를 감지하는 방법을 모른다는 것입니다. 현재, 나는이 일을하고있다 :MongoDB 자바 드라이버로 연결하기 전에 복제 멤버의 연결을 확인하십시오.

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])); 

각에 연결하여이 문제를 해결할 수있는 방법이 있나요 항상이 예외를 throw 복제 회원을 동적으로 연결하거나 회원에게 연결을 시도하기 전에 ping을 수행합니까? 어떤 복제본이 주/보조 구성원인지 미리 알지 못하고 복제본 세트의 상태를 맹목적으로 테스트하고 싶습니다.

편집 : 오류 코드의 내 다음 줄에 나타납니다처럼 보인다 : 나는 두 개의 복제 구성원을 끌 때문에

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

은, 왼쪽 사람이 보조 될 것입니다 내가 runCommand를 수행 할 수없는 이유입니다 이 회원.

답변

0

이제 RunCommand 옵션을 ReadPreference.secondaryPreferred()로 설정하면 프로그램이 올바르게 작동합니다.