編輯推薦
本書主要從源碼角度深入剖析etcd:
√ etcd的背景知識,如何搭建源碼環境及相關命令
√ Raft協定的背景,如何處理各種異常場景及相關擴展
√ etcd-raft模組對Raft協定的實現,etcd自帶的raftexample示例
√ HTTP編程基礎,etcd-rafthttp模組的工作原理和具體實現
√ etcd中如何處理WAL日誌檔案及快照數據檔案
√ etcd的底層存儲(v2和v3版本)
√ etcd服務端及擴展
內容提要
etcd是一個可靠的分散式KV存儲產品,由CoreOS公司開發,其底層使用Raft算法保證一致性,主要用於共享配置和服務發現。
《etcd技術內幕》主要從源碼角度深入剖析etcd,首先介紹etcd的背景知識,如何搭建源碼環境及相關的命令。接著從基本的Raft協定開始介紹,幫助讀者了解Raft協定的背景、如何處理各種異常場景及相關擴展。然後分析etcd-raft模組對Raft協定的實現,同時介紹etcd自帶的raftexample示例,幫助讀者了解etcd-raft模組的基本使用方法。《etcd技術內幕》還介紹HTTP編程基礎和etcd-rafthttp模組的工作原理及具體實現,以及etcd中如何處理WAL日誌檔案及快照數據檔案,並且詳細分析etcd的底層存儲,對v2版本和v3版本的存儲都做了詳細的介紹。最後重點介紹etcd服務端和客戶端的相關內容,etcd服務端會組裝並協調前面介紹的各個組件,並且在它們的基礎上擴展出了更多的功能,此外還詳細分析v2和v3兩個版本客戶端的具體實現。
《etcd技術內幕》適合Go語言開發者,以及對etcd技術感興趣的讀者閱讀。
目錄
第1章 etcd入門
1.1 etcd簡介
1.2 數據模型
1.3 環境搭建
1.3.1 環境變數
1.3.2 代碼結構
1.3.3 運行
本章小結
第2章 Raft協定
2.1 Leader選舉
2.2 日誌複製
2.3 網路分區的場景
2.4 日誌壓縮與快照
2.5 其他技術點
2.5.1 linearizable語義
2.5.2 唯讀請求
2.5.3 PreVote狀態
2.5.4 Leader節點轉移
本章小結
第3章 etcd-raft模組詳解
3.1 raft結構體
3.1.1 Config結構體
3.1.2 Storage接口及其實現
3.1.3 unstable結構體
3.1.4 raftLog結構體
3.1.5 raft實現
3.2 Node接口
3.2.1 node結構體
3.2.2 初始化
3.2.3 run()方法
3.2.4 Node接口實現
3.3 raftexample示例分析
3.3.1 raftNode
3.3.2 HTTP服務端
3.3.3 kvstore
本章小結
第4章 網路層
4.1 Go語言網路編程基礎
4.1.1 http.Server
4.1.2 RoundTripper
4.2 etcd-rafthttp模組詳解
4.2.1 rafthttp.Transporter接口
4.2.2 Peer接口
4.2.3 pipeline
4.2.4 streamWriter實例
4.2.5 streamReader實例
4.2.6 snapshotSender
4.3 Handler實例
4.3.1 pipelineHandler
4.3.2 streamHandler
4.3.3 snapshotHandler
本章小結
第5章 WAL日誌與快照
5.1 WAL日誌
5.1.1 初始化
5.1.2 打開日誌
5.1.3 讀取日誌
5.1.4 追加日誌
5.1.5 檔案切換
5.2 SnapShotter
本章小結
第6章 storage
6.1 etcd v2版本存儲
6.1.1 node
6.1.2 Event
6.1.3 watcher和watcherHub
6.1.4 store
6.2 etcd v3版本存儲
6.2.1 backend
6.2.2 watcher機制
6.2.3 Lessor
本章小結
第7章 etcd-server詳解
7.1 raftNode結構體
7.2 RaftCluster
7.3 EtcdServer
7.3.1 初始化
7.3.2 註冊Handler
7.3.3 啟動
7.4 ApplierV2和applierV3
7.4.1 ApplierV2
7.4.2 applierV3
7.5 AlarmStore
本章小結
第8章 etcd客戶端詳解
8.1 GRPC基礎
8.1.1 定義proto檔案
8.1.2 服務端
8.1.3 創建客戶端
8.2 Client v3
8.2.1 kvServer
8.2.2 EtcdServer
8.2.3 Client
8.3 Client v2
8.3.1 KeysAPI接口
8.3.2 httpClient接口
本章小結
參考文獻
前言
etcd是一個可靠的分散式KV存儲,其底層使用Raft算法保證一致性,主要用於共享配置和服務發現。etcd是CoreOS公司發起的一個開源項目。
目前提供配置共享和服務發現功能的組件還是比較多的,其中套用最廣泛、大家最熟悉的應該就是ZooKeeper了,很多開源項目都在不同程度上依賴了ZooKeeper,例如,Dubbo、Kafka。在Golang社區中,etcd是唯一一個可以媲美ZooKeeper的組件,在有些方面,etcd甚至超越了ZooKeeper,給開發者眼前一亮的感覺。
etcd作為一個優秀的分散式KV存儲產品,其底層的etcd-raft模組實現了Raft協定,可以幫助開發者快速實現最終一致性功能。etcd以其高性能、易維護、Raft實現等優點,受到越來越多的開發人員的青睞,在Golang社區中聲名大噪。
etcd的代碼中有很多亮點,為了提高整體性能,其實現中使用了大量的goroutine和Channel。etcd 3 中開始使用BoltDB作為底層的持久存儲,使用BTree索引加速查詢,還提供了可靠的Watcher功能,同時提供了基於GRPC的新版本客戶端。當然,etcd 3依然兼容etcd 2的記憶體存儲和HTTP API。
etcd 3中有很多令人稱讚的功能和優秀的設計,但至今還沒有深入剖析etcd 3的內部設計和實現細節的圖書,本書以etcd 3為基礎,詳細分析了etcd的架構設計和實現細節,其中穿插介紹了etcd源碼中涉及的基礎知識,以及筆者在實踐中的思考。
如何閱讀本書
由於篇幅限制,本書並沒有詳細介紹Go語言的基礎知識,但為了便於理解讀者理解etcd的設計思想和實現細節,筆者介紹了一些必需且重要的基礎內容,例如,Go語言提供的HTTP功能。
本書共8章,主要從源碼角度深入剖析etcd的原理和實現。建議讀者先閱讀前兩章,了解Raft協定之後,再開始學習etcd的工作原理和代碼實現。
第1章簡要介紹etcd的背景知識及其基本的數據模型,然後介紹如何搭建源碼環境及相關的命令。
第2章從基本的Raft協定開始介紹,幫助讀者了解Raft協定的背景知識、大致工作原理、如何處理各種異常場景,以及幾個比較重要的擴展點。
第3章著重分析etcd中的raft模組對Raft協定的實現,etcd-raft模組是etcd的核心模組之一,GitHub上很多其他項目直接使用etcd-raft模組作為其Raft協定的底層實現。同時,本章也介紹了etcd自帶的raftexample示例,幫助讀者了解etcd-raft模組的基本使用方法,方便讀者在實踐中直接使用etcd-raft模組。
第4章簡單介紹HTTP編程基礎,以及etcd-rafthttp模組的工作原理和具體實現,其中涉及RoundTripper的基本原理、rafthttp.Transporter的實現及多種Handler的實現。
第5章介紹etcd中如何處理WAL日誌檔案和快照數據檔案,其中分析了WAL結構體和Snapshotter的具體實現。
第6章詳細分析etcd的底層存儲,對etcd v2和etcd v3兩個版本的存儲都做了詳細的介紹,不僅分析了底層的KV存儲,還分析了watcher機制和Lessor的實現原理。
第7章重點介紹etcd服務端的內容,etcd服務端會組裝並協調前面介紹的各個組件,並且在它們的基礎上擴展出了更多的功能。
第8章主要介紹etcd客戶端的相關內容,詳細分析了v2和v3兩個版本客戶端的具體實現。
致謝
感謝我的母親,謝謝您的付出和犧牲!
感謝白醬陪我看過一盞盞亮起的路燈,感謝三十在技術上提供的幫助。
感謝電子工業出版社博文視點的陳曉猛老師,是您的辛勤工作讓本書的出版成為可能。同時還要感謝許多我不知道名字的幕後工作人員為本書付出的努力。
百里燊