分布式【Zookeeper三大核心之数据节点ZNode】

ZooKeeper在分布式领域,能够帮助解决很多很多的分布式难题,但是底层却只是依赖于两个主要的组件:ZNode文件/数据存储系统和watch监听系统,另外还有一大模块,就是ACL系统。本节我们介绍下znode文件/数据存储系统。

一、ZNode特性

在 ZooKeeper 中,每一个数据节点都被称为一个ZNode,所有ZNode按层次化结构进行组织,形成一棵树。ZNode文件/数据存储系统的作用就是为分布式应用存储少量关键的核心状态数,ZNode既能挂载子节点,也能存储数据。

所以总结说来,ZNode即是文件夹又是文件的概念,但是在ZooKeeper这里面就不叫文件也不叫文件夹,叫ZNode,每个ZNode有唯一的路径标识,既能存储数据,也能创建子 ZNode,但是 ZNode只适合存储非常小量的数据,不能超过1M,最好小于1K。

图片

ZNode的分类:

按照生命周期可以分为:

  • 短暂(ephemeral)(断开连接自己删除)
  • 持久(persistent)(断开连接不删除,默认情况)

按照是否自带序列编号可以分为:

  • SEQUENTIAL(带自增序列编号,由父节点维护)
  • 非SEQUENTIAL(不带自增序列编号,默认情况)

持久节点(PERSISTENT)

持久化znode节点,一旦创建这个znode节点,存储的数据不会主动消失,除非是客户端主动delete。

持久顺序节点(PERSISTENT_SEQUENTIAL)

自动增加自增顺序编号的znode节点,比如ClientA去zookeeper service上建立一个znode名字叫做 /zk/conf,指定了这种类型的节点后zk会创建 /zk/conf0000000000,ClientB再去创建就是创建 /zk/conf0000000001,ClientC是创建/zk/conf0000000002,以后任意Client 来创建这个znode都会得到一个比当前zookeeper命名空间最大znode编号+1的znode,也就说任意一个Client去创建znode都是保证得到的znode编号是递增的,而且是唯一的znode节点。

临时节点(EPHEMERAL)

临时znode节点,Client连接到zk service的时候会建立一个session,之后用这个zk连接实例在该session期间创建该类型的znode,一旦Client关闭了zookeeper的连接,服务器就会清除session,然后这个session建立的znode节点都会从命名空间消失。总结就是,这个类型的 znode的生命周期是和Client建立的连接一样的。比如ClientA创建了一个EPHEMERAL 的/zk/conf 的 znode 节点,一旦ClientA的zookeeper连接关闭,这个znode节点就会消失。整个zookeeper service命名空间里就会删除这个znode节点。

临时顺序节点(EPHEMERAL_SEQUENTIAL)

临时自动编号节点,znode节点编号会自动增加,但是会随session消失而消失。

注意点:

  • 创建 znode 时设置顺序标识,znode 名称后会附加一个值,顺序号是一个单调递增的计数器,由父节点维护
  • 在分布式系统中,顺序号可以被用于为所有的事件进行全局排序,这样客户端可以通过顺序号推断事件的顺序
  • EPHEMERAL 类型的节点不能有子节点,所以只能是叶子结点
  • 客户端可以在 znode 上设置监听器

二、节点状态

每个节点除了存储了数据内容的同时,还存储了节点本身的一些状态信息,我们在使用get命令获取数据节点时就能获取到这些信息。Zookeeper把这些信息封装在Stat类中:

状态属性说明
czxid表示该节点被创建时的事务ID
mzxid表示该节点最后一次被更新时的事务ID
ctime表示该节点被创建的时间
mtime表示该节点最后一次被更新的时间
version数据节点版本号
cversion子节点的的版本号
aversion节点的ACL版本号
ephemeralOwner创建该临时节点的会话sessionID,持久节点值为0
dataLength数据内容的长度
numChildren当前节点的子节点个数
pzxid表示该节点的子节点列表最后一次被修改时的事务ID

三、节点版本

每个数据节点具有三种类型的版本信息,对数据节点的任何更新操作都会引起版本号的变化:

版本类型说明
version当前数据节点数据内容的版本号
cversion当前数据节点子节点的版本号
aversion当前数据节点ACL变更版本号

Zookeeper中节点版本表示的是对数据节点的数据内容、子节点列表或是ACL信息的修改次数,以version为例:即使前后两次变更并没有使得数据内容的值发生变更,version的值依然会变更。

据内容、子节点列表或是ACL信息的修改次数,以version为例:即使前后两次变更并没有使得数据内容的值发生变更,version的值依然会变更。

而version属性是用来处理并发控制,实现乐观锁的写入校验的。在进行一次setDataRequest请求处理时,首先就会进行版本检查,Zookeeper会从setDataRequest中获取到当前请求的版本version,同时从数据记录nodeRecord中获取到当前服务器上该数据的最新版本currentVersion进行比对,如果两个版本不匹配,则会抛出异常。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/322974.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uniapp微信小程序投票系统实战 (SpringBoot2+vue3.2+element plus ) -后端架构搭建

锋哥原创的uniapp微信小程序投票系统实战: uniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )_哔哩哔哩_bilibiliuniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )共计21条视频…

VuePress部署到GitHub Pages

一、git push自动部署 1、创建用于工作流的文件 在项目根目录下创建一个用于 GitHub Actions 的工作流 .yml 文件 name: docson:# 每当 push 到 main 分支时触发部署push:branches: [main]# 手动触发部署workflow_dispatch:jobs:docs:runs-on: ubuntu-lateststeps:- uses: a…

Python-CSV文件的存储

CSV文件存储 CSV其文件以纯文本形式存储表格数据。CSV文件是一个字符序列,可以由任意数目的记录组成,各种记录由某种换行符分隔开。它比Excel文件更加简洁,XLS文本是电子表格,包含文本、数值、公式和格式等内容,CSV中则…

安装extiverse/mercury时报错

问题描述 作者在安装 Flarum 的插件 extiverse/mercury 时报错,内容如下图所示 解决方案 ⚠警告:请备份所有数据再进行接下来的操作,此操作可能会导致网站不可用! 报错原因:主要问题是在安装过程中解决依赖关系。具…

vue项目使用vue-pdf插件预览pdf文件

1、安装vue-pdf&#xff1a;npm install --save vue-pdf 2、使用 具体实现代码&#xff1a;pdfPreview.vue <template><div class"container"><pdfref"pdf":src"pdfUrl":page"currentPage":rotate"pageRotate&qu…

提升办公效率:掌握批量文件重命名的技巧

在日常生活和工作中&#xff0c;经常要处理大量的文件&#xff0c;如文档、图片、音频等。在这些情况下&#xff0c;会遇到要批量重命名文件的情况。如果一个一个地重命名&#xff0c;不仅耗时&#xff0c;而且效率低下。今天来讲解一些技巧通过批量重命名文件&#xff0c;从而…

【springboot+vue项目(零)】开发项目经验积累(处理问题)

一、VUEElement UI &#xff08;一&#xff09;elementui下拉框默认值不是对应中文问题 v-model绑定的值必须是字符串&#xff0c;才会显示默认选中对应中文&#xff0c;如果是数字&#xff0c;则显示数字&#xff0c;修改为&#xff1a; handleOpenAddDialog() {this.dialogT…

Android中的Intent

一.显式Intent 显示Intent是明确目标Activity的类名 1. 通过Intent(Context packageContext, Class<?> cls)构造方法 2.通过Intent的setComponent()方法 3.通过Intent的setClass/setClassName方法 通过Intent(Context packageContext, Class<?> cls)构造方法 通…

【bug】【VSCode】远程终端TERMINAL打不开

【bug】【VSCode】远程终端TERMINAL打不开 可能的原因现象分析解决 可能的原因 昨天晚上vscode在打开多个TERMINAL的情况下&#xff0c;挂了一晚上&#xff0c;今早上来看的时候全都lost connections…。然后关闭再打开就出现了如上现象。 早上一来到实验室就要debug… 现象…

谈谈自己对于 Spring IoC 的了解

如果你现在需要准备面试&#xff0c;可以关注我的公众号&#xff1a;”Tom聊架构“&#xff0c;回复暗号&#xff1a;”578“&#xff0c;领取一份我整理的50W字面试宝典&#xff0c;可以帮助你提高80%的面试通过率&#xff0c;价值很高&#xff01;&#xff01; IoC&#xff0…

Java 集合面试题之链表

Java 集合面试题之链表 文章目录 Java 集合面试题之链表链表单向链表单向链表时间复杂度分析双向链表双向链表时间复杂度分析面试题-ArrayList和LinkedList的区别是什么&#xff1f; 链表 单向链表 链表中的每一个元素称之为结点&#xff08;Node&#xff09; 物理存储单元上…

ssm基于web的素材网的设计与实现+vue论文

基于web的素材网站的设计与实现 摘要 当下&#xff0c;正处于信息化的时代&#xff0c;许多行业顺应时代的变化&#xff0c;结合使用计算机技术向数字化、信息化建设迈进。传统的素材信息管理模式&#xff0c;采用人工登记的方式保存相关数据&#xff0c;这种以人力为主的管理…