3.zookeeper原理解析-数据存储之TxnLog事务日志

=====================================斩秋|http://blog.csdn.net/quhongwei_zhanqiu=======================================

事务日志文件用来记录事物操作,每一个事务操作如添加,删除节点等等,都会在事务日志中记录一条记录,用来在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扩充文件的时候在尾部填写上

=====================================斩秋|http://blog.csdn.net/quhongwei_zhanqiu=======================================

时间: 09-22

3.zookeeper原理解析-数据存储之TxnLog事务日志的相关文章

2.zookeeper原理解析-数据存储之Snapshot

=====================================斩秋|http://blog.csdn.net/quhongwei_zhanqiu======================================= Snapshot是datatree在内存中某一时刻的影像,zookeeper有一定的机制会定时生成datatree的snapshot.FileSnap实现了SnapShot接口负责将数据写入文件中,下面我们来看看snap相关内容. 2.1 snapshot文件格式

zookeeper原理解析-数据存储

Zookeeper内存结构 Zookeeper是怎么存储数据的,什么机制保证集群中数据是一致性,在网络异常,当机以及停电等异常情况下恢复数据的,我们知道数据库给我们提供了这些功能,其实zookeeper也实现了类似数据库的功能. 1.      Zookeeper内存结构 Zookeeper数据在内存中的结构类似于linux的目录结构 DataTree代表这个目录结构, DataNode代表一个节点 DataTree: 默认初始化三目录 1)"" 2) "/zookeeper

Zookeeper原理分析之存储结构TxnLog

Zookeeper事物日志文件用于记录事物操作,如添加,删除节点等等,都会在事务日志中记录一条记录.下面我们就详细分析一下txnLog事务日志文件. txnLog事务日志文件文件由三部分组成: 日志文件头FileHeader TxnList代表记录记录集合 ZeroPad文件尾部 FileHeader public class FileHeader implements Record { private int magic;//(ZKLG) 常量代表文件魔数 private int versio

解析数据存储MySQL

为了适应不同项目对不同感兴趣属性的解析存储,数据存储结构采用纵向的属性列表方式,即一个url页面多个属性存储多条记录方式,并且按照text,html,data,num几大典型类型分别对应存储. 创建UTF-8字符集的nutch数据库,并执行表初始化脚本,参考DDL: CREATE TABLE `crawl_data` ( `url` varchar(255) NOT NULL, `code` varchar(255) NOT NULL, `name` varchar(255) DEFAULT N

13.zookeeper原理解析-服务器端处理流程之处理器详解

===================斩秋|http://blog.csdn.net/quhongwei_zhanqiu=============== 各个processor的主要功能 1) PrepRequestProcessor 如名字这个处理器主要功能是对请求进行预处理, 将client向server请求二进制数据反序列化成sever中请求操作. PrepRequestProcessor做为leader的第一个处理器,它的请求数据来源主要来自: (1)    Leader做一个zk服务接收

zookeeper原理解析-服务器端处理流程

1)处理器链 这部分内容我们主要讲解zookeeper请求在zookeeper server端的处理流程,对于不同角色的zookeeper具有不同的处理流程, ZookeepeerServer的start方法中会调用setupRequestProcessors()来初始化处理器链,它被子类覆写实现. 1.      LeaderZooKeeperServer 看如上代码主要建立了如下的两个处理器流链 (1)    PrepRequestProcessor(线程) => ProposalReque

zookeeper原理解析-选举

1)QuorumPeerMain加载 Zookeeper集群启动的入口类是QuorumPeerMain来加载配置启动QuorumPeer线程.首先我们来看下QuorumPeer, 谷歌翻译quorum是法定人数,定额的意思, peer是对等的意思,那么QuorumPeer中quorum代表的意思就是每个zookeeper集群启动的时候集群中zookeeper服务数量就已经确定了,在每个zookeeper的配置文件中配置集群中的所有机器 server.1=127.0.0.1:2886:3886 s

Zookeeper原理分析之存储结构Snapshot

Zookeeper内存结构 Zookeeper数据在内存中的结构类似于linux的目录结构,DataTree代表这个目录结构, DataNode代表一个节点.DataTree默认初始化三个目录:"","/zookeeper","/zookeeper/quota" DataNode表示一个节点,存储了一下信息: 父节点的引用 节点的权限集合 子节点路径集合 Snapshot Snapshot是datatree在内存中某一时刻的快照,zookeepe

15.zookeeper原理解析-服务器端处理流程之交互图

===================斩秋|http://blog.csdn.net/quhongwei_zhanqiu=============== Zookeeper集群中server数量总是确定的,所以集群中的server交互采用比较可靠的bio长连接模型:不同于集群中sever间交互zookeeper客户端其实数量是未知的,为了提高zookeeper并发性能,zookeeper客户端与服务器端交互采用nio模型.下面我们主要来讲讲zookeeper的服务器端与客户端的交互.读者对nio不