一、会话Session
zk客户端连接zk服务端创建会话,由zk服务端分配唯一会话id(session id)。
客户端在固定时间间隔(tickTime心跳检测时间)内向服务端发送心跳检测,超过会话超时时间(默认2倍tickTime),服务端未收到客户端心跳,认为客户端死亡。
会话请求按照FIFO顺序执行。
二、数据模型
1.层次名称空间
以 / 为根,节点路径是规范严格的绝对路径(斜杠 / 隔开)。节点既可以存储数据,也可以包含子节点。
2.节点znode
· 节点名称
不能为空,不能为特殊字符,不能以 . 表示相对路径(严格的绝对路径)
· 节点类型
持久节点(persistent znode):客户端断开连接,节点不丢失
create /path
临时节点(ephemeral znode):客户端断开连接,节点消失
create -e /path
顺序持久节点(sequential persistent znode):节点计数器生成10位10进制数(最大值2^31-1),添加在节点名称末尾
create -s /path
顺序临时节点(sequential ephemeral znode)
create -s -e /path
· 节点结构
包含存储数据,节点元数据(stat信息),上限1M大小。
节点元数据查看 get -s /path
三、ZooKeeper中的时间
zxid(事务id):zookeeper每次更改操作都对应一个唯一的事务id,全局有序的戳记,如果zxid1 < zxid2,表明zxid1在zxid2之前发生。
version numbers(版本号):对节点的每次更改都会导致节点版本号之一增加(stat信息中的xxVersion)。
real time(真实时间):仅在节点创建和修改时记录创建或修改时间(stat中展示cTime和mTime),其余地方不用。
ticktime(zk的基本时间单位):zk服务器定义事件的时间一般是ticktime的倍数,如状态上传、会话超时等。ticktime仅通过服务器配置的最小会话超时时间(ticktime的2倍)间接公开。
服务端告诉客户端的会话超时时间是客户端请求定义的会话超时时间和服务端配置的最小会话超时时间中的较大值。
四、Watch监听机制
客户端在znode上设置watch,监听znode的变化,设置watch监听参数 -w。
Watch重要特性
- 一次性触发:watch触发后即被删除,要持续监听变化,需要持续设置watch
- 有序性:客户端先得到watch通知,然后看到变化
Watch分类
- data watch 数据变化
- child watch 子节点变化
ls -w /path 监听子节点变化,get -w /path和stat -w /path 监听节点数据变化(三者都能监听到节点删除变化)
五、ZooKeeper特性
- 顺序一致性(Sequential Consistency):保证客户端请求按顺序执行
- 原子性(Atomicity):全部成功或失败,不存在部分结果
- 单个系统映像:无论连接到哪个服务器,客户端都将看到相同的内容
- 可靠性:数据的变更不会丢失,除非被客户端覆盖修改
- 及时性:保证系统的客户端能够读取到最新的数据