Mongoose没有从Mongo辅助数据库中读取

Jos*_*ias 8 mongoose mongodb database-replication

我已经实现了一个我在全球范围内使用的副本集.我的主人在美国俄勒冈州和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);
Run Code Online (Sandbox Code Playgroud)

我的问题是我的客户端具有更高的数据库延迟,具体取决于它们与主服务器的距离.加州获得40分钟,悉尼获得400分钟.我不明白为什么会这样,因为他们应该读取他们所在地区的二级数据库.

我知道写入必须对主要进行,但即使我执行了一个查找,那么不应该在区域二级上完成并且返回很快?

我意识到配置中有一些冗余选项,但我已经绝望了.我也试过这个选项"ReadPreference.NEAREST"无济于事.

jdu*_*tor 3

尝试使用以下选项:

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"
    }
});
Run Code Online (Sandbox Code Playgroud)

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

另请注意,这secondaryPreferred与 不同nearestsecondaryPreferred无论网络延迟如何,都更喜欢读取次要成员(顾名思义),其中nearest优先读取网络延迟最低的成员。

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