我们正在使用节点堆栈连接到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
答案 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设置。将驱动程序升级到最新版本似乎解决了这个问题。