ZooKeeper提供的命名空間與標準的文件系統的命名空間很是相似;名稱是由斜槓(/)分隔的一系列路徑元素;ZooKeeper命名空間中的每一個節點都由路徑標識,以下圖;node
ZooKeeper命名空間中的每一個節點均可以具備與其關聯的數據以及子節點。就像擁有一個文件系統同樣,該文件系統也容許文件成爲目錄(ZooKeeper中的每一個節點會存儲一些自身的數據:狀態信息,配置,位置信息等,所以存儲在每一個節點上的數據一般很小,在字節到千字節範圍內);緩存
在ZooKeeper樹形結構中的每一個節點均可以稱爲znode;znode維持了一個stat結構,它包括數據變化的版本號、訪問控制列表變化、和時間戳,容許緩存驗證和協調更新;每當znode的數據有變化,版本號就會增長(例如,每當客戶端檢索數據時同時它也獲取數據的版本信息);bash
持久節點的存活時間不依賴於客戶端會話,只有客戶端在顯式執行刪除節點操做時,節點才消失;app
建立了一個持久節點/module,且其數據爲」demo」 create /module demo
該節點建立後持久存在,相對於持久節點它會在節點名稱後面自動增長一個10位數字的序列號,這個計數對於此節點的父節點是惟一,若是這個序列號大於2^32-1就會溢出;分佈式
create加上-s參數,能夠建立持久順序節點 create -s /module/app app
上面的命令便建立了一個持久順序節點/module/app0000000001;若是再執行此命令,則會生成節點 /module/app0000000002;spa
臨時節點的存活時間依賴於客戶端會話,當會話結束,臨時節點將會被自動刪除(固然也能夠手動刪除臨時節點);利用臨時節點的這一特性,咱們可使用臨時節點來進行集羣管理,包括髮現服務的上下線等; ZooKeeper規定,臨時節點不能擁有子節點;blog
建立了一個臨時節點 /module/app,數據爲」app」,會話關閉後,臨時節點會被刪除 create /module/app app
具備臨時節點特徵,可是它會有序列號,分佈式鎖中會用到該類型節點事務
create加上-s參數,能夠建立順序節點 create -s -e /module/app app
使用 get /module/app20000000001 獲取節點的數據,以下圖;get
cZxid | 建立節點時的事務ID |
ctime | 建立節點時的時間 |
mZxid | 最後修改節點的事務ID |
mtime | 最後修改節點時的時間 |
pZxid | 表示該節點的子節點列表最後一次修改的事務ID,添加子節點或刪除子節點就會影響子節點列表,可是修改子節點的數據內容則不影響該ID |
cversion | 子節點版本號,子節點每次修改版本號加1 |
dataversion | 數據版本號,數據每次修改該版本號加1 |
aclversion | 權限版本號,權限每次修改該版本號加1 |
ephemeralOwner | 用於臨時節點,表示建立該臨時節點的事務id,若是當前的節點不是臨時 節點,該字段值爲0 |
numChildren | 該節點擁有子節點的數量 |
Zookeeper裏面的版本號它表示的是對數據節點的內容、子節點列表或者ACL信息的修改次數;節點建立時dataversion、aclversion,cversion都爲0;io
Zookeeper中的版本號就是樂觀鎖,修改節點數據以前會讀取這個數據並記錄該數據版本號,當須要更新時會攜帶這個版本號去提交,若是此時攜帶的版本號(上次讀取出來的)和當前節點的版本號相同,則說明該數據沒有被修改過,那麼數據修改就會成功提交,若是數據修改失敗,說明該數據在你讀取以後和提交以前這段時間內被修改了。
經過set命令並攜帶正確的版本號提交更新,版本號相同更新就會成功,並將dataversion的值加1;
再次更新並使用以前的版本號那麼就會失敗;