基于Zookeeper的分布式锁

zookeeper中几个关于节点的有趣的性质:html

  1. 有序节点:假如当前有一个父节点为/lock,咱们能够在这个父节点下面建立子节点;zookeeper提供了一个可选的有序特性,例如咱们能够建立子节点“/lock/node-”而且指明有序,那么zookeeper在生成子节点时会根据当前的子节点数量自动添加整数序号,也就是说若是是第一个建立的子节点,那么生成的子节点为/lock/node-0000000000,下一个节点则为/lock/node-0000000001,依次类推。
  2. 临时节点:客户端能够创建一个临时节点,在会话结束或者会话超时后,zookeeper会自动删除该节点。
  3. 事件监听:在读取数据时,咱们能够同时对节点设置事件监听,当节点数据或结构变化时,zookeeper会通知客户端。当前zookeeper有以下四种事件:1)节点建立;2)节点删除;3)节点数据修改;4)子节点变动。

 

zookeeper实现分布式锁的步骤:java

  1. 客户端链接zookeeper,并在/lock下建立临时的有序的子节点,第一个客户端对应的子节点为/lock/lock-0000000000,第二个为/lock/lock-0000000001,以此类推。
  2. 客户端获取/lock下的子节点列表,判断本身建立的子节点是否为当前子节点列表中序号最小的子节点,若是是则认为得到锁,不然监听恰好在本身以前一位的子节点删除消息,得到子节点变动通知后重复此步骤直至得到锁;
  3. 执行业务代码;
  4. 完成业务流程后,删除对应的子节点释放锁。

 

Curator 二次封装zk,提供的zookeeper分布式锁实现。node

    经过 acquire,release 方法搞定。分布式

 

http://www.dengshenyu.com/java/%E5%88%86%E5%B8%83%E5%BC%8F%E7%B3%BB%E7%BB%9F/2017/10/23/zookeeper-distributed-lock.html?hmsr=toutiao.io&utm_medium=toutiao.io&utm_source=toutiao.ioui

 

https://mp.weixin.qq.com/s/GtiYmuKruS2V1oMxIDt0VQhtm

 

Znode节点均可以设置关联的数据。Zookeeper为了保证高吞吐和低延迟,在内存中维护了这个树状的目录结构,这种特性使得Zookeeper不能用于存放大量的数据,每一个节点的存放数据上限为1M。事件

有序性是zookeeper中很是重要的一个特性,全部的更新都是全局有序的,每一个更新都有一个惟一的时间戳,这个时间戳称为zxid(Zookeeper Transaction Id)。而读请求只会相对于更新有序,也就是读请求的返回结果中会带有这个zookeeper最新的zxid。内存

相关文章
相关标签/搜索