MongoDB副本集的節點狀態轉化

MongoDB的副本集可以實現自動主從切換的過程,這個過程是相對複雜的, 本文主要介紹其實現過程。

副本集節點的狀態

在MongoDB裏面, 定義瞭如下的狀態:

    enum MS {
        RS_STARTUP = 0,
        RS_PRIMARY = 1,
        RS_SECONDARY = 2,
        RS_RECOVERING = 3,
        RS_STARTUP2 = 5,
        RS_UNKNOWN = 6, /* remote node not yet reached */
        RS_ARBITER = 7,
        RS_DOWN = 8, /* node not reachable for a report */
        RS_ROLLBACK = 9,
        RS_REMOVED = 10, /* node removed from replica set */
        RS_MAX = 10
    } s;
RS_STARTUP

每一個節點一開始的時候, 其狀態會被設置成爲RS_STARTUP。

RS_PRIMARY
RS_SECONDARY
RS_ARBITER

這3中狀態是福呢麼及節點的穩定狀態,一個副本集只會含有一個primary節點, 若干個secondary, 以及一個arbiter節點。

RS_RECOVERING

表示節點要轉變爲secondary狀態, 當前的狀態還是在同步oplog或者回滾狀態。

RS_STARTUP2

表示節點處於initial sync狀態。

RS_UNKNOWN 

該狀態主要是用在heartbeat 的MemberHeartbeatData裏面的ReplSetHeartbeatResponse, 記錄某個節點的heartbeat相應數據, 如果該節點的沒有正常相應或者有賬號校驗方面的問題, 就設定爲RS_UNKNOWN, 以表示該節點狀態未知。

RS_DOWN

該狀態和RS_UNKNOWN類似, 都是根據heartbeat的結果來設定的, 與RS_UNKNOWN不通點在於, 它是確定所訪問的節點發生故障或者不可達。

RS_ROLLBACK

該狀態表是節點正在回滾中。

RS_REMOVED

表示該節點的配置文件已經被初始化過, 但是在heartbeat的結果裏面找不到該節點, 已經被移出副本集;

這些狀態可以經過如下的變化:
在這裏插入圖片描述

初始化時的狀態變化

這個過程有有最初的PreStart對應的RS_STARTUP, 到開始initialsync, 其對應的狀態爲RS_STARTUP2, 全量數據同步完成以後, 進入RS_RECOVERING狀態, 最後進入RS_SECONDARY狀態。
改過程可能是新的節點加入, 也可能是調用resync命令, 最終變成一個secondary節點。

主到從切換的狀態變化

這個過程, 從RS_PRIMARY, 到RS_ROLLBACK需要的話, 經過RS_RECOVERING, 最後變成RS_SECONDARY;
該過程其實是一個故障轉移的過程, 節點由於主機或者網絡故障, 從主節點變換爲從節點的過程, 該過程中原本的secondary節點會重新選主,產生一個新的primary, 異常的舊的主節點重新加入副本集以後, 最終跟新的primary進行同步, 達到一致狀態後, 變成secondary; 如果無法達成一致狀態, 最終該節點在rollback階段, 在向前找到第一個節點後還是沒有找到一致的oplog, 程序會退出;

從到主切換的狀態變換

這個過程從RS_SECONDARY, 變成RS_PRIMARY;
這個過程其實是從節點選主的過程, 在舊的primary不可用的情況下, secondary會發起新的選主過程, 每一次選主, 都會產生一個新的term, 用來區分不同的節點同時選主, 以及受到該選主請求的時候, 進行區分。一旦某個節點得到大多數節點的贊同, 被選爲主, 該節點會發起贏得選舉的聲明, 並將最新的主節點信息公佈出去, 其他的正在等待選舉結果的發起者, 取消選舉;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章