# Zookeeper 操作

# 节点类型

  1. 持久 (Persistent) : 客户端和服务器端断开连接之后,创建的节点不删除

  2. 短暂 (Ephemeral) : 客户端和服务器端断开连接之后,创建的节点自己删除

  3. 持久化目录节点

    客户端与 Zookeeper 断开连接后,该节点依旧存在

  4. 持久化顺序编号目录节点

    客户端与 Zookeeper 断开连接后,该节点依旧存在,知识 Zookeeper 给该节点进行顺序编号

  5. 临时目录节点

    客户端与 Zookeeper 断开连接后,该节点被删除

  6. 临时顺序编号目录节点

    客户端与 Zookeeper 断开连接后,该节点被删除,知识 Zookeeper 给该节点名称进行顺序编号

说明:创建 znode 时设置顺序标识,znode 名称后会附加一个值,顺序号是一个单调递增的计数器,由父节点维护

注意:在分布式系统中,顺序号可以被用于为所有的事件进行全局排序,这样客户端可以通过顺序号推断事件的顺序

# 监听器原理

image-20230214163006949

监听器原理 :

  1. 首先要有一个 main () 线程
  2. 在 main 线程中创建 Zookeeper 客户端,这时就会创建两个线程,一个负责网络连接通信 (connet), 一个负责监听 (listener)
  3. 通过 connect 线程将注册的监听事件发送给 Zookeeper
  4. 在 Zookeeper 的注册监听器列表中将注册的监听事件添加到列表中
  5. Zookeeper 监听到有数据或路径发生变化,就会将这个消息发送给 listener 线程
  6. listener 线程内部调用了 process () 方法

常见的监听 :

  1. 监听节点数据的变化 get path [watch]
  2. 监听子节点增减的变化 ls path [watch]

注意:在监听后再多次修改 znode 值,zookeeper 客户端不会再收到监听。因为注册一次,只能监听一次。想再次监听,需要再次注册

# 客户端向服务端写数据流程

  1. 写流程之直接发送给 Leader 节点

    image-20230214173045985

    • 客户端向 Leader 发送写数据请求
    • Leader 将自己将数据写入后,将写入据请求分发给 Follower, 并受到 Follower 的 ack 回复
    • 如果超过半数的 zookeeper 实例都已经写入完成,则 Leader 发送 ack 回复给客户端
    • 随后 Leader 通知其他未分发写数据请求的 Follower, 并接收其 ack 回复
  2. 写流程之写入请求发送给 follower 节点

    image-20230214173849488

    • 客户端向 Follower 发送写数据请求
    • 客户端直接将请求转发给 Leader
    • Leader 收到写数据请求后,自身将输入写入,随后将写数据请求分发给 Follower, 并等待其 ack 回复
    • Follower 收到写数据请求后开始写入数据,并发送 ack 回复
    • Leader 收到半数以上 Follower 的 ack 回复后,发送自身的 ack 回复给与客户端连接的 Follower
    • 该 Follower 收到 ack 回复后,将 ack 回复发送给客户端
    • Leader 通知其他未分发写数据请求的 Follower, 并接受其 ack 回复

# 服务器动态上下线