1. 程式人生 > 其它 >MongoDB 副本集(Replica Set)

MongoDB 副本集(Replica Set)

副本集(Replica Set)

副本集概念

此叢集擁有一個主節點(Master)和多個從節點(Slave),與主從複製模式類似,但是副本集與主從複製的區別在於:當叢集中主節點發生故障時,副本集可以自動投票,選舉出新的主節點,並引導其餘的從節點連線新的主節點。

**MongoDB 的副本集是自帶故障恢復功能的主從複製 **

副本集作用
  • 異地備份(資料冗餘)
  • 故障轉移(服務冗餘)
  • 負載均衡(讀寫分類)
  • 高可用基石(HA)
副本集角色
  • 主節點(Primary)
    Primary 是副本集的主節點,可讀寫,唯一可以進行寫操作的節點,由叢集自行選舉出來

  • 副本節點(Secondary)

    Seconary 會參與 Primary 選舉,並從 Primary 同步最新寫入的資料,以保證與 Primary 儲存相同的資料(Seconary 預設不提供讀寫服務)

  • 仲裁者(Arbiter)
    Arbiter 節點只參與投票,不能被選為 Primary,並且不從 Primary 同步資料

副本集資料同步原理
  • intial sync(全量同步)

    1. 全量同步開始,設定 minvalid 集合的 _initialSyncFlag 欄位為 true
    2. 獲取主節點上的當前最新 oplog 時間戳
    3. 同步集合資料並建立索引(比較耗時)
    4. 獲取主節點上的當前最新的 oplog 時間戳
    5. 讀取兩個 oplog 時間戳段內的 oplog 並重放
    6. 全量同步結束,設定 minvalid 集合的 _initialSyncFlag 欄位為 false
  • Replication(增量同步)

    全量同步結束後,從節點不斷的從主節點拉取 oplog 並重放應用到自身,這個過程並不是由一個執行緒來完成的,mongodb 為了提升同步效率,將拉取 oplog 以及重放 oplog 分到了不同的執行緒來執行。

    • producer 執行緒:該執行緒不斷的從主節點上拉取 oplog,並加入到一個 BlockQueue 的佇列裡儲存著,BlockQueue 最大儲存 240MB 的 oplog 資料,當超過這個閾值時,就必須等到 oplog 被 replBatcher 消費掉才能繼續拉取
    • replBatcher 執行緒:該執行緒負責逐個從 producer 執行緒的佇列裡取出 oplog,並放到自己維護的佇列裡,這個佇列最多允許 5000 個元素,並且元素總大小不超過 512 MB,當佇列滿了時,就需要等待 oplogApplication 執行緒消費掉
    • oplogApplication 執行緒:該執行緒會取出 replBatch 執行緒當前佇列的所有元素,並將元素根據集合名稱分散到不同的replWriter 執行緒(預設16個)
    • replWriter 執行緒:該執行緒將所有的 oplog 進行回放;
    • 等待所有 oplog 都回放完畢,最終 oplogApplication 執行緒將所有的 oplog 順序寫入到一個集合中,完成增量同步
副本集心跳檢測
  • 副本集建立成功後,每一個節點之間都保持著通訊,即每 2s 會向整個副本集的其他節點發一次心跳檢測 ping 命令
  • 副本集中每一個節點的資料庫內部,維護著整個副本集節點的狀態資訊,一旦某一個節點超過 10s 不能收到 ping 命令的響應,就認為這個節點不能訪問
  • 副本集中的主節點除了維護整體副本集節點狀態資訊外,還要判斷是否和大多數節點可以正常通訊,如果不能則要主動降級(只讀狀態)
副本集 Primary 選舉場景

需要進行 Primary 選舉的場景如下:

  1. 副本集初始化
  2. 副本集被 reconfig
  3. Primary 節點宕機
  4. Primary 節點主動 stepDown(主動降級為Secondary)
副本集 Primary 選舉規則
  • 每一個副本集節點根據自己維護的節點狀態資訊,如果判斷出整個副本集沒有主節點,而且本身具備升主節點條件,則會引發一次投票選舉

  • 投票發起者向副本整合員發起 Elect 請求,成員在收到請求後經過會一系列檢查,如果通過檢查則為發起者投一票

    檢查條件如下:

    • 在所有有效的副本集節點中它持有最新的 optime 時間戳
    • Priority 優先順序最高(預設1)
    • 先發先得選票
  • 如果投票發起者獲得超過半數(初始化時整個副本集節點的數量的一半)的投票,則選舉通過成為 Primary 節點,否則重新發起投票

  • 所有成員都可以投否決票,否決票具有一票否決權,所以一般可以認為只要有成員反對,則發起選舉節點將不能成為 Primary

    投否決票一般需要判斷以下三個條件:

    • 副本集中是否有其他節點已經是 Primary
    • 本節點的資料是否比請求成為主節點的資料更新(optime 時間戳)
    • 其他節點的資料是否比請求成為主節點的資料更新(optime 時間戳)

    注:如果以上任意一個條件滿足,則會停止選舉過程;原計劃升為主節點將仍舊保持 Secondary 狀態

官方推薦副本集的成員數量為奇數,且至少副本集包含 3 個節點