ZooKeeper分布式锁浅谈

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ZooKeeper分布式锁浅谈相关的知识,希望对你有一定的参考价值。

一.概述
  清明节的时候写了一篇分布式锁概述,里面介绍了分布式锁实现的几种方式,其实那时候我一直沉迷于使用redis的悲观锁和乐观锁来实现分布式锁,直到一个血案的引发才让我重新认识了redis分布式锁的弊端,所以才痛定思痛潜心研究Zookeeper;自己装了三台Centos虚拟机,搭建了ZooKeeper集群。
二.ZooKeeper基本概念
1.前言
  ZooKeeper 是一个开源的分布式协调服务,由雅虎创建,是 Google Chubby 的开源实现。分布式应用程序可以基于 ZooKeeper 实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master 选举、分布式锁和分布式队列等功能。
2.ZooKeeper角色
  在 ZooKeeper 中,有三种角色:
  Leader
  Follower
  Observer
  一个 ZooKeeper 集群同一时刻只会有一个 Leader,其他都是 Follower 或 Observer。当Leader奔溃后会从Follower重新选举一个出来,读者可以自行参考Zab协议。
3.节点介绍
  1、PERSISTENT-持久化目录节点
  客户端与Zookeeper断开连接后,该节点依旧存在
  2、PERSISTENT_SEQUENTIAL-持久化顺序编号目录节点
  客户端与Zookeeper断开连接后,该节点依旧存在,只是Zookeeper给该节点名称进行顺序编号
  3、EPHEMERAL-临时目录节点
  客户端与Zookeeper断开连接后,该节点被删除
  4、EPHEMERAL_SEQUENTIAL-临时顺序编号目录节点
  客户端与Zookeeper断开连接后,该节点被删除,只是Zookeeper给该节点名称进行顺序编号
三.Zookeeper分布式锁的实现
  Zookeeper实现分布式锁是通过节点和临时顺序节点来实现的:主要有一下步骤:
  1. 在构造函数里面启动的时候建立一个节点,假如命名为:lock。节点类型为持久节点(PERSISTENT)【ZooKeeper里面的znode节点会自动同步的,而且是强一致性,创建一个节点后只有ZooKeeper集群同步完成后算成功】
  2. 每当进程需要访问共享资源时,会在lock节点下面建立响应的顺序子节点,节点类型为临时顺序节点(EPHEMERAL_SEQUENTIAL)
  3. 在建立子节点之后,判断刚刚建立的子节点顺序号是否为最小节点,如果是最小节点,则可以获得该锁对资源进行访问。(临时子节点建立会自动生成一个序号的)
  4. 如果不是该节点,就获得该节点的上一顺序节点,并给该节点是否存在注册监听事件。同时在这里阻塞。等待监听事件的发生。获得控制权(实现watch接口,并且重写process方法,在process里面实现监听)
  5. 当完成之后,关闭ZooKeeper连接,进而可以应发监听事件,释放该锁(客户端关闭ZooKeeper连接之后会删除当前的临时节点)

下一篇将贴上代码基于代码进行详细介绍。

以上是关于ZooKeeper分布式锁浅谈的主要内容,如果未能解决你的问题,请参考以下文章

浅谈Redis和zookeeper的分布式锁设计

可重入锁浅谈

浅谈分布式服务协调技术 Zookeeper

浅谈分布式服务协调技术 Zookeeper

浅谈分布式服务协调技术 Zookeeper

Zookeeper-分布式锁案例