一、znode
Zookeeper維護一個類似文件系統的數據結構。簡單來說,有點類似windows中注冊表的結構,有名稱,有樹節點,有Key(鍵)/Value(值)對的關系,可以看做一個樹形結構的數據庫,分布在不同的機器上做名稱管理。
Znode維護了一個stat結構,這個stat包含數據變化的版本號、訪問控制列表變化、還有時間戳。版本號和時間戳一起,可讓Zookeeper驗證緩存和協調更新。每次znode的數據發生了變化,版本號就增加。
例如,無論何時客戶端檢索數據,它也一起檢索數據的版本號。並且當客戶端執行更新或刪除時,客戶端必須提供他正在改變的znode的版本號。如果它提供的版本號和真實的數據版本號不一致,更新將會失敗。
二、通知機制
客戶端注冊監聽他關心的目錄節點,當目錄節點發生變化(數據改變、被刪除、子目錄節點增加刪除)時,zookeeper會通知客戶端。
client端會對某個znode建立一個watcher事件,當該znode發生變化時,zk會主動通知watch這個znode的client,然后client根據znode的變化來做出業務上的改變等。
watcher的特點:
-
輕量級:一個callback函數。
-
異步性:不會block正常的讀寫請求。
-
主動推送:Watch被觸發時,由Zookeeper服務端主動將更新推送給客戶端。
-
一次性:數據變化時,Watch只會被觸發一次。如果客戶端想得到后續更新的通知,必須要在 Watch 被觸發后重新注冊一個 Watch。
-
僅通知:僅通知變更類型,不附帶變更后的結果。
-
順序性:如果多個更新觸發了多個Watch,那 Watch 被觸發的順序與更新順序一致。
使用watch的注意事項:
-
由於watcher是一次性的,所以需要自己去實現永久watch
-
如果被watch的節點頻繁更新,會出現“丟數據”的情況
-
watcher數量過多會導致性能下降