Zookeeper原理分析之存储结构TxnLog

Zookeeper事物日志文件用于记录事物操作,如添加,删除节点等等,都会在事务日志中记录一条记录。下面我们就详细分析一下txnLog事务日志文件。

txnLog事务日志文件文件由三部分组成:

  • 日志文件头FileHeader
  • TxnList代表记录记录集合
  • ZeroPad文件尾部

FileHeader

public class FileHeader implements Record {
  private int magic;//(ZKLG) 常量代表文件魔数
  private int version;//常量2
  private long dbid;//常量,默认0
}

头文件是固定长度 16 = 4 + 4 + 8数据,它的值也固定。

TxnList

TxnList代表记录记录集合,txn代表一条记录,把一条txn添加到日志文件代码如下:

    //序列化TxnHeader Record记录到byte[]
    byte[] buf = Util.marshallTxnEntry(hdr, txn);
    if (buf == null || buf.length == 0) {
        throw new IOException("Faulty serialization for header " +
                "and 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);

checksum校验位计算,是由Adler32校验算法计算TxnHeader Record序列化后的字节码.TxnHeader的定义如下:

public class TxnHeader implements Record {
  private long clientId;
  private int cxid;// 与客户端交互的xid
  private long zxid;// 服务器端生成的事务id
  private long time;
  private int type;  // 事务操作的类型
}

Record:事务记录的内容,由jute规范定义了序列化反序列化流程,各个事务操作都实现了Record接口,下面看下创建的事务操作记录

public class CreateTxn implements Record {
  private String path;//创建路径
  private byte[] data;//节点数据内容
  private java.util.List<org.apache.zookeeper.data.ACL> acl;//节点权限
  private boolean ephemeral; //是否临时节点
  private int parentCVersion;//父节点的版本号
  //序列化过程

    public void 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);
  }
 //反序列化过程
 public void deserialize(InputArchive a_, String tag) throws java.io.IOException {
    a_.startRecord(tag);
    path=a_.readString("path");
    data=a_.readBuffer("data");
    {
      Index vidx1 = a_.startVector("acl");
      if (vidx1!= null) {          acl=new java.util.ArrayList<org.apache.zookeeper.data.ACL>();
          for (; !vidx1.done(); vidx1.incr()) {
    org.apache.zookeeper.data.ACL e1;
    e1= new org.apache.zookeeper.data.ACL();
    a_.readRecord(e1,"e1");
            acl.add(e1);
          }
      }
    a_.endVector("acl");
    }
    ephemeral=a_.readBool("ephemeral");
    parentCVersion=a_.readInt("parentCVersion");
    a_.endRecord(tag);
}

每条事务记录尾部以’B’字符结尾就是0x42

ZeroPad文件尾部

每个文件尾部都用一个字符 0 填充, 工具Util.padLogFile扩充文件的时候在尾部填写上

    public static long padLogFile(FileOutputStream f,long currentSize,
            long preAllocSize) throws IOException{
        long position = f.getChannel().position();
        if (position + 4096 >= currentSize) {
            currentSize = currentSize + preAllocSize;
            fill.position(0);
            f.getChannel().write(fill, currentSize-fill.remaining());
        }
        return currentSize;
    }

原文地址:https://www.cnblogs.com/senlinyang/p/8408906.html

时间: 2024-10-10 22:33:55

Zookeeper原理分析之存储结构TxnLog的相关文章

Zookeeper原理分析之存储结构Snapshot

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

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

=====================================斩秋|http://blog.csdn.net/quhongwei_zhanqiu======================================= 事务日志文件用来记录事物操作,每一个事务操作如添加,删除节点等等,都会在事务日志中记录一条记录,用来在zookeeper异常情况下,通过txnlog和snapshot文件来恢复数据,下面我们来看下txnLog事务日志文件的格式 打开一个事务日志文件看看 一个日志文

ZooKeeper原理分析

ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名服务等.Zookeeper是hadoop的一个子项目,其发展历程无需赘述.在分布式应用中,由于工程师不能很好地使用锁机制,以及基于消息的协调机制不适合在某些应用中使用,因此需要有一种可靠的.可扩展的.分布式的.可配置的协调机制来统一系统的状态.Zookeeper的目的就在于此.本文简单分析zookeeper的工作原理,对于如何使用zookeeper不是本

zookeeper原理解析-数据存储

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

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

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

MySQL数据库InnoDB存储引擎多版本控制(MVCC)实现原理分析

文/何登成 导读:   来自网易研究院的MySQL内核技术研究人何登成,把MySQL数据库InnoDB存储引擎的多版本控制(简称:MVCC)实现原理,做了深入的研究与详细的文字图表分析,方便大家理解InnoDB存储引擎实现的多版本控制技术(简称:MVCC). 基本知识 假设对于多版本控制(MVCC)的基础知识,有所了解.MySQL数据库InnoDB存储引擎为了实现多版本的一致性读,采用的是基于回滚段的协议. 行结构 MySQL数据库InnoDB存储引擎表数据的组织方式为主键聚簇索引.由于采用索引

Yii2.0中文开发向导——RBAC(基于角色的访问控制权限)表结构原理分析

这里有几个概念很重要,我简单用大白话说一下;权限:就是指用户是否可以执行哪些操作.如:小张可以发帖.回帖.浏览,小红只能回帖.浏览角色:就是上面说的一组操作的集合.如:高级会员有发帖.回帖.删贴.浏览的权限,普通会员只有回帖.浏览的权限.比如小张是高级会员,那么他就可以执行发帖.回帖.删贴.浏览.而小红是普通会员,所以它就只能回帖.浏览.另外角色还可以继承,中级会员除了普通会员的回帖.浏览功能外,还可以发帖.也就是说在普通会员的基础上又增加了一个发帖的权限.在Yii2.0中 yii\rbac:

kafka笔记-Kafka在zookeeper中的存储结构【转】

参考链接:apache kafka系列之在zookeeper中存储结构  http://blog.csdn.net/lizhitao/article/details/23744675 1.topic注册信息 /brokers/topics/[topic] : 存储某个topic的partitions所有分配信息 Schema: {    "version": "版本编号目前固定为数字1",    "partitions": {        &q

Atitit.数据索引 的种类以及原理实现机制 索引常用的存储结构

1. 索引的分类1 1.1. 按照存储结构划分btree,hash,bitmap,fulltext1 1.2. 索引的类型  按查找方式分,两种,分块索引 vs编号索引1 1.3. 顺序索引  vs 散列索引2 1.4. 按索引与数据的查找顺序可分为 正排与倒排索引2 1.5. 单列索引与多列索引 复合索引2 1.6. 分区索引和全局索引 2 1.7.  Trie树一般指字典树 又称单词查找树,Trie树2 1.8. 稠密索引 vs 稀疏索引3 1.9. 多级索引 vs 单击索引3 1.10.