zookeeper是hadoop下面的一个子项目, 用来协调跟hadoop相关的一些分布式的框架, 如hadoop, hive, pig等, 其实他们都是动物, 所以叫zookeeper(本人歪歪).
zookeeper其实是集群中每个节点都维护着一棵相同的树, 树的结构跟linux的目录结构的概念差不多, 以/为跟节点, 下边可以扩展任意的节点和叶子节点, 每个节点都可以写入数据. 基于zookeeper的分布式锁的实现, 其实是得益于zookeeper同步文件的强大性, 我们相信每时每刻我们访问zookeeper的树时, 相同节点返回的数据都是一致的. 这要靠zookeeper内部的一些算法来实现. 特别是leader的选举算法, 这里就不说了, 感兴趣的话可以去搜索一下看看.
我们知道了zookeeper集群的每个节点的数据都是一致的, 那么我们可以通过这些节点来作为锁的标志.
首先给锁设置一下API, 至少要包含, lock(锁住), unlock(解锁), isLocked(是否锁住)三个方法
然后我们可以创建一个工厂(LockFactory), 用来专门生产锁.
锁的创建过程如下描述:
前提:每个锁都需要一个路径来指定(如:/jiacheo/lock)
1.根据指定的路径, 查找zookeeper集群下的这个节点是否存在.(说明已经有锁了)
2. 如果存在, 根据查询者的一些特征数据(如ip地址/hostname), 当前的锁是不是查询者的
3. 如果不是查询者的锁, 则返回null, 说明创建锁失败
4. 如果是查询者的锁, 则把这个锁返回给查询者
5. 如果这个节点不存在, 说明当前没有锁, 那么创建一个临时节点, 并将查询者的特征信息写入这个节点的数据中, 然后返回这个锁.
根据以上5部, 一个分布式的锁就可以创建了.
创建的锁有三种状态:
1. 创建失败(null), 说明该锁被其他查询者使用了.’
2. 创建成功, 但当前没有锁住(unlocked), 可以使用
3. 创建成功, 但当前已经锁住(locked)了, 不能继续加锁.
如图, 如果我们getLock(“/jiacheo/lock1″,”192.168.0.100″), 想要获取/jiacheo/lock1这个锁的话, 我们先判断这个节点是否存在, 存在的话获取他的数据(data), 然后通过解析data, 我们可以知道这个节点是不是我们查询者创建的(通过ip地址写入节点数据中), 然后就可以返回一个锁了.
正确实现一个分布式锁是一件非常棘手的事情,因为很难对所有类型的故障进行正确的处理,ZooKeeper带有一个Java语言编写的生产级别的锁实现,名为WriteLock,客户端可以方便的使用它。
(b)zookeeper分布式锁
link:http://www.searchtb.com/2011/01/zookeeper-research.html
拥有了zookeeper如此强大的分布式协作系统后,我们可以很容易的实现大量的分布式应用,包括了分布式锁,分布式队列,分布式Barrier,双阶段提交等等. 这些应用可以帮我们改进很多复杂系统的协作方式,将这些系统的实现变得更加优雅而高效.鉴于篇幅,本文仅介绍分布式锁的实现.
利用了前文提到的sequence nodes可以非常容易的实现分布式锁. 实现分布式锁的基本步骤如下(这些步骤需要在所有需要锁的客户端执行):
分布式锁在zookeeper的源代码中已经有实现,可以参考org.apache.zookeeper.recipes.lock
6、ZooKeeper一致性协议-Zab
link:http://blog.csdn.net/chen77716/article/details/7309915
Zookeeper使用了一种称为Zab(Zookeeper Atomic Broadcast)的协议作为其一致性复制的核心,据其作者说这是一种新发算法,其特点是充分考虑了Yahoo的具体情况:高吞吐量、低延迟、健壮、简单,但不过分要求其扩展性。下面将展示一些该协议的核心内容:
另,本文仅讨论Zookeeper使用的一致性协议而非讨论其源码实现
Zookeeper的实现是有Client、Server构成,Server端提供了一个一致性复制、存储服务,Client端会提供一些具体的语义,比如分布式锁、选举算法、分布式互斥等。从存储内容来说,Server端更多的是存储一些数据的状态,而非数据内容本身,因此Zookeeper可以作为一个小文件系统使用。数据状态的存储量相对不大,完全可以全部加载到内存中,从而极大地消除了通信延迟。
Server可以Crash后重启,考虑到容错性,Server必须“记住”之前的数据状态,因此数据需要持久化,但吞吐量很高时,磁盘的IO便成为系统瓶颈,其解决办法是使用缓存,把随机写变为连续写。
考虑到Zookeeper主要操作数据的状态,为了保证状态的一致性,Zookeeper提出了两个安全属性(Safety Property)
- 全序(Total order):如果消息a在消息b之前发送,则所有Server应该看到相同的结果
- 因果顺序(Causal order):如果消息a在消息b之前发生(a导致了b),并被一起发送,则a始终在b之前被执行。
- 因为只有一个Leader,Leader提交到Follower的请求一定会被接受(没有其他Leader干扰)
- 不需要所有的Follower都响应成功,只要一个多数派即可
2. Leader Election
- 老Leader在COMMIT前Crash(已经提交到本地)
- 老Leader在COMMIT后Crash,但有部分Follower接收到了Commit请求
3. Zab与Paxos
Because multiple leaders can propose a value for a given instance two problems arise. First, proposals can conflict. Paxos uses ballots to detect and resolve conflicting proposals. Second, it is not enough to know that a given instance number has been committed, processes must also be able to figure out which value has been committed.
- 之前的Phase2
- Learn
4.结束
- A simple totally ordered broadcast protocol
- paxos
7、ZooKeeper选举和同步
http://stblog.baidu-tech.com/?p=1164
用于分布式下一致性相关问题的解决方案。可以理解为由集群组成的可靠的单master。可将传统方案中的master使用zookeeper代替,且不用担心单点问题。
应用场景:树状结构的命名服务、节点数据变更的消息通知、分布式共享锁、配置数据的集中存放、集群中节点机器的状态管理及状态变更通知
zookeeper实现分布式锁:通过zookeeper的节点状态进行条件判断,如果不满足,则在客户端本地加锁等待Object.wait()。利用zookeeper的实时通知机制,当zookeeper的节点满足条件状态时,客户端会同步获得通知,然后在本地解锁Object.notifyAll()。从而实现了分布式加锁、阻塞、解锁。
三类角色: leader(处理写请求,单点)、follower(处理客户端请求,参与投票)、observer(不投票,只处理客户端请求)
恢复模式:服务重启或者leader宕机后,通过paxos算法,从follower中重新选出leader,并以leader为准,进行数据同步。此时服务不可用。
paxos选举算法:
1、每次选举,都是针对某个txid(transaction id)进行。
2、每个follower首先广播询问,获取其它所有server的txid、提议value,txid必须相同,value存储到提议列表中
3、follower从提议列表中获取value,如果这个value被大于一半的follower支持,则直接使用此value,否则,继续发出广播询问。并且将此value作为回答其它follower轮训的提议。
4、循环执行3,直到收敛
paxos的精髓:解决了集群中,非全联通情况下的一致性问题。对于正常全联通情况,每台机器只需要广播获取其它各台机器的数据,然后比较获取最大值即可。这样各个节点得到的结论应该是一样的。问题在于,某些节点之间是不联通的。于是某个节点无法获知全局数据,只能通过paxos中循环投票,收敛至全局最优解。
同步流程:选举完成后,各个follower向leader发送同步请求,带上自己的最大zxid。leader通过zxid确定同步点,将这之后的commit log交给follower进行同步。所有节点都保存一份系统状态数据,非强一致(getData不保证最新数据,可以先sync一下保证数据的同步状态),有同步延时。
多节点可读可写,部分节点延时同步,最终一致性。follower和observer负责监听客户请求和处理读请求。对于所有写请求,都一律转发至leader进行选举和数据同步。observer不参与投票,只做数据同步,提高写请求的效率。
转自:http://www.cnblogs.com/lpshou/archive/2013/06/14/3136888.html
相关推荐
分布式服务框架Zookeeper是Apache Hadoop的一个子项目,专门用于管理分布式环境中的数据。它提供了一个高可用、高性能、分布式的命名服务、配置管理以及同步服务,是构建大规模分布式系统的基石。Zookeeper的设计...
分布式服务框架Zookeeper 3.4.13版本是一个关键组件,在现代企业级IT系统中广泛用于构建可靠的分布式服务和管理集群。Zookeeper源于雅虎研究院的一个研究项目,后来成为了Apache软件基金会的顶级项目,其设计目标是...
【分布式服务框架 Zookeeper — 管理分布式环境中的数据】 Zookeeper 是一个高度可靠的分布式服务框架,由 Apache Hadoop 项目开发,旨在解决大型分布式系统中的数据管理问题。它的核心功能包括配置管理、命名服务...
### 分布式服务框架Zookeeper--管理分布式环境中的数据 #### 一、Zookeeper简介 Zookeeper是一款开源的分布式协调服务框架,它主要用于解决分布式应用中常见的一致性问题,如命名服务、配置管理、集群管理和分布式...
Apache ZooKeeper 是一个分布式服务框架,用于管理分布式环境中的数据,常被用作协调服务,例如在分布式计算、配置管理、命名服务等场景。它的设计目标是简单、高效且高可用,通过一致性协议保证数据的一致性。 在...
本文介绍的Zookeeper是以3.2.2这个稳定版本为基础,,Zookeeper的安装非常简单,下面将从单机模式和集群模式两个方面介绍Zookeeper的安装和配置。单机安装非常简单,只要获取到Zookeeper的压缩包并解压到某个目录如...
Zookeeper分布式服务框架是ApacheHadoop的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等等。Zookeeper中的角色主要有...
分布式服务框架是现代大型互联网应用的核心技术之一,它旨在解决单体系统在高并发、海量数据场景下的扩展性问题。《分布式服务框架原理与实践》这本书深入浅出地讲解了分布式服务的基础理论和实际操作,对于想要深入...
ZooKeeper是一种为分布式应用所设计的高可用、高性能且一致的开源协调服务,是Google的Chubby一个开源的实现。提供功能:命名服务配置管理集群管理分布式锁队列管理特性:顺序一致性:从同一个客户端发起的事务请求,...
分布式服务框架是现代大型互联网应用的核心技术之一,它旨在解决单体系统在扩展性、可维护性和高可用性上的挑战。李林锋的《分布式服务框架原理与实践》一书深入探讨了这一主题,提供了丰富的理论知识和实践经验。...
分布式服务框架是现代大型互联网应用的核心技术之一,它旨在解决单体应用在高并发、大数据量、高可用性等场景下的挑战。李林锋的《分布式服务框架原理与实践》一书深入浅出地探讨了这个领域的重要概念、设计模式以及...
C++高性能分布式服务器框架,webserver,websocket server,自定义tcp_server(包含日志模块,配置模块,线程模块,协程模块,协程调度模块,io协程调度模块,hook模块,socket模块,bytearray序列化,http模块,Tcp...
七、ZooKeeper与其他分布式框架的集成 ZooKeeper常被用于Hadoop、HBase、Kafka等大数据处理框架中,作为它们的协调中心,确保服务的稳定性和数据一致性。 总结: ZooKeeper作为分布式系统的核心组件,其强大的协调...
根据给定的信息,书籍的标题为《分布式服务框架原理与实践》,作者为李林锋。本书属于计算机编程类,专注于阐述分布式服务框架的内部原理,并结合实践案例进行讲解。 首先,分布式服务框架是现代大型软件系统开发和...