Zookeeper6:ZK实现分布式锁

Zookeeper6:ZK实现分布式锁

1. ZK中锁的种类

  • 读锁:大家都可以读,要想上读锁的前提:之前的锁没有写锁;
  • 写锁:只有得到写锁的才能写。要想上写锁的前提:之前没有任何锁;

2. ZK如何上读锁

  • 创建一个临时序号节点,节点的数据是read,表示是读锁
  • 获取当前zk中序号比自己小的所有节点
  • 判断最小节点是否是读锁
    • 如果不是读锁的话,则上锁失败,为最小节点设置监听。阻塞等待,zk的watch机制会当最小节点发生变化时通知当前节点,于是再执行第二步的流程
    • 如果是读锁的话,则上锁成功
notion image

3. ZK如何上写锁

  • 创建一个临时序号节点,节点的数据是write表示是写锁
  • 获取zk中所有的子节点
  • 判断自己是否是最小的节点
    • 如果是,则上写锁成功
    • 如果不是,说明前面还有锁,则上锁失败,监听最小的节点,如果最小节点有变化,则回到第二步。

4. 羊群效应

如果用上述的上锁方式,只要有节点发生变化,就会触发其他节点的监听事件,这样的话对zk的压力非常大一一羊群效应。可以调整成链式监听。解决这个问题
notion image