> For the complete documentation index, see [llms.txt](https://csunny.gitbook.io/etcd/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://csunny.gitbook.io/etcd/master.md).

# 前言

从2016年使用Kubernetes时接触到etcd，到如今已有接近三年的时间了。etcd在kubernetes集群中，作为一个核心的存储组件，具有举足轻重的地位。 但是一直以来也没有深入探查过它的内部细节。直到最近，分布式系统，尤其是分布式存储变得越来越热，越来越重要，才静下心来，打算深入探究下etcd的内部细节。

糟糕的是这个过程并不顺利，本来想着可以通过阅读书籍的方式来理解，但找了很久，也没有找到一本结合架构、源码以及使用案例来剖析的书籍，以至于最后不得不翻开etcd源码，一行行阅读etcd的源码，剖析内部实现细节。 经过一段时间的阅读与实践，终于对etcd有了一个全方位的认识，在这里将我获得的这些知识总结出来，希望能够帮助对etcd感兴趣的同学，以及那些对分布式存储，对分布式系统感兴趣的同学。

在本书中，不仅会介绍etcd原理和应用，而且会花更多的篇幅介绍etcd源码，既然谈到源码，就不得不啰嗦两句其实现语言Go语言，因为etcd是全部用Go语言编写的，是CNCF收录的核心项目之一。 Go语言诞生于2009年，截止今年才刚刚十年的时间。 正如历史上其他一切事物一样，Go也有其自生的梦想与使命，2009年，我自认为不管是在计算机发展史上，还是人类发展史上，都是一个相当重要 的年份。 2008年金融危机爆发，经济下行全球产生信任危机。 从此绝大多数行业开始走向转折，互联网、大数据、云计算行业紧跟时代步伐, 在之后的岁月里，异军突起，开始了草莽式的发展。

正是这样的历史时刻，Go语言作为Google的金宝贝(golden son)在一大批大牛的怀抱中诞生了，诞生之初就自诩为互联网时代的C语言。 然而如今来看，Go语言也确实有这样的潜力，同时也已经在很多领域 占据了一席之地，尤其在云计算领域已经建立了难以撼动的地位。

在写作本书的过程中，为了使代码阅读没那么枯燥，我根据理论与实践结合的方式，由浅入深，由理论到代码实现，再到源码中代码的使用，单元测试以及服务部署等全方位的角度，对etcd进行全面的剖析。 只是希望，后续对etcd感兴趣的同学，想把etcd应用在自己项目中，对Go语言，对分布式系统热爱的同学，都能有所收获。 本书按大的方向来拆分，可以分为三个部分： 理论介绍、源码实战、应用运维。 在组织上，为了能够达到循序渐进，便于理解的目的。我将内容拆分为了以下章节。 第一章介绍分布式系统的一些核心概念，包括分布式系统CAP理论，分布式系统网络通信，分布式存储一致性等一系列的概念。 当然，为了避免文字枯燥的表达，我会尽量采用图表的方式解释。 第二章主要描述etcd本身的架构。 在解析etcd架构的时候，我会结合后续源码，从整体架构到其中每一个组件的核心功能，进行更为深入，细致的拆分。 目的是争取能将整个架构拆解到大家都能实现的地步。 在前两章的基础上，第三章讲解etcd的部署，通过单机以及多机两种部署方式，实际感受下etcd的魅力所在，也为后面的章节做好铺垫。 第四章可以说是最重心的一章。 因为这一章，我们直面go语言，直面etcd源码，通过etcd提供的代码，来利用raft算法实现一个简单版本的分布式kv存储数据库。然后在这个基础上，进一步对etcd进行拆解，直达etcd内部，包括raft协议的实现，mvcc多版本并发控制， 内存B-tree索引，boltdb数据持久化，watch机制，分布式事务等一系列的核心概念。在整个过程中，我会通过将各个模块拆分的方式，讲解每一个模块的用法以及实现。 包括写一个实用的程序代码，以及为各个模块写单元测试。 理解了源码，相信对于etcd的应用案例也就了然于胸了，第五章重点介绍使用案例，包括分布式队列，分布式锁，分布式kv，配置中心等。第六章简单讲解下日常的运维与监控问题， 最后一章作为总结。

相信，在读完本书过后，大家不仅能对etcd有一个较为深入的认识，同时也希望大家能够了分布式系统，了解分布式存储。 更多的将etcd应用到自己的项目中，将etcd发扬广大，将go语言发扬光大。

我从4月份开始，通过对etcd的使用，以及etcd源码的阅读，决定写这样一本书籍。 现在也才刚刚开始，这可能是一个漫长的过程，但是我会坚持每天抽时间，力所能及的更新。

最后，本书使用gitbook编写，源码地址在[github](https://github.com/csunny/etcd-from-arch-to-souce-code)上, 如果有想对本书做贡献的同学，也可以通过github进行贡献。

```
                                                    作者
                                                    2019年4月于上海
```
