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

作者:申砾

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏PHP在线

鸟哥:写在 PHP 7 发布之际一些话

做开源也有4, 5年的时间了, 从最初的Yaf, 到今天的PHP7, 我参与的项目越来越多, 使用我代码的用户也越来越多, 明天就要发布的PHP7, 绝对是我从...

28560
来自专栏美丽应用

关于本站

13250
来自专栏大数据和云计算技术

大数据和云计算技术周报(第57期)

“大数据” 三个字其实是个marketing语言,从技术角度看,包含范围很广,计算、存储、网络都涉及,知识点广、学习难度高。

14230
来自专栏PPV课数据科学社区

盘点互联网巨头奉献的十大开源安全工具

Facebook等大型互联网公司推动的服务器与数据中心、大数据工具的开源化项目类似,当大型互联网公司们在超大规模基础设施运营方面面临的挑战超出技术厂商的能力时,...

37880
来自专栏Java架构师学习

Java开发技术大揭底——让你认知自己技术上的缺陷,成为架构师一、分布式架构体系二、微服务架构三、阅读源码、分析源码四、工具的使用五、性能优化

一、分布式架构体系 分布式怎么来的。传统的电信、银行业,当业务量大了之后,普通服务器CPU/IO/网络到了100%,请求太慢怎么办?最直接的做法,升级硬件,反正...

31790
来自专栏web前端教室

面试时最好把技术和业务结合起来说

前几天聊到了面试的情况,群里一个同学问怎么面试好。说是去一个朋友的儿子开的公司,我说这都有熟人了,就直接去呗。这同学还是让我帮出出主意,当时我也想不出来什么具体...

34480
来自专栏智能算法

总结:2016年编程方面的主流趋势

TechCrunch在去年一月时曾发布过一篇文章,预测2016年编程方面的主要趋势,但软件开发的世界总是变幻莫测,很难明确预测到会有哪些全新的开发语言、框架以及...

352100
来自专栏数据和云

DBA入门之路:关于日常工作的建议

今天上午在恩墨学院进行了一个简短的分享,引用了多年前我的一页PPT,其中记录了我对DBA日常工作的建议。 虽然这7点内容来自多年以前的总结,但是在今天仍然具有指...

33250
来自专栏灯塔大数据

同样是编程,百万年薪和十万年薪的区别在这里

导读:编程语言有很多,但并非每一种的需求或工资都相同。人工智能和机器学习走热,让 Python 从众多编程语言中脱颖而出。本文将综合各种信源,比较与不同编程语言...

39990
来自专栏后端技术探索

php7今天发布正式版!!看鸟哥怎么说的

php7终于来了,本号1个月前就已经编译了RC版本,体验了一番新特性,除了兴奋,也转发一下鸟哥昨天在他公众号发表的一片文章《写在php7发布之际的一些话》,来帮...

11010

扫码关注云+社区

领取腾讯云代金券