etcd原始碼解析之V2server和raft核心運轉

羽洵發表於2017-10-17

etcd是一個應用raft一致性演算法的分散式KV儲存資料庫,使用go語言開發,在業界應用廣泛,本文對etcd server部分的程式碼解析基於master分支的V2版本。

V2 server核心運轉解析

V2 server的啟動需要配置–enable-v2,所以我從這個配置項跟蹤起程式碼,從http server解析請求到刷快照落盤在到http server回包,以程式碼為維度生成以下流程圖:
leader接受put請求過程.png
從圖中可以看出,etcd的狀態機完全依賴go語言中的channel。
server接受到請求後封裝成MsgProc包通過管道傳送給本程式,註冊一個管道等到程式處理完回包。
raft commit請求後,構造一個ready訊號給管道,server接受到管道後,寫wal, 判斷是否需要寫快照,再構造applyc訊號到管道,觸發請求應用到儲存層store, store更新後打包回包,喚醒之前等待處理完成的管道,回包給client。

raft核心運轉解析

raft一致性演算法可參考官網:https://raft.github.io
etcd的raft機制可參考文件:https://github.com/coreos/etcd/blob/master/raft/doc.go
從一個空server啟動raft的流程圖:
raft正常啟動流程.png
收到MsgProc請求,強一致性情況下:

  • Leader: 走raft流程
  • Follower: 轉發給Leader
  • Candidate: 丟棄

其他細節根據程式碼和演算法文件不再累述。


相關文章