Zookeeper快速入門
一、安裝
- 安裝
環境要求:必須要有jdk環境
從官網https://archive.apache.org/dist/zookeeper/下載最新的版本,如:zookeeper-3.4.9.tar.gz
如果是windows,解壓即可;
如果是linux運行tar –zxvf zookeeper-3.4.9.tar.gz ,解壓。
解壓之后如下:
- 配置
需將conf/ zoo_sample.cfg 復制一份名為zoo.cfg的配置文件。其中重要的幾項配置:
clientPort=2181 端口
dataDir=D:/logs/zookeeper/data 快照存放位置
dataLogDir=D:/logs/zookeeper/log 日志存放位置
snapCount=3 執行多少次事物就生成快照文件
- 運行服務端
如果是windows ,雙擊zkServer.cmd
如果是linux,運行sh zkServer.sh
看到如下就代表成功
或者通過jps查看,如果有QuorumPeerMain就代表成功
- 客戶端連接服務端
如果是windows ,雙擊zkCli.cmd,或者在命令窗口運行 zkCli.cmd -server ip:port
其中ip:port 為服務端的ip和端口,如127.0.0.1:2181
如果是linux,運行sh zkCli.sh -server ip:port
二、使用
創建節點
create /node1 v1 (其中node1為節點名稱,v1為節點的值)
修改節點
set /node1 v11 (其中node1為節點名稱,v11為需要修改節點的值)
刪除節點
delete /node2 (其中node2為節點名稱)
如果/node1下面有子節點,那么會報錯,需要使用rmr /node1命令
查看節點
get /node1 (其中node1為節點名稱)
說明:
如上的操作不帶參數默認都是持久節點。
三、節點類型:
1.Zookeeper中有兩種節點類型:
持久節點persitent
create /node1 v1,客戶端斷開連接之后,zk不刪除persitent節點
臨時節點ephemeral
create -e /node1 v1 ,客戶端斷開連接之后,zk刪除ephemeral節點
2.zookeeper有四種形式的目錄節點(默認是persistent)
PERSISTENT
create /node1 v1
PERSISTENT_sequence
create -s /node1 v1
實際上創建了一個新的名稱為node10000000001的節點。再次執行會生成一個新的名稱為node10000000002的節點
EPHEMERAL
create -e /node1 v1 當客戶端退出之后,改節點就被刪除了
注意,臨時節點下面不能創建子節點,會報錯:
EPHEMERAL_sequence
create -e -s /node1 v1 當客戶端退出之后,改節點就被刪除了。
3.節點狀態屬性
cZxid :節點被創建的事物id值 c:create
ctime :節點被創建的時間
mZxid :節點被修改的事物的事物id值 m:modify
mtime :節點被修改的時間
pZxid :子節點最后一次唄修改的事物id
cversion :節點的子節點被修改的版本號
dataVersion :數據被修改的版本號
aclVersion : 節點的acl被修改的版本號
ephemeralOwner :如果是持久節點值為0,臨時節點非0
dataLength : 節點值得長度
numChildren :子節點個數
如下為持久節點的值:
[zk: localhost:2181(CONNECTED) 11] get /node1
v11
cZxid = 0x13
ctime = Mon Oct 29 10:07:58 CST 2018
mZxid = 0x14
mtime = Mon Oct 29 10:08:39 CST 2018
pZxid = 0x13
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 3
numChildren = 0
如下為臨時節點的值:
[zk: localhost:2181(CONNECTED) 12] get /node2
v2
cZxid = 0x29
ctime = Mon Oct 29 10:28:13 CST 2018
mZxid = 0x29
mtime = Mon Oct 29 10:28:13 CST 2018
pZxid = 0x29
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x1000efbbe700001
dataLength = 2
numChildren = 0
四、zookeeper的ACL
4.1ACL機制
ACL(Access Control List)機制,表示為scheme:id:permissions,第一個字段表示采用哪一種機制,第二個id表示用戶,permissions表示相關權限(如只讀,讀寫,管理等)。
Scheme:
world: 它下面只有一個id, 叫anyone, world:anyone代表任何人,zookeeper中對所有人有權限的結點就是屬於world:anyone的
auth: 它不需要id, 只要是通過authentication的user都有權限(zookeeper支持通過kerberos來進行authencation, 也支持username/password形式的authentication)
digest: 它對應的id為username:BASE64(SHA1(password)),它需要先通過username:password形式的authentication
ip: 它對應的id為客戶機的IP地址,設置的時候可以設置一個ip段,比如ip:192.168.1.0/16, 表示匹配前16個bit的IP段
id:
id是驗證模式,不同的scheme,id值不一樣
scheme為auth時:username:password
scheme為digest時:username:BASE64(SHA1(password))
scheme為ip時:客戶端的ip地址。
scheme為world時:anyone。
permiddsion:
CREATE、READ、WRITE、DELETE、ADMIN 也就是 增、刪、改、查、管理權限,這5種權限簡寫為crwda(即:每個單詞的首字符縮寫)
CREATE(c):創建子節點的權限
DELETE(d):刪除節點的權限
READ(r):讀取節點數據的權限
WRITE(w):修改節點數據的權限
ADMIN(a):設置子節點權限的權限
4.2ACL的命令:
4.2.1getAcl
create /node1 v1 # 創建一個子節點
getAcl /node1 # 獲取該節點的acl權限信息
4.2.2setAcl
setAcl /node1 world:anyone:craw 把刪除權限d去除 ,那么在node1下面創建的子節點是不能被刪除的,但是/node1本身這個節點還是可以被刪除的。
4.2.3addauth:注冊會話授權信息(相當於創建用戶或者切換用戶)
4.2.3.1 auth
addauth digest u1:123456 新增用戶,名為u1,密碼為123456
setAcl /node3 auth:u1:123456:crdwa 給node3節點設置Acl ,scheme為auth類型,id 為auth類型即 u1:123456 ,permission為crdwa
退出本次客戶端后:
再次重新連接客戶端 (或者新啟動一個客戶端)
ls /node3/testAcl #沒有權限無法訪問
create /node3/testAcl/testb bbb #沒有權限無法訪問
addauth digest user1:123456 # 重新新增權限后可以訪問了
如果忘記密碼那就沒辦法了,查看不了
4.2.3.1 digest
auth與digest的區別就是,前者使用明文密碼進行登錄,后者使用密文密碼進行登錄
create /node3/testDigest dd
addauth digest u2:654321
setAcl /node3/testDigest digest:u2:Fqb0cTcVtn704lhrUTPitrq88fg=:ca # 使用digest來設置權限
其中:addauth digest u2:654321 ,怎么查看加密的密碼呢
通過執行如下java命令可獲得:
java -Djava.ext.dirs=D:\lurenz\springboot\zookeeper\zookeeper-3.4.13\lib -cp D:\lurenz\springboot\zookeeper\zookeeper-3.4.13\zookeeper-3.4.13.jar org.apache.zookeeper.server.auth.DigestAuthenticationProvider u2:654321
五、常用四字命令
ZooKeeper 支持某些特定的四字命令字母與其的交互。它們大多是查詢命令,用來獲取 ZooKeeper 服務的當前狀態及相關信息。用戶在客戶端可以通過 telnet 或 nc 向 ZooKeeper 提交相應的命令
echo stat|nc 127.0.0.1 2181 來查看哪個節點被選擇作為follower或者leader
使用echo ruok|nc 127.0.0.1 2181 測試是否啟動了該Server,若回復imok表示已經啟動。
echo dump| nc 127.0.0.1 2181 ,列出未經處理的會話和臨時節點。
echo kill | nc 127.0.0.1 2181 ,關掉server
echo conf | nc 127.0.0.1 2181 ,輸出相關服務配置的詳細信息。
echo cons | nc 127.0.0.1 2181 ,列出所有連接到服務器的客戶端的完全的連接 / 會話的詳細信息
echo envi |nc 127.0.0.1 2181 ,輸出關於服務環境的詳細信息(區別於 conf 命令)。
echo reqs | nc 127.0.0.1 2181 ,列出未經處理的請求。
echo wchs | nc 127.0.0.1 2181 ,列出服務器 watch 的詳細信息。
echo wchc | nc 127.0.0.1 2181 ,通過 session 列出服務器 watch 的詳細信息,它的輸出是一個與 watch 相關的會話的列表。
echo wchp | nc 127.0.0.1 2181 ,通過路徑列出服務器 watch 的詳細信息。它輸出一個與 session 相關的路徑
5.1通過nc向zookeeper提交命令:
注意:需要安裝nc否則會報錯:
Linux(centos)安裝命令:yum –y install nc
Windows安裝netcat: 下載鏈接https://eternallybored.org/misc/netcat/
5.2通過telnet向zookeeper提交命令
首先要執行telnet 127.0.0.1 2181
連接成功之后,輸入四字命令,如:stat
六、查看快照或日志文件
直接打開快照或日志文件時亂碼,可用如下命令查看
在linux中執行:
java -cp /usr/local/zookeeper/zookeeper-3.4.8/zookeeper-3.4.8.jar:/usr/local/zookeeper/zookeeper-3.4.8/lib/slf4j-api-1.6.1.jar org.apache.zookeeper.server.LogFormatter log.11089bb
java -cp /usr/local/zookeeper/zookeeper-3.4.8/zookeeper-3.4.8.jar:/usr/local/zookeeper/zookeeper-3.4.8/lib/slf4j-api-1.6.1.jar org.apache.zookeeper.server.SnapshotFormatter snapshot.ffd9b6
注意:java cp 命令在windows中執行分隔符為;而在linux為:
java cp 命令:
-cp 和 -classpath 一樣,是指定類運行所依賴其他類的路徑,通常是類庫,jar包之類,需要全路徑到jar包,window上分號“;”分隔,linux上是分號“:”分隔
java -cp D:\lurenz\springboot\zookeeper\zookeeper-3.4.13\zookeeper-3.4.13.jar;D:\lurenz\springboot\zookeeper\zookeeper-3.4.13\lib\slf4j-api-1.7.25.jar org.apache.zookeeper.server.SnapshotFormatter D:\logs\zookeeper\data\version-2\snapshot.1a
java -cp D:\lurenz\springboot\zookeeper\zookeeper-3.4.13\zookeeper-3.4.13.jar;D:\lurenz\springboot\zookeeper\zookeeper-3.4.13\lib\slf4j-api-1.7.25.jar org.apache.zookeeper.server.LogFormatter D:\logs\zookeeper\log\version-2\log.1
七、zookeeper信息查看工具
下載地址:https://issues.apache.org/jira/secure/attachment/12436620/ZooInspector.zip
輸入ip,端口
查看如下,代表鏈接成功