zookeeper 分布式锁服务

分布式锁服务在你们的项目中或许用的很少,由于你们都把排他放在数据库那一层来挡。当大量的行锁、表锁、事务充斥着数据库的时候。通常web应用不少的瓶颈都在数据库上,这里给你们介绍的是减轻数据库锁负担的一种方案,使用zookeeper分布式锁服务。html

zookeeper是hadoop下面的一个子项目, 用来协调跟hadoop相关的一些分布式的框架, 如hadoop, hive, pig等, 其实他们都是动物, 因此叫zookeeper ——“动物园管理员”。动物园里固然有好多的动物,游客能够根据动物园提供的向导图到不一样的场馆观赏各类类型的动物,而不是像走在原始丛林里,心惊胆颤的被动物所观赏。为了让各类不一样的动物呆在它们应该呆的地方,而不是相互串门,或是相互厮杀,就须要动物园管理员按照动物的各类习性加以分类和管理,这样咱们才能更加放心安全的观赏动物。回到咱们企业级应用系统中,随着信息化水平的不断提升,咱们的企业级系统变得愈来愈庞大臃肿,性能急剧降低,客户抱怨频频。拆分系统是目前咱们可选择的解决系统可伸缩性和性能问题的惟一行之有效的方法。可是拆分系统同时也带来了系统的复杂性——各子系统不是孤立存在的,它们彼此之间须要协做和交互,这就是咱们常说的分布式系统。各个子系统就比如动物园里的动物,为了使各个子系统能正常为用户提供统一的服务,必须须要一种机制来进行协调——这就是ZooKeeper——动物园管理员node

ZooKeeper本质上是一个分布式的小文件存储系统。本来是Apache Hadoop的一个组件,如今被拆分为一个Hadoop的独立子项目,在HBase(Hadoop的另一个被拆分出来的子项目,用于分布式环境下的超大数据量的DBMS)中也用到了ZooKeeper集群。ZooKeeper有以下的特性:linux

1) 简单git

ZooKeeper核心是一个精简的文件系统,它提供了一些简单的文件操做以及附加的功能,例如排序和通知。github

2) 易表达web

ZooKeeper的数据结构原型是一棵znode树(相似Linux的文件系统),而且它们是一些已经被构建好的块,能够用来构建大型的协做数据结构和协议。算法

3) 高可用性数据库

ZooKeeper能够运行在一组服务器上,同时它们被设计成高可用性,为你的应用程序避免单点故障。apache

4) 松耦合交互编程

ZooKeeper提供的Watcher机制使得各客户端与服务器的交互变得松耦合,每一个客户端无需知晓其余客户端的存在,就能够和其余客户端进行数据交互。

5) 丰富的API

ZooKeeper为开发人员提供了一套丰富的API,减轻了开发人员编写通用协议的负担。

zookeeper实际上是集群中每一个节点都维护着一棵相同的树, 树的结构跟linux的目录结构的概念差很少, 以/为跟节点, 下边能够扩展任意的节点和叶子节点, 每一个节点均可以写入数据. 基于zookeeper的分布式锁的实现, 实际上是得益于zookeeper同步文件的强大性, 咱们相信每时每刻咱们访问zookeeper的树时, 相同节点返回的数据都是一致的. 这要靠zookeeper内部的一些算法来实现. 特别是leader的选举算法。

官方文档:http://zookeeper.apache.org/doc/r3.3.2/zookeeperOver.html#ch_DesignOverview

下载:http://zookeeper.apache.org/releases.html

C#的zookeeper客户端仍是有一些和zookeeper最新版3.4.3兼容 https://github.com/ewhauser/zookeeper/branches 

zookeeper集群的每一个节点的数据都是一致的, 那么咱们能够经过这些节点来做为锁的标志.

首先给锁设置一下API, 至少要包含, lock(锁住), unlock(解锁), isLocked(是否锁住)三个方法,而后咱们能够建立一个工厂(LockFactory), 用来专门生产锁.锁的建立过程以下描述:

前提:每一个锁都须要一个路径来指定(如:/geffzhang/lock)

1.根据指定的路径, 查找zookeeper集群下的这个节点是否存在.(说明已经有锁了)

2. 若是存在, 根据查询者的一些特征数据(如ip地址/hostname), 当前的锁是否是查询者的

3. 若是不是查询者的锁, 则返回null, 说明建立锁失败

4. 若是是查询者的锁, 则把这个锁返回给查询者

5. 若是这个节点不存在, 说明当前没有锁, 那么建立一个临时节点, 并将查询者的特征信息写入这个节点的数据中, 而后返回这个锁.

据以上5部, 一个分布式的锁就能够建立了.

建立的锁有三种状态:

1. 建立失败(null), 说明该锁被其余查询者使用了.’

2. 建立成功, 但当前没有锁住(unlocked), 可使用

3. 建立成功, 但当前已经锁住(locked)了, 不能继续加锁.

zookeeper 客户端编程

分布式锁服务

分布式服务框架 Zookeeper -- 管理分布式环境中的数据

基于zookeeper实现的分布式锁

相关文章
相关标签/搜索