zookeeper命令介绍总结

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] quit

    Quitting...
    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

猜你喜欢

转载自www.cnblogs.com/angellst/p/8855740.html