1.什么是 zookeeper
官方文档上这么解释 zookeeper,它是一个分布式协调框架,是 Apache Hadoop 的一个子项
目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同
步服务、集群管理、分布式应用配置项的管理等。
2.zeekeeper 核心概念
-
文件系统数据结构
-
监听通知机制
2.1 文件系统数据结构
每个子目录项都被称作为 ** znode(目录节点)**,和文件系统类似,我们能够自由的增加、删除
znode,在一个 znode 下增加、删除子 znode。
有四种类型的 znode:
- PERSISTENT -持久化目录节点
客户端与 zookeeper 断开连接后,该节点依旧存在 - PERSISTENT-SEQUENTIAL -持久化顺序编号目录节点
持久化目录节点只是 zookeeper 给该节点名称进行顺序编号 - EPHEMERL-临时目录节点
客户端与 zookeeper 断开连接后,该节点被删除 - EPHEMERL-SEQUENTIAL 临时顺序编号目录节点
zookeeper 顺序编号的临时目录节点 - container 节点 :3.5.3 版本新增,如果 Container 节点下面没有子节点,则 Container 节点在未来会被 Zookeeper 自动清除,定时任务默认 60s 检查一次
2.2 监听通知机制
- 如果注册的是对某个节点的监听,则当这个节点被删除,或者被修改时,对应的客户端将被通知
- 如果注册的是对某个目录的监听,则当这个目录有子节点被创建,或者有子节点被删除,对应的客户端将被通知
- 如果注册的是对某个目录的递归子节点进行监听,则当这个目录下面的任意子节点有目录结构的变化(有子节点被创建,或被删除)或者根节点有数据变化时,对应的客户端将被通知。
注意:所有的通知都是一次性的,及无论是对节点还是对目录进行的监听,一旦触发,对应的监听即被移除。递归子节点,监听是对所有子节点的,所以,每个子节点下面的事件同样只会被触发一次。
3.zookeeper 经典应用场景
- 分布式配置中心
- 分布式注册中心
- 分布式锁
- 分布式队列
- 集群选举
- 分布式屏障
- 发布/订阅
4.zookeeper 常用操作命令
- 连接服务
bin/zkCli.sh ‐server ip:port
- 创建节点
create [‐s] [‐e] [‐c] [‐t ttl] path [data] [acl]
[zk: localhost:2181(CONNECTED) 0] create -se /simple
Created /simple0000000010
[zk: localhost:2181(CONNECTED) 1] create -se /simple
Created /simple0000000011
[zk: localhost:2181(CONNECTED) 2] create -se /simple
Created /simple0000000012
[zk: localhost:2181(CONNECTED) 3]
--非顺序节点不允许创建相同的节点名称
[zk: localhost:2181(CONNECTED) 5] create -e /goodjob
Created /goodjob
[zk: localhost:2181(CONNECTED) 6] create -e /goodjob
Node already exists: /goodjob
[zk: localhost:2181(CONNECTED) 7]
中括号中为可选项,没有则默认创建持久化节点
-s :顺序节点
-e:临时节点
-c:容器节点
-t:给节点添加过期时间,默认禁用
path:节点路径
data:节点数据
acl:节点 acl 权限
- 修改及查看节点
[zk: localhost:2181(CONNECTED) 9] set /goodjob 123
[zk: localhost:2181(CONNECTED) 10] get /goodjob
123
- 查看节点状态
[zk: localhost:2181(CONNECTED) 11] stat /goodjob
cZxid = 0x4a
ctime = Fri Aug 25 16:51:36 CST 2023
mZxid = 0x4c
mtime = Fri Aug 25 16:57:34 CST 2023
pZxid = 0x4a
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x1000424341b000c
dataLength = 3
numChildren = 0
- cZxid 创建 znode 的事务 id
- mZxid:最后修改 znode 的事务 ID。
- pZxid:最后添加或删除子节点的事务 ID(子节点列表发生变化才会发生改变)。
- ctime:znode 创建时间。
- mtime:znode 最近修改时间。
- dataVersion:znode 的当前数据版本。
- cversion:znode 的子节点结果集版本(一个节点的子节点增加、删除都会影响这个版本)。
- aclVersion:表示对此 znode 的 acl 版本。
- ephemeralOwner:znode 是临时 znode 时,表示 znode 所有者的 session ID。 如果 znode 不是临时 znode,则该字段设置为零。
- dataLength:znode 数据字段的长度。
- numChildren:znode 的子 znode 的数量
- 事件监听
//注册监听的同时获取数据
[zk: localhost:2181(CONNECTED) 12] get -w /goodjob
123
[zk: localhost:2181(CONNECTED) 13] set /goodjob 456
WATCHER::
WatchedEvent state:SyncConnected type:NodeDataChanged path:/goodjob
Zookeeper 事件类型:
- None: 连接建立事件
- NodeCreated: 节点创建
- NodeDeleted: 节点删除
- NodeDataChanged:节点数据变化
- NodeChildrenChanged:子节点列表变化
- DataWatchRemoved:节点监听被移除
- ChildWatchRemoved:子节点监听被移除
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于