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

  • 如何执行领导者选举,组员管理和两阶段提交协议等常见的分布式系统任务
  • 如何实现一些分布式数据结构,如屏障(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. Leetcode题解(十)

    29.Divide Two Integers 题目 题目要求不用乘除和取模运算,实现两个整数相除: 我的第一想法就是把除法变成减法来做,这也是最初除法的定义,其实现代码如下: class Soluti ...

  2. TinyXML2的使用

    -----------------------------------------------------------------2015年7月21日16:37:53----------------- ...

  3. 【JAVA零基础入门系列】Day13 Java类的继承与多态

    继承是类的一个很重要的特性,什么?你连继承都不知道?你是想气死爸爸好继承爸爸的遗产吗?(滑稽) 开个玩笑,这里的继承跟我们现实生活的中继承还是有很大区别的,一个类可以继承另一个类,继承的内容包括属性跟 ...

  4. Maple trees(最小覆盖圆)

    Maple trees Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...

  5. shuffle过程简介--笔记

    数据保存在hdfs上 拿到数据后分片处理 输入到Map 输出键值对 写到缓存,满的时候溢写到磁盘 缓存的数据写入磁盘的过程中,分区排序,合并 多个磁盘文件归并 通知Reduce任务拉取 Map端的sh ...

  6. Java微信公众平台开发_06_素材管理

    一.本节要点 1.官方文档的media 这个media可以理解为文件,即我们需要以POST方式提交一个文件 2.媒体文件有效期 媒体文件在微信后台保存时间为3天,即3天后media_id失效. 二.代 ...

  7. C#算法面试题

    1.产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复. static void GetArray() { ]; ]; ; i < ; i++) { intArr[i] ...

  8. 【S2-052】漏洞复现(CVE-2017-9805)

    一.漏洞描述 Struts2 的REST插件,如果带有XStream组件,那么在进行反序列化XML请求时,存在未对数据内容进行有效验证的安全隐患,可能发生远程命令执行. 二.受影响版本 Struts2 ...

  9. boot之mybatis

    特别注意,此种方法和starter不兼容,我用了两个方式混蛋,发现跑不起来! spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driv ...

  10. canvas动画3:交互

    canvas动画3 时隔很久,本人终于又写博客了(重度拖延症),把之前留下的canvas交互动画讲一讲. 电脑上的交互,指的是鼠标和键盘,我们今天主要用的是鼠标. 既然是鼠标的话,就要获取鼠标的各种事 ...