閱讀649 返回首頁    go 阿裏雲 go 技術社區[雲棲]


etcd源碼解析之V2 server和raft核心運轉

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: 丟棄

其他細節根據代碼和算法文檔不再累述。

最後更新:2017-10-17 17:34:32

  上一篇:go  解決alitomcat中無法獲得https協議的問題
  下一篇:go  JavaAgent學習筆記