Java MongoDB客户端和MongoS Sharding

时间:2012-07-20 15:30:55

标签: mongodb-java

我知道如果我使用带有ReadPreference.SECONDARY的ServerAddresses列表(使用this function)创建与Java中的MongoDB连接到副本集,客户端将平衡副本集中的读取,更喜欢具有较短往返时间的节点(例如,相同的colo)。

但是当我使用ReadPreference.SECONDARY向一堆MongoS服务器创建一个MongoDB客户端时,所有读/写都会转到列表中的第一个服务器,即使访问是交叉colo并且MongoS存在于同样的颜色。

例如,如果我有三台MongoS服务器 - SF1,SF2和NYC1(按此顺序) - 我的客户端只与SF1通信,无论它们是在SF还是NYC。

在与MongoS服务器通信时,我是否需要配置或以其他方式设置客户端?我错过了什么?

1 个答案:

答案 0 :(得分:2)

这是驱动程序中的无意识行为。驱动程序代码未检测到您正在传递mongos服务器列表,并将它们视为副本集。如果没有检测到辅助节点,ReadPreference.SECONDARY将向主节点发送查询,这就是这里发生的情况:它检测到的第一个“主节点”是列表中的第一个mongos服务器。没有mongos服务器识别为辅助服务器,因此忽略它们。

因此,目前在多个mongos服务器之间进行负载均衡的唯一方法是为每个服务器创建一个Mongo实例,并在应用程序代码中处理每个查询的分发。

另请注意,Java驱动程序的下一个版本将包含https://jira.mongodb.org/browse/JAVA-381的修复程序,它增加了对mongos故障转移的支持(尽管尚未进行负载平衡)