TiDB 源码阅读系列文章(一)序

2018-03-01 10:37:50 +08:00
 PingCAP

在 TiDB DevCon2018 上,我们对外宣布了 TiDB 源码阅读分享活动,承诺对外发布一系列文章以及视频帮助大家理解 TiDB 源码。大家一直很关心这项活动的时间,而我们忙于新版本的开发,一直不得闲。在春节放假期间,终于有时间开始动手写这个系列。

为什么我们要做这件事情?事情的起因是随着 TiDB 项目逐渐发展,代码日渐复杂,我们发现新入职的同学越来越难上手修改代码。我们萌生了做内部培训的想法,通过录制视频、写教程的方式,加快新同事融入的速度,做了几次之后,我们发现效果不错,除了新同学有不少收获之外,老同志们也了解了之前自己并不熟悉的模块,大家都有收获。我们想到开源社区面临同样的问题,也可以通过这项工作收益,所以萌生了把这个活动做细做大的想法,于是有了这项活动。

TiDB 作为一个开源项目,在开发过程中得到了社区的广泛关注,很多人在试用或者已经在线用 TiDB,并给出了很多很好的建议或者是问题反馈,帮助我们把项目做的更好。对于项目开发是这样,那么对于数据库技术的研究,也是这样。我们非常希望能和对数据库研究者、爱好者交流,我们在过去的两年中组织过近百场技术 Meetup 或者 Talk,在和大家的交流过程中,我们发现国内的数据库技术水平非常好,在交流过程中总能碰撞出火花。通过这项活动,我们希望能和大家做更深入的交流,通过源码阅读,让 TiDB 与大家 『坦诚相见』。

前言

学习一种系统最好的方法是阅读一些经典著作并研究一个开源项目,数据库也不例外。单机数据库领域有很多好的开源项目,MySQL、PostgreSQL 是其中知名度最高的两个,不少人看过这两个项目的代码。我们在刚做数据库的时候也看过不少 MySQL、PG 的代码,从中受益良多。但是分布式数据库方面,好的开源项目并不多,有一些知名的系统并不开源,比如 F1/Spanner,还有一些系统疏于维护或者是从开源变成闭源,比如被 Apple 收购后闭源的 FoundationDB (还好当初 clone 了一份代码 :),参见 这里,我们在内部或者外部也组织过一些开源系统代码阅读的 Talk,不过并不系统。

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 』。

作者:申砾

846 次点击
所在节点    数据库
3 条回复
dryadent
2018-03-01 10:46:32 +08:00
支持,特别棒的活动
congeec
2018-03-01 10:52:57 +08:00
有 TiKV 的源码阅读么?先顶一波再说
Morriaty
2018-03-01 17:21:29 +08:00
资瓷

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/433795

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX