分布式锁服务ZooKeeper

zookeeper概述

针对分布式应用的分布式协作服务,zookeeper的开发动机就是为了减轻分布式应用从头开发协作服务的负担。

设计目标

简单。 允许多个分布的进程基于一个共享的,类似标准文件系统的树状名称空间进行协作。每个节点称作一个znode。

ZooKeeper is replicated

几个zookeeper集群包含多个zookeeper server, 称作一个ensemble。 这些server彼此都知道对方的存在。

需要维护的数据: 内存中的状态的镜像, 持久化存储中的事务日志和快照。

client和单个zookeeper server通信。client维护一个持久TCP连接,通过其发送请求, 获取响应和watch events,并发送心跳信息,如果到server的TCP连接中断, client将会连接到另外一个server。

ZooKeeper is ordered

zookeeper对每次更新进行一个计数器stamp以反映所有zookeeper事务的次序。后续的操作能够使用此次序来实现高级抽象,如同步原语。

ZooKeeper is fast

zookeeper在read操作上是非常快的。通常的应用中,读写操作比也在10:1左右。

数据模型和层级名称空间

节点和临时节点

有别于标准文件系统的是,zookeeper名称空间中的每个节点都可以关联数据到它本身或者它的子节点。就好比标准文件系统中的文件同时又可以充当目录。(zookeeper用于存储协作数据: 状态信息, 配置, 位置信息等, 所以存放在每个node的数据通常都比较小,一般在K级别)。我们以znode来描述zookeeper中的数据节点。

znodes维护一个stat结构,其中包括数据变更, 权限变更的版本信息,还有时间戳,以便于缓存有效性验证和协作更新。每当znode的数据变更时,版本号都会递增。例如, 每次client在获取数据时,它同时也获得了数据的版本信息。

存储在znode中的数据对read, write都是原子性操作的。read会获取znode中的所有字节, write会整个替换znode中的信息。每个znode都包含一个访问控制列表(ACL)以约束谁可以访问此节点。

zookeeper还有一个临时节点的概念。临时节点在创建它的session的生命周期内存活, 当其session终止时,此类节点将会被删除。临时节点在我们需要实现[tbd]时非常有用。

条件更新和监听器(watches)

zookeeper提供监听器的概念。 client可以在某个znode上设置watch。 当znode有变更时, 相关的watch会被触发或删除。一旦watch触发, client将会收到一个数据包以通知znode的变更。如果在client和zookeeper server之间的连接被中断了, client将会收到一个本地的通知。这些都能被用于[tbd]。

Guarantees

zookeeper在使用上非常简单高效。因为它的设计目标,是作为构建复杂服务类型,如同步, zookeeper提供的保证包括:

序列一致性: 数据更新会依照client发送的次序来进行。

原子性: 更新要么成功,要么失败。不存在部分结果。

唯一系统镜像: client总是会看到一致的视图,而不管它是连接到具体哪个zookeeper server。

可靠性: 一旦更新完成, 它会持续保存直到有另外的client重写。

及时: 客户端视图会在一定的时间间隔内进行更新。

Simple API

zookeeper的一个重要设计目标就是要提供简单的编程接口。所以,它仅仅提供如下操作:

create:在树种某个位置创建一个节点。

delete:删除一个节点。

exists:检查给定节点是否存在。

get data: 从一个节点读取数据。

set data: 写数据到给定节点。

get children: 获取节点的子节点列表

sync: 等待知道数据被传输。

实现

如下展示了zookeeper服务的高层组件。

除了request processor, 组成zookeeper服务的每个server都会在本地备份其它组件的拷贝。

replicated database是一个包含整个数据树的内存数据库。更新被logged到磁盘以提供可恢复性,写操作先持久化到磁盘,然后再对内存数据库作变更。

每个zookeeper server都对client提供服务。client连接到具体的某一个server以提交请求。读操作依赖与每个server的本地数据库。改变服务状态的请求,写操作,由一致性协议来处理。

作为一致性协议的一部分,所有的client写请求被提交到专门的一个leader server。 其余的server,被称为followers,从leader接收消息,并对消息的传递达成一致。

消息层负责替换失效leader并同步followers。

zookeeper使用自定义的原子消息传递协议。因为消息传递层是原子性的,zookeeper能够确保本地备份不会出现分歧。

使用

zookeeper的编程接口特意做的非常简单。在此之上,你可以实现更高层次的操作, 如同步原语, 组管理, 所有权等等。

性能

zookeeper被设计用于高性能场景。

可靠性

下图的benchmarks同时也表明zookeeper是可靠的。 Reliability in the Presence of Errors展示了一个zookeeper部署如何应对各种失效。 在图中标示的事件定义如下:

1.follower的失效和恢复。

2. 不同的follower失效和恢复。

3. leader的失效。

4.两个follower同时失效和恢复。

5. 另一个leader失效。

这张图中有一些重要的观测值。首先,如果followers失效并快速恢复,zookeeper可以持续保持高吞吐而不受影响;最重要的是,leader推举算法允许系统快速恢复以防止吞吐大幅度下降。在我们的观测中,zookeeper只花费不到200ms来推举一个新的leader;第三点,当follower恢复并开始处理请求时,zookeeper的吞吐也会回升。

zookeeper已经在很多工业级项目中被成功运用。在Yahoo!, 它被用于Yahoo! Message Broker以提供协作和失效恢复服务, Yahoo! MessageBroker是一个高效的发布/订阅系统,其管理着用于备份和数据迁移的主题。 zookeeper还被用于Yahoo!爬虫的抓取服务,在此它同样提供了失效恢复机制。许多Yahoo!的广告系统也使用zookeeper来提供可靠服务。

更多精彩内容请关注:http://bbs.superwu.cn

关注超人学院微信二维码:

时间: 2024-10-11 06:34:49

分布式锁服务ZooKeeper的相关文章

[转载] zookeeper 分布式锁服务

转载自http://www.cnblogs.com/shanyou/archive/2012/09/22/2697818.html 分布式锁服务在大家的项目中或许用的不多,因为大家都把排他放在数据库那一层来挡.当大量的行锁.表锁.事务充斥着数据库的时候.一般web应用很多的瓶颈都在数据库上,这里给大家介绍的是减轻数据库锁负担的一种方案,使用zookeeper分布式锁服务. zookeeper是hadoop下面的一个子项目, 用来协调跟hadoop相关的一些分布式的框架, 如hadoop, hiv

知识链-分布式协调服务zookeeper

分布式协调服务 Zookeeper zookeeper是一个开源的分布式协调服务.是典型的分布式数据一致性的解决方案. 集群内所有server基于Zab(ZooKeeper Atomic Broadcast)协议进行通信 Zookeeper官网地址: http://zookeeper.apache.org/ Zookeeper官网文档地址:http://zookeeper.apache.org/doc/trunk/index.html 认识ZooKeeper ZooKeeper概述 ZooKee

搞懂分布式技术3:初探分布式协调服务zookeeper

搞懂分布式技术3:初探分布式协调服务zookeeper 1.Zookeepr是什么 Zookeeper是一个典型的分布式数据一致性的解决方案,分布式应用程序可以基于它实现诸如数据发布/订阅,负载均衡,命名服务,分布式协调/通知.集群管理,Master选举,分布式锁和分布式队列等功能. 2.zookeeper可以保证的分布式一致性 a.顺序一致性 从一个客户端发起的事务请求,最终将会严格地按照其发起顺序被应用到zookeeper中去 b.原子性 所有事务请求的处理结果在整个集群中所有机器上的应用情

分布式锁服务Chubby之paxos算法

分布式锁服务Chubby之paxos算法 在分布式系统设计领域,Paxos可谓是最重要一致性的算法.Google的大牛们称 All working protocols for asynchronous consensus we have so far encountered have Paxos at their core. 可见此算法的地位.网络上讨论此算法的文章多如牛毛,但大多数让人看了之后仍然是一头雾水,就连维基百科中,对此算法的描述亦有含糊和错误之处.但实际上,此算法的核心思想还是比较简

解读Google分布式锁服务

背景介绍 在2010年4月,Google的网页索引更新实现了实时更新,在今年的OSDI大会上,Google首次公布了有关这一技术的论文. 在此之前,Google的索引更新,采用的的批处理的方式(map/reduce),也就是当增量数据达到一定规模之后,把增量数据和全量索引库Join,得到最新的索引数据.采用新的索引更新系统之后,数据的生命周期缩短了50%,所谓的数据生命周期是指,数据从网页上爬下来,到展现在搜索结果中这段时间间隔,但是正如Google所强调的,这一系统仅仅是为增量更新所建立的,并

Redis实现分布式锁与Zookeeper实现分布式锁区别

Redis实现分布式锁与Zookeeper实现分布式锁区别 **前言: 在学习过程中,简单的整理了一些redis跟zookeeper实现分布式锁的区别,有需要改正跟补充的地方,希望各位大佬及时指出**Redis实现分布式锁思路 基于Redis实现分布式锁(setnx)setnx也可以存入key,如果存入key成功返回1,如果存入的key已经存在了,返回0. Zookeeper实现分布式锁思路 基于Zookeeper实现分布式锁 Zookeeper是一个分布式协调工具,在分布式解决方案中. 多个客

Zookeeper实现分布式锁服务(Chubby)

在分布式系统中,如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源,那么访问这些资源的时候,往往需要互斥来防止彼此干扰,来保证一致性,在这种情况下,便需要使用到分布式锁 例如有N台服务器同时要对某个文件进行修改,如何才能保证文本不会被写乱,这就是一个简单的分布式锁应用场景 使用zookeeper就可以轻松实现分布式锁 思路 前期准备 在zookeeper中创建一个根节点(Locks),用于后续各个客户端的锁操作 获取锁的过程 想要获取锁的client都在Locks中创建一个自增序的子

Redis分布式锁服务(转)

原文:http://www.cnblogs.com/mushroom/p/4752499.html 概述 在多线程环境下,通常会使用锁来保证有且只有一个线程来操作共享资源.比如: object obj = new object(); lock (obj) { //操作共享资源 } 利用操作系统提供的锁机制,可以确保多线程或多进程下的并发唯一操作.但如果在多机环境下就不能满足了,当A,B两台机器同时操作C机器的共享资源时,就需要第三方的锁机制来保证在分布式环境下的资源协调,也称分布式锁. Redi

Redis分布式锁服务(八)

阅读目录: 概述 分布式锁 多实例分布式锁 总结 概述 在多线程环境下,通常会使用锁来保证有且只有一个线程来操作共享资源.比如: object obj = new object(); lock (obj) { //操作共享资源 } 利用操作系统提供的锁机制,可以确保多线程或多进程下的并发唯一操作.但如果在多机环境下就不能满足了,当A,B两台机器同时操作C机器的共享资源时,就需要第三方的锁机制来保证在分布式环境下的资源协调,也称分布式锁. Redis有三个最基本属性来保证分布式锁的有效实现: 安全