天天看點

Zookeeper系統模型

資料模型

        Zookeeper的視圖模型和Unix的檔案系統非常相似,但是沒有引入傳統檔案系統的目錄和檔案等概念,而是使用了特有的“資料節點”,即ZNode。Znode是Zookeeper中 資料的最小單元,每個ZNode上都可以存儲資料和挂載子節點,進而構成一個階層化的命名空間,稱為樹。

節點類型

        Zookeeper中 資料節點分為持久節點和順序節點兩類,兩類節點都有一個SEQUENTIAL屬性。通過組合可生成四種組合節點類型:

        持久節點:節點建立後會一直存在于Zookeeper服務 器上,直到有删除操作來主動清除這個節點。

        持久順序節點:基本特性與持久節點一緻。不同的是,Zookeeper會在其節點名後追加一個由其父節點維護的順序清單生成的自增數字做為字尾來做為新的完整的節點名。數字字尾的上限是整型最大值。

        臨時節點:臨時節點的聲明周期與用戶端聲明周期一緻。Zookeeper中規定不能基于臨時節點建立子節點。

        臨時順序節點:基本特性與臨時節點一緻。不同的是添加了順序特性。

節點狀态

       每個資料節點除了存儲資料内容之外,還存儲了資料節點本身的一些狀态資訊。Stat類包含了Zookeeper上一個資料節點的所有狀态資訊。

        czxid:reated ZXID,表示該節點被建立時的事務ID。

        mzxid:Modified ZXID,表示該節點最後一次被更新時的事務ID。

        ctime:表示節點被建立的時間。

        mtime:表示該節點最後一次被更新時的時間。

        version:資料節點的版本号。

        cversion:子節點的版本号。

        aversion:節點的ACL版本号。

        ephemeralOwner:建立該臨時節點的會話的SessionID。如果該節點為持久節點,那麼這個屬性值為0。

        dataLength:資料内容的長度。

        numChildren:目前節點的子節點個數。

        pzxid:表示該節點的子節點清單最後一次被修改時的事務ID。隻有子節點清單變更了才會變更pzxid,子節點内容變更不會影響pzxid。

版本

        在Zookeeper中通過版本來保證分布式資料原子性操作。在處理每一個資料更新請求時,首先擷取目前請求的版本version,同時從資料記錄中擷取目前服務 器上該資料的最新版本cuurentVersion。如果version為-1,表示不需要樂觀鎖,忽略版本對比,否則對version和currentVersion進行對比,如果版本不比對則抛出BadVersionException異常,否則會對version進行加1操作。

 Watcher

        在Zookeeper中通過watcher機制來進行資料變更的通知。Zookeeper的Watcher機制主要包括用戶端線程、用戶端WatcherManager和Zookeeper服務 器三部分。用戶端向Zookeeper服務 器注冊Watcher時,會将Watcher對象存儲在用戶端的WatcherManager中,當Zookeeper服務 器觸發Watcher事件後,會向用戶端發送通知,用戶端線程從WatcherManager中取出對應的Watcher對象來執行回調邏輯。

ACL

        在Zookeeper中通過ACL機制來保證資料的安全。一個有效的ACL資訊通常包括三部分:scheme:id:permission。

        scheme:權限模式,通常用來确定權限驗證過程中使用的檢驗政策。

        id:授權對象,權限賦予的一個使用者或指定實體,不同的模式下授權對象也不同。

        permission:權限,通過權限檢查後允許的操作。分為CREATE、DELETE、READ、WRITE、ADMIN五類。