TiKV 源碼解析系列文章(一)序

做者:唐劉git

TiKV 是一個支持事務的分佈式 Key-Value 數據庫,有不少社區開發者基於 TiKV 來開發本身的應用,譬如 titantidis。尤爲是在 TiKV 成爲 CNCFSandbox 項目以後,吸引了愈來愈多開發者的目光,不少同窗都想參與到 TiKV 的研發中來。這時候,就會遇到兩個比較大的攔路虎:github

  1. Rust 語言:衆所周知,TiKV 是使用 Rust 語言來進行開發的,而 Rust 語言的學習難度相對較高,有些人認爲其學習曲線大於 C++,因此不少同窗在這一步就直接放棄了。
  2. 文檔:最開始 TiKV 是做爲 HTAP 數據庫 TiDB 的一個底層存儲引擎設計並開發出來的,屬於內部系統,缺少詳細的文檔,以致於同窗們不知道 TiKV 是怎麼設計的,以及代碼爲何要這麼寫。

對於第一個問題,咱們內部正在製做一系列的 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。下面簡單來講下咱們的一些介紹計劃。異步

Storage Engine

TiKV 如今使用 RocksDB 做爲底層數據存儲方案。在 pingcap/rust-rocksdb 這個庫裏面,咱們會簡單說明 Rust 是如何經過 Foreign Function Interface (FFI) 來跟 C library 進行交互,以及咱們是如何將 RocksDB 的 C API 封裝好給 Rust 使用的。分佈式

另外,在 pingcap/rocksdb 這個庫裏面,咱們會詳細的介紹咱們本身研發的 Key-Value 分離引擎 - Titan,同時也會讓你們知道如何使用 RocksDB 對外提供的接口來構建本身的 engine。函數

Raft

TiKV 使用的是 Raft 一致性協議。爲了保證算法的正確性,咱們直接將 etcd 的 Go 實現 port 成了 Rust。在 pingcap/raft-rs,咱們會詳細介紹 Raft 的選舉,Log 複製,snapshot 這些基本的功能是如何實現的。工具

另外,咱們還會介紹對 Raft 的一些優化,譬如 pre-vote,check quorum 機制,batch 以及 pipeline。

最後,咱們會說明如何去使用這個 Raft 庫,這樣你們就能在本身的應用裏面集成 Raft 了。

gRPC

TiKV 使用的是 gRPC 做爲通信框架,咱們直接把 Google C gRPC 庫封裝在 grpc-rs 這個庫裏面。咱們會詳細告訴你們如何去封裝和操做 C gRPC 庫,啓動一個 gRPC 服務。

另外,咱們還會介紹如何使用 Rust 的 futures-rs 來將異步邏輯變成相似同步的方式來處理,以及如何經過解析 protobuf 文件來生成對應的 API 代碼。

最後,咱們會介紹如何基於該庫構建一個簡單的 gRPC 服務。

Prometheus

TiKV 使用 Prometheus 做爲其監控系統, rust-prometheus 這個庫是 Prometheus 的 Rust client。在這個庫裏面,咱們會介紹若是支持不一樣的 Prometheus 的數據類型(Coutner,Gauge,Historgram)。

另外,咱們會重點介紹咱們是如何經過使用 Rust 的 Macro 來支持 Prometheus 的 Vector metrics 的。

最後,咱們會介紹如何在本身的項目裏面集成 Prometheus client,將本身的 metrics 存到 Prometheus 裏面,方便後續分析。

Fail

Fail 是一個錯誤注入的庫。經過這個庫,咱們能很方便的在代碼的某些地方加上 hook,注入錯誤,而後在系統運行的時候觸發相關的錯誤,看系統是否穩定。

咱們會詳細的介紹 Fail 是如何經過 macro 來注入錯誤,會告訴你們如何添加本身的 hook,以及在外面進行觸發

TiKV

TiKV 是一個很是複雜的系統,這塊咱們會重點介紹,主要包括:

  1. Raftstore,該模塊裏面咱們會介紹 TiKV 如何使用 Raft,如何支持 Multi-Raft。
  2. Storage,該模塊裏面咱們會介紹 Multiversion concurrency control (MVCC),基於 Percolator 的分佈式事務的實現,數據在 engine 裏面的存儲方式,engine 操做相關的 API 等。
  3. Server,該模塊咱們會介紹 TiKV 的 gRPC API,以及不一樣函數執行流程。
  4. Coprocessor,該模塊咱們會詳細介紹 TiKV 是如何處理 TiDB 的下推請求的,如何經過不一樣的表達式進行數據讀取以及計算的。
  5. PD,該模塊咱們會介紹 TiKV 是如何跟 PD 進行交互的。
  6. Import,該模塊咱們會介紹 TiKV 如何處理大量數據的導入,以及如何跟 TiDB 數據導入工具 lightning 交互的。
  7. Util,該模塊咱們會介紹一些 TiKV 使用的基本功能庫。

PD

PD 用來負責整個 TiKV 的調度,咱們會詳細的介紹 PD 內部是如何使用 etcd 來進行元數據存取和高可用支持,也會介紹 PD 如何跟 TiKV 交互,如何生成全局的 ID 以及 timestamp。

最後,咱們會詳細的介紹 PD 提供的 scheduler,以及不一樣的 scheudler 所負責的事情,讓你們能經過配置 scheduler 來讓系統更加的穩定。

小結

上面簡單的介紹了源碼解析涉及的模塊,還有一些模塊譬如 https://github.com/tikv/client-rust 仍在開發中,等完成以後咱們也會進行源碼解析。

咱們但願經過該源碼解析系列,能讓你們對 TiKV 有一個更深入的理解。固然,TiKV 的源碼也是一直在不停的演化,咱們也會盡可能保證文檔的及時更新。

最後,歡迎你們參與 TiKV 的開發。

相關文章
相關標籤/搜索