格式化zookeeper命令_zookeeper原理篇Zookeeper的数据存储与恢复原理

b554180d6f70cef2aa0d67a355c240ae.gif

前言

经过前面的一些文章的学习和了解,我们对Zookeeper有了一定的理解。

前文直达链接:

zookeeper原理篇-Zookeeper选举过程分析

zookeeper原理篇-Zookeeper会话机制

但是无论是节点持久化,还是启动流程中的数据恢复等,我们都没有详细的去了解内部的数据存储和恢复的机制,本篇文章就开始学习Zookeeper的数据存储相关。

内存存储

zookeeper刚开始的时候,我们就已经知道其结构就像一个内存数据库一样,按照树的结构,能把节点的路径、节点数据以及ACL和节点的数据存储,其核心就是依靠DataTree实现的所谓树型存储结构。而每一个DataTree内部包含了多个DataNode,每一个DataNode则是zookeeper中最小的存储单元。

DataTree存储了Zookeeper中所有节点的路径,所有节点的数据以及ACL信息,除此之外,具体的每个节点存储依赖DataNode,而管控所有的node节点使用的经典的ConcurrentHashMap键值对结构:

privatefinalConcurrentHashMap<String, DataNode> nodes = newConcurrentHashMap<String, DataNode>();

每一个DataNode内部除了存储对应的数据内容、ACL列表和每个节点对应的状态以外,还会保存树的一些信息,例如节点的父节点引用,以及当前节点的子节点列表信息等,以此实现更方便的管理和实现树型结构。

在nodes这个Map中,存储了Zookeeper所有的数据结构,基本上所有的增删改等操作,都是操作map中对应path下的DataNode(key是path,value为DataNode),另外,在Zookeeper中,我们知道临时节点的表现和持久化节点不同,其生命周期和会话进行绑定,因此为了便于操作和清理,DataTree中会单独将临时节点保存起来:

privatefinalMapcLong, HashSet<String» ephemerals =

newConcurrentHashMap<Long, HashSet<String»();

事务日志

除了内存存储以外,我们知道事务操作的时候会有日志,而文件存储主要是依靠事务日志文件保存,在我们启动zookeeper的时候,往往会指定dataDir目录,这个目录是zookeeper中默认用来存储事务日志的目录,除此之外我们可以给事务日志单独分配目录存放,只需要指定dataLogDir属性即可

日志文件

在zookeeper运行了一段时间以后,我们查看日志目录下的文件,可以看到大概如下的列表:

6f3df301caa2f70ea9463fa9e34f1a74.png

而比较值得注意的是这些文件的大小,都是一样的67108880KB,这大小换算成MB刚好是64MB大小,除此之外,可以看到log文件的命名都是log.作为前缀,后面的名字都是十六进制的数字,那么这个是什么呢?其实这个是使用了一个ZXID作为后缀,而选择的则是当前日志中的第一条事务的ZXID,而ZXID我们前面也了解过,是由两个部分组合而成,高32位代表当前Leader的选举周期--epoch的大小,而低32位则是该周

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值