Session会话
- 一个客户端连接一个会话,由zk分配唯一会话id
- 客户端以指定的时间间隔发送心跳以保持会话的有效tickTime
- 超过会话超时时间未收到客户端的心跳,则判断客户端死了(默认两倍tickTime)
- 会话中的请求按照FIFO顺序执行
数据模型
层次名称空间:
- 类似unix文件系统,以(/)为根
- 区别:节点可以包含与之关联的数据以及子节点(即是文件也是文件夹)
- 节点的路径总是表示为规范的、绝对的、斜杠分隔的路径
zonde:
- 名称唯一,命名规范
- 节点类型:持久、顺序、临时、临时顺序
- 节点数据构成
znode-节点类型: - 持久类型:create /app1 666
- 临时节点:create -e /app2 888
- 顺序节点:create -s /app1/cp 888
create -s /app1/ aa
10位十进制序号
每个父节点一个计数器
计数器是带服号的int(4字节)到2147483647之后讲溢出(导致名称“-2147483648”) - 临时顺序节点:create -e -s /app2 888
znode-数据构成
- 节点数据:存储的协调数据(数据信息、配置、位置信息等)
- 节点元数据(stat结构)
[zk: 127.0.0.1:2181(CONNECTED) 14] get /app1
666
cZxid = 0x22 创建该节点的zxid(事务ID)
ctime = Sun May 16 20:32:29 CST 2021
mZxid = 0x22 最后修改该节点的zxid(事务ID)
mtime = Sun May 16 20:32:29 CST 2021
pZxid = 0x2c 最后更新子节点的zxid
cversion = 5 该节点子节点变更次数
dataVersion = 0 该节点数据被修改次数
aclVersion = 0 访问控制列表变更次数
ephemeralOwner = 0x0 临时节点会话所有者会话id,不是临时节点为0
dataLength = 3 该节点数据长度
numChildren = 3 子节点数
- 数据量上限:1M (zk作为协调服务,数据量上限不应该大)
zk中的时间
- Zxid ZooKeeper中每次更改操作都对应一个唯一的事务id,称之为Zxid,它是一个全局有序的戳记,如果zxid1小以zxid2,则zxid1发生在zxid2之前。
- Version numbers 版本号,对节点的每次更改都会导致该节点的版本号增加1
- Ticks 当使用多服务器ZooKeeper时,服务器使用“滴答”来定义时间的时间,如状态上传、会话超时、对等点之间的连接超时等。滴答时间仅通过最小会话超时(2倍滴答时间)间接公开;如果客户端请求的会话超时时间小于最小会话时间,服务器讲告诉客户端会话超时间实际上时最小会话超时时间
- Real time ZooKeeper除了在znode创建和修改时间戳放在stat结构之外,根本不使用Real time或时钟时间。
Watch监听机制
客户端可以在zondes上设置watch,监听znode的变化
两类watch:
- data watch 监听数据变更
- chlid watch 监听子节点变化
触发wacth事件:
- 创建事件:exists()
- 删除事件:exists()、getData()、getChildren()
- 修改事件:exists()、getData()
- 子节点:getChildren()
watch重要特征:
- 一次性触发:watch触发后即被删除,要持续监听变化,则需要持续设置watch
- 有序性:客户端先得到wacth通知,后才会看到变化结果
watch注意事项:
- watch是一次性触发器,如果获得了一个watch事件,并希望得到关于未来的通知,则必须设置另一个watch
- 因为watch是一次性触发器,并在获取事件和发送获取watch的新请求之间存在延迟,所以不能可靠地得到节点发生的每个变更
- 一个wacth对象是会被特定的通知触发一次,如果一个watch对象同时注册了exists、getData,当节点被删除时,删除事件对exists、getData都有效,但只会调用watch一次