摘要:而源碼解析系列文章則是會從源碼層面給大家抽絲剝繭,讓大家知道我們內(nèi)部到底是如何實現(xiàn)的。我們希望通過該源碼解析系列,能讓大家對有一個更深刻的理解。
作者:唐劉
TiKV 是一個支持事務的分布式 Key-Value 數(shù)據(jù)庫,有很多社區(qū)開發(fā)者基于 TiKV 來開發(fā)自己的應用,譬如 titan、tidis。尤其是在 TiKV 成為 CNCF 的 Sandbox 項目之后,吸引了越來越多開發(fā)者的目光,很多同學都想?yún)⑴c到 TiKV 的研發(fā)中來。這時候,就會遇到兩個比較大的攔路虎:
Rust 語言:眾所周知,TiKV 是使用 Rust 語言來進行開發(fā)的,而 Rust 語言的學習難度相對較高,有些人認為其學習曲線大于 C++,所以很多同學在這一步就直接放棄了。
文檔:最開始 TiKV 是作為 HTAP 數(shù)據(jù)庫 TiDB 的一個底層存儲引擎設計并開發(fā)出來的,屬于內(nèi)部系統(tǒng),缺乏詳細的文檔,以至于同學們不知道 TiKV 是怎么設計的,以及代碼為什么要這么寫。
對于第一個問題,我們內(nèi)部正在制作一系列的 Rust 培訓課程,由 Rust 作者以及 Rust 社區(qū)知名的開發(fā)者親自操刀,預計會在今年第一季度對外發(fā)布。希望通過該課程的學習,大家能快速入門 Rust,使用 Rust 開發(fā)自己的應用。
而對于第二個問題,我們會啟動 《TiKV 源碼解析系列文章》以及 《Deep Dive TiKV 系列文章》計劃,在《Deep Dive TiKV 系列文章》中,我們會詳細介紹與解釋 TiKV 所使用技術的基本原理,譬如 Raft 協(xié)議的說明,以及我們是如何對 Raft 做擴展和優(yōu)化的。而 《TiKV 源碼解析系列文章》則是會從源碼層面給大家抽絲剝繭,讓大家知道我們內(nèi)部到底是如何實現(xiàn)的。我們希望,通過這兩個系列,能讓大家對 TiKV 有更深刻的理解,再加上 Rust 培訓,能讓大家很好的參與到 TiKV 的開發(fā)中來。
結構本篇文章是《TiKV 源碼解析系列文章》的序篇,會簡單的給大家講一下 TiKV 的基本模塊,讓大家對這個系統(tǒng)有一個整體的了解。
要理解 TiKV,只是了解 https://github.com/tikv/tikv 這一個項目是遠遠不夠的,通常,我們也需要了解很多其他的項目,包括但不限于:
https://github.com/pingcap/raft-rs
https://github.com/pingcap/rust-prometheus
https://github.com/pingcap/rust-rocksdb
https://github.com/pingcap/fail-rs
https://github.com/pingcap/rocksdb
https://github.com/pingcap/grpc-rs
https://github.com/pingcap/pd
在這個系列里面,我們首先會從 TiKV 使用的周邊庫開始介紹,然后介紹 TiKV,最后會介紹 PD。下面簡單來說下我們的一些介紹計劃。
Storage EngineTiKV 現(xiàn)在使用 RocksDB 作為底層數(shù)據(jù)存儲方案。在 pingcap/rust-rocksdb 這個庫里面,我們會簡單說明 Rust 是如何通過 Foreign Function Interface (FFI) 來跟 C library 進行交互,以及我們是如何將 RocksDB 的 C API 封裝好給 Rust 使用的。
另外,在 pingcap/rocksdb 這個庫里面,我們會詳細的介紹我們自己研發(fā)的 Key-Value 分離引擎 - Titan,同時也會讓大家知道如何使用 RocksDB 對外提供的接口來構建自己的 engine。
RaftTiKV 使用的是 Raft 一致性協(xié)議。為了保證算法的正確性,我們直接將 etcd 的 Go 實現(xiàn) port 成了 Rust。在 pingcap/raft-rs,我們會詳細介紹 Raft 的選舉,Log 復制,snapshot 這些基本的功能是如何實現(xiàn)的。
另外,我們還會介紹對 Raft 的一些優(yōu)化,譬如 pre-vote,check quorum 機制,batch 以及 pipeline。
最后,我們會說明如何去使用這個 Raft 庫,這樣大家就能在自己的應用里面集成 Raft 了。
gRPCTiKV 使用的是 gRPC 作為通訊框架,我們直接把 Google C gRPC 庫封裝在 grpc-rs 這個庫里面。我們會詳細告訴大家如何去封裝和操作 C gRPC 庫,啟動一個 gRPC 服務。
另外,我們還會介紹如何使用 Rust 的 futures-rs 來將異步邏輯變成類似同步的方式來處理,以及如何通過解析 protobuf 文件來生成對應的 API 代碼。
最后,我們會介紹如何基于該庫構建一個簡單的 gRPC 服務。
PrometheusTiKV 使用 Prometheus 作為其監(jiān)控系統(tǒng), rust-prometheus 這個庫是 Prometheus 的 Rust client。在這個庫里面,我們會介紹如果支持不同的 Prometheus 的數(shù)據(jù)類型(Coutner,Gauge,Historgram)。
另外,我們會重點介紹我們是如何通過使用 Rust 的 Macro 來支持 Prometheus 的 Vector metrics 的。
最后,我們會介紹如何在自己的項目里面集成 Prometheus client,將自己的 metrics 存到 Prometheus 里面,方便后續(xù)分析。
FailFail 是一個錯誤注入的庫。通過這個庫,我們能很方便的在代碼的某些地方加上 hook,注入錯誤,然后在系統(tǒng)運行的時候觸發(fā)相關的錯誤,看系統(tǒng)是否穩(wěn)定。
我們會詳細的介紹 Fail 是如何通過 macro 來注入錯誤,會告訴大家如何添加自己的 hook,以及在外面進行觸發(fā)
TiKVTiKV 是一個非常復雜的系統(tǒng),這塊我們會重點介紹,主要包括:
Raftstore,該模塊里面我們會介紹 TiKV 如何使用 Raft,如何支持 Multi-Raft。
Storage,該模塊里面我們會介紹 Multiversion concurrency control (MVCC),基于 Percolator 的分布式事務的實現(xiàn),數(shù)據(jù)在 engine 里面的存儲方式,engine 操作相關的 API 等。
Server,該模塊我們會介紹 TiKV 的 gRPC API,以及不同函數(shù)執(zhí)行流程。
Coprocessor,該模塊我們會詳細介紹 TiKV 是如何處理 TiDB 的下推請求的,如何通過不同的表達式進行數(shù)據(jù)讀取以及計算的。
PD,該模塊我們會介紹 TiKV 是如何跟 PD 進行交互的。
Import,該模塊我們會介紹 TiKV 如何處理大量數(shù)據(jù)的導入,以及如何跟 TiDB 數(shù)據(jù)導入工具 lightning 交互的。
Util,該模塊我們會介紹一些 TiKV 使用的基本功能庫。
PDPD 用來負責整個 TiKV 的調(diào)度,我們會詳細的介紹 PD 內(nèi)部是如何使用 etcd 來進行元數(shù)據(jù)存取和高可用支持,也會介紹 PD 如何跟 TiKV 交互,如何生成全局的 ID 以及 timestamp。
最后,我們會詳細的介紹 PD 提供的 scheduler,以及不同的 scheudler 所負責的事情,讓大家能通過配置 scheduler 來讓系統(tǒng)更加的穩(wěn)定。
小結上面簡單的介紹了源碼解析涉及的模塊,還有一些模塊譬如 https://github.com/tikv/client-rust 仍在開發(fā)中,等完成之后我們也會進行源碼解析。
我們希望通過該源碼解析系列,能讓大家對 TiKV 有一個更深刻的理解。當然,TiKV 的源碼也是一直在不停的演化,我們也會盡量保證文檔的及時更新。
最后,歡迎大家參與 TiKV 的開發(fā)。
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/17894.html
閱讀 4391·2021-11-19 09:59
閱讀 3318·2021-10-12 10:12
閱讀 2630·2021-09-22 15:25
閱讀 3321·2019-08-30 15:55
閱讀 1182·2019-08-29 11:27
閱讀 1463·2019-08-28 18:06
閱讀 2736·2019-08-26 13:41
閱讀 2554·2019-08-26 13:41