一. 數據模型:
? ? ZK擁有一個命名空間就像一個精簡的文件系統,不同的是它的命名空間中的每個節點擁有它自己或者它下面子節點相關聯的數據。ZK中必須使用絕對路徑也就是使用“/”開頭。
二. znode:
? ? zk目錄樹中每個節點對應一個znode。每個znode維護一些屬性,如:當前版本,數據版本,建立時間,修改時間等。
2.? 臨時節點:與持久節點相反,當創建該節點當客戶端崩潰或者關閉了與zk的連接時,節點就會被刪除,臨時節點也可以被非創建者主動刪除。臨時節點不允許有子節點(目前3.4.14版本)。
3.? 持久有序節點:一個znode可以設置為有序節點,設置zode時被分為唯一一個單調遞增的整數。當創建有序節點時,序號會被追加到路徑后。
4.? 臨時有序節點:具有臨時節點特征,但是它會有序列號,分布式鎖中會用到該類型節點。
?創建持久有序節點:
(-s為有序,-e為臨時, 默認為持久) 。
四.? znode 特性:
? 1. 監視(watches):? zk通常以遠程服務的方式被訪問,如果每次訪問znode時,客戶端都需要獲取節點中的內容,這樣代價就很大(如果內容不變,就沒有意義)。為了應對這種場景,zk提供了一個基于通知(notifaction)的機制,客戶端可以向zk中的node設置watch,當zode節點發生變化(觸發監視器)時,向客戶端發送一個通知。需要注意的是:監視點是一個單次觸發的操作,為接受多個通知,客戶端必須在每次通知后設置一個新的監視點。
2. 數據訪問:ZK上存儲的數據需要被原子性的操作(要么修改成功要么回到原樣),也是就讀操作將會讀取節點相關所有數據,寫操作也會修改節點相關所有數據,,而且每個節點都有自己的ACL。
五. znode時間和版本號:
zxid:ZK節點狀態改變會導致該節點收到一個zxid格式的時間戳,這個時間戳是全局有序的,每次更新都會產生一個新的。如果zxid1的值小于zxid2,那么說明zxid2發生的改變在zxid1之后。zxid是一個唯一的事務ID,具有遞增性,一個znode的建立或者更新都會產生一個新的zxid值。
version:每一個znode都有一個版本號,隨著每次數據變化而自增。有兩個api操作可以有條件執行: setdata和delete,這兩個調用以版本號作為傳入參數,只有當傳入參數的版本號與服務器上的版本號一致時,才會調用成功。
各字段內容解析:
?這個版本號的用途就和分布式場景的一個鎖概念有關。修改節點數據之前會讀取這個數據并記錄該數據版本號,當你需要更新時會攜帶這個版本號去提交,如果你此時攜帶的版本號(就是你上次讀取出來的)和當前節點的版本號相同則說明該數據沒有被修改過,那么你的提交就會成功,如果提交失敗說明該數據在你讀取之后和提交之前這段時間內被修改了。
?通過set命令并攜帶版本號提交更新,版本號相同更新就會成功。
? --------------------------------------------------------------------------------------------------------------------------
? ? ? ? ? ? ? ? ? ? ? ? ?深耕運維行業多年,擅長運維體系建設,方案落地。歡迎交流!
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?“V-x”: ywjw996
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?《 運維經緯 》