分佈式存儲之四:複製組建立

最近工做須要接觸一些Raft 相關的東西,下面簡單整理幾點:app

Raft內部相關接口

有本身的事物日誌管理接口:支持append/get/ truncate 等操做;ide

有獨立的日誌同步模塊:Replicator 逐一回探肯定從和主日誌開始分叉的位置,而後從主上拉取Follower 節點缺乏的日誌條目,同步給Follower,一般這是獨立的線程作的事情;線程

Raft內部可能有Cache功能,只有當待寫的日誌條目內容超過必定長度的時候,再會真正下發落盤;日誌

同步日誌的時候,Raft內部會檢查index ID是否和目的節點的相匹配:預期應該保證 follower當前的index id + 1 和append過來的 LOG index ID 相等; 接口

複製組建立流程

1.主控節點隨機找一個存儲節點建立一個複製組的副本;get

2.成功以後檢查複製組成員(副本)的數量是否達到複製組約定的成員的數量;同步

3.若是沒有達到,主控節點繼續 隨機找一個存儲節點建立一個複製組成員;若是有達到,到步驟 1 (向主控節點 返回成功)it

  1. 若是上面節點副本建立成功,向主控節點返回副本建立成功,主控節點接着向第一個副本發添加複製組成員的請求, 以便把新建立的副本添加到複製組;class

  2. 繼續步驟2

常見問題

  1. 解析事物日誌失敗配置

  2. 向複製組添加成員失敗

  3. 複製組的 Leader 裏有Follower, 可是Follower 裏的成員裏沒有Leader

針對問題1: 須要檢查load 出的Raft 日誌是否和append 的相一致; 針對問題二、3: 一般是因爲Leader 沒有把配置變動相關的日誌同步給Follower,這裏多是Leader讀以前它存下來的配置變動的日誌出錯了,也多是到了Follower節點但被Raft 檢查index等信息失敗從而被內部請求拒絕了。

相關文章
相關標籤/搜索