前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >进阶分布式系统架构系列(五):Zookeeper 节点(znode)详解

进阶分布式系统架构系列(五):Zookeeper 节点(znode)详解

作者头像
民工哥
发布2023-08-24 09:42:31
1.6K0
发布2023-08-24 09:42:31
举报
文章被收录于专栏:民工哥技术之路

今天我们来聊聊 ZooKeeper 中,关于节点(znode)的一些概念。

节点详解

Znode有两种,分别为临时节点和持久节点。节点的类型在创建时即被确定,并且不能改变。

  • 临时节点:该节点的生命周期依赖于创建它们的会话。一旦会话结束,临时节点将被自动删除,当然可以也可以手动删除。临时节点不允许拥有子节点。
  • 永久节点:该节点的生命周期不依赖于会话,并且只有在客户端显示执行删除操作的时候,他们才能被删除。

Znode还有一个序列化的特性,如果创建的时候指定的话,该Znode的名字后面会自动追加一个不断增加的序列号。序列号对于此节点的父节点来说是唯一的,这样便会记录每个子节点创建的先后顺序。它的格式为“%10d”(10位数字,没有数值的数位用0补充,例如“0000000001”)。

Znode兼具文件和目录两种特点
代码语言:javascript
复制
1.即像文件一样维护着数据,元信息 ACL 时间戳等数据结构。
2.又像目录一样可以作为路径标示的一部分,并可以具有子Znode,。
3.用户可以对Znode具有增删改查等操作(权限允许的情况下)。
Znode具有原子性操作
代码语言:javascript
复制
1.读操作将获取与节点相关的所有的数据。
2.写操作也将替换点节点的所有数据。
3.另外,每一个节点都拥有自己的ACL(访问控制列表),这个列表规定了用户的权限,即限定了特定用户对目标节点可以执行的操作。
Znode存储数据大小有限制
代码语言:javascript
复制
1.zookeeper虽然可以关联一些数据,但是并没有被设计为常规的数据库或者大数据存储。相反的是,它用来管理调度数据,比如分布式应用中的配置文件信息,状态信息,汇集位置等等;
2.上面的这些数据的共同特性就是他们都是很小的数据,通常以KB为大小单位。Zookeeper的服务器和客户端都设计为严格检查并限制为每个Znode的数据大小之多1M,当然常规远小于这个值。
Znode 通过路径引用
代码语言:javascript
复制
1.如同linxu系统文件路径一样,路径必须是绝对的,因此他们必须是由斜杠字符开头。
2.路径必须是唯一的。
3.路径由Unicode字符串组成,并且有一些限制,字符串"zookeeper"用来保存管理信息,比如关键配置额信息。

下面我们一起来看一下,在ZooKeeper中,节点(znode)有几种类型?

节点类型

ZooKeeper中,节点(znode)一共有四种类型种。分别是:

  • PERSISTENT-持久节点
  • EPHEMERAL-临时节点
  • PERSISTENT_SEQUENTIAL-持久顺序节点
  • EPHEMERAL_SEQUENTIAL-临时顺序节点

接下来我们来具体了解一下,每个节点的具体概念:

临时节点

临时节点(EPHEMERAL):session 链接断开就没了;不能创建子节点;不能同名。

临时节点的生命周期与客户端会话绑定,一旦客户端会话失效(客户端与zookeeper 连接断开不一定会话失效),那么这个客户端创建的所有临时节点都会被移除。

临时顺序节点

临时顺序节点(EPHEMERAL_SEQUENTIAL) :session链接断开就没了;不能创建子节点;同名节点会在后面添加上序号(分布式锁使用的好处)。

基本特性同临时节点,增加了顺序属性,节点名后边会追加一个由父节点维护的自增整型数字。

持久节点

持久节点(PERSISTENT):session断联、服务端重启还在;可以创建子节点,子节点可以临时也可以持久;不能同名。

除非手动删除,否则节点一直存在于 Zookeeper 上。

持久顺序节点

持久顺序节点(PERSISTENT_SEQUENTIAL):session断联、服务端重启还在;可以创建子节点,子节点可以临时也可以持久;同名节点会在后面添加上序号。

基本特性同持久节点,只是增加了顺序属性,节点名后边会追加一个由父节点维护的自增整型数字。

节点属性

每个znode都包含了一系列的属性,通过命令get,可以获得节点的属性。

参数说明
代码语言:javascript
复制
dataVersion
#数据版本号,每次对节点进行set操作,dataVersion的值都会增加1(即使设置的是相同的数据),可有效避免了数据更新时出现的先后顺序问题。

下图演示版本号的作用:

代码语言:javascript
复制
cversion 
#子节点的版本号。当znode的子节点有变化时,cversion 的值就会增加1。

cZxid 
#Znode创建的事务id。

mZxid 
#Znode被修改的事务id,即每次对znode的修改都会更新mZxid。

对于zk来说,每次的变化都会产生一个唯一的事务id,zxid(ZooKeeper Transaction Id)。通过zxid,可以确定更新操作的先后顺序。例如,如果zxid1小于zxid2,说明zxid1操作先于zxid2发生,zxid对于整个zk都是唯一的,即使操作的是不同的znode。

ctime
#节点创建时的时间戳。

mtime
#节点最新一次更新发生时的时间戳。

ephemeralOwner
#如果该节点为临时节点, ephemeralOwner值表示与该节点绑定的session id. 如果不是, ephemeralOwner值为0。

在client和server通信之前,首先需要建立连接,该连接称为session。连接建立后,如果发生连接超时、授权失败,或者显式关闭连接,连接便处于CLOSED状态,此时session结束。

临时节点特点测试

链接服务端:

代码语言:javascript
复制
zkCli.cmd -timeout 5000 -r -server localhost:21810
session链接断开就没了
代码语言:javascript
复制
[zk: localhost:21810(CONNECTED) 15] create -e /temp 1
Created /temp
[zk: localhost:21810(CONNECTED) 16] ls /
[temp]
[zk: localhost:21810(CONNECTED) 17]

断开session链接

代码语言:javascript
复制
[zk: localhost:21810(CONNECTED) 16] ls /
[]
[zk: localhost:21810(CONNECTED) 17]
不能创建子节点
代码语言:javascript
复制
[zk: localhost:21810(CONNECTED) 17] ls /
[temp]
[zk: localhost:21810(CONNECTED) 18] create -e /temp/child 1
Ephemerals cannot have children: /temp/child
[zk: localhost:21810(CONNECTED) 19]
不允许同名节点
代码语言:javascript
复制
[zk: localhost:21810(CONNECTED) 17] ls /
[temp]
[zk: localhost:21810(CONNECTED) 19] create -e /temp 1
Node already exists: /temp
[zk: localhost:21810(CONNECTED) 20]

临时顺序节点测试

session断链就没了
代码语言:javascript
复制
[zk: localhost:21810(CONNECTED) 22] create -e -s /temp2 1
Created /temp20000000011

断线重连,数据就没了

代码语言:javascript
复制
[zk: localhost:21810(CONNECTED) 0] ls /
[]
[zk: localhost:21810(CONNECTED) 1]
不能有子节点
代码语言:javascript
复制
[zk: localhost:21810(CONNECTED) 22] create -e -s /temp2 1
Created /temp20000000011
[zk: localhost:21810(CONNECTED) 23] create -e -s /temp2/t1 1
Node does not exist: /temp2/t1
[zk: localhost:21810(CONNECTED) 24] create -e /temp2/t1 1
Node does not exist: /temp2/t1
同名节点会在后面加上序号(分布式锁使用的优点)
代码语言:javascript
复制
[zk: localhost:21810(CONNECTED) 1] create -e -s /temp 1
Created /temp0000000012
[zk: localhost:21810(CONNECTED) 2] create -e -s /temp 1
Created /temp0000000013
[zk: localhost:21810(CONNECTED) 3] create -e -s /temp 1
Created /temp0000000014

持久节点的特点

不能同名
代码语言:javascript
复制
[zk: localhost:21810(CONNECTED) 8] create /a 123
Created /a
[zk: localhost:21810(CONNECTED) 11] ls /
[a]
[zk: localhost:21810(CONNECTED) 12] create /a 123
Node already exists: /a
[zk: localhost:21810(CONNECTED) 13]
持久化保存(session断联、服务端重启)
代码语言:javascript
复制
[zk: localhost:21810(CONNECTED) 8] create /a 123
Created /a
[zk: localhost:21810(CONNECTED) 11] ls /
[a]

session重连,服务端重启,持久节点还有

代码语言:javascript
复制
[zk: localhost:21810(CONNECTED) 1] ls /
[a]
[zk: localhost:21810(CONNECTED) 2]
可以创建子节点
代码语言:javascript
复制
[zk: localhost:21810(CONNECTED) 6] create /a/b 123
Created /a/b

持久顺序节点特点

同名会加上序号
代码语言:javascript
复制
[zk: localhost:21810(CONNECTED) 9] create -s /d 123
Created /d0000000017
[zk: localhost:21810(CONNECTED) 10] create -s /d 123
Created /d0000000018
[zk: localhost:21810(CONNECTED) 11]
持久化保存(session断联、服务端重启)
代码语言:javascript
复制
[zk: localhost:21810(CONNECTED) 12] ls /
[d0000000017, d0000000018]
断联、服务端重启
代码语言:javascript
复制
[zk: localhost:21810(CONNECTED) 1] ls /
[d0000000017, d0000000018]
[zk: localhost:21810(CONNECTED) 2]
可以创建子节点

临时子节点和持久子节点都可以

代码语言:javascript
复制
[zk: localhost:21810(CONNECTED) 4] create -e /d0000000017/t 1
Created /d0000000017/t
[zk: localhost:21810(CONNECTED) 5] create /d0000000017/t1 2
Created /d0000000017/t1
[zk: localhost:21810(CONNECTED) 6]

3.5.3版本新增的znode类型

Container节点

如果Container节点下面没有子节点,则Container节点 在未来会被Zookeeper自动清除,定时任务默认60s 检查一次。

TTL节点

默认禁用,只能通过系统配置 zookeeper.extendedTypesEnabled=true 开启,不稳定。

参考文章:https://blog.csdn.net/yokeyhui/article/details /128166536 https://blog.csdn.net/qq_22701869/article /details/115387249 https://blog.csdn.net/u014636209 /article/details/85411512

推荐阅读 点击标题可跳转

CentOS 搭建 OpenVPN 服务,一次性成功!收藏了

免翻!加速!一招解决国内用户访问Github速度慢的问题

北京西二旗和上海张江程序员的终极悲惨宿命。。。

操作系统政府采购标准出台!Windows 将逐步出局

扔掉笨重的 ELK!来试试这套 Nginx 日志解决方案

面试官:如何构建自定义的 Docker 镜像?问倒一大片

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-08-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 民工哥技术之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 节点详解
    • Znode兼具文件和目录两种特点
      • Znode具有原子性操作
        • Znode存储数据大小有限制
          • Znode 通过路径引用
          • 节点类型
            • 临时节点
              • 临时顺序节点
                • 持久节点
                  • 持久顺序节点
                  • 节点属性
                    • 参数说明
                    • 临时节点特点测试
                      • session链接断开就没了
                        • 不能创建子节点
                          • 不允许同名节点
                          • 临时顺序节点测试
                            • session断链就没了
                              • 不能有子节点
                                • 同名节点会在后面加上序号(分布式锁使用的优点)
                                • 持久节点的特点
                                  • 不能同名
                                    • 持久化保存(session断联、服务端重启)
                                      • 可以创建子节点
                                      • 持久顺序节点特点
                                        • 同名会加上序号
                                          • 持久化保存(session断联、服务端重启)
                                            • 断联、服务端重启
                                              • 可以创建子节点
                                              • 3.5.3版本新增的znode类型
                                                • Container节点
                                                  • TTL节点
                                                  相关产品与服务
                                                  云服务器
                                                  云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
                                                  领券
                                                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档