Zookeeper 和 Etcd 都是很是優秀的分佈式協調系統,zookeeper 起源於 Hadoop 生態系統,etcd 的流行是由於它是 kubernetes 的後臺支撐。java
本文將會說明 zookeeper 和 etcd 的優缺點,以便於您根據實際需求選擇更合適的分佈式協調系統。node
zookeeper 起源於 Hadoop,後來進化爲 Apache 的頂級項目。如今已經被普遍使用在 Apache 的項目中,例如 Hadoop,kafka,solr 等等。算法
zookeeper 使用 ZAB 協議做爲其一致性協議。
zookeeper 經過團隊的形式工做,一組 node 一塊兒工做,來提供分佈式能力,這組 node 的數量須要是奇數。apache
第一個節點與其餘節點溝通,選舉出一個 leader,獲取多數票數的成爲 leader,這就是爲何須要奇數個 node,其餘節點被稱爲follower。網絡
client 鏈接 zookeeper 時能夠鏈接任何一個,client 的讀請求能夠被任何一個節點處理,寫請求只能被 leader 處理。因此,添加新節點能夠提升讀的速度,但不會提升寫的速度。框架
對於 CAP 模型,zookeeper 保障的是 CP。socket
存儲數據時,zookeeper 使用樹形結構,其中的每一個節點稱做 ZNode,訪問一個 ZNode 時,須要提供從 root 開始的絕對路徑。分佈式
每一個 ZNode 能夠存儲最多 1MB 的數據,用戶能夠:oop
zookeeper 還提供了一個很是重要的特性:watcher API。測試
用戶能夠對一個 ZNode 設置 watch,當這個 ZNode 發生了變化時,例如 建立、刪除、數據變動、添加或移除子節點,watch API 就會發出通知,這是 zookeeper 很是重要的功能。
zookeeper 的 watch 有一個缺點,就是這個 watch 只能被觸發一次,一旦發出了通知,若是還想對這個節點繼續 watch,用戶須要從新設置 watch。
etcd 是用 go 開發的,出現的時間並不長,不像 zookeeper 那麼悠久和有名,可是前景很是好。
etcd 是由於 kubernetes 而被人熟知的,kubernetes 的 kube master 使用 etcd 做爲分佈式存儲獲取分佈式鎖,這爲 etcd 的強大作了背書。
etcd 使用 RAFT 算法實現的一致性,比 zookeeper 的 ZAB 算法更簡單。
etcd 沒有使用 zookeeper 的樹形結構,而是提供了一個分佈式的 key-value 存儲。
特性:
etcd3 提供了以下操做接口:
zookeeper 是用 java 開發的,被 Apache 不少項目採用。
etcd 是用 go 開發的,主要是被 Kubernetes 採用。
zookeeper 很是穩定,是一個著名的分佈式協調系統,etcd 是後起之秀,前景廣闊。
由於 etcd 是用 go 寫的,如今尚未很好的 java 客戶端庫,須要經過 http 方式調用。
而 zookeeper 在這方面就成熟不少,對於 java 以外的其餘開發語言都有很好的客戶端庫。
具體選擇 zookeeper 仍是 etcd,須要根據您的需求結合它們各自的特性進行判斷,還有您所使用的開發語言。
翻譯整理自:
https://medium.com/@Imesha94/...