一、前言
前面已經講解了Zookeeper的一些應用場景,但是并沒有深入到Zookeeper內部進行分析,本篇將講解其系統模型。
二、系統模型
2.1 數據模型
Zookeeper的數據節點稱為ZNode,ZNode是Zookeeper中數據的最小單元,每個ZNode都可以保存數據,同時還可以掛載子節點,因此構成了一個層次化的命名空間,稱為樹。

在Zookeeper中,事務是指能夠改變Zookeeper服務器狀態的操作,一般包括節點創建與刪除,數據節點內容更新和客戶端會話創建與失效,對于每個事務請求,Zookeeper都會為其分配一個全局唯一的事務ID,用ZXID表示,通常是64位的數字,每個ZXID對應一次更新操作,從這些ZXID中可以間接地識別出Zookeeper處理這些更新操作請求的全局順序。
2.2 節點特性
在Zookeeper中,每個數據節點都是由生命周期的,類型不同則會不同的生命周期,節點類型可以分為持久節點(PERSISTENT)、臨時節點(EPHEMERAL)、順序節點(SEQUENTIAL)三大類,可以通過組合生成如下四種類型節點
1. 持久節點(PERSISTENT)。節點創建后便一直存在于Zookeeper服務器上,直到有刪除操作來主動清楚該節點。
2. 持久順序節點(PERSISTENT_SEQUENTIAL)。相比持久節點,其新增了順序特性,每個父節點都會為它的第一級子節點維護一份順序,用于記錄每個子節點創建的先后順序。在創建節點時,會自動添加一個數字后綴,作為新的節點名,該數字后綴的上限是整形的最大值。
3. 臨時節點(EPEMERAL)。臨時節點的生命周期與客戶端會話綁定,客戶端失效,節點會被自動清理。同時,Zookeeper規定不能基于臨時節點來創建子節點,即臨時節點只能作為葉子節點。
4. 臨時順序節點(EPEMERAL_SEQUENTIAL)。在臨時節點的基礎添加了順序特性。
每個節點除了存儲數據外,還存儲了節點本身的一些狀態信息,可通過get命令獲取。
2.3 版本--保證分布式數據原子性操作
每個數據節點都具有三種類型的版本信息,對數據節點的任何更新操作都會引起版本號的變化。
version-- 當前數據節點數據內容的版本號
cversion-- 當前數據子節點的版本號
aversion-- 當前數據節點ACL變更版本號
上述各版本號都是表示修改次數,如version為1表示對數據節點的內容變更了一次。即使前后兩次變更并沒有改變數據內容,version的值仍然會改變。version可以用于寫入驗證,類似于CAS。
2.4 Watcher--數據變更通知
Zookeeper使用Watcher機制實現分布式數據的發布/訂閱功能。

Zookeeper的Watcher機制主要包括客戶端線程、客戶端WatcherManager、Zookeeper服務器三部分。客戶端在向Zookeeper服務器注冊的同時,會將Watcher對象存儲在客戶端的WatcherManager當中。當Zookeeper服務器觸發Watcher事件后,會向客戶端發送通知,客戶端線程從WatcherManager中取出對應的Watcher對象來執行回調邏輯。
2.5 ACL--保障數據的安全
Zookeeper內部存儲了分布式系統運行時狀態的元數據,這些元數據會直接影響基于Zookeeper進行構造的分布式系統的運行狀態,如何保障系統中數據的安全,從而避免因誤操作而帶來的數據隨意變更而導致的數據庫異常十分重要,Zookeeper提供了一套完善的ACL權限控制機制來保障數據的安全。
我們可以從三個方面來理解ACL機制:權限模式(Scheme)、授權對象(ID)、權限(Permission),通常使用"scheme:id:permission"來標識一個有效的ACL信息。
權限模式用來確定權限驗證過程中使用的檢驗策略,有如下四種模式:
1. IP,通過IP地址粒度來進行權限控制,如"ip:192.168.0.110"表示權限控制針對該IP地址,同時IP模式可以支持按照網段方式進行配置,如"ip:192.168.0.1/24"表示針對192.168.0.*這個網段進行權限控制。
2. Digest,使用"username:password"形式的權限標識來進行權限配置,便于區分不同應用來進行權限控制。Zookeeper會對其進行SHA-1加密和BASE64編碼。
3. World,最為開放的權限控制模式,數據節點的訪問權限對所有用戶開放。
4. Super,超級用戶,是一種特殊的Digest模式,超級用戶可以對任意Zookeeper上的數據節點進行任何操作。
授權對象是指權限賦予的用戶或一個指定實體,如IP地址或機器等。不同的權限模式通常有不同的授權對象。
權限是指通過權限檢查可以被允許執行的操作,Zookeeper對所有數據的操作權限分為CREATE(節點創建權限)、DELETE(節點刪除權限)、READ(節點讀取權限)、WRITE(節點更新權限)、ADMIN(節點管理權限)。
三、總結
本篇博客介紹了Zookeeper中的系統模型,系統模型的五個部分是Zookeeper提供一系列服務的基礎,之后筆者會結合源碼進行相應分析。謝謝各位園友觀看~