ZooKeeper 節點是有生命週期的,這取決於節點的類型。在 ZooKeeper 中,節點類型能夠分爲持久節點(PERSISTENT )、臨時節點(EPHEMERAL),以及時序節點(SEQUENTIAL ),具體在節點建立過程當中,通常是組合使用,能夠生成如下 4 種節點類型。node
在持久、臨時、順序節點 中 臨時節點是不能有子節點的,順序節點是直接在你給的節點路徑後邊加上序列號(不是在下一級目錄加序列號,好比你給的路徑是 /v1/123 那麼生成的順序節點形如 /v1/12300000001)分佈式
持久節點(PERSISTENT)
所謂持久節點,是指在節點建立後,就一直存在,直到有刪除操做來主動清除這個節點——不會由於建立該節點的客戶端會話失效而消失。
持久順序節點(PERSISTENT_SEQUENTIAL)
這類節點的基本特性和上面的節點類型是一致的。額外的特性是,在ZK中,每一個父節點會爲他的第一級子節點維護一份時序,會記錄每一個子節點建立的前後順序。基於這個特性,在建立子節點的時候,能夠設置這個屬性,那麼在建立節點過程當中,ZK會自動爲給定節點名加上一個數字後綴,做爲新的節點名。這個數字後綴的範圍是整型的最大值。
臨時節點(EPHEMERAL)
和持久節點不一樣的是,臨時節點的生命週期和客戶端會話綁定。也就是說,若是客戶端會話失效,那麼這個節點就會自動被清除掉。注意,這裏提到的是會話失效,而非鏈接斷開。另外,在臨時節點下面不能建立子節點。
臨時順序節點(EPHEMERAL_SEQUENTIAL)
能夠用來實現分佈式鎖ui
客戶端調用create()方法建立名爲「_locknode_/guid-lock-」的節點,須要注意的是,這裏節點的建立類型須要設置爲EPHEMERAL_SEQUENTIAL。
客戶端調用getChildren(「_locknode_」)方法來獲取全部已經建立的子節點,注意,這裏不註冊任何Watcher。
客戶端獲取到全部子節點path以後,若是發現本身在步驟1中建立的節點序號最小,那麼就認爲這個客戶端得到了鎖。
若是在步驟3中發現本身並不是全部子節點中最小的,說明本身尚未獲取到鎖。此時客戶端須要找到比本身小的那個節點,而後對其調用exist()方法,同時註冊事件監聽。
以後當這個被關注的節點被移除了,客戶端會收到相應的通知。這個時候客戶端須要再次調用getChildren(「_locknode_」)方法來獲取全部已經建立的子節點,確保本身確實是最小的節點了,而後進入步驟3。生命週期