阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

ZooKeeper日志与快照文件简单分析

222次阅读
没有评论

共计 4648 个字符,预计需要花费 12 分钟才能阅读完成。

有用过 Zookeeper 的都知道 zoo.cfg 配置文件中有 dataDir 配置项用于存储数据,不过可能有些人不太清楚这个目录具体存储的是那些数据,默认情况下这个目录是用于存储 Log(事务日志)与 Snapshot(快照)数据,但是 Zookeeper 还提供了一个用于 Log 存储目录的配置项 dataLogDir 而 dataDir 用于存储 Snapshot 数据,Log 文件写入频率非常高如果有对 Snapshot 文件经常操作或是对 Zookeeper 性能要求非常高可以为 Log 与 Snapshot 分别配置不同的目录存储;本文主要是结合源码分析 Zookeeper 的 Log 与 Snapshot 文件,这里我分别为 Log 与 Snapshot 配置了不同的存储目录:dataDir=D:/zookeeper-3.4.6/data、dataLogDir=D:/zookeeper-3.4.6/data/log;
事务日志与 Snapshot 的操作是在 org.apache.zookeeper.server.persistence 包中,这里也主要是分析该包下的各个类;在 FileTxnSnapLog 类中看到了它在我们为事务日志与 Snapshot 配置的目录下又创建了一个子目录 version- 2 同时又指定为该两种文件的存储目,在里面还可以看到 FileTxnLog、FileSnap 类分别为处理事务日志和 Snapshot 的;

事务日志文件

在 Zab 协议中我们知道每当有接收到客户端的事务请求后 Leader 与 Follower 都会将把该事务日志存入磁盘日志文件中,该日志文件就是这里所说的事务日志,下面将详细分析该日志文件;
FileTxnLog 类用于处理事务日志文件这里就从此类开始,在该类中看到了 preAllocSize、TXNLOG_MAGIC、VERSION、lastZxidSeen、dbId 等这样的属性:
1. preAllocSize: 默认预分配的日志文件的大小 65536*1024 字节
2. TXNLOG_MAGIC:日志文件魔数为 ZKLG
3. VERSION:日志文件版本号 2
4. lastZxidSeen:最后的 ZXID

类中还有一个静态代码块用于读取配置项中的 preAllocSize,也就是说预分配的日志文件大小是可配置的,接下来看看该类中最重要的一个方法 append,该方法主要功能是创建新的日志文件与往日志文件中追加新的事务日志记录;从中可以看到日志文件的 相关信息

1. 文件名为 log,后缀为十六进制的 ZXID
2. 日志文件头有:magic、version、dbid
3. 创建文件后分配的文件大小为:67108864 字节 +16 字节,其中 16 字节为文件头
4. 使用 Adler32 作为日志文件的校验码
5. 当日志文件写满预分配大大小后就扩充日志文件一倍大小

ZooKeeper 日志与快照文件简单分析
1.1 日志文件目录

正如从代码中看到的一样 version- 2 目录中存储着 Zookeeper 的事务日志文件,有看到 log.10、log.4f 文件,这些都是 Zookeeper 的事务日志文件;这两个文件都有一个特点就是文件名为 log.xx,大小为 64MB 文件的后缀 xx 时间最早的 数字总是比最晚的小。如果有了解过 Zookeeper 的 ZAB 协议那肯定知道它为每一个事务请求都分配了一个事务 ID 也就是 ZXID,上面章节也知道了 xx 就是 Zookeeper 处理请求的 ZXID,该 ZXID 为 log 文件中第一条事务的 ZXID;ZXID 规则为前 32 字节为 Leader 周期,后 32 字节为事务请求序列,所以通过事务日志就可以轻松的知道当前的 Leader 周期与每个文件所属的 Leader 周期;

日志文件可视化
事务日志文件中存储的都是二进制的数据,如果不借助其他工具是很难知道里面存储的内容的,Zookeeper 也给我们提供了这样的工具,在 org.apache.zookeeper.server 包中的 LogFormatter 类为我们提供了把事务日志文件以我们看得懂的数据输出的功能,这里就使用该工具输出该事务日志文件,并解释该数据;
LogFormatter 工具的使用方法: java -cp ../../../zookeeper-3.4.6.jar;../../../lib/slf4j-api-1.6.1.jar org.apache.zookeeper.server.LogFormatter log.1

ZooKeeper 日志与快照文件简单分析

日志分析
第一行:ZooKeeper Transactional Log File with dbid 0 txnlog format version 2
上面的代码分析中有说到每个日志文件都有一个这就是那里所说的日志头,这里 magic 没有输出,只输出了 dbid 还有 version;

第二行:15-8-12 下午 03 时 59 分 53 秒 session 0x14f20ea71c10000 cxid 0x0 zxid 0x1 createSession 4000
这也就是具体的事务日志内容了,这里是说 xxx 时间有一个 sessionid 为 0x14f20ea71c10000、cxid 为 0x0、zxid 为 0x1、类型为 createSession、超时时间为 4000 毫秒

第三行:15-8-12 下午 03 时 59 分 54 秒 session 0x14f20ea71c10000 cxid 0x1 zxid 0x2 create ‘/solinx0000000000,#736f6c696e78,v{s{31,s{‘world,’anyone}}},F,1
sessionID 为 0x14f20ea71c10000,cxid:0x01、zxid:0x02、创建了一个节点路径为:/solinx0000000000、节点内容为:#736f6c696e78(经过 ASCII,实际内容为 solinx)、acl 为 world:anyone 任何人都可以管理该节点、节点不是 ephemeral 节点的、父节点子版本:1

第四行:15-8-12 下午 04 时 15 分 56 秒 session 0x14f20ea71c10000 cxid 0x0 zxid 0x3 closeSession null
这里是说 xxx 时间有一个 sessionid 为 0x14f20ea71c10000、cxid 为 0x0、zxid 为 0x3、类型为 closeSession

快照文件

快照文件的处理在 FileSnap 类中,与事务日志文件一样快照文件也一样有 SNAP_MAGIC、VERSION、dbId 这些,这作用也只是用来标识这是一个快照文件;Zookeeper 的数据在内存中是以 DataTree 为数据结构存储的,而快照就是每间隔一段时间 Zookeeper 就会把整个 DataTree 的数据序列化然后把它存储在磁盘中,这就是 Zookeeper 的快照文件,快照文件是指定时间间隔对数据的备份,所以快照文件中数据通常都不是最新的,多久抓一个快照这也是可以配置的 snapCount 配置项用于配置处理几个事务请求后生成一个快照文件;
与事务日志文件一样快照文件也是使用 ZXID 作为快照文件的后缀,在 FileTxnSnapLog 类中的 save 方法中生成文件并调用 FileSnap 类序列化 DataTree 数据并且写入快照文件中;

ZooKeeper 日志与快照文件简单分析
1.2 快照文件目录

快照文件可视化
与日志文件一样 Zookeeper 也为快照文件提供了可视化的工具 org.apache.zookeeper.server 包中的 SnapshotFormatter 类,接下来就使用该工具输出该事务日志文件,并解释该数据;
SnapshotFormatter 工具的使用方法: java -cp ../../zookeeper-3.4.6.jar;../../lib/slf4j-api-1.6.1.jar org.apache.zookeeper.server.SnapshotFormatter snapshot.17

ZooKeeper 日志与快照文件简单分析
ZooKeeper 日志与快照文件简单分析

快照分析
快照文件就很容易看得懂了,这就是 Zookeeper 整个节点数据的输出;

第一行:ZNode Details (count=11):
ZNode 节点数总共有 11 个

/cZxid = 0x00000000000000
ctime = Thu Jan 01 08:00:00 CST 1970
mZxid = 0x00000000000000
mtime = Thu Jan 01 08:00:00 CST 1970
pZxid = 0x00000000000016
cversion = 7
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x00000000000000
dataLength = 0

这么一段数据是说,根节点 /:
cZxid:创建节点时的 ZXID
ctime:创建节点的时间
mZxid:节点最新一次更新发生时的 zxid
mtime:最近一次节点更新的时间
pZxid:父节点的 zxid
cversion:子节点更新次数
dataVersion:节点数据更新次数
aclVersion:节点 acl 更新次数
ephemeralOwner:如果节点为 ephemeral 节点则该值为 sessionid,否则为 0
dataLength:该节点数据的长度

快照文件的末尾:
Session Details (sid, timeout, ephemeralCount): 0x14f211584840000, 4000, 0 0x14f211399480001, 4000, 0
这里是说当前抓取快照文件的时间 Zookeeper 中 Session 的详情,有两个 session 超时时间都是 4000 毫秒 ephemeral 节点为 0;

Ubuntu 14.04 安装分布式存储 Sheepdog+ZooKeeper  http://www.linuxidc.com/Linux/2014-12/110352.htm

CentOS 6 安装 sheepdog 虚拟机分布式储存  http://www.linuxidc.com/Linux/2013-08/89109.htm

ZooKeeper 集群配置 http://www.linuxidc.com/Linux/2013-06/86348.htm

使用 ZooKeeper 实现分布式共享锁 http://www.linuxidc.com/Linux/2013-06/85550.htm

分布式服务框架 ZooKeeper — 管理分布式环境中的数据 http://www.linuxidc.com/Linux/2013-06/85549.htm

ZooKeeper 集群环境搭建实践 http://www.linuxidc.com/Linux/2013-04/83562.htm

ZooKeeper 服务器集群环境配置实测 http://www.linuxidc.com/Linux/2013-04/83559.htm

ZooKeeper 集群安装 http://www.linuxidc.com/Linux/2012-10/72906.htm

Zookeeper3.4.6 的安装 http://www.linuxidc.com/Linux/2015-05/117697.htm

本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-03/129509.htm

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计4648字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中