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