本节讲解
- 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的流程图如下:
暂无