TiDB 源码阅读系列文章(一)序
原创: 申砾 PingCAP 2018-02-28
在 TiDB DevCon2018 上,我们对外宣布了 TiDB 源码阅读分享活动,承诺对外发布一系列文章以及视频帮助大家理解 TiDB 源码。大家一直很关心这项活动的时间,而我们忙于新版本的开发,一直不得闲。在春节放假期间,终于有时间开始动手写这个系列。
为什么我们要做这件事情?事情的起因是随着 TiDB 项目逐渐发展,代码日渐复杂,我们发现新入职的同学越来越难上手修改代码。我们萌生了做内部培训的想法,通过录制视频、写教程的方式,加快新同事融入的速度,做了几次之后,我们发现效果不错,除了新同学有不少收获之外,老同志们也了解了之前自己并不熟悉的模块,大家都有收获。我们想到开源社区面临同样的问题,也可以通过这项工作收益,所以萌生了把这个活动做细做大的想法,于是有了这项活动。
TiDB 作为一个开源项目,在开发过程中得到了社区的广泛关注,很多人在试用或者已经在线用 TiDB,并给出了很多很好的建议或者是问题反馈,帮助我们把项目做的更好。对于项目开发是这样,那么对于数据库技术的研究,也是这样。我们非常希望能和对数据库研究者、爱好者交流,我们在过去的两年中组织过近百场技术 Meetup 或者 Talk,在和大家的交流过程中,我们发现国内的数据库技术水平非常好,在交流过程中总能碰撞出火花。通过这项活动,我们希望能和大家做更深入的交流,通过源码阅读,让 TiDB 与大家 『坦诚相见』。
前言
学习一种系统最好的方法是阅读一些经典著作并研究一个开源项目,数据库也不例外。单机数据库领域有很多好的开源项目,MySQL、PostgreSQL 是其中知名度最高的两个,不少人看过这两个项目的代码。我们在刚做数据库的时候也看过不少 MySQL、PG 的代码,从中受益良多。但是分布式数据库方面,好的开源项目并不多,有一些知名的系统并不开源,比如 F1/Spanner,还有一些系统疏于维护或者是从开源变成闭源,比如被 Apple 收购后闭源的 FoundationDB(还好当初 clone 了一份代码 :),参见这里(https://github.com/shenli/sql-layer),我们在内部或者外部也组织过一些开源系统代码阅读的 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 的行为,这里(https://github.com/pingcap/tidb/tree/source-code/store/mockstore/mocktikv)能够找到不少和 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 的微信公众号、知乎专栏(https://zhuanlan.zhihu.com/newsql)以及 PingCAP 的官方博客(https://pingcap.com/blog-cn/),欢迎大家通过这些渠道关注。
文章之外
除了这一系列文章之外,我们还有一个内部培训视频的开源计划,目前内部的源码讲解活动已经开展了 4 次,形式是由某一位同事花一周时间研究一个自己不熟悉的模块,然后用一个小时的时间给其他同事讲解。目的是让每个人了解所有的模块。这个培训还会继续下去,每次都录制了视频,我们计划将这些视频进行剪辑和整理,然后开放出来。近期会邀请一些社区贡献者做内部测试,然后根据他们意见做一些调整,再开放给整个社区。
时间计划
这一系列文章刚开始提笔撰写,目前只是有一个大致的规划,我们会尽可能保证按照计划 Release 出来各篇文章。3 月中旬之前会发出上半部分的几篇文章,后续逐渐放出下半部分的文章。
至于视频部分,要看剪辑以及测试的进度,我们会给出预告。
一些期望
我们并没有编写系列教程的经验,希望在逐渐放出文章的过程中,能收到读者的反馈,指导我们不断改进这项工作,最终能够一起把这件事情做好。在整个活动过程中,我们会密切关注反馈,随时调整。
除此之外,我们希望能有一起志同道合的人参与到 TiDB 的开发中来,可以通过开源社区,甚至是肉身投奔 :)。
另外这一系列文章的目的在于帮助读者更好的理解 TiDB 源码(https://github.com/pingcap/tidb),而不是替代阅读源码的过程。希望读者能在阅读源码的时候,以这些文章为参考,而不是只读文章,不看代码。切记『纸上得来终觉浅,绝知此事要 PR』。
延展阅读
TiDB 源码阅读系列文章(一)序的更多相关文章
- 【合集】TiDB 源码阅读系列文章
[合集]TiDB 源码阅读系列文章 (一)序 (二)初识 TiDB 源码 (三)SQL 的一生 (四)INSERT 语句概览 (五)TiDB SQL Parser 的实现 (六)Select 语句概览 ...
- DM 源码阅读系列文章(六)relay log 的实现
2019独角兽企业重金招聘Python工程师标准>>> 作者:张学程 本文为 DM 源码阅读系列文章的第六篇,在 上篇文章 中我们介绍了 binlog replication 处理单 ...
- Spring源码阅读系列总结
最近一段时间,粗略的查看了一下Spring源码,对Spring的两大核心和Spring的组件有了更深入的了解.同时在学习Spring源码时,得了解一些设计模式,不然阅读源码还是有一定难度的,所以一些重 ...
- JDK1.8源码阅读系列之三:Vector
本篇随笔主要描述的是我阅读 Vector 源码期间的对于 Vector 的一些实现上的个人理解,用于个人备忘,有不对的地方,请指出- 先来看一下 Vector 的继承图: 可以看出,Vector 的直 ...
- MyBatis 源码分析系列文章合集
1.简介 我从七月份开始阅读MyBatis源码,并在随后的40天内陆续更新了7篇文章.起初,我只是打算通过博客的形式进行分享.但在写作的过程中,发现要分析的代码太多,以至于文章篇幅特别大.在这7篇文章 ...
- MyBatis 源码分析系列文章导读
1.本文速览 本篇文章是我为接下来的 MyBatis 源码分析系列文章写的一个导读文章.本篇文章从 MyBatis 是什么(what),为什么要使用(why),以及如何使用(how)等三个角度进行了说 ...
- Spring AOP 源码分析系列文章导读
1. 简介 前一段时间,我学习了 Spring IOC 容器方面的源码,并写了数篇文章对此进行讲解.在写完 Spring IOC 容器源码分析系列文章中的最后一篇后,没敢懈怠,趁热打铁,花了3天时间阅 ...
- Spring IOC 容器源码分析系列文章导读
1. 简介 Spring 是一个轻量级的企业级应用开发框架,于 2004 年由 Rod Johnson 发布了 1.0 版本.经过十几年的迭代,现在的 Spring 框架已经非常成熟了.Spring ...
- SpringMVC源码阅读系列汇总
1.前言 1.1 导入 SpringMVC是基于Servlet和Spring框架设计的Web框架,做JavaWeb的同学应该都知道 本文基于Spring4.3.7源码分析,(不要被图片欺骗了,手动滑稽 ...
随机推荐
- [LeetCode] Read N Characters Given Read4 I & II
Read N Characters Given Read4 The API: int read4(char *buf) reads 4 characters at a time from a file ...
- Atitit gui界面ui技术发展史与未来趋势
Atitit gui界面ui技术发展史与未来趋势 1. Gui技术的发展,从像素自绘到native控件体系,再到dsl h51 1.1. 编程语言的发展 从机器语言,汇编语言到本地native语言(c ...
- JDK 1.6 写Webservice时,runtime modeler error: Wrapper class com.ws.jaxws.DoSomething is not found问题的解决办法
转自:http://blog.csdn.net/forandever/article/details/5276038 1.问题如下: Exception in thread "main&qu ...
- github pull request
https://stackoverflow.com/questions/14680711/how-to-do-a-github-pull-request https://help.github.com ...
- Linux的sysctl 命令参数详解
Linux内核通过/proc虚拟文件系统向用户导出内核信息,用户也可以通过/proc文件系统或通过sysctl命令动态配置内核.比如,如果我们想启动NAT,除了加载模块.配置防火墙外,还需要启动内核转 ...
- .net core 调用数字证书 使用X509Certificate2
.NET下面的 .netfromwork使用和asp.net core下使用方式不一样 配置文件中代码: public const string API_URL = "https://api ...
- [转]Web App 框架选择之百度&腾讯
百度的GMU GMU(Global Mobile UI)是百度前端通用组开发的移动端组件库,GMU是基于zepto的mobile UI组件库,提供webapp.pad端简单易用的UI组件.具有代码体积 ...
- 京东轮播图片的静态页面CSS3
效果图: index.html <!DOCTYPE html> <html> <head> <meta charset="utf-8"&g ...
- 每日英语:Apple Unveils New iPads
Apple Inc. 's answer to the increasingly cutthroat tablet-computer market: more product choices and ...
- 【C/C++】C语言复习笔记-17种小算法-解决实际问题
判断日期为一年中的第几天(考虑闰年) /* * 计算该日在本年中是第几天,注意闰年问题 * 以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天 * 特殊情况,闰年且输入月份大于3时 ...