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

2021-09-12 23:54:18 字數 3064 閱讀 8069

tikv 是乙個支援事務的分布式 key-value 資料庫,有很多社群開發者基於 tikv 來開發自己的應用,譬如 titan、tidis。尤其是在 tikv 成為 cncf 的 sandbox 專案之後,吸引了越來越多開發者的目光,很多同學都想參與到 tikv 的研發中來。這時候,就會遇到兩個比較大的攔路虎:

rust 語言:眾所周知,tikv 是使用 rust 語言來進行開發的,而 rust 語言的學習難度相對較高,有些人認為其學習曲線大於 c++,所以很多同學在這一步就直接放棄了。

文件:最開始 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 使用的周邊庫開始介紹,然後介紹 tikv,最後會介紹 pd。下面簡單來說下我們的一些介紹計畫。

tikv 現在使用 rocksdb 作為底層資料儲存方案。在 pingcap/rust-rocksdb 這個庫裡面,我們會簡單說明 rust 是如何通過 foreign function inte***ce (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 是乙個非常複雜的系統,這塊我們會重點介紹,主要包括:

raftstore,該模組裡面我們會介紹 tikv 如何使用 raft,如何支援 multi-raft。

storage,該模組裡面我們會介紹 multiversion concurrency control (mvcc),基於 percolator 的分布式事務的實現,資料在 engine 裡面的儲存方式,engine 操作相關的 api 等。

server,該模組我們會介紹 tikv 的 grpc api,以及不同函式執行流程。

coprocessor,該模組我們會詳細介紹 tikv 是如何處理 tidb 的下推請求的,如何通過不同的表示式進行資料讀取以及計算的。

pd,該模組我們會介紹 tikv 是如何跟 pd 進行互動的。

import,該模組我們會介紹 tikv 如何處理大量資料的匯入,以及如何跟 tidb 資料匯入工具 lightning 互動的。

util,該模組我們會介紹一些 tikv 使用的基本功能庫。

pd 用來負責整個 tikv 的排程,我們會詳細的介紹 pd 內部是如何使用 etcd 來進行元資料訪問和高可用支援,也會介紹 pd 如何跟 tikv 互動,如何生成全域性的 id 以及 timestamp。

最後,我們會詳細的介紹 pd 提供的 scheduler,以及不同的 scheudler 所負責的事情,讓大家能通過配置 scheduler 來讓系統更加的穩定。

上面簡單的介紹了原始碼解析涉及的模組,還有一些模組譬如 仍在開發中,等完成之後我們也會進行原始碼解析。

我們希望通過該原始碼解析系列,能讓大家對 tikv 有乙個更深刻的理解。當然,tikv 的原始碼也是一直在不停的演化,我們也會盡量保證文件的及時更新。

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

tikv 是乙個支援事務的分布式 key value 資料庫,有很多社群開發者基於 tikv 來開發自己的應用,譬如 titan tidis。尤其是在 tikv 成為 cncf 的 sandbox 專案之後,吸引了越來越多開發者的目光,很多同學都想參與到 tikv 的研發中來。這時候,就會遇到兩個比...

TiDB 原始碼閱讀系列文章(一)序

tidb 目前獲得了廣泛的關注,特別是一些技術愛好者,希望能夠參與這個專案。由於整個系統的複雜性,很多人並不能很好的理解整個專案。我們希望通過這一系列文章自頂向下,由淺入深,講述 tidb 的技術原理以及實現細節,幫助大家掌握這個專案。一些網路 作業系統的常識 除了上述比較通用的知識之外,還希望讀者...

BlockingQueue系列原始碼解析

說明 blockingqueue是阻塞的有界佇列,典型的生產者消費者模式,相對的是無界佇列linkedtransferqueue。一.子類 二.公共api offer e e 將給定的元素設定到佇列中,如果設定成功返回true,否則返回false.e的值不能為空,否則丟擲空指標異常。offer e ...