作用
分部署协调
分布式锁
无状态化实现
zk数据结构
树,根节点是/,znode可以存放数据
create /test 123
get /test
znode数据结构
data 2. acl 3. stat 4. child
znode的类型
持久节点
持久序号节点
> 分布式锁实现
临时节点
> zk客户端断开连接后节点消失,可用于实现服务注册与发现
临时序号节点
container节点
TTL节点
zk数据的持久化
事务日志
数据快照
数据恢复时,先恢复快照文件中的数据到内存,再恢复日志文件中的增量数据,速度更快。
操作
删除
普通删除
乐观锁删除:delete -v 0 /test
zk实现分布式锁
锁的种类
读锁:大家都可以读,加锁条件:之前的锁没有写锁
> 防止并发修改
写锁:只有得到写锁才可以写,加锁条件:之前没有任何锁
> 读锁消失了才可以写入数据
如何加读锁
给lock节点创建一个临时序号节点,节点的数据是read,表示是读锁
获取当前lock节点的所有子节点中序号比当前节点小的所有节点
判断最小节点是否是读锁
如果不是读锁,则上锁失败,为最小节点设置监听。阻塞等待,zk的watch机制会当最小节点发生变化时通知当前节点,于是再执行第二部的流程。
如果是读锁则加锁成功。
如何加写锁
给lock节点创建一个临时序号节点,节点的数据是read,表示是读锁
获取当前lock节点的所有子节点
判断自己是否是最小的节点
如果是,则加锁成功
如果不是,说明前面还有锁,则上锁失败,监听上一个节点(防止羊群效应),如果最小的节点有变化,循环2-3
zk客户端的watch机制
当节点数据发生变化时,客户端get -w /test
可以设置NIO通信模式监听客户端的调用,此命令只会监听一次,可以再每次监听到数据的是时候再设置监听。
ls -R -w /test
监听子节点的创建
ZAB协议
zookeeper atomic broadcast
四种状态
Looking:选举状态
Following:Follower节点所处的状态
Leading:Leader节点所处的节点
Observing:观察者的状态