Zookeeper 持久化——FileTxnLog(一)

18 篇文章 0 订阅
13 篇文章 0 订阅

本节讲解

  • zk的持久化框架
  • 事务日志FileTxnLog日志结构
  • FileTxnLog源码
  • LogFormatter完成事务日志的反序列化
  • 分析事务日志demo
1.持久化总体框架

持久化的类主要在包org.apache.zookeeper.server.persistence下,结构如下图:
在这里插入图片描述
TxnLog,接口类型,读取事务性日志的接口。
FileTxnLog,实现TxnLog接口,添加了访问该事务性日志的API。
Snapshot,接口类型,持久层快照接口。
FileSnap,实现Snapshot接口,负责存储、序列化、反序列化、访问快照。
FileTxnSnapLog,封装了TxnLog和SnapShot。 Util,工具类,提供持久化所需的API。

2.两种日志

ZK主要存放了两类文件:

  • snapshot(内存快照)
  • log(事务日志,类似MySQL的binlog,将所有与修改数据相关的操作记录在log中)
    关于事务性日志的定义,可以参照参考,简而言之就是
    ZK事务日志文件用来记录事物操作,每一个事务操作如添加,删除节点等等,都会在事务日志中记录一条记录,用来在动物园管理员异常情况下恢复数据。
    • 事务日志
      正常运行过程中,针对所有更新操作,在返回客户端“更新成功”的响应前,ZK会确保已经将本次更新操作的事务日志写到磁盘上,只有这样,整个更新操作才会生效。
/**
 * The format of a Transactional log is as follows:
 * <blockquote><pre>
 * LogFile:
 *     FileHeader TxnList ZeroPad
 * 
 * FileHeader: {
 *     magic 4bytes (ZKLG)
 *     version 4bytes
 *     dbid 8bytes
 *   }
 * 
 * TxnList:
 *     Txn || Txn TxnList
 *     
 * Txn:
 *     checksum Txnlen TxnHeader Record 0x42
 * 
 * checksum: 8bytes Adler32 is currently used
 *   calculated across payload -- Txnlen, TxnHeader, Record and 0x42
 * 
 * Txnlen:
 *     len 4bytes
 * 
 * TxnHeader: {
 *     sessionid 8bytes
 *     cxid 4bytes
 *     zxid 8bytes
 *     time 8bytes
 *     type 4bytes
 *   }
 *     
 * Record:
 *     See Jute definition file for details on the various record types
 *      
 * ZeroPad:
 *     0 padded to EOF (filled during preallocation stage)
 * </pre></blockquote> 
 */

2.1主要接口
append()方法:
在这里插入图片描述
在流程图标注的红色区域:
在这里插入图片描述
调用了FilePadding类的padFile()方法,在FilePadding类里,
在这里插入图片描述
在红色区域调用了calculateFileSizeWithPadding()方法:

/**
      *使用填充计算新文件大小。 我们只返回一个新的大小
      *当前文件位置足够接近(小于4K)到结束
      * file和preAllocSize> 0。
      * @param定位我们写入的文件中的点
      * @param fileSize应用程序跟踪当前文件大小
      * @param preAllocSize要填充的字节数
      * @return新文件大小。 如果没有,它可以与fileSize相同
      *填充完成。
      * @throws IOException
     */
    // VisibleForTesting
    public static long calculateFileSizeWithPadding(long position, long fileSize, long preAllocSize) {
       //如果preAllocSize为正数且我们在文件已知末尾的4KB范围内,则计算新的文件大小
        if (preAllocSize > 0 && position + 4096 >= fileSize) {
           //如果我们写的比以前预先分配的更多,我们需要确保新的
             //文件大小比我们已经拥有的大
            if (position > fileSize) {
                fileSize = position + preAllocSize;
                fileSize -= fileSize % preAllocSize;
            } else {
                fileSize += preAllocSize;
            }
        }
        return fileSize;
    }

2.2 事务日志可视化LogFormatter
可以结合org.apache.zookeeper.server.persistence.FileTxnLog追加理解进行
LogFormatter.java的流程图如下:
暂无

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值