作用

分部署协调
分布式锁
无状态化实现

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:观察者的状态

选举的过程

重新选举的过程