0

我知道,如果我使用 ServerAddresses 列表(使用此函数)创建与 Java 中的 MongoDB 到副本集的连接ReadPreference.SECONDARY,客户端将平衡副本集之间的读取,更喜欢往返时间较短的节点(相同科罗拉多州,例如)。

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

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

在与 MongoS 服务器通信时,我是否需要配置一些东西或以不同的方式设置客户端?我错过了什么?

4

1 回答 1

2

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

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

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

于 2012-07-20T16:04:35.440 回答