075. Zookeeper 核心概念

原创
2020/09/17 13:44
阅读数 32

1. session


image-20200607145559226

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

2. 数据模型


image-20200607150718665

层次空间名称

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

znode

  • 名称唯一,命名规范。

  • 节点类型:持久、顺序、临时、临时顺序。

  • 节点数据构成

znode-命名规范

  • 节点名称除以下限制外,可以使用任何 unicode 字符。
    • null 字符(\u0000)不能作为路径名的一部分;
    • 以下字符不能使用,因为它们不能很好地显示,或者以令人困惑的方式呈现:\u0001-\u0019 和 \u007F-\u009F。
    • 不允许使用以下字符:\ud800-\uf8ff,\uFFF0-\uFFFF。
    • “.” 字符可以用作另一个名称的一部分,但是 “.” 和 “..” 不能单独用于指示路径上的节点,因为 ZooKeeper 不适用相对路径。
      • 下列内容无效:“/a/b/./c” 或 “c/a/b/../”
    • “zookeeper” 是保留节点名。

znode-节点类型

  • 持久节点 - create /app1 666

  • 临时节点 - create -e /app2 888

  • 顺序节点

    • create -s /app1/cp 888 - cp0000000000

    • create -s /app1/ aa - 0000000001

    • 10 位十进制序号。

    • 每个父节点一个计数器。

    • 计数器是带符号 int(4 字节)到 2147483647 之后将溢出(导致名称“<path>-2147483648”)

  • 临时顺序节点 - create -e -s /app1/ 888

znode-数据构成

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

znode-元数据 stat 结构

image-20200607191839493

Stat 结构字段 描述
cZxid 创建该节点的 zxid(事务 id)
mZxid 最后修改该节点的 zxid
pZxid znode 最后更新的子节点 zxid
ctime 该节点的创建时间
mtime 该节点的最后修改时间
dataVersion 该节点数据被修改的次数
cversion 该节点的子节点变更次数
ephemeralOwner 临时节点的所有者会话 id,如果不是临时节点,则为 0
dataLength 该节点的数据的长度
numChildren 子节点数
aclVersion 访问控制列表变更次数

Zookeeper 中的时间

  • zxid:ZooKeeper 中的每次更改操作都对应一个唯一的事物 id,称为 Zxid,它是一个全局有序的戳记,如果 zxid1 小于 zxid2,则zxid1 发生在 zxid2 之前。
  • version numbers:版本号,对节点的每次更改都会导致该节点的版本号增加。
  • ticks:当使用多服务器 ZooKeeper 时,服务器使用“滴答”来定义事件的时间,如状态上传、会话超时、对等点之间的连接超时等。滴答时间仅通过最小会话超时(滴答时间的 2 倍)间接公开;如果客户端请求的会话超时小于最小会话超时,服务器将告诉客户端会话超时实际上是最小会话超时。
  • real time:ZooKeeper 除了在 znode 创建和修改时将时间戳放入 stat 结构之外,根本不使用 real time 或时钟时间。

3. Watch 监听机制


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

image-20200607203322425

image-20200607203827177

两类 watch

  • data watch:监听数据变化
  • child watch:监听子节点变化

触发 watch 事件

  • Created event: Enabled with a call to exists.
  • Deleted event: enabled with a call to exists, getData, and getChildren.
  • Changed event: Enabled with a call to exists and getData.
  • Child event: Enabled with a call to getChildren.

watch 重要特性

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

watch 注意事项

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

4. Zookeeper 特性


  • 顺序一致性(Sequential Consistency):保证客户端操作是按顺序生效的。
  • 原子性(Atomicity):更新成功或失败,没有部分结果。
  • 单个系统映像:无论连接哪个服务器,客户端都将看到相同的内容。
  • 可靠性:数据的变更不会丢失,除非被客户端覆盖修改。
  • 及时性:保证系统的客户端当时读取到的数据是最新的。
展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部