笔记 - Zookeeper 3.x(命令、配置、重要图示、脚本、代码实现)
作者: Zzay
目的: 记录
Zookeeper
相关笔记(常用命令、常用配置、重要图示、常用脚本、代码实现),以方便未来查看使用。
1. 常用命令
以下包含
Zookeeper
相关的常用命令。(zroot:/opt/module/zookeeper-3.7.0
)
1.1 Server
-
start/stop
: 启动/停止 Zookeeper server。$ bin/zkServer.sh start/stop
-
status
: 查看当前 server 的状态。$ bin/zkServer.sh status
1.2 Client
-
zroot/bin/zkCli.sh
: 启动 Zookeeper 客户端。【】# 启动Zookeeper客户端 $ bin/zkCli.sh -server <serverInfo> # 启动Zookeeper客户端,并连接到指定的server $ bin/zkCli.sh -server <serverInfo>
-
help
: 显示所有操作命令。 -
ls <path>
: 查看当前 znode 的子节点(可监听)。-w
:监听子节点变化。-s
:附加次级信息。
[zk: hadoop102:2181(CONNECTED) 5] ls -s / [zookeeper]cZxid = 0x0 ctime = Thu Jan 01 08:00:00 CST 1970 mZxid = 0x0 mtime = Thu Jan 01 08:00:00 CST 1970 pZxid = 0x0 cversion = -1 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 0 numChildren = 1
附加信息介绍:
-
czxid
:创建结点的事务zxid
。每次修改 ZooKeeper 状态都会产生一个 ZooKeeper 事务ID。事务ID 是 ZooKeeper 中所有修改总的次序。每次修改都有唯一的
zxid
,如果 zxid1 小于 zxid2,那么 zxid1 在 zxid2 之前发生。 -
ctime
:znode 被创建的毫秒数(从 1970 年开始)。 -
mzxid
:znode 最后更新的事务zxid
。 -
mtime
:znode 最后修改的毫秒数(从 1970 年开始)。 -
pZxid
:znode 最后更新的子节点zxid
。 -
cversion
:znode 子节点变化号,znode 子节点修改次数。 -
dataversion
:znode 数据变化号。 -
aclVersion
:znode 访问控制列表的变化号。 -
ephemeralOwner
:如果是临时节点,这个是 znode 拥有者的 session id。如果不是临时节点则是 0。 -
dataLength
:znode 的数据长度。 -
numChildren
:znode 子节点数量。
-
create
: 普通创建。-s
:含有序列。-e
:临时(重启或者超时消失)。
-
get <path>
: 获取结点的值(可监听)。-w
:监听节点内容变化。-s
:附加次级信息。
-
set
: 设置结点的具体值。 -
stat
: 查看结点状态。 -
delete
: 删除结点。 -
deleteall
: 递归删除结点。
2. 常用配置
以下包含
Zookeeper
相关的常用配置。(zroot:/opt/module/zookeeper-3.7.0
)
-
zroot/conf/zoo.cfg
: 包括大部分 zookeeper 的相关配置信息。-
tickTime
: 通信心跳时间,Zookeeper 服务器与客户端心跳时间,单位毫秒。# 通信心跳时间 tickTime=2000
-
initLimit
: LF 初始通信时限。Leader 和 Follower 初始连接时能容忍的最多心跳数(tickTime
的数量)# LF初始通信时限 initLimit=10
-
syncLimit
: LF 通信时限。Leader 和 Follower 之间通信时间如果超过 syncLimit * tickTime,则 Leader 认为 Follower 死亡,并从服务器列表中删除 Follower 。# LF通信时限 syncLimit=5
-
**
dataDir
:**配置临时数据文件的存放路径,是必须自定义的配置。通常我们会在zroot
下创建一个文件夹,以存放临时数据文件。# 存放临时数据文件 dataDir=/opt/module/zookeeper-3.7.0/zkData
-
clientPort
: 客户端连接端口,通常不做修改。# 客户端连接端口 clientPort=2181
-
server 集群配置: 配置集群中各个 server 的信息 [ server.A=B:C:D ] 。
- A:一个数字,表示这个 server 是第几号服务器,Zookeeper 启动时读取
myid
文件,将其中的数据与zoo.cfg
的配置信息比较,从而判断该服务器是哪个 server 。 - B:该 server 的地址(IP 或 配置好的名字)。
- C:该 server 的 Follower 与集群中的 Leader server 交换信息的端口。
- D:当集群中的 Leader server 挂机后执行选举时,该 server 与其他 server 相互通信的端口。
# server信息格式 server.A=B:C:D # 举例 server.2=hadoop102:2888:3888 server.3=hadoop103:2888:3888 server.4=hadoop104:2888:3888
- A:一个数字,表示这个 server 是第几号服务器,Zookeeper 启动时读取
-
-
zroot/zkData/myid
文件: 我们需要在
zkData
文件夹中创建myid
,文件名不能修改,后续系统需要到该文件进行 server 编号匹配。 该文件中存放的内容为该服务器的 server 编号。
# 表示该server的编号为100 100
3. 重要图示
以下包含
Zookeeper
相关的重要图示。
3.1 概念
3.2 应用场景
3.3 选举机制
3.4 监听器
-
监听器原理:
注意:注册一次,只能监听一次。想再次监听,需要再次注册。
- 结点的值变化监听:
get -w
- NodeDataChanged 。 - 结点的子结点变化监听(路径变化):
ls -w
- NodeChildrenChanged 。
- 结点的值变化监听:
3.5 C/S通信交互
3.6 分布式锁
4. 常用脚本
以下包含使用
Zookeeper
过程中常用的脚本实现。
-
Zookeeper 集群启动停止脚本:
#!/bin/bash case $1 in "start"){ for i in hadoop102 hadoop103 hadoop104 do echo ---------- zookeeper $i 启动 ------------ ssh $i "/opt/module/zookeeper-3.5.7/bin/zkServer.sh start" done };; "stop"){ for i in hadoop102 hadoop103 hadoop104 do echo ---------- zookeeper $i 停止 ------------ ssh $i "/opt/module/zookeeper-3.5.7/bin/zkServer.sh stop" done };; "status"){ for i in hadoop102 hadoop103 hadoop104 do echo ---------- zookeeper $i 状态 ------------ ssh $i "/opt/module/zookeeper-3.5.7/bin/zkServer.sh status" done };; esac
5. Curator 框架
以下介绍
Curator
框架在 Zookeeper 中的应用。详情请查看官方文档:https://curator.apache.org/index.html
5.1 介绍
Curator
是一个专门解决分布式锁的框架,解决了原生 Java API 开发分布式时遇到的问题。- 原生 Java API 开发分布式存在的问题:
- 会话连接是异步的,需要自己去处理。比如使用
CountDownLatch
。 - Watch 需要重复注册,不然就不能生效。
- 开发的复杂性还是比较高的。
- 不支持多节点删除和创建。需要自己去递归。
- 会话连接是异步的,需要自己去处理。比如使用
5.2 实操案例
6. 面试重点
以下包括在企业面试中关于
Zookeeper
的常见问题。