ZooKeeper 数据模型

整个ZooKeeper的数据模型是一棵树,树上的每个节点,称为ZNode。ZNode的节点路径标识方式和Unix文件系统路径非常,都是由一系列的使用/进行分割的路径标识。

ZNode

每个ZNode也是有生命周期的,其生命周期长短取决于ZNode的类型。

ZNode分类

在谈到分布式的时候,通常说的节点是指组成集群的每台机器。然而在ZooKeeper中,节点分为两种:第一种是构成集群的机器,我们称之为机器节点;第二种是数据模型中的数据节点ZNode。

持久型(persistent

这种类型是最常用的一种。这样的节点被创建后,应会一直存在于ZooKeeper服务器上,直到有删除操作来清除该节点。

持久顺序节点(persistent_sequential

这种节点除了有持久性之外,还会有顺序。每个父节点都会为它的直接子节点维护一个顺序,用于记录节点的创建顺序。

基于顺序这个特性,在创建节点时,ZooKeeper会自动为给定节点名加上一个数字后缀作为新的完整的节点名。别外,数字后缀是Integer类型的,所以最大是整形的最大值。

临时节点(ephemeral

与持久节点不同的是,临时节点是与客户端会话关联的节点。也就是会话结束(或者失效)时,临时节点也会被ZooKeeper自动的清除了。另外要注意的是,会话失效并不是TCP连接断开。

客户端建立长连接后,会话也就开始了。基于这个连接,客户端可以通过心跳检测与服务器保持有效的会话。Session的seesionTimeout用于设置一个客户端的会话超时时间。当由于服务器压力太大、网络故障或者时客户端主动断开连接等各种原因导致客户端连接断开时,只要在sessionTime规定时间内能够重新连接上集群中的任意一台服务器,那么之前创建的会话仍然有效。

临时顺序节点(ephemeral_sequential

具有临时性和顺序性。

State

每个ZNode除了自身的path外,还有一个Stat:

Watcher

Watcher工作原理

Watcher其实是一个Event的Handler。当发生指定事件后,会执行Watcher.process()方法。

Watcher事件说明

Watcher注册

1、通过上面的描述,知道可以通过exists,getData,getChildren来注册Watcher

其中exists、getData方法注册的Watcher时用于处理指定节点的。

Exists方法是这样描述的:

getData方法是这样描述的:

getChildren注册的方法,既处理指定节点的delete事件,也处理指定节点的子节点的create/delete事件。

2、创建会话时,指定默认的Watcher

如果了解过ZooKeeper Java Client API的话,就可以知道getData、exists、getChildren方法都有一种使用默认Watcher的调用方式:

public Stat exists(String path, boolean watch);

public byte[] getData(String path, boolean watch, Stat stat);

public List<String> getChildren(String path , boolean watch);

这个boolean 标识就是表示是否使用默认的Watcher。如果是true,则表示使用默认的watcher,如果为false,则表示不注册Watcher。

指定默认的Watcher的方式有两种:

方式一:使用ZooKeeper构造器创建ZooKeeper client对象时。

方式二:在使用Zookeeper Client时,使用register方法。

另外,注册的Watcher只会存储在Client的 WatchManager中,不会发给服务端。

事件发布

服务端对节点进行操作(增加子节点、删除节点、修改节点数据)后,就会发布事件。服务端处理过程如下:

上面说的Watcher,并不是一个真实的Watcher对象,因为客户端在注册Watcher时,根本就没有把Watcher序列化传输给服务端。所以这上面说的Watcher,可以理解为Client注册的Watcher的一个引用。服务端其实只是把事件发给客户端而已

客户端接收到响应后,如果响应头中replyHdr中标识了XID为-1时,就认为是一个事件通知类的响应,接下来处理过程大体分为以下4步:

需要注意的是:

在进行Watcher回调时,会从WatchManager取出与相关path关联的多个Watcher(此时WatchManager中就不会再有这个path相关的Watcher了),然后串行的调用这多个Watcher#process方法。所以在编程时,会根据业务的需要,有可能会反复注册Watcher。另外因为多个Watcher的调用是串行的,所以不要因为一个Watcher的处理逻辑影响了整个客户端的Watcher回调。

示例

下面是我写的一个测试用例:

上述代码中,相当于模拟了两种客户端:

一种是用于操作数据的。参见 test方法。

一种是注册Watcher,根据数据变化做出响应的。参见initStrategies方法和两个Watcher实现类。

ZooKeeper:数据模型的更多相关文章

  1. Zookeeper数据模型及其应用

    Zookeeper作为分布式系统的底层协调服务有着其简单可依靠的数据模型,数据模型加之数据同步.一致性处理和可靠性,在此之上有很多经典的应用,例如,分布式锁.服务器动态上线下感知.主节点选举.数据发布 ...

  2. 3.Apache ZooKeeper数据模型

    1. ZooKeeper自下向上的服务视图 Apache ZooKeeper是分布式应用程序的协调服务. 它旨在解决分布式应用程序中与组件协调相关的棘手问题. 它通过暴露一个简单而强大的接口来实现这一 ...

  3. zookeeper系列之十—zookeeper数据模型

    团队博客:http://rdc.taobao.com/team/jm/archives/tag/zookeeper <ZooKeeper快速搭建>http://nileader.blog. ...

  4. zookeeper系列之九—zookeeper数据模型

    http://nileader.blog.51cto.com/1381108/946788 本文主要讲述了Zookeeper的数据模型,包括Zookeeper的数据视图,节点的层次结构以及节点类型等基 ...

  5. ZooKeeper 数据模型

    本文主要讲述ZooKeeper的数据模型,包括ZooKeeper的数据视图,节点的层次结构以及节点类型等基本属性.Zookeeper的视图结构类似标准的Unix文件系统,但是没有引入文件系统相关概念: ...

  6. 【4】Zookeeper数据模型

    一.Znode节点是什么 1.1.概念   Znode节点是Zookeeper中数据模型中最小的数据单元.Zookeeper的数据模型是一颗树,由"/"进行分割路径.每个znode ...

  7. ZooKeeper 数据模型:节点的特性与应用

    zk的基础知识基本分为三大模块 数据模型 ACL 权限控制 Watch 监控 数据模型 默认配置文件 # The number of milliseconds of each tick tickTim ...

  8. ZooKeeper数据模型

    ZooKeeper有一个分层的命名空间,类似分布式文件系统.它们唯一的区别就在于在命名空间中每个节点可以有数据关联作为它们的子节点.这就像有一个文件系统允许文件也作为文件目录.节点路径通常表示为规范的 ...

  9. 【转载】zookeeper数据模型

    [转载请注明作者和原文链接,  如有谬误, 欢迎在评论中指正. ] ZooKeeper的数据结构, 与普通的文件系统极为类似. 见下图: 图片引用自developerworks 图中的每个节点称为一个 ...

  10. ZooKeeper入门(三) ZooKeeper数据模型

    1 简述 ZooKeeper可以看成一种高可用性的文件系统,但是,它没有文件和目录,而是使用节点,称为znode. znode可以作为保存数据的容器(如同文件),也可以作为保存其他节点的容器(如同目录 ...

随机推荐

  1. Java基础知识(贰)

    一.面向对象 Java中的面向对象与C#的面向对象,本质都是一样.所以对于学过C#的同学理解Java中面向对象的概念就比较轻松. 对象 定义: 万物皆对象,客观存在的事物都称为对象. 1.面向对象 类 ...

  2. HTML中的拖拉框----在路上(29)

    拖拽框---当鼠标按在指定的区域才可进行拖拽 思想:只有当鼠标是按在一个大div里的小div才可拖拽,其他不可:拖拽框有多种方法,这里以其中一种分享:下面使我自己写的demo,简单有效. <!D ...

  3. 通过easyui tab添加的子页面JS脚本必须放在body才生效

    通过easyui tab添加的子页面JS脚本必须放在body才生效 可通过Chrome查看元素时,head标签是否含有你自己写的JS代码

  4. Git技巧:右键菜单怎么去除?

    如果你是按照http://www.cnblogs.com/dunitian/p/5034624.html 那么你就没有这么多蛋疼的菜单了(反之:vs帮你安装的就蛋疼了) 说下解决方法: 1.Win+R ...

  5. 【译】Unity3D Shader 新手教程(4/6) —— 卡通shader(入门版)

    本文为翻译,附上原文链接. 转载请注明出处--polobymulberry-博客园. 暗黑系 动机 如果你满足以下条件,我建议你阅读这篇教程: 你想了解更多有关表面着色器的细节知识. 你想实现一个入门 ...

  6. ASP.NET MVC5+EF6+EasyUI 后台管理系统(32)-swfupload多文件上传[附源码]

    系列目录 文件上传这东西说到底有时候很痛,原来的asp.net服务器控件提供了很简单的上传,但是有回传,还没有进度条提示.这次我们演示利用swfupload多文件上传,项目上文件上传是比不可少的,大家 ...

  7. ASP.NET MVC5+EF6+EasyUI 后台管理系统(55)-工作流设计-表单布局

    系列目录 前言:这一节比较有趣.基本纯UI,但是不是很复杂 有了实现表单的打印和更加符合流程表单方式,我们必须自定义布局来适合业务场景打印!我们想要什么效果?看下图 (我们没有布局之前的表单和设置布局 ...

  8. IDDD 实现领域驱动设计-理解限界上下文

    上一篇:<IDDD 实现领域驱动设计-理解领域和子域> <实现领域驱动设计>前两章内容,基本上读完了,和<领域驱动设计>不同的是,它把很多的概念都放在前面进行讲述了 ...

  9. java笔记--笔试中极容易出错的表达式的陷阱

    我相信每一个学过java的人儿们都被java表达式虐过,各种"肯定是它,我不可能错!",然后各种"尼玛,真假,怎么可能?",虽然在实际开发中很少会真的让你去使用 ...

  10. CloudNotes之桌面客户端篇:插件系统的实现

    [CloudNotes版本更新历史与各版本下载地址请点击此处] [CloudNotes中文系列文章汇总列表请点击此处] [查看CloudNotes源代码请点击此处] 有时候,同一个名词,针对不同的人群 ...