ZooKeeper数据模型Znode

在ZooKeeper中,数据信息被保存在⼀个数据节点上,这些节点被称为znode。ZNode 是 Zookeeper 中最小数据单位,在 ZNode 下⾯又可以再挂 ZNode,这样⼀层下去就形成了一个层次化命名空间 ZNode 树,我们称为 ZNode Tree,它采⽤了类似⽂件系统的层级树状结构进行管理。⻅下图示例:

Znode.png

在 Zookeeper 中,每一个数据节点都是⼀个 ZNode,上图根⽬录下有两个节点,分别是:app1 和 app2,其中 app1 下面又有三个⼦节点,所有ZNode按层次化进⾏组织,形成这么一颗树,ZNode的节点路径标识⽅式和Unix文件系统路径⾮常相似,都是由⼀系列使用斜杠(/)进行分割的路径表示,开发人员可以向这个节点写入数据,也可以在这个节点下面创建⼦节点。

ZNode的类型

三大类

  • 持久性节点(Persistent)

  • 临时性节点(Ephemeral)

  • 顺序性节点(Sequential)

创建节点可以生成以下四种节点类型:持久节点、持久顺序节点、临时节点、临时顺序节点。不同类型的节点则会有不同的生命周期。

  • 持久节点:是Zookeeper中最常见的⼀种节点类型,所谓持久节点,就是指节点被创建后会⼀直存在服务器,直到删除操作主动清除

  • 持久顺序节点:就是有顺序的持久节点,节点特性和持久节点是一样的,只是额外特性表现在顺序上。顺序特性实质是在创建节点的时候,会在节点名后⾯加上一个数字后缀,来表示其顺序。

  • 临时节点:就是会被⾃动清理掉的节点,它的生命周期和客户端会话绑在一起,客户端会话结束,节点会被删除掉。与持久性节点不同的是,临时节点不能创建子节点。

  • 临时顺序节点:就是有顺序的临时节点,和持久顺序节点相同,在其创建的时候会在名字后面加上数字后缀。

事务ID

首先,先了解,事务是对物理和抽象的应用状态上的操作集合。往往在现在的概念中,?狭义上的事务通常指的是数据库事务,⼀般包含了一系列对数据库有序的读写操作,这些数据库事务具有所谓的ACID特性,即原子性(Atomic)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。

⽽在ZooKeeper中,事务是指能够改变ZooKeeper服务器状态的操作,我们也称之为事务操作或更新操作,⼀般包括数据节点创建与删除、数据节点内容更新等操作。对于每⼀个事务请求,ZooKeeper都会为其分配一个全局唯一的事务ID,⽤用ZXID来表示,通常是一个 64 位的数字。每一个 ZXID对应⼀次更新操作,从这些ZXID中可以间接地识别出ZooKeeper处理这些更新操作请求的全局顺序

zk中的事务指的是对zk服务器状态改变的操作(create,update data,更新字节点);zk对这些事务操作都会编号,这个编号是自增长的被称为ZXID。

ZNode的状态信息

# 使用bin/zkCli.sh 连接到zk集群get /zookeeper

## 第一行返回空

cZxid = 0x0ctime = Wed Dec 31 19:00:00 EST 1969 mZxid = 0x0mtime = Wed Dec 31 19:00:00 EST 1969 pZxid = 0x0cversion = -1dataVersion = 0aclVersion = 0ephemeralOwner = 0x0dataLength = 0numChildren = 1

整个ZNode节点内容包括两部分:节点数据内容和节点状态信息。数据内容是空,其他的属于状态信息。那么这些状态信息都有什么含义呢?

  • cZxid 就是 Create ZXID,表示节点被创建时的事务ID。

  • ctime 就是 Create Time,表示节点创建时间。

  • mZxid 就是 Modified ZXID,表示节点最后一次被修改时的事务ID。

  • mtime 就是 Modified Time,表示节点最后⼀次被修改的时间。

  • pZxid 表示该节点的⼦子节点列列表最后一次被修改时的事务 ID。只有子节点列表变更才会更新 pZxid,子节点内容变更不会更新。

  • cversion 表示⼦节点的版本号。

  • dataVersion 表示内容版本号。

  • aclVersion 标识acl版本

  • ephemeralOwner 表示创建该临时节点时的会话 sessionID,如果是持久性节点那么值为 0

  • dataLength 表示数据⻓长度。

  • numChildren 表示直系⼦子节点数。

Wacher机制

Zookeeper使用Watcher机制实现分布式数据的发布/订阅功能

一个典型的发布/订阅模型系统定义了一种一对多的订阅关系,能够让多个订阅者同时监听某一个主题对象,当这个主题对象⾃身状态变化时,会通知所有订阅者,使它们能够做出相应的处理。

在 ZooKeeper 中,引⼊了 Watcher机制来实现这种分布式的通知功能。ZooKeeper允许客户端向服务端注册一个 Watcher 监听,当服务端的⼀些指定事件触发了这个Watcher,那么Zk就会向指定客户端发送一个事件通知来实现分布式的通知功能。

整个Watcher注册与通知过程如图所示。

Watcher注册与通知过程.png

Zookeeper的Watcher机制主要包括客户端线程、客户端WatcherManager、Zookeeper服务器三部分。

具体⼯工作流程为:

  1. 客户端在向Zookeeper服务器注册的同时,会将Watcher对象存储在客户端的WatcherManager当中

  2. 当Zookeeper服务器触发Watcher事件后,会向客户端发送通知

  3. 客户端线程从WatcherManager中取出对应的Watcher对象来执⾏回调逻辑

Zookeeper的基本使用

Zookeeper命令行操作

./zkcli.sh 连接本地的zookeeper服务器器./zkCli.sh -server ip:port(2181) 连接指定的服务器器

链接上服务器后:

 help

ZooKeeper -server host:port cmd argsstat path [watch]set path data [version]ls path [watch]delquota [-n|-b] pathls2 path [watch]setAcl path aclsetquota -n|-b val path historyredo cmdnoprintwatches on|offdelete path [version]sync pathlistquota pathrmr pathget path [watch]create [-s] [-e] path data acl addauth scheme authquitgetAcl pathcloseconnect host:port
创建节点
 create [-s][-e] path data  其中,-s或-e分别指定节点特性,顺序或临时节点,若不指定,则创建持久节点
  1. 创建永久顺序节点

create -s /zk-test 123
  1. 创建临时节点

 create -e /zk-temp 123 退出本次链接后,改节点自动删除
  1. 创建永久节点

create /zk-permanent 123
  1. 创建临时顺序节点

create -s -e /zk-permanent-test 123退出本次链接后,改节点自动删除
读取节点

展示路径信息:

ls /{path}其中,{path}表示的是指定数据节点的节点路径

get命令可以获取Zookeeper指定节点的数据内容和属性信息。

get path
更新节点
set path datadata就是要更新的新内容
删除节点
delete path

若删除节点存在子节点,那么无法删除该节点,必须先删除子节点,再删除⽗节点

Zookeeper-开源客户端

ZkClient

ZkClient是Github上一个开源的zookeeper客户端,在Zookeeper原⽣API接⼝之上进⾏了了包装,是⼀个更易用的Zookeeper客户端,同时,zkClient在内部还实现了了诸如Session超时重连、Watcher反复注册等功能.接下来,还是从创建会话、创建节点、读取数据、更新数据、删除节点等⽅面来介绍如何使用zkClient 这个zookeeper客户端

添加依赖
<dependency>  <groupId>org.apache.zookeepergroupId>  <artifactId>zookeeperartifactId>  <version>3.4.14version>dependency><dependency>  <groupId>com.101tecgroupId>  <artifactId>zkclientartifactId>  <version>0.2version>dependency>
创建会话
public class ZkDemo {

    public static void main(String[] args) {        // 获取ZkClient对象,客户端与集群通信的端口是2181        //建立了到ZK集群的会话        ZkClient zkClient = new ZkClient("linux122:2181");        System.err.println("zkClient is ready");    }

}

运行结果:ZooKeeper session created 。结果表明已经成功创建会话。

创建节点

ZkClient提供了递归创建节点的接⼝,即其帮助开发者先完成父节点的创建,再创建⼦节点

public class ZkCreateNode {    public static void main(String[] args) {        ZkClient zkClient = new ZkClient("linux122:2181");        //副节点不存在,直接创建自节点,属于及联创建,createPersistent方法默认不及联创建        zkClient.createPersistent("/lagouClient/lagou-c1", true);        System.err.println("创建成功");    }}
删除节点
public class ZkDeleteNode {    public static void main(String[] args) {        ZkClient zkClient = new ZkClient("linux122:2181");        //delete删除的方式,只能删除目录下没有子节点的目录//        zkClient.delete("/hhb-test");

        //及联递归的删除,把要删除的目录下面的子节点全都删除。        //是先删除子节点,在删除父节点        zkClient.deleteRecursive("/lagouClient");    }}

zookeeper中展示所有节点_Zookeeper数据结构与监听机制相关推荐

  1. zookeeper中展示所有节点_zookeeper工作原理与节点使用

    目录 zookeeper集群的搭建: 配置解释: 特点: 常规搭建方式,进行操作: A.关闭防火墙(测试环境) B.启动 服务,每个规划的 zookeeper 节点都要进行启动 C.启动客户端 D.命 ...

  2. zookeeper中展示所有节点_Zookeeper系列一:Zookeeper基础命令操作

    有些事不是努力就可以改变的,五十块的人民币设计的再好看,也没有一百块的招人喜欢. 前言 由于公司年底要更换办公地点,所以最近投了一下简历,发现面试官现在很喜欢问dubbo.zookeeper和高并发等 ...

  3. zookeeper中展示所有节点_分布式协调服务之Zookeeper

    ??理论篇 一.基础概念 ZooKeeper是开源分布式协调服务,提供高可用.高性能.稳定的分布式数据一致性解决方案,通常被用于实现诸如数据发布/订阅.负载均衡.命名服务.分布式协调/通知.集群管理. ...

  4. zookeeper中展示所有节点_记录一次zookeeper集群其中一节点在hbase web页面中显示Connection rese...

    集群环境: nn1,view和dn1三节点部署的zookeeper集群,gezookeeper进程均已启动 hbase web页面显示zk_dump信息如下 日志输出信息如下: shell> t ...

  5. Ⅵ:zookeeper的Watcher事件监听机制

    2021最新zookeeper系列 ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤ ...

  6. Zk监听机制入门和节点属性信息

    zk监听主要是监听:节点创建,节点删除,节点改变.子节点改变 我这里用node-1和node-3同时连接node-1 zk客户端监听功能一般步骤: 1.客户端设置监听事件 命令:get 节点 watc ...

  7. Zookeeper监听机制

    1.1 监听器原理 首先要有一个main()线程 在main()线程中创建Zookeeper客户端,这时就会创建两个线程connect线程负责网络连接通信,listen线程负责监听 通过connect ...

  8. Apache ZooKeeper - 事件监听机制详解

    文章目录 事件监听机制命令 Zookeeper事件类型 实操 -w get -w /path 监听节点数据的变化 ls -w /path 监听子节点的变化(增,删) [监听目录] ls -w /pat ...

  9. oracle rac添加监听,【学习笔记】Oracle 10G RAC增加节点时手动注册监听服务的案例步骤...

    [学习笔记]Oracle 10G RAC增加节点时手动注册监听服务的案例步骤 时间:2016-10-22 22:53   来源:Oracle研究中心   作者:HTZ   点击: 次 天萃荷净 Ora ...

最新文章

  1. Scala堆的方式进行Spark topK词频查询(根据value进行TreeMap排序)
  2. 读书笔记_unity4.x第十二章_3D数学基础
  3. java maven导入导出_Java +EasyUI+SpringMvc实现Excle导入导出(上)
  4. 合并相同数据的行_R语言笔记(六):数据框重塑(reshape2)
  5. activiti 文档_免费、开源、多平台的PDF文档处理软件——PDFsam Basic
  6. JavaFX布局中图片在表格中无法被自适应缩小?
  7. 小学生也能看懂的ArrayList底层原理
  8. 页面缓冲滚动到指定位置
  9. spark视频-spark机器学习
  10. 最流行的轻量级php框架,GitHub - meolu/zan: zan 轻量级PHP微框架
  11. 2016-06-17 nui构件隐藏时相关属性的设置 bug命名【彩虹】
  12. dev分支clone时git报错:'origin/dev' is not a commit and a branch 'dev' cannot be created from it
  13. MATLAB当中reshape函数以及转置的使用
  14. 安装配置limesurvey
  15. 视频点播服务器项目,项目九搭建视频点播vod服务器美萍vod.doc
  16. rust的所有权与引用
  17. 2.4g和5g要不要合并_路由器WiFi的2.4g和5g要不要合并?
  18. SDNU-1183.纪念品分组
  19. Python之数据载入、存储及文件格式
  20. MySQL 常用函数(二)

热门文章

  1. Go的string/int/int64转化
  2. antd 设置表头属性_纯css实现固定表头和锁定列
  3. 计算机地址永无符号数表示,计算机如何区分 有符号 无符号数的区别???
  4. java 存储过程 数组_Java调用存储过程返回数组
  5. signature=a7ab3f52fd3143e911ffec68c5ce32d7,2019年强网杯crypto部分题解
  6. c语言六套,C语言编程笔试题(第六套)
  7. php 判断设备来源,PHP判断移动设备来源的方法
  8. gamma分布_深度学习需要掌握的 13 个概率分布(附代码)
  9. android+ebook控件,Android 自定义控件 eBook 翻书效果
  10. mysql 实时备份_MySQL实现实时备份[转]