zookeeper源码分析一:zk基础的使用和应用

75 阅读5分钟

背景

之前一直想深入连接下zk的原理,源码这块,但是java中zk使用的频率越来越少,就没有花时间去看了,发现在大数据领域中,zk作为集群管理还是使用很广泛的,hadoop,spark,hbase等大数据组件都在使用zk,所以还是想抽点时间研究一下,开拓自己的知识面,学习别人优秀的变成思维

zk是什么

zookeeper是一个高性能、开源的分布式应用协调服务,提供了简单原始的功能,分布式应用可以基于它实现更高级的服务,比如实现同步(分布式锁)、配置管理、集群管理。它被设计为易于变成,使用文件系统目录树作为数据模型。服务端使用Java语言编写,并且提供了Java和C语言的客户端。

一.zk的安装

下载地址 zookeeper.apache.org/releases.ht…

image.png 我是使用最新的3.9.1版本

zk的启动也是非常的简单, 直接执行bin目录下的

zkServer.sh

接着在使用客户端连接,执行

zkCli.sh

二.常见命令

1.查看所有的命令

随便请输入一些不存在的命令的时候,就会展示zk的所有的命令

image.png

接下来会介绍一些常用的命令

2.ls命令

ls [-s] [-w] [-R] path

命令详情

  • -s:显示节点数据
  • -w:设置监听
  • -R:递归展示子节点
# 查看根路径下列表
[zk: localhost:2181(CONNECTED) 12] ls /
[dp, zookeeper]

# 递归展示列表
[zk: localhost:2181(CONNECTED) 13] ls -R /
/
/dp
/zookeeper
/dp/001
/dp/002
/zookeeper/config
/zookeeper/quota


# 展示数据
[zk: localhost:2181(CONNECTED) 18] ls -s /
[dp, zookeeper]
cZxid = 0x0
ctime = Thu Jan 01 08:00:00 CST 1970
mZxid = 0x0
mtime = Thu Jan 01 08:00:00 CST 1970
pZxid = 0x14
cversion = 6
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 2


# 添加监听器
[zk: localhost:2181(CONNECTED) 20] ls  -w /dp/001
[]
# 删除这个节点时候,刚才添加的监听会接受到事件
[zk: localhost:2181(CONNECTED) 23]delete /dp/001 

WATCHER::

WatchedEvent state:SyncConnected type:NodeDeleted path:/dp/001 zxid: 25

3.create命令

create [-s] [-e] [-c] [-t ttl] path [data] [acl]

  • -s: 顺序节点
  • -e: 临时节点
  • -c: 容器节点
  • -t: ttl节点(有过期时间的节点)
  • data: 存储在节点上的数据
  • acl: 访问权限相关,默认全部可见
# 创建持久化节点 /aa
[zk: 6] create /aa 
Created /aa

# 创建持久化顺序节点 /dp


(相同的节点名是自动加上了递增的序号来保证顺序的)
[zk: 7] create -s /dp data
Created /dp0000000006

[zk: 8] create -s /dp data
Created Created /dp0000000007

# 创建临时节点 /dp_e (当这个session连接断开的时候就会删除此节点)
[zk: 9] create -e /dp_e data
Created /dp_e

4.get命令

get [-s] [-w] path

  • -s: 显示节点信息
  • -w: 设置监听,节点发生变化的时候有监听信息输出
# 获取节点数据
[zk: localhost:2181(CONNECTED) 41] get /dp/002 
data2

# 获取节点的详细数据
[zk: localhost:2181(CONNECTED) 40] get -s /dp/002
data2
cZxid = 0x15
ctime = Fri Dec 22 11:09:24 CST 2023
mZxid = 0x15
mtime = Fri Dec 22 11:09:24 CST 2023
pZxid = 0x15
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 5
numChildren = 0

# 为节点设置一个监听
[zk: localhost:2181(CONNECTED) 42] get -w /dp/002 
data2

# 更新这个节点数据
[zk: localhost:2181(CONNECTED) 43] set /dp/002  date3

WATCHER::
WatchedEvent state:SyncConnected type:NodeDataChanged path:/dp/002 zxid: 32

5. delete命令

delete [-v version] path

删除命令,比较简单,可以携带版本号,如果版本号不对,无法删除,如果要删除的节点有子节点,也无法删除

6.deleteall 命令

deleteall path [-b batch size]

删除指定路径下的全部节点,包含自己子节点

7.set命令

set [-s] [-v version] path data

  • -s:显示节点信息
  • -v version:指定版本(通过 CAS设置)
  • path:节点路径

[zk: localhost:2181(CONNECTED) 55] create /set_test 
Created /set_test
[zk: localhost:2181(CONNECTED) 56] set -s /set_test date1
cZxid = 0x23
ctime = Fri Dec 22 13:50:17 CST 2023
mZxid = 0x24
mtime = Fri Dec 22 13:50:28 CST 2023
pZxid = 0x23
cversion = 0
dataVersion = 1 # 版本号
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 5
numChildren = 0
[zk: localhost:2181(CONNECTED) 57] 
[zk: localhost:2181(CONNECTED) 57] 
[zk: localhost:2181(CONNECTED) 57] 

# 设置版本0的数据--失败
[zk: localhost:2181(CONNECTED) 57] set -v 0 /set_test date1
version No is not valid : /set_test

# 设置版本1是数据--成功
[zk: localhost:2181(CONNECTED) 58] set -v 1 -s  /set_test date2
cZxid = 0x23
ctime = Fri Dec 22 13:50:17 CST 2023
mZxid = 0x26
mtime = Fri Dec 22 13:51:15 CST 2023
pZxid = 0x23
cversion = 0
dataVersion = 2   # 版本号,每次会自增+1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 5
numChildren = 0

[zk: localhost:2181(CONNECTED) 59] set /set_test date3

[zk: localhost:2181(CONNECTED) 60] get -s /set_test 
date3
cZxid = 0x23
ctime = Fri Dec 22 13:50:17 CST 2023
mZxid = 0x27
mtime = Fri Dec 22 13:54:18 CST 2023
pZxid = 0x23
cversion = 0
dataVersion = 3  # 版本号,每次会自增+1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 5
numChildren = 0

三.其他命令

image.png

其他命令使用频率不是很高,大家有需要的话,可以自己测试下,每个命令的参数都有,比较简单,这里就不做赘述了,在后面的文章中,会继续介绍zookeeper的其他的用法,一点点深入理解zk