什么是ETCD?
etcd是一個Go言編寫的分布式、高可用的一致性鍵值存儲系統,用於提供可靠的分布式鍵值存儲、配置共享和服務發現等功能。
特點
-
簡單:
易使用:基於HTTP+JSON的API讓你用curl就可以輕松使用
易部署:使用Go語言編寫,跨平台,部署和維護簡單 -
可靠:
強一致:使用Raft算法充分保證了分布式系統數據的強一致性
高可用:具有容錯能力,假設集群有n個節點,當有(n-1)/2節點發送故障,依然能提供服務
持久化:數據更新后,會通過WAL格式數據持久化到磁盤,支持Snapshot快照
快速:每個實例每秒支持一千次寫操作,極限寫性能可達10K QPS
安全:可選SSL客戶認證機制
ETCD簡單使用
# 安裝命令
sudo apt install etcd
# 查看版本
etcd --version
# 測試安裝是否成功
curl http://127.0.0.1:2379/version
# 增 / 改
curl http://127.0.0.1:2379/v2/keys/message -XPUT -d value="Hello world"
etcdctl put message "Hello world"
# 刪除
curl http://127.0.0.1:2379/v2/keys/message -XDELETE
etcdctl del message
# 查
curl http://127.0.0.1:2379/v2/keys/message
etcdctl get message
# 存儲有過期時間的key
curl http://127.0.0.1:2379/v2/keys/foo -XPUT -d value=bar -d ttl=5
# watch
etcdctl watch key
服務架構

基本概念
-
HTTP Server
- 用於處理用戶發送的API請求以及其他etcd節點的同步與心跳信息的請求。
-
Store
- 用於處理etcd支持的各類功能的事務,包括數據索引,節點狀態的變更,監控與反饋,事件處理與執行等,是etcd對用戶提供的大多數API功能的具體實現。
-
Raft
- Raft分布式強一致性算法的具體實現,是etcd的核心。
-
WAL
- Write Ahead Log(預寫式日志)是etcd的數據存儲方式,WAL中所有數據提交前都會事先記錄日志,這種技術在mysql中也有用到(binlog)。除了在內存中存有所有數據的狀態及節點的索引以外,etcd就通過WAL進行持久化存儲。
-
Snapshot
- 是為了防止數據過多而進行的狀態快照
-
Entry
- 表示存儲的具體日志內容。
RPC簡介
-
ETCD中節點間通信,以及事務處理都是通過RPC機制,RPC(Remote Procedure Call)是遠程過程調用,它是一種通過網絡從遠程計算機程序上請求服務,而不需要了解底層網絡技術的協議。
-
RPC采用客戶機/服務器模式。請求程序就是一個客戶機,而服務提供程序就是一個服務器。首先,客戶機調用進程發送一個有進程參數的調用信息到服務進程,然后等待應答信息。
核心算法 Raft
通常來說,在分布式環境下,可以通過兩種手段達成一致:
- Symmetric, leader-less :所有Server都是對等的,Client可以和任意Server進行交互
- Asymmetric, leader-based:任意時刻,有且僅有1台Server擁有決策權,Client僅和該Leader交互
經典應用場景
1. 服務注冊與發現(Service Discovery)
2. 配置中心
3. 負載均衡
4. 分布式鎖
5. 分布式隊列
6. 分布式通知與協調
7. 消息發布和訂閱
發展現狀
Raft算法雖然誕生不久,但是在業界已經引起廣泛關注,強烈推薦大家瀏覽其官網http://raftconsensus.github.io,上面有豐富的學習資料,目前Raft算法的開源實現已經涵蓋幾乎所有主流語言(C/C++/Java/Python/Javascript …),其流行程度可見一斑。由此可見,一項技術能否在工業界大行其道,有時“可理解性”、“可實現性”才是至關重要的。
