原创: 申砾 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 源码阅读系列文章(一)序的更多相关文章

  1. 【合集】TiDB 源码阅读系列文章

    [合集]TiDB 源码阅读系列文章 (一)序 (二)初识 TiDB 源码 (三)SQL 的一生 (四)INSERT 语句概览 (五)TiDB SQL Parser 的实现 (六)Select 语句概览 ...

  2. DM 源码阅读系列文章(六)relay log 的实现

    2019独角兽企业重金招聘Python工程师标准>>> 作者:张学程 本文为 DM 源码阅读系列文章的第六篇,在 上篇文章 中我们介绍了 binlog replication 处理单 ...

  3. Spring源码阅读系列总结

    最近一段时间,粗略的查看了一下Spring源码,对Spring的两大核心和Spring的组件有了更深入的了解.同时在学习Spring源码时,得了解一些设计模式,不然阅读源码还是有一定难度的,所以一些重 ...

  4. JDK1.8源码阅读系列之三:Vector

    本篇随笔主要描述的是我阅读 Vector 源码期间的对于 Vector 的一些实现上的个人理解,用于个人备忘,有不对的地方,请指出- 先来看一下 Vector 的继承图: 可以看出,Vector 的直 ...

  5. MyBatis 源码分析系列文章合集

    1.简介 我从七月份开始阅读MyBatis源码,并在随后的40天内陆续更新了7篇文章.起初,我只是打算通过博客的形式进行分享.但在写作的过程中,发现要分析的代码太多,以至于文章篇幅特别大.在这7篇文章 ...

  6. MyBatis 源码分析系列文章导读

    1.本文速览 本篇文章是我为接下来的 MyBatis 源码分析系列文章写的一个导读文章.本篇文章从 MyBatis 是什么(what),为什么要使用(why),以及如何使用(how)等三个角度进行了说 ...

  7. Spring AOP 源码分析系列文章导读

    1. 简介 前一段时间,我学习了 Spring IOC 容器方面的源码,并写了数篇文章对此进行讲解.在写完 Spring IOC 容器源码分析系列文章中的最后一篇后,没敢懈怠,趁热打铁,花了3天时间阅 ...

  8. Spring IOC 容器源码分析系列文章导读

    1. 简介 Spring 是一个轻量级的企业级应用开发框架,于 2004 年由 Rod Johnson 发布了 1.0 版本.经过十几年的迭代,现在的 Spring 框架已经非常成熟了.Spring ...

  9. SpringMVC源码阅读系列汇总

    1.前言 1.1 导入 SpringMVC是基于Servlet和Spring框架设计的Web框架,做JavaWeb的同学应该都知道 本文基于Spring4.3.7源码分析,(不要被图片欺骗了,手动滑稽 ...

随机推荐

  1. 关于CALayer 中的contents(图片) 拉伸

    最近做有关 发送图片的功能.微信显示的图片 使用气泡遮罩出来的..而且图片尺寸也不止一种. 既然UIImagView 可以拉伸图片,设置遮罩的CALayer 的content 可不可以. 关键CALa ...

  2. scala中json与对象的转换

    遇到的问题 因为要把spark从es读出来的json数据转换为对象,开始想用case class定义类型,通过fastjson做转换.如下 case class Book (author: Strin ...

  3. 【小超_Android】2015最流行的android组件、工具、框架大全(兴许)

    2015.07.07 FlyRefresh 创意Replace的Android实现,非常cool. fab-toolbar Material Design风格的FAB工具栏效果 MaterialVie ...

  4. 腾讯云服务器 设置ngxin + fastdfs +tomcat 开机自启动

    在tomcat中新建一个可以启动的 .sh 脚本文件 /usr/local/tomcat7/bin/ export JAVA_HOME=/usr/local/java/jdk7 export PATH ...

  5. 自定义Django中间件(登录验证中间件实例)

    前戏 我们在前面的课程中已经学会了给视图函数加装饰器来判断是用户是否登录,把没有登录的用户请求跳转到登录页面.我们通过给几个特定视图函数加装饰器实现了这个需求.但是以后添加的视图函数可能也需要加上装饰 ...

  6. redis-3.0.0_rc5的RPM包制定

    首先查看脚本: # cat /tmp/redis_before.sh #!/bin/bash if [ ! -d /apps/redis-3.0.0-rc5 ];then mkdir -p /apps ...

  7. openssl生成SSL证书的流程

    SSL证书通过在客户端浏览器和Web服务器之间建立一条SSL安全通道(Secure socketlayer(SSL),SSL安全协议主要用来提供对用户和服务器的认证:对传送的数据进行加密和隐藏:确保数 ...

  8. python List使用

    1.enumerate 用在遍历中,返回下标和数据 name_arr = ["shijingjing", "renjiangfeng", "anqi& ...

  9. python(48):re.split 多分隔符

    问题描述: 使用多个界定符分割字符串 问题 你需要将一个字符串分割为多个字段,但是分隔符(还有周围的空格)并不是固定的. 解决方案 string 对象的 split() 方法只适应于非常简单的字符串分 ...

  10. uWSGI listen queue 队列溢出的问题

    如果没有设置uwsgi的--listen,如果sysctl -a | grep net.core.somaxconn发现net.core.somaxconn=128. 那你使用uwsgi启动的服务,单 ...