ZooKeeper简述
一、简介
ZooKeeper是一个高性能,分布式的,开源分布式应用协调服务。它提供了简单原始的功能,分布式应用可以基于它实现更高级的服务,比如同步,集群管理,命名空间,配置维护等。ZooKeeper使用了我们熟悉的文件树状结构作为自己的数据模型,因此是易于使用的。
我们知道,由于资源竞争等因素的影响,维护分布式服务的正常运行是一项极具挑战的事情。图1形象地说明了道路交通中没有信号灯的指挥协调导致出现交通阻塞混乱的情况出现。对于分布式系统来说,如果没有一个协调者的角色对各个分布式应用进行协调,分布式系统同样会出现一团糟的情况。
图1:混乱的交通
ZooKeeper背后的动机则是为了简化分布式应用的开发流程,并提供更加敏捷健壮的方案,以此来协调分布式系统中的各个应用服务。可以使用交通信号灯来形象比喻zk在分布式系统中的作用。
图2:交通信号灯对交通进行协调
二、特点
总体来说,ZooKeeper具有以下的特点。
1. 简单
ZooKeeper使用了类似文件系统的数据模型,即每个节点按照层级的关系组成了ZooKeeper的命名空间。一个ZooKeeper的命名空间示例如下:
图: ZooKeeper的层级命名空间
上图包含了五个节点(在ZooKeeper中称为znode,znode并不等于机器,实际中我们可以用znode表示分布式应用的一个进程),可以用它的路径来表示这些节点,例如/app1,/app1/p_2,等。
znode节点可以包含数据,也可以不包含。如果一个znode包含数据,那么数据被存储为字节数组(byte array)。字节数组的格式取决于我们自己的解析,使用可以使用Protocol Buffers,MessagePack等序列化。
为了操作znode,你仅需要使用以下的API。
- create /path data
创建一个名为/path的znode节点,并包含数据data - delete /path
删除名为/path的znode - exists /path
检查是否否在名为/path的znode - getData /path
返回名为/path的znode的数据 - setData /path data
设置名为/path的znode的数据为data - getChildren /path
返回/path节点下所有子节点列表
2. 多点
图: ZooKeeper服务架构
作为分布式应用的协调者,ZooKeeper要保证自己本身的高可用特性。为了达到这个目的,ZooKeeper跟其他分布式应用一样,被设计成多点的服务,以避免单点故障。客户端连接其中一个ZooKeeper进程,不同的ZooKeeper进程会进行同步的操作。
3. 有序
ZooKeeper使用一个数字来标识一个更新操作,以反映ZooKeeper事务的顺序特性。基于这一特性,ZooKeeper可以实现更新高级的抽象操作,例如同步等。
4. 快速
无论是读写操作,ZooKeeper可以实现快速响应。尤其对于读操作,ZooKeeper可以达到更快的响应速度。
三、保证
ZooKeeper简单且快速响应,它的目的是为构建复杂的分布式应用而服务,例如为分布式系统提供同步管理,集群管理等。为了达到这一目的,ZooKeeper提供以下的保证:
- 顺序一致性
ZooKeeper提供了顺序保障,这意味着同一个会话中的请求会以FIFO(先进先出)顺序执行。通常,一个客户端只打开一个会话,因此客户端请求将全部以FIFO顺序执行。
如果客户端拥有多个并发的会话,FIFO顺序在多个会话之间未必能够保持。而即使同一个客户端中连贯的会话并不重叠,也未必能够保证FIFO顺序。 - 原子性
一个操作或者成功,或者失败,不会出现部分成功的结果 - 单一系统映像
虽然ZooKeeper本身以多点的形式运行,但对于客户端来说,无论连接的是哪个server进程,看到的是同样的视图。 - 可靠性
一旦更新操作被执行,更新的操作就会被持久化,直到被下一次更新覆盖。 - 时效性
客户端看到的系统视图在一定的时间范围内总是最新的。
ZooKeeper简述的更多相关文章
- 【Zookeeper】编程实战之Zookeeper分布式锁实现秒杀
1. Zookeeper简述 我们要了解一样技术,首先应该要到它的官网,因为官网的信息一般都是最准确的,如下图是Zookeeper官网对它的介绍. 从官网的介绍中,可以总结出,Zookeeper是一个 ...
- Hadoop框架基础(五)
** Hadoop框架基础(五) 已经部署了Hadoop的完全分布式集群,我们知道NameNode节点的正常运行对于整个HDFS系统来说非常重要,如果NameNode宕掉了,那么整个HDFS就要整段垮 ...
- Zookeeper中的FastLeaderElection选举算法简述
Zookeeper是一个开源的分布式应用协调项目, 当中为了保证各节点的协同工作,Zookeeper在工作时须要有一个Leader. 而Leader是怎样被选举出来的?Zookeep中使用的缺省算法称 ...
- ZooKeeper的简述
一.简介 ZooKeeper是一个高性能,分布式的,开源分布式应用协调服务.它提供了简单原始的功能,分布式应用可以基于它实现更高级的服务,比如同步,集群管理,命名空间,配置维护等.ZooKeeper使 ...
- Pulsar、ZooKeeper、BookKeeper 作用简述
Pulsar:采取了存储计算分离的技术ZooKeeper 集群的作用和在 Kafka 中是一样的,都是被用来存储元数据.BookKeeper 集群则被用来存储消息数据.BookKeeper 有点儿类似 ...
- 简述 zookeeper 基于 Zab 协议实现选主及事务提交
Zab 协议:zookeeper 基于 Paxos 协议的改进协议 zookeeper atomic broadcast 原子广播协议. zookeeper 基于 Zab 协议实现选主及事务提交. 一 ...
- 基于ZooKeeper的Dubbo注册中心
SOA服务治理 dubbo_zk 服务总线 感兴趣的M我微信:wonter 微信扫描,人人 CTO 大本营 基于SOA架构的TDD测试驱动开发模式 服务治理要先于SOA 简述我的SOA服务治理 从页面 ...
- 理解zookeeper选举机制
*:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...
- HDFS 架构简述
HDFS 架构简述 Hadoop分布式文件系统(HDFS)是一个分布式的文件系统,运行在廉价的硬件上.它与现有的分布式文件系统有很多相似之处.然而与其他的分布式文件系统的差异也是显着的.HDFS是高容 ...
随机推荐
- Windows / VS下不同类型变量转换
[时间:2016-07] [状态:Open] [关键词:windows,vs,mfc,类型转换] 在实际编码中经常遇到不同类型及编码方式的字符串.变量之间的转换,比如Unicode->char. ...
- Linux中查看GNOME版本号
在使用图形终端时,可以在虚拟终端中直接输入gnome-about,会弹出如下窗口. 或者在纯命令行模式下使用下面命令: $ gnome-about --gnome-version 注:Gnome 3. ...
- cf 366C C. Dima and Salad(01背包)
http://codeforces.com/contest/366/problem/C 题意:给出n个水果的两种属性a属性和b属性,然后挑选苹果,选择的苹果必须要满足这样一个条件:,现在给出n,k,要 ...
- Windows-DB2 9.7安装图解
解压后,双击 setup.exe 安装 打开后,选择"安装产品" 在安装产品中,选择"安装新产品" 点击下一步 同意软件许可协议,点击下一步 可以根据需要,选择 ...
- 【Unity】JsonUtility解析集合(collections)类型(List)
Unity自带的Json解析工具类JsonUtility居然没有API用于解析集合类型,也太鬼扯了吧. https://stackoverflow.com/questions/36239705/ser ...
- Mask R-CNN详解和安装
Detectron是Facebook的物体检测平台,今天宣布开源,它基于Caffe2,用Python写成,这次开放的代码中就包含了Mask R-CNN的实现. 除此之外,Detectron还包含了IC ...
- SQLServer2005重建索引前后对比【转】
在做维护项目的时,我们经常会遇到索引维护的问题,通过语句,我们就可以判断某个表的索引是否需要重建. 执行一下语句:先分析表的索引 分析表的索引建立情况:DBCC showcontig('Table') ...
- c#获取网页代码、数据、资源
//WebClient取网页源码 private string GetHtmlSource(string Url) { try { System.Net.WebClient wc = new Syst ...
- Android progressbar条形带背景渐变进度风格进度条
效果图: 代码如下: <ProgressBar android:id="@+id/progressBar" style="?android:attr/progres ...
- Python 类的多态的运用
#类的多态的运用 #汽车类 class Car(object): def move(self): print("move ...") #汽车商店类 class CarStore(o ...