Zookeeper入門筆記(二)--zookeeper命令介紹總結
最近工作中,發現組內同學在zk出現了故障,問題的時候很多時候都無所是從,不知道如何下手,很多智能看提示,日志,這里整理一個關於zk的命令集錦給大家參看,
zkCmd命令行位置
zk模塊和其它Hadoop環境模塊的命令使用略有不同。其命令主要位於其安裝目錄的/bin目錄中。
[root@nn1 bin]# ls
zkCleanup.sh zkCli.sh zkEnv.sh zkServer-initialize.sh zkServer.sh zookeeper-client zookeeper-server zookeeper-server-cleanup zookeeper-server-initialize
[root@nn1 bin]# pwd
/usr/hdp/2.6.1.0-129/zookeeper/bin
zk的啟動及配置
首先,查看zk的配置文件:/conf/zoo.cfg
clientPort=2181
initLimit=10
autopurge.purgeInterval=24
syncLimit=5
tickTime=3000
dataDir=/hadoop/zookeeper
autopurge.snapRetainCount=30
server.1=dn1:2888:3888
server.2=dn2:2888:3888
server.3=dn3:2888:3888
clientPort:
ClientPort是zookeeper服務器監聽client鏈接的端口定義。(這里監聽的client端口指的是zookeeper-server監聽client的接口,常用2181端口)
tickTime
tickTime 是zookeeper中的基本時間單元,代表發送心跳的間隔時間,單位是毫秒
initLimit
initLimit是用來配置 Zookeeper 接受客戶端(這里所說的客戶端不是用戶連接 Zookeeper 服務器的客戶端,而是 Zookeeper 服務器集群中連接到 Leader 的 Follower 服務器)初始化連接時最長能忍受多少個心跳時間間隔數。當已經超過 5 個心跳的 時間(也就是 tickTime)長度后 Zookeeper 服務器還沒有收到客戶端的返回信息,那么表 明這個客戶端連接失敗。總的時間長度就是 5*2000=10 秒.(特別注意:這個參數是指的follower,而不是指的client)
datadir
datadir是zookeeper持久化數據存放的目錄.
server.x=A:B:C
這里的x代表是第幾號服務器(與配置的host中的node1,2,3無實際關系,僅是一個編號),A代表X這台服務器的IP地址,B代表X這台服務器與集群中的Leader服務器交換信息的端口(與clientPort是不同的端口,功能也不同,是與Leader通訊),C代表萬一集群中的Leader服務器掛了,需要一個端口來重新進行選舉,選出一個新的Leader,這個端口就是用來執行選舉時服務器間相互通信的端口(專門用於選舉Leader的端口)。
syncLimit
Leader和Follower之間發送消息時,請求和應答的時間長度,最長不能超過多少個tickTime的時間長度,這里值為5,就相當於時間長度不能超過5*3000=15000也就是1.5秒。
除了zoo.cfg這個配置文件以外,在配置文件夾中還存在一個log4j.properties、zookeeper-env.sh等幾個配置文件。其中Log4j和傳統的日志配置文件類似,zookeeper-env.sh主要是關於zookeeper的環境變量配置:
[root@namenode conf]# more zookeeper-env.sh
export JAVA_HOME=/usr/jdk64/jdk1.8.0_112
export ZOOKEEPER_HOME=/usr/hdp/current/zookeeper-server
export ZOO_LOG_DIR=/var/log/zookeeper
export ZOOPIDFILE=/var/run/zookeeper/zookeeper_server.pid
export SERVER_JVMFLAGS=-Xmx1024m
export JAVA=$JAVA_HOME/bin/java
export CLASSPATH=$CLASSPATH:/usr/share/zookeeper/*
export JMXPORT=22222
export JMXAUTH=false
export JMXSSL=false
其中有一個JMX的配置,需要特別留意一下。
在配置完畢相關的信息以后,其實可以通過“/bin/zkServer start”啟動本節點的zk服務。
zk cmd
zk cmd主要包含兩個:zkServer.sh和zkCli.sh。
zkServer.sh
查看服務器狀態
[root@namenode bin]# sh zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/hdp/2.6.1.0-129/zookeeper/bin/../conf/zoo.cfg
Mode: leader
[root@dn2 bin]# sh zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/hdp/2.6.1.0-129/zookeeper/bin/../conf/zoo.cfg
Mode: follower
看上面顯示的2個例子可以看到執行命令所在節點zk的狀態,第一個顯示是leader節點,第二個是follower節點。
啟停服務器
[root@dn2 bin]# sh zkServer.sh
ZooKeeper JMX enabled by default
Using config: /usr/hdp/2.6.1.0-129/zookeeper/bin/../conf/zoo.cfg
Usage: zkServer.sh {start|start-foreground|stop|restart|status|upgrade|print-cmd}
四字命令
這部分和前面查看status 的方法內容要略多一些,但是使用的方法有所不同,這里使用的方法是zk特有的4字命令。個人理解,所謂的四字命令實際上就是使用nc 命令來操作zk,其主要格式為 echo xxxx|nc Ip Port ,這里的xxxx就是4字命令。
查看具體節點信息 stat
[root@dn2 bin]# echo stat|nc 127.0.0.1 2181
Zookeeper version: 3.4.6-129--1, built on 05/31/2017 03:01 GMT
Clients:
/10.10.0.23:58458[1](queued=0,recved=18672,sent=18672)
/10.10.0.23:58294[1](queued=0,recved=6314,sent=6314)
/10.10.0.21:33103[1](queued=0,recved=76025,sent=76036)
/10.10.0.23:59646[1](queued=0,recved=3062,sent=3062)
/10.10.0.21:34046[1](queued=0,recved=18186,sent=18186)
/10.10.0.22:57146[1](queued=0,recved=300427,sent=300428)
/10.10.0.22:58808[1](queued=0,recved=22203,sent=22203)
/10.10.0.23:58446[1](queued=0,recved=3091,sent=3091)
/10.10.0.23:58326[1](queued=0,recved=18557,sent=18557)
/10.10.0.22:57118[1](queued=0,recved=67287,sent=67287)
/10.10.0.23:59648[1](queued=0,recved=3062,sent=3062)
/10.10.0.23:58322[1](queued=0,recved=20252,sent=20252)
/127.0.0.1:46964[0](queued=0,recved=1,sent=0)
/10.10.0.24:50152[1](queued=0,recved=76042,sent=76053)
/10.10.0.23:58330[1](queued=0,recved=38120,sent=38120)
/10.10.0.22:57140[1](queued=0,recved=25628,sent=25628)
/10.10.0.21:33544[1](queued=0,recved=6112,sent=6112)
/10.10.0.22:57138[1](queued=0,recved=186846,sent=186846)
/10.10.0.22:58820[1](queued=0,recved=22203,sent=22203)
Latency min/avg/max: 0/0/1227
Received: 981083
Sent: 981109
Connections: 19
Outstanding: 0
Zxid: 0x9000193d0
Mode: follower
Node count: 519
輸出相關服務配置的詳細信息 conf
[root@dn2 bin]# echo conf|nc dn3 2181
clientPort=2181
dataDir=/hadoop/zookeeper/version-2
dataLogDir=/hadoop/zookeeper/version-2
tickTime=3000
maxClientCnxns=60
minSessionTimeout=6000
maxSessionTimeout=60000
serverId=3
initLimit=10
syncLimit=5
electionAlg=3
electionPort=3888
quorumPort=2888
peerType=0
dn3 上的zoo配置文件
clientPort=2181
initLimit=10
autopurge.purgeInterval=24
syncLimit=5
tickTime=3000
dataDir=/hadoop/zookeeper
autopurge.snapRetainCount=30
server.1=dn1:2888:3888
server.2=dn2:2888:3888
server.3=dn3:2888:3888
仔細觀察,我們可以發現,命令顯示的配置信息和配置文件中的配置信息是完全一致的。
回話信息 cons
[root@dn3 ~]# echo cons|nc dn2 2181
/10.10.0.23:58458[1](queued=0,recved=21454,sent=21454,sid=0x262b94c0cca0005,lop=PING,est=1523527255302,to=10000,lcxid=0x87,lzxid=0xffffffffffffffff,lresp=1523598357204,llat=0,minlat=0,avglat=0,maxlat=872)
/10.10.0.23:58294[1](queued=0,recved=7241,sent=7241,sid=0x262b94c0cca0000,lop=PING,est=1523527213803,to=30000,lcxid=0x8c,lzxid=0xffffffffffffffff,lresp=1523598354168,llat=0,minlat=0,avglat=0,maxlat=18)
/10.10.0.21:33103[1](queued=0,recved=95946,sent=95958,sid=0x262b92e6c950007,lop=GETC,est=1523527817543,to=30000,lcxid=0x18b5f,lzxid=0x90001d465,lresp=1523598358526,llat=0,minlat=0,avglat=0,maxlat=626)
列出未處理的回話和臨時節點 dump
由於dump的內容較多,下面分兩塊說明返回的內容
未處理的回話(Leader節點才有):
[root@namenode version-2]# echo dump|nc localhost 2181
SessionTracker dump:
Session Sets (20):
3 expire at Fri Apr 13 14:34:21 CST 2018:
0x262b40dd1156bf9
0x362b252fd64a76b
0x362b252fd64a76a
0 expire at Fri Apr 13 14:34:24 CST 2018:
0 expire at Fri Apr 13 14:34:27 CST 2018:
6 expire at Fri Apr 13 14:34:30 CST 2018:
0x362b252fd64a764
0x362b252fd64a76c
0x262b252fd1c0005
臨時節點:
ephemeral nodes dump:
Sessions with Ephemerals (16):
0x362b252fd632693:
/storm/supervisors/75138bac-0922-4978-82b5-301f6a8bbfe4
0x162b2607478005c:
/consumers/atlas/ids/atlas_namenode.hadoop.wish.me-1523413973525-43469beb
/consumers/atlas/owners/ATLAS_HOOK/0
0x362b252fd630014:
/hbase-unsecure/rs/datanode2.hadoop.wish.me,16021,1523411228465
0x262b252fd1c0004:
/hbase-unsecure/master
0x262b252fd1c0006:
/hbase-unsecure/rs/namenode.hadoop.wish.me,16021,1523411302942
列出環境變量 envi
[root@namenode version-2]# echo envi|nc localhost 2181
Environment:
zookeeper.version=3.4.6-129--1, built on 05/31/2017 03:01 GMT
host.name=namenode.hadoop.wish.me
java.version=1.8.0_112
java.vendor=Oracle Corporation
java.home=/usr/jdk64/jdk1.8.0_112/jre
java.library.path=/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
java.io.tmpdir=/tmp
java.compiler=<NA>
os.name=Linux
os.arch=amd64
os.version=3.10.0-693.2.2.el7.x86_64
user.name=zookeeper
user.home=/home/zookeeper
user.dir=/home/zookeeper
查看服務是否有故障
[root@namenode version-2]# echo ruok|nc localhost 2181
imok
如果返回的是imok,則說明服務沒有問題;如果沒有反應,則說明服務有問題故障。
更加詳情及更多的命令,大家可以參看下面官方的問題說明:
https://zookeeper.apache.org/doc/r3.3.3/zookeeperAdmin.html
zkCli.sh
上一節提到的嗎,只要安裝了zk,在任何位置執行都可以。但是下面的zkCli.sh和最開始zkServer.sh一樣都是一個腳本,都需要切換到bin目錄下,手動執行。這里的zkCli.sh其實本質是生成一個client與zkServer進行交互,和其他模塊與zk交互差不多。這種模式本質上是執行的一段java 代碼模擬客戶端進行,還有一種C的腳本,但需要編譯源碼,有興趣的話可以參考官網的解決方案,大體的使用方法都差不多。
鏈接zkServer
執行鏈接zkServer的命令,鏈接成功以后,后面所有的命令都是在這個鏈接下進行的:
[root@dn3 bin]# sh zkCli.sh -server dn3:2181
Connecting to dn3:2181
2018-04-13 15:24:57,212 - INFO [main:Environment@100] - Client environment:zookeeper.version=3.4.6-129--1, built on 05/31/2017 03:01 GMT
2018-04-13 15:24:57,215 - INFO [main:Environment@100] - Client environment:host.name=dn3
....
2018-04-13 15:24:57,220 - INFO [main:ZooKeeper@438] - Initiating client connection, connectString=dn3:2181 sessionTimeout=30000 watcher=org.apache.zookeeper.ZooKeeperMain$MyWatcher@63c12fb0
Welcome to ZooKeeper!
2018-04-13 15:24:57,245 - INFO [main-SendThread(dn3:2181):ClientCnxn$SendThread@1019] - Opening socket connection to server dn3/10.10.0.24:2181. Will not attempt to authenticate using SASL (unknown error)
JLine support is enabled
2018-04-13 15:24:57,296 - INFO [main-SendThread(dn3:2181):ClientCnxn$SendThread@864] - Socket connection established to dn3/10.10.0.24:2181, initiating session
2018-04-13 15:24:57,302 - INFO [main-SendThread(dn3:2181):ClientCnxn$SendThread@1279] - Session establishment complete on server dn3/10.10.0.24:2181, sessionid = 0x362b94920720016, negotiated timeout = 30000
WATCHER::
WatchedEvent state:SyncConnected type:None path:null
[zk: dn3:2181(CONNECTED) 0]
說明:上面顯示welcome to zookeeper就說明鏈接基本成功了,這里由於沒有采用SSL的方式,所以會有一些提示。最后出現的命令行提示,則是后面需要敲命令的地方。可以通過help查看命令說明:
[zk: dn3:2181(CONNECTED) 0] h
ZooKeeper -server host:port cmd args
stat path [watch]
set path data [version]
ls path [watch]
delquota [-n|-b] path
ls2 path [watch]
setAcl path acl
setquota -n|-b val path
history
redo cmdno
printwatches on|off
delete path [version]
sync path
listquota path
rmr path
get path [watch]
create [-s] [-e] path data acl
addauth scheme auth
quit
getAcl path
close
connect host:port
下面介紹幾個常用的命令
- ls 顯示當前節點列表(/ 代表根節點,再往下是子節點這些)
[zk: dn3:2181(CONNECTED) 1] ls /
[cluster, registry, controller, brokers, storm, zookeeper, infra-solr, hbase-unsecure, admin, isr_change_notification, templeton-hadoop, controller_epoch, hiveserver2, rmstore, consumers, ambari-metrics-cluster, config]
[zk: dn3:2181(CONNECTED) 2] ls /storm
[assignments, backpressure, blobstoremaxkeysequencenumber, credentials, nimbuses, logconfigs, leader-lock, storms, errors, supervisors, workerbeats, blobstore]
這里從storm節點可以比較明顯的看到storm節點下的具體情況。
-
create 創建新的znode節點(-s:順序節點 -e:臨時數據節點,重啟后會消失)。命令格式: create [-s] [-e] path data acl
[zk: dn3:2181(CONNECTED) 3] create /zk_test test_data
Created /zk_test
[zk: dn3:2181(CONNECTED) 4] ls /
[cluster, registry, controller, brokers, storm, zookeeper, infra-solr, hbase-unsecure, admin, isr_change_notification, templeton-hadoop, controller_epoch, hiveserver2, rmstore, consumers, ambari-metrics-cluster, config, zk_test]
[zk: dn3:2181(CONNECTED) 5] ls /zk_test
[]
可以看到,根目錄下,新增加了一個zk_test的節點。如果需要選擇節點類型則加-s 或e均可,后面還可以增加ACL權限控制。 -
get 獲取節點信息
[zk: dn3:2181(CONNECTED) 9] get /storm
cZxid = 0x10000018f
ctime = Tue Feb 06 17:18:15 CST 2018
mZxid = 0x10000018f
mtime = Tue Feb 06 17:18:15 CST 2018
pZxid = 0x1000002dd
cversion = 12
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 1
numChildren = 12
在說明節點信息之前,我們先解釋一下zxid. zk狀態的每一次改變(創建任意節點, 或者更新任意節點的數據, 或者刪除任意節點, 都會導致Zookeeper狀態發生改變, 從而導致zxid的值增加),都對應將遞增一個Transcation id,這個新的id也就是zxid.由於這個id是一直遞增的,所以如果出現zxid1<zxid2的情況,那么zxid1就肯定先與zxid2發生。其中:cZxid 代表創建節點時的zxid。
上面命令行返回的第一個值cZxid代表的就是該節點創建的時候的zxid,因此可以通過該值判斷節點創建的先后。我們看下,先后創立的兩個節點的cZxid的值
[zk: dn3:2181(CONNECTED) 10] get /zk_test
test_data
cZxid = 0x9000201af
ctime = Fri Apr 13 15:45:34 CST 2018
mZxid = 0x9000201af
mtime = Fri Apr 13 15:45:34 CST 2018
pZxid = 0x9000201af
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 9
numChildren = 0
[zk: dn3:2181(CONNECTED) 11] get /zk_test_tmp
test_data_tmp
cZxid = 0x90002048e
ctime = Fri Apr 13 15:53:50 CST 2018
mZxid = 0x90002048e
mtime = Fri Apr 13 15:53:50 CST 2018
pZxid = 0x90002048e
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x362b94920720016
dataLength = 13
numChildren = 0
從上面可以看到由於兩者的創建時間ctime不太遠,只有約10分鍾左右,所以cZxid的值相差不太大。
第2個參數值ctime代表節點創建時的時間戳;第3個參數mZxid節點最新一次更新發生時的時間戳(后面我們更新數據的時候,可以對比該值和創建時已經不一樣了);第4個參數mtime 節點最新一次更新發生時的時間戳;第5個參數pZxid表示節點的子節點列表最后一次被修改時的zxid。注意:只有子節點列表變更了才會變更pzxid,子節點內容變更不會影響pzxid;第6個參數cversion 子節點的版本號,由於是遞增,所以也就代表子節點的更細次數;dataversion 數據節點的版本號,同理這代表的是數據節點的更新次數;dataLength代表節點數據的字節數;numChildren代表子節點個數;aclversion 節點acl的授權次數;最后一個參數:ephemeralOwner。如果該節點是永久節點的話,則表示與該節點綁定的session id,如果該節點不是永久節點是臨時節點的話,則該值就是0.
- 設置節點信息 set
set命令,更新設置節點的數據內容,具體命令格式:set node_pah data[version]。我們先看設置前的情況:
[zk: dn1:2181(CONNECTED) 1] get /zk_test test_data cZxid = 0x9000201af ctime = Fri Apr 13 15:45:34 CST 2018 mZxid = 0x9000201af mtime = Fri Apr 13 15:45:34 CST 2018 pZxid = 0x9000201af cversion = 0 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 9 numChildren = 0
再看設置后的情況:
> [zk: dn1:2181(CONNECTED) 2] set /zk_test hellolst
> cZxid = 0x9000201af
> ctime = Fri Apr 13 15:45:34 CST 2018
> mZxid = 0x90007bb7d
> mtime = Mon Apr 16 14:07:26 CST 2018
> pZxid = 0x9000201af
> cversion = 0
> dataVersion = 1
> aclVersion = 0
> ephemeralOwner = 0x0
> dataLength = 8
> numChildren = 0
> [zk: dn1:2181(CONNECTED) 3] get /zk_test
> hellolst
> cZxid = 0x9000201af
> ctime = Fri Apr 13 15:45:34 CST 2018
> mZxid = 0x90007bb7d
> mtime = Mon Apr 16 14:07:26 CST 2018
> pZxid = 0x9000201af
> cversion = 0
> dataVersion = 1
> aclVersion = 0
> ephemeralOwner = 0x0
> dataLength = 8
> numChildren = 0
>
可以發現,更新后dataversion的值變成了1,有1個版本的數據了,同時mtime(節點最新一次更新發生時的時間戳)也發生了變化,長度剛好是8個byte(hellolst)
-
stat 查看節點統計信息
與get基本相同,但是缺少了數據內容
-ls2 path
與ls 不同的是,除了可以看到節點下的文件及子目錄外,還可以看到節點自身的相關信息[zk: dn1:2181(CONNECTED) 8] ls2 /storm
[assignments, backpressure, blobstoremaxkeysequencenumber, credentials, nimbuses, logconfigs, leader-lock, storms, errors, supervisors, workerbeats, blobstore]
cZxid = 0x10000018f
ctime = Tue Feb 06 17:18:15 CST 2018
mZxid = 0x10000018f
mtime = Tue Feb 06 17:18:15 CST 2018
pZxid = 0x1000002dd
cversion = 12
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 1
numChildren = 12
[zk: dn1:2181(CONNECTED) 9] ls /storm
[assignments, backpressure, blobstoremaxkeysequencenumber, credentials, nimbuses, logconfigs, leader-lock, storms, errors, supervisors, workerbeats, blobstore] -
delete
刪除znode 節點。[zk: dn1:2181(CONNECTED) 10] delete /zk_test
-quit 退出
[zk: dn1:2181(CONNECTED) 11] quitQuitting...
2018-04-16 14:31:04,275 - INFO [main:ZooKeeper@684] - Session: 0x162b9559e1c0025 closed
2018-04-16 14:31:04,275 - INFO [main-EventThread:ClientCnxn$EventThread@524] - EventThread shut down