【ZooKeeper】核心概念

Session

  • 一个客户端连接一个会话,由zk分配唯一绘画id
  • 客户端以特定的时间间隔发送心跳以保持会话有效 tickTime
  • 超过会话超时时间未收到客户端的心跳,则判定客户端死了(默认2倍tickTime)
  • 会话中的请求按FIFO顺序执行

启动时拿到的session id

数据模型

层次名称空间

  • 类似unix文件系统,以 (/)为根
  • 区别:节点可以包含与之关联的数据以及子节点(既是文件也是文件夹)
  • 节点的路径总是表示为规范的、绝对的、斜杠分隔的路径

znode

节点我们称之为 znode,它有一下特点

  • 名称唯一,命名规范
  • 节点类型:持久、顺序、临时、临时顺序
  • 节点数据构成

znode 命名规范

节点名称除以下限制外,可以使用任何unicode字符

  • null字符(\u0000)不能作为路径名的一部分
  • 以下字符不能使用,因为它们不能很好地显示,或者以令人困惑的方式呈现:\u0001 - \u0019 和 \u007f - \u009f
  • 不允许使用以下字符: \ud800 - \uf8fff,\uFFF0 - \uFFFF
  • "."字符可以用作另一个名称的一部分,但是"."和".."不能单独用于指示路径上的节点,因为ZooKeeper不使用相对路径
  • “zookeeper”是保留节点

znode 节点类型

  • 持久节点 create /abc 666
  • 临时节点 create -e /abc 666 临时节点在会话断开后会被删除
  • 顺序节点 create -s /app/a 888 创建的节点为 a0000000000 (节点名称+一个序号)
    10位十进制序号
    每个父节点有一个计数器
    计数器是带符号的int(4字节),到2147483647之后将溢出(导致名称变为“<path>-2147483648”)
  • 临时顺序节点 create -e -s /app/a 888

znode 数据构成

  • 节点数据:存储的协调数据(状态信息、配置、位置信息等)
  • 节点元数据(stat结构)
  • 数据量上限:1M

元数据stat结构

[zk: localhost:2181(CONNECTED) 6] get -s /a
889
cZxid = 0xe
ctime = Sun Feb 21 17:25:46 CST 2021
mZxid = 0x13
mtime = Sun Feb 21 23:34:19 CST 2021
pZxid = 0xe
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 3
numChildren = 0
cZxid创建该节点的事务id
ctime创建该节点的时间
mZxid最后修改该节点的事务id
mtime最后修改该节点的时间
pZxid最后更新的子节点的事务id
cversion该节点的子节点变更次数
dataVersion该节点数据被修改的次数
aclVersion该节点权限被修改的次数
ephemeralOwner临时节点的所有者会话id,如果不是临时节点,则为0
dataLength该节点的数据长度
numChildren子节点数

访问控制列表(ACL)参考:https://zookeeper.apache.org/doc/current/zookeeperProgrammers.html#sc_ACLPermissions

ZooKeeper中的时间

Zxid:ZooKeeper中的每次更改操作都对应一个唯一的事务id,它是一个全局有序的戳记,如果zxid1小于zxid2,则zxid发生在zxid2之前
Version numbers版本号:对节点的每次更改都会导致该节点的版本号之一增加
Ticks:当使用多服务器ZooKeeper时,服务器使用“滴答”来定义事件的时间,如状态上传、会话超时、对等点之间的连接超时等。滴答时间是自己定义的,如:最小超时时间就是两个滴答
Real time:事实时间,ZooKeeper除了在znode创建和修改时将时间戳放入stat之外,其他不使用Real time或时钟时间

Watch 监听机制

客户端可以在znode上设置watch,监听znode的变化

命令行和java客户端添加监听的命令和方法如下图

两类watch
data watch 监听数据变更
child watch 监听子节点的变化

触发watch事件
创建事件:触发 exists
删除事件:触发 exists,getData,getChildren
变更事件:触发 exists,getData
子节点事件:触发 getChildren

watch重要特性
一次性触发:watch出发后即被删除,要持续监控变化,则需要持续设置watch
有序性:客户端先得到watch通知,后才会看到变化结果

watch注意事项
watch是一次性触发器;如果你获得了以下watch事件,并且希望得到关于未来更改的通知,则必须设置另一个watch
因为watch是一次性触发器,并且在获取事件和发送获取watch的请求之间存在延迟,所以不能可靠地得到节点发生的每个更改
一个watch对象只会被特定的通知触发一次。如果一个watch对象同时注册了exists、getData,当节点被删除时,删除事件对exists、getData都有效,但只会调用watch一次

# ZooKeeper 

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×