ZK數據結構
zk總體保存數據的結構相似於文件系統的樹形結構。可是每一個節點能夠擁有一個名字,並做爲一個文件夾包括多個其餘節點,同時還能夠保存數據。
須要注意:node
- 空字符(\u0000)不能做爲名字
- \u0001 - \u0019 和\u007F - \u009F最好不要做爲名字的一部分,由於他們表示的字符很差顯示或者由於他們能夠被轉換成多種表現形式
- \ud800 -uF8FFF, \uFFF0-uFFFF, \uXFFFE -
\uXFFFF (where X is a digit 1 - E), \uF0000 - \uFFFFF 是不容許使用的
- 「.」能夠成爲名字的一部分,可是名字不能只含有」.」
- zookeeper是保留字段
經常使用命令:git
create /path data --建立節點/path, 並存儲數據data
delete /path --刪除節點/path
exists /path --檢查節點/path是否存在
setData /path data --設置節點/path的數據
getData /path --獲取節點/path的數據
getChildren /path --獲取節點/path的子節點
1. Znodes
每一個節點就是一個Znode,Znode有四種: 持久節點,臨時節點,持久連續節點,臨時連續節點服務器
- 持久節點只能經過delete調用才能刪除, 可用於存儲一些應用數據(即便它的建立者不存在了,但這些數據依然須要保存),如Master-Worker中的任務分配信息。
- 臨時節點,會在客戶端崩潰或斷開鏈接時被刪除,或者經過delete調用。好比, 在Master-Worker中的Master和Worker節點均採用臨時節點,當Master崩潰或鏈接斷開, 該節點將自動刪除,既而才能進行Master選舉,臨時節點暫時還不支持有子節點,即使之後支持, 其子節點也必須是臨時節點。
- 連續節點:一個Znode能夠被設置爲sequential,連續節點將被分配一個惟一且連續的整數, 該整數會追加到節點的path後,如客戶端建立一個path爲/task/task-的連續節點,最終節點的path會變成/task/task-1。
客戶端經過註冊來接收節點變化的通知。註冊接收通知經過Watch 來設置。而Watch是一次性操做,也就是隻能接收一次通知,若是須要繼續獲得通知, 則須要再次Watch。markdown
每一個Znode保存的數據的讀寫都是原子性的,讀取會得到一個Znode全部的數據,寫入會修改一個Znode全部的數據。Znode的數據訪問管理經過每一個Znode維護的訪問管理列表(Access Control List,ACL)實現。session
2. 時間記錄
zookeeper有多種方式記錄時間:數據結構
- Zxid: zk狀態每次的改變會收到一個Zxid(zookeeper transaction id),這個表示每一個改變的順序。每一個改變都會有一個全局惟一的Zxid,而且這個Zxid是遞增的。
- version number:每一個Znode都有三個版本號,Znode的每次修改都會增長這三個中的一個版本號
- version(Znode的數據改變,就會更新這個版本號)
- cversion(子節點改變)
- aversion(ACL改變)
- Ticks: 各類嘗試次數。配置裏面tickTime這個時間是做爲 Zookeeper 服務器之間或客戶端與服務器之間維持心跳的時間間隔,也就是每一個 tickTime 時間就會發送一個心跳。initLimit:這個配置項是用來配置 Zookeeper 接受客戶端(這裏所說的客戶端不是用戶鏈接 Zookeeper 服務器的客戶端,而是 Zookeeper 服務器集羣中鏈接到 Leader 的 Follower 服務器)初始化鏈接時最長能忍受多少個心跳時間間隔數。
- Real Time: zk通常不用實際時間,除了在新建Znode和更新時往Znode的統計中會放入實際時間
3. Znode的統計信息結構
- czxid:記錄znode建立時的zxid
- mzxid:記錄znode最近一次修改時的zxid
- ctime:記錄znode建立時的時間
- mtime:記錄znode最近一次修改時的時間
- version:Znode的數據改變,就會更新這個版本號
- cversion:子節點改變
- aversion:ACL改變
- ephemeralOwner:若是是臨時節點,則記錄擁有者的session id,若是不是臨時節點,則爲0
- dataLength:znode記錄的數據長度
- numChildren:子節點的個數