etcd是一個應用raft一緻性算法的分布式KV存儲資料庫,使用go語言開發,在業界應用廣泛,本文對etcd server部分的代碼解析基于master分支的V2版本。
V2 server的啟動需要配置--enable-v2,是以我從這個配置項跟蹤起代碼,從http server解析請求到刷快照落盤在到http server回包,以代碼為次元生成以下流程圖:

從圖中可以看出,etcd的狀态機完全依賴go語言中的channel。
server接受到請求後封裝成MsgProc包通過管道發送給本程序,注冊一個管道等到程序處理完回包。
raft commit請求後,構造一個ready信号給管道,server接受到管道後,寫wal, 判斷是否需要寫快照,再構造applyc信号到管道,觸發請求應用到存儲層store, store更新後打包回包,喚醒之前等待處理完成的管道,回包給client。
從一個空server啟動raft的流程圖:
收到MsgProc請求,強一緻性情況下:
Leader: 走raft流程
Follower: 轉發給Leader
Candidate: 丢棄
其他細節根據代碼和算法文檔不再累述。