杜军,《Docker——容器与容器云》和《云原生分布式存储基石:etcd》这两本书的作者。现任职于华为Cloud BU PaaS服务产品部,主要负责容器与Kubernetes集群管理技术的研发。是Kubernetes核心维护者,也是CNCF TOC Contributor。在Kubernetes社区主导了Kube-proxy IPVS模式,Pod网络QoS,流图调度器Poseidon,Cluster-API-OpenStack和边缘计算KubeEdge等项目的开发。你可以在KubeCon,LinuxCon和CNUTCon等大会找到我分享的主题演讲,我也做过多次Kubernetes和CKA考试的培训。
云计算时代,企业将不再耗巨资投资自己的IT系统,而是直接使用无限制的按需付费的云服务,这无疑将显著降低IT基础设施的开销,加速软件占据世界的进程。作为程序员,我时常为自己有机会投身于这个波澜壮阔的技术变革事业而感到莫名激动。
回到正题,我理解的云原生是一种新的软件工程方法,即充分利用云计算的优势来构建(build)和运行(run)软件。Build once, run everywhere,当初Docker公司提出的这个口号现在喊起来是否已经朗朗上口了?
有时候我们会反思,当容器技术方兴未艾的时候,是什么促使了云原生技术如雨后春笋般在企业内萌发呢?诚然,“一次构建,到处运行”——容器良好的良好的可移植性,敏捷性和Docker革新的镜像打包方式相较云计算最初的IaaS虚拟机形态,更加容易地成为公有云全新的基础设施和交付手段。但Docker毕竟只是一个runtime,当我们需要一个编排框架作为系统核心来串联开发、测试、发布、运行和升级等整个软件生命周期时,它就略显单薄。
搞大规模的基础设施,还得看Google,毕竟人家管理大规模的容器集群已经快二十年了,哪怕是在公有云领域攻城略地、出尽风头的AWS,都没有Google在容器领域积累的深厚经验。Kubernetes就是Google照着鼎鼎大名的Borg系统开源出来的容器编排引擎。如今的Kubernetes,既是 GitHub上的明星项目,也获得了了全世界所有公有云厂商(包括AWS)的青睐,更是让当年不可一世的Docker公司低下了他那高傲的头颅。
关心容器生态圈的朋友,想必都已经接受了Kubernetes作为容器编排甚至是云原生标准的事实。
etcd就是用来存储云上最重要的数据的。
etcd的作者,李响曾“傲娇”地这样说道。
那么,etcd是什么?etcd这个名字由两部分组成:etc和d,即UNIX/Linux操作系统的“/etc”目录和分布式(distributed)首字母的“d”。我们都知道,/etc目录一般用于存储UNIX/Linux操作系统的配置信息,因此etc和d合起来就是一个分布式的/etc目录。由此可见,etcd的寓意是为大规模分布式系统存储配置信息。etcd常被用来提供可靠的分布式键值(key-value)存储、配置共享和服务发现等功能。人们经常会拿etcd和ZooKeeper、Consul等现代配置中心来做比较。
从技术上的角度,用户大可以放心将最重要的数据存储在etcd,因为etcd底层采用的Raft一致性协议保证了数据的分布式强一致性和高可用。一个etcd数据集群,即使挂掉半数节点,也不影响集群的正常工作。
李响的底气更来自于,etcd同时被经典PaaS的代表Cloud Foundry和容器云新贵Kubernetes采用,作为他们后端数据存储和协同的关键组件。毫不夸张地说,etcd就是Kubernetes和Cloud Foundry的“心脏”。更饶有趣味的是,Docker Swarm的节点管理系统也引用了etcd的Raft库,要知道Docker和CoreOS(开发etcd的公司)曾经在容器runtime战场上有过一番争夺啊!我只能感叹,etcd的代码质量之高以至于让商业竞争对手都放下了门户之见。又或许,Docker Swarm那时也找不到更稳定的Go语言版本的Raft实现了。更不用说,TiDB这类新兴的分布式NewSQL数据库基于etcd的Raft库构建分布式事务、跨数据中心数据强一致性、故障自恢复等能力。
经典PaaS我们不必再提,考虑到Kubernetes在当今云原生时代所扮演的角色,用“基石”二字形如etcd的重要性一点都不为过。事实上,etcd也不负众望,很好地扮演了“坚若磐石,稳如泰山”的云原生大厦基石的角色。etcd作为硅谷明星创业公司CoreOS最重要的项目,一开始便含着“金钥匙”出生,直接被Kubernetes指定作为其后端的存储实现。
“Kubernetes是Borg的开源实现,在Google内部,Borg使用Chubby作为分布式协同的后端,Kubernetes选择了etcd——一个Go语言的Chubby实现。”
Kubernetes的创始人如是解释道Kubernetes和etcd的结缘。相较于基于Paxos协议,并且给Google的工程师们带来无尽软件工程梦魇的Chubby,etcd底层的Raft协议容易实现太多,再加上由Go这门被Google寄托了太多云时代愿望的编程语言编写,自然能够无缝融入到Kubernetes的生态之中。
如果说当初etcd搭上Kubernetes的快车还有些“幸运”的成分,但是etcd伴随着Kubernetes共同成长,历经了从V2到V3的重大版本更新,经受住了Kubernetes大规模部署最严苛的可用性和性能考验,就是它实力的体现了。Kubernetes项目早期还预留了对接多种后端存储的接口设计,现如今再去讨论这个话题已经失去了意义,因为etcd作为Kubernetes后端唯一存储早已深入人心。诞生于云原生星火燎原之时,上天再把你派到Kubernetes这个老大哥身边,把你打造成开源的Chubby,云原生的分布式存储基石,这是一份多么让人艳羡的履历啊!什么叫天之骄子?我想这便是!
笔者求学于国内云计算研究最前沿的浙大SEL实验室,从研究生开始便投身于云原生技术的探索与实践。从最开始研究KVM虚拟机,再到后来的底层基础设施CloudStack,OpenStack,也参与过经典PaaS Cloud Foundry在企业私有云的落地。
在2014年Docker和Kubernetes技术刚诞生之时,我们实验室的几位老师和博士(其中便包括后来的Kubernetes核心维护者张磊)便敏锐地意识到这将是改变未来十年基础设施的新技术,出于技术布道的目的,我们合著了并出版了国内第一本深度解析Docker和Kubernetes的书《Docker——容器与容器云》。由于我负责该书Kubernetes部分,因此在写作过程中便对etcd有过较深入的研究,但考虑到彼时etcd还是0.4版本,功能比较简单,而且和该书的主题关联不强,所以就没有花篇幅介绍etcd。但彼时便被etcd简明的架构设计和优美的Raft算法实现深深折服,从此心中埋下了一颗独立出版一本介绍etcd书籍的种子。
毕业后由于工作关系一直深耕Kubernetes,并基于Kubernetes构建华为公有云的PaaS平台。自然,etcd是整个华为PaaS平台的重中之重,我所在的技术团队也经历了从Kubernetes 1K节点到10K节点百万容器规模的艰辛蜕变,积累了不少etcd在大规模场景下的运维和性能调优经验。我想,任何基于Kubernetes构建的云平台都会碰到我们之前解决过的各种etcd相关的问题,比如:数据容灾恢复,watch缓冲区溢出,高并发带来的读写性能衰退,磁盘I/O低下导致的集群频繁选主等问题。很多情况下,这些问题并非etcd的问题,是因为我们对etcd的核心机制不理解或理解不充分导致的。
etcd的官网只有粗浅的API使用等资料,缺乏对etcd架构和原理的深度剖析——可能这个世界上最懂etcd的人太忙没时间写文档吧。市面上介绍Kubernetes的书籍多如牛毛,却“不约而同”地忽略了最关键的etcd的相关内容。按李响的原话讲,“etcd是一个需要动脑子的项目”。尽管Raft算法和Paxos相比容易理解了很多,但对初学者来说里面仍然有不少奥秘需要点破。恰逢etcd准备捐献CNCF,急需中立的项目维护者,我希望更多人了解到这个优秀的项目,壮大开源社区。
因此,本着技术分享,回馈社区的心态,我们华为云容器服务团队合著了这本《云原生分布式存储基石:etcd深入解析》,希望在探索云原生落地的道路上,有更多志同道合的朋友加入,有你从此便不再孤单。
可能有人会问,市面上不是已经有一本etcd源码解析的书了吗?但我们需要注意到,etcd项目迭代更新快,今天拉的代码过上几个月有可能就变得面目全非,纯粹的源码解析的书籍很难做到与时俱进。此外,很多etcd的运维人员可能并不关心etcd的源代码,他们更关心如何使用etcd。在我的上一本书写作过程中,我就意识到了这个问题,因此《云原生分布式存储基石:etcd深入解析》是第一本涵盖分布式基本理论,分布式一致性协议Raft,etcd使用,运维,API,源码解析等内容的书,更是第一本综合分析了etcd V2和V3差异的书。希望各个层次的读者都能够从中获益。
如果你正在学习或者使用Kubernetes,我建议你看下这本书,因为Kubernetes后期的坑都在etcd,这本书可以让你提前知晓并且避开那些坑。
如果你是分布式系统的爱好者,你可以从这本书了解到分布式系统的基本理论,包括:CAP理论,复制状态机,拜占庭将军问题,FLP不可能性等。
如果你想学习一个分布式Key-Value存储系统,忘记ZooKeeper那繁杂的配置吧,了解一下更加容易上手并且日趋成为主流的etcd,保你在云原生的军备竞争中领先一步:)
如果你想自学Raft协议,这本书详解了Raft一致性算法,包括:Raft选举过程,日志同步,快照,异常恢复等机制。
如果你是etcd的初学者,这本书手把手教你如何部署一个etcd集群,并用相当多的篇幅解释了etcd的基本概念、常用命令和配置方法等,更有常见问题的Q&A和实践分享。
如果你是Kubernets/etcd的运维人员,etcd集群的稳定性关乎线上/线下环境的平稳,我建议你的案头放一本这书,每天闲时翻一翻,集群升级,备份恢复,日志监控,性能调优,认证授权等知识点一网打尽,彻底告别临时抱佛脚。
如果你是etcd的开发者,这一本不错的API参考书,里面详细罗列了etcd V2和V3的常用API调用和各个参数的含义。
如果你是高阶的分布式系统开发者和架构师,这本书你没有理由错过,因为它从源码级别娓娓道来etcd的多版本并发控制(MVCC),etcd V2存储机制,etcd V3数据模型,etcd的日志和快照管理,etcd V3的事务和隔离,etcd watch机制等实现细节,你可以从中汲取分布强一致性存储系统的设计灵感。
《云原生分布式存储基石:etcd深入解析》一书由机械工业出版社在2018年11月5日正式出版,华为云容器服务团队荣誉出品。京东(自营有电子版),淘宝,当当(自营有电子版),豆瓣读书等平台均有发售,且提供了部分章节的试读,新书上架折扣力度也较大:)
欢迎大家积极勘误,找到的错误直接回帖即可,找错最多的五位同学将有机会获得作者本人给各位充值话费哦~
还请各位专家多多吐槽,反馈宝贵意见帮助后续改进!