本書為讀者深度解析分布式鍵值存儲系統(tǒng),全書分為3部分,第1部分是對分布式系統(tǒng)的概念和一致性協(xié)議的綜述,重點解析Raft協(xié)議,使讀者對分布式鍵值存儲系統(tǒng)有初步了解;第2部分介紹etcd安裝、部署、運維、安全等方面的知識,幫助讀者進一步掌握分布式系統(tǒng)的使用方法,熟悉其常見功能和使用場景;第3部分是本書的特色部分,從代碼層次深入探討了etcd各大關(guān)鍵特性的具體設(shè)計與實現(xiàn)原理,讀者讀完本部分,會對整個etcd的架構(gòu)有更加清晰的認識,可以從中汲取靈感,從而將一些實用的經(jīng)驗應(yīng)用到自己的分布式系統(tǒng)中。
為什么要寫這本書
近年來,容器和云原生生態(tài)蓬勃發(fā)展,我們正身處于一波云原生的浪潮中。隨著我們習(xí)慣于在云端產(chǎn)生和收集的數(shù)據(jù),云端積累了海量的數(shù)據(jù)并繼續(xù)以驚人的速度增長。如何實現(xiàn)數(shù)據(jù)分布式、一致性存儲,確保云原生環(huán)境的可擴展性和高可用性,是各組織亟須解決的現(xiàn)實問題。
云計算時代,etcd必將成為云原生和分布式系統(tǒng)的基石!而奠定etcd基石地位的三個關(guān)鍵因素是Raft協(xié)議、Go語言和生態(tài)。
etcd從一開始就摒棄了以復(fù)雜和難以理解著稱的Paxos,而是另辟蹊徑地通過Raft化繁為簡,實現(xiàn)了一套健壯的分布式一致性協(xié)議的SDK,這套SDK被很多其他分布式數(shù)據(jù)庫/系統(tǒng)采用,甚至包括etcd兄弟項目rkt的競爭對手Docker。
至于被譽為云時代C語言的Go語言,具備天然的高并發(fā)能力、易安裝和可讀性好等優(yōu)點,成就了etcd的高性能和項目的易維護性,極大地激發(fā)了來自全世界的開源工程師參與etcd的熱情。云原生領(lǐng)域用Go語言編寫的重量級項目不勝枚舉,例如Docker、Kubernetes和Istio等。
etcd相對于Zookeeper是一個年輕且更加輕量的項目,它擁有更加健康和有活力的社區(qū)。截至這本書出版前夕,etcd在Github上的star數(shù)是20 000 ,fork數(shù)是4000 ,擁有超過400名活躍的代碼貢獻者。不能忽視的一點是,etcd已經(jīng)被Kubernetes和Cloud Foundry等頂級云原生項目采用,并借勢經(jīng)過了Google、華為云、Red Hat、IBM、阿里等IT巨頭大規(guī)模生產(chǎn)環(huán)境的考驗。隨著etcd進入CNCF社區(qū)孵化,成為由CNCF治理的頂級項目,廠商中立的運作模式將進一步繁榮etcd的開源生態(tài)。
順勢而為,再加上合理的架構(gòu)設(shè)計,恰如其分的實現(xiàn),完全讓人有理由相信etcd的成功。
在我最開始接觸Kubernetes的時候,就和etcd打過交道了。etcd在華為PaaS平臺作為關(guān)鍵組件應(yīng)用在分布式數(shù)據(jù)協(xié)同與更新觀察等架構(gòu)中。猶記得那時etcd剛發(fā)布,我們希望它提升華為PaaS平臺的擴展性、性能和穩(wěn)定性。因此,我們團隊還專門成立etcd特別攻關(guān)小組,吃透了etcd的內(nèi)部運作機制和核心技術(shù)。我很榮幸成為這個小組的成員。從那時起,我便對etcd著了迷,一口氣翻看了etcd的源碼,同時也向etcd社區(qū)提交了若干個patch。
對于我們團隊來說,我們很榮幸見證了etcd在技術(shù)和社區(qū)的持續(xù)進步并成長為Kubernetes項目的一部分。etcd v3的正式發(fā)布延續(xù)了這個勢頭,我們期待將來有更多的功能和特性被引入華為云容器平臺的產(chǎn)品中。我們也很高興過去能夠與etcd團隊和技術(shù)社區(qū)一起工作,并將持續(xù)與etcd技術(shù)社區(qū)協(xié)作,將這項技術(shù)推到一個更高的層面。
至于為什么要在工作之余抽空寫這本書,我們在容器和Kubernetes技術(shù)布道的過程中發(fā)現(xiàn),國內(nèi)從事該領(lǐng)域的工程師普遍對etcd了解不多,出了問題鮮有定位手段,而etcd官網(wǎng)又沒有中文資料,因特網(wǎng)上也缺少深入解析etcd原理的文章。本著回饋社區(qū)和普及云原生技術(shù)的原則,我們?nèi)A為云容器服務(wù)團隊決定編寫這本書,做第一個吃螃蟹的人。
畢竟源碼面前,了無秘密。
讀者對象
這里我們可以根據(jù)軟件需求劃分出本書的受眾:
分布式系統(tǒng)工作者
Raft算法研究者
etcd各個程度的學(xué)習(xí)者
Kubernetes用戶與開發(fā)者
如何閱讀本書
本書分為三部分,其中第二部分以接近實戰(zhàn)的實例來講解etcd的使用,相較于其他兩部分更獨立。如果你是一名分布式系統(tǒng)的初學(xué)者,請一定從第1章的基礎(chǔ)理論知識開始學(xué)習(xí)。
第一部分為基礎(chǔ)篇,包括第1章,我們將簡單地介紹分布式系統(tǒng)的基本理論,并且詳解Raft算法的工作原理,幫助讀者了解一些掌握etcd的基礎(chǔ)背景知識。
第二部分為實戰(zhàn)篇,包括第2~7章,我們將著重講解etcd的常見功能和使用場景,包括etcd的架構(gòu)分析、命令行使用、API調(diào)用、運維部署等。
第三部分為高級篇,包括第8~11章,我們將直接打開etcd的源碼,為喜歡刨根問底的讀者深度剖析etcd的實現(xiàn)原理。
勘誤和支持
由于作者的水平有限,編寫的時間也很倉促,書中不妥之處在所難免,懇請讀者批評指正。如果你發(fā)現(xiàn)了書中的錯誤或者有更多的寶貴意見,歡迎發(fā)送郵件至我的郵箱m1093782566@163.com,我很期待能夠獲得你們的真摯反饋。
致謝
我首先要感謝etcd的工程師團隊,他們編寫并開源了這么一款足以成為云原生基石的分布式存儲系統(tǒng)etcd。
感謝華為云容器服務(wù)團隊的高級架構(gòu)師、Kubernetes社區(qū)核心維護者Kevin老師,他為這本書的出版提供了良好的技術(shù)氛圍和寶貴的實戰(zhàn)經(jīng)驗支持。
感謝CMU在讀碩士研究生梁明強同學(xué),在寫作過程中為我提供了犀利而寶貴的意見和文字。
感謝機械工業(yè)出版社華章公司的編輯楊繡國老師,感謝你的魄力和遠見,在這一年多的時間中始終支持我的寫作,你的鼓勵和幫助引導(dǎo)我能順利完成全部書稿。
我要感謝我的爸爸、媽媽、外公、外婆,感謝你們將我培養(yǎng)成人,并時時刻刻為我灌輸著信心和力量!
我要感謝我的愛人,你的陪伴和鼓勵使得這本書得以順利完成。
謹以此書,獻給我最親愛的家人,以及眾多熱愛云原生與分布式技術(shù)的朋友們。
杜軍
中國,華為杭州研究所,2018年9月
杜軍,浙江大學(xué)計算機碩士,《Docker容器與容器云》Kubernetes部分的作者。就職于華為Cloud BU PaaS服務(wù)產(chǎn)品部,主要研究容器與集群管理技術(shù)。活躍于開源社區(qū),是Kubernetes核心維護者和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)機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 可用性與時序45
1.4.3 異常情況46
1.4.4 日志壓縮與快照52
1.4.5 Raft算法性能評估56
1.4.6 小結(jié)58
第二部分 實戰(zhàn)篇
第2章 為什么使用etcd62
2.1 etcd是什么64
2.2 etcd架構(gòu)簡介66
2.2.1 etcd數(shù)據(jù)通道69
2.2.2 etcd架構(gòu)71
2.3 etcd典型應(yīng)用場景舉例72
2.3.1 服務(wù)注冊與發(fā)現(xiàn)72
2.3.2 消息發(fā)布和訂閱75
2.3.3 負載均衡76
2.3.4 分布式通知與協(xié)調(diào)77
2.3.5 分布式鎖78
2.3.6 分布式隊列80
2.3.7 集群監(jiān)控與Leader競選81
2.3.8 小結(jié)82
2.4 etcd性能測試82
2.4.1 etcd讀性能82
2.4.2 etcd寫性能83
2.5 etcd與其他鍵值存儲系統(tǒng)的對比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的項目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初體驗95
3.1 單機部署95
3.1.1 單實例etcd95
3.1.2 多實例etcd98
3.2 多節(jié)點集群化部署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ù)項117
3.4.2 cluster相關(guān)參數(shù)項118
3.4.3 proxy相關(guān)參數(shù)項120
3.4.4 安全相關(guān)參數(shù)項120
3.4.5 日志相關(guān)參數(shù)項121
3.4.6 不安全參數(shù)項121
3.4.7 統(tǒng)計相關(guān)參數(shù)項122
3.4.8 認證相關(guān)參數(shù)項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 自動創(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 獲取一個隱藏節(jié)點157
4.2.13 通過文件設(shè)置key158
4.2.14 線性讀158
4.3 統(tǒng)計數(shù)據(jù)158
4.3.1 Leader數(shù)據(jù)159
4.3.2 節(jié)點自身的數(shù)據(jù)160
4.3.3 更多統(tǒng)計數(shù)據(jù)161
4.4 member API162
4.4.1 List member162
4.4.2 加入一個member163
4.4.3 刪除一個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 租約機制167
5.1.5 etcd v3的觀察者模式168
5.1.6 etcd v3的數(shù)據(jù)存儲模型169
5.1.7 etcd v3的迷你事務(wù)170
5.1.8 快照171
5.1.9 大規(guī)模watch171
5.2 gRPC服務(wù)172
5.3 請求和響應(yīng)174
5.4 KV API176
5.4.1 鍵值對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集群運維與穩(wěn)定性195
6.1 etcd升級195
6.1.1 etcd從2.3升級到3.0195
6.1.2 etcd從3.0升級到3.1199
6.2 從etcd v2切換到v3202
6.2.1 切換客戶端代碼202
6.2.2 數(shù)據(jù)遷移203
6.3 運行時重配置204
6.3.1 兩階段配置更新保證集群安全205
6.3.2 永久性失去半數(shù)以上member206
6.4 參數(shù)調(diào)優(yōu)207
6.4.1 時間參數(shù)207
6.4.2 快照208
6.4.3 磁盤209
6.4.4 網(wǎng)絡(luò)209
6.5 監(jiān)控209
6.6 維護210
6.6.1 壓縮歷史版本210
6.6.2 消除碎片化211
6.6.3 存儲配額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 什么時候使用etcd網(wǎng)關(guān)216
6.8.2 什么時候不該使用etcd網(wǎng)關(guān)216
6.8.3 啟動etcd網(wǎng)關(guān)217
6.9 gRPC代理217
6.9.1 可擴展的watch API218
6.9.2 限制219
6.9.3 可擴展的帶租約的API219
6.9.4 服務(wù)端保護220
6.9.5 啟動gRPC代理220
6.9.6 客戶端節(jié)點同步和域名解析221
6.9.7 名字空間222
6.10 故障恢復(fù)223
6.10.1 小部分從節(jié)點故障223
6.10.2 主節(jié)點故障224
6.10.3 大部分節(jié)點故障224
6.10.4 網(wǎng)絡(luò)分區(qū)224
6.10.5 集群啟動異常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訪問控制實踐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.