当前位置: 首页 > news >正文

ZooKeeper 数据模型

ZooKeeper 数据模型

ZooKeeper 拥有层次化的命名空间,类似分布式文件系统,但每个节点不仅能有子节点,还可关联数据。节点路径为规范的绝对路径,用斜杠分隔,无相对引用。路径命名有如下约束:

  • 路径名不能包含空字符 \u0000
  • 不能使用显示不佳或易混淆的字符,如 \u0001 - \u001F\u007F\u009F
  • 禁止使用 \ud800 - \uF8FF\uFFF0 - \uFFFF 这些字符。
  • 虽然 . 可作为其他名称的一部分,但 ... 不能单独用于表示路径中的节点,因为 ZooKeeper 不使用相对路径。
  • 保留关键字 zookeeper 不可用。

1. ZNodes(ZooKeeper 节点)

  • 状态结构(Stat Structure):每个 ZNode 维护一个状态结构,包含数据变更、ACL 变更的版本号以及时间戳。版本号和时间戳用于验证缓存和协调更新。每次 ZNode 数据变更,版本号都会增加。客户端更新或删除数据时需提供版本号,若版本号不匹配,操作将失败(该行为可被覆盖)。
  • 节点角色定义:在 ZooKeeper 文档中,ZNode 指数据节点;服务器指构成 ZooKeeper 服务的机器;法定节点指构成集群的服务器;客户端指使用 ZooKeeper 服务的主机或进程。

2. Watches(监听机制)

客户端可对 ZNode 设置监听,ZNode 发生变化时触发监听并清除。监听触发后,ZooKeeper 会向客户端发送通知。

3. 数据访问

  • 原子性:命名空间中每个 ZNode 存储的数据读写是原子操作,读操作获取所有关联数据字节,写操作替换所有数据。
  • 访问控制:每个节点有访问控制列表(ACL),用于限制访问权限。
  • 数据规模:ZooKeeper 并非通用数据库或大对象存储,主要管理协调数据,数据通常较小(以千字节为单位)。客户端和服务器实现会检查确保 ZNode 数据小于 1M,实际数据应更小。处理大数据会增加操作时间和影响延迟,若需存储大数据,可将其存于 NFS 或 HDFS 等大容量存储系统,在 ZooKeeper 中存储指向这些存储位置的指针。

4. 特殊类型的 ZNodes

  • 临时节点(Ephemeral Nodes):只要创建该 ZNode 的会话处于活动状态,临时节点就存在。会话结束,ZNode 会被删除,且临时节点不允许有子节点。可使用 getEphemerals() API 获取会话创建的临时节点列表,常用于服务发现场景。
  • 顺序节点(Sequence Nodes):创建 ZNode 时,可要求 ZooKeeper 在路径末尾添加单调递增的计数器,该计数器对父节点唯一,格式为 %010d(10 位数字,前补 0)。计数器是父节点维护的有符号整数(4 字节),超过 2147483647 会溢出。
  • 容器节点(Container Nodes,3.6.0 版本引入):用于特定场景,如领导者选举、锁机制等。当容器的最后一个子节点被删除,容器节点未来某个时刻可能被服务器删除。创建容器节点的子节点时,要处理 KeeperException.NoNodeException 异常,若发生该异常需重新创建容器节点。
  • TTL 节点(TTL Nodes,3.6.0 版本引入):创建持久或持久顺序 ZNode 时,可选择设置以毫秒为单位的 TTL。若 ZNode 在 TTL 内未被修改且无子节点,未来某个时刻可能被服务器删除。默认情况下 TTL 节点功能禁用,需通过系统属性启用,否则创建时会抛出 KeeperException.UnimplementedException 异常。

5. ZooKeeper 中的时间跟踪

  • Zxid(ZooKeeper 事务 ID):ZooKeeper 状态的每次变更都会获得一个 Zxid 标记,体现所有变更的全局顺序。每个变更有唯一 Zxid,若 zxid1 < zxid2,则 zxid1 变更先于 zxid2 变更发生。
  • 版本号:节点的每次变更会使节点的某个版本号增加,包括数据版本号(version)、子节点版本号(cversion)和 ACL 版本号(aversion)。
  • Ticks:多服务器模式下,服务器用 Ticks 定义事件时间,如状态上传、会话超时、节点间连接超时等。Tick 时间通过最小会话超时(2 倍 Tick 时间)间接暴露,若客户端请求的会话超时小于最小会话超时,服务器会将实际会话超时设为最小会话超时。
  • 实时时间:ZooKeeper 仅在 ZNode 创建和修改时在状态结构中记录时间戳,不使用实时时间。

6. ZooKeeper 状态结构(Stat Structure)

每个 ZNode 的状态结构包含以下字段:

  • czxid:创建该 ZNode 的变更的 Zxid。
  • mzxid:最后修改该 ZNode 的变更的 Zxid。
  • pzxid:最后修改该 ZNode 子节点的变更的 Zxid。
  • ctime:该 ZNode 创建的时间(从纪元开始的毫秒数)。
  • mtime:该 ZNode 最后修改的时间(从纪元开始的毫秒数)。
  • version:该 ZNode 数据的变更次数。
  • cversion:该 ZNode 子节点的变更次数。
  • aversion:该 ZNode ACL 的变更次数。
  • ephemeralOwner:若该 ZNode 是临时节点,为其所有者会话 ID;否则为 0。
  • dataLength:该 ZNode 数据字段的长度。
  • numChildren:该 ZNode 的子节点数量。
http://www.lryc.cn/news/527327.html

相关文章:

  • 【VUE】Vue2中Vue.extend方法
  • MaskGAE论文阅读
  • Mybatis-plus 更新 Null 的策略踩坑记
  • Oracle迁移DM数据库
  • HTML特殊符号的使用示例
  • 数据结构基础之《(15)—排序算法小结》
  • Linux系统下速通stm32的clion开发环境配置
  • 【2024年 CSDN博客之星】我的2024年创作之旅:从C语言到人工智能,个人成长与突破的全景回顾
  • Python 轻松扫描,快速检测:高效IP网段扫描工具全解析
  • go入门Windows环境搭建
  • 安装Ubuntu22.04
  • 对比OpenAI的AI智能体Operator和智谱的GLM-PC,它们有哪些不同?
  • Git Bash 配置 zsh
  • 美格智能AIMO智能体+DeepSeek-R1模型,AI应用的iPhone时刻来了
  • Python标准库 - os (1) 环境变量、进程的用户和组
  • QT 通过ODBC连接数据库的好方法:
  • 机器学习 - 初学者需要弄懂的一些线性代数的概念
  • WordPress event-monster插件存在信息泄露漏洞(CVE-2024-11396)
  • ESP32 I2S音频总线学习笔记(二):I2S读取INMP441音频数据
  • 本地大模型编程实战(03)语义检索(2)
  • LabVIEW橡胶动态特性测试系统
  • SpringBoot开发(二)Spring Boot项目构建、Bootstrap基础知识
  • 使用 Vue 3 的 watchEffect 和 watch 进行响应式监视
  • Vue.js 高级组件开发
  • React应用深度优化与调试实战指南
  • Linux 内核学习(4) --- devfreq 动态调频框架
  • Spring Boot 无缝集成SpringAI的函数调用模块
  • Ansible自动化运维实战--yaml的使用和配置(7/8)
  • kamailio-5.8.4-centos9编译
  • 单例模式 - 单例模式的实现与应用