一.概述
清明节的时候写了一篇分布式锁概述,里面介绍了分布式锁实现的几种方式,其实那时候我一直沉迷于使用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.节点介绍
一、PERSISTENT-持久化目录节点
客户端与Zookeeper断开链接后,该节点依旧存在
二、PERSISTENT_SEQUENTIAL-持久化顺序编号目录节点
客户端与Zookeeper断开链接后,该节点依旧存在,只是Zookeeper给该节点名称进行顺序编号
三、EPHEMERAL-临时目录节点
客户端与Zookeeper断开链接后,该节点被删除
四、EPHEMERAL_SEQUENTIAL-临时顺序编号目录节点
客户端与Zookeeper断开链接后,该节点被删除,只是Zookeeper给该节点名称进行顺序编号
三.Zookeeper分布式锁的实现
Zookeeper实现分布式锁是经过节点和临时顺序节点来实现的:主要有一下步骤:
1. 在构造函数里面启动的时候创建一个节点,假如命名为:lock。节点类型为持久节点(PERSISTENT)【ZooKeeper里面的znode节点会自动同步的,并且是强一致性,建立一个节点后只有ZooKeeper集群同步完成后算成功】
2. 每当进程须要访问共享资源时,会在lock节点下面创建响应的顺序子节点,节点类型为临时顺序节点(EPHEMERAL_SEQUENTIAL)
3. 在创建子节点以后,判断刚刚创建的子节点顺序号是否为最小节点,若是是最小节点,则能够得到该锁对资源进行访问。(临时子节点创建会自动生成一个序号的)
4. 若是不是该节点,就得到该节点的上一顺序节点,并给该节点是否存在注册监听事件。同时在这里阻塞。等待监听事件的发生。得到控制权(实现watch接口,而且重写process方法,在process里面实现监听)
5. 当完成以后,关闭ZooKeeper链接,进而能够应发监听事件,释放该锁(客户端关闭ZooKeeper链接以后会删除当前的临时节点)node
下一篇将贴上代码基于代码进行详细介绍。redis