当前位置:   article > 正文

zookeeper命令介绍总结

zkserver-initialize.sh

Zookeeper入门笔记(二)--zookeeper命令介绍总结

最近工作中,发现组内同学在zk出现了故障,问题的时候很多时候都无所是从,不知道如何下手,很多智能看提示,日志,这里整理一个关于zk的命令集锦给大家参看,

zkCmd命令行位置

zk模块和其它Hadoop环境模块的命令使用略有不同。其命令主要位于其安装目录的/bin目录中。

  1. [root@nn1 bin]# ls
  2. zkCleanup.sh zkCli.sh zkEnv.sh zkServer-initialize.sh zkServer.sh zookeeper-client zookeeper-server zookeeper-server-cleanup zookeeper-server-initialize
  3. [root@nn1 bin]# pwd
  4. /usr/hdp/2.6.1.0-129/zookeeper/bin
zk的启动及配置

首先,查看zk的配置文件:/conf/zoo.cfg

  1. clientPort=2181
  2. initLimit=10
  3. autopurge.purgeInterval=24
  4. syncLimit=5
  5. tickTime=3000
  6. dataDir=/hadoop/zookeeper
  7. autopurge.snapRetainCount=30
  8. server.1=dn1:2888:3888
  9. server.2=dn2:2888:3888
  10. 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的环境变量配置:

  1. [root@namenode conf]# more zookeeper-env.sh
  2. export JAVA_HOME=/usr/jdk64/jdk1.8.0_112
  3. export ZOOKEEPER_HOME=/usr/hdp/current/zookeeper-server
  4. export ZOO_LOG_DIR=/var/log/zookeeper
  5. export ZOOPIDFILE=/var/run/zookeeper/zookeeper_server.pid
  6. export SERVER_JVMFLAGS=-Xmx1024m
  7. export JAVA=$JAVA_HOME/bin/java
  8. export CLASSPATH=$CLASSPATH:/usr/share/zookeeper/*
  9. export JMXPORT=22222
  10. export JMXAUTH=false
  11. export JMXSSL=false

其中有一个JMX的配置,需要特别留意一下。

在配置完毕相关的信息以后,其实可以通过“/bin/zkServer start”启动本节点的zk服务。

zk cmd

zk cmd主要包含两个:zkServer.sh和zkCli.sh。

zkServer.sh
查看服务器状态
  1. [root@namenode bin]# sh zkServer.sh status
  2. ZooKeeper JMX enabled by default
  3. Using config: /usr/hdp/2.6.1.0-129/zookeeper/bin/../conf/zoo.cfg
  4. Mode: leader
  5. [root@dn2 bin]# sh zkServer.sh status
  6. ZooKeeper JMX enabled by default
  7. Using config: /usr/hdp/2.6.1.0-129/zookeeper/bin/../conf/zoo.cfg
  8. Mode: follower

看上面显示的2个例子可以看到执行命令所在节点zk的状态,第一个显示是leader节点,第二个是follower节点。

启停服务器
  1. [root@dn2 bin]# sh zkServer.sh
  2. ZooKeeper JMX enabled by default
  3. Using config: /usr/hdp/2.6.1.0-129/zookeeper/bin/../conf/zoo.cfg
  4. 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
  1. [root@dn2 bin]# echo stat|nc 127.0.0.1 2181
  2. Zookeeper version: 3.4.6-129--1, built on 05/31/2017 03:01 GMT
  3. Clients:
  4. /10.10.0.23:58458[1](queued=0,recved=18672,sent=18672)
  5. /10.10.0.23:58294[1](queued=0,recved=6314,sent=6314)
  6. /10.10.0.21:33103[1](queued=0,recved=76025,sent=76036)
  7. /10.10.0.23:59646[1](queued=0,recved=3062,sent=3062)
  8. /10.10.0.21:34046[1](queued=0,recved=18186,sent=18186)
  9. /10.10.0.22:57146[1](queued=0,recved=300427,sent=300428)
  10. /10.10.0.22:58808[1](queued=0,recved=22203,sent=22203)
  11. /10.10.0.23:58446[1](queued=0,recved=3091,sent=3091)
  12. /10.10.0.23:58326[1](queued=0,recved=18557,sent=18557)
  13. /10.10.0.22:57118[1](queued=0,recved=67287,sent=67287)
  14. /10.10.0.23:59648[1](queued=0,recved=3062,sent=3062)
  15. /10.10.0.23:58322[1](queued=0,recved=20252,sent=20252)
  16. /127.0.0.1:46964[0](queued=0,recved=1,sent=0)
  17. /10.10.0.24:50152[1](queued=0,recved=76042,sent=76053)
  18. /10.10.0.23:58330[1](queued=0,recved=38120,sent=38120)
  19. /10.10.0.22:57140[1](queued=0,recved=25628,sent=25628)
  20. /10.10.0.21:33544[1](queued=0,recved=6112,sent=6112)
  21. /10.10.0.22:57138[1](queued=0,recved=186846,sent=186846)
  22. /10.10.0.22:58820[1](queued=0,recved=22203,sent=22203)
  23. Latency min/avg/max: 0/0/1227
  24. Received: 981083
  25. Sent: 981109
  26. Connections: 19
  27. Outstanding: 0
  28. Zxid: 0x9000193d0
  29. Mode: follower
  30. Node count: 519
输出相关服务配置的详细信息 conf
  1. [root@dn2 bin]# echo conf|nc dn3 2181
  2. clientPort=2181
  3. dataDir=/hadoop/zookeeper/version-2
  4. dataLogDir=/hadoop/zookeeper/version-2
  5. tickTime=3000
  6. maxClientCnxns=60
  7. minSessionTimeout=6000
  8. maxSessionTimeout=60000
  9. serverId=3
  10. initLimit=10
  11. syncLimit=5
  12. electionAlg=3
  13. electionPort=3888
  14. quorumPort=2888
  15. peerType=0
  16. dn3 上的zoo配置文件
  17. clientPort=2181
  18. initLimit=10
  19. autopurge.purgeInterval=24
  20. syncLimit=5
  21. tickTime=3000
  22. dataDir=/hadoop/zookeeper
  23. autopurge.snapRetainCount=30
  24. server.1=dn1:2888:3888
  25. server.2=dn2:2888:3888
  26. server.3=dn3:2888:3888

仔细观察,我们可以发现,命令显示的配置信息和配置文件中的配置信息是完全一致的。

回话信息 cons
  1. [root@dn3 ~]# echo cons|nc dn2 2181
  2. /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)
  3. /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)
  4. /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节点才有):

  1. [root@namenode version-2]# echo dump|nc localhost 2181
  2. SessionTracker dump:
  3. Session Sets (20):
  4. 3 expire at Fri Apr 13 14:34:21 CST 2018:
  5. 0x262b40dd1156bf9
  6. 0x362b252fd64a76b
  7. 0x362b252fd64a76a
  8. 0 expire at Fri Apr 13 14:34:24 CST 2018:
  9. 0 expire at Fri Apr 13 14:34:27 CST 2018:
  10. 6 expire at Fri Apr 13 14:34:30 CST 2018:
  11. 0x362b252fd64a764
  12. 0x362b252fd64a76c
  13. 0x262b252fd1c0005

临时节点:

  1. ephemeral nodes dump:
  2. Sessions with Ephemerals (16):
  3. 0x362b252fd632693:
  4. /storm/supervisors/75138bac-0922-4978-82b5-301f6a8bbfe4
  5. 0x162b2607478005c:
  6. /consumers/atlas/ids/atlas_namenode.hadoop.wish.me-1523413973525-43469beb
  7. /consumers/atlas/owners/ATLAS_HOOK/0
  8. 0x362b252fd630014:
  9. /hbase-unsecure/rs/datanode2.hadoop.wish.me,16021,1523411228465
  10. 0x262b252fd1c0004:
  11. /hbase-unsecure/master
  12. 0x262b252fd1c0006:
  13. /hbase-unsecure/rs/namenode.hadoop.wish.me,16021,1523411302942
列出环境变量 envi
  1. [root@namenode version-2]# echo envi|nc localhost 2181
  2. Environment:
  3. zookeeper.version=3.4.6-129--1, built on 05/31/2017 03:01 GMT
  4. host.name=namenode.hadoop.wish.me
  5. java.version=1.8.0_112
  6. java.vendor=Oracle Corporation
  7. java.home=/usr/jdk64/jdk1.8.0_112/jre
  8. java.library.path=/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
  9. java.io.tmpdir=/tmp
  10. java.compiler=<NA>
  11. os.name=Linux
  12. os.arch=amd64
  13. os.version=3.10.0-693.2.2.el7.x86_64
  14. user.name=zookeeper
  15. user.home=/home/zookeeper
  16. user.dir=/home/zookeeper
查看服务是否有故障
  1. [root@namenode version-2]# echo ruok|nc localhost 2181
  2. 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的命令,链接成功以后,后面所有的命令都是在这个链接下进行的:

  1. [root@dn3 bin]# sh zkCli.sh -server dn3:2181
  2. Connecting to dn3:2181
  3. 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
  4. 2018-04-13 15:24:57,215 - INFO [main:Environment@100] - Client environment:host.name=dn3
  5. ....
  6. 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
  7. Welcome to ZooKeeper!
  8. 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)
  9. JLine support is enabled
  10. 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
  11. 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
  12. WATCHER::
  13. WatchedEvent state:SyncConnected type:None path:null
  14. [zk: dn3:2181(CONNECTED) 0]

说明:上面显示welcome to zookeeper就说明链接基本成功了,这里由于没有采用SSL的方式,所以会有一些提示。最后出现的命令行提示,则是后面需要敲命令的地方。可以通过help查看命令说明:

  1. [zk: dn3:2181(CONNECTED) 0] h
  2. ZooKeeper -server host:port cmd args
  3. stat path [watch]
  4. set path data [version]
  5. ls path [watch]
  6. delquota [-n|-b] path
  7. ls2 path [watch]
  8. setAcl path acl
  9. setquota -n|-b val path
  10. history
  11. redo cmdno
  12. printwatches on|off
  13. delete path [version]
  14. sync path
  15. listquota path
  16. rmr path
  17. get path [watch]
  18. create [-s] [-e] path data acl
  19. addauth scheme auth
  20. quit
  21. getAcl path
  22. close
  23. connect host:port

下面介绍几个常用的命令

  • ls 显示当前节点列表(/ 代表根节点,再往下是子节点这些)
  1. [zk: dn3:2181(CONNECTED) 1] ls /
  2. [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]
  3. [zk: dn3:2181(CONNECTED) 2] ls /storm
  4. [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的值

  1. [zk: dn3:2181(CONNECTED) 10] get /zk_test
  2. test_data
  3. cZxid = 0x9000201af
  4. ctime = Fri Apr 13 15:45:34 CST 2018
  5. mZxid = 0x9000201af
  6. mtime = Fri Apr 13 15:45:34 CST 2018
  7. pZxid = 0x9000201af
  8. cversion = 0
  9. dataVersion = 0
  10. aclVersion = 0
  11. ephemeralOwner = 0x0
  12. dataLength = 9
  13. numChildren = 0
  14. [zk: dn3:2181(CONNECTED) 11] get /zk_test_tmp
  15. test_data_tmp
  16. cZxid = 0x90002048e
  17. ctime = Fri Apr 13 15:53:50 CST 2018
  18. mZxid = 0x90002048e
  19. mtime = Fri Apr 13 15:53:50 CST 2018
  20. pZxid = 0x90002048e
  21. cversion = 0
  22. dataVersion = 0
  23. aclVersion = 0
  24. ephemeralOwner = 0x362b94920720016
  25. dataLength = 13
  26. 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]。我们先看设置前的情况:
  1. [zk: dn1:2181(CONNECTED) 1] get /zk_test
  2. test_data
  3. cZxid = 0x9000201af
  4. ctime = Fri Apr 13 15:45:34 CST 2018
  5. mZxid = 0x9000201af
  6. mtime = Fri Apr 13 15:45:34 CST 2018
  7. pZxid = 0x9000201af
  8. cversion = 0
  9. dataVersion = 0
  10. aclVersion = 0
  11. ephemeralOwner = 0x0
  12. dataLength = 9
  13. numChildren = 0

再看设置后的情况:

  1. > [zk: dn1:2181(CONNECTED) 2] set /zk_test hellolst
  2. > cZxid = 0x9000201af
  3. > ctime = Fri Apr 13 15:45:34 CST 2018
  4. > mZxid = 0x90007bb7d
  5. > mtime = Mon Apr 16 14:07:26 CST 2018
  6. > pZxid = 0x9000201af
  7. > cversion = 0
  8. > dataVersion = 1
  9. > aclVersion = 0
  10. > ephemeralOwner = 0x0
  11. > dataLength = 8
  12. > numChildren = 0
  13. > [zk: dn1:2181(CONNECTED) 3] get /zk_test
  14. > hellolst
  15. > cZxid = 0x9000201af
  16. > ctime = Fri Apr 13 15:45:34 CST 2018
  17. > mZxid = 0x90007bb7d
  18. > mtime = Mon Apr 16 14:07:26 CST 2018
  19. > pZxid = 0x9000201af
  20. > cversion = 0
  21. > dataVersion = 1
  22. > aclVersion = 0
  23. > ephemeralOwner = 0x0
  24. > dataLength = 8
  25. > numChildren = 0
  26. >

可以发现,更新后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

转载于:https://www.cnblogs.com/angellst/p/8855740.html

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/804603
推荐阅读
相关标签
  

闽ICP备14008679号