2016-02-27 89 views
0

我們正在使用節點堆棧來連接到mongo副本集。由於我們的副本在地理上是分佈式的,因此我們希望在URI中使用readPreference選項並將其設置爲最接近的。但是當我們這樣做的時候,雖然性能得到了很大的提高,但我們卻開始變得「​​不是主人」錯誤。爲什麼設置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

選項1: 你可以追加slaveOk的端到端連接,URI的。 readPreference告訴mongodb你想如何讀取數據,slaveOk指示可以從輔助數據中讀取(重複數據),但是可以工作。

例如

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版本中工作。

+0

這就是我如何開始,它沒有工作。我相信slaveOk現在已經過時,readPreferences取而代之。 – machunter

+0

謝謝@machunter。我剛剛更新了我的答案。如果可能,你可以嘗試**選項2 **。由於您需要修改代碼,因此我不確定它是否可行且易於實現解決方案。 – Saleem

+0

我還沒有嘗試過,因爲我希望只是修改URI就足夠了......更改代碼不是最實際的方法。 – machunter

0

似乎在2.0.28中修復了驅動程序中的一個錯誤,其中findAndModify使用了readPreference設置。將驅動程序升級到最新版本似乎解決了問題。

2.0.x drivers history

相關問題