数据模型
zk采用层级命名空间存储数据,类似分布式文件系统结构,每一个节点通过路径唯一标示------ZNODE,每一个znode拥有数据访问控制权限、数据存储、状态、版本等信息。
znode基本特性:
- watches:监听者,客户端可以对znode添加监听,当znode发生状态变化时,zk会发送通知到client。详情:https://zookeeper.apache.org/doc/r3.4.9/zookeeperProgrammers.html#ch_zkWatches
- data access control: 基于znode的特殊性:znode本身不是专门用于数据存储的,而是用来管理分布式协作数据的,所以client可以对znode进行读写操作是需要做访问权限控制的,并且,每一个znode存储的数据默认不超过1M大小,所以对相应的写操作还需要做相关逻辑校验。
- ephemeral node:临时节点,该类型节点特性:生命周期和创建该节点的session保持一致(每一个client都会和zk server 保持一个session,session本身会有失效时间),一旦session过期,该节点会被自动删除,因此该类型节点不允许创建子节点。
- sequence node:顺序节点,对于同一个parent node下创建的节点,每新增一个节点都会给节点名称添加一个自增长的后缀标识。
- Time in znode:
- zxid
- version numbers
- ticks
- real time
- zk stat structure:
会话(Session)
客户端和zk集群之间会保持一个session用于客户端和服务端之间的通信session基本生命周期如下:
- connecting:连接状态,客户端试图连接server;
- connected:连接成功;
- closed:当一个正常的连接发生session失效、server主动关闭等情况时,会转入closed状态。
基本特性:
- 客户端和server间采用长连接
- 连接建立后,server产生session ID(64位)返还给客户端
- 客户端定期发送ping包来检查和保持和server的连接
- 一旦session结束或超时,所有ephemeral节点会被删除
- 客户端可根据情况设置合适的session超时时间
watches
client可以通过watche端对znode添加监听,一旦znode发生状态变化,client即会收到事件通知。基本特性:
- 当侦听的变化发生时,server发消息给客户端进行通知
- 客户端使用单线程对所有事件按顺序同步回调
- 触发回调条件:
- 客户端连接、断开连接
- 节点数据发生改变
- 节点本身发生变化
- Watch是单发的,每次触发后会被自动删除
- 如果需要再次侦听事件,必须重新安装watch
- 因为watch是One-time trigger,所以无法保证跟踪到每一个znode的变化
- 避免安装大量watches侦听在同一个节点
文档
中文文档:http://zookeeper.majunwei.com/document/3.4.6/DeveloperProgrammerGuide.html
官方文档:https://zookeeper.apache.org/doc/r3.4.9/zookeeperProgrammers.html#ch_guideToZkOperations
使用zk需要处理的一些问题:https://wiki.apache.org/hadoop/ZooKeeper/FAQ