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)
一个节点要么是持久节点要么是临时节点,顺序性节点不能单独存在,必须和持久性节点或临时性节点进行组合,但持久性节点不能和临时性节点组合
因此,在实际应用中,通过组合或非组合一共可以生成四种类型的节点:持久节点、持久顺序节点、临时节点、临时顺序节点 ; 不同的节点特性和生命周期有所不同:
- 持久节点:是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命令
属性 | 说明 |
---|---|
cZxid | Create ZXID 表示节点被创建时的事务id |
ctime | Create time 表示节点创建的时间 |
mzxid | Modified ZXID 表示节点最后一次被修改的时间 |
mtime | Modified 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主要有客户端、客户端的watcherManager、Zookeeper服务器;基本流程为:
- 客户端向Zookeeper服务器注册的时候,会将Watcher对象存储在客户端的WatcherManager当中,
- 当Zookeeper服务器触发Watcher之后,会向客户端发送通知;Watcher的属性会被改变
- 客户端从WatcherManager中取出对应的Watcher对象来执行相应的业务逻辑