Zookeeper客戶端使用

本篇將會介紹Zookeeper自帶的客戶端腳本,Java客戶端API和開源客戶端。

1、客戶端腳本

在Zookeeper的安裝目錄下的 /bin 文件夾中有一個 zkCli.sh 腳本,這個是官方提供的客戶端腳本。

1.1、連接

可以直接運行zkCli.sh腳本,默認就是連接本地的Zookeeper服務器。

sh zkCli.sh

如果想連接指定的Zookeeper服務器,需要在后面添加一些參數。

sh zkCli.sh -server ip:port
  • -server:表示指定Zookeeper服務器,后面跟服務器的IP地址和端口號。

例子:

指定連接 192.168.0.10 上的 Zookeeper 服務器。

sh zkCli.sh -server 192.168.0.10:2181

1.2、創建

使用 create 命令可以創建一個 ZNode 節點。默認創建永久節點。用法如下:

create [-s] [-e] path data acl
  • -s:表示創建一個順序節點。
  • -e:表示創建一個臨時節點。
  • path:表示要創建的節點路徑名。
  • data:表示要創建的節點數據。
  • acl:表示要創建的節點的訪問控制列表。可以不寫,默認為 world:anyone:cdrwa。

注意:

  • 不可以遞歸創建。例如:創建 /create/node 節點時,其父節點 /create 必須已經存在。
  • 臨時節點下不可以創建子節點。

例子:

創建一個永久順序節點,節點路徑為 /node,節點數據為 node,訪問控制列表為 ip:192.168.0.10:cdrwa**。

create -s /node "node" ip:192.168.0.10:cdrwa

1.3、讀取

1.3.1、ls

使用 ls 命令可以列出 Zookeeper 指定節點下的所有下級節點。用法如下:

ls path [watch]
  • path:表示要查詢的節點路徑。
  • watch:表示是否開啟監控,監控 path 下的子節點變化(NodeChildrenChanged,NodeDeleted)。

例子:

列出根節點下的所有子節點。/ 表示根節點。

ls /
1.3.3、ls2

使用 ls2 命令可以列出 Zookeeper 指定節點下的所有下級節點,并且顯示當前節點的屬性信息。用法如下:

ls2 path [watch]
  • path:表示要查詢的節點路徑。
  • watch:表示是否開啟監控,監控 path 下的子節點變化。

例子:

列出根節點下的所有子節點,并且查看根節點的屬性信息。/ 表示根節點。

ls2 /
1.3.2、get

使用 get 命令可以獲取 Zookeeper 指定節點的數據內容和屬性信息。用法如下:

get path [watch]
  • path:表示要查詢的節點路徑。
  • watch:表示是否開啟監控,監控節點變化(NodeDataChanged,NodeDeleted)。

例子:

獲取 /node 節點的數據和屬性信息。

get /node

1.4、更新

使用 set 命令可以更新指定節點的數據內容。用法如下:

set path data [version]
  • path:表示要更新的節點路徑名。
  • data:表示要更新的節點數據。
  • version:表示指定基于哪個節點數據版本進行更新。

例子:

更新 /node 節點數據為 test。

set /node "test"

1.5、刪除

1.5.1、delete

使用 delete 命令可以刪除 Zookeeper 上的指定節點。用法如下:

delete path [version]
  • path:表示要刪除的節點路徑名。
  • version:表示指定基于哪個節點數據版本進行刪除。

注意:不支持遞歸刪除。例如:刪除 /create 節點時,其節點下不能存在子節點。

例子:

刪除 /node 節點。

delete /node
1.5.2、rmr

使用 rmr 命令可以遞歸刪除 Zookeeper 上的指定節點和其所有的子節點。用法如下:

rmr path
  • path:表示要刪除的節點路徑名。

例子:

刪除 /node 節點和其下的所有子節點。

rmr /node

1.6、ACL

1.6.1、setAcl

使用 setAcl 命令可以設置 Zookeeper 上的指定節點的訪問控制列表,即訪問權限。具體可以設置哪些訪問權限,請閱讀 Zookeeper深入原理。用法如下:

setAcl path acl
  • path:表示要設置權限的節點路徑名。
  • acl:表示要設置的權限列表,可以設置多種權限。

例子:

為 /node 節點設置權限 ip:192.168.0.10:cdrwa

setAcl /node ip:192.168.0.10:cdrwa
1.6.2、getAcl

使用 getAcl 命令可以獲取 Zookeeper 上的指定節點的訪問控制列表。用法如下:

getAcl path
  • path:表示要獲取權限的節點路徑名。

例子:

獲取 /node 節點的訪問控制列表。

getAcl /node

1.7、其他

1.7.1、stat

使用 stat 命令可以獲取 Zookeeper 上的指定節點的屬性信息。用法如下:

stat path [watch]
  • path:表示要獲取屬性信息的節點路徑名。
  • watch:表示是否開啟監控,監控節點變化(NodeDataChanged,NodeDeleted)。

例子:

查看 /node 節點屬性信息。

stat /node
1.7.2、connect

使用 connect 命令可以連接 Zookeeper 上的指定服務器。用法如下:

connect host:port
  • host:表示要連接的 Zookeeper 服務器IP。
  • port:表示要連接的 Zookeeper 服務器端口號。

例子:

連接 192.168.0.12:2181 Zookeeper 服務器。

connect 192.168.0.12:2181
1.7.3、close

使用 close 命令可以關閉當前會話。用法如下:

close
1.7.4、quit

使用 quit 命令可以退出當前客戶端。用法如下:

quit

2、Java客戶端API

Zookeeper 官方提供了很多編程語言的客戶端API,這里我只介紹Java客戶端API。

API地址:https://zookeeper.apache.org/doc/r3.4.14/api/index.html

2.1、創建會話

客戶端可以通過創建一個 Zookeeper(org.apache.zookeeper.Zookeeper) 實例來連接 Zookeeper服務器。

API列表:

  • Zookeeper(String connectString, int sessionTimeout, Watcher watcher)
  • Zookeeper(String connectString, int sessionTimeout, Watcher watcher, boolean canBeReadOnly)
  • Zookeeper(String connectString, int sessionTimeout, Watcher watcher, long sessionId, byte[] sessionPasswd)
  • Zookeeper(String connectString, int sessionTimeout, Watcher watcher, long sessionId, byte[] sessionPasswd, boolean canBeReadOnly)

參數介紹:

參數名 說明
connectString Zookeeper服務器連接地址,多個服務器可以使用 , 連接。例如:192.168.0.10:2181,192.168.0.11:2181,192.168.0.12:2181
sessionTimeout 指會話的超時時間,單位是毫秒。
watcher Zookeeper允許客戶端在構造方法中傳入一個接口 Watcher 的實現類對象來作為默認的 Watcher 事件通知處理器。該參數也可以設置為 null,表明不設置默認的 Watcher 處理器。
canBeReadOnly 這是一個 boolean 類型的參數,用于標識當前會話是否支持只讀模式。
sessionId 和 sessionPasswd 分別代表會話ID 和 會話密鑰。這兩個參數能夠唯一確定一個會話,同時客戶端可以使用這兩個參數實現客戶端會話復用,從而達到恢復會話的效果。

2.2、創建節點

客戶端可以通過Zookeeper的API來創建一個數據節點。

API列表:

  • String create(String path, byte[] data, List<ACL> acl, CreateMode createMode)
  • void create(String path, byte[] data, List<ACL> acl, CreateMode createMode, AsyncCallback.StringCallback cb, Object ctx)

參數介紹:

參數名 說明
path 要創建的節點路徑。
data 要創建的節點的數據內容。
acl 要創建的節點訪問控制列表。
createMode 要創建的節點的節點類型。節點類型:持久,持久順序,臨時,臨時順序。
cb 回調函數,用于異步創建時使用。
ctx 上下文信息,用于異步創建時傳遞數據使用。

2.3、讀取數據

讀取數據包括節點數據的獲取和子節點列表的獲取。

2.3.1、getData

客戶端可以通過 Zookeeper 的 API 來獲取一個節點的數據內容。

API列表:

  • byte[] getData(String path, boolean watch, Stat stat)
  • byte[] getData(String path, Watcher watcher, Stat stat)
  • void getData(String path, boolean watch, AsyncCallback.DataCallback cb, Object ctx)
  • void getData(java.lang.String path, Watcher watcher, AsyncCallback.DataCallback cb, Object ctx)

參數介紹:

參數名 說明
path 指定數據節點的節點路徑
watch 表明是否需要注冊一個 Watcher。如果是就使用默認的 Watcher。
stat 指定數據節點的狀態信息。
watcher 注冊Watcher。
cb 回調函數,用于異步獲取數據時使用。
ctx 上下文信息,用于異步獲取數據時傳遞數據使用。
2.3.2、getChildren

客戶端可以通過 Zookeeper 的 API 來獲取一個節點的所有子節點。

API列表:

  • List<String> getChildren(String path, boolean watch)
  • void getChildren(String path, boolean watch, AsyncCallback.Children2Callback cb, Object ctx)
  • void getChildren(String path, boolean watch, AsyncCallback.ChildrenCallback cb, Object ctx)
  • List<String> getChildren(String path, boolean watch, Stat stat)
  • List<String> getChildren(String path, Watcher watcher)
  • void getChildren(String path, Watcher watcher, AsyncCallback.Children2Callback cb, Object ctx)
  • void getChildren(String path, Watcher watcher, AsyncCallback.ChildrenCallback cb, Object ctx)
  • List<String> getChildren(String path, Watcher watcher, Stat stat)

參數介紹:

參數名 說明
path 指定數據節點的節點路徑。
watch 表明是否需要注冊一個 Watcher。如果是就使用默認的 Watcher。
watcher 注冊Watcher。
cb 回調函數,用于異步獲取數據時使用。
ctx 上下文信息,用于異步獲取數據時傳遞數據使用。
stat 指定數據節點的節點狀態信息。

2.4、更新數據

客戶端可以通過 Zookeeper 的 API 來更新一個節點的數據內容。

API列表:

  • Stat setData(String path, byte[] data, int version)
  • void setData(String path, byte[] data, int version, AsyncCallback.StatCallback cb, Object ctx)

參數介紹:

參數名 說明
path 指定數據節點的節點路徑。
data[] 一個字節數組,即需要使用該數據內容來覆蓋節點現在的數據內容。
version 指定節點的數據版本。
cb 回調函數,用于異步更新數據時使用。
ctx 上下文信息,用于異步更新數據時傳遞數據使用。

2.5、刪除節點

客戶端可以通過Zookeeper的API來刪除一個數據節點。

API列表:

  • void delete(String path, int version)
  • void delete(String path, int version, AsyncCallback.VoidCallback cb, Object ctx)

參數介紹:

參數名 說明
path 要刪除的節點路徑
version 指定節點的數據版本
cb 回調函數,用于異步刪除時使用。
ctx 上下文信息,用于異步刪除時傳遞數據使用。

2.6、檢測節點是否存在

客戶端可以通過 Zookeeper 的 API 來檢測節點是否存在。

API列表:

  • State exists(String path, boolean watch)
  • State exists(String path, Watcher watcher)
  • void exists(String path, boolean watch, AsyncCallback.StatCallback cb, Object ctx)
  • void exists(String path, Watcher watcher, AsyncCallback.StatCallback cb, Object ctx)

參數介紹:

參數名 說明
path 指定數據節點的節點路徑。
watch 指定是否復用 Zookeeper 中默認的 Watcher。
watcher 注冊的Watcher,用于監聽以下三類事件:節點被創建、節點被刪除、節點被更新
cb 回調函數,用于異步檢測節點是否存在時使用。
ctx 上下文信息,用于異步檢測節點是否存在時傳遞數據使用。

3、開源客戶端

3.1、ZkClient

ZkClient 是 Github 上一個開源的 Zookeeper 客戶端,是由 Datameer 的工程師 Stefan Groschupf 和 Peter Voss 一起開發的。ZkClient 在 Zookeeper 原生 API 接口之上進行了包裝,是一個更易用的Zookeeper 客戶端。同時,ZkClient 在內部實現了諸如 Session 超時重連、Watcher 反復注冊等功能,使得 Zookeeper 客戶端的這些繁瑣的細節工作對開發人員透明。

這里我就不演示使用方法了,自己去探索研究吧。

3.2、Curator

Curator 是 Netflix 公司開源的一套 Zookeeper 客戶端框架,其作者是 Jordan Zimmerman。和 ZkClient 一樣,Curator 解決了很多 Zookeeper 客戶端非常底層的細節開發工作,包括連接重連、反復注冊 Watcher 和 NodeExistsException 異常等,目前已經成為了 Apache 的頂級項目,是全世界范圍內使用最廣泛的 Zookeeper 客戶端之一。并且,Curator 在 Zookeeper 原生API的基礎上進行了包裝,提供了一套易用性和可讀性更強的 Fluent 風格的客戶端 API 框架。

除此之外,Curator 中還提供了 Zookeeper 各種應用場景(Recipe,如共享鎖服務、Master選舉機制和分布式計數器等)的抽象封裝。

官網地址:http://curator.apache.org/

同樣,這里我就不演示使用方法了,自己去探索研究吧。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容