《从Paxos到ZooKeeper》第七章总结九-1:ZooKeeper技术内幕之数据

9 数据与存储

数据存储分为两部分:内存、磁盘数据存储

9.1 内存数据

ZooKeeper就像一个内存数据库(ZKDatbase)一样,存储了整颗节点树的内容,包括所有的节点路径、节点数据及其ACL信息等;

ZooKeeper会定时将这个数据存储到磁盘上

数据结构:DataTree、DataNode
在这里插入图片描述
对于临时节点,为了便于实时访问和及时清理,DataTree单独将临时节点保存起来:

private final Map<Long,HashSet<String>> ephemerals = new ConcurrentHashMap<>();

ZKDatbase:
在这里插入图片描述

9.2 事务日志

讲解底层实现数据一致性过程中最重要的一部分:事务日志的存储、日志格式和日志写入过程

9.2.1 事务日志的存储

默认目录为dataDir,自定义配置目录为dataLogDir

如果配置了dataLogDir,则会在自定义目录下建立一个子目录,该子目录确定了当前ZooKeeper使用的事务日志格式版本号;现在的子目录是version-2

存储特点:
在这里插入图片描述
1.文件大小都是64MB

2.文件名后缀都是一个十六进制数字,随着文件修改时间的推移,这个后缀越来越大;
此后缀本质上是一个ZXID,且为写入该文件的第一条事务记录的ZXID,这样方便我们迅速定位到某一个事务操作所在的事务日志,且能清楚地看出当前运行时ZooKeeper的Leader周期(高32位代表当前Leader周期,即epoch,低32位是真正的操作序列号)

9.2.2 日志格式/内容

测试例子:
在这里插入图片描述
日志内容为:
在这里插入图片描述
其空字符填充和事务日志在磁盘上的空间预分配有关

可以使用工具,如LogFormatter转换成可视化的事务操作日志,上图转换如下:
在这里插入图片描述
在这里插入图片描述

9.2.3 日志写入过程

FileTxnLog负责维护事务日志对外的接口,如写入和读取

写入:传入的参数为事务头和事务体
在这里插入图片描述
分为6个步骤:

1.确定是否有事务日志可写

2.确定事务日志文件是否需要扩容(预分配)

3.事务序列化

4.生成Checksum

5.写入事务日志文件流

6.事务日志刷入磁盘

9.2.4 日志截断

在这里插入图片描述

9.3 snapshot-数据快照

用来记录服务器上某一个时刻的全量内存数据内容,并将其写入到指定的磁盘文件中

9.3.1 文件存储

类似事务日志,使用特定的磁盘目录进行存储,也可以通过dataDir属性进行配置

同样使用ZXID的十六进制表示来作为文件名后缀,作用:在数据恢复阶段,ZooKeeper会根据该ZXID来确定数据恢复的起始点

和事务日志不同的是,没有使用预分配机制,因此不会包含大量的“0”,所有内容都是有效的,因此在一定程序上能够反映当前内存中全量数据的大小

9.3.2 存储格式

例子:
在这里插入图片描述
使用SnapshotFormatter转换如下:
在这里插入图片描述
输出每个数据节点的元信息

9.3.3 数据快照

FileSnap负责维护快照数据对外的接口,如写入和读取

写入:将内存数据库写入快照数据文件(将内存数据库的全量数据Dump到本地文件中)其实是一个序列化过程

1.确定是否需要进行数据快照

2.切换事务日志文件,重新创建一个新的事务日志

3.创建数据快照异步线程

4.获取全量数据和会话信息

5.生成快照数据文件名

6.数据序列化

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值