崩溃后,Mongodb java驱动程序无法重新连接到主驱动程序

时间:2014-05-05 09:24:40

标签: java mongodb

使用java驱动程序尝试mongodb的故障转移容量时遇到问题。

我有一个主要/辅助mongodb集群,即server1和server2。

当我杀死主服务器1以模拟故障时,server2在几秒钟内成为主服务器,而我的应用程序(使用java驱动程序访问mongo)开始使用新的主服务器2.

当我重新启动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。

欢迎任何帮助。

此致

卢瓦克

3 个答案:

答案 0 :(得分:4)

由于问题超过一年,我将使用 MongoDB 3.0 Java驱动程序3.0.4 作为我的解决方案。

假设在端口27017,27018和27019上的副本集(建议的副本集中最小节点数)中有3个节点(1个主节点和2个辅助节点)。所以我可以使用上面的配置创建连接,如下所示:

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 :(得分:1)

至于仍有一些人到达这个问题并试图回答我自己回答。

问题不再发生,我不知道为什么。我现在将我的驱动程序更新到2.12.3版本。 mongodb方面没有更新。

感谢那些试图提供帮助的人。

答案 2 :(得分:0)

我们遇到了同样的问题。将Mongo java驱动程序升级到版本2.13.3似乎可以解决问题