TiDB 源碼閱讀系列文章(一)序
作者: @申礫
在 TiDB DevCon2018 上,我們對外宣布了 TiDB 源碼閱讀分享活動,承諾對外發布一系列文章以及視頻幫助大家理解 TiDB 源碼。大家一直很關心這項活動的時間,而我們忙於新版本的開發,一直不得閑。在春節放假期間,終於有時間開始動手寫這個系列。
為什麼我們要做這件事情?事情的起因是隨著 TiDB 項目逐漸發展,代碼日漸複雜,我們發現新入職的同學越來越難上手修改代碼。我們萌生了做內部培訓的想法,通過錄製視頻、寫教程的方式,加快新同事融入的速度,做了幾次之後,我們發現效果不錯,除了新同學有不少收穫之外,老同志們也了解了之前自己並不熟悉的模塊,大家都有收穫。我們想到開源社區面臨同樣的問題,也可以通過這項工作收益,所以萌生了把這個活動做細做大的想法,於是有了這項活動。
TiDB 作為一個開源項目,在開發過程中得到了社區的廣泛關注,很多人在試用或者已經在線用 TiDB,並給出了很多很好的建議或者是問題反饋,幫助我們把項目做的更好。對於項目開發是這樣,那麼對於資料庫技術的研究,也是這樣。我們非常希望能和對資料庫研究者、愛好者交流,我們在過去的兩年中組織過近百場技術 Meetup 或者 Talk,在和大家的交流過程中,我們發現國內的資料庫技術水平非常好,在交流過程中總能碰撞出火花。通過這項活動,我們希望能和大家做更深入的交流,通過源碼閱讀,讓 TiDB 與大家 『坦誠相見』。
前言
學習一種系統最好的方法是閱讀一些經典著作並研究一個開源項目,資料庫也不例外。單機資料庫領域有很多好的開源項目,MySQL、PostgreSQL 是其中知名度最高的兩個,不少人看過這兩個項目的代碼。我們在剛做資料庫的時候也看過不少 MySQL、PG 的代碼,從中受益良多。但是分散式資料庫方面,好的開源項目並不多,有一些知名的系統並不開源,比如 F1/Spanner,還有一些系統疏於維護或者是從開源變成閉源,比如被 Apple 收購後閉源的 FoundationDB(還好當初 clone 了一份代碼 :),參見這裡,我們在內部或者外部也組織過一些開源系統代碼閱讀的 Talk,不過並不系統。
TiDB 目前獲得了廣泛的關注,特別是一些技術愛好者,希望能夠參與這個項目。由於整個系統的複雜性,很多人並不能很好的理解整個項目。我們希望通過這一系列文章自頂向下,由淺入深,講述 TiDB 的技術原理以及實現細節,幫助大家掌握這個項目。
背景知識
本系列文章會聚焦在 TiDB 自身,讀者需要有一些基本的知識,包括但不限於:
- Go 語言,不需要精通,但是至少要能讀懂代碼,知道 Goroutine、Channel、Sync 等組件的使用
- 資料庫基礎知識,了解一個單機資料庫由哪些功能、哪些組件
- SQL 基礎知識,知道基本的 DDL、DML 語句,事務的基本常識
- 基本的後端服務知識,比如如何啟動一個後台進程、RPC 是如何工作的
- 一些網路、操作系統的常識
- 總體而言,讀者需要了解基本的資料庫知識以及能看懂 Go 語言程序,我相信這一點對於大多數同學來說,並不是問題。
除了上述比較通用的知識之外,還希望讀者能夠看一下我之前寫過的三篇文章([說存儲],[講計算],[論調度]),了解一些 TiDB 的基本原理。
讀者可以有哪些收穫
通過這一系列文章可以獲得什麼?首先是通過了解 TiDB 的基本原理,明白一個關係型資料庫的基本原理;其次通過閱讀 TiDB 的代碼,知道一個資料庫是如何實現的,將教科書中看到的資料庫原理落地。第三,了解一個資料庫的實現對其行為的影響,可以更好的理解資料庫為什麼是這樣的,並推廣到其他的資料庫,相信對讀者用好其他資料庫也有幫助。第四,可以看到一個大型的分散式系統是如何設計、構建以及優化的。最後,大家理解了 TiDB 的代碼後,如果後續工作中有需求,可以引用 TiDB 的代碼,目前一些公司已經在自己的產品中用到了 TiDB 的部分模塊,例如 Parser。
內容概要
首先明確一個概念,一般來說我們提到 TiDB 是指整個分散式資料庫,包括 tidb-server/pd-server/tikv-server 三大組件。由於整個項目比較複雜,又涉及到兩種編程語言(Golang 和 Rust),想了解資料庫相關的東西實際上只需要看 tidb-server 的代碼即可。tikv-server 上面的計算相關邏輯也能夠在 tidb-server 的代碼中找到, 在 tidb-server 的代碼目錄下,可以找到一個叫 mock-tikv 的組件,這裡利用本地存儲模擬 tikv-server 的行為,這裡能夠找到不少和 tikv-server 上面一樣的代碼邏輯,特別是 Coprocessor 模塊的邏輯,tikv-server 上的邏輯是從 mock-tikv 上移植過去的。所以本系列文章主要介紹 tidb-server 的代碼,除非特別說明,文章中提到的 TiDB 就是指 tidb-server。
這一系列文章會按照資料庫的組件以及 SQL 處理的常見流程,講解 Protocol 層,以及Parser、Preprocess、Optimizer、Executor、Storage Engine 等重要模塊。從整體上分為兩大部分,上半部分包括如下四篇文章:
- 第一篇文章介紹整體的架構,知道 TiDB 有哪些模塊,分別是做什麼的,從哪裡入手比較好,哪些可以忽略,哪些需要仔細閱讀。
- 第二篇文章從 SQL 處理流程出發,介紹哪裡是入口,需要做哪些操作,知道一個 SQL 是從哪裡進來的,在哪裡處理,並從哪裡返回。
- 第三篇文章從代碼本身出發,介紹如何看懂某個模塊的代碼。
- 第四篇文章會引入一個例子,介紹如何讓 TiDB 支持一個新的語法。
希望大家閱讀完這部分後,對 TiDB 有了一定的基礎,能夠看懂大體流程,遇到問題或者想給 TiDB 添加一個新 Feature 的時候,不至於無從下手。
下半部分會講解的更深入,針對 TiDB 的每個重要模塊進行講解,包括優化器的詳細實現、邏輯優化/物理優化是如何做的、重要的物理運算元的實現等等。希望大家閱讀後能對 TiDB 有深入的理解,能夠完全理解 TiDB 的代碼。這部分會比上半部分多很多,具體數量尚未定。
這一系列文章也會作為 PingCAP 公司的內部培訓資料,我們希望社區也能從中受益。所有文章會發布在 PingCAP 的微信公眾號(微信號:pingcap2015)、知乎專欄以及PingCAP 的官方博客,歡迎大家通過這些渠道關注。
文章之外
除了這一系列文章之外,我們還有一個內部培訓視頻的開源計劃,目前內部的源碼講解活動已經開展了 4 次,形式是由某一位同事花一周時間研究一個自己不熟悉的模塊,然後用一個小時的時間給其他同事講解。目的是讓每個人了解所有的模塊。這個培訓還會繼續下去,每次都錄製了視頻,我們計劃將這些視頻進行剪輯和整理,然後開放出來。近期會邀請一些社區貢獻者做內部測試,然後根據他們意見做一些調整,再開放給整個社區。
時間計劃
這一系列文章剛開始提筆撰寫,目前只是有一個大致的規劃,我們會儘可能保證按照計劃 Release 出來各篇文章。3 月中旬之前會發出上半部分的幾篇文章,後續逐漸放出下半部分的文章。
至於視頻部分,要看剪輯以及測試的進度,我們會給出預告。
一些期望
我們並沒有編寫系列教程的經驗,希望在逐漸放出文章的過程中,能收到讀者的反饋,指導我們不斷改進這項工作,最終能夠一起把這件事情做好。在整個活動過程中,我們會密切關注反饋,隨時調整。
除此之外,我們希望能有一起志同道合的人參與到 TiDB 的開發中來,可以通過開源社區,甚至是肉身投奔 :)。
另外這一系列文章的目的在於幫助讀者更好的理解 TiDB 源碼,而不是替代閱讀源碼的過程。希望讀者能在閱讀源碼的時候,以這些文章為參考,而不是只讀文章,不看代碼。切記『紙上得來終覺淺,絕知此事要 PR』。
推薦閱讀:
※從Chrome源碼看HTTPS
※LevelDB源碼解析7. 日誌格式
※LevelDB源碼解析8. 讀取日誌
※TiDB 源碼閱讀系列文章(三)SQL 的一生
※ROS導航包源碼學習0 --- 初衷