Fork me on GitHub

ZK简介和节点数据特性

ZK相关概念

zk是一个分布式协调框,可以用在分布式系统中的一些数据管理问题,比如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。

ZX的核心功能

主要就两个:文件系统数据结构 和 监听通知机制。

1. 文件系统数据结构

image-20220701071359620

每个子目录项都被称作为znode(目录节点)。主要有几种类型的znode节点:

  • Persistent 持久化目录节点:客户端和zk断开连接之后,节点依旧存在,手动不删除永远存在。
  • Persistent_Sequential 持久化顺序编号目录节点:客户端与zk断开连接之后,节点仍然存在,一个有序节点被分配一个唯一的单调递增的整数。
  • Ephemeral 临时目录节点:客户端会话超时或者和zk断开连接之后,节点被删除。
  • Ephemeral——Sequential 临时顺序编号目录节点:客户端和zk断开连接之后,该节点被删除,只是zk给该节点名称进行顺序编号。
  • Container节点(3.5.3版本新增)容器节点:如果Container节点下面没有子节点,则Container节点在未来被Zk自动清除掉,定时任务默认60s检查一次。
  • TTL节点:需要配置开启,自动过期的功能不稳定。

image-20220701071409397

2. 监听通知机制

客户端注册监听它关心的任意节点,或者目录节点及递归子目录节点。ZK使用监听和通知模式来避免客户端轮询,当节点发生更改或者被删除,监听节点的客户端都能收到通知。

无论是对目录变化的监听还是对数据变化的监听,都是一次性的,收到一次事件之后,再次发生变更是不会触发这个客户端的。

  • 主动推送,避免轮询
  • 一次性。再次监听需要再次注册Watcher
  • 顺序性:如果更新了多个Watcher,那么Watcher通知顺序和更新顺序一致。

zk配置文件中的一些配置

image-20220701071420140

  • tickTime:客户端和服务端维持心跳的间隔,单位是毫秒
  • initLimit:容忍的最大心跳失活次数。
  • syncLimit:集群中follower服务器和leader服务器之间的请求、应答最多容忍心跳数量。
  • dataDir:存放数据的目录。

ZK相关命令

create创建znode命令

create path data。 不加参数默认是持久化节点。

  • -e:临时节点
  • -s:顺序节点
  • -c:容器节点
  • -t:给节点加过期时间,需要通过参数启动。

注意临时节点不能有子节点目录。

get查看节点数据

get path

  • -s:查看数据的同时查看节点的state信息
  • -w:针对当前节点数据建立一个watch监听。

ls查看目录

  • -R:递归看子节点
  • -w:建立一个watch监听,监听目录节点变更
  • -s:查看目录信息的同时查看state信息。

state信息

可以查看节点的state信息。
image-20220701071433523

  • cZxid:创建znode的事务id(Zxid的值)
  • mZxid:最后修改znode的事务id。
  • pZxid:最后添加或删除子节点的事务id(子节点列表发生变化才会发生改变)
  • ctime:znode的创建时间
  • mtime:znode的最近修改时间
  • dataVersion:znode的当前数据版本。
  • cversion:znode的子节点结果集版本。(子节点增加、删除都会影响这个版本)
  • aclVersion:对此znode的acl版本
  • ephemeralOwner:znode是临时节点时,表示znode所有者的sessionId。如果znode是持久化节点不是临时节点,此值为null。
  • dataLength:znode数据字段的长度。

顺序节点的创建

create -s /path即可创建顺序节点。

zk中的事件类型

事件监听机制可以监听的事件有:

  • None:连接建立事件
  • NodeCreated:节点创建
  • NodeDeleted:节点删除
  • NodeDataChanged:节点数据变化
  • NodeChildrenChanged:子节点列表变化
  • DataWatchRemoved:节点监听被移除
  • ChildWatchRemoved:子节点监听被移除

注意:一次操作可能触发多个事件:
下边注册了对节点的递归目录节点监听,然后删除一个子节点触发了节点删除和子节点列表变化两个事件。
image-20220701071447892

zk的内存数据和持久化

ZK在内存中的数据

image-20220701071458982

ZK的事务日志

zk会把客户端的事务操作(创建节点、删除节点、变更数据等)记录在事务日志中,对应的目录是在配置文件中用dataLogDir指定,如果没有使用dataDir。

这里能看到如果每个命令都去写对应的文件,那么会频繁造成磁盘IO操作,ZK这里的事务日志不断的追加为文件开辟新的磁盘块。为了提高效率,ZK在创建事务日志文件的时候会进行文件空间的预分配。创建文件的时候,就向操作系统申请一块大一点的磁盘块。

事务日志是写多个文件的,用log.<当时最大事务ID>作为文件名称

image-20220701071509342

ZK的数据快照

因为事务日志恢复速度慢,占用空间大,所以这里是用快照一起做数据日志持久化 的。

快照是某一时间的全量内存数据快照,恢复起来很快。而事务日志数据更全。一般数据恢复时先使用快照恢复某时刻的全量数据,再通过事务日志恢复更全的增量 数据。

-------------本文结束感谢您的阅读-------------

本文标题:ZK简介和节点数据特性

文章作者:夸克

发布时间:2021年07月01日 - 07:07

最后更新:2022年07月01日 - 07:07

原始链接:https://zhanglijun1217.github.io/2021/07/01/ZK简介和节点数据特性/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。