`

zookeeper学习记录

 
阅读更多

背景

前段时间看了S4流计算引擎,里面使用到了zookeeper进行集群管理,所以也就花了点时间研究了下zookeeper,不求看懂所有源码,但求了解其实现机制和原理,清楚其基本使用。这也是为后续hadoop,gridgain的分布式计算的产品。

学习

首先就是收集一些前人的一些学习资料和总结内容,方便自己快速入门。

这里罗列了几篇不错的文章:

看了这两篇文章,基本可以对zookeeper有了一个感性的认识,它是一个什么?

zookeeper功能点:
  • 统一命名空间(Name Service)
  • 配置推送 (Watch)
  • 集群管理(Group membership)

统一命名空间

在zookeeper中实现了一个类似file system系统的数据结构,比如/zookeeper/status。 每个节点都对应于一个znode节点。

znode节点的数据结构模型:


znode的数据结构内容:

  • czxid

    The zxid of the change that caused this znode to be created.

  • mzxid

    The zxid of the change that last modified this znode.

  • ctime

    The time in milliseconds from epoch when this znode was created.

  • mtime

    The time in milliseconds from epoch when this znode was last modified.

  • version

    The number of changes to the data of this znode.

  • cversion

    The number of changes to the children of this znode.

  • aversion

    The number of changes to the ACL of this znode.

  • ephemeralOwner

    The session id of the owner of this znode if the znode is an ephemeral node. If it is not an ephemeral node, it will be zero.

  • dataLength

    The length of the data field of this znode.

  • numChildren

    The number of children of this znode.

说明: zxid (ZooKeeper Transaction Id,每次请求对应一个唯一的zxid,如果zxid a < zxid b ,则可以保证a一定发生在b之前)。

针对树状结构的处理,来看一下客户端使用的api :

Java代码 收藏代码
  1. Stringcreate(Stringpath,bytedata[],List<ACL>acl,CreateModecreateMode)
  2. voidcreate(Stringpath,bytedata[],List<ACL>acl,CreateModecreateMode,StringCallbackcb,Objectctx)
  3. voiddelete(Stringpath,intversion)
  4. voiddelete(Stringpath,intversion,VoidCallbackcb,Objectctx)
  5. StatsetData(Stringpath,bytedata[],intversion)
  6. voidsetData(Stringpath,bytedata[],intversion,StatCallbackcb,Objectctx)
  7. StatsetACL(Stringpath,List<ACL>acl,intversion)
  8. voidsetACL(Stringpath,List<ACL>acl,intversion,StatCallbackcb,Objectctx)
  9. Statexists(Stringpath,Watcherwatcher)
  10. Statexists(Stringpath,booleanwatch)
  11. voidexists(Stringpath,Watcherwatcher,StatCallbackcb,Objectctx)
  12. voidexists(Stringpath,booleanwatch,StatCallbackcb,Objectctx)
  13. byte[]getData(Stringpath,Watcherwatcher,Statstat)
  14. byte[]getData(Stringpath,booleanwatch,Statstat)
  15. voidgetData(Stringpath,Watcherwatcher,DataCallbackcb,Objectctx)
  16. voidgetData(Stringpath,booleanwatch,DataCallbackcb,Objectctx)
  17. List<String>getChildren(Stringpath,Watcherwatcher)
  18. List<String>getChildren(Stringpath,booleanwatch)
  19. voidgetChildren(Stringpath,Watcherwatcher,ChildrenCallbackcb,Objectctx)
  20. voidgetChildren(Stringpath,booleanwatch,ChildrenCallbackcb,Objectctx)
  21. List<String>getChildren(Stringpath,Watcherwatcher,Statstat)
  22. List<String>getChildren(Stringpath,booleanwatch,Statstat)
  23. voidgetChildren(Stringpath,Watcherwatcher,Children2Callbackcb,Objectctx)
  24. voidgetChildren(Stringpath,booleanwatch,Children2Callbackcb,Objectctx)

说明:每一种按同步还是异步,添加指定watcher还是默认watcher又分为4种。默认watcher可以在ZooKeeper zk = new ZooKeeper(serverList, sessionTimeout, watcher)中进行指定。如果包含boolean watch的读方法传入true则将默认watcher注册为所关注事件的watch。如果传入false则不注册任何watch

CreateMode主要有几种:

  • PERSISTENT (持续的,相比于EPHEMERAL,不会随着client session的close/expire而消失)
  • PERSISTENT_SEQUENTIAL
  • EPHEMERAL (短暂的,生命周期依赖于client session,对应session close/expire后其znode也会消失)
  • EPHEMERAL_SEQUENTIAL (SEQUENTIAL意为顺序的)
AsyncCallback异步callback,根据操作类型的不同,也分几类:
  • StringCallback
  • VoidCallback
  • StatCallback
  • DataCallback (getData请求)
  • ChildrenCallback
  • Children2Callback
对应的ACL这里有篇不错的文章介绍,http://rdc.taobao.com/team/jm/archives/947

配置推送(Watcher)

zookeeper为解决数据的一致性,使用了Watcher的异步回调接口,将服务端znode的变化以事件的形式通知给客户端,主要是一种反向推送的机制,让客户端可以做出及时响应。比如及时更新后端的可用集群服务列表。

这里有篇文章介绍Watcher/Callback比较详细,可以参考下:

如果想更好的理解Watcher的使用场景,可以了解下使用Watcher机制实现分布式的Barrier , Queue , Lock同步。

Barrier例子:

Java代码 收藏代码
  1. publicclassBarrierimplementsWatcher{
  2. privatestaticfinalStringaddr="10.20.156.49:2181";
  3. privateZooKeeperzk=null;
  4. privateIntegermutex;
  5. privateintsize=0;
  6. privateStringroot;
  7. publicBarrier(Stringroot,intsize){
  8. this.root=root;
  9. this.size=size;
  10. try{
  11. zk=newZooKeeper(addr,10*1000,this);
  12. mutex=newInteger(-1);
  13. Stats=zk.exists(root,false);
  14. if(s==null){
  15. zk.create(root,newbyte[0],Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);
  16. }
  17. }catch(Exceptione){
  18. e.printStackTrace();
  19. }
  20. }
  21. publicsynchronizedvoidprocess(WatchedEventevent){
  22. synchronized(mutex){
  23. mutex.notify();
  24. }
  25. }
  26. publicbooleanenter(Stringname)throwsException{
  27. zk.create(root+"/"+name,newbyte[0],Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL);
  28. while(true){
  29. synchronized(mutex){
  30. List<String>list=zk.getChildren(root,true);
  31. if(list.size()<size){
  32. mutex.wait();
  33. }else{
  34. returntrue;
  35. }
  36. }
  37. }
  38. }
  39. publicbooleanleave(Stringname)throwsKeeperException,InterruptedException{
  40. zk.delete(root+"/"+name,0);
  41. while(true){
  42. synchronized(mutex){
  43. List<String>list=zk.getChildren(root,true);
  44. if(list.size()>0){
  45. mutex.wait();
  46. }else{
  47. returntrue;
  48. }
  49. }
  50. }
  51. }
  52. }

测试代码:

Java代码 收藏代码
  1. publicclassBarrierTest{
  2. publicstaticvoidmain(Stringargs[])throwsException{
  3. for(inti=0;i<3;i++){
  4. Processp=newProcess("Thread-"+i,newBarrier("/test/barrier",3));
  5. p.start();
  6. }
  7. }
  8. }
  9. classProcessextendsThread{
  10. privateStringname;
  11. privateBarrierbarrier;
  12. publicProcess(Stringname,Barrierbarrier){
  13. this.name=name;
  14. this.barrier=barrier;
  15. }
  16. @Override
  17. publicvoidrun(){
  18. try{
  19. barrier.enter(name);
  20. System.out.println(name+"enter");
  21. Thread.sleep(1000+newRandom().nextInt(2000));
  22. barrier.leave(name);
  23. System.out.println(name+"leave");
  24. }catch(Exceptione){
  25. e.printStackTrace();
  26. }
  27. }
  28. }

通过该Barrier,可以协调不同任务之间的同步处理,这里主要还是利用了Watcher机制的反向推送,避免客户端的循环polling动作,只要针对有事件的变化做一次响应。

集群管理

我不罗嗦,taobao有几篇文章已经介绍的很详细。

zookeeper集群对server进行了归类,可分为:
  • Leader
  • Follower
  • Obserer
说明:
1. Leader/Follower会通过选举算法进行选择,可以看一下http://zookeeper.apache.org/doc/r3.3.2/recipes.html里的Leader Election章节。
2. Observer主要是为提升zookeeper的性能,observer和follower的主要区别就是observer不参与Leader agreement vote处理。只提供读节点的处理,类似于master/slave的读请求。(http://zookeeper.apache.org/doc/r3.3.2/zookeeperObservers.html)
Java代码 收藏代码
  1. server.1:localhost:2181:3181:observer

3. 可通过命令行,查看当前server所处的状态

Java代码 收藏代码
  1. [ljh@ccbu-156-49bin]$echostat|nclocalhost2181
  2. Zookeeperversion:3.3.3--1,builton06/24/201113:12GMT
  3. Clients:
  4. /10.16.4.30:34760[1](queued=0,recved=632,sent=632)
  5. /127.0.0.1:43626[0](queued=0,recved=1,sent=0)
  6. /10.16.4.30:34797[1](queued=0,recved=2917,sent=2917)
  7. Latencymin/avg/max:0/0/33
  8. Received:3552
  9. Sent:3551
  10. Outstanding:0
  11. Zxid:0x200000003
  12. Mode:follower##当前模式
  13. Nodecount:8

使用zookeeper,我们能干些什么?

官方文档中,有举了几个应用场景,就是使用zookeeper提供分布式锁机制,从而实现分布式的一致性处理。

典型的几个场景:

  • Barrier
  • Queue
  • Lock
  • 2PC

其他

zookeeper基本是基于API和console进行znode的操作,并没有一个比较方便的操作界面,这里也发现了taobao 伯岩写的一个工具,可以比较方便的查询zookeeper信息。

工具的开发语言主要是node.js(最近比较火),其标榜的是无阻塞的api使用。其原理主要是基于google的V8(chrome的javascript的解析器,C语言编写),node.js本身是基于js语法进行开发,通过V8解析为C语言的执行代码

其标榜的无阻塞I/O实现,那可想而知就是linux系统下的select/poll的I/O模型。有兴趣的可以看下node.js的官网,下载一个玩玩。

文档地址:http://www.blogjava.net/killme2008/archive/2011/06/06/351793.html

代码地址: https://github.com/killme2008/node-zk-browser

通过git下载源码后,需要安装下node.js的几个模块express,express-namespace, zookeeper。 node.js下有个比较方便的模块管理器npm,类似于redhat的rpm,ubuntu的apt-get。

安装模块:

Java代码 收藏代码
  1. npminstall-gexpress

几个界面:


分享到:
评论

相关推荐

    zookeeper学习笔记

    ### Zookeeper 学习笔记 #### 一、Zookeeper 简介与安装配置 **Zookeeper** 是一个分布式协调服务框架,它提供了一种高效可靠的机制来维护集群中的配置信息、命名服务以及提供分布式锁等功能,使得开发人员能够...

    Zookeeper学习笔记

    【Zookeeper学习笔记】 Zookeeper是一个分布式协调服务,它的核心目标是简化分布式环境下的数据管理与系统协调。作为Apache Hadoop和HBase的重要组件,Zookeeper提供了简单的原语集,支持分布式应用程序之间的通信...

    Zookeeper学习笔记.docx

    ZooKeeper 学习笔记 ZooKeeper 是一个开源的分布式协调服务,由 Hadoop 的创始人 Doug Cutting 等人开发。它为分布式应用提供了一个高效、可靠的协调机制,帮助开发者快速构建高可用、可扩展的分布式系统。 ...

    基于Java语言的Zookeeper学习笔记设计源码

    该项目为基于Java语言的Zookeeper学习笔记设计源码,总计包含20个文件,具体构成包括15个Java源文件、3个PNG图片文件以及1个Markdown文件。此外,项目还包含1个XML配置文件,适用于学习和实践Zookeeper相关知识。

    Zookeeper学习笔记.pdf

    Zookeeper是一种重要的分布式协调服务,尤其在处理高可用性、高性能的应用场景中。它最初设计的核心功能是提供分布式锁服务,但随着社区的发展,Zookeeper的功能得到了扩展,现在还用于配置维护、组服务、分布式消息...

    zookeeper学习笔记.pptx

    本文适合但不限于软件开发人员阅读。本文档能够使阅读者对zookeeper有一个宏观且全面的了解,内容主要包含zookeeper架构、数据模型、读写及工作原理、典型应用场景、指令汇总等,

    ZooKeeper学习笔记

    ### ZooKeeper概述 ZooKeeper,如同其名字所暗示的那样,扮演着“动物园管理员”的角色,主要负责管理和协调各种分布式应用程序(如Hadoop、Hive、Pig等)。它是一个开源的分布式协调服务框架,旨在帮助开发者解决...

    Zookeeper学习资源和笔记(附代码)

    Zookeeper是Apache Hadoop项目下的一个子项目,它是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现。...通过深入学习和实践,可以更好地应对分布式环境中的各种挑战。

    2021尚硅谷技术之Zookeeper笔记

    总的来说,尚硅谷2021年的ZooKeeper笔记提供了一套全面的学习资源,帮助开发者深入了解ZooKeeper的工作原理及其在分布式系统中的关键作用。通过深入学习和实践,可以提升在分布式协调领域的技术水平。

    zookeeper资料

    “zookeeper学习笔记.vsdx”可能是一个Visio图表,用于可视化Zookeeper的数据结构、工作流程或架构;而“zookeeper-trunk”可能是一个源码仓库,包含Zookeeper的源代码,适合深入理解其内部机制和进行二次开发。 ...

    zookeeper一站式学习资料

    《Zookeeper一站式学习资料》是一份全面覆盖Zookeeper基础到高级知识的学习资源包,旨在帮助初学者快速入门并深入理解Zookeeper。这份资料包含了丰富的文本资料、视频教程以及相关的实践代码,是学习分布式协调服务...

    Zookeeper学习手册

    ### Zookeeper 学习手册知识点概览 #### 1. ZooKeeper 基本概念 - **角色**: - **Leader**:集群中的领导者,负责处理客户端的写请求,并保持集群状态的一致性。 - **Follower**:集群中的跟随者,处理客户端的...

    zookeeper完整学习笔记

    时间戳记录znode的最后修改时间。 【Zookeeper的Java API和动态感知】 Zookeeper 提供了丰富的Java API,允许开发者方便地创建、删除、更新和查询znode,以及监听znode的变化。动态感知功能使得客户端能够实时感知...

    zookeeper笔记

    ### Zookeeper概述 Zookeeper是一种分布式协调服务框架,它的核心任务是为用户的分布式应用程序提供一系列的协调...无论是从其提供的服务还是从其内部的机制来看,Zookeeper都是值得深入学习和掌握的重要技术之一。

    Hbase与zookeeper笔记备份.rar

    本篇笔记主要围绕这两个技术进行深入探讨,结合尚硅谷的视频教程资源,旨在帮助读者全面理解并掌握这两者的核心知识。 一、Zookeeper:分布式协调服务 Zookeeper是由Apache开发的一款开源分布式协调服务,它提供了...

    zookeeper可视化工具

    - **培训和演示**:可视化的界面使新人更容易理解和学习Zookeeper的工作原理。 总之,Zookeeper可视化工具是管理和维护Zookeeper集群不可或缺的助手,通过它们,我们可以更高效、更安全地操作Zookeeper,实现分布式...

    尚硅谷大数据技术之zookeeper

    而“尚硅谷大数据技术之Zookeeper.xmind”思维导图,则是将整个Zookeeper的知识体系以图形化的形式展现出来,帮助学习者梳理知识点,形成全面的认知框架。 总的来说,这个教程提供了从理论到实践的全面学习材料,...

    学习笔记--zookeeper

    【Zookeeper概述】 Zookeeper是Apache Hadoop的一个子项目,主要设计用于解决分布式环境中的数据管理问题,如统一命名服务、状态同步、集群管理和配置管理等。作为一个分布式服务框架,Zookeeper采用Java编写,同时...

    ZooInspector 用于查看zookeeper的节点信息

    - `src` 文件夹通常是源代码目录,包含 ZooInspector 的 Java 源代码,用户可以查看和学习其内部实现。 5. **ZooKeeper 应用场景**: - **配置管理**:在分布式环境中,ZooKeeper 可用于集中管理应用的配置信息,...

Global site tag (gtag.js) - Google Analytics