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

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

    未分类 1.js对文字进行编码涉及3个函数:   escape,encodeURI,encodeURIComponent, 相应3个解码函数:unescape,decodeURI,decodeURIC ...

  2. Java面试题解构

    有次一个同事让我一同去面试一个候选人,没仔细看简历,所以在问了设计模式之后就让他谈一谈对内存泄漏和垃圾回收的理解,当时候选人一下子就懵了.后来才知道,他面的是初.中级开发职位,想来估计候选人心里也在骂 ...

  3. JavaScript系列----函数(Function)篇(4)

    1.什么是函数? 在W3C中函数的定义是这么说的:函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块.   诚然,从这种抽象的定义中我们得不到什么有价值的东西.下面,举例来列举出函数的几种定义 ...

  4. sql 1.1 1.1.1 1.10.1 排序

    解决思路:计算每位的权重,得到序号完整的权重值,使用权重值进行排序! 创建sql 函数如下: ALTER FUNCTION [dbo].[SequenceToOrderNum] ( @Sequence ...

  5. MyEclipse和Eclipse非常方便的快捷键

    1. ctrl+shift+r:打开资源这可能是所有快捷键组合中最省时间的了.这组快捷键可以让你打开你的工作区中任何一个文件,而你只需要按下文件名或mask名中的前几个字母,比如applic*.xml ...

  6. CLR类型设计之属性

    在之前的随笔中,我们探讨了参数,字段,方法,我们在开始属性之前回顾一下,之前的探讨实际上串联起来就是OOP编程的思想,在接下来的文章中,我们还会讨论接口(就是行为),举个例子:我们如果要做一个学生档案 ...

  7. SpringMVC---CookieValue

    配置文件承接一二章 @CookieValue的作用 用来获取Cookie中的值 1.value:参数名称 2.required:是否必须 3.defaultValue:默认值 原网址:https:// ...

  8. POJ1082食物链

    加权并查集入门习题. 传送门http://poj.org/problem?id=1182 下面来记录一下做法: 并查集的作用是询问两个对象时候在同一集合以及将两个非空不相交集合合并. 本题涉及两点之间 ...

  9. python基础教程——函数

    定义函数 //abstest.py def my_abs(x): if x >= 0: return x else: return -x 在该文件的当前目录下启动python解释器,用 from ...

  10. Hadoop实战训练————MapReduce实现PageRank算法

    经过一段时间的学习,对于Hadoop有了一些了解,于是决定用MapReduce实现PageRank算法,以下简称PR 先简单介绍一下PR算法(摘自百度百科:https://baike.baidu.co ...