【问题标题】:MongoDB check connection of replica member before connecting with Java driverMongoDB 在与 Java 驱动程序连接之前检查副本成员的连接
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-17
      • 2014-03-23
      • 1970-01-01
      • 2021-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多