使用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。
欢迎任何帮助。
此致
卢瓦克
答案 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似乎可以解决问题