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. Ubuntu搭建Anki服务器

    Ubuntu搭建Anki服务器 第一步安装Anki 阿里云的服务器,xshell远程登录上 #以root用户进行操作 #安装Akni服务 easy_install AnkiServer #添加名为an ...

  2. Python之路系列笔记

    备注:本套笔记内容来源于互联网,只做学习使用,如有侵权请联系本笔记作者. 资料内容 Python之路(一)——Python 初识 Python之路(二)——基础语法 Python之路(三)——函数 P ...

  3. Python开发——16.HTML

    一.HTML 1.服务端 import socket def main(): sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM) sock. ...

  4. [swarthmore cs75] inlab1 — Tiny Compiler

    课程回顾 Swarthmore学院16年开的编译系统课,总共10次大作业.本随笔记录了inlab1的实践过程. tiny compiler 这个迷你的编译器可以将一个源文件,编译成可执行的二进制代码. ...

  5. 2019浙大校赛--J--Extended Twin Composite Number(毒瘤水题)

    毒瘤出题人,坑了我们好久,从基本的素数筛选,到埃氏筛法,到随机数快速素数判定,到费马小定理,好好的水题做成了数论题. 结果答案是 2*n=n+3*n,特判1,2. 以下为毒瘤题目: 题目大意: 输入一 ...

  6. Xamarin常见问题

    1. Could not locate Java 6 or 7 SDK. (Download from http://www.oracle.com/technetwork/java/javase/do ...

  7. 基于fpga的vga学习(2)

    本次学习主要向配合basys2实行. 上次学习vga的rgb三个output都是1位的,但是我看了basys2的rgb分别是332位,这里让我卡顿了很久, 之后通过查资料才知道,rgb的不同大小表示的 ...

  8. DICOM医学图像处理:WEB PACS初谈四,PHP DICOM Class

    背景: 预告了好久的几篇专栏博文一直没有整理好,主要原因是早前希望搭建的WML服务器计划遇到了问题.起初以为参照DCMTK的官方文档wwwapp.txt结合前两天搭建的WAMP服务器可以顺利的实现WM ...

  9. CentOS7设置固定IP

    在安装完CentOS7后,当我每次启动CentOS并使用SecureCRT链接时,都发现CentOS的IP总是在变,这就很苦恼了,总不能每次链接的时候都先查一下虚拟机的IP吧,所以打算把它设置成固定I ...

  10. idea中如何将单个java类导出为jar包文件?

    idea作为一个java开发的便利IDE工具,个人是比较喜欢的,今天来探索个小功能:  导出单个类文件为jar包! 偶有这种需求,就是某个类文件独立存在,但是需要将其导出为jar,供别人临时使用,或者 ...