文档章节

zookeepr--概览

w
 wannshan
发布于 2016/01/22 15:23
字数 2480
阅读 37
收藏 2

zk 一个分布式应用协调服务

zk是一个分布式,开源的,分布式协调服务,他提供了一组简单的原生接口,分布式应用可以基于它实现,高水准的同步,集群,配置管理和命名服务。它基于开发,使用简单的原则而设计。使用类似于文件系统目录树结构的数据模型。它基于java实现,可以为c和java应用服务。

协调是个臭名昭著的活儿。很容易产生资源竞争和死锁的问题。zk的实现动机就是缓解分布式应用在解决彼此斜体问题而产生的抓狂行为。

zk的设计目标

zk 是个简单的玩意儿。zk通过分布式的处理流程来协调应用彼此,它是使用的是一种类似文件系统的分层名字空间。这些名字空间里,包含了数据的注册者,用zk的叫法,称之为znodes.它类似于文件和目录。不像传统的文件系统,是用来存储的,zk的数据都在内存中,所以意味着,zk的高吞吐量和底延时。zk 实现了一个优质的,高新能,高可用,严格访问顺序的服务。从zk的表现来看,它完全可以使用,大型,分布式系统。在可用上,也使它不会碰到单点故障的问题,严格的顺序性,也意味着可以在客户单实现非常复杂的同步操作。

zk 是可复制的。像它协调的应用一样,zk自身也复制到一系列主机上。他们是一个整体。如图 zk server

所有组成zk server的 severs 必须彼此能感知对方。他们在内存里维护一个所有机器的状态图,在磁盘里保存有实务日志和快照。只要大多数服务器可用。zk服务就可用。

客户端连接到单一的服务器,通过tcp协议,发送请求,获得反馈,获得监听事件,发送心跳包。如果连接的服务器挂掉,客户端会连接其他的服务机器。

zk 是顺序的。zk的每次更新都会用一个数字做标签,这个数字,代表了全部的zk事务顺序,接下来的操作用这个顺序来实现高水平的抽象,比如同步操作。

zk 是快速的。zk 在读为主的操作中,显得特别的快。zk 运行在上千台机器上,当读操作为主的请求中,表现会更好。读写比为10:1。

数据模型和命名层次

zk 提供的命名空间像一个标准的文件系统。一个名字,就是它的路径以(/)分隔的组合,在zk中每个节点,都已路径来唯一标识。zk的层次命名结构如图


Nodes 和短命的nodes

不像传统的文件系统,在zk里每个node和它的孩子node,都有数据和他们关联。他们像个这样一个文件系统,即每个文件也是目录。(zk节点里存储的数据,包括状态信息,配置,本地信息等,所以数据量都不大通常只有几字节或者几千字节),为了说清楚zk node.我们把它称作znode,znode 维护这一个数据结构,包括状态更改的版本号,acl 更改的信息和时间戳去用和套东西区验证和协调的更新。如果以个node的数据发生变化,它的版本号也会变化。比如一个客户端读取一个node数据,也会得到它的版本号。存储在node里的数据读写都是原子的。读会读所有关联的数据,写也会替换所有的数据,不会半途而废。每个节点都有个访问控制列表(acl),严格限制谁能干什么!

zk里还有个短命node的概念。这些node和创建这个节点的session生命一样长。当这个session关闭时,这个node也就自动删除了。短命node在你开发实现 【tbd】是很重要。

有条件的更新和监控

 zk 支持监控的概念客户端可以对一个节点进行监控当这个节点发生变化时,监控被触发同时被删除,当监控被触发,客户端收到一个数据更改的数据包。还有当客户端和服务端连接断开,客户端也会收到一个通知。这个在【tbd】中很有用。

保证

zk 简单快速,就像他的开始的目标一样,是构造复杂系统的基础,比如,同步系统。实际上它有一下保证:

时序一致性:更新操作会以客户端发送的顺序被执行。

原子性:更新要么失败,要么成功没有部分成功的状态。

状态图统一:一个客户端无论它连接到哪个机器,所有机器图谱一致。

可靠性:一个更新被应用,就会一直有效,直到有新的数据覆盖。

时间线:客户端某个时间段内看到的系统状态图,保证是最新的。

更多这些方面的应用,可以参看【tbd】

简单的api

zk设计之初就是提供简单的程序接口,所以,它仅仅支持一下操作:

create :在节点树上,创建一个节点

delete:删除一个节点

exists:检查一个节点是否存在

get data:从一个节点获取数据

set data:向一个节点写数据

get children:获取一个节点的孩子节点

sync:等待数据传播同步

关于这方面的更深的技术讨论,和在构建高水平应用方面的实践,可以参考【tbd】

技术实现

下面是zk 服务组件图,处理请求处理器外,每个zk组件都有复制的多份。


每个机器上的内存数据库,都包含整个数据,更新日志记录到磁盘,写操作被序列化到磁盘在它扩散同步到其他内存数据库之前。

每个zk 主机都对外提供服务,客户端连接某一个主机请求服务。读的服务从客户连接的机器本身内存里获取,写服务和改变服务状态的请求通过一个一致的协议处理。

这个一致的协议要求,所有写请求都统一发送到一个叫leader的主机。剩下的被称作followers的zk主机,通过leader 接收数据消息,消息层负责leaders的失败替换和leaders和followers之间的同步。

zk使用的是原子性的消息协议,因为消息是原子性的,所以能保证本地的信息与其他主机信息是一致没有分歧的。当leader收到一个写请求后,它会评估服务器状态,决定什么时候写,然后启动写事务,最后获取服务请的新状态。

应用

zk的使用接口尤其的简单,你可以通过他实现,顺序操作,比如同步,群组管理等,许多分布式应有使用它,想了解更多,关注【tbd】。

表现

zk被设计成高可用,是不是这样呢?在yahoo的开发组的调查说明了它是的。当读远大于写操作的时候,它表现的尤其的高性能,因为写操作要同步所有的服务器状态。(读远大于写是经典的协调服务案例),下图是zk读写比率变化的测试结果图表


这个图表的测试数据是,3.2版本的zk 运行在双核2Ghz Xeon处理器和两个15k转速的sata设备上的测试数据,一个磁盘专门做zk日志,一个写写数据快照,读写操作都是1k大小,servers 表示zk服务,组成主机数目,接近30个其他主机模拟客户机,zk服务被配置成,leader不允许从客户端连接。另外说明下,3.2读写性能是3.1版本的两倍。

测试结果也说明了zk的可靠性,下图显示了在各种错误下服务器的表现,这些错误包含以下几种:

1,follower 机器的当掉和恢复。

2,另外一个follower的当掉和恢复。

3,leader的当掉。

4,两个follower同时当掉。

5,另外一个leader的当掉。

可用性

这个图里显示了,我们有7个主机组成的zk服务器,在一段时间内我们注入错误的系统表现。这次测试我们和以前跑同样的访问饱和度,有一点们把写的比率维持在30%,这也是我们比较保守负载比例。


从张图里,可以看出一下重要的几点,当followers 挂掉并很快恢复是,zk能保持很高的吞吐量。更重要是,leader选举算法能让系统很快恢复,以保持它的高吞吐量。可以看到zk花了不到200ms选举新的leader.第三点,当follower恢复处理能力是,zk的吞吐量又开始维持在高水平。


zookeepr 项目

zk 已经成功的在多个工业系统中应用。比如在yahoo.它负责协调yahoo的失败恢复。上千个主题订阅高扩展的信使服务,和数据传输。yahoo的获取服务,crawler,也负责它的失败恢复协调。作为yahoo的一员,广告也是通过zk实现高可用性。

zk 社区欢迎所用的用户和开发者讨论和贡献他们的技能。参看 zookeeper.apahce.org






© 著作权归作者所有

w
粉丝 22
博文 42
码字总数 79122
作品 0
浦东
技术主管
私信 提问
软件安装及配置(定时更新)

zookeeper http://www.cnblogs.com/shanyou/p/3221990.html zookeepr客户端 eclipse插件 http://www.tuicool.com/articles/bQj2E3 window apache模块开发 http://www.metsky.com/archives/1......

dragoncai
2016/03/30
17
0
zookeeper集群安装与配置

1、解压zookeeper 2、在$ZOOKEEPERHOME/conf下创建zoo.cfg文件(参考配置文件:zoosample.cfg),内容为: # CS通信心跳时间,Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,...

datapro
2015/06/09
1K
0
iNexus 0.1 发布,基于 Raft 的分布式协调组件

iNexus 0.1 发布,更新内容如下: v0.1 功能列表: 基本的Get,Put,Scan,Delete Watch(注册变更通知),Lock(分布式抢锁) 高可用:集群选主、数据一致性复制 过期日志整理、数据压缩 C++客户端...

fxsjy
2015/08/19
1K
6
ZooKeeper 可视化监控 zkui

概述 一、简介zkui它提供了一个管理界面,可以针对zookeepr的节点值进行CRUD操作,同时也提供了安全认证。 二、下载安装 1、下载地址 https://github.com/DeemOpen/zkui 2、mvn clean insta...

PengLei
2017/10/17
0
0
solrcloud数据导入,只能插入一个shard

我搭建了solrcloud环境,solr版本是4.9.1 创建了一个collection,采用手工创建shard和replica,3个shard和3个replica,但建索引的时候却发现数据只插入1个shard,另外两个shard无数据; 后来我...

锋_行者
2015/02/10
638
0

没有更多内容

加载失败,请刷新页面

加载更多

CSS--属性

一、溢出 当内容多,元素区域小的时候,就会产生溢出效果,默认是纵向溢出 横向溢出:在内容和容器之间再套一层容器,并且内部容器要比外部容器宽 属性:overflow/overflow-x/overflow-y 取值...

wytao1995
45分钟前
4
0
Confluence 6.15 使用附件宏

希望添加附件宏到一个页面中: 从编辑工具栏中,选择 插入(Insert) > 其他宏(Other Macros) 找到并且选择需要的宏。 可用使用自动完成加快这个过程:输入 { 然后开始输入你希望插入的宏的...

honeymoose
今天
4
0
精华帖

第一章 jQuery简介 jQuery是一个JavaScript库 jQuery具备简洁的语法和跨平台的兼容性 简化了JavaScript的操作。 在页面中引入jQuery jQuery是一个JavaScript脚本库,不需要特别的安装,只需要...

流川偑
今天
6
0
语音对话英语翻译在线翻译成中文哪个方法好用

想要进行将中文翻译成英文,或者将英文翻译成中文的操作,其实有一个非常简单的工具就能够帮助完成将语音进行翻译转换的软件。 在应用市场或者百度手机助手等各大应用渠道里面就能够找到一款...

401恶户
今天
3
0
jenkins 插件下载加速最终方案

推荐做法 1、告诉jenkins 我哪些插件需要更新 jenkins插件清华大学镜像地址 https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json 1.进入jenkins系统管理 2.进入插件管...

vasks
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部