ZK相关概念
zk是一个分布式协调框,可以用在分布式系统中的一些数据管理问题,比如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。
ZX的核心功能
主要就两个:文件系统数据结构 和 监听通知机制。
1. 文件系统数据结构
每个子目录项都被称作为znode(目录节点)。主要有几种类型的znode节点:
- Persistent 持久化目录节点:客户端和zk断开连接之后,节点依旧存在,手动不删除永远存在。
- Persistent_Sequential 持久化顺序编号目录节点:客户端与zk断开连接之后,节点仍然存在,一个有序节点被分配一个唯一的单调递增的整数。
- Ephemeral 临时目录节点:客户端会话超时或者和zk断开连接之后,节点被删除。
- Ephemeral——Sequential 临时顺序编号目录节点:客户端和zk断开连接之后,该节点被删除,只是zk给该节点名称进行顺序编号。
- Container节点(3.5.3版本新增)容器节点:如果Container节点下面没有子节点,则Container节点在未来被Zk自动清除掉,定时任务默认60s检查一次。
- TTL节点:需要配置开启,自动过期的功能不稳定。
2. 监听通知机制
客户端注册监听它关心的任意节点,或者目录节点及递归子目录节点。ZK使用监听和通知模式来避免客户端轮询,当节点发生更改或者被删除,监听节点的客户端都能收到通知。
无论是对目录变化的监听还是对数据变化的监听,都是一次性的,收到一次事件之后,再次发生变更是不会触发这个客户端的。
- 主动推送,避免轮询
- 一次性。再次监听需要再次注册Watcher
- 顺序性:如果更新了多个Watcher,那么Watcher通知顺序和更新顺序一致。
zk配置文件中的一些配置
- 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信息。
- 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:子节点监听被移除
注意:一次操作可能触发多个事件:
下边注册了对节点的递归目录节点监听,然后删除一个子节点触发了节点删除和子节点列表变化两个事件。
zk的内存数据和持久化
ZK在内存中的数据
ZK的事务日志
zk会把客户端的事务操作(创建节点、删除节点、变更数据等)记录在事务日志中,对应的目录是在配置文件中用dataLogDir指定,如果没有使用dataDir。
这里能看到如果每个命令都去写对应的文件,那么会频繁造成磁盘IO操作,ZK这里的事务日志不断的追加为文件开辟新的磁盘块。为了提高效率,ZK在创建事务日志文件的时候会进行文件空间的预分配。创建文件的时候,就向操作系统申请一块大一点的磁盘块。
事务日志是写多个文件的,用log.<当时最大事务ID>作为文件名称
ZK的数据快照
因为事务日志恢复速度慢,占用空间大,所以这里是用快照一起做数据日志持久化 的。
快照是某一时间的全量内存数据快照,恢复起来很快。而事务日志数据更全。一般数据恢复时先使用快照恢复某时刻的全量数据,再通过事务日志恢复更全的增量 数据。