2015-07-12 50 views
8

我已經實現了一個全局使用的副本集。我有美國俄勒岡州的碩士和4位輔助教師。加州和弗吉尼亞,法蘭克福和悉尼。我在這些地區也有網絡服務器。這些Web服務器連接使用貓鼬到蒙戈:Mongoose沒有從Mongo二級數據庫讀取

var mongoose = require("mongoose"); 
var dbUrl = "mongodb://***.***.***.***:27017,***.***.***.***:27017,***.***.***.***:27017,***.***.***.***:27017,***.***.***.***:27017/exampleDb"; 
var dbOptions : { 
    "replSet": { 
     "rs_name": "exampleRepSet", 
     "readPreference": "ReadPreference.SECONDARY_PREFERRED", 
     "read_preference": "ReadPreference.SECONDARY_PREFERRED", 
     "w":0, 
     "slaveOk": true 
    } 
} 
mongoose.connect(dbUrl, dbOptions); 

我的問題是我的客戶,這取決於它們是從主有多遠有較高延遲到數據庫中。加州得到40ms,而悉尼獲得400ms。我不明白爲什麼會發生這種情況,因爲他們應該讀取他們所在地區的輔助數據庫。

我明白,必須寫入主要寫入,但即使我執行查找,那麼不應該在區域中學完成並返回相當快?

我意識到在配置中有一些多餘的選項,但我越來越絕望。我也試過"ReadPreference.NEAREST"選項無濟於事。

+0

您運行的是什麼版本的貓鼬的? – ThrowsException

回答

3

嘗試使用以下選項:

var mongoose = require("mongoose"); 
var dbUrl = "mongodb://***.***.***.***:27017,***.***.***.***:27017,***.***.***.***:27017,***.***.***.***:27017,***.***.***.***:27017/exampleDb"; 

mongoose.connect(dbUrl, { 
    server: { 
     readPreference: "nearest", 
     strategy: "ping" 
    }, 
    replset: { 
     rs_name: "exampleRepSet", 
     readPreference: "nearest", 
     strategy: "ping" 
    } 
}); 

文件雖然規定ping作爲默認的策略,似乎你指定一個當您使用readPreference貓鼬任務。

另請注意secondaryPreferrednearest不是一回事。 secondaryPreferred更喜歡讀取次要成員(顧名思義),而不考慮網絡延遲,其中nearest優先級讀取具有最低網絡延遲量的成員。

由於缺少副本集中的錯誤配置,請確保您的主服務器處於聯機狀態並且可以訪問 - 默認情況下,如果主服務器處於脫機狀態,Mongoose將拒絕使用輔助服務器。

+0

它只是我或是貓鼬選項有點混亂? –

+1

@JoshElias是的,在那裏肯定與你同意。最糟糕的是,當涉及到描述選項和提供示例時,他們的大部分文檔都很糟糕。 – jduncanator

+0

是的,他們的文檔很糟糕,他們提供的例子非常有限。我離開他們的一個原因。 –

3

編輯

嘗試設置在連接字符串本身讀偏好與mongodb://connection/db/?readPreference=secondary而不是在dbOptions。我在node-mongodb-native中找不到任何可以將讀取首選項添加到replset配置中的任何內容。 http://mongodb.github.io/node-mongodb-native/2.0/api/ReplSet.html

老回答

您可能需要設置設置最近的,而不是二次首選。 http://docs.mongodb.org/manual/reference/read-preference/#nearest

+0

我相信SECONDARY_PREFERRED選項的作用與NEAREST相同,只是它會更喜歡讀取輔助選項。 http://docs.mongodb.org/manual/core/read-preference-mechanics/#replica-set-read-preference-behavior-nearest –

+0

硬編碼在mongodb連接url中的選項確實可以工作,但這不是貓鼬解決方案我希望 –

0
dbOptions.db = { 
    readPreference: "secondaryPreferred", 
}; 

這爲我工作