[转载请注明作者和原文链接, 如有谬误, 欢迎在评论中指正. ]
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的更新和删除事件.
相关推荐
zookeeper数据模型 zookeeper单机安装 zookeeper常用shell命令 zookeeper的Acl权限控制 zookeeper的javaApi zookeeper 事件监听机制 zookeeper 集群搭建 一致性协议:zab协议 zookeeper的leader选举 observer角色及其...
Zookeeper基础知识、体系结构、数据模型、服务器集群
本文是为想要创建使用...但是,在编写第一个ZooKeeper应用程序之前,你应该至少读过ZooKeeper数据模型和ZooKeeper基本操作。此外,简单示例程序也有助于理解ZooKeeper客户端应用程序的基本结构。ZooKeeper有一个分层
第四部分(第7章)对ZooKeeper的架构设计和实现原理进行了深入分析,包含系统模型、Leader选举、客户端与服务端的工作原理、请求处理,以及服务器角色的工作流程和数据存储等;第五部分(第8章)介绍了ZooKeeper的...
本文适合但不限于软件开发人员阅读。本文档能够使阅读者对zookeeper有一个宏观且全面的了解,内容主要包含zookeeper架构、数据模型、读写及工作原理、典型应用场景、指令汇总等,
介绍ZooKeeper服务的基础知识,并详细了解了数据模型及其属性
※ zk基础知识介绍 ※ zk数据模型介绍 ※ zk数据模型中znode的介绍 ※ zk数据监听 ※ zk的acl ※ zk单节点基本操作 ※ zk集群操作 ※ zk的java客户端操作
提供分布式数据一致性解决方案,分布式应用程序可以实现数据发布订阅、负载均衡、命名服务、集群管理分布式锁、分布式队列等功能。在大数据、分布式系统或架构中占有很重要的协调位置。 Dubbo是一款高性能、轻量级的...
Zookeeper概念 ZooKeeper是一个开源的分布式协调服务。 目标 主要用来解决分布式集群中应用系统的一致性问题,例如怎样避免同时操作同一数据造成...ZooKeeper 的数据模型,在结构上和标准文件系统的非常相似,拥有一个
它的设计易于编程,并使用在熟悉的文件系统目录树结构之后设计的数据模型。它运行在Java中,并且对Java和C都有绑定。 周所周知,协调服务是很难做到的。它们特别容易出现诸如竞态条件和死锁等错误。ZooKeeper背后的...
介绍 数据模型 节点 时间 stat结构 会话 监控 访问控制 可插拔的认证 一致性保证
Zookper很容易编程接入,它使用了一个和文件树结构相似的数据模型。 虽然ZooKeeper是一个Java应用程序,但C也可以使用。这里就有个PHP的扩展,你可以从PECL中下载,或从GitHub中直接获取PHP-ZooKeeper。 要使用该...
Zookeeper数据结构 1、层次化的目录结构,命名符合常规文件系统规范(类似文件系统) 2、每个节点在zookeeper中叫做znode,并且其有一个唯一的路径标识 3、节点Znode可以包含数据和子节点(但是...
业务需求:对已有交通数据进行分析建立模型,从而对未来交通堵车情况进行预测; # TrafficForecast SparkMLlib智慧交通项目 ## 项目需求 对已有交通数据进行分析建立模型,从而对未来交通堵车情况进行预测 ## 使用...
无论客户端连接的是集群中的哪台 Server,其读取到的数据模型中的数据都是一致的。 1.2.4 可靠性 一旦某事务被成功应用到了 zk,则会一直被保留下来,除非另一个事务将其修改。 1.2.5 最终一致性 一旦一个事务被成功...
Zookper很容易编程接入,它使用了一个和文件树结构相似的数据模型。可以使用Java或者C来进行编程接入。 众所周知,分布式的系统协作服务很难有让人满意的产品。这些协作服务产品很容易陷入一些诸如竞争选择条件或者...
在介绍 ZooKeeper 分布式锁前需要先了解一下 ZooKeeper 中节点(Znode),ZooKeeper 的数据存储数据模型是一棵树(Znode Tree),由斜杠(/)的进行分割的路径,就是一个 Znode(如 /locks/my_lock)。每个 Znode 上...
基于 Zookeeper 搭建 Hadoop 高可用集群 二、Hive 简介及核心概念 Linux 环境下 Hive 的安装部署 CLI 和 Beeline 命令行的基本使用 常用 DDL 操作 分区表和分桶表 视图和索引 常用 DML 操作 数据查询详解 三、Spark ...
ZooKeeper是一种为分布式应用所设计的高可用、高性能且一致的开源协调服务,是Google的Chubby...单一视图:无论客户端连接的是哪个ZooKeeper服务器,其看到的服务端数据模型都是一致的。可靠性:一旦服务端成功地应用了