本篇將會介紹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/
同樣,這里我就不演示使用方法了,自己去探索研究吧。