Mongo不从 Mongo 辅助数据库读取

Mongoose not reading from Mongo secondary database

我已经实现了一个在全球范围内使用的副本集。我在美国俄勒冈州有我的硕士和 4 个中学。加利福尼亚和弗吉尼亚,法兰克福和悉尼。我在那些相同的地区也有网络服务器。这些 Web 服务器使用 mongoose:

连接到 mongo
var mongoose = require("mongoose");
var dbUrl = "mongodb://***.***.***.***:27017,***.***.***.***:27017,***.***.***.***:27017,***.***.***.***:27017,***.***.***.***:27017/exampleDb";
var dbOptions : {
   "replSet": {
      "rs_name": "exampleRepSet",
      "readPreference": "ReadPreference.SECONDARY_PREFERRED",
      "read_preference": "ReadPreference.SECONDARY_PREFERRED",
      "w":0,
      "slaveOk": true
    }
}
mongoose.connect(dbUrl, dbOptions);

我的问题是我的客户对数据库有更高的延迟,这取决于他们与主服务器的距离。加利福尼亚获得 40 毫秒,而悉尼获得 400 毫秒。我不明白为什么会这样,因为他们应该从他们所在地区的辅助数据库中读取数据。

我知道必须对主数据库执行写入操作,但即使我执行查找,也不应该在区域辅助数据库上完成并且 return 很快吗?

我意识到该配置中有一些多余的选项,但我越来越绝望了。我也试过选项 "ReadPreference.NEAREST" 无济于事。

编辑

尝试使用 mongodb://connection/db/?readPreference=secondary 而不是在 dbOptions 中设置连接字符串本身的读取首选项。我在 node-mongodb-native 中找不到任何表示可以将读取首选项添加到 replset 配置的内容。 http://mongodb.github.io/node-mongodb-native/2.0/api/ReplSet.html

旧答案

您可能需要将设置设置为最近而不是次要首选。 http://docs.mongodb.org/manual/reference/read-preference/#nearest

尝试使用以下选项:

var mongoose = require("mongoose");
var dbUrl = "mongodb://***.***.***.***:27017,***.***.***.***:27017,***.***.***.***:27017,***.***.***.***:27017,***.***.***.***:27017/exampleDb";

mongoose.connect(dbUrl, {
    server: { 
        readPreference: "nearest", 
        strategy: "ping"
    },
    replset: { 
        rs_name: "exampleRepSet", 
        readPreference: "nearest", 
        strategy: "ping"
    }
});

虽然文档将 ping 指定为默认策略,但 Mongoose 似乎要求您在使用 readPreference 时指定一个策略。

另请注意 secondaryPreferrednearest 不同。 secondaryPreferred 优先读取次要成员(顾名思义),而不管网络延迟如何,其中 nearest 优先读取网络延迟最少的成员。

如果您的副本集没有配置错误,请确保您的主服务器在线且可访问 - 默认情况下,如果主服务器离线,Mongoose 将拒绝使用辅助服务器。

dbOptions.db = {
   readPreference: "secondaryPreferred",
};

这对我有用