Zookeeper初识
官网:https://zookeeper.apache.org/
1 Zookeeper环境安装
1.1 服务端安装启动
1.1.1 centos
- 前置环境
Java8 Maven
- 下载Zookeeper:3.7.1
https://zookeeper.apache.org/releases.html
1 | |
- 解压
1 | |
- 进入conf目录并拷贝zoo_sample.cfg,因为启动的时候会默认使用conf/zoo.cfg文 件,当然也可以指定启动文件
1 | |
- 修改配置文件conf/zoo.cfg,比如修改dataDir、dataLogDir和clientPort等,当然如果不额外指定dataLogDir,则事务日志文件也会存储到dataDir中。
1 | |
1 | |
- 根据自己的需求选择是否配置zk的环境变量,也就是在任意目录之下可以使用bin中的命令
1 | |
- 启动与停止zkServer
1 | |
1.1.2 docker
- https://hub.docker.com/
- 搜索zookeeper镜像,版本选择: 3.7.1
- 拉取镜像
1 | |
- 运行zookeeper container
1 | |
1.1.3 源码
- 下载源码:https://www.apache.org/dyn/closer.lua/zookeeper/zookeeper-3.7.1/apache-zookeeper-3.7.1.tar.gz
- maven构建:在源码根目录下执行如下命令
1 | |
- 导入到idea中
- 创建zoo.cfg文件并配置,和centos配置方式一样
- 寻找启动类
bin/zkServer.cmd 或 bin/zkServer.sh,也就是服务端启动的时候,会通过QuorumPeerMain进行启动
ZOOMAIN=org.apache.zookeeper.server.quorum.QuorumPeerMain
- 配置启动类

- 日志输出
a- 将conf文件下的log.properties文件复制到zookeeper-server的resources文件夹下
b- 在zookeeper-server的pom.xml中添加slf4j的依赖
1 | |
- 动zk server-standalone
1.2 客户端安装启动
1.2.1 centos
通过zkCli.sh连接
1 | |
1.2.2 源码
找到zkCli.cmd,发现客户端是通过ZookeeperMain运行的

1.2.3 prettyZoo
https://github.com/vran-dev/PrettyZoo/releases
1.2.3 web图形化界面zkui
https://github.com/DeemOpen/zkui
1 | |
2 Zookeeper Sessions
https://zookeeper.apache.org/doc/current/zookeeperProgrammers.html#ch_zkSessions
可以通过zkCli.sh 查看session相关信息,比如sessionTimeout=30000毫秒、seession id=0x10000314a5a0002
Zookeeper连接是TCP长连接,超时时间指的是客户端和服务端因为一些原因断开了连接,如果在超时时间内能够重新连接上,则会话依然有效。
3 数据模型与基本操作
3.1 数据模型
https://zookeeper.apache.org/doc/current/zookeeperOver.html#sc_dataModelNameSpace

3.2 基本操作
1 | |
3.3 节点状态
https://zookeeper.apache.org/doc/current/zookeeperProgrammers.html#sc_zkStatStructure
1 | |
3.3.1 基本
(1)numChildren:当前节点子节点的数量
(2)dataLength:当前节点保存的数据长度
(3)ephemeralOwner:当前节点是否为临时节点,如果为临时节点则该值为 sessionid,否则为0
3.3.2 时间相关
(1)ctime:当前节点比创建的时间。比如ctime = Thu Jul 21 22:00:07 UTC 2022
(2)mtime:当前节点最后一次被修改的时间。比如mtime = Thu Jul 21 22:08:47 UTC 2022
3.3.3 版本相关
(1)dataVersion:当前节点的数据被修改的次数,也就是数据的版本
1 | |
(2)cversion:子节点的版本号,是节点的版本,不是数据的版本
1 | |
(3)aversion:acl的版本号
3.3.4 zxid
https://zookeeper.apache.org/doc/current/zookeeperProgrammers.html#sc_timeInZk
zxid是事务编号,8字节的整型数,即64个比特位,前32位标识epoch,后32位用来计数。
zxid的初始值为0,每一次事务请求都会把后面32位的值+1,比如进行了10次事务请求,则zxid变为 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00001010,每进行一次leader选举,前32位的值就会+1,并把后面的32位清零,则zxid变为 00000000 00000000 00000000 00000001 00000000 00000000 00000000 00000000,若一直没有进行leader选举,同时一直在发生事务请求,则后面32位会一直增加,极限值是00000000 00000000 00000000 00000000 11111111 11111111 11111111 11111111,此时再发生事务请求,则把前面的32位+1,变成00000000 00000000 00000000 00000001 00000000 00000000 00000000 00000000
(1)czxid:表示当前节点被创建时的事务id
(2)mzxid:表示当前节点被最后一次更新时的事务id
(3)pzxid:表示该节点的子节点最后一次被修改时的事务id。只有子节点变化才会影响 pzxid,子节点的数据变化不会影响pzxid
4 节点特性
查看create命令
1 | |
4.1 持久节点PERSISTENT
创建节点默认是持久节点,不会因为客户端宕机而删除节点
1 | |
4.2 临时节点EPHEMERAL
会因为客户端宕机而删除节点
1 | |
4.3 有序节点SEQUENTIAL
会给节点名称添加一个自增的序号
1 | |
4.4 容器节点
https://zookeeper.apache.org/doc/current/zookeeperProgrammers.html#Container+Nodes
3.6.0后新加的节点类型,当一个节点下的子节点都被删除后,这个容器节点也会自动删除
1 | |
4.5 TTL节点
https://zookeeper.apache.org/doc/current/zookeeperProgrammers.html#TTL+Nodes
3.6.0后新加的节点类型,可以给持久节点设置一个超时时间,需要在配置文件中添加配置:
zookeeper.extendedTypesEnabled=true 重启服务
1 | |