【发布时间】:2017-12-07 15:03:03
【问题描述】:
我正在用 Java 实现一个功能来检查副本集的状态。为此,我必须连接到副本集的一个成员。我从 mongos 中提取了每个副本集的信息并将它们存储在一个数组中,从该数组中我可以获得所有副本成员的 uri。问题是我不知道如何在连接之前检测该 uri 是否有效。目前,我正在这样做:
MongoClient shard = new MongoClient(Arrays.asList(
new ServerAddress(replicaUriTemp[0]),
new ServerAddress(replicaUriTemp[1]),
new ServerAddress(replicaUriTemp[2])));
当我停止两个副本成员 [0] 和 [1] 时,程序无法连接到 [2] 并执行 replSetGetStatus 命令。它总是抛出这个异常:
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}]
但是,当我尝试直接连接到副本成员 [2] 时,它工作正常:
MongoClient shard = new MongoClient(new ServerAddress(replicaUriTemp[2]));
有没有办法通过动态连接到每个副本成员来解决这个问题,或者在尝试连接之前 ping 成员?我想盲目地测试副本集的状态,而不事先知道哪个是主要/次要成员。
编辑:似乎错误出现在我的下一行代码中:
Document replStatus = shard.getDatabase("admin").runCommand(replStatCmd);
由于我关闭了两个副本成员,左边的一个将成为辅助成员,这就是为什么我不能对这个成员执行 runCommand。
【问题讨论】:
标签: java mongodb mongodb-java