【问题标题】:Mongoose not reading from Mongo secondary databaseMongoose 不从 Mongo 辅助数据库中读取
【发布时间】:2015-07-12 16:13:01
【问题描述】:

我已经实现了一个在全球范围内使用的副本集。我在美国俄勒冈州有我的硕士和 4 个中学。加利福尼亚和弗吉尼亚,法兰克福和悉尼。我在这些地区也有网络服务器。这些网络服务器使用 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 毫秒。我不明白为什么会发生这种情况,因为他们应该读取他们所在地区的辅助数据库。

我知道必须对主节点进行写入,但即使我执行查找,也不应该在区域辅助节点上完成并很快返回吗?

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

【问题讨论】:

  • 你运行的是什么版本的猫鼬?

标签: mongodb mongoose database-replication


【解决方案1】:

尝试使用以下选项:

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 将拒绝使用辅助节点。

【讨论】:

  • 只有我还是猫鼬选项有点乱?
  • @JoshElias 是的,当然同意你的看法。最糟糕的是,在描述选项和提供示例时,他们的大部分文档都非常糟糕。
  • 是的,他们的文档很糟糕,而且他们提供的示例非常有限。我离开他们的原因之一。
【解决方案2】:

编辑

尝试使用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

【讨论】:

【解决方案3】:
dbOptions.db = {
   readPreference: "secondaryPreferred",
};

这对我有用

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-17
    • 1970-01-01
    • 2012-03-19
    • 2020-09-13
    相关资源
    最近更新 更多