Zookeeper入门到实战(三) :Zookeeper的节点类型和监听机制

1.zookeeper的数据结构

在Zookeeper中,数据信息被保存在一个个数据节点上,这些节点被称为znode,是Zookeeper中的最小的数据单位,znode下可以在挂znode就像数结构一样一层一层挂载就构成了Znode树;称为ZNode Tree,类似于Linux文件系统的层级树桩结构进行管理。这里不太清楚的同学可以看我上一篇关于Zookeeper的介绍:Zookeeper入门到实战(一):zookeeper简介

如上图,每个数据节点就是一个ZNode,根目录下有data1和data2,它们下级分别有自己的子节点。所有的ZNode按层次进行组织,形成一棵树结构,和Linux的文件路径非常相似;都是由斜杠(/)进行路径的分割。开发者可以向某个节点写入数据,也可以在某个节点下创建子节点

1.2 ZNode的类型

我们已经知道Zookeeper的ZNode Tree是由一系列的ZNode组成的,而在Zookeeper中,ZNode也可以分为三类

  • 持久性节点 (Persistent)
  • 临时性节点 (Ephemeral)
  • 顺序性节点 (sequential)

一个节点要么是持久节点要么是临时节点,顺序性节点不能单独存在,必须和持久性节点或临时性节点进行组合,但持久性节点不能和临时性节点组合

ZNode节点的组合

因此,在实际应用中,通过组合或非组合一共可以生成四种类型的节点:持久节点持久顺序节点临时节点临时顺序节点 ; 不同的节点特性和生命周期有所不同:

  • 持久节点:是Zookeeper中最常见的一种节点类型,节点被创建后会一直存在服务器,直到客户端操作删除或者Zookeeper主动清除
  • 持久顺序节点:顾名思义就是有顺序的持久节点,节点具有持久节点的特性,只是比持久节点多了顺序性;顺序性的实质是创建节点的时候,会在节点名称后面加一个数字后缀(会递增);表示其顺序
  • 临时节点:生命周期和客户端关联,客户端会话结束,节点就会被删除掉,与持久性节点不同的是;临时性节点不能创建子节点
  • 临时顺序节点:有顺序的临时节点

2. 事务

有一定开发经验的的同学都知道,我们常说的事务是为了保证数据库的数据一致性和安全性;一般包含了一系列对数据库有序的读写操作,数据库事务具有所谓的ACID特性,即原子性(Atomic)、一致性(Consistency)、隔离性(lsolation)、持久性(Durability)

而在zookeeper中,事务是指能够修改zookeeper服务器数据的操作,也称为事务操作或更新操作;一般节点以及节点中的数据的创建、更新、删除都是属于事务操作,读取不属于事务操作;因为读取不会影响到服务器中的数据,对于每一个事务请求,zookeeper都会为其分配一个全局唯一的事务ID,用ZXID来表示;通常就是一个64位的数字,每一个ZXID对应一次更新操作;从这些ZXID中可以间接地识别出Zookeeper处理这些更新操作请求的顺序。

3. ZNode的状态信息

首先我们使用zookeeper提供的bin/下的zkCli.sh来连接到zookeeper集群(Zookeeper入门到实战 (二) : Centos7下安装Zookeeper(单机模式和集群模式)),zkCli.sh可以理解为是zookeeper的客户端。

出现下图界面说明连接成功
连接成功示意图

3.1查看根节点的状态信息

zookeeper 中每个数据节点都有状态信息

# stat命令可以查看某个节点的状态信息,这里 stat / 表示查看根节点的状态信息
stat /

根节点的状态信息

# get 命令可以查看某个节点中的数据,这里 get / 表示查看根节点中的数据
get /

如下图可见,根节点中存储的数据为空
根节点中的数据

注意:新版本中使用stat查看状态信息,使用get查看节点中的数据;在老版本中是用get查看数据和状态信息,我这里使用的是3.7.0当前的最新版,因此我这里获取数据节点状态是stat获取节点数据是get命令

属性说明
cZxidCreate ZXID 表示节点被创建时的事务id
ctimeCreate time 表示节点创建的时间
mzxidModified ZXID 表示节点最后一次被修改的时间
mtimeModified Time 表示节点最后一次被修改的时间
pZxid表示该节点的子节点列表最后一次被修改时的事务Id,只有子节点列表变更才会更新pZxid,子节点内的数据变更不会更新
cversion表示子节点的版本号
dataVersion表示数据版本号
aclVersion表示acl版本
ephemeralOwner表示创建该临时节点时的会话sessionID,如果是持久性节点那么值为0
dataLength表示数据长度
numChildren表示直系子节点的数量

4.Watcher机制

Zookeeper入门到实战(一):zookeeper简介中有提到:“Zookeeper给客户端提供了监控存储在其内部的数据的功能,也就是说当Zookeeper内部的数据发生变化时,可以通过一定的机制让客户端程序感知到”,实现这一功能的其实就是监听(Watcher)机制,Zookeeper通过Watcher机制实现数据的发布/订阅功能;

发布/订阅模型(publish/subscribe): 一个典型的发布订阅模型定义了一种一对多的订阅关系,能够让多个订阅者同时监听某一个发布者(publish),当发布者发送消息时,所有的订阅者(subscribe)都能能收到消息;并作出响应的处理,举个栗子:我们平时关注的微信公众号其实就是一个发布者;而我们关注微信公众号,其实就是订阅了它,订阅了之后它每次发布新的消息我们都能接收的到。![根节点中的数据]

zookeeper引用了Watcher机制来实现这种发布/订阅的功能,zookeeper允许客户端向服务端注册一个Watcher监听,当服务器的一些指定事件触发了Watcher,那么zookeeper就会向执行的客户端发送一个通知来实现通知功能

zookeeper的Watcer主要有客户端客户端的watcherManagerZookeeper服务器;基本流程为:

  1. 客户端向Zookeeper服务器注册的时候,会将Watcher对象存储在客户端的WatcherManager当中,
  2. 当Zookeeper服务器触发Watcher之后,会向客户端发送通知;Watcher的属性会被改变
  3. 客户端从WatcherManager中取出对应的Watcher对象来执行相应的业务逻辑

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值