# Zookeeper 操作
# 节点类型
持久 (Persistent) : 客户端和服务器端断开连接之后,创建的节点不删除
短暂 (Ephemeral) : 客户端和服务器端断开连接之后,创建的节点自己删除
持久化目录节点
客户端与 Zookeeper 断开连接后,该节点依旧存在
持久化顺序编号目录节点
客户端与 Zookeeper 断开连接后,该节点依旧存在,知识 Zookeeper 给该节点进行顺序编号
临时目录节点
客户端与 Zookeeper 断开连接后,该节点被删除
临时顺序编号目录节点
客户端与 Zookeeper 断开连接后,该节点被删除,知识 Zookeeper 给该节点名称进行顺序编号
说明:创建 znode 时设置顺序标识,znode 名称后会附加一个值,顺序号是一个单调递增的计数器,由父节点维护
注意:在分布式系统中,顺序号可以被用于为所有的事件进行全局排序,这样客户端可以通过顺序号推断事件的顺序
# 监听器原理

监听器原理 :
- 首先要有一个 main () 线程
- 在 main 线程中创建 Zookeeper 客户端,这时就会创建两个线程,一个负责网络连接通信 (connet), 一个负责监听 (listener)
- 通过 connect 线程将注册的监听事件发送给 Zookeeper
- 在 Zookeeper 的注册监听器列表中将注册的监听事件添加到列表中
- Zookeeper 监听到有数据或路径发生变化,就会将这个消息发送给 listener 线程
- listener 线程内部调用了 process () 方法
常见的监听 :
- 监听节点数据的变化 get path [watch]
- 监听子节点增减的变化 ls path [watch]
注意:在监听后再多次修改 znode 值,zookeeper 客户端不会再收到监听。因为注册一次,只能监听一次。想再次监听,需要再次注册
# 客户端向服务端写数据流程
写流程之直接发送给 Leader 节点
![image-20230214173045985]()
- 客户端向 Leader 发送写数据请求
- Leader 将自己将数据写入后,将写入据请求分发给 Follower, 并受到 Follower 的 ack 回复
- 如果超过半数的 zookeeper 实例都已经写入完成,则 Leader 发送 ack 回复给客户端
- 随后 Leader 通知其他未分发写数据请求的 Follower, 并接收其 ack 回复
写流程之写入请求发送给 follower 节点
![image-20230214173849488]()
- 客户端向 Follower 发送写数据请求
- 客户端直接将请求转发给 Leader
- Leader 收到写数据请求后,自身将输入写入,随后将写数据请求分发给 Follower, 并等待其 ack 回复
- Follower 收到写数据请求后开始写入数据,并发送 ack 回复
- Leader 收到半数以上 Follower 的 ack 回复后,发送自身的 ack 回复给与客户端连接的 Follower
- 该 Follower 收到 ack 回复后,将 ack 回复发送给客户端
- Leader 通知其他未分发写数据请求的 Follower, 并接受其 ack 回复


