MongoDB Java驱动程序在崩溃后无法重新连接到主服务器

7
我在测试使用Java驱动程序进行MongoDB容错时遇到了问题。
我有一个主/备份MongoDB群集,即server1和server2。当我杀死主服务器server1以模拟故障时,server2会在几秒钟内变为主服务器,并且我的应用程序(使用Java驱动程序访问Mongo)开始使用新的主服务器server2。
当我重新启动server1时,它在几秒钟内重新获得了主要角色,但是我的应用程序不是连接到server1而是尝试连接到server2,由于现在处于辅助状态而失败!所有请求都因此错误而失败:
com.mongodb.MongoServerSelectionException: Unable to connect to any server that matches {serverSelectors=[ReadPreferenceServerSelector{readPreference=primary}, LatencyMinimizingServerSelector{acceptableLatencyDifference=15 ms}]}

我正在使用mongodb 2.6和java驱动程序2.12。我没有向我的MongoClient传递任何参数,该MongoClient使用集群的所有节点创建。
欢迎提供任何帮助。
祝好,
Loïc

你的连接字符串是什么?在集群中,你会知道合理数量的种子节点吗?还是只有一个单独的节点? - Neil Lunn
正如我所说,我使用我的集群中的所有节点创建了到Mongo的连接,因此所有种子如下所示: ServerAddress seed1 = new ServerAddress("server1"); ServerAddress seed2 = new ServerAddress("server2"); ServerAddress seed3 = new ServerAddress("server3"); MongoClient mongoClient = new MongoClient(Collections.asList(seed1 , seed2, seed3 )); - loicmathieu
你在问题中只提到了两个服务器,但在评论中提到了三个。你是否正在使用仲裁节点? - Scott
我没有使用仲裁节点。我的问题是故意简化的。 - loicmathieu
3个回答

4
由于这个问题已经超过一年,我将使用 MongoDB 3.0 和 Java 驱动程序 3.0.4 来解决问题。
假设在端口号分别为27017、27018和27019的三个节点中有一个副本集(副本集中推荐的最小节点数),其中一个主节点和两个辅助节点。因此,我可以按照上述配置创建连接,如下所示:
MongoClient mongo = new MongoClient(asList(new ServerAddress("localhost",27017),
            new ServerAddress("localhost", 27018), new ServerAddress("localhost", 27019),
            new MongoClientOptions.builder().requiredReplicaSetName("replset_name").build()));

请注意,使用MongoClientOptions,驱动程序会保证上述服务器确实是所述副本集的成员。如果您没有副本集,则可以跳过此步骤。
在故障转移期间,驱动程序将自动切换到新的主节点并开始向其发送请求,但您必须处理CRUD操作期间抛出的异常

1

由于仍有一些人在解决这个问题并尝试回答,因此我自己来回答。

这个问题不再发生,我不确定为什么。我现在将驱动程序更新到2.12.3版本。MongoDB方面没有更新。

感谢那些尝试帮助的人。


0

我们遇到了相同的问题。将 Mongo Java 驱动程序升级到版本 2.13.3 似乎解决了这个问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接