[Zookeeper版本3.6.2源码系列]-5-Zookeeper的树形节点的基础数据模型

5-Zookeeper的基础数据模型

5.1 Zookeeper节点存储

在Zookeeper中基础数据使用树形结构来存储对应源码中的类型为DataTree,树中的节点在这里称为znode对应源码中的类型为DataNode。

5.1.1 DataNode类型

DataNode类型主要用来存储节点的数据,主要包含的节点数据有,ACL访问控制,统计数据子节点列表等,同时DataNode实现了Record接口来实现序列化和反序列化功能,关于Record在Zookeeper-jute子项目中有说明。了解了DataNode的作用,我们来看一下DataNode节点的设计。

成员变量类型说明
digestlong根据其他成员变量使用DigestCalculator类型calculateDigest方法计算的摘要信息,用来检测数据是否被篡改过
digestCachedboolean标记此节点的摘要是否是最新的,用于优化性能。true为已缓存的,如果为false则在节点发生变更时会重新计算摘要
databyte[]数据节点的数据
aclLong此datanode的acl映射长度
statStatPersisted此节点持久化到磁盘的统计数据
childrenSet此节点的子节点名字列表,不包含父级目录
EMPTY_SETSet空集合列表,当子节点位空时候返回

5.1.2 StatPersisted

每个DataNode节点都会有一个StatPersisted类型的对象来记录当前节点持久化到磁盘的统计数据,那我们来看下每个节点进行了哪些统计信息:

成员变量类型说明
czxidlong该数据节点被创建时的事务id
mzxidlong该数据节点被修改时最新的事物id
ctimelong该数据节点创建时间
mtimelong该数据节点最后修改时间
versionint当前节点版本号(可以理解为修改次数,每修改一次值+1)
cversionint子节点版本号(子节点修改次数,每修改一次值+1)
aversionint当前节点acl版本号(acl节点被修改次数,每修改一次值+1)
ephemeralOwnerlong临时节点标示,当前节点如果是临时节点,则存储的创建者的会话id(sessionId),如果不是,那么值=
pzxidlong当前节点的父级节点事务ID

与客户端交互的Stat统计数据类型与持久化统计数据类型的字段相似额外多了两个字段我们顺便来解释下:

成员变量类型说明
dataLengthint当前节点数据长度
numChildrenint当前节点子节点个数

了解了DataNode节点后我们可以来看下Zookeeper的树形结构存储

5.1.3 DataTree

DataTree主要来维护节点的树形结构

成员变量类型说明
LOGLoggerslf4j标准化日志组件
RATE_LOGGERRateLogger限流打印日志
nodesNodeHashMap存放一个Path和其相关信息DataNode的映射,此映射提供了对数据节点的快速查找,每个节点的信息存储在这个映射关系中
dataWatchesIWatchManager数据监听管理器
childWatchesIWatchManager子节点监听管理器
nodeDataSizeAtomicLong缓存的所有数据节点的路径和数据的总大小
rootZookeeperStringzookeeper树的根,值为/
procZookeeperString作为管理和状态节点的zookeeper节点,值/zookeeper
procChildZookeeperString这将是作为root的子级存储的字符串,值zookeeper
quotaZookeeperStringzookeeper配额节点,用作zookeeper的配额管理节点,值为/zookeeper/quota
quotaChildZookeeperStringzookeeper
configZookeeperStringzookeeper的配置节点,值为:/zookeeper/config
configChildZookeeperString值为zookeeper
pTriePathTrie根据路径实现的前缀树,可用于查询匹配节点路径
STAT_OVERHEAD_BYTESintznode的stat字段的大小。统计stat类的字段,主要用作监控使用对象的大小可以看Stat类型6个long类型 5个int类型这个字段的值为(6 * 8) + (5 * 4);
ephemeralsMap<Long, HashSet>sessionId与临时节点的hash表的映射关系,key为sessionid值为当前session的临时节点集合
containersSet容器节点类型的集合
ttlsSetttl节点类型的集合
aclCacheReferenceCountedACLCacheacl缓存信息的存储
DIGEST_LOG_LIMITint最大授权日志保留数量值为1024
DIGEST_LOG_INTERVALint对齐间隔,值为128,十六进制为80
digestFromLoadedSnapshotZxidDigest需要验证的摘要信息,如果这个值不为null,将寻找一个目标zxid
lastProcessedZxidDigestZxidDigest与数据树中最高的zxid相关联的摘要
firstMismatchTxnboolean标记变量,第一个不匹配的摘要信息,如果为true则将打印摘要日志。
digestWatchersList摘要不匹配的时候通知订阅者
digestLogLinkedList历史摘要列表
digestCalculatorDigestCalculator节点摘要计算器

5.1.4 NodeHashMap

了解了DataTree的基本结构可以详细来看下里面的重要成员,NodeHashMap类型的nodes对象 ,nodes对象类型是NodeHashMap接口,其对象初始化过程中通过创建子类型NodeHashMapImpl对象来实现,用于存放一个Path和其相关信息的映射. 那接下来我们来了解下NodeHashMapImpl是如何存储路径与节点的映射的。

字段类型说明
nodesConcurrentHashMap<String, DataNode>路径节点映射
digestEnabledboolean是否启用摘要:(仅Java系统属性:zookeeper.digest.enabled)3.6.0中的新功能:添加摘要功能,检测从磁盘加载数据库时ZooKeeper内部的数据不一致性,并跟踪领导,它基于中提到的adHash对数据树进行增量哈希检查
digestCalculatorDigestCalculator摘要计算工具类
hashAdHash这个增量散列用于跟踪数据树的散列,以便我们可以快速验证事情是否同步。通过将每个新增节点的摘要值进行相加得到最后的hash值

通过类型我们可以了解到NodeHashMapImpl主要用于存储路径与节点映射关系和进行摘要计算

后面我们会深度探索datatree节点处理流程

技术咨询支持,可以扫描微信公众号进行回复咨询
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宋小生的博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值