zookeeper监听器及写数据流程


zookeeper监听器及写数据流程

zookeeper监听器原理

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

监听节点值变化

# 监听/zookeeper节点值
[zk: localhost:2181(CONNECTED) 4] get -w /zookeeper
v1
# 修改/zookeeper节点值
[zk: localhost:2181(CONNECTED) 5] set /zookeeper "v"

WATCHER::

WatchedEvent state:SyncConnected type:NodeDataChanged path:/zookeeper

可以看到修改/zookeeper节点值后监听器生效了

注意:再次修改/zookeeper的值监听器不会生效,因为监听器注册一次,只能监听一次,想再次监听,需要再次注册

监听节点变化

这里的节点变化指的是节点结构,例如:节点增加或减少了子节点

# 监听/znode1节点
[zk: localhost:2181(CONNECTED) 12] ls -w /znode1
[znode1.1]
# 删除/znode1/znode1.1节点
[zk: localhost:2181(CONNECTED) 13] delete /znode1/znode1.1

WATCHER::

WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/znode1

可以看到删除/znode1/znode1.1节点后监听器生效了

zookeeper写流程之写请求直接发送给Leader节点

  1. 客户端发送写请求到leader节点
  2. leader执行写操作并通知follower执行写操作
  3. follower执行完写操作通知leader
  4. leader判断集群中是否超过一半节点都执行了写操作,是则响应客户端请求,否则继续通知下一个follower执行写操作
  5. leader通知剩下的follower执行写操作

写流程之写请求发送给follower节点

  1. 客户端发送写请求到follower节点
  2. follower没有写权限,通知leader执行写操作
  3. leader执行写操作然后通知follower执行写操作
  4. follower执行完写操作通知leader
  5. leader判断集群中是否超过一半节点都执行了写操作,是则通知follower响应客户端请求(客户端请求发送给follower,所以需要follwer响应),否则继续通知下一个follower执行写操作
  6. follower响应客户端请求
  7. leader通知剩下的follower执行写操作
  8. follower执行完写操作通知leader