{
    "componentChunkName": "component---src-templates-blog-blog-detail-tsx",
    "path": "/blog/tidb-source-code-reading-1",
    "result": {"pageContext":{"blog":{"id":"Blogs_109","title":"TiDB 源码阅读系列文章（一）序","tags":["TiDB 源码阅读","社区"],"category":{"name":"产品技术解读"},"summary":"在 TiDB DevCon2018 上，我们对外宣布了 TiDB 源码阅读分享活动，承诺对外发布一系列文章以及视频帮助大家理解 TiDB 源码。本文为本系列文章第一篇。","body":"在 TiDB DevCon2018 上，我们对外宣布了 TiDB 源码阅读分享活动，承诺对外发布一系列文章以及视频帮助大家理解 TiDB 源码。大家一直很关心这项活动的时间，而我们忙于新版本的开发，一直不得闲。在春节放假期间，终于有时间开始动手写这个系列。\n\n**为什么我们要做这件事情？** \n\n事情的起因是随着 TiDB 项目逐渐发展，代码日渐复杂，我们发现新入职的同学越来越难上手修改代码。我们萌生了做内部培训的想法，通过录制视频、写教程的方式，加快新同事融入的速度，做了几次之后，我们发现效果不错，除了新同学有不少收获之外，老同志们也了解了之前自己并不熟悉的模块，大家都有收获。我们想到开源社区面临同样的问题，也可以通过这项工作收益，所以萌生了把这个活动做细做大的想法，于是有了这项活动。\n\nTiDB 作为一个开源项目，在开发过程中得到了社区的广泛关注，很多人在试用或者已经在线用 TiDB，并给出了很多很好的建议或者是问题反馈，帮助我们把项目做的更好。对于项目开发是这样，那么对于数据库技术的研究，也是这样。我们非常希望能和对数据库研究者、爱好者交流，我们在过去的两年中组织过近百场技术 Meetup 或者 Talk，在和大家的交流过程中，我们发现国内的数据库技术水平非常好，在交流过程中总能碰撞出火花。通过这项活动，我们希望能和大家做更深入的交流，通过源码阅读，让 TiDB 与大家 『坦诚相见』。\n\n## 前言\n\n学习一种系统最好的方法是阅读一些经典著作并研究一个开源项目，数据库也不例外。单机数据库领域有很多好的开源项目，MySQL、PostgreSQL 是其中知名度最高的两个，不少人看过这两个项目的代码。我们在刚做数据库的时候也看过不少 MySQL、PG 的代码，从中受益良多。但是分布式数据库方面，好的开源项目并不多，有一些知名的系统并不开源，比如 F1/Spanner，还有一些系统疏于维护或者是从开源变成闭源，比如被 Apple 收购后闭源的 FoundationDB（还好当初 clone 了一份代码 :)，参见 [FoundationDB 代码](https://github.com/shenli/sql-layer)，我们在内部或者外部也组织过一些开源系统代码阅读的 Talk，不过并不系统。\n\nTiDB 目前获得了广泛的关注，特别是一些技术爱好者，希望能够参与这个项目。由于整个系统的复杂性，很多人并不能很好的理解整个项目。我们希望通过这一系列文章自顶向下，由浅入深，讲述 TiDB 的技术原理以及实现细节，帮助大家掌握这个项目。\n\n## 背景知识\n\n本系列文章会聚焦在 TiDB 自身，读者需要有一些基本的知识，包括但不限于：\n\n+ Go 语言，不需要精通，但是至少要能读懂代码，知道 Goroutine、Channel、Sync 等组件的使用\n\n+ 数据库基础知识，了解一个单机数据库由哪些功能、哪些组件\n\n+ SQL 基础知识，知道基本的 DDL、DML 语句，事务的基本常识\n\n+ 基本的后端服务知识，比如如何启动一个后台进程、RPC 是如何工作的\n\n+ 一些网络、操作系统的常识\n\n+ 总体而言，读者需要了解基本的数据库知识以及能看懂 Go 语言程序，我相信这一点对于大多数同学来说，并不是问题。\n\n除了上述比较通用的知识之外，还希望读者能够看一下我之前写过的三篇文章（[说存储](https://pingcap.com/blog-cn/tidb-internal-1/)，[说计算](https://pingcap.com/blog-cn/tidb-internal-2/)，[谈调度](https://pingcap.com/blog-cn/tidb-internal-3/)），了解一些 TiDB 的基本原理。\n\n## 读者可以有哪些收获\n\n通过这一系列文章可以获得什么？首先是通过了解 TiDB 的基本原理，明白一个关系型数据库的基本原理；其次通过阅读 TiDB 的代码，知道一个数据库是如何实现的，将教科书中看到的数据库原理落地。第三，了解一个数据库的实现对其行为的影响，可以更好的理解数据库为什么是这样的，并推广到其他的数据库，相信对读者用好其他数据库也有帮助。第四，可以看到一个大型的分布式系统是如何设计、构建以及优化的。最后，大家理解了 TiDB 的代码后，如果后续工作中有需求，可以引用 TiDB 的代码，目前一些公司已经在自己的产品中用到了 TiDB 的部分模块，例如 Parser。\n\n## 内容概要\n\n首先明确一个概念，一般来说我们提到 TiDB 是指整个分布式数据库，包括 tidb-server/pd-server/tikv-server 三大组件。由于整个项目比较复杂，又涉及到两种编程语言（Golang 和 Rust），想了解数据库相关的东西实际上只需要看 tidb-server 的代码即可。tikv-server 上面的计算相关逻辑也能够在 tidb-server 的代码中找到， 在 tidb-server 的代码目录下，可以找到一个叫 mock-tikv 的组件，[mock-tikv](https://github.com/pingcap/tidb/tree/source-code/store/mockstore/mocktikv) 利用本地存储模拟 tikv-server 的行为，这里能够找到不少和 tikv-server 上面一样的代码逻辑，特别是 Coprocessor 模块的逻辑，tikv-server 上的逻辑是从 mock-tikv 上移植过去的。所以本系列文章主要介绍 tidb-server 的代码，除非特别说明，文章中提到的 TiDB 就是指 tidb-server。\n\n这一系列文章会按照数据库的组件以及 SQL 处理的常见流程，讲解 Protocol 层，以及Parser、Preprocess、Optimizer、Executor、Storage Engine 等重要模块。从整体上分为两大部分，上半部分包括如下四篇文章：\n\n+ 第一篇文章介绍整体的架构，知道 TiDB 有哪些模块，分别是做什么的，从哪里入手比较好，哪些可以忽略，哪些需要仔细阅读。\n\n+ 第二篇文章从 SQL 处理流程出发，介绍哪里是入口，需要做哪些操作，知道一个 SQL 是从哪里进来的，在哪里处理，并从哪里返回。\n\n+ 第三篇文章从代码本身出发，介绍如何看懂某个模块的代码。\n\n+ 第四篇文章会引入一个例子，介绍如何让 TiDB 支持一个新的语法。\n\n希望大家阅读完这部分后，对 TiDB 有了一定的基础，能够看懂大体流程，遇到问题或者想给 TiDB 添加一个新 Feature 的时候，不至于无从下手。\n\n下半部分会讲解的更深入，针对 TiDB 的每个重要模块进行讲解，包括优化器的详细实现、逻辑优化/物理优化是如何做的、重要的物理算子的实现等等。希望大家阅读后能对 TiDB 有深入的理解，能够完全理解 TiDB 的代码。这部分会比上半部分多很多，具体数量尚未定。\n\n这一系列文章也会作为 PingCAP 公司的内部培训资料，我们希望社区也能从中受益。所有文章会发布在 PingCAP 的微信公众号(微信号：pingcap2015)、[知乎专栏](https://zhuanlan.zhihu.com/newsql)以及 [PingCAP 的官方博客](https://pingcap.com/blog-cn/)，欢迎大家通过这些渠道关注。\n\n## 文章之外\n\n除了这一系列文章之外，我们还有一个内部培训视频的开源计划，目前内部的源码讲解活动已经开展了 4 次，形式是由某一位同事花一周时间研究一个自己不熟悉的模块，然后用一个小时的时间给其他同事讲解。目的是让每个人了解所有的模块。这个培训还会继续下去，每次都录制了视频，我们计划将这些视频进行剪辑和整理，然后开放出来。近期会邀请一些社区贡献者做内部测试，然后根据他们意见做一些调整，再开放给整个社区。\n\n## 时间计划\n\n这一系列文章刚开始提笔撰写，目前只是有一个大致的规划，我们会尽可能保证按照计划 Release 出来各篇文章。3 月中旬之前会发出上半部分的几篇文章，后续逐渐放出下半部分的文章。\n\n至于视频部分，要看剪辑以及测试的进度，我们会给出预告。\n\n## 一些期望\n我们并没有编写系列教程的经验，希望在逐渐放出文章的过程中，能收到读者的反馈，指导我们不断改进这项工作，最终能够一起把这件事情做好。在整个活动过程中，我们会密切关注反馈，随时调整。\n\n除此之外，我们希望能有一起志同道合的人参与到 TiDB 的开发中来，可以通过开源社区，甚至是肉身投奔 :)。\n\n另外这一系列文章的目的在于帮助读者更好的理解 [TiDB 源码](https://github.com/pingcap/tidb)，而不是替代阅读源码的过程。希望读者能在阅读源码的时候，以这些文章为参考，而不是只读文章，不看代码。切记『纸上得来终觉浅，绝知此事要 PR』。\n\n> 点击查看更多 [TiDB 源码阅读系列文章](https://pingcap.com/zh/blog/?tag=TiDB%20%E6%BA%90%E7%A0%81%E9%98%85%E8%AF%BB)","date":"2018-02-28","author":"申砾","fillInMethod":"writeDirectly","customUrl":"tidb-source-code-reading-1","file":null,"relatedBlogs":[]}}},
    "staticQueryHashes": ["1327623483","1820662718","3081853212","3430003955","3649515864","4265596160","63159454"]}