Zookeeper 分布式锁原理

Zookeeper节点类型

  • 持久节点:PERSISTENT:
    • 建立后,一直存着,直至手动删除。
  • 临时节点:EPHEMERAL
    • 临时节点的生命周期和客户端会话绑定。
    • 临时节点不能建立子节点
  • 特殊属性:SEQUENTIAL属性。
    • 节点被建立的时候,Zookeeper自动在节点名后的追加整数数字,由父节点维护的自增节点
    • 所以有能够划分出两类:
      • 持久顺序节点:PERSISTENT_SEQUENTIAL
      • 临时顺序节点:EPHEMERAL_SEQUENTIAL

zookeeper分布式锁的原理

        锁分:排它锁(X 锁),共享锁(S 锁);分布式

        示例:/exclusive_lock/lock 该节点被定义为锁字体

  • 排它锁(X 锁)的核心:保证当前有且只有一个事务得到锁,而且锁被释放后,全部正在等待锁的事务能被通知到。
  • X锁获取过程:全部客户端经过create()建立锁,在该锁位置下建立临时节点/exclusive_lock/lock。但有且只有一个可以建立成功。该客户端得到锁,其余客户端到该节点上注册节点变动Watcher监听。
  • X锁释放过程:因为是临时节点,经过2种方式释放锁
    • 当前获取锁的客户端会话失效,Zookeeper删除该临时节点
    • 正常执行完业务逻辑,客户端主动删除该临时节点
    • 当锁释放后,通知全部注册Watcher的客户端,从新开始竞争锁

 

    注:红色字体已避免"羊群效应"spa

  • 共享锁 (S 锁)的核心:不一样的事务能够同时对一个数据对象进行读取操做,而更新操做必须在当前没有事务进行读写状况下进行。

        示例:/shared_lock/[hostname]-请求类型-序列对象

  • S锁获取过程:全部客户端在/shared_lock/该节点建立临时顺序节点。
    • 若是是读操做,建立相似/shared_lock/192.168.0.1-R-0000000001
    • 若是是写操做,建立相似/shared_lock/192.168.0.1-W-0000000001
    • getChildren()获取全部已建立的子节点信息,肯定本身在该子节点所在的位置
      • 对于读操做:若是没有比本身序列小,或者全部比本身小的序列都是读操做,标明能够获取S锁,开始执行读取操做;若是碰到有比本身序列小的写操做,进入等待状态。若是进入等待状态,调用exist()对比本身小的最后一个写节点进行Watcher监视。
      • 对于写操做:若是本身不是序列中最小的,进入等待状态。若是进入等待状态,向比本身序列小的最后一个写节点注册Watcher监视。
  • S锁释放过程:与X锁释放过程一致

参考资料:生命周期

《从PAXOS到ZOOKEEPER分布式一致性原理与实践》事务

相关文章
相关标签/搜索