`

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学习笔记

    java ZooKeeper学习笔记\ZooKeeper原理、运用

    Zookeeper学习笔记

    自己整理的ZooKeeper学习笔记,适合刚刚接触ZooKeeper的人学习

    Zookeeper学习笔记.pdf

    ZooKeeper是一种为分布式应用所设计的高可用、高性能且一致的开源协调服务,它提供了一项基本服务:**分布式锁服务**。由于ZooKeeper的开源特性,后来我们的开发者在分布式锁的基础上,摸索了出了其他的使用方法:**...

    zookeeper学习笔记.pptx

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

    java后端学习笔记

    activeMq,rabbitMq,activity工作流,docker,dubbo,netty,rpc,springcloud,zookeeper学习笔记

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

    适合初学入门,知识巩固。涵盖安装配置、命令操作、Java API操作、事件监听、分布式锁、集群搭建等知识

    云的学习笔记-云的学习笔记系统-云的学习笔记系统源码-云的学习笔记管理系统-基于ssm的云的学习笔记系统-ssm-java代码

    zookeeper云的学习笔记-云的学习笔记系统-云的学习笔记系统源码-云的学习笔记管理系统-云的学习笔记管理系统java代码-云的学习笔记系统设计与实现-基于ssm的云的学习笔记系统-基于Web的云的学习笔记系统设计与实现-...

    zookeeper完整学习笔记

    - 概述 - 术语 - 分布式应用 - 介绍 - 架构 - 工作流 - Leader选举 - 安装服务 - CLI 操作 - java-api - 动态感知服务器上下线 - 实现Hadoop高可用(Hadoop-HA-High Availability)

    学习笔记--zookeeper

    zookeeper学习,包括zookeeper架构,原理,安装,配置,命令管理,API编程以及可以应用的场景

    zookeeper一站式学习资料

    zookeeper一站式学习资料包含国内首部Zookeeper从入门到精通+搜索引擎等一条龙学习资料以及视频讲解包含笔记代码资源

    zookeeper笔记

    zookeeper原理以及应用笔记学习总结,适合初学者!欢迎下载

    ZooKeeper.pdf

    Zookeeper技术的基础详细学习笔记,总结了Zookeeper的各个知识点,可以用来复习以及对基础知识的巩固,对新人的学习很有帮助。

    4.zookeeper运维实战视频教程资料-详细课件笔记总结

    学习zookeeper的运行原理、集群搭建、应用场景、理解相关概念,总结常见面试题,提高面试通过率 课程简介: 1.zookeeper介绍、安装方式和应用场景 2.zookeeper的单机安装和配置文件介绍 3.zookeeper的集群安装 4....

    zookeeper-01.xmind

    zk学习笔记

    hbase学习笔记

    比较详细的HBase学习笔记,精心制作 HBase是一个分布式的、面向列的开源数据库,源于google的一篇论文《bigtable:一个结构化数据的分布式存储系统》。HBase是Google Bigtable的开源实现,它利用Hadoop HDFS作为其...

    kafka学习笔记.doc

    1.kafka的基础知识(安装、部署、基础概念,版本) ...4.kafka中的zookeeper 5. kafka如何不丢消息 6.kafka多线程消费 7.kafka重组平衡 8.kafka控制器 9.kafka监控 10.kafka集群部署及调优 11. 代码见《kafka学习代码》

    1.笔记_zookeeper_

    Zookeeper是一个开源的分布式的,为分布式应用提供协调服务的Apache项目。该文档适合学习者学习zookeeper,结构清晰,层次递增,需要学习者配合xmind软件学习

Global site tag (gtag.js) - Google Analytics