zookeeper
节点类型
- 持久化节点
- 持久化排序节点
- 临时节点
- 临时排序节点
- 持久节点需要主动调用delete才能删除
- 临时节点一旦创建者连接丢失或超时就会被删除,且临时节点没有子节点;
- 排序节点 创建后会在节点名称后面自动添加序号
分布式锁:
利用zk临时排序节点的特性,
- 通过在/lock目录下创建临时排序节点,
- 再查询/lock目录下的子节点列表,
- 如果自己创建的节点为最小节点则获取锁,
- 否则添加watcher给最小节点,
- 当最小节点被移除时,zk会通知应用重新检查最小节点是否是自己,从而获取锁;
羊群效应
zk分布式锁的实现方式是在某个节点下创建临时节点,创建的节点ID最小即为占有锁;
其他没有抢占到锁的进程可以监控这个最小节点的状态,如果最小节点执行结束,节点被删除,则会通知到所有监听最小节点的进程,再重新判断当前节点是否是最小节点来判断是否获取到了锁;
这种所有节点都监听一个节点的方式,在节点释放的时候触发羊群效应,降低zk的响应速度;
解决方式:
临时节点都只监听比自己小一个的节点,则不会出发羊群效应
锁丢失
假设A获取了锁,但是因为GC导致和ZK的心跳停止了一段时间,导致临时节点被删除,其他人获取到锁;