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

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

    # /usr/bin/env python# -*- coding: utf-8 -*-# Author:jenvid.yangimport getpassimport shutiluserspwd ...

  2. Log4.Net 在Winfrom、MVC、ashx程序里的使用,ashx程序里使用异步

    最近做一个双11活动的,是一套相关的H5页面.本来以为难度不大,但是做下来几天还是遇到些问题.就总结一下吧,还是有收获的. 1.在H5页面中,有一个遮罩层,还是挺有意思的.直接用div+css控制遮罩 ...

  3. SQL Server 行转列,列转行。多行转成一列

    一.多行转成一列(并以","隔开) 表名:A 表数据: 想要的查询结果: 查询语句: SELECT name , value = ( STUFF(( SELECT ',' + va ...

  4. 【Tesseract】Tesseract 的训练流程

    在泰迪杯A题中,我刚刚接触了Tesseact,其中训练字库中遇到了较多的问题.所以在此记录一下,也当做一个笔记,省得以后忘记. 为了方便 ,将tif命名格式设为[lang].[fontname].ex ...

  5. 你不得不看的Python机器学习工具

    IEEE Spectrum排行榜第一,Skill UP排名第一的开发工具,Stack Overflow年度调查中程序员最感兴趣的选择,Stack Overflow 6月份访问量最多的编程语言..... ...

  6. 使用composer更新thinkphp5或则yii2的版本

    更新thinkphp5或则yii2的版本,我目前采用的是用composer去更新,小伙伴们如果有其他更好的办法更新,可以直接评论给我,不胜感激啊. 如果还没有安装 Composer ,你可以按 Com ...

  7. [转载] 快速理解Kafka分布式消息队列框架

    转载自http://blog.csdn.net/xiaolang85/article/details/18048631 ==是什么 == 简单的说,Kafka是由Linkedin开发的一个分布式的消息 ...

  8. MySQL子查询优化实例

    优化:子查询改写成关联查询 线上遇到问题,查询较慢,如为对应SQL的查询执行计划: localhost.\G . row *************************** id: select_ ...

  9. 【转】在SAE部署WordPress

    原文:http://blog.csdn.net/jackrex/article/details/9305835 虽然几个月前我是以安装应用的形式将wordpress部署在sae,虽然当时sae应用商店 ...

  10. redis源码分析之有序集SortedSet

    有序集SortedSet算是redis中一个很有特色的数据结构,通过这篇文章来总结一下这块知识点. 原文地址:http://www.jianshu.com/p/75ca5a359f9f 一.有序集So ...