基本数据结构

Zookeeper是树形结构,类似于Linux的文件目录。
每一个节点都称之为znode,它可以有子节点,也可以有数据。
每个节点分为临时节点和永久节点,临时节点在客户端断开后消失。
每个zk节点都各自的版本号,可以通过命令行来显示节点信息。
每当节点数据发生变化,那么该节点的版本号version会累加(乐观锁)。
删除/修改过时的节点,版本号不匹配则会报错。
每个zk节点存储的数据不宜过大,几K即可。
节点可以设置权限acl,可以通过权限来限制用户访问

客户端基本操作

启动客户端

  1. ./zkCli.sh
  2. Connecting to localhost:2181

查看

查看当前znode中所包含的内容

  1. ls /
  2. [zookeeper]

查看当前节点详细数据

  1. ls2 /
  2. [zookeeper]
  3. cZxid = 0x0
  4. ctime = Thu Jan 01 08:00:00 CST 1970
  5. mZxid = 0x0
  6. mtime = Thu Jan 01 08:00:00 CST 1970
  7. pZxid = 0x0
  8. cversion = -1
  9. dataVersion = 0
  10. aclVersion = 0
  11. ephemeralOwner = 0x0
  12. dataLength = 0
  13. numChildren = 1

创建

创建节点

  1. [zk: localhost:2181(CONNECTED) 2] create /zk_path1 foo1
  2. Created /zk_path1
  3. [zk: localhost:2181(CONNECTED) 3] create /zk_path1/zk_path2 foo2
  4. Created /zk_path1/zk_path2

获取节点数据

  1. [zk: localhost:2181(CONNECTED) 4] get /zk_path1
  2. foo1
  3. cZxid = 0x2
  4. ctime = Wed Aug 28 00:18:29 CST 2019
  5. mZxid = 0x2
  6. mtime = Wed Aug 28 00:18:29 CST 2019
  7. pZxid = 0x3
  8. cversion = 1
  9. dataVersion = 0
  10. aclVersion = 0
  11. ephemeralOwner = 0x0
  12. dataLength = 4
  13. numChildren = 1
  14. [zk: localhost:2181(CONNECTED) 5] get /zk_path1/zk_path2
  15. foo2
  16. cZxid = 0x3
  17. ctime = Wed Aug 28 00:18:48 CST 2019
  18. mZxid = 0x3
  19. mtime = Wed Aug 28 00:18:48 CST 2019
  20. pZxid = 0x3
  21. cversion = 0
  22. dataVersion = 0
  23. aclVersion = 0
  24. ephemeralOwner = 0x0
  25. dataLength = 4
  26. numChildren = 0

创建短暂节点

  1. [zk: localhost:2181(CONNECTED) 6] create -e /zk_tmp bar
  2. Created /zk_tmp
  3. [zk: localhost:2181(CONNECTED) 7] get /zk_tmp
  4. bar
  5. cZxid = 0x4
  6. ctime = Wed Aug 28 00:21:18 CST 2019
  7. mZxid = 0x4
  8. mtime = Wed Aug 28 00:21:18 CST 2019
  9. pZxid = 0x4
  10. cversion = 0
  11. dataVersion = 0
  12. aclVersion = 0
  13. ephemeralOwner = 0x100006be7770000
  14. dataLength = 3
  15. numChildren = 0
  16. [zk: localhost:2181(CONNECTED) 8] quit
  17. $ zkCli.sh
  18. [zk: localhost:2181(CONNECTED) 0] get /zk_tmp
  19. Node does not exist: /zk_tmp

删除

删除节点

  1. delete /zk_test

ls

ls path 查看某个路径下目录列表,ls / 查看根目录下有一个zookeeper的目录。 目录就是一个节点。/ 根节点 zookeeper是子节点

  1. [zk: localhost:2181(CONNECTED) 1] ls /
  2. [zookeeper]

stat

查看节点状态信息。

  1. [zk: localhost:2181(CONNECTED) 9] stat /
  2. cZxid = 0x0
  3. ctime = Thu Jan 01 08:00:00 CST 1970
  4. mZxid = 0x0
  5. mtime = Thu Jan 01 08:00:00 CST 1970
  6. pZxid = 0x0
  7. cversion = -1
  8. dataVersion = 0
  9. aclVersion = 0
  10. ephemeralOwner = 0x0
  11. dataLength = 0
  12. numChildren = 1

cZxid Zookeeper为节点分配的Id
cTime 节点创建时间
mZxid 修改后的id
mtime 修改时间
pZxid 子节点id
cversion 子节点的version
dataVersion 当前节点数据的版本号
aclVersion 权限Version
dataLength 数据长度
numChildren 子节点个数

ls2

ls2 显示了数据的一些状态信息 是ls和stat命令的组合

  1. [zk: localhost:2181(CONNECTED) 7] ls2 /
  2. [zookeeper]
  3. cZxid = 0x0
  4. ctime = Thu Jan 01 08:00:00 CST 1970
  5. mZxid = 0x0
  6. mtime = Thu Jan 01 08:00:00 CST 1970
  7. pZxid = 0x0
  8. cversion = -1
  9. dataVersion = 0
  10. aclVersion = 0
  11. ephemeralOwner = 0x0
  12. dataLength = 0
  13. numChildren = 1

create

  1. create /test testdata
  2. Created /test

创建临时节点

  1. [zk: localhost:2181(CONNECTED) 12] create -e /test/tmp tmpdata
  2. Created /test/tmp

创建顺序节点

  1. [zk: localhost:2181(CONNECTED) 4] create -s /test/sec sequencer
  2. Created /test/sec0000000001

get

get path获取节点数据信息

  1. get /test
  2. testdata
  3. cZxid = 0x2
  4. ctime = Wed May 08 17:28:06 CST 2019
  5. mZxid = 0x2
  6. mtime = Wed May 08 17:28:06 CST 2019
  7. pZxid = 0x2
  8. cversion = 0
  9. dataVersion = 0
  10. aclVersion = 0
  11. ephemeralOwner = 0x0
  12. dataLength = 8
  13. numChildren = 0

set

修改节点值

  1. [zk: localhost:2181(CONNECTED) 5] set /test newdata
  2. cZxid = 0x2
  3. ctime = Wed May 08 17:28:06 CST 2019
  4. mZxid = 0x7
  5. mtime = Wed May 08 17:59:07 CST 2019
  6. pZxid = 0x6
  7. cversion = 3
  8. dataVersion = 1
  9. aclVersion = 0
  10. ephemeralOwner = 0x0
  11. dataLength = 7
  12. numChildren = 1

如果节点不存在或修改失败

  1. [zk: localhost:2181(CONNECTED) 7] set /test1 newdata1
  2. Node does not exist: /test1

乐观锁修改
set pata data dataversion

  1. [zk: localhost:2181(CONNECTED) 8] set /test new-data 1
  2. cZxid = 0x2
  3. ctime = Wed May 08 17:28:06 CST 2019
  4. mZxid = 0x9
  5. mtime = Wed May 08 18:02:29 CST 2019
  6. pZxid = 0x6
  7. cversion = 3
  8. dataVersion = 2
  9. aclVersion = 0
  10. ephemeralOwner = 0x0
  11. dataLength = 8
  12. numChildren = 1
  13. [zk: localhost:2181(CONNECTED) 9] set /test new-data 1
  14. version No is not valid : /test

delete

删除节点

  1. [zk: localhost:2181(CONNECTED) 23] delete /test0000000001
  2. [zk: localhost:2181(CONNECTED) 24] delete /test0000000001
  3. Node does not exist: /test0000000001

四字命令Four letter Words

zk可以通过它自身提供的简写命令来和服务器进行交互
安装nc命令
命令格式
echo [commond] | nc [ip] [port]
stat 查看zk的状态信息 以及是否mode

  1. baxiangs-Mac-mini:~ baxiang$ echo stat | nc localhost 2181
  2. Zookeeper version: 3.4.12-e5259e437540f349646870ea94dc2658c4e44b3b, built on 03/27/2018 03:55 GMT
  3. Clients:
  4. /0:0:0:0:0:0:0:1:50696[0](queued=0,recved=1,sent=0)
  5. /127.0.0.1:50565[1](queued=0,recved=140,sent=140)
  6. Latency min/avg/max: 0/0/7
  7. Received: 865
  8. Sent: 864
  9. Connections: 2
  10. Outstanding: 0
  11. Zxid: 0x1d99
  12. Mode: standalone
  13. Node count: 19

ruok 查看当前zkserver是否启动,返回imok

  1. echo ruok | nc localhost 2181
  2. imok

dump 列出未经处理的回话和临时节点

  1. $ echo dump | nc localhost 2181
  2. SessionTracker dump:
  3. Session Sets (3):
  4. 0 expire at Thu Jan 01 10:36:30 CST 1970:
  5. 0 expire at Thu Jan 01 10:36:40 CST 1970:
  6. 1 expire at Thu Jan 01 10:36:50 CST 1970:
  7. 0x100000872ba0003
  8. ephemeral nodes dump:
  9. Sessions with Ephemerals (0):

conf 查看服务器配置

  1. echo conf | nc localhost 2181
  2. clientPort=2181
  3. dataDir=/usr/local/var/run/zookeeper/data/version-2
  4. dataLogDir=/usr/local/var/run/zookeeper/data/version-2
  5. tickTime=2000
  6. maxClientCnxns=60
  7. minSessionTimeout=4000
  8. maxSessionTimeout=40000
  9. serverId=0

cons 展示连接到服务器的客户端信息

  1. echo cons | nc localhost 2181
  2. /0:0:0:0:0:0:0:1:50728[0](queued=0,recved=1,sent=0)
  3. /127.0.0.1:50565[1](queued=0,recved=184,sent=184,sid=0x100000872ba0003,lop=PING,est=1557332837106,to=30000,lcxid=0x9,lzxid=0x1d99,lresp=9618134,llat=0,minlat=0,avglat=0,maxlat=2)

envi 查看环境变量配置
mntr 监控zk监控信息

  1. echo mntr | nc localhost 2181
  2. zk_version 3.4.12-e5259e437540f349646870ea94dc2658c4e44b3b, built on 03/27/2018 03:55 GMT
  3. zk_avg_latency 0
  4. zk_max_latency 7
  5. zk_min_latency 0
  6. zk_packets_received 942
  7. zk_packets_sent 941
  8. zk_num_alive_connections 2
  9. zk_outstanding_requests 0
  10. zk_server_state standalone
  11. zk_znode_count 19
  12. zk_watch_count 0
  13. zk_ephemerals_count 0
  14. zk_approximate_data_size 258
  15. zk_open_file_descriptor_count 32
  16. zk_max_file_descriptor_count 10240

wchs 展示watch的信息

  1. $ echo wchs | nc localhost 2181
  2. 1 connections watching 1 paths
  3. Total watches:1

wchc/wchp session与watch 以及path与watch信息