zookeeper客戶端的使用
與mysql、redis等軟體一樣,zookeeper的軟體包中也提供了客戶端程式用於對伺服器上的資料進行操作。本節我們就來學習zookeeper客戶端的使用方法。不過在詳細講解zk客戶端的使用方法之前,我們會先來討論zookeeper的資料儲存結構,只有理解了zookeeper的資料儲存結構,才會真正明白zk操作的真正含義。
zookeeper資料儲存結構
zookeeper採用樹狀結構對資料進行儲存,整個資料儲存結構非常類似於linux的檔案系統。如下圖所示,節點node_1的路徑是/node_1,節點node_1_1的路徑是/node_1/node_1_1。zookeeper就是通過對這些節點進行建立、刪除、修改、讀取等操作來完成系統功能的。
連線zookeeper伺服器
在zookeeper的bin目錄下,名為zkCli.sh的檔案就是zookeeper為我們提供的客戶端指令碼程式。我們可以通過它操作zookeeper伺服器上的資料。使用zkCli.sh連線zk伺服器的命令格式:./zkCli.sh -timeout 0 -server ip:port
。這裡的timeout引數是會話超時時間,單位是毫秒,如果在此時間內zk伺服器沒有收到客戶端的心跳包,那麼這個會話就失效了。與zk伺服器建立連線如下圖所示,注意到最後的提示符中有CONNECTED代表已經成功與伺服器建立了連線。
執行h
命令可以檢視zookeeper支援的操作命令列表。
這些命令大致可分為增刪改查4種類型,下面我們對其進行一一介紹。
ls檢視某個節點的全部子節點
ls命令用於列出某個節點下的所有子節點資訊。
此處列出了/節點下的全部子節點資訊,由於我們還沒有建立任何節點,所以只有一個zookeeper節點(由zk自己預設建立)存在。
create建立一個節點
create命令用於建立一個新的節點,它的命令格式create [-s] [-e] path data acl
。path是節點的路徑,data是節點中儲存的資料值,acl是節點的許可權(許可權相關內容將在java api部分講解)。引數s表示建立一個順序節點。
上面的示例連續執行了3次create -s /node_1 123
引數e表示建立的是一個臨時節點,臨時節點只在本會話內有效,登出之後臨時節點就會被刪除。
stat檢視一個節點的狀態資訊
下面例子建立了一個新的/node_1節點,用stat命令檢視節點的資訊如下:
在zookeeper中,每次對資料節點的寫操作都是一個事務,每個事務都有一個唯一的事務id作為這個事務的標識。
cZxid就是建立這個節點的事務id。
ctime是建立這個節點的時間。
mZxid是最後更新該節點的事務id。
mtime是節點被最後更新的時間。
pZxid是節點的子節點列表被最後一次更新的事務id。子節點列表被更新只有兩種情況,分別是“增加子節點”和“刪除子節點”。修改子節點的資料內容不包括在內。
cversion是當前節點的子節點的變更版本號。
dataVersion當前節點儲存資料內容的變更版本號。
aclVersion當前資料節點acl的變更版本號。上面3個版本號均可以用於實現樂觀鎖。
ephemeralOwner為建立該臨時節點的事務id。如果是持久節點,那麼該值固定為0。
dataLength表示當前節點儲存資料內容的長度。
numChildren表示當前節點包含的子節點個數。
get命令獲取當前節點儲存資料的內容
get命令可以獲取一個節點儲存的資料內容,同時可以獲取該節點的stat資訊。
ls2是ls的超級指令
ls2除了可以列出當前節點的所有子節點,還能列出當前節點的stat資訊。
set命令修改一個節點中儲存的資料
delete命令刪除節點
delete命令可以用於刪除一個節點,但它只能刪除沒有任何子節點的節點。在下面的例子中,節點/node_1中有一個子節點/node_1/node_1_1。所以不能用delete命令刪除節點/node_1。
以上就是zookeeper客戶端提供的比較重要的命令。注意在zookeeper的所有寫操作中,都有一個version欄位,可以利用這個欄位實現樂觀鎖。