打赏

Zookeeper概念学习系列之zookeeper实现分布式共享锁

 

 

 

  首先假设有两个线程, 两个线程要同时到mysql中更新一条数据, 对数据库中的数据进行累加更新。由于在分布式环境下, 这两个线程可能存在于不同的机器上的不同jvm进程中, 所以这两个线程的关系就是垮主机跨进程, 使用java中的synchronized锁是搞不定的。


 


  主要利用了zookeeper的临时有序节点的特性和watcher监视器
  我们认为最小的节点具备执行权, 也就是获取到了锁。

 

  临时节点有一个特点: 当创建临时节点的程序停掉之后, 这个临时节点就会消失。
  监视器的特点: 可以给 zk 中的节点注册监视器, 监视这个节点的子节点的变化情况监视器注册一次, 只能使用一次。 多次使用需要多次注册 。

 

 

 

 


大致思路如下:
  1: 当这两个线程去mysql更新数据之前, 先到zookeeper/locks(永久节点)下面注册一个临时有序节点, 这样每个线程都注册了一个临时节点, 两个临时节点肯定是有序的。
  线程1: /locks/000000002 线程2: /locks/000000001

 

  2: 当每个线程注册完节点之后, 需要尝试获取锁, 这个时候, 哪个节点最小, 哪个线程就获取到锁, 这个时候, 线程2注册的节点最小, 所以线程就获取到锁, 执行更新数据库的代码, 更新完
  成之后, 删除自己注册的临时节点。同时线程1会判断自己不是最小的, 所以就会监控比自己小1的那个节点, 当发现那个节点消失的话, 也就意味着它的节点就是最小的节点, 获取锁, 执行更新数据库的代码 

 

 

 

  具体,见

zookeeper编程入门系列之zookeeper实现分布式进程监控和分布式共享锁(图文详解)

 

posted @ 2017-07-26 21:53  大数据和AI躺过的坑  阅读(630)  评论(0编辑  收藏  举报