MongoDB 副本集(Replica Set)
副本集(Replica Set)
副本集概念
此叢集擁有一個主節點(Master)和多個從節點(Slave),與主從複製模式類似,但是副本集與主從複製的區別在於:當叢集中主節點發生故障時,副本集可以自動投票,選舉出新的主節點,並引導其餘的從節點連線新的主節點。
**MongoDB 的副本集是自帶故障恢復功能的主從複製 **
副本集作用
- 異地備份(資料冗餘)
- 故障轉移(服務冗餘)
- 負載均衡(讀寫分類)
- 高可用基石(HA)
副本集角色
-
主節點(Primary)
Primary 是副本集的主節點,可讀寫,唯一可以進行寫操作的節點,由叢集自行選舉出來 -
副本節點(Secondary)
Seconary 會參與 Primary 選舉,並從 Primary 同步最新寫入的資料,以保證與 Primary 儲存相同的資料(Seconary 預設不提供讀寫服務)
-
仲裁者(Arbiter)
Arbiter 節點只參與投票,不能被選為 Primary,並且不從 Primary 同步資料
副本集資料同步原理
-
intial sync(全量同步)
- 全量同步開始,設定 minvalid 集合的 _initialSyncFlag 欄位為 true
- 獲取主節點上的當前最新 oplog 時間戳
- 同步集合資料並建立索引(比較耗時)
- 獲取主節點上的當前最新的 oplog 時間戳
- 讀取兩個 oplog 時間戳段內的 oplog 並重放
- 全量同步結束,設定 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 選舉的場景如下:
- 副本集初始化
- 副本集被 reconfig
- Primary 節點宕機
- Primary 節點主動 stepDown(主動降級為Secondary)
副本集 Primary 選舉規則
-
每一個副本集節點根據自己維護的節點狀態資訊,如果判斷出整個副本集沒有主節點,而且本身具備升主節點條件,則會引發一次投票選舉
-
投票發起者向副本整合員發起 Elect 請求,成員在收到請求後經過會一系列檢查,如果通過檢查則為發起者投一票
檢查條件如下:
- 在所有有效的副本集節點中它持有最新的 optime 時間戳
- Priority 優先順序最高(預設1)
- 先發先得選票
-
如果投票發起者獲得超過半數(初始化時整個副本集節點的數量的一半)的投票,則選舉通過成為 Primary 節點,否則重新發起投票
-
所有成員都可以投否決票,否決票具有一票否決權,所以一般可以認為只要有成員反對,則發起選舉節點將不能成為 Primary
投否決票一般需要判斷以下三個條件:
- 副本集中是否有其他節點已經是 Primary
- 本節點的資料是否比請求成為主節點的資料更新(optime 時間戳)
- 其他節點的資料是否比請求成為主節點的資料更新(optime 時間戳)
注:如果以上任意一個條件滿足,則會停止選舉過程;原計劃升為主節點將仍舊保持 Secondary 狀態
官方推薦副本集的成員數量為奇數,且至少副本集包含 3 個節點