ZooKeeper 數據模型詳解 一點課堂(多岸學院)

ZooKeeper 數據模型

ZNode(數據節點)是 ZooKeeper 中數據的最小單元,每一個ZNode上均可以保存數據,同時仍是能夠有子節點(這就像樹結構同樣,以下圖所示)。能夠看出,節點路徑標識方式和Unix文件 系統路徑很是類似,都是由一系列使用斜槓"/"進行分割的路徑表示,開發人員能夠向這個節點中寫人數據,也能夠在節點下面建立子節點。這些操做咱們後面都會介紹到。 ZooKeeper 數據模型node

提到 ZooKeeper 數據模型,還有一個不得不得提的東西就是 事務 ID 。事務的ACID(Atomic:原子性;Consistency:一致性;Isolation:隔離性;Durability:持久性)四大特性我在這裏就很少說了,相信你們也已經挺膩了。linux

在Zookeeper中,事務是指可以改變 ZooKeeper 服務器狀態的操做,咱們也稱之爲事務操做或更新操做,通常包括數據節點建立與刪除、數據節點內容更新和客戶端會話建立與失效等操做。對於每個事務請求,ZooKeeper 都會爲其分配一個全局惟一的事務ID,用 ZXID 來表示,一般是一個64位的數字。每個ZXID對應一次更新操做,從這些 ZXID 中能夠間接地識別出Zookeeper處理這些更新操做請求的全局順序shell

ZNode(數據節點)的結構

每一個 ZNode 由2部分組成:服務器

  • stat:狀態信息
  • data:數據內容

以下所示,我經過 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 類

關於數據節點的狀態信息說明(也就是對Stat 類中的各字段進行說明),能夠參考下圖(圖源:《從Paxos到Zookeeper 分佈式一致性原理與實踐》)。操作系統

數據節點的狀態信息說明

測試 ZooKeeper 中的常見操做

鏈接 ZooKeeper 服務

進入安裝 ZooKeeper文件夾的 bin 目錄下執行下面的命令鏈接 ZooKeeper 服務(Linux環境下)(鏈接以前首選要肯定你的 ZooKeeper 服務已經啓動成功)。3d

./zkCli.sh -server 127.0.0.1:2181

鏈接 ZooKeeper 服務

從上圖能夠看出控制檯打印出了不少信息,包括咱們的主機名稱、JDK 版本、操做系統等等。若是你成功看到這些信息,說明你成功鏈接到 ZooKeeper 服務。code

查看經常使用命令(help 命令)

help 命令查看 zookeeper 經常使用命令

help 命令

建立節點(create 命令)

經過 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

更新節點數據內容(set 命令)

[zk: 127.0.0.1:2181(CONNECTED) 11] set /node1 "set node1"

獲取節點的數據(get 命令)

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 命令)

經過 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 命令)

經過 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 命令)

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

刪除節點(delete 命令)

這個命令很簡單,可是須要注意的一點是若是你要刪除某一個節點,那麼這個節點必須無子節點才行。

[zk: 127.0.0.1:2181(CONNECTED) 3] delete /node1/node1.1

在後面我會介紹到 Java 客戶端 API的使用以及開源 Zookeeper 客戶端 ZkClient 和 Curator 的使用。

參考

在這裏插入圖片描述 QQ討論羣組:984370849 706564342 歡迎加入討論

想要深刻學習的同窗們能夠加入QQ羣討論,有全套資源分享,經驗探討,沒錯,咱們等着你,分享互相的故事! 在這裏插入圖片描述

相關文章
相關標籤/搜索