`

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. String create(String path, byte data[], List<ACL> acl, CreateMode createMode)  
  2. void   create(String path, byte data[], List<ACL> acl, CreateMode createMode, StringCallback cb, Object ctx)  
  3.   
  4. void delete(String path, int version)  
  5. void delete(String path, int version, VoidCallback cb, Object ctx)  
  6.   
  7. Stat setData(String path, byte data[], int version)  
  8. void setData(String path, byte data[], int version, StatCallback cb, Object ctx)  
  9.   
  10. Stat setACL(String path, List<ACL> acl, int version)  
  11. void setACL(String path, List<ACL> acl, int version, StatCallback cb, Object ctx)  
  12.   
  13. Stat exists(String path, Watcher watcher)  
  14. Stat exists(String path, boolean watch)  
  15. void exists(String path, Watcher watcher, StatCallback cb, Object ctx)  
  16. void exists(String path, boolean watch  , StatCallback cb, Object ctx)  
  17.   
  18. byte[] getData(String path, Watcher watcher, Stat stat)  
  19. byte[] getData(String path, boolean watch  , Stat stat)  
  20. void   getData(String path, Watcher watcher, DataCallback cb, Object ctx)  
  21. void   getData(String path, boolean watch  , DataCallback cb, Object ctx)  
  22.   
  23. List<String> getChildren(String path, Watcher watcher)  
  24. List<String> getChildren(String path, boolean watch  )  
  25. void  getChildren(String path, Watcher watcher, ChildrenCallback cb, Object ctx)  
  26. void  getChildren(String path, boolean watch  , ChildrenCallback cb, Object ctx)  
  27.   
  28. List<String> getChildren(String path, Watcher watcher, Stat stat)  
  29. List<String> getChildren(String path, boolean watch  , Stat stat)  
  30. void getChildren(String path, Watcher watcher, Children2Callback cb, Object ctx)  
  31. void getChildren(String path, boolean watch  , Children2Callback cb, Object ctx)  

 

说明:每一种按同步还是异步,添加指定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. public class Barrier implements Watcher {  
  2.   
  3.     private static final String addr = "10.20.156.49:2181";  
  4.     private ZooKeeper           zk   = null;  
  5.     private Integer             mutex;  
  6.     private int                 size = 0;  
  7.     private String              root;  
  8.   
  9.     public Barrier(String root, int size){  
  10.         this.root = root;  
  11.         this.size = size;  
  12.   
  13.         try {  
  14.             zk = new ZooKeeper(addr, 10 * 1000this);  
  15.             mutex = new Integer(-1);  
  16.             Stat s = zk.exists(root, false);  
  17.             if (s == null) {  
  18.                 zk.create(root, new byte[0], Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);  
  19.             }  
  20.   
  21.         } catch (Exception e) {  
  22.             e.printStackTrace();  
  23.         }  
  24.   
  25.     }  
  26.   
  27.     public synchronized void process(WatchedEvent event) {  
  28.         synchronized (mutex) {  
  29.             mutex.notify();  
  30.         }  
  31.     }  
  32.   
  33.     public boolean enter(String name) throws Exception {  
  34.         zk.create(root + "/" + name, new byte[0], Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);  
  35.         while (true) {  
  36.             synchronized (mutex) {  
  37.                 List<String> list = zk.getChildren(root, true);  
  38.                 if (list.size() < size) {  
  39.                     mutex.wait();  
  40.                 } else {  
  41.                     return true;  
  42.                 }  
  43.             }  
  44.         }  
  45.     }  
  46.   
  47.     public boolean leave(String name) throws KeeperException, InterruptedException {  
  48.         zk.delete(root + "/" + name, 0);  
  49.         while (true) {  
  50.             synchronized (mutex) {  
  51.                 List<String> list = zk.getChildren(root, true);  
  52.                 if (list.size() > 0) {  
  53.                     mutex.wait();  
  54.                 } else {  
  55.                     return true;  
  56.                 }  
  57.             }  
  58.         }  
  59.     }  
  60.   
  61. }  

 

 

测试代码:

 

Java代码  收藏代码
  1. public class BarrierTest {  
  2.   
  3.     public static void main(String args[]) throws Exception {  
  4.         for (int i = 0; i < 3; i++) {  
  5.             Process p = new Process("Thread-" + i, new Barrier("/test/barrier"3));  
  6.             p.start();  
  7.         }  
  8.     }  
  9. }  
  10.   
  11. class Process extends Thread {  
  12.   
  13.     private String  name;  
  14.     private Barrier barrier;  
  15.   
  16.     public Process(String name, Barrier barrier){  
  17.         this.name = name;  
  18.         this.barrier = barrier;  
  19.     }  
  20.   
  21.     @Override  
  22.     public void run() {  
  23.         try {  
  24.             barrier.enter(name);  
  25.             System.out.println(name + " enter");  
  26.             Thread.sleep(1000 + new Random().nextInt(2000));  
  27.             barrier.leave(name);  
  28.             System.out.println(name + " leave");  
  29.         } catch (Exception e) {  
  30.             e.printStackTrace();  
  31.         }  
  32.     }  
  33. }  

 

通过该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-49 bin]$ echo stat | nc localhost 2181  
  2. Zookeeper version: 3.3.3--1, built on 06/24/2011 13:12 GMT  
  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.   
  8. Latency min/avg/max: 0/0/33  
  9. Received: 3552  
  10. Sent: 3551  
  11. Outstanding: 0  
  12. Zxid: 0x200000003  
  13. Mode: follower  ##当前模式  
  14. Node count: 8  

 

 

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

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

典型的几个场景:

  • Barrier
  • Queue
  • Lock
  • 2PC
分享到:
评论

相关推荐

    Zookeeper学习笔记.docx

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

    Zookeeper学习笔记

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

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

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

    Zookeeper学习笔记.pdf

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

    ZooKeeper学习笔记

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

    zookeeper学习笔记.pptx

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

    2021尚硅谷技术之Zookeeper笔记

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

    zookeeper资料

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

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

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

    zookeeper完整学习笔记

    【Zookeeper概述】 Apache ZooKeeper 是一款开源的分布式协调服务,设计用于管理和简化分布式环境中的数据协调任务。它提供了一种简单、高可用且容错的机制,使得开发者可以专注于核心业务逻辑,而不是复杂的分布式...

    zookeeper笔记

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

    Hbase与zookeeper笔记备份.rar

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

    学习笔记--zookeeper

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

    zookeeper一站式学习资料

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

    尚硅谷大数据技术之zookeeper

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

    dubbo+zookeeper入门资源

    【描述】"dubbo+zookeeper入门资源,可直接使用,适合新手练习使用"意味着这个压缩包包含了学习和实践这两个技术的基础材料。通过这个资源,初学者可以了解如何配置和使用Dubbo与Zookeeper来实现服务间的通信和管理...

    08_尚硅谷技术之Zookeeper(源码解析)V3.3.pdf

    Zookeeper作为分布式协调服务,其设计初衷就是为了帮助分布式系统维护数据的一致性。Zookeeper的实现基于一种被称为Paxos的算法,Paxos算法是解决分布式系统中一致性问题的一种经典算法。 Paxos算法的核心思想是...

Global site tag (gtag.js) - Google Analytics