的貓鼬連接到副本集的一個常見的連接字符串是一樣的東西如下麻煩貓鼬重新連接到節點和發送請求到次級
var connection = mongoose.createConnection("mongodb://db_1:27017/client_test,mongodb://db_2:27017/client_test", {
replSet : { rs_name : "rs0", poolSize : 5, socketOptions : { keepAlive : 1 } }
}, function(err) {
if (err) { throw err; }
});
與問題是如果兩臺主機的人下來,那麼它將無法連接。如果你只指定一個主機,那麼沒有請求最終被髮送到輔助節點。
這是我對這一說法的證據。如果指定一個主機,並設置你的副本設置,以便有一個小學和一個仲裁,然後執行一個查詢如
myApi.find({}).slaveOk().read("s").exec(function(err, docs) {
console.log(docs)
})
它會返回結果。那麼,因爲我指定「s」(輔助),這個查詢應該會拋出一個錯誤,因爲沒有運行的輔助數據庫。另外,如果你把二級在線,然後做db.currentOp(true)
,你永遠不會看到任何實際的查詢發送它的方式。
當您更改連接字符串以指定每個主機時,您將看到連接轉到輔助。目前的困境是,因爲必須在連接字符串中指定其他主機,所以如果次要服務器處於脫機狀態,它將無法連接,並且現在我們失去了故障轉移功能(或將整個點指向副本集)
我不能確定這是否是我的配置錯誤,Mongoose中的錯誤,或者是我理解副本集函數方式的概念缺陷。從一些文檔中,他們似乎認爲從二手文字閱讀基本上是一個壞主意,但這樣做的原因通常是陳舊數據的問題。我的問題與過時的日期沒有任何關係,我無法找到一種設置系統的方式,以便我可以在不損失故障切換容量的情況下查詢輔助數據。
這是有道理的,除非我指定一個種子服務器,請求不會最終轉到輔助(不管我是否使用'sp'或's')。 「次要」的用法是爲了證明這一點,因爲沒有第二次就會失敗。 – Nucleon