`
coolxing
  • 浏览: 869823 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
9a45b66b-c585-3a35-8680-2e466b75e3f8
Java Concurre...
浏览量:95871
社区版块
存档分类
最新评论

ZooKeeper 数据模型

阅读更多

[转载请注明作者和原文链接,  如有谬误, 欢迎在评论中指正. ] 

ZooKeeper的数据结构, 与普通的文件系统极为类似. 见下图:

图片引用自developerworks

图中的每个节点称为一个znode. 每个znode由3部分组成:

  • stat. 此为状态信息, 描述该znode的版本, 权限等信息.
  • data. 与该znode关联的数据.
  • children. 该znode下的子节点.

ZooKeeper命令

在深入znode的各个部分之前, 首先需要熟悉一些常用的ZooKeeper命令.

连接server

bin/zkCli.sh -server 10.1.39.43:4180

列出指定node的子node

[zk: 10.1.39.43:4180(CONNECTED) 9] ls /
[hello, filesync, zookeeper, xing, server, group, log]
[zk: 10.1.39.43:4180(CONNECTED) 10] ls /hello
[]

创建znode节点, 并指定关联数据

create /hello world

创建节点/hello, 并将字符串"world"关联到该节点中.

获取znode的数据和状态信息

[zk: 10.1.39.43:4180(CONNECTED) 7] get /hello
world
cZxid = 0x10000042c
ctime = Fri May 17 17:57:33 CST 2013
mZxid = 0x10000042c
mtime = Fri May 17 17:57:33 CST 2013
pZxid = 0x10000042c
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 5
numChildren = 0

删除znode

[zk: localhost:4180(CONNECTED) 13] delete /xing/item0000000001
[zk: localhost:4180(CONNECTED) 14] delete /xing               
Node not empty: /xing

使用delete命令可以删除指定znode. 当该znode拥有子znode时, 必须先删除其所有子znode, 否则操作将失败. rmr命令可用于代替delete命令, rmr是一个递归删除命令, 如果发生指定节点拥有子节点时, rmr命令会首先删除子节点.

znode节点的状态信息

使用get命令获取指定节点的数据时, 同时也将返回该节点的状态信息, 称为Stat. 其包含如下字段:

  • czxid. 节点创建时的zxid.
  • mzxid. 节点最新一次更新发生时的zxid.
  • ctime. 节点创建时的时间戳.
  • mtime. 节点最新一次更新发生时的时间戳.
  • dataVersion. 节点数据的更新次数.
  • cversion. 其子节点的更新次数.
  • aclVersion. 节点ACL(授权信息)的更新次数.
  • ephemeralOwner. 如果该节点为ephemeral节点, ephemeralOwner值表示与该节点绑定的session id. 如果该节点不是ephemeral节点, ephemeralOwner值为0. 至于什么是ephemeral节点, 请看后面的讲述.
  • dataLength. 节点数据的字节数.
  • numChildren. 子节点个数.

zxid

znode节点的状态信息中包含czxid和mzxid, 那么什么是zxid呢?
ZooKeeper状态的每一次改变, 都对应着一个递增的Transaction id, 该id称为zxid. 由于zxid的递增性质, 如果zxid1小于zxid2, 那么zxid1肯定先于zxid2发生. 创建任意节点, 或者更新任意节点的数据, 或者删除任意节点, 都会导致Zookeeper状态发生改变, 从而导致zxid的值增加.

session

在client和server通信之前, 首先需要建立连接, 该连接称为session. 连接建立后, 如果发生连接超时, 授权失败, 或者显式关闭连接, 连接便处于CLOSED状态, 此时session结束.

节点类型

讲述节点状态的ephemeralOwner字段时, 提到过有的节点是ephemeral节点, 而有的并不是. 那么节点都具有哪些类型呢? 每种类型的节点又具有哪些特点呢?
persistent. persistent节点不和特定的session绑定, 不会随着创建该节点的session的结束而消失, 而是一直存在, 除非该节点被显式删除.
ephemeral. ephemeral节点是临时性的, 如果创建该节点的session结束了, 该节点就会被自动删除. ephemeral节点不能拥有子节点. 虽然ephemeral节点与创建它的session绑定, 但只要该该节点没有被删除, 其他session就可以读写该节点中关联的数据. 使用-e参数指定创建ephemeral节点.

[zk: localhost:4180(CONNECTED) 4] create -e /xing/ei world   
Created /xing/ei

sequence. 严格的说, sequence并非节点类型中的一种. sequence节点既可以是ephemeral的, 也可以是persistent的. 创建sequence节点时, ZooKeeper server会在指定的节点名称后加上一个数字序列, 该数字序列是递增的. 因此可以多次创建相同的sequence节点, 而得到不同的节点. 使用-s参数指定创建sequence节点.

[zk: localhost:4180(CONNECTED) 0] create -s /xing/item world
Created /xing/item0000000001
[zk: localhost:4180(CONNECTED) 1] create -s /xing/item world
Created /xing/item0000000002
[zk: localhost:4180(CONNECTED) 2] create -s /xing/item world
Created /xing/item0000000003
[zk: localhost:4180(CONNECTED) 3] create -s /xing/item world
Created /xing/item0000000004

 

watch

watch的意思是监听感兴趣的事件. 在命令行中, 以下几个命令可以指定是否监听相应的事件.

ls命令. ls命令的第一个参数指定znode, 第二个参数如果为true, 则说明监听该znode的子节点的增减, 以及该znode本身的删除事件.

[zk: localhost:4180(CONNECTED) 21] ls /xing true
[]
[zk: localhost:4180(CONNECTED) 22] create /xing/item item000

WATCHER::

WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/xing
Created /xing/item

get命令. get命令的第一个参数指定znode, 第二个参数如果为true, 则说明监听该znode的更新和删除事件.

[zk: localhost:4180(CONNECTED) 39] get /xing true
world
cZxid = 0x100000066
ctime = Fri May 17 22:30:01 CST 2013
mZxid = 0x100000066
mtime = Fri May 17 22:30:01 CST 2013
pZxid = 0x100000066
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 5
numChildren = 0
[zk: localhost:4180(CONNECTED) 40] create /xing/item item000
Created /xing/item
[zk: localhost:4180(CONNECTED) 41] rmr /xing

WATCHER::

WatchedEvent state:SyncConnected type:NodeDeleted path:/xing

stat命令. stat命令用于获取znode的状态信息. 第一个参数指定znode, 如果第二个参数为true, 则监听该node的更新和删除事件.

  • 大小: 15.1 KB
3
0
分享到:
评论

相关推荐

    3天全面深入学习zookeeper视频教程

    zookeeper数据模型 zookeeper单机安装 zookeeper常用shell命令 zookeeper的Acl权限控制 zookeeper的javaApi zookeeper 事件监听机制 zookeeper 集群搭建 一致性协议:zab协议 zookeeper的leader选举 observer角色及其...

    Zookeeper基础知识、体系结构、数据模型、服务器集群.docx

    Zookeeper基础知识、体系结构、数据模型、服务器集群

    ZooKeeper程序员指南

    本文是为想要创建使用...但是,在编写第一个ZooKeeper应用程序之前,你应该至少读过ZooKeeper数据模型和ZooKeeper基本操作。此外,简单示例程序也有助于理解ZooKeeper客户端应用程序的基本结构。ZooKeeper有一个分层

    从Paxos到Zookeeper

    第四部分(第7章)对ZooKeeper的架构设计和实现原理进行了深入分析,包含系统模型、Leader选举、客户端与服务端的工作原理、请求处理,以及服务器角色的工作流程和数据存储等;第五部分(第8章)介绍了ZooKeeper的...

    zookeeper学习笔记.pptx

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

    淘宝网Zookeeper入门

    介绍ZooKeeper服务的基础知识,并详细了解了数据模型及其属性

    zookeeper的相关介绍

    ※ zk基础知识介绍 ※ zk数据模型介绍 ※ zk数据模型中znode的介绍 ※ zk数据监听 ※ zk的acl ※ zk单节点基本操作 ※ zk集群操作 ※ zk的java客户端操作

    java高级软件工程师教程快速入门Zookeeper+dubbo视频教程

    提供分布式数据一致性解决方案,分布式应用程序可以实现数据发布订阅、负载均衡、命名服务、集群管理分布式锁、分布式队列等功能。在大数据、分布式系统或架构中占有很重要的协调位置。 Dubbo是一款高性能、轻量级的...

    zookeeper-基本认知

    Zookeeper概念 ZooKeeper是一个开源的分布式协调服务。 目标 主要用来解决分布式集群中应用系统的一致性问题,例如怎样避免同时操作同一数据造成...ZooKeeper 的数据模型,在结构上和标准文件系统的非常相似,拥有一个

    zookeeper-application:zookeeper应用

    它的设计易于编程,并使用在熟悉的文件系统目录树结构之后设计的数据模型。它运行在Java中,并且对Java和C都有绑定。 周所周知,协调服务是很难做到的。它们特别容易出现诸如竞态条件和死锁等错误。ZooKeeper背后的...

    zookeeper编程程序指南(中文)

    介绍 数据模型  节点  时间  stat结构 会话 监控 访问控制 可插拔的认证 一致性保证

    使用Zookeeper分布式部署PHP应用程序

    Zookper很容易编程接入,它使用了一个和文件树结构相似的数据模型。 虽然ZooKeeper是一个Java应用程序,但C也可以使用。这里就有个PHP的扩展,你可以从PECL中下载,或从GitHub中直接获取PHP-ZooKeeper。 要使用该...

    分布式协调工具-ZooKeeper实现动态负载均衡

    Zookeeper数据结构 1、层次化的目录结构,命名符合常规文件系统规范(类似文件系统)    2、每个节点在zookeeper中叫做znode,并且其有一个唯一的路径标识  3、节点Znode可以包含数据和子节点(但是...

    (Scala)智慧交通项目,对已有交通数据进行分析建立模型,从而对未来交通堵车情况进行预测.zip

    业务需求:对已有交通数据进行分析建立模型,从而对未来交通堵车情况进行预测; # TrafficForecast SparkMLlib智慧交通项目 ## 项目需求 对已有交通数据进行分析建立模型,从而对未来交通堵车情况进行预测 ## 使用...

    开课吧-04分布式协调服务器Zookeeper.pdf

    无论客户端连接的是集群中的哪台 Server,其读取到的数据模型中的数据都是一致的。 1.2.4 可靠性 一旦某事务被成功应用到了 zk,则会一直被保留下来,除非另一个事务将其修改。 1.2.5 最终一致性 一旦一个事务被成功...

    基于Zookeeper的使用详解

    Zookper很容易编程接入,它使用了一个和文件树结构相似的数据模型。可以使用Java或者C来进行编程接入。 众所周知,分布式的系统协作服务很难有让人满意的产品。这些协作服务产品很容易陷入一些诸如竞争选择条件或者...

    ZooKeeper 实现分布式锁的方法示例

    在介绍 ZooKeeper 分布式锁前需要先了解一下 ZooKeeper 中节点(Znode),ZooKeeper 的数据存储数据模型是一棵树(Znode Tree),由斜杠(/)的进行分割的路径,就是一个 Znode(如 /locks/my_lock)。每个 Znode 上...

    Hadoop+Hive+Spark+Kafka+Zookeeper+Flume+Sqoop+Azkaban+Scala

    基于 Zookeeper 搭建 Hadoop 高可用集群 二、Hive 简介及核心概念 Linux 环境下 Hive 的安装部署 CLI 和 Beeline 命令行的基本使用 常用 DDL 操作 分区表和分桶表 视图和索引 常用 DML 操作 数据查询详解 三、Spark ...

    分布式服务框架Zookeeper入门学习

    ZooKeeper是一种为分布式应用所设计的高可用、高性能且一致的开源协调服务,是Google的Chubby...单一视图:无论客户端连接的是哪个ZooKeeper服务器,其看到的服务端数据模型都是一致的。可靠性:一旦服务端成功地应用了

Global site tag (gtag.js) - Google Analytics