Zookeeper系列(十八)Zookeeper原理解析之数据存储之TxnLog事务日志
来源:互联网 发布:淘宝收藏 猪八戒网 编辑:程序博客网 时间:2024/05/21 06:37
事务日志文件用来记录事物操作,每一个事务操作如添加,删除节点等等,都会在事务日志中记录一条记录,用来在zookeeper异常情况下,通过txnlog和snapshot文件来恢复数据,下面我们来看下txnLog事务日志文件的格式
打开一个事务日志文件看看
一个日志文件LogFile: FileHeader TxnList ZeroPad三部分组成
1) 日志文件头FileHeader: {
magic 4bytes (ZKLG) //常量代表
version 4bytes //常量2
dbid 8bytes //这个没啥用,就是默认值0
}
头文件是固定长度 16 = 4 + 4 + 8数据,它的值也固定
2) TxnList代表记录记录集合,txn代表一条记录
Txn:checksum Txnlen TxnHeaderRecord 0x42由顺序的五部分组成
//序列化TxnHeader Record记录到byte[]
byte[] buf = Util.marshallTxnEntry(hdr, txn);
Checksum crc = makeChecksumAlgorithm();
//根据指定数组更新校验值
crc.update(buf, 0, buf.length);
//将校验吗写入输出流
oa.writeLong(crc.getValue(), "txnEntryCRC");
//将TxnHeader Record数据写入到输出流
//1.先计算buf数据长度写入
//2.写入buf数组数据
//3.记录尾部以’B’字符结尾,写入0x42
Util.writeTxnBytes(oa, buf);
2.1) checksum校验位计算,是由Adler32校验算法计算TxnHeader Record序列化后的字节码(跟文档说明有出入,文档说是由Txnlen TxnHeaderRecord 0x42计算出来的, 可是看代码不是,难道我理解错了????????)
2.2) TxnLen:记录数据长度包括记录头TxnHeader和记录Record
2.3)TxnHeader: {
sessionid 8bytes
cxid 4bytes // 与客户端交互的xid
zxid 8bytes // 服务器端生成的事务id
time 8bytes // 时间
type 4bytes // 事务操作的类型
}
2.4)Record:事务记录的内容,由jute规范定义了序列化反序列化流程,各个事务操作都实现了Record接口,下面看下创建的事务操作记录
public class CreateTxn implements Record {
privateString path; //创建路径
privatebyte[] data; //节点数据内容
privatejava.util.List<org.apache.zookeeper.data.ACL> acl; //节点权限
privateboolean ephemeral; //是否临时节点
privateint parentCVersion; //父节点的版本号
//下面过程就是序列化过程,反序列化类似
publicvoid serialize(OutputArchive a_, String tag) throws Java.io.IOException {
a_.startRecord(this,tag);
a_.writeString(path,"path");
a_.writeBuffer(data,"data");
{
a_.startVector(acl,"acl");
if(acl!= null) { int len1 =acl.size();
for(int vidx1 = 0; vidx1<len1;vidx1++) {
org.apache.zookeeper.data.ACL e1 = (org.apache.zookeeper.data.ACL)acl.get(vidx1);
a_.writeRecord(e1,"e1");
}
}
a_.endVector(acl,"acl");
}
a_.writeBool(ephemeral,"ephemeral");
a_.writeInt(parentCVersion,"parentCVersion");
a_.endRecord(this,tag);
}
2.5)0x42:每条事务记录尾部以’B’字符结尾就是0x42
3) 每个文件尾部都用一个字符 0 填充, 工具Util.padLogFile扩充文件的时候在尾部填写上- Zookeeper系列(十八)Zookeeper原理解析之数据存储之TxnLog事务日志
- 3.zookeeper原理解析-数据存储之TxnLog事务日志
- Zookeeper系列(十五)Zookeeper原理解析之数据存储之Zookeeper内存结构
- 1.zookeeper原理解析-数据存储之Zookeeper内存结构(zookeeper系列文章)
- Zookeeper系列(十七)Zookeeper原理解析之数据存储之Snapshot
- Zookeeper系列(十九)Zookeeper原理解析之数据存储之FileTxnLog& FileTxnSnapLog工具类
- Zookeeper系列(二十)Zookeeper原理解析之数据存储之ZKDatabase
- Zookeeper系列(二十一)Zookeeper原理解析之数据存储小结
- 1.zookeeper原理解析-数据存储之Zookeeper内存结构
- Zookeeper系列(二十八)Zookeeper之通讯模型
- 2.zookeeper原理解析-数据存储之Snapshot
- 4.zookeeper原理解析-数据存储之FileTxnLog& FileTxnSnapLog工具
- 5.zookeeper原理解析-数据存储之ZKDatabase
- Zookeeper系列(十六)Zookeeper原理解析之选举之选举流程
- ZooKeeper学习之本地存储(事务日志与快照)
- Zookeeper系列(二十三)Zookeeper原理解析之选举流程
- Zookeeper系列(二十四)Zookeeper原理解析之处理流程
- Zookeeper系列(二十五)Zookeeper原理解析之客户端与服务器端交互
- 前端资源
- lucas定理(hdu3037,)
- 千万级别数据表,单列索引和多列索引性能对比
- Nginx正反向代理、负载均衡等功能实现配置
- Excel做ODBC数据源,VC6链接数据库找不到表的解决办法
- Zookeeper系列(十八)Zookeeper原理解析之数据存储之TxnLog事务日志
- maven多模块使用,父模块(modules使用,package为pom),子模块(parent使用)
- 数据库创建模板
- linux下vi命令大全(备忘)
- gethostbyname()函数的说明
- Vue---使用vuex
- Ajax与Comet-JavaScript高级程序设计第21章读书笔记(1)
- JAVA中的21的技术点
- 加入强调语气,使用<strong>和<em>标签