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

zookeeper-znode解析

一. 数据模型:

    ZK拥有一个命名空间就像一个精简的文件系统,不同的是它的命名空间中的每个节点拥有它自己或者它下面子节点相关联的数据。ZK中必须使用绝对路径也就是使用“/”开头。

二. znode:

    zk目录树中每个节点对应一个znode。每个znode维护一些属性,如:当前版本,数据版本,建立时间,修改时间等。

(注: 当设置一个znode节点的数据或读取时,znode节点的内容会被整个替换或全部读取出来)  。 
三. znode类型:
   当新建znode时,需要制定该节点当类型, 不同当类型决定了znode节点的行为方式。
   1.  持久节点:创建后只能通过delete进行删除,否则会一直存在 ,可以通过此类型的znode为应用保存相关数据,即使znode的创建者不在属于应用系统时,数据也可以保存。
2.  临时节点:与持久节点相反,当创建该节点当客户端崩溃或者关闭了与zk的连接时,节点就会被删除,临时节点也可以被非创建者主动删除。临时节点不允许有子节点(目前3.4.14版本)。
3.  持久有序节点:一个znode可以设置为有序节点,设置zode时被分为唯一一个单调递增的整数。当创建有序节点时,序号会被追加到路径后。
4.  临时有序节点:具有临时节点特征,但是它会有序列号,分布式锁中会用到该类型节点。

 创建持久有序节点:

(-s为有序,-e为临时, 默认为持久) 。

四.  znode 特性:

  1. 监视(watches):  zk通常以远程服务的方式被访问,如果每次访问znode时,客户端都需要获取节点中的内容,这样代价就很大(如果内容不变,就没有意义)。为了应对这种场景,zk提供了一个基于通知(notifaction)的机制,客户端可以向zk中的node设置watch,当zode节点发生变化(触发监视器)时,向客户端发送一个通知。需要注意的是:监视点是一个单次触发的操作,为接受多个通知,客户端必须在每次通知后设置一个新的监视点。
2. 数据访问:ZK上存储的数据需要被原子性的操作(要么修改成功要么回到原样),也是就读操作将会读取节点相关所有数据,写操作也会修改节点相关所有数据,,而且每个节点都有自己的ACL。

五. znode时间和版本号:

zxid:ZK节点状态改变会导致该节点收到一个zxid格式的时间戳,这个时间戳是全局有序的,每次更新都会产生一个新的。如果zxid1的值小于zxid2,那么说明zxid2发生的改变在zxid1之后。zxid是一个唯一的事务ID,具有递增性,一个znode的建立或者更新都会产生一个新的zxid值。

version:每一个znode都有一个版本号,随着每次数据变化而自增。有两个api操作可以有条件执行: setdata和delete,这两个调用以版本号作为传入参数,只有当传入参数的版本号与服务器上的版本号一致时,才会调用成功。

各字段内容解析:

 这个版本号的用途就和分布式场景的一个锁概念有关。修改节点数据之前会读取这个数据并记录该数据版本号,当你需要更新时会携带这个版本号去提交,如果你此时携带的版本号(就是你上次读取出来的)和当前节点的版本号相同则说明该数据没有被修改过,那么你的提交就会成功,如果提交失败说明该数据在你读取之后和提交之前这段时间内被修改了。

 通过set命令并携带版本号提交更新,版本号相同更新就会成功。

  --------------------------------------------------------------------------------------------------------------------------

                         深耕运维行业多年,擅长运维体系建设,方案落地。欢迎交流!

                                                     “V-x”: ywjw996

                                                     《 运维经纬 》

http://www.dtcms.com/a/349314.html

相关文章:

  • 【P2P】P2P主要技术及RELAY服务实现
  • 前端 Promise 全面深入解析
  • Unity中的特殊文件夹
  • 【Python】在 Pydantic 模型中使用非 Pydantic 定义的类作为模型字段类型
  • Java项目-苍穹外卖_Day2
  • 8 设计URL短链
  • rust语言 (1.88) egui (0.32.1) 学习笔记(逐行注释)(二十) 文件、文件夹选择框、保存文件框
  • qt配置ros2环境,简单版本
  • Rust:变量、常量与数据类型
  • 2025 突出的时序模型
  • 【C语言强化训练16天】--从基础到进阶的蜕变之旅:Day13
  • Linux-Redis的安装
  • 第四章:并发编程的基石与高级模式之Select语句与多路复用
  • 【Linux】开发工具命令指南:深度解析Vim的使用操作
  • Allegro17.4导出带有NET的PDF文档及组装样式图
  • MongoDB vs MySQL:NoSQL 和 SQL 的核心区别与适用场景
  • 前端开发:详细介绍npm、pnpm和cnpm分别是什么,使用方法以及之间有哪些关系
  • CPTS-Pressed复现(XML-RPC)
  • Python 面向对象进阶:深入理解封装、继承与多态
  • 【C++】第二十六节—C++11(中) | 右值引用和移动语义(续集)+lambda
  • 验证码流程
  • 【AMBA总线互联IP】
  • 6、RocketMQ消息积压问题如何解决
  • QSpinBox的用法及其使用QSS对其美化
  • 【ElasticSearch】json查询语法和可用的客户端
  • Docker 在线安装 RabbitMQ
  • 开源 C++ QT Widget 开发(五)通讯--串口调试
  • NILMTK(非侵入式负载监测工具包)安装
  • Linux 进阶之性能调优,文件管理,网络安全
  • AI精准种植改写农业格局:亩产量提升18%+水资源利用率提高32%,破解小农户技术门槛难题