zookeeper

105 阅读1分钟

zookeeper

节点类型

  1. 持久化节点
  2. 持久化排序节点
  3. 临时节点
  4. 临时排序节点
  • 持久节点需要主动调用delete才能删除
  • 临时节点一旦创建者连接丢失或超时就会被删除,且临时节点没有子节点;
  • 排序节点 创建后会在节点名称后面自动添加序号

分布式锁:

利用zk临时排序节点的特性,

  1. 通过在/lock目录下创建临时排序节点,
  2. 再查询/lock目录下的子节点列表,
  3. 如果自己创建的节点为最小节点则获取锁,
  4. 否则添加watcher给最小节点,
  5. 当最小节点被移除时,zk会通知应用重新检查最小节点是否是自己,从而获取锁;

羊群效应

zk分布式锁的实现方式是在某个节点下创建临时节点,创建的节点ID最小即为占有锁;

其他没有抢占到锁的进程可以监控这个最小节点的状态,如果最小节点执行结束,节点被删除,则会通知到所有监听最小节点的进程,再重新判断当前节点是否是最小节点来判断是否获取到了锁;

这种所有节点都监听一个节点的方式,在节点释放的时候触发羊群效应,降低zk的响应速度;

解决方式:

临时节点都只监听比自己小一个的节点,则不会出发羊群效应

锁丢失

假设A获取了锁,但是因为GC导致和ZK的心跳停止了一段时间,导致临时节点被删除,其他人获取到锁;