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