2013-04-14 110 views
-20

假設您有一個三節點副本集。節點1是主要的。節點2是次要的,節點3是延遲10秒的次要運行。所有對數據庫的寫操作都是以w = majority和j = 1來發布的(我們的意思是getLastError調用具有這些值)。Mongodb在副本集中回滾

寫入操作(可能是插入或更新)是從應用程序在時間= 0開始的。在時間= 5秒時,主節點1下降一小時,另一個節點被選爲主節點。

節點1恢復時會有數據回滾嗎?選擇最佳答案。

  1. 始終是
  2. 始終沒有
  3. 也許,這取決於節點3是否已經處理了寫。
  4. 也許,這取決於節點2是否處理了寫入。

任何幫助將不勝感激。

+0

5.取決於什麼其他寫你已經打算和節點1個節點2 – Sammaye

+0

感謝之間的複製滯後sammaye ....這可能是4個選項中選擇最佳答案? –

+0

沒有延遲的單次寫操作我會去2,那麼操作應該在故障轉移時被複制到新的主服務器上,特別是當我在第一個評論中沒有看到w =多數時,應該意味着2/3的成員應該確認寫入,並且由於節點3被延遲,所以它不應該在那裏確認它。 – Sammaye

回答

6

我打算將我的答案改爲4,但是它應該是2,w =多數。你可能會遇到一個邊緣情況,即返回一個操作的wtimeout,並且該操作沒有被該集合的大部分所得到。這些問題應該是非常罕見的或者幾乎從不發生,但需要牢記。由於大多數節點(1 & 2)將確認寫入,所以如果節點1下降,則節點2應該有其操作並加速,因爲節點1不需要回退到節點2的狀態;相反,節點1將迎頭趕上。

日誌對於定義是否存在回滾並不那麼重要。

0

請閱讀MongoDB的文檔此相關的摘錄:「回滾如果寫操作複製到副本的另一個成員不發生設置之前的主要步驟下來,如果該成員仍然可用和可訪問到大部分副本集合。「

1

我覺得這是從蒙戈DB考試一個問題,但得到的答覆是不難看出:

也許,這取決於節點2是否已經處理了寫。