Mongoose: Read on ReplicaSet

浪尽此生 提交于 2019-12-18 17:26:41

问题


I have a mongodb replica set from which I want to read data from primary and secondary db.

I have used this command to connect to the db:

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');

It doesn't work.. My application continues to read from the primary.. Any suggestion please?


回答1:


If you want to read from a secondary, you should set your read preference to either of:

  • secondaryPreferred - In most situations, operations read from secondary members but if no secondary members are available, operations read from the primary.

  • secondary - All operations read from the secondary members of the replica set.

Reading from nearest as per your example will select the nearest member by ping time (which could be either the primary or a secondary).

Caveats

When using any read preference other than primary, you need to be aware of potential issues with eventual consistency that may affect your application logic. For example, if you are reading from a secondary there may be changes on the primary that have not replicated to that secondary yet.

If you are concerned about stronger consistency when reading from secondaries you should review the Write Concern for Replica Sets documentation.

Since secondaries have to write the same data as the primary, reading from secondaries may not improve performance unless your application is very read heavy or is fine with eventual consistency.




回答2:


Following the documentation found on MongoDB website and on Mongoose web site, you can add this instruction for configuring the ReadPreference on Mongoose:

var opts = { replSet: {readPreference: 'ReadPreference.NEAREST'} };

mongoose.connect('mongodb://###:###@###:###/###', opts);

This has been tested using Mongoose version 3.8.9




回答3:


As well as setting the connection URI (as you did) and the connection options (as Emas did), I also had to explicitly choose the server for each query, e.g.

var query = User.find({}).read("nearest");
query.exec(function(err, users) {
    // ...
});



回答4:


Mongoose use node package "mongodb", connection uri or opts is parsed by "mongodb". Here is mongodb connect opts and mongodb readPreference source code.

So, we can use mongoose like this:

var opts = {db: {readPreference: 'nearest'}; mongoose.connect(uri, opts);

Also, just use uri like this:

var uri = 'mongodb://###?readPreference=nearest'; mongoose.connect(uri, opts);

In mongoose 4.3.4 above take effect.




回答5:


You can simply do that by using below code

var collection = db.collection(collectionName,{readPreference:'secondaryPreferred'});

http://p1bugs.blogspot.in/2016/06/scaling-read-query-load-on-mongodb.html



来源:https://stackoverflow.com/questions/20714340/mongoose-read-on-replicaset

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!