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
时指定一个策略。
另请注意 secondaryPreferred
与 nearest
不同。 secondaryPreferred
优先读取次要成员(顾名思义),而不管网络延迟如何,其中 nearest
优先读取网络延迟最少的成员。
如果您的副本集没有配置错误,请确保您的主服务器在线且可访问 - 默认情况下,如果主服务器离线,Mongoose 将拒绝使用辅助服务器。
dbOptions.db = {
readPreference: "secondaryPreferred",
};
这对我有用
我已经实现了一个在全球范围内使用的副本集。我在美国俄勒冈州有我的硕士和 4 个中学。加利福尼亚和弗吉尼亚,法兰克福和悉尼。我在那些相同的地区也有网络服务器。这些 Web 服务器使用 mongoose:
连接到 mongovar 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
时指定一个策略。
另请注意 secondaryPreferred
与 nearest
不同。 secondaryPreferred
优先读取次要成员(顾名思义),而不管网络延迟如何,其中 nearest
优先读取网络延迟最少的成员。
如果您的副本集没有配置错误,请确保您的主服务器在线且可访问 - 默认情况下,如果主服务器离线,Mongoose 将拒绝使用辅助服务器。
dbOptions.db = {
readPreference: "secondaryPreferred",
};
这对我有用