2016-09-14 229 views
0

我有一個連接到mongodb的nodejs應用程序。mongodb故障轉移連接

Mongodb允許複製客戶端連接提供一定程度的彈性。

例如「mongodb://localhost:50000,localhost:50001/myproject?replicaSet=foo」,客戶端首先連接到localhost @ 50000,如果它死了,它將切換到localhost @ 50001。

這很好,但如果應用程序啓動時,如果兩個mongo中的一個死了,那麼應用程序就會死掉 - 無法連接錯誤。

我能想到的唯一解決辦法是重新格式化的URL,因此排除了非活動實例,但想避免這種情況...

任何想法?當你有一個奇數數量的服務器,因爲使用節點之間的選舉定義哪些服務器將是「主」的MongoDB ReplicaSet工作

感謝

回答

1

正如Rafael提到的,當一些成員脫機時,副本集需要奇數個成員才能正常運行。有在Replica Set Elections docs page更多的細節,但最相關的是:

如果大多數副本集的不可訪問或不可用,以當前的主,主會下臺,成爲一個次要的。在發生這種情況後,副本集不能接受寫入,但如果將這些查詢配置爲在輔助節點上運行,則其餘成員可以繼續爲讀取查詢提供服務。

默認節點驅動程序需要一個主在線才能能夠連接到副本集,並且將輸出,當你嘗試連接到無主設定的副本,你觀察到的一個錯誤。

此默認行爲可通過將connectWithNoPrimary設置爲true來更改。但是,爲了能夠執行查詢,您還應該設置正確的readPreference setting(也默認爲主)。例如:

var MongoClient = require('mongodb').MongoClient 

conn = MongoClient.connect('mongodb://localhost:27017,localhost:27018,localhost:27019/test', 
    { 
     replicaSet: 'replset', 
     connectWithNoPrimary: true, 
     readPreference: 'primaryPreferred' 
    }).catch(console.log) 

有關連接選項的詳細信息可以在Node Driver URI Connection Settings page

找到