最近工做須要接觸一些Raft 相關的東西,下面簡單整理幾點:app
有本身的事物日誌管理接口:支持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
若是上面節點副本建立成功,向主控節點返回副本建立成功,主控節點接着向第一個副本發添加複製組成員的請求, 以便把新建立的副本添加到複製組;class
解析事物日誌失敗配置
向複製組添加成員失敗
針對問題1: 須要檢查load 出的Raft 日誌是否和append 的相一致; 針對問題二、3: 一般是因爲Leader 沒有把配置變動相關的日誌同步給Follower,這裏多是Leader讀以前它存下來的配置變動的日誌出錯了,也多是到了Follower節點但被Raft 檢查index等信息失敗從而被內部請求拒絕了。