etcd原始碼解析之V2server和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: 丟棄
其他細節根據程式碼和演算法文件不再累述。
相關文章
- etcd套路(二)etcd核心之raft協議Raft協議
- etcd學習(6)-etcd實現raft原始碼解讀Raft原始碼
- ETCD核心機制解析
- TiKV 原始碼解析系列 – Raft 的優化原始碼Raft優化
- TiKV 原始碼解析系列 - Raft 的優化原始碼Raft優化
- consul 原始碼解析(一)raft 協議實現原始碼Raft協議
- etcd-raft-儲存分析Raft
- MySQL核心原始碼解讀-SQL解析之解析器淺析MySql原始碼
- 玩轉直播系列之RTMP協議和原始碼解析(2)協議原始碼
- 【轉】編譯Android系統原始碼和核心原始碼編譯Android原始碼
- webpack核心模組tapable原始碼解析Web原始碼
- Glide原始碼解析四(解碼和轉碼)IDE原始碼
- spark的基本運算元使用和原始碼解析Spark原始碼
- NIO框架之MINA原始碼解析(二):mina核心引擎框架原始碼
- Laravel核心解讀–Session原始碼解析LaravelSession原始碼
- Spring原始碼系列:核心概念解析Spring原始碼
- Dubbo原理和原始碼解析之服務引用原始碼
- MySQL核心原始碼解讀-SQL解析一MySql原始碼
- jQuery原始碼解析之clone()jQuery原始碼
- jQuery原始碼解析之position()jQuery原始碼
- Vue原始碼解析之parseVue原始碼
- LevelDB 原始碼解析之 Arena原始碼
- Dubbo原始碼解析之SPI原始碼
- Floyd&Raft的原始碼分析(三)Raft原始碼
- etcd raft 處理流程圖系列1-raftexampleRaft流程圖
- etcd中watch原始碼解讀原始碼
- LevelDB 原始碼解析之 Varint 編碼原始碼
- etcd學習(5)-etcd的Raft一致性演算法原理Raft演算法
- Spring原始碼解析02:Spring IOC容器之XmlBeanFactory啟動流程分析和原始碼解析Spring原始碼XMLBean
- spark核心(下)——job任務提交原始碼解析Spark原始碼
- Laravel 核心——IoC 服務容器原始碼解析(伺服器解析)Laravel原始碼伺服器
- Android 原始碼分析之 EventBus 的原始碼解析Android原始碼
- Spring原始碼之IOC(一)BeanDefinition原始碼解析Spring原始碼Bean
- Myth原始碼解析系列之五- 服務啟動原始碼解析原始碼
- Flutter之Navigator原始碼解析Flutter原始碼
- jQuery原始碼解析之replaceWith()/unwrap()jQuery原始碼
- Java集合之Hashtable原始碼解析Java原始碼
- Java集合之ArrayList原始碼解析Java原始碼