在 TiDB DevCon2018 上,咱們對外宣佈了 TiDB 源碼閱讀分享活動,承諾對外發布一系列文章以及視頻幫助你們理解 TiDB 源碼。你們一直很關心這項活動的時間,而咱們忙於新版本的開發,一直不得閒。在春節放假期間,終於有時間開始動手寫這個系列。
爲何咱們要作這件事情?事情的原由是隨着 TiDB 項目逐漸發展,代碼日漸複雜,咱們發現新入職的同窗愈來愈難上手修改代碼。咱們萌生了作內部培訓的想法,經過錄制視頻、寫教程的方式,加快新同事融入的速度,作了幾回以後,咱們發現效果不錯,除了新同窗有很多收穫以外,老同志們也瞭解了以前本身並不熟悉的模塊,你們都有收穫。咱們想到開源社區面臨一樣的問題,也能夠經過這項工做收益,因此萌生了把這個活動作細作大的想法,因而有了這項活動。git
TiDB 做爲一個開源項目,在開發過程當中獲得了社區的普遍關注,不少人在試用或者已經在線用 TiDB,並給出了不少很好的建議或者是問題反饋,幫助咱們把項目作的更好。對於項目開發是這樣,那麼對於數據庫技術的研究,也是這樣。咱們很是但願能和對數據庫研究者、愛好者交流,咱們在過去的兩年中組織過近百場技術 Meetup 或者 Talk,在和你們的交流過程當中,咱們發現國內的數據庫技術水平很是好,在交流過程當中總能碰撞出火花。經過這項活動,咱們但願能和你們作更深刻的交流,經過源碼閱讀,讓 TiDB 與你們 『坦誠相見』。github
學習一種系統最好的方法是閱讀一些經典著做並研究一個開源項目,數據庫也不例外。單機數據庫領域有不少好的開源項目,MySQL、PostgreSQL 是其中知名度最高的兩個,很多人看過這兩個項目的代碼。咱們在剛作數據庫的時候也看過很多 MySQL、PG 的代碼,從中受益良多。可是分佈式數據庫方面,好的開源項目並很少,有一些知名的系統並不開源,好比 F1/Spanner,還有一些系統疏於維護或者是從開源變成閉源,好比被 Apple 收購後閉源的 FoundationDB(還好當初 clone 了一份代碼 :),參見 這裏,咱們在內部或者外部也組織過一些開源系統代碼閱讀的 Talk,不過並不系統。sql
TiDB 目前得到了普遍的關注,特別是一些技術愛好者,但願可以參與這個項目。因爲整個系統的複雜性,不少人並不能很好的理解整個項目。咱們但願經過這一系列文章自頂向下,由淺入深,講述 TiDB 的技術原理以及實現細節,幫助你們掌握這個項目。數據庫
本系列文章會聚焦在 TiDB 自身,讀者須要有一些基本的知識,包括但不限於:編程
一些網絡、操做系統的常識後端
除了上述比較通用的知識以外,還但願讀者可以看一下我以前寫過的三篇文章(說存儲,講計算,論調度),瞭解一些 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 有了必定的基礎,可以看懂大致流程,遇到問題或者想給 TiDB 添加一個新 Feature 的時候,不至於無從下手。
下半部分會講解的更深刻,針對 TiDB 的每一個重要模塊進行講解,包括優化器的詳細實現、邏輯優化/物理優化是如何作的、重要的物理算子的實現等等。但願你們閱讀後能對 TiDB 有深刻的理解,可以徹底理解 TiDB 的代碼。這部分會比上半部分多不少,具體數量還沒有定。
這一系列文章也會做爲 PingCAP 公司的內部培訓資料,咱們但願社區也能從中受益。全部文章會發布在 PingCAP 的微信公衆號(微信號:pingcap2015)、知乎專欄以及 PingCAP 的官方博客,歡迎你們經過這些渠道關注。
除了這一系列文章以外,咱們還有一個內部培訓視頻的開源計劃,目前內部的源碼講解活動已經開展了 4 次,形式是由某一位同事花一週時間研究一個本身不熟悉的模塊,而後用一個小時的時間給其餘同事講解。目的是讓每一個人瞭解全部的模塊。這個培訓還會繼續下去,每次都錄製了視頻,咱們計劃將這些視頻進行剪輯和整理,而後開放出來。近期會邀請一些社區貢獻者作內部測試,而後根據他們意見作一些調整,再開放給整個社區。
這一系列文章剛開始提筆撰寫,目前只是有一個大體的規劃,咱們會盡量保證按照計劃 Release 出來各篇文章。3 月中旬以前會發出上半部分的幾篇文章,後續逐漸放出下半部分的文章。
至於視頻部分,要看剪輯以及測試的進度,咱們會給出預告。
咱們並無編寫系列教程的經驗,但願在逐漸放出文章的過程當中,能收到讀者的反饋,指導咱們不斷改進這項工做,最終可以一塊兒把這件事情作好。在整個活動過程當中,咱們會密切關注反饋,隨時調整。
除此以外,咱們但願能有一塊兒志同道合的人蔘與到 TiDB 的開發中來,能夠經過開源社區,甚至是肉身投奔 :)。
另外這一系列文章的目的在於幫助讀者更好的理解 TiDB 源碼,而不是替代閱讀源碼的過程。但願讀者能在閱讀源碼的時候,以這些文章爲參考,而不是隻讀文章,不看代碼。切記『紙上得來終覺淺,絕知此事要 PR』。
做者:申礫