zookeeper快速入门二:zookeeper基本概念

news2024/12/23 14:31:30

本文是zookeeper系列之快速入门中的第二篇,欢迎大家观看与指出不足。

目录

一、zookeeper的存储结构

二、什么是znode

三、znode节点的四种类型

四、权限控制ACL(Access Control List)

五、事件监听watcher


一、zookeeper的存储结构

zookeeper的存储结构极其类似于文件系统,都是树形结构,如下图所示。

ZooKeeper's Hierarchical Namespace

与文件系统不同的是,文件系统分为目录和文件,目录是没有数据的。而zookeeper则全部称为节点(znode),每个节点既能保存数据又有孩子节点。

zookeeper的根节点都是“/"。

每一个节点(znode)的命名空间(类似于java中的包名)都由其路径组成。zookeeper称上面这种结构为分层命名空间(Hierarchical Namespace)。

例如,根节点的命名空间为“/",第二层左节点的命名空间为”/app1",右节点的命名空间为“/app2”。

节点的命名空间我们又可以理解为是每个节点的标识符,程序能够根据名称定位到具体是哪个节点。

二、什么是znode

上图中的每个节点在zookeeper中称为znode。在zookeeper推荐在znode中存储的数据不超过1M,这是从性能和效率的角度出发。zookeeper作为协调分布式应用的服务中心,一般是存储状态信息、配置信息和本地数据等等。从设计的初衷上看也不是为了存储大量数据准备的。如果真的要存储大数据,应该把数据存储在别的地方比如数据库上,然后在znode上存储他们的引用。

znode在每次更新数据时,都是全量更新,直接覆盖以前的值,不存在追加或者修改其中某个地方的操作。读取数据也是全部读取。同时,znode的读取和写入都是原子操作。

znode还存储了znode版本信息有三个版本号dataversion(数据版本号)、cversion(子节点版本号)、aclversion(节点所拥有的ACL版本号)。每个版本号其实是一个数字,每次修改对应的版本号就会增加。

比如我们创建一个节点,create /zk "test"后,在linux下用get /zk后返回的信息如下:

test  #znode的数据

cZxid = 0x1e   #znode的创建事务id
ctime = Tue Sep 29 06:45:54 CST 2020 #znode的创建时间
mZxid = 0x1e  #znode的修改事务id
mtime = Tue Sep 29 06:45:54 CST 2020  #修改时间
pZxid = 0x1e  #该节点的子节点列表最后一次修改的版本号,添加子节点或删除子节点就会影响子节点列表,但是修改子节点的数据内容则不影响该值,孙子节点的操作也不影响
cversion = 0  #children节点的版本号,每次子节点修改加1,下同
dataVersion = 0 #数据版本号
aclVersion = 0  #ACL(权限控制列表)版本号
ephemeralOwner = 0x0  #如果节点为临时节点,那么它的值为这个节点拥有者的session ID;如果该节点不是ephemeral节点, ephemeralOwner值为0.
dataLength = 4 #数据长度
numChildren = 0 #孩子节点的数量

版本号的作用

Zookeeper里面的版本号和我们理解的版本号不同,它表示的是对数据节点的内容、子节点列表或者ACL信息的修改次数。节点创建时dataversion、aclversion,cversion都为0,每次修改响应内容其对应的版本号加1。

这个版本号的用途就和分布式场景的一个锁概念有关。比如演出售票中的一个座位,显然每个场次中的每个座位都只有一个,不可能卖出2次。如果A下单的时候显示可售,他想买,那么为了保证他可以下单成功,此时别人就不能买。这时候就需要有一种机制来保证同一时刻只能有一个人去修改该座位的库存。这就用到了锁。锁有悲观锁和乐观锁。

  • 悲观锁:它会假定所有不同事务的处理一定会出现干扰,数据库中最严格的并发控制策略,如果一个事务A正在对数据处理,那么在整个事务过程中,其他事务都无法对这个数据进行更新操作,直到A事务释放了这个锁。

  • 乐观锁:它假定所有不同事务的处理不一定会出现干扰,所以在大部分操作里不许加锁,但是既然是并发就有出现干扰的可能,如何解决冲突就是一个问题。在乐观锁中当你在提交更新请求之前,你要先去检查你读取这个数据之后该数据是否发生了变化,如果有那么你此次的提交就要放弃,如果没有就可以提交。

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

三、znode节点的四种类型

zookeeper有四种节点,临时节点,临时顺序节点,持久节点和持久顺序节点。

   3.1  临时节点

       当zookeeper的客户端申请zookeeper服务端创建临时节点时,节点的ephemeralOwner为此客户端与服务端的sessionId。当客户端与服务端断开连接时,临时节点也会被删除。

   3.2  临时顺序节点

当创建的是临时顺序节点时,会在节点名称后面增加序号,不断递增。

举个例子。比如申请创建的是/zk临时顺序节点,如果此时服务端没有/zk的节点,那么就会创建/zk-1节点。这时第二个请求过来了,也是创建临时顺序节点/zk,那么服务端就会创建/zk-2,依次是/zk-3,/zk-4......不断递增下去,一直到2^32。与临时节点一样的是,当客户端断开链接时,临时顺序节点也会被删除。

   3.3 持久节点

顾名思义,就是创建后除非主动删除,否则会一直存在的节点。

   3.4 持久顺序节点

当创建的是持久顺序节点时,举个例子。比如申请创建的是/zk临时顺序节点,如果此时服务端没有/zk的节点,那么就会创建/zk-1节点。这是有第二个请求过来了,也是创建临时顺序节点/zk,那么服务端就会创建/zk-2,不断递增下去,一直到2^32。与持久节点一样的是,创建后除非主动删除,否则会一直存在。

四、权限控制ACL(Access Control List)

ZooKeeper的权限控制是基于每个znode节点的,需要对每个节点设置权限。

zookeeper每个节点的权限类型有五种:create、read、delete、write、admin

CREATE:创建子节点的权限

READ:读节点数据的权限包括获取它的子节点列表的权限

DELETE:有删除子节点的权限

WRITE:写节点数据的权限

ADMIN:可以设置节点访问控制列表权限

zookeeper的授权策略(Scheme)有5种:world、auth、digest、ip、x509(有一些博客写了Super即超级管理员模式这个类型,可能是老版本,从3.4开始,官方文档介绍ACL的时候就没看到super了)

world:默认方式,全部都能访问,

auth:认证用户可以使用,(cli中可以通过addauth digest user:pwd 来添加当前上下文中的授权用户)

digest:即用户名:密码这种方式认证,这也是业务系统中最常用的。用 username:password 字符串来产生一个MD5串,然后该串被用来作为ACL ID。认证是通过明文发送username:password 来进行的,当用在ACL时,表达式为username:base64 ,base64是password的SHA1摘要的编码。

ip:使用客户端的主机IP作为ACL ID 。这个ACL表达式的格式为addr/bits ,此时addr中的有效位与客户端addr中的有效位进行比对。

       x509 :uses the client X500 Principal as an ACL ID identity. The ACL expression is the exact X500 Principal name of a client. When using the secure port, clients are automatically authenticated and their auth info for the x509 scheme is set.

ACL 权限控制,使用:scheme:id:perm 来标识,主要涵盖 3 个方面:权限模式(Scheme):授权的策略   授权对象(ID):授权的对象    权限类型(Permission):授予的权限。权限模式和权限类型就是上文所讲,授权对象(ID)很好理解,就是权限赋予的用户或者一个实体,例如:IP 地址或者机器。

五、事件监听watcher

zookeeper可以向节点注册一个watcher,用来监听节点的变化。当节点状态发生变化时,比如说被删除或者修改,那么它就会发送通知到监听这个节点的客户端,客户端因此而做出自己的操作。

每个注册仅使用一次,也就是当发生一次节点改变,通知完客户端之后,如果你需要这个节点下次发生改变时也发送通知到这个客户端,那么就需要再注册一次监听。

下一篇:zookeeper快速入门三:zookeeper的基本操作

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

消息队列思想学习(以及池化思想延展)

目录 消息队列的功能 消息中间件必备 池化思想以及弹性线程池的设计 弹性连接池 [核心参数:初始连接数,最大连接数,最大空闲时间] 弹性线程池 [核心参数:coreThreadCount, maxThreadCount] 引言:为啥要把消息队列…

C语言从入门到熟悉------第五阶段

结构体 结构体很重要,一定要掌握。但是在很多C语言书籍中结构体的内容讲得非常少,因为从结构体开始,后面介绍的内容已经超出C语言基础的范畴,属于C高级编程部分了。仅仅具备前面的知识是远远不够的,因为在实际编程中&…

用 Visual Studio 调试器中查看内存中图像

返回目录:OpenCV系列文章目录(持续更新中......) 前一篇:OpenCV4.9.0在windows系统下的安装 后一篇: ​警告 本教程可以包含过时的信息。 Image Watch 是 Microsoft Visual Studio 的插件,可用于在调…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Rating)

提供在给定范围内选择评分的组件。 说明: 该组件从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 子组件 无 接口 Rating(options?: { rating: number, indicator?: boolean }) 从API version 9开始&#…

linux源配置:ubuntu、centos

1、ubuntu源配置 1)先查电脑版本型号: lsb_release -c2)再编辑源更新,源要与上面型号对应 参考:https://midoq.github.io/2022/05/30/Ubuntu20-04%E6%9B%B4%E6%8D%A2%E5%9B%BD%E5%86%85%E9%95%9C%E5%83%8F%E6%BA%90/ /etc/apt/…

海外直播带货对直播网络的要求

海外直播带货已成为电商领域的热门趋势,吸引了越来越多的品牌和商家参与。然而,要实现成功的海外直播带货,稳定、高效的直播网络是至关重要的。以下是海外直播带货对直播网络的主要要求: 1、稳定的网络连接: 海外直播带…

业务场景解析——如何执行重要的批次任务

业务场景解析之——如何执行批次重要的任务 前言一、流程时序二、并发设计 前言 这次业务场景上需要跑一批任务识别任务,而每个具体任务识别都比较重要,需要调用外部接口进行计费,而量又比较大,这就要求这个任务是比较稳定安全的。…

macbook删除软件只需几次点击即可彻底完成?macbook删除软件没有叉 苹果笔记本MacBook电脑怎么卸载软件? cleanmymac x怎么卸载

在MacBook的使用过程中,软件安装和卸载是我们经常需要进行的操作。然而,不少用户在尝试删除不再需要的软件时,常常发现这个过程既复杂又耗时。尽管MacOS提供了一些基本的macbook删除软件方法,但很多时候这些方法并不能彻底卸载软件…

实验室管理系统 |基于springboot框架+ Mysql+JSP技术+Tomcat的实验室管理系统 设计与实现(可运行源码+数据库+设计文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 目录 用户后台功能模块 用户后台管理 管理员功能登录前台功能效果图 系统功能设计 数据库E-R图设计 lunw…

怎么利用视频截取gif?三步在线转换gif

在当今的社交媒体和网络世界中,GIF图像已经成为了一种非常受欢迎的表达方式。它们以简洁、循环播放的形式,能够生动地展示一系列图像的变化。你可能好奇,如何从视频中提取GIF图呢?很简单,使用视频转gif工具手机、pc均可…

爱发电开发者Webhook URL如何配置并且成功返回响应

Webhook URL 爱发电提供了webhook和api两种方式为开发者提供便利。 webhook功能需要配置好url,每当有订单时,会请求配置的url;API功能需要开发者通过token生成sign签名,主动请求接口查询历史订单 Webhook URL(用来被…

pta-猜帽子游戏

宝宝们在一起玩一个猜帽子游戏。每人头上被扣了一顶帽子,有的是黑色的,有的是黄色的。每个人可以看到别人头上的帽子,但是看不到自己的。游戏开始后,每个人可以猜自己头上的帽子是什么颜色,或者可以弃权不猜。如果没有…

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:Row)

沿水平方向布局容器。 说明: 该组件从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 子组件 可以包含子组件。 接口 Row(value?:{space?: number | string }) 从API version 9开始,该接口支持在…

Rust写一个wasm入门并在rspack和vite项目中使用(一)

rust打包wasm文档 文档地址 安装cargo-generate cargo install cargo-generate 安装过程中有问题的话手动安装cargo-generate下载地址 根据自己的系统下载压缩包,然后解压到用户/.cargo/bind目录下,将解压后的文件放到该目录下即可。 创建wasm项目 …

Microsoft Word 符号 / 特殊符号

Microsoft Word 符号 / 特殊符号 1. 插入 -> 符号 -> 其他符号 -> Wingdings 2References 1. 插入 -> 符号 -> 其他符号 -> Wingdings 2 ​ References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

VLC抓取m3u8视频

前言 最近想看一些网络视频,但是很多时候网页上是m3u8推流的,如果在线看,速度又慢,所以就想下载下来,就想到了VLC的推流,转换能力,查阅资料,加上实践,总结心得。 设置中…

腾讯云2核4g服务器能支持多少人访问?2C4G并发数性能测评

腾讯云轻量2核4G5M带宽服务器支持多少人在线访问?5M带宽下载速度峰值可达640KB/秒,阿腾云以搭建网站为例,假设优化后平均大小为60KB,则5M带宽可支撑10个用户同时在1秒内打开网站,并发数为10,经阿腾云测试&a…

如何在iPhone上恢复已删除的微信聊天记录?

你好,我前几天删除了微信聊天记录。有什么办法可以恢复iPhone上已删除的微信聊天记录吗? 有些人每次使用设备时都会遇到在 iPhone 上丢失消息的风险。特别是,由于多种因素,可能会丢失第三方数据,微信消息也是如此。微…

一瓶5.86万,听花酒什么来头?

听花酒,到底什么来头? 宣称有提升免疫力、改善睡眠、保障男性功能、调节生理紊乱、抗衰老等功效的听花酒,被315晚会曝光了。 相关话题词随即冲上了热搜。之后,售价最高达58600元的听花酒被京东、拼多多、淘宝等电商平台火速下架…

AcWing.505 火柴排队(离散化逆序对)

题目 涵涵有两盒火柴,每盒装有 n  根火柴,每根火柴都有一个高度。 现在将每盒中的火柴各自排成一列,同一列火柴的高度互不相同,两列火柴之间的距离定义为: ∑i1n(ai−bi)2 其中 ai表示第一列火柴中第 i个火柴的…