與mysql、redis等軟件同樣,zookeeper的軟件包中也提供了客戶端程序用於對服務器上的數據進行操做。本節咱們就來學習zookeeper客戶端的使用方法。不過在詳細講解zk客戶端的使用方法以前,咱們會先來討論zookeeper的數據存儲結構,只有理解了zookeeper的數據存儲結構,纔會真正明白zk操做的真正含義。java
zookeeper採用樹狀結構對數據進行存儲,整個數據存儲結構很是相似於linux的文件系統。以下圖所示,節點node_1的路徑是/node_1,節點node_1_1的路徑是/node_1/node_1_1。zookeeper就是經過對這些節點進行建立、刪除、修改、讀取等操做來完成系統功能的。
node
在zookeeper的bin目錄下,名爲zkCli.sh的文件就是zookeeper爲咱們提供的客戶端腳本程序。咱們能夠經過它操做zookeeper服務器上的數據。使用zkCli.sh鏈接zk服務器的命令格式:./zkCli.sh -timeout 0 -server ip:port
。這裏的timeout參數是會話超時時間,單位是毫秒,若是在此時間內zk服務器沒有收到客戶端的心跳包,那麼這個會話就失效了。與zk服務器創建鏈接以下圖所示,注意到最後的提示符中有CONNECTED表明已經成功與服務器創建了鏈接。
mysql
執行h
命令能夠查看zookeeper支持的操做命令列表。
linux
這些命令大體可分爲增刪改查4種類型,下面咱們對其進行一一介紹。redis
ls命令用於列出某個節點下的全部子節點信息。
sql
此處列出了/節點下的所有子節點信息,因爲咱們尚未建立任何節點,因此只有一個zookeeper節點(由zk本身默認建立)存在。api
create命令用於建立一個新的節點,它的命令格式create [-s] [-e] path data acl
。path是節點的路徑,data是節點中存儲的數據值,acl是節點的權限(權限相關內容將在java api部分講解)。參數s表示建立一個順序節點。
服務器
上面的示例連續執行了3次create -s /node_1 123
命令,因爲加了參數-s,因此zk會自動在建立的節點名字後面增長一個後綴,而且後綴名字是遞增的。
參數e表示建立的是一個臨時節點,臨時節點只在本會話內有效,登出以後臨時節點就會被刪除。學習
下面例子建立了一個新的/node_1節點,用stat命令查看節點的信息以下:
spa
在zookeeper中,每次對數據節點的寫操做都是一個事務,每一個事務都有一個惟一的事務id做爲這個事務的標識。
cZxid就是建立這個節點的事務id。
ctime是建立這個節點的時間。
mZxid是最後更新該節點的事務id。
mtime是節點被最後更新的時間。
pZxid是節點的子節點列表被最後一次更新的事務id。子節點列表被更新只有兩種狀況,分別是「增長子節點」和「刪除子節點」。修改子節點的數據內容不包括在內。
cversion是當前節點的子節點的變動版本號。
dataVersion當前節點存儲數據內容的變動版本號。
aclVersion當前數據節點acl的變動版本號。上面3個版本號都可以用於實現樂觀鎖。
ephemeralOwner爲建立該臨時節點的事務id。若是是持久節點,那麼該值固定爲0。
dataLength表示當前節點存儲數據內容的長度。
numChildren表示當前節點包含的子節點個數。
get命令能夠獲取一個節點存儲的數據內容,同時能夠獲取該節點的stat信息。
ls2除了能夠列出當前節點的全部子節點,還能列出當前節點的stat信息。
delete命令能夠用於刪除一個節點,但它只能刪除沒有任何子節點的節點。在下面的例子中,節點/node_1中有一個子節點/node_1/node_1_1。因此不能用delete命令刪除節點/node_1。
以上就是zookeeper客戶端提供的比較重要的命令。注意在zookeeper的全部寫操做中,都有一個version字段,能夠利用這個字段實現樂觀鎖。