做者:唐劉git
TiKV 是一個支持事務的分佈式 Key-Value 數據庫,有不少社區開發者基於 TiKV 來開發本身的應用,譬如 titan、tidis。尤爲是在 TiKV 成爲 CNCF 的 Sandbox 項目以後,吸引了愈來愈多開發者的目光,不少同窗都想參與到 TiKV 的研發中來。這時候,就會遇到兩個比較大的攔路虎:github
對於第一個問題,咱們內部正在製做一系列的 Rust 培訓課程,由 Rust 做者以及 Rust 社區知名的開發者親自操刀,預計會在今年第一季度對外發布。但願經過該課程的學習,你們能快速入門 Rust,使用 Rust 開發本身的應用。算法
而對於第二個問題,咱們會啓動 《TiKV 源碼解析系列文章》以及 《Deep Dive TiKV 系列文章》計劃,在《Deep Dive TiKV 系列文章》中,咱們會詳細介紹與解釋 TiKV 所使用技術的基本原理,譬如 Raft 協議的說明,以及咱們是如何對 Raft 作擴展和優化的。而 《TiKV 源碼解析系列文章》則是會從源碼層面給你們抽絲剝繭,讓你們知道咱們內部究竟是如何實現的。咱們但願,經過這兩個系列,能讓你們對 TiKV 有更深入的理解,再加上 Rust 培訓,能讓你們很好的參與到 TiKV 的開發中來。數據庫
本篇文章是《TiKV 源碼解析系列文章》的序篇,會簡單的給你們講一下 TiKV 的基本模塊,讓你們對這個系統有一個總體的瞭解。api
要理解 TiKV,只是瞭解 https://github.com/tikv/tikv 這一個項目是遠遠不夠的,一般,咱們也須要了解不少其餘的項目,包括但不限於:框架
在這個系列裏面,咱們首先會從 TiKV 使用的周邊庫開始介紹,而後介紹 TiKV,最後會介紹 PD。下面簡單來講下咱們的一些介紹計劃。異步
TiKV 如今使用 RocksDB 做爲底層數據存儲方案。在 pingcap/rust-rocksdb 這個庫裏面,咱們會簡單說明 Rust 是如何經過 Foreign Function Interface (FFI) 來跟 C library 進行交互,以及咱們是如何將 RocksDB 的 C API 封裝好給 Rust 使用的。分佈式
另外,在 pingcap/rocksdb 這個庫裏面,咱們會詳細的介紹咱們本身研發的 Key-Value 分離引擎 - Titan,同時也會讓你們知道如何使用 RocksDB 對外提供的接口來構建本身的 engine。函數
TiKV 使用的是 Raft 一致性協議。爲了保證算法的正確性,咱們直接將 etcd 的 Go 實現 port 成了 Rust。在 pingcap/raft-rs,咱們會詳細介紹 Raft 的選舉,Log 複製,snapshot 這些基本的功能是如何實現的。工具
另外,咱們還會介紹對 Raft 的一些優化,譬如 pre-vote,check quorum 機制,batch 以及 pipeline。
最後,咱們會說明如何去使用這個 Raft 庫,這樣你們就能在本身的應用裏面集成 Raft 了。
TiKV 使用的是 gRPC 做爲通信框架,咱們直接把 Google C gRPC 庫封裝在 grpc-rs 這個庫裏面。咱們會詳細告訴你們如何去封裝和操做 C gRPC 庫,啓動一個 gRPC 服務。
另外,咱們還會介紹如何使用 Rust 的 futures-rs 來將異步邏輯變成相似同步的方式來處理,以及如何經過解析 protobuf 文件來生成對應的 API 代碼。
最後,咱們會介紹如何基於該庫構建一個簡單的 gRPC 服務。
TiKV 使用 Prometheus 做爲其監控系統, rust-prometheus 這個庫是 Prometheus 的 Rust client。在這個庫裏面,咱們會介紹若是支持不一樣的 Prometheus 的數據類型(Coutner,Gauge,Historgram)。
另外,咱們會重點介紹咱們是如何經過使用 Rust 的 Macro 來支持 Prometheus 的 Vector metrics 的。
最後,咱們會介紹如何在本身的項目裏面集成 Prometheus client,將本身的 metrics 存到 Prometheus 裏面,方便後續分析。
Fail 是一個錯誤注入的庫。經過這個庫,咱們能很方便的在代碼的某些地方加上 hook,注入錯誤,而後在系統運行的時候觸發相關的錯誤,看系統是否穩定。
咱們會詳細的介紹 Fail 是如何經過 macro 來注入錯誤,會告訴你們如何添加本身的 hook,以及在外面進行觸發
TiKV 是一個很是複雜的系統,這塊咱們會重點介紹,主要包括:
PD 用來負責整個 TiKV 的調度,咱們會詳細的介紹 PD 內部是如何使用 etcd 來進行元數據存取和高可用支持,也會介紹 PD 如何跟 TiKV 交互,如何生成全局的 ID 以及 timestamp。
最後,咱們會詳細的介紹 PD 提供的 scheduler,以及不一樣的 scheudler 所負責的事情,讓你們能經過配置 scheduler 來讓系統更加的穩定。
上面簡單的介紹了源碼解析涉及的模塊,還有一些模塊譬如 https://github.com/tikv/client-rust 仍在開發中,等完成以後咱們也會進行源碼解析。
咱們但願經過該源碼解析系列,能讓你們對 TiKV 有一個更深入的理解。固然,TiKV 的源碼也是一直在不停的演化,咱們也會盡可能保證文檔的及時更新。
最後,歡迎你們參與 TiKV 的開發。