zookeeper实现了主动通知节点变化,原子创建节点,临时节点,按序创建节点等功能。通过以上功能的组合,
zookeeper能够在分布式系统中组合出很多上层功能。下面就看几个常用到的场景,及使用方式和注意事项。

名字服务(NameService)

顾名思义,就是给分布式系统中的资源,使用人易于理解的名字,能够找到需要的资源。例如:一个统一接口系统,接收服务然后转给后端服务的具体server。当新增接口时,请求方只要传递新接口的名字,系统就能够根据名字找到对应的server,发现服务并转发请求。

在zookeeper中,按照命名的规则,建立对应的目录层级,例如 /company/team/service 就能找到一个公司,一个team下的提供的某个服务的路径。当上线新业务时,服务在zk中找到自己名字的节点,建立一个临时节点,写入配置信息。当调用方使用时,统一接口查询对应目录下的节点,选择合适的读取配置。当业务下掉时,直接删除服务,临时节点自动删除,服务自动下线掉。

配置管理(Configuration Management)

分布式系统位于不同主机的服务,有时要使用统一的配置。可以在zookeeper中的znode节点存储配置数据,每个客户端都监控(watch)znode的变化,当配置变更时,会通知推送,然后各个客户端再拉取新的配置。

注意:zk的watch是一次性的,客户端读取后要重新watch,并且检查是否是最新版本。

组员管理(Group Membership)

在Master、Slave模式下,Master要知道都有哪些Slave,进行同步等操作。也要及时知道哪些Slave死掉,然后去做相应处理。具体做法是Master先建立一个/Slave节点,每个Slave上线时都在/Slave建立一个临时节点,写入配置,server监控/Slave节点,对增加或消失的节点进行相应处理。

以上三种用法都属于配置类服务,按照一定的规则进行配置,需要读取配置的地方监控配置的变化。

简单互斥锁(Simple Lock)

每个进程都在/lock下创建锁znode,并watch /lock,只有一个创建成功,当成功的进程释放锁或者停止超时会通知其他进程,重新进入竞争锁的机制。

互斥锁(Simple Lock without Herd Effect)

为了不引发惊群效应,只要能给竞争进程排序就可以了,每个进程都在/lock的节点下创建带序号的znode,并且每个znode只监听比他次小的节点,当次小的节点释放锁后,比他次大的节点会收到通知,拿到锁权限。

注意:防止还没有执行到的进程死掉,要更新监听顺序。例如:2监听1,3监听2,如果2进程提前死掉,3要监控到这种状态,判断是否是2关闭,还是2释放锁,如果不是正常关闭,要去监听1更新监听。

读写锁(Read/Write Lock)

读写锁:多个读可以并发执行,但是写和读,写和写不能同时执行。
改动互斥锁方案,如果是写锁,监听他次小的节点,次小节点释放锁后,写锁检测是否还有更小的节点,如果有继续监听,如果没有获得写锁执行;如果是读锁,监听左侧最大的写锁,当写锁释放后就获得读锁。
也要注意中间节点死掉提前释放的问题,要重新监听节点。

屏障(Barrier)

在分布式系统中,屏障是这样一种语义: 客户端需要等待多个进程完成各自的任务,然后才能继续往前进行下一步。
例如凌晨备份,等待每个进程把数据都dump结束后,再打包压缩传走。

client先设置/mybarrier的znode,然后启动每个进程,每个进程执行结束成功后,在/mybarrier下创建结束的znode节点,client发现/mybarrier下的node数都达到了,再继续下面的任务。

双屏障(Double Barrier)

双屏障是这样一种语义: 它可以用来同步一个任务的开始和结束,当有足够多的进程进入屏障后,才开始执行任务;当所有的进程都执行完各自的任务后,屏障才撤销。

进入屏障:创建/ready和/process节点,每个进程都先到ready中注册,注册数量达到要求时,通知所有进程启动开始执行。
离开屏障:在/process下把注册ready的进程都建立节点,每个进程执行结束后删掉/process下的对应节点。当/process下为空时,任务全结束。

锁、屏障,本质都是排序,给要使用的节点排序,根据顺序来执行策略,保证执行不冲突。

总结

以上的应用场景,并不是只有zk能实现的,而且实现的方式也是通用的,换做其他组件,只要满足了通知和原子创建、自增id,都可以实现这些场景的使用。而且实现的方法也是通用的,不仅在zk中才这样用。
本质上就是统一配置通知机制,和原子简历自增id节点排序机制,实现了配置类和锁类协调的功能。

参考

《ZooKeeper原理及使用》 http://www.wuzesheng.com/?p=2609


转载请注明来源:zookeeper典型应用场景解析

ZOOKEEPER典型应用场景解析的更多相关文章

  1. ZooKeeper典型应用场景

    ZooKeeper典型应用场景一览 数据发布与订阅(配置中心) 发布与订阅模型,即所谓的配置中心,顾名思义就是发布者将数据发布到ZK节点上,供订阅者动态获取数据,实现配置信息的集中式管理和动态更新.例 ...

  2. ZooKeeper典型应用场景一览

    原文地址:http://jm-blog.aliapp.com/?p=1232 ZooKeeper典型应用场景一览 数据发布与订阅(配置中心) 发布与订阅模型,即所谓的配置中心,顾名思义就是发布者将数据 ...

  3. ZooKeeper典型应用场景(转)

    ZooKeeper是一个高可用的分布式数据管理与系统协调框架.基于对Paxos算法的实现,使该框架保证了分布式环境中数据的强一致性,也正是基于这样的特性,使得ZooKeeper解决很多分布式问题.网上 ...

  4. ZooKeeper典型应用场景概览

    ZooKeeper是一个高可用的分布式数据管理与系统协调框架.基于对Paxos算法的实现,使该框架保证了分布式环境中数据的强一致性,也正是基于这样的特性,使得ZooKeeper解决很多分布式问题.网上 ...

  5. 搞懂分布式技术6:Zookeeper典型应用场景及实践

    搞懂分布式技术6:Zookeeper典型应用场景及实践 一.ZooKeeper典型应用场景实践 ZooKeeper是一个高可用的分布式数据管理与系统协调框架.基于对Paxos算法的实现,使该框架保证了 ...

  6. ZooKeeper 典型应用场景-数据发布与订阅

    ZooKeeper 是一个高可用的分布式数据管理与系统协调框架.基于对 Paxos 算法的实现,使该框架保证了分布式环境中数据的强一致性,也正是基于这样的特性,使得 ZooKeeper 可以解决很多分 ...

  7. zookeeper典型应用场景之一:master选举

    对于zookeeper这种东西,仅仅知道怎么安装是远远不够的,至少要对其几个典型的应用场景进行了解,才能比较全面的知道zk究竟能干啥,怎么玩儿,以后的日子里才能知道这货如何能为我所用.于是,有了如下的 ...

  8. ZooKeeper 典型应用场景

    Zookeeper基础知识 1.zookeeper是一个类似hdfs的树形文件结构,zookeeper可以用来保证数据在(zk)集群之间的数据的事务性一致. 2.zookeeper有watch事件,是 ...

  9. ZooKeeper典型使用场景一览

    场景类别 典型场景描述(ZK特性,使用方法) 应用中的具体使用 数据发布与订阅 发布与订阅即所谓的配置管理,顾名思义就是将数据发布到zk节点上,供订阅者动态获取数据,实现配置信息的集中式管理和动态更新 ...

随机推荐

  1. usb 枚举流程

    Linux-USB总线驱动分析 如下图所示,以windows为例,我们插上一个没有USB设备驱动的USB,就会提示你安装驱动程序 为什么一插上就有会提示信息? 是因为windows自带了USB总线驱动 ...

  2. mybatis框架的注意点

    1.在mapper.xml文件中 resultType:返回结果类型,只能用于单表 paramsType:接收参数类型,基本数据类型可省略 2.给实体类起别名 在mybatisConfig.xml配置 ...

  3. 【转载】 .NET框架设计—常被忽视的C#设计技巧

    阅读目录: 1.开篇介绍 2.尽量使用Lambda匿名函数调用代替反射调用(走进声明式设计) 3.被忽视的特性(Attribute)设计方式 4.扩展方法让你的对象如虎添翼(要学会使用扩展方法的设计思 ...

  4. 将 Idea 常用快捷键 设置为 Eclipse 的快捷键

  5. 学习Python第五天

    今天咱们讲一下元组,hash,字典,元组是数据类型其中之一 元组的特性为有序的,不可变的,但是如果其中有可变元素,这些可变元组还是可以改变的,代码如下: 元组的写法:name = (‘roy’,‘al ...

  6. BABOK概述

    BABOK概述 BABOK(Business Analysis Body of Knowlodge: 业务[或商业]分析知识体系)是由位于加拿大的IIBA(International Institut ...

  7. xampp运行MySQL shutdown unexpectedly解决方案

    昨天晚上自己的网站突然打不开了,以为被人黑了.想想不应该啊,这小站不会有人关注的,于是登录服务器看了下,发现是Mysql打不开了 很奇怪,因为今天白天还是可以打开的,下班后也没有碰过服务器 首先看看是 ...

  8. 第53节:Java当中的IO流(上)

    Java当中的IO流 在Java中,字符串string可以用来操作文本数据内容,字符串缓冲区是什么呢?其实就是个容器,也是用来存储很多的数据类型的字符串,基本数据类型包装类的出现可以用来解决字符串和基 ...

  9. txt文本处理---行未添加逗号

    做音频处理过程中,经常遇到需要对文本进行转换,今天就遇到了一个行末加逗号的问题,找到了几种有效的方式,做个记录吧. 以下是几种方法实现: python代码实现: import os with open ...

  10. 良好的JavaScript编码风格(语法规则)

    编码风格 1.概述 "编程风格"(programming style)指的是编写代码的样式规则.不同的程序员,往往有不同的编程风格. 有人说,编译器的规范叫做"语法规则& ...