本書為讀者深度解析分布式鍵值存儲(chǔ)系統(tǒng),全書分為3部分,第1部分是對(duì)分布式系統(tǒng)的概念和一致性協(xié)議的綜述,重點(diǎn)解析Raft協(xié)議,使讀者對(duì)分布式鍵值存儲(chǔ)系統(tǒng)有初步了解;第2部分介紹etcd安裝、部署、運(yùn)維、安全等方面的知識(shí),幫助讀者進(jìn)一步掌握分布式系統(tǒng)的使用方法,熟悉其常見功能和使用場(chǎng)景;第3部分是本書的特色部分,從代碼層次深入探討了etcd各大關(guān)鍵特性的具體設(shè)計(jì)與實(shí)現(xiàn)原理,讀者讀完本部分,會(huì)對(duì)整個(gè)etcd的架構(gòu)有更加清晰的認(rèn)識(shí),可以從中汲取靈感,從而將一些實(shí)用的經(jīng)驗(yàn)應(yīng)用到自己的分布式系統(tǒng)中。
為什么要寫這本書
近年來,容器和云原生生態(tài)蓬勃發(fā)展,我們正身處于一波云原生的浪潮中。隨著我們習(xí)慣于在云端產(chǎn)生和收集的數(shù)據(jù),云端積累了海量的數(shù)據(jù)并繼續(xù)以驚人的速度增長(zhǎng)。如何實(shí)現(xiàn)數(shù)據(jù)分布式、一致性存儲(chǔ),確保云原生環(huán)境的可擴(kuò)展性和高可用性,是各組織亟須解決的現(xiàn)實(shí)問題。
云計(jì)算時(shí)代,etcd必將成為云原生和分布式系統(tǒng)的基石!而奠定etcd基石地位的三個(gè)關(guān)鍵因素是Raft協(xié)議、Go語(yǔ)言和生態(tài)。
etcd從一開始就摒棄了以復(fù)雜和難以理解著稱的Paxos,而是另辟蹊徑地通過Raft化繁為簡(jiǎn),實(shí)現(xiàn)了一套健壯的分布式一致性協(xié)議的SDK,這套SDK被很多其他分布式數(shù)據(jù)庫(kù)/系統(tǒng)采用,甚至包括etcd兄弟項(xiàng)目rkt的競(jìng)爭(zhēng)對(duì)手Docker。
至于被譽(yù)為云時(shí)代C語(yǔ)言的Go語(yǔ)言,具備天然的高并發(fā)能力、易安裝和可讀性好等優(yōu)點(diǎn),成就了etcd的高性能和項(xiàng)目的易維護(hù)性,極大地激發(fā)了來自全世界的開源工程師參與etcd的熱情。云原生領(lǐng)域用Go語(yǔ)言編寫的重量級(jí)項(xiàng)目不勝枚舉,例如Docker、Kubernetes和Istio等。
etcd相對(duì)于Zookeeper是一個(gè)年輕且更加輕量的項(xiàng)目,它擁有更加健康和有活力的社區(qū)。截至這本書出版前夕,etcd在Github上的star數(shù)是20 000 ,fork數(shù)是4000 ,擁有超過400名活躍的代碼貢獻(xiàn)者。不能忽視的一點(diǎn)是,etcd已經(jīng)被Kubernetes和Cloud Foundry等頂級(jí)云原生項(xiàng)目采用,并借勢(shì)經(jīng)過了Google、華為云、Red Hat、IBM、阿里等IT巨頭大規(guī)模生產(chǎn)環(huán)境的考驗(yàn)。隨著etcd進(jìn)入CNCF社區(qū)孵化,成為由CNCF治理的頂級(jí)項(xiàng)目,廠商中立的運(yùn)作模式將進(jìn)一步繁榮etcd的開源生態(tài)。
順勢(shì)而為,再加上合理的架構(gòu)設(shè)計(jì),恰如其分的實(shí)現(xiàn),完全讓人有理由相信etcd的成功。
在我最開始接觸Kubernetes的時(shí)候,就和etcd打過交道了。etcd在華為PaaS平臺(tái)作為關(guān)鍵組件應(yīng)用在分布式數(shù)據(jù)協(xié)同與更新觀察等架構(gòu)中。猶記得那時(shí)etcd剛發(fā)布,我們希望它提升華為PaaS平臺(tái)的擴(kuò)展性、性能和穩(wěn)定性。因此,我們團(tuán)隊(duì)還專門成立etcd特別攻關(guān)小組,吃透了etcd的內(nèi)部運(yùn)作機(jī)制和核心技術(shù)。我很榮幸成為這個(gè)小組的成員。從那時(shí)起,我便對(duì)etcd著了迷,一口氣翻看了etcd的源碼,同時(shí)也向etcd社區(qū)提交了若干個(gè)patch。
對(duì)于我們團(tuán)隊(duì)來說,我們很榮幸見證了etcd在技術(shù)和社區(qū)的持續(xù)進(jìn)步并成長(zhǎng)為Kubernetes項(xiàng)目的一部分。etcd v3的正式發(fā)布延續(xù)了這個(gè)勢(shì)頭,我們期待將來有更多的功能和特性被引入華為云容器平臺(tái)的產(chǎn)品中。我們也很高興過去能夠與etcd團(tuán)隊(duì)和技術(shù)社區(qū)一起工作,并將持續(xù)與etcd技術(shù)社區(qū)協(xié)作,將這項(xiàng)技術(shù)推到一個(gè)更高的層面。
至于為什么要在工作之余抽空寫這本書,我們?cè)谌萜骱蚄ubernetes技術(shù)布道的過程中發(fā)現(xiàn),國(guó)內(nèi)從事該領(lǐng)域的工程師普遍對(duì)etcd了解不多,出了問題鮮有定位手段,而etcd官網(wǎng)又沒有中文資料,因特網(wǎng)上也缺少深入解析etcd原理的文章。本著回饋社區(qū)和普及云原生技術(shù)的原則,我們?nèi)A為云容器服務(wù)團(tuán)隊(duì)決定編寫這本書,做第一個(gè)吃螃蟹的人。
畢竟源碼面前,了無秘密。
讀者對(duì)象
這里我們可以根據(jù)軟件需求劃分出本書的受眾:
分布式系統(tǒng)工作者
Raft算法研究者
etcd各個(gè)程度的學(xué)習(xí)者
Kubernetes用戶與開發(fā)者
如何閱讀本書
本書分為三部分,其中第二部分以接近實(shí)戰(zhàn)的實(shí)例來講解etcd的使用,相較于其他兩部分更獨(dú)立。如果你是一名分布式系統(tǒng)的初學(xué)者,請(qǐng)一定從第1章的基礎(chǔ)理論知識(shí)開始學(xué)習(xí)。
第一部分為基礎(chǔ)篇,包括第1章,我們將簡(jiǎn)單地介紹分布式系統(tǒng)的基本理論,并且詳解Raft算法的工作原理,幫助讀者了解一些掌握etcd的基礎(chǔ)背景知識(shí)。
第二部分為實(shí)戰(zhàn)篇,包括第2~7章,我們將著重講解etcd的常見功能和使用場(chǎng)景,包括etcd的架構(gòu)分析、命令行使用、API調(diào)用、運(yùn)維部署等。
第三部分為高級(jí)篇,包括第8~11章,我們將直接打開etcd的源碼,為喜歡刨根問底的讀者深度剖析etcd的實(shí)現(xiàn)原理。
勘誤和支持
由于作者的水平有限,編寫的時(shí)間也很倉(cāng)促,書中不妥之處在所難免,懇請(qǐng)讀者批評(píng)指正。如果你發(fā)現(xiàn)了書中的錯(cuò)誤或者有更多的寶貴意見,歡迎發(fā)送郵件至我的郵箱m1093782566@163.com,我很期待能夠獲得你們的真摯反饋。
致謝
我首先要感謝etcd的工程師團(tuán)隊(duì),他們編寫并開源了這么一款足以成為云原生基石的分布式存儲(chǔ)系統(tǒng)etcd。
感謝華為云容器服務(wù)團(tuán)隊(duì)的高級(jí)架構(gòu)師、Kubernetes社區(qū)核心維護(hù)者Kevin老師,他為這本書的出版提供了良好的技術(shù)氛圍和寶貴的實(shí)戰(zhàn)經(jīng)驗(yàn)支持。
感謝CMU在讀碩士研究生梁明強(qiáng)同學(xué),在寫作過程中為我提供了犀利而寶貴的意見和文字。
感謝機(jī)械工業(yè)出版社華章公司的編輯楊繡國(guó)老師,感謝你的魄力和遠(yuǎn)見,在這一年多的時(shí)間中始終支持我的寫作,你的鼓勵(lì)和幫助引導(dǎo)我能順利完成全部書稿。
我要感謝我的爸爸、媽媽、外公、外婆,感謝你們將我培養(yǎng)成人,并時(shí)時(shí)刻刻為我灌輸著信心和力量!
我要感謝我的愛人,你的陪伴和鼓勵(lì)使得這本書得以順利完成。
謹(jǐn)以此書,獻(xiàn)給我最親愛的家人,以及眾多熱愛云原生與分布式技術(shù)的朋友們。
杜軍
中國(guó),華為杭州研究所,2018年9月
杜軍,浙江大學(xué)計(jì)算機(jī)碩士,《Docker容器與容器云》Kubernetes部分的作者。就職于華為Cloud BU PaaS服務(wù)產(chǎn)品部,主要研究容器與集群管理技術(shù)。活躍于開源社區(qū),是Kubernetes核心維護(hù)者和CNCF TOC Contributor。
前言
第一部分 基礎(chǔ)篇
第1章 分布式系統(tǒng)與一致性協(xié)議2
1.1 CAP原理3
1.2 一致性5
1.2.1 一致性模型7
1.2.2 一致性模型分述9
1.2.3 復(fù)制狀態(tài)機(jī)16
1.2.4 拜占庭將軍問題18
1.2.5 FLP不可能性19
1.2.6 小結(jié)21
1.3 Paxos協(xié)議22
1.4 Raft協(xié)議:為可理解性而生24
1.4.1 Raft一致性算法26
1.4.2 可用性與時(shí)序45
1.4.3 異常情況46
1.4.4 日志壓縮與快照52
1.4.5 Raft算法性能評(píng)估56
1.4.6 小結(jié)58
第二部分 實(shí)戰(zhàn)篇
第2章 為什么使用etcd62
2.1 etcd是什么64
2.2 etcd架構(gòu)簡(jiǎn)介66
2.2.1 etcd數(shù)據(jù)通道69
2.2.2 etcd架構(gòu)71
2.3 etcd典型應(yīng)用場(chǎng)景舉例72
2.3.1 服務(wù)注冊(cè)與發(fā)現(xiàn)72
2.3.2 消息發(fā)布和訂閱75
2.3.3 負(fù)載均衡76
2.3.4 分布式通知與協(xié)調(diào)77
2.3.5 分布式鎖78
2.3.6 分布式隊(duì)列80
2.3.7 集群監(jiān)控與Leader競(jìng)選81
2.3.8 小結(jié)82
2.4 etcd性能測(cè)試82
2.4.1 etcd讀性能82
2.4.2 etcd寫性能83
2.5 etcd與其他鍵值存儲(chǔ)系統(tǒng)的對(duì)比84
2.5.1 ZooKeeper VS etcd85
2.5.2 Consul VS etcd88
2.5.3 NewSQL(Cloud Spanner、CockroachDB、TiDB)VS etcd88
2.5.4 使用etcd做分布式協(xié)同89
2.5.5 小結(jié)90
2.6 使用etcd的項(xiàng)目90
2.7 etcd概念詞匯表91
2.8 etcd發(fā)展里程碑92
2.8.1 etcd 0.4版本93
2.8.2 etcd 2.0版本93
2.8.3 etcd 3.0版本93
第3章 etcd初體驗(yàn)95
3.1 單機(jī)部署95
3.1.1 單實(shí)例etcd95
3.1.2 多實(shí)例etcd98
3.2 多節(jié)點(diǎn)集群化部署100
3.2.1 靜態(tài)配置101
3.2.2 服務(wù)發(fā)現(xiàn)104
3.3 etcdctl常用命令行107
3.3.1 key的常規(guī)操作107
3.3.2 key的歷史與watch112
3.3.3 租約115
3.4 etcd常用配置參數(shù)117
3.4.1 member相關(guān)參數(shù)項(xiàng)117
3.4.2 cluster相關(guān)參數(shù)項(xiàng)118
3.4.3 proxy相關(guān)參數(shù)項(xiàng)120
3.4.4 安全相關(guān)參數(shù)項(xiàng)120
3.4.5 日志相關(guān)參數(shù)項(xiàng)121
3.4.6 不安全參數(shù)項(xiàng)121
3.4.7 統(tǒng)計(jì)相關(guān)參數(shù)項(xiàng)122
3.4.8 認(rèn)證相關(guān)參數(shù)項(xiàng)122
第4章 etcd開放API之v2123
4.1 API保證124
4.2 etcd v2 API126
4.2.1 集群管理API126
4.2.2 鍵值A(chǔ)PI126
4.2.3 鍵的TTL130
4.2.4 等待變化通知:watch134
4.2.5 自動(dòng)創(chuàng)建有序key146
4.2.6 目錄TTL148
4.2.7 原子的CAS149
4.2.8 原子的CAD151
4.2.9 創(chuàng)建目錄153
4.2.10 羅列目錄154
4.2.11 刪除目錄156
4.2.12 獲取一個(gè)隱藏節(jié)點(diǎn)157
4.2.13 通過文件設(shè)置key158
4.2.14 線性讀158
4.3 統(tǒng)計(jì)數(shù)據(jù)158
4.3.1 Leader數(shù)據(jù)159
4.3.2 節(jié)點(diǎn)自身的數(shù)據(jù)160
4.3.3 更多統(tǒng)計(jì)數(shù)據(jù)161
4.4 member API162
4.4.1 List member162
4.4.2 加入一個(gè)member163
4.4.3 刪除一個(gè)member163
4.4.4 修改member的peer URL164
第5章 etcd開放API之v3165
5.1 從etcd v2到etcd v3166
5.1.1 gRPC167
5.1.2 序列化和反序列化優(yōu)化167
5.1.3 減少TCP連接167
5.1.4 租約機(jī)制167
5.1.5 etcd v3的觀察者模式168
5.1.6 etcd v3的數(shù)據(jù)存儲(chǔ)模型169
5.1.7 etcd v3的迷你事務(wù)170
5.1.8 快照171
5.1.9 大規(guī)模watch171
5.2 gRPC服務(wù)172
5.3 請(qǐng)求和響應(yīng)174
5.4 KV API176
5.4.1 鍵值對(duì)176
5.4.2 revision177
5.4.3 鍵區(qū)間178
5.4.4 Range API178
5.4.5 PUT調(diào)用181
5.4.6 事務(wù)182
5.4.7 Compact調(diào)用186
5.5 watch API186
5.5.1 Event187
5.5.2 流式watch187
5.6 Lease API190
5.6.1 獲得租約190
5.6.2 Keep Alives192
5.7 API使用示例192
第6章 etcd集群運(yùn)維與穩(wěn)定性195
6.1 etcd升級(jí)195
6.1.1 etcd從2.3升級(jí)到3.0195
6.1.2 etcd從3.0升級(jí)到3.1199
6.2 從etcd v2切換到v3202
6.2.1 切換客戶端代碼202
6.2.2 數(shù)據(jù)遷移203
6.3 運(yùn)行時(shí)重配置204
6.3.1 兩階段配置更新保證集群安全205
6.3.2 永久性失去半數(shù)以上member206
6.4 參數(shù)調(diào)優(yōu)207
6.4.1 時(shí)間參數(shù)207
6.4.2 快照208
6.4.3 磁盤209
6.4.4 網(wǎng)絡(luò)209
6.5 監(jiān)控209
6.6 維護(hù)210
6.6.1 壓縮歷史版本210
6.6.2 消除碎片化211
6.6.3 存儲(chǔ)配額211
6.6.4 快照備份213
6.7 災(zāi)難恢復(fù)213
6.7.1 快照214
6.7.2 恢復(fù)集群214
6.8 etcd網(wǎng)關(guān)215
6.8.1 什么時(shí)候使用etcd網(wǎng)關(guān)216
6.8.2 什么時(shí)候不該使用etcd網(wǎng)關(guān)216
6.8.3 啟動(dòng)etcd網(wǎng)關(guān)217
6.9 gRPC代理217
6.9.1 可擴(kuò)展的watch API218
6.9.2 限制219
6.9.3 可擴(kuò)展的帶租約的API219
6.9.4 服務(wù)端保護(hù)220
6.9.5 啟動(dòng)gRPC代理220
6.9.6 客戶端節(jié)點(diǎn)同步和域名解析221
6.9.7 名字空間222
6.10 故障恢復(fù)223
6.10.1 小部分從節(jié)點(diǎn)故障223
6.10.2 主節(jié)點(diǎn)故障224
6.10.3 大部分節(jié)點(diǎn)故障224
6.10.4 網(wǎng)絡(luò)分區(qū)224
6.10.5 集群?jiǎn)?dòng)異常225
6.11 硬件225
第7章 etcd安全231
7.1 訪問安全231
7.1.1 權(quán)限資源232
7.1.2 鍵值資源234
7.1.3 配置資源234
7.2 etcd訪問控制實(shí)踐235
7.2.1 User相關(guān)命令235
7.2.2 Role相關(guān)命令236
7.2.3 啟用用戶權(quán)限功能237
7.3 傳輸安全238
7.3.1 TLS/SSL工作原理239
7.3.2 使用TLS加密etcd通信241
7.3.