有用过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. 当日志文件写满预分配大大小后就扩充日志文件一倍大小


        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 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数据并且写入快照文件中;


        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整个节点数据的输出;

  第一行: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;

文章首发地址:Solinx
http://www.solinx.co/archives/448

ZooKeeper日志与快照文件简单分析的更多相关文章

  1. Android.mk文件简单分析

    Android.mk文件简单分析 一个Android.mk文件用来向编译系统描写叙述须要编译的源码.详细来说:该文件是GNUMakefile的一小部分.会被编译系统解析一次或多次. 能够在每个Andr ...

  2. opencart 单入口文件简单分析

    opencart 单入口文件简单分析   opencart是基于mvcl的商城系统,据说是一个外国有人单独开发.比较牛叉.但是又不大符合国人习惯,目前国内opencart社区也是不少. 简单分析了下单 ...

  3. Log4j按级别输出日志到不同文件配置分析 (转:projava)

    关于LOG4J 按照级别输出日志,并按照级别输出到不同文件中的说法有很多, 网上贴的最多的log4j.properties的设置是这样的 log4j.rootLogger=info,stdout,in ...

  4. Log4j按级别输出日志到不同文件配置分析

    关于LOG4J 按照级别输出日志,并按照级别输出到不同文件中的说法有很多, 网上贴的最多的log4j.properties的设置是这样的 log4j.rootLogger=info,stdout,in ...

  5. rar文件简单分析

    1.rar文件也是由许多特定的块组成 注1:CRC为CRC32的低2个字节(MARK_HEAD的CRC 为固定的0x5261,非计算出来的值) 注2: HEAD_TYPE=0x72 标记块 HEAD_ ...

  6. FFmpeg源代码简单分析:日志输出系统(av_log()等)

    ===================================================== FFmpeg的库函数源代码分析文章列表: [架构图] FFmpeg源代码结构图 - 解码 F ...

  7. ZooKeeper系列(5):ZooKeeper的日志和快照

    ZooKeeper系列文章:https://www.cnblogs.com/f-ck-need-u/p/7576137.html#zk ZooKeeper有两种日志.一种快照.日志分为事务日志和Zoo ...

  8. zookeeper 事务日志与快照日志

    zookeeper日志各类日志简介 zookeeper服务器会产生三类日志:事务日志.快照日志和log4j日志. 在zookeeper默认配置文件zoo.cfg(可以修改文件名)中有一个配置项data ...

  9. 如何查找并简单分析core文件

    当系统发生coredump时,通常需要通过分析core文件来定位问题所在,但实际工作中,有时却发现core 文件找不到,或者core文件被删除了. 一.core文件没有生成 KINGBASE core ...

随机推荐

  1. Scalaz(30)- Free :Natural Tranformation ~> - map higher kinded types for free

    当我们需要定义一些对应高阶类型进行相互类型转换的操作函数时,我们发现scala语言并不提供能定义这种函数的支持.举例来说:如果我们希望定义一个函数把对于任何T值的Option[T]转换成List[T] ...

  2. 十大Intellij IDEA快捷键

    转载:http://blog.csdn.net/dc_726/article/details/42784275 Intellij IDEA中有很多快捷键让人爱不释手,stackoverflow上也有一 ...

  3. jdbc应用程序连接Oracle rac的URL写法:

    1.应用程序连接Oracle rac的URL写法: #Oracle(AMS) jdbc.driverClassName=oracle.jdbc.driver.OracleDriver jdbc.url ...

  4. RequireJS使用注意地方

    使用RequireJS做异步模块加载,有几点值得注意的地方: 1.模块定义两种写法 1. 存在依赖的函数式定义 如果模块存在依赖:则第一个参数是依赖的名称数组:第二个参数是函数,在模块的所有依赖加载完 ...

  5. MSCRM 用户登录日志

    MSCRM中关于用户登录信息,默认是不显示的,但是许多客户又有相关的需求. 下面将介绍给大家方法: 一.开启系统审核功能和用户访问审核. 二.打开设置中审核视图. 三.在过滤事件中选择“用户通过web ...

  6. 根据werservice代码用CXF生成WSDL

    原文:http://hongyegu.iteye.com/blog/619147,谢谢! import org.apache.cxf.tools.java2ws.JavaToWS; import ne ...

  7. 通过API找出Autodesk Vault中某个用户组可以访问的Vault

    首先在Vault Explorer中可以这样查看和更改某个用户组有权访问的vault Tools –> Administration –> Global Settings –> Gr ...

  8. Java虚拟机JVM学习01 流程概述

    Java虚拟机JVM学习01 流程概述 Java虚拟机与程序的生命周期 一个运行时的Java虚拟机(JVM)负责运行一个Java程序. 当启动一个Java程序时,一个虚拟机实例诞生:当程序关闭退出,这 ...

  9. Android读取自定义View属性

    Android读取自定义View属性 attrs.xml : <?xml version="1.0" encoding="utf-8"?> < ...

  10. CoreGraphics相关方法

    // 将view转为image(不经常用到的功能)(摘自SCCatWaitingHUD) - (UIImage *)convertViewToImage { CGSize s = self.bound ...