繁体   English   中英

MongoDB在与Java驱动程序连接之前检查副本成员的连接

[英]MongoDB check connection of replica member before connecting with Java driver

我正在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的原因。

好的,在将选项runCommand设置为ReadPreference.secondaryPreferred()之后,该程序现在可以正常工作了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM