在 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』。
做者:申砾