Zookeeper初识

官网:https://zookeeper.apache.org/

1 Zookeeper环境安装

1.1 服务端安装启动

1.1.1 centos

  1. 前置环境

Java8 Maven

  1. 下载Zookeeper:3.7.1

https://zookeeper.apache.org/releases.html

1
wget https://www.apache.org/dyn/closer.lua/zookeeper/zookeeper-3.7.1/apache-zookeeper-3.7.1-bin.tar.gz
  1. 解压
1
tar -xvf apache-zookeeper-3.7.1-bin.tar.gz
  1. 进入conf目录并拷贝zoo_sample.cfg,因为启动的时候会默认使用conf/zoo.cfg文 件,当然也可以指定启动文件
1
cp zoo_sample.cfg zoo.cfg
  1. 修改配置文件conf/zoo.cfg,比如修改dataDir、dataLogDir和clientPort等,当然如果不额外指定dataLogDir,则事务日志文件也会存储到dataDir中。
1
mkdir -p /usr/local/zookeeper/apache-zookeeper-3.7.1-bin/data
1
2
3
4
tickTime=2000
initLimit=10syncLimit=5
dataDir=/usr/local/zookeeper/apache-zookeeper-3.7.1-bin/data
clientPort=2181
  1. 根据自己的需求选择是否配置zk的环境变量,也就是在任意目录之下可以使用bin中的命令
1
2
3
4
5
6
7
vim /etc/profile
# 文件末尾增加如下配置
export ZOOKEEPER_HOME=/usr/local/zookeeper/apache-zookeeper-3.7.1-bin
export PATH=$PATH:$ZOOKEEPER_HOME/bin

# 让profile文件生效
source /etc/profile
  1. 启动与停止zkServer
1
2
3
4
zkServer.sh start # 启动
zkServer.sh start-foreground # 前端启动
zkServer.sh status # 查看状态
zkServer.sh stop # 停止

1.1.2 docker

  1. https://hub.docker.com/
  2. 搜索zookeeper镜像,版本选择: 3.7.1
  3. 拉取镜像
1
docker pull zookeeper:3.7.1
  1. 运行zookeeper container
1
docker run -d --name test-zk-server -p 2281:2182 zookeeper:3.7.1

1.1.3 源码

  1. 下载源码:https://www.apache.org/dyn/closer.lua/zookeeper/zookeeper-3.7.1/apache-zookeeper-3.7.1.tar.gz
  2. maven构建:在源码根目录下执行如下命令
1
mvn clean install ‐‐DskipTests
  1. 导入到idea中
  2. 创建zoo.cfg文件并配置,和centos配置方式一样
  3. 寻找启动类

bin/zkServer.cmd 或 bin/zkServer.sh,也就是服务端启动的时候,会通过QuorumPeerMain进行启动

ZOOMAIN=org.apache.zookeeper.server.quorum.QuorumPeerMain

  1. 配置启动类

  1. 日志输出

​ a- 将conf文件下的log.properties文件复制到zookeeper-server的resources文件夹下

​ b- 在zookeeper-server的pom.xml中添加slf4j的依赖

1
2
3
4
5
6
<denpendency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.25</version>
<scope>compile</scope>
</denpendency>
  1. 动zk server-standalone

1.2 客户端安装启动

1.2.1 centos

通过zkCli.sh连接

1
2
zkCli.sh # 默认连接本机的2181端口
zkCli.sh -server 127.0.0.1:2181 # 指定zk server

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
3
4
5
6
7
8
9
1 来到zk-server所在机器
2 下载源码:git clone https://github.com/DeemOpen/zkui
3 mvn clean install
4 复制config.cfg到jar包所在目录: target
5 打开配置文件,配置zkServer=zkServer=192.168.0.8:2181
6 zkui默认端口在9090: serverPort=9090
7 运行jar包: java -jar zkui-2.0-SNAPSHOT-jar-with-dependencies.jar
8 访问地址: localhost:9090
9 默认用户名密码:admin manager,可以通过userSet修改

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# 查看帮助
help

# 创建节点
create /gupao
create /gupao/jack
create /gupao/james

# 创建节点并往节点上存数据
create /gupao/jack/age 17
create /gupao/jack/hobby coding

# 获取ZNode
ls /
ls /gupao
ls -R /gupao

# 查询某个 查询某个ZNode ZNode数据数据
get /gupao/jack
get /gupao/jack/age
get /gupao/jack/hobby

# 修改ZNode的值
set /gupao/jack/age 16
get /gupao/jack/age

# 删除节点,当某个节点下存在子节点时,不能直接删除该节点
delete /gupao/jack/age
ls -R /
deleteall /gupao
ls -R /

3.3 节点状态

https://zookeeper.apache.org/doc/current/zookeeperProgrammers.html#sc_zkStatStructure

1
2
3
# 查询节点状态信息 查询节点状态信息((详情详情)) 总共11个
stat /gupao
get -s /gupao

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
3
4
set -v 2 /gupao 888
set -v 1 /gupao 888

stat /gupao

(2)cversion:子节点的版本号,是节点的版本,不是数据的版本

1
2
3
4
reate /gupao/test1
stat /gupao
create /gupao/test2
stat /gupao

(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
2
[zk: localhost:2181(CONNECTED) 22] create
create [-s] [-e] [-c] [-t ttl] path [data] [acl]

4.1 持久节点PERSISTENT

创建节点默认是持久节点,不会因为客户端宕机而删除节点

1
2
3
4
5
create /jack 666
stat /jack jack ## ephemeralOwner ephemeralOwner = 0x0
quit
zkCli.sh
ls /

4.2 临时节点EPHEMERAL

会因为客户端宕机而删除节点

1
2
3
4
5
create -e /test 111
stat /test test ## ephemeralOwner ephemeralOwner = 0x100000aa4c70002 sessionid
quit
zkCli.sh
ls /

4.3 有序节点SEQUENTIAL

会给节点名称添加一个自增的序号

1
2
3
4
5
6
7
8
#  持久有序节点
create -s /order
create -s /order
create -s /order
# 临时有序节点
create -s -e /product
create -s -e /product
create -s -e /product

4.4 容器节点

https://zookeeper.apache.org/doc/current/zookeeperProgrammers.html#Container+Nodes

3.6.0后新加的节点类型,当一个节点下的子节点都被删除后,这个容器节点也会自动删除

1
2
3
4
5
6
7
8
9
create -c /jack-container
create /jack-container/sub1
create /jack-container/sub2
ls -R /jack-container

delete /jack-container/sub1
delete /jack-container/sub2

# 等待一段时间之后,查看节点是否存在

4.5 TTL节点

https://zookeeper.apache.org/doc/current/zookeeperProgrammers.html#TTL+Nodes

3.6.0后新加的节点类型,可以给持久节点设置一个超时时间,需要在配置文件中添加配置:

zookeeper.extendedTypesEnabled=true 重启服务

1
reate -t 10 /zk-ttl 111

Zookeeper初识
http://www.zivjie.cn/2023/03/12/中间件/zookeeper/Zookeeper初识/
作者
Francis
发布于
2023年3月12日
许可协议