一、简介

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进程,看到的是同样的视图。
  • 可靠性 
    一旦更新操作被执行,更新的操作就会被持久化,直到被下一次更新覆盖。
  • 时效性 
    客户端看到的系统视图在一定的时间范围内总是最新的。

参考资料

    1. https://zookeeper.apache.org/doc/trunk/zookeeperOver.html
    2. 《ZooKeeper分布式过程协同技术详解》,Flavio Junqueira等著,谢超等译

ZooKeeper的简述的更多相关文章

  1. Hadoop框架基础(五)

    ** Hadoop框架基础(五) 已经部署了Hadoop的完全分布式集群,我们知道NameNode节点的正常运行对于整个HDFS系统来说非常重要,如果NameNode宕掉了,那么整个HDFS就要整段垮 ...

  2. ZooKeeper简述

    一.简介 ZooKeeper是一个高性能,分布式的,开源分布式应用协调服务.它提供了简单原始的功能,分布式应用可以基于它实现更高级的服务,比如同步,集群管理,命名空间,配置维护等.ZooKeeper使 ...

  3. Zookeeper中的FastLeaderElection选举算法简述

    Zookeeper是一个开源的分布式应用协调项目, 当中为了保证各节点的协同工作,Zookeeper在工作时须要有一个Leader. 而Leader是怎样被选举出来的?Zookeep中使用的缺省算法称 ...

  4. Pulsar、ZooKeeper、BookKeeper 作用简述

    Pulsar:采取了存储计算分离的技术ZooKeeper 集群的作用和在 Kafka 中是一样的,都是被用来存储元数据.BookKeeper 集群则被用来存储消息数据.BookKeeper 有点儿类似 ...

  5. 简述 zookeeper 基于 Zab 协议实现选主及事务提交

    Zab 协议:zookeeper 基于 Paxos 协议的改进协议 zookeeper atomic broadcast 原子广播协议. zookeeper 基于 Zab 协议实现选主及事务提交. 一 ...

  6. 基于ZooKeeper的Dubbo注册中心

    SOA服务治理 dubbo_zk 服务总线 感兴趣的M我微信:wonter 微信扫描,人人 CTO 大本营 基于SOA架构的TDD测试驱动开发模式 服务治理要先于SOA 简述我的SOA服务治理 从页面 ...

  7. 理解zookeeper选举机制

    *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...

  8. HDFS 架构简述

    HDFS 架构简述 Hadoop分布式文件系统(HDFS)是一个分布式的文件系统,运行在廉价的硬件上.它与现有的分布式文件系统有很多相似之处.然而与其他的分布式文件系统的差异也是显着的.HDFS是高容 ...

  9. HyperLedger Fabric基于zookeeper和kafka集群配置解析

    简述 在搭建HyperLedger Fabric环境的过程中,我们会用到一个configtx.yaml文件(可参考Hyperledger Fabric 1.0 从零开始(八)--Fabric多节点集群 ...

随机推荐

  1. ASP.NET数据库连接类(SqlDBHelper)

    第一步:创建一个名为SqlDBHelper的类,用来作为联通数据库和系统之间的桥梁. 第二步:引入命名空间,如果System.Configuration.System.Transcations这两个命 ...

  2. linux 下vim 开发环境配置(通用所有编程语言)

    1.下载 http://www.iterm2.com/ 2.oh-my-zsh curl -L https://raw.github.com/robbyrussell/oh-my-zsh/master ...

  3. winfrom---Window 消息大全

    最近正在捣腾winfrom,遇到了关于window消息这一块的东西,正好在网上看到“微wx笑”的总结. 原文地址:http://blog.csdn.net/testcs_dn/article/deta ...

  4. Flutter-动画-原理篇

    一.动画关键类的源码分析 1.Animation Animation没有做什么与动画有关的事情,它只是记录了动画的“状态”.当前的“值”和一些注册回调接口的方法. abstract class Ani ...

  5. 币种大写算法(js)

    注意事项:小数精度处理问题,n*10出现精度误差,如1.88*10计算得18.799999999999997,实际想要的数据是18.8: 思路一:小数变成整数(通过字符串处理),计算后,变成小数: 思 ...

  6. Html5+Css3小试牛刀

    前因: 我开始做个收款系统,突然客户跑来要插进一个任务,据说他们老板挺在意的,一个小商场,一个首页,一个详情页,UI无自由发挥,要求,尽量好看点. 一番交谈后,确认这是一个对外的网站,最好移动端也能正 ...

  7. U盘被识别但不显示盘符怎么样才能解决?

    很多朋友在将U盘插入电脑后,会发现右下角的任务栏虽然出现了U盘的图标,但是在我的电脑中并没有显示出U盘的盘符,也就无法继续对U盘进行操作.遇到这种情况该怎么办呢?下面好系统U盘启动就告诉大家相应的解决 ...

  8. C++第三次作业--作用域

    作用域 任何一种语言最基本的部分就是变量,而变量有两个非常重要的特性,作用域和生存期. 定义 作用域是变量的一个属性,某个变量在代码中有效的区域为该变量的作用域. 函数原型作用域 函数声明参数从参数声 ...

  9. kotlin字符串和数字之间的转换和人机交互

    继续基础学习~ 字符串和数字之间的转换 那如何转换呢,其实很简单: 编译木有报错,但是运行: 所以这里了解下. 人机交互 看这标题貌似高端的,其实也就是程序可以接受键盘的输入啦,下面开始: 首先提示用 ...

  10. netty-3.客户端与服务端通信

    (原) 第三篇,客户端与服务端通信 以下例子逻辑: 如果客户端连上服务端,服务端控制台就显示,XXX个客户端地址连接上线. 第一个客户端连接成功后,客户端控制台不显示信息,再有其它客户端再连接上线,则 ...