etcd源碼解析之V2 server和raft核心運轉
etcd是一個應用raft一致性算法的分布式KV存儲數據庫,使用go語言開發,在業界應用廣泛,本文對etcd server部分的代碼解析基於master分支的V2版本。
V2 server核心運轉解析
V2 server的啟動需要配置--enable-v2,所以我從這個配置項跟蹤起代碼,從http server解析請求到刷快照落盤在到http server回包,以代碼為維度生成以下流程圖:
從圖中可以看出,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的流程圖:
收到MsgProc請求,強一致性情況下:
- Leader: 走raft流程
- Follower: 轉發給Leader
- Candidate: 丟棄
其他細節根據代碼和算法文檔不再累述。
最後更新:2017-10-17 17:34:32