mongoose:阅读副本集
我有一个mongodb副本集,我想从主数据库和辅助数据库中读取数据。
我已经使用这个命令连接到数据库:
mongoose.connect('mongodb://user:password@54.230.1.1,user:password@54.230.1.2,user:password@54.230.1.3/PanPanDB?replicaSet=rs0&readPreference=nearest');
它不工作..我的应用程序继续从主要阅读..任何build议吗?
如果你想从辅助阅读,你应该设置您的阅读首选项为:
-
secondaryPreferred
– 在大多数情况下,操作是从次要成员读取的,但是如果没有次要成员可用,则从主要操作读取操作。 -
secondary
– 从副本集的辅助成员读取的所有操作。
根据您的示例从nearest
读取将通过ping时间(可能是主要或次要)select最近的成员。
注意事项
当使用除primary
以外的任何读取首选项时,您需要注意可能影响您的应用程序逻辑的最终一致性的潜在问题。 例如,如果您正在从辅助阅读中读取,那么可能是主要的变化还没有被复制到辅助中。
如果您在从次级读取时担心更强的一致性,则应查看“ 关注副本集”文档。
由于辅助数据必须与主数据写入相同的数据,因此从辅助数据读取可能不会提高性能,除非您的应用程序非常繁重或者最终一致性不错。
遵循MongoDB网站和Mongoose 网站上的文档,您可以添加此指令来configurationMongoose上的ReadPreference:
var opts = { replSet: {readPreference: 'ReadPreference.NEAREST'} };
mongoose.connect('mongodb://###:###@###:###/###', opts);
这已经使用Mongoose 3.8.9版进行了testing
除了设置连接URI(和你一样)和连接选项(如Emas所做的),我还必须为每个查询显式select服务器,例如
var query = User.find({}).read("nearest"); query.exec(function(err, users) { // ... });
Mongoose使用节点包“mongodb”,连接uri或opts由“mongodb”parsing。 这里是mongodb连接opts和mongodb的readPreference源代码。
所以,我们可以像这样使用mongoose:
var opts = {db: {readPreference: 'nearest'}; mongoose.connect(uri, opts);
另外,只需使用这样的uri :
var uri = 'mongodb://###?readPreference=nearest'; mongoose.connect(uri, opts);
在4.3.3上面的mongoose生效。
你可以简单地使用下面的代码来做到这一点
var collection = db.collection(collectionName,{readPreference:'secondaryPreferred'});
http://p1bugs.blogspot.in/2016/06/scaling-read-query-load-on-mongodb.html