文章目錄
- Zookeeper基礎
- 概述
- 數據結構
- Zookeeper節點操作
- zookeeper節點操作命令
- 數據模型 znode 結構
- zookeeper java客戶端
- ZooKeeper原生API
- Curator
- zkClient
- 對比總結
Zookeeper基礎
概述
- zookeeper(分布式協調服務) 本質:小型的文件存儲系統+監聽通知機制
- ZooKeeper 是 Apache 軟件基金會的一個軟件項目,它為大型分布式計算提供開源的分布式配置服務、同步服務和命名注冊。
- ZooKeeper 的架構通過冗余服務實現高可用性(CP)[CAP:一致性、可用性、分區容錯性](最終一致性)。
- Zookeeper 的設計目標是將那些復雜且容易出錯的分布式一致性服務封裝起來,構成一個高效可靠的原語集,并以一系列簡單
易用的接口提供給用戶使用。
一個典型的分布式數據一致性的解決方案,分布式應用程序可以基于它實現諸如數據發布/訂閱、負載均衡、命名服務、分布式
協調/通知、集群管理、Master 選舉、分布式鎖和分布式隊列等功
數據結構
- zookeeper本身是一個樹形目錄服務(名稱空間),非常類似于標準文件系統,key-value 的形式存儲。名稱 key 由斜線 / 分
割的一系列路徑元素,zookeeper 名稱空間中的每個節點都是由一個路徑來標識的。
- 每個路徑下的節點key(完整路徑,名稱)是唯一的,即同一級節點 key 名稱是唯一的
- 每個節點中存儲了節點value和對應的狀態屬性
Zookeeper節點操作
zookeeper節點操作命令
數據模型 znode 結構
zookeeper java客戶端
- zookeeper 原生API:session不支持超時重連,watch監聽需要進行反復注冊、不支持對節點的遞歸操作
- Curator:提供各個場景的實現,提供了一套fluent風格的API調用
- zkClient:幾乎沒有參考文檔,異常處理簡化,沒有提供各個場景對應的實現
ZooKeeper原生API
- ZooKeeper原生API是Apache ZooKeeper項目自帶的Java客戶端庫。它提供了連接ZooKeeper集群并執行基本操作的功能。雖然它足夠靈活,但在處理復雜的分布式系統任務時可能顯得有些繁瑣。
- 優點:
- 官方支持,與ZooKeeper項目保持一致。
- 原生API直接暴露ZooKeeper的底層操作,可以更好地理解ZooKeeper的工作原理。
- 缺點:
- 使用復雜,需要處理連接管理、會話超時等底層細節。
- 需要手動編寫一些常見的模式(例如分布式鎖、隊列)。
Curator
- Curator是Netflix開發的一個基于ZooKeeper的高級客戶端庫。它構建在ZooKeeper原生API之上,簡化了許多常見任務的實現,如分布式鎖、選舉、緩存和Leader選舉等。
- 優點:
- 提供了高級別的抽象,簡化了ZooKeeper的使用。
- 包含了一系列常見的分布式系統模式的實現,如分布式鎖、隊列等。
- 提供了更多的錯誤處理機制和易用性改進。
- 缺點:
- 引入了額外的依賴,增加了項目的復雜性。
- 概念相對較多,學習曲線較陡。
zkClient
- zkClient是Apache Kafka項目中的一個ZooKeeper客戶端庫。它提供了一些高級別的API,簡化了ZooKeeper的連接和操作。
- 優點:
- 相對于ZooKeeper原生API,zkClient提供了更高級別的抽象。
- 更容易上手,相對于Curator,zkClient的概念和學習曲線較為簡單。
- 缺點:
- 社區支持相對較少。
- 功能相對較為有限,對于某些復雜場景可能不夠靈活。
對比總結
特性 | ZooKeeper原生API | Curator | zkClient |
---|---|---|---|
抽象級別 | 較低 | 高 | 中 |
復雜度 | 較高 | 較高 | 中 |
功能完備性 | 一般 | 高 | 一般 |
社區支持 | Apache官方支持 | Netflix支持 | 相對較少 |
學習曲線 | 陡峭 | 陡峭 | 平緩 |