文章目錄
1 、ZK數據模型
ZooKeeper的視圖結構和標準的Unix文件系統類似,其中每個節點稱爲“數據節點”或ZNode
,每個znode可以存儲數據,還可以掛載子節點,因此可以稱之爲“樹”。
需要注意的是
創建znode時,每個znode都必須指定值,如果沒有值,節點是不能創建成功的。
在Zookeeper中,znode是一個跟Unix文件系統路徑相似的節點,可以往這個節點存儲或獲取數據 ; 且通過客戶端可對znode進行增刪改查的操作,還可以註冊watcher監控znode的變化。 其數據模型可用下圖進行表示:
2 、ZK節點類型
持久(persistent)節點:
(1) session斷開後,數據不會丟失
(2)可以創建子節點
臨時(ephemeral)節點:
(1)session斷開後,數據會丟失
(2)不可以創建子節點
持久順序(PERSISTENT_SEQUENTIAL)節點:
(1)、(2)同持久節點
(3)創建順序節點時會默認設置順序標識,即znode名稱後會附加一個值 — 順序號 ,順序號是一個單調遞增的計數器,由父節點維護
臨時順序(EPHEMERAL_SEQUENTIAL)節點: —> ZK實現分佈式鎖的基礎。
(1)、(2)同臨時節點,(3)同持久順序節點
3 、ZK節點屬性
4、 ZK watch機制
所謂watch機制,簡單點理解就是某個客戶端(watcher)可以對ZK中的Node進行監聽(watch),當這個節點相關的數據發生變化時,ZK服務器會讓監聽這個節點的客戶端(watcher)感知到它監聽的節點具體發生了什麼變化(觸發客戶端的監聽事件)。
需要注意的是
:原生客戶端中ZK的watch 是一次性的,觸發後立即銷燬 —> 但 Apache Curator將其改造成了可以永久監聽。
下圖是可進行watch操作的命令:
4.1 NodeCreated — 監聽的節點(還未創建)被創建時觸發
4.2 NodeDataChanged — 監聽節點的數據發生改變時觸發
當然也可以用如下的方式(或者其他方式)進行監聽:
4.3 NodeDeleted — 監聽的節點被刪除時觸發
測試如下:
4.4 NodeChildrenChanged — 監聽的節點創建、刪除子節點時觸發(ls、ls2命令)
測試如下:
總結:
- Is/ls2爲父節點設置watch ,創建子節點會觸發 NodeChildrenChanged
- Is/ls2爲父節點設置watch ,刪除子節點會觸發 NodeChildrenChanged
但要格外注意:★★★★★
Is/ls2爲父節點設置watch ,修改子節點不觸發事件
驗證如下:
由此可知,我們想監聽子節點數據的變化,只能直接監聽那個子節點,即
end