ZNode(數據節點)是 ZooKeeper 中數據的最小單元,每一個ZNode上均可以保存數據,同時仍是能夠有子節點(這就像樹結構同樣,以下圖所示)。能夠看出,節點路徑標識方式和Unix文件 系統路徑很是類似,都是由一系列使用斜槓"/"進行分割的路徑表示,開發人員能夠向這個節點中寫人數據,也能夠在節點下面建立子節點。這些操做咱們後面都會介紹到。 node
提到 ZooKeeper 數據模型,還有一個不得不得提的東西就是 事務 ID 。事務的ACID(Atomic:原子性;Consistency:一致性;Isolation:隔離性;Durability:持久性)四大特性我在這裏就很少說了,相信你們也已經挺膩了。linux
在Zookeeper中,事務是指可以改變 ZooKeeper 服務器狀態的操做,咱們也稱之爲事務操做或更新操做,通常包括數據節點建立與刪除、數據節點內容更新和客戶端會話建立與失效等操做。對於每個事務請求,ZooKeeper 都會爲其分配一個全局惟一的事務ID,用 ZXID 來表示,一般是一個64位的數字。每個ZXID對應一次更新操做,從這些 ZXID 中能夠間接地識別出Zookeeper處理這些更新操做請求的全局順序。shell
每一個 ZNode 由2部分組成:服務器
以下所示,我經過 get 命令來獲取 根目錄下的 dubbo 節點的內容。(get 命令在下面會介紹到)分佈式
[zk: 127.0.0.1:2181(CONNECTED) 6] get /dubbo # 該數據節點關聯的數據內容爲空 null # 下面是該數據節點的一些狀態信息,其實就是 Stat 對象的格式化輸出 cZxid = 0x2 ctime = Tue Nov 27 11:05:34 CST 2018 mZxid = 0x2 mtime = Tue Nov 27 11:05:34 CST 2018 pZxid = 0x3 cversion = 1 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 0 numChildren = 1
這些狀態信息其實就是 Stat 對象的格式化輸出。Stat 類中包含了一個數據節點的全部狀態信息的字段,包括事務ID、版本信息和子節點個數等,以下圖所示(圖源:《從Paxos到Zookeeper 分佈式一致性原理與實踐》,下面會介紹經過 stat 命令查看數據節點的狀態)。學習
Stat 類:測試
關於數據節點的狀態信息說明(也就是對Stat 類中的各字段進行說明),能夠參考下圖(圖源:《從Paxos到Zookeeper 分佈式一致性原理與實踐》)。操作系統
進入安裝 ZooKeeper文件夾的 bin 目錄下執行下面的命令鏈接 ZooKeeper 服務(Linux環境下)(鏈接以前首選要肯定你的 ZooKeeper 服務已經啓動成功)。3d
./zkCli.sh -server 127.0.0.1:2181
從上圖能夠看出控制檯打印出了不少信息,包括咱們的主機名稱、JDK 版本、操做系統等等。若是你成功看到這些信息,說明你成功鏈接到 ZooKeeper 服務。code
help 命令查看 zookeeper 經常使用命令
經過 create 命令在根目錄建立了node1節點,與它關聯的字符串是"node1"
[zk: 127.0.0.1:2181(CONNECTED) 34] create /node1 「node1」
經過 create 命令在根目錄建立了node1節點,與它關聯的內容是數字 123
[zk: 127.0.0.1:2181(CONNECTED) 1] create /node1/node1.1 123 Created /node1/node1.1
[zk: 127.0.0.1:2181(CONNECTED) 11] set /node1 "set node1"
get 命令能夠獲取指定節點的數據內容和節點的狀態,能夠看出咱們經過set 命令已經將節點數據內容改成 "set node1"。
set node1 cZxid = 0x47 ctime = Sun Jan 20 10:22:59 CST 2019 mZxid = 0x4b mtime = Sun Jan 20 10:41:10 CST 2019 pZxid = 0x4a cversion = 1 dataVersion = 1 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 9 numChildren = 1
經過 ls 命令查看根目錄下的節點
[zk: 127.0.0.1:2181(CONNECTED) 37] ls / [dubbo, zookeeper, node1]
經過 ls 命令查看 node1 目錄下的節點
[zk: 127.0.0.1:2181(CONNECTED) 5] ls /node1 [node1.1]
zookeeper 中的 ls 命令和 linux 命令中的 ls 相似, 這個命令將列出絕對路徑path下的全部子節點信息(列出1級,並不遞歸)
經過 stat 命令查看節點狀態
[zk: 127.0.0.1:2181(CONNECTED) 10] stat /node1 cZxid = 0x47 ctime = Sun Jan 20 10:22:59 CST 2019 mZxid = 0x47 mtime = Sun Jan 20 10:22:59 CST 2019 pZxid = 0x4a cversion = 1 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 11 numChildren = 1
上面顯示的一些信息好比cversion、aclVersion、numChildren等等,我在上面 「ZNode(數據節點)的結構」 這部分已經介紹到。
ls2 命令更像是 ls 命令和 stat 命令的結合。ls2 命令返回的信息包括2部分:子節點列表 + 當前節點的stat信息。
[zk: 127.0.0.1:2181(CONNECTED) 7] ls2 /node1 [node1.1] cZxid = 0x47 ctime = Sun Jan 20 10:22:59 CST 2019 mZxid = 0x47 mtime = Sun Jan 20 10:22:59 CST 2019 pZxid = 0x4a cversion = 1 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 11 numChildren = 1
這個命令很簡單,可是須要注意的一點是若是你要刪除某一個節點,那麼這個節點必須無子節點才行。
[zk: 127.0.0.1:2181(CONNECTED) 3] delete /node1/node1.1
在後面我會介紹到 Java 客戶端 API的使用以及開源 Zookeeper 客戶端 ZkClient 和 Curator 的使用。
QQ討論羣組:984370849 706564342 歡迎加入討論
想要深刻學習的同窗們能夠加入QQ羣討論,有全套資源分享,經驗探討,沒錯,咱們等着你,分享互相的故事!