2011-09-23 28 views
1

我的服務器設置如下:如何在沒有數據庫的情況下正確關閉Mongo(在副本集中)?

2 x服務器。 mongoDB在兩臺服務器之間都有副本集。每個都是一個節點。

然後我有我的node.js服務器連接到MongoDB。

發生了什麼是..當我殺死輔助服務器。 (關閉服務器)。主要的MongoDB仍在運行,但Node.js服務器與MongoDB存在連接問題。即使我添加了服務器,它不起作用。我使用貓鼬和connect-mongo。

那麼,發生了什麼?如何正確關閉Mongo節點?

回答

1

如果在取消輔助節點後,主節點仍然是主節點,那麼這是節點的驅動程序問題。無論如何,你總是應該有一個偶數的副本節點,「爲什麼」在mongodb的文檔中有很好的記錄。

如果這是一個node.js問題,你使用的是什麼版本的node-mongodb-native? 2個月前我有一些不同的複製問題,但最新版本已經修復了。該驅動程序的最後一個複製問題已關閉9月9日,你應該試着用最後一個標記版本(V0.9.6.18,因爲我寫這個)

+0

我認爲我有仲裁者設置。我的Mongoose,節點和mongo在後面顛覆了2-4。讓我嘗試升級它,看看它是否有效。 :) 謝謝。 – murvinlai

+0

在你的情況下,真正需要更新的唯一東西是[node-mongodb-native driver](https://github.com/christkv/node-mongodb-native/tree/V0.9.6)。 18),只要它們相當近,mongodb mongoose和節點並不重要 –

+0

如果另一個節點發生故障,主節點不會「仍然是主節點」。它會自動降級。如果客戶端使用'slaveOk'設置爲true,它仍然是可讀的。 – dcrosta

5

如果您有一個包含2個節點的副本集,則當一個節點關閉時,另一個節點會將其自身降級爲輔助節點。如果你沒有連接slaveOk爲真,那麼你將無法閱讀(在任何情況下,你將無法寫)。

這是一個由MongoDB實施的安全措施,它要求複製套件的大多數(意思是半加一)能夠互相看到,以確保可以安全地選擇一個主節點。如果大多數人看不到,少數人的節點不知道「另一半」是否選擇了小學。同時有兩個初選會是Very Bad(TM),因爲這可能導致更新衝突。

在只需運行兩個節點的情況下,如果一個節點發生故障或對副本集不可見,也可以運行仲裁器來中斷關係。仲裁者是一個正常的進程,但不存儲任何數據 - 實質上它只參與選舉,否則就是空閒的。在具有2個「正常」節點和一個仲裁器的副本集中,兩個數據保存節點中的任何一個可以下降而不失去大多數。

欲瞭解更多信息,請參閱the MongoDB documentation on replica setsthe documentation on artibers

+0

有一件事我不明白是..我殺了中學孟戈,不是主要的。所以,不應該有任何投票涉及,對吧?以及爲什麼它仍然打破? :) – murvinlai

+0

副本集的每個成員使用定期檢測信號消息監視其他成員 - 如果主要成員在任何時候都無法看到大部分副本集(包括其本身)(注意:大多數情況下爲2 == 2,根據定義,沒有多數),它會自動下降到第二級以避免衝突情況。 – dcrosta

相關問題