为什么设置readPreference最近会生成非主错误?

时间:2016-02-27 00:02:02

标签: node.js mongodb

我们正在使用节点堆栈连接到mongo副本集。因为我们的副本在地理上是分布式的,所以我们希望在URI中使用readPreference选项并将其设置为最接近。但是当我们这样做的时候,虽然性能大大提高,但我们开始得到“非主”错误。

我是否误解了国旗的使用?

我们正在使用mongo 2.6.3,我们正在使用mongodb节点库的2.0.24版本。

连接的URI是:

mongodb://mongo-1:27017,mongo-2:27017,mongo-3:27017,mongo-4:27017,mongo-5:27017/db?replicaSet=main&readPreference=nearest

BURC

2 个答案:

答案 0 :(得分:0)

选项1: 您可以将slaveOk附加到连接URI的末尾。 readPreference告诉mongodb你想如何读取数据,slaveOk指示可以从二次读取(位复制)但是可以工作。

e.g。

mongodb://mongo-1:27017,mongo-2:27017,mongo-3:27017,mongo-4:27017,mongo-5:27017/db?replicaSet=main&readPreference=nearest&slaveOk=true

请参阅&slaveOk=true和URI结尾。

https://mongodb.github.io/node-mongodb-native/driver-articles/mongoclient.html#read-preference

选项2: 如果以上解决方案不起作用,则需要修改代码:

var client = require('mongodb').MongoClient;

var uri= "mongodb://mongo-1:27017,mongo-2:27017,mongo-3:27017,mongo-4:27017,mongo-5:27017/db?replicaSet=main";

请注意我已修改连接uri。我没有在Uri中设置readPrefference,而是将其移至MongoClient.connect中的db选项。

var options =  {db:{readPreference:"ReadPreference.NEAREST"}};
client.connect(uri, options, function(err, db){
    if(err){
        console.log(err);
        return;
    }
   db = db.collection('data');
   db.findOne({}, function(err, result){
       console.log(result); 
   }); 
});

我已经在nodejs驱动程序2.2中进行了测试,跳转它也应该在2.0版本中运行。

答案 1 :(得分:0)

似乎驱动程序中有一个错误已在2.0.28中修复,其中findAndModify使用了readPreference设置。将驱动程序升级到最新版本似乎解决了这个问题。

2.0.x drivers history