前言

从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上, 如果有想对本书做贡献的同学,也可以通过github进行贡献。

                                                    作者
                                                    2019年4月于上海

Last updated