1. 程式人生 > >【分散式】Zookeeper客戶端基本的使用

【分散式】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命令,由於加了引數-s,所以zk會自動在建立的節點名字後面增加一個字尾,並且字尾名字是遞增的。
  引數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欄位,可以利用這個欄位實現樂觀鎖。

 

摘自:https://segmentfault.com/a/1190000012070655