以后几节中主要介绍以下内容:

  • 如何执行领导者选举,组员管理和两阶段提交协议等常见的分布式系统任务
  • 如何实现一些分布式数据结构,如屏障(barrier),锁(lock)和队列(queue)

这一章中概述的高层次构建也被称为『ZooKeeper recipes』。这些都是在客户端使用ZooKeeper的编程模型实现的,并且不需要从服务器端获得特别的支持。在没有ZooKeeper和它的API的情况下,这些recipes的实现将会是相当复杂和困难的。

一些第三方和社区开发的ZooKeeper客户端绑定也提供这些高级分布式系统的构建作为其客户端类库的一部分。 例如,Netflix Curator是ZooKeeper的一个功能丰富的Java客户端框架。

ZooKeeper发行版本中附带了领导选举和分发锁和队列的recipes,这些可以在分布式应用程序中使用。 这三个recipes的Java实现可以在发行版的recipes目录中找到。

ZooKeeper recipes

在本节中学习使用ZooKeeper来开发高级分布式系统构建和数据结构。正如前面提到的,这些构建和方法在建立可伸缩的分布式体系结构中是非常重要的,但是从头开始实现它们是相当复杂的。开发人员常常会在实现这些和集成他们的应用程序逻辑时陷入困境。在本节中,将学习如何使用ZooKeeper的数据模型和原语构建一些高级功能,并了解管理员如何使其简单、可伸缩和没有错误,而且代码量更少。

1. Barrier

Barrier是分布式系统中使用的一种同步方法,用于阻塞一组节点的处理,直到满足条件。它定义了一个点,所有节点必须停止它们的处理,直到所有其他节点到达这个Barrier时才进行处理。

使用ZooKeeper实现屏障的Barrier如下:

  1. 首先,将znode指定为屏障znode,例如/zk_barrier
  2. 如果这个屏障znode存在,则说屏障在系统中是活跃的。
  3. 每个客户端通过在屏障 znode上注册监视事件(监视事件设置为true),在/zk_barrier上调用ZooKeeper API的exists()方法。
  4. 如果exists()方法返回false,则说明屏障不再存在,客户端继续运算。
  5. 否则,如果exists方法返回true,则客户端等待监视事件。
  6. 当屏障条件满足退出时,负责屏障的客户端将删除/zk_barrier
  7. 删除触发监视事件,并且在获取此通知时,客户端再次调用/zk_barrier上的exists()方法。
  8. 步骤7返回true,客户端可以继续进行。

Note
屏障一直存在,直到屏障znode终止存在!

通过这种方式,我们可以不费力地使用ZooKeeper来实现一个屏障。

到目前为止所举的例子是一个简单的屏障,它可以阻止一组分布式进程在某些条件下等待,然后在条件满足时进行处理。还有另一种类型的障碍有助于同步计算的开始和结束;这就是所谓的双重屏障。双重屏障的逻辑表明,当需要的进程数量加入屏障时,计算就开始了。在完成计算后,进程会离开,当参与屏障的进程数变为0时,计算就会结束。

双重屏障的算法是通过具有屏障znode来实现的,该屏障znode的作用是作为参与计算的个体过程znode的父节点。 其算法概述如下:

阶段1:加入屏障znode的方式如下:

  1. 假设屏障znode由znode/barrier表示。 每个客户端进程通过创建一个以/barrier作为父节点的ephemeral znode来注册。 在真实情况下,客户端可能使用主机名进行注册。
  2. 客户端进程为在/barrier节点下的另一个存在的'ready`节点设置监视事件,等待节点的出现。
  3. 数字N是在系统中预定义的; 这是在开始计算之前管理加入屏障的最小数量的客户端。
  4. 在加入屏障时,每个客户端进程查找/barrier的子节点数量:M = getChildren(/barrier, watch=false)
  5. 如果M小于N,则客户端等待步骤3中注册的监视事件。
  6. 否则,如果M等于N,则客户端进程在/barrier下创建ready znode。
  7. 5步中创建的ready节点会触发监视事件,每个客户端都会启动他们到目前为止所做的计算。

阶段2:离开屏障的方式如下:

  1. 在完成计算的过程中,客户端进程删除了在/barrier下创建的znode(在第1阶段的第2步:加入屏障)。
  2. 客户进程接着查找/barrier 节点的子节点数量:M = getChildren(/barrier, watch=True)

如果M不等于0,则该客户端等待通知(注意,在前面的调用中,已将监视事件设置为True)。
如果M等于0,则客户端退出屏障znode。

前面的程序有一种潜在的羊群效应,当触发通知时,所有的客户端进程都将唤醒以检查在barrier中留下的子节点的数量。为了避免这种情况,我们可以使用在第1阶段第2步中创建的sequential ephemeral znode加入barrier。每一个客户端进程都要注意它的下一个最短的sequential ephemeral的znode作为退出标准。这样,为任何完成计算的客户端只生成一个事件,因此,并不是所有的客户端都需要一起醒来检查它的退出条件。对于大量参与到一个barrier中的客户端进程,羊群效应会对ZooKeeper服务的可伸缩性产生负面影响,开发人员应该意识到这种情况。

Note
双重屏障的Java语言实现可以在http://zookeeper.apache.org/doc/r3.4.6/zookeeperTutorial.html的ZooKeeper文档中找到。

17. ZooKeeper常见的分布式系统任务——屏障的更多相关文章

  1. Zookeeper+Kafka完全分布式实战部署

    Zookeeper+Kafka完全分布式实战部署 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 其实我之前部署过kafak和zookeeper的完全分布式,集群是可以正常使用没错, ...

  2. 基于Zookeeper实现的分布式互斥锁 - InterProcessMutex

    Curator是ZooKeeper的一个客户端框架,其中封装了分布式互斥锁的实现,最为常用的是InterProcessMutex,本文将对其进行代码剖析 简介 InterProcessMutex基于Z ...

  3. 基于zookeeper实现的分布式锁

    基于zookeeper实现的分布式锁 2011-01-27 • 技术 • 7 条评论 • jiacheo •14,941 阅读 A distributed lock base on zookeeper ...

  4. Hadoop概念学习系列之常见的分布式文件系统(二十六)

    常见的分布式文件系统有,GFS.HDFS.Lustre .Ceph .GridFS .mogileFS.TFS.FastDFS等.各自适用于不同的领域.它们都不是系统级的分布式文件系统,而是应用级的分 ...

  5. Mesos+Zookeeper+Marathon+Docker分布式集群管理最佳实践

    参考赵班长的unixhot以及马亮blog 笔者QQ:572891887 Linux架构交流群:471443208 1.1Mesos简介 Mesos是Apache下的开源分布式资源管理框架,它被称为分 ...

  6. 分布式服务:Dubbo+Zookeeper+Proxy+Restful 分布式架构

    分布式 分布式服务:Dubbo+Zookeeper+Proxy+Restful 分布式消息中间件:KafKa+Flume+Zookeeper 分布式缓存:Redis    分布式文件:FastDFS ...

  7. Python 基于Python及zookeeper实现简单分布式任务调度系统设计思路及核心代码实现

    基于Python及zookeeper实现简单分布式任务调度系统设计思路及核心代码实现   by:授客 QQ:1033553122 测试环境 功能需求 实现思路 代码实践(关键技术点实现) 代码模块组织 ...

  8. Zookeeper使用实例——分布式共享锁

    前一讲中我们知道,Zookeeper通过维护一个分布式目录数据结构,实现分布式协调服务.本文主要介绍利用Zookeeper有序目录的创建和删除,实现分布式共享锁. 举个例子,性能管理系统中,告警规则只 ...

  9. ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务

    ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用提供一致性服务的软件,提供的功 ...

随机推荐

  1. POJ2411 Mondriaan's Dream(状态压缩)

    Mondriaan's Dream Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 15295   Accepted: 882 ...

  2. AngularJS学习篇(十)

    AngularJS Select(选择框) 使用 ng-options 创建选择框 在 AngularJS 中我们可以使用 ng-option 指令来创建一个下拉列表,列表项通过对象和数组循环输出,如 ...

  3. canvas绘制旋转图形

    将绘制到canvas上的要素进行旋转: 1.绘制时,通过操作画布的坐标轴状态:平移画布原点,旋转坐标轴等,达到旋转图形的目的 2.操作操作DOM元素,直接旋转canvas画布 操作画布的坐标轴状态: ...

  4. ECMAScript 6 proxies

    在ECMAScript 5里面,可以通过(writable 和 configurable)内部属性把属性设置为不可修改和不可删除的,可以通过(Object.preventExtensions() )让 ...

  5. Problem C: 是否回文数?

    Description 定义Data类,有一个int类型的属性.定义其构造函数.setValue函数和isPalindrome函数,其中setValue函数用于设置属性值,isPalindrome用于 ...

  6. maven下的sqlserver配置jar包

    看了两天的maven,开始把之前做的ssm项目搭建成maven项目,结果在sqlserver的依赖包上受阻,sqlserver需要sqljdbc4.jar包,经过一系列百度教程才得以解决,现在总结一下 ...

  7. SQL命令语句进行大数据查询如何进行优化

    SQL 大数据查询如何进行优化? 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索 2.应尽量避免在 where 子句中对字段进行 null 值 ...

  8. [转载] Java实现生产者消费者问题

    转载自http://www.cnblogs.com/happyPawpaw/archive/2013/01/18/2865957.html 引言 生产者和消费者问题是线程模型中的经典问题:生产者和消费 ...

  9. pt-query-digest

    pt-query-digest默认查询时间分布 # Query_time distribution # 1us # 10us ##################################### ...

  10. Python之numpy模块array简短学习

    1.简介 Python的lists是非常的灵活以及易于使用.但是在处理科学计算相关大数量的时候,有点显得捉襟见肘了. Numpy提供一个强大的N维数组对象(ndarray),包含一些列同类型的元素,这 ...