介紹
etcd是一個高可用的 Key/Value 存儲系統,主要用於分享配置和服務發現。它是一款雲原生時代的首選元數據存儲產品,已經成為雲原生和分布式系統的存儲基石。
簡要基礎架構圖
Client層
-
組成
-
client v2 API 客戶端庫
-
client v3 API 客戶端庫
-
-
作用
-
提供了簡潔易用的 API
-
支持負載均衡、節點間故障自動轉移
-
極大降低業務使用 etcd 復雜度,提升開發效率、服務可用性
-
API 網絡層
-
client 訪問 server的通信協議
-
v2API
- HTTP/1.x 協議
-
v3API
-
gRPC 協議
-
HTTP/1.x 協議(通過 etcd grpc-gateway 組件支持)
-
-
-
server 節點之間的通信協議
- 節點間通過 Raft 算法實現數據復制和 Leader 選舉等功能時使用的 HTTP 協議
Raft 算法層(基石和亮點)
-
核心算法組成
-
Leader 選舉
-
日志復制
-
ReadIndex
-
-
作用
- 用於保障 etcd 多個節點間的數據一致性、提升服務可用性等
功能邏輯層(核心特性實現層)
-
KVServer 模塊
- 限速判斷(保證集群穩定性,避免雪崩)
-
生成一個唯一的 ID,將此請求關聯到一個對應的消息通知 channel,然后向 Raft 模塊發起(Propose)一個提案(Proposal)
-
等待此 put 請求,等待寫入結果通過消息通知 channel 返回或者超時。etcd 默認超時時間是 7 秒(5 秒磁盤 IO 延時 +2*1 秒競選超時時間),如果一個請求超時未返回結果,則可能會出現 etcdserver: request timed out 錯誤
-
MVCC 模塊
-
讀場景
-
寫場景
-
treeIndex 模塊(內存樹形索引模塊)
- 保存用戶 key 和版本號的映射關系
-
boltdb 模塊
-
基於 B+ tree 實現的 key-value 鍵值庫,支持事務,提供 Get/Put 等簡易 API 給 etcd 操作
-
每次修改操作,生成一個新的版本號 (revision),以版本號為 key, value 為用戶 key-value 等信息組成的結構體
-
數據隔離
-
boltdb 里每個 bucket 類似對應 MySQL 一個表
-
用戶的 key 數據存放的 bucket 名字的是 key
-
etcd MVCC 元數據存放的 bucket 是 meta
-
-
-
-
-
Auth 鑒權模塊
-
Lease 租約模塊
-
Compactor 壓縮模塊
-
Quota 模塊(配額)
-
Apply模塊
存儲層
-
預寫日志 (WAL) 模塊
- 可保障 etcd crash 后數據不丟失
-
快照 (Snapshot) 模塊
-
boltdb 模塊
- 保存了集群元數據和用戶寫入的數據