您的位置:首页 > 其它

4.zookeeper原理解析-数据存储之FileTxnLog& FileTxnSnapLog工具

2015-05-11 19:41 561 查看
=====================================斩秋|http://blog.csdn.net/quhongwei_zhanqiu=======================================

FileTxnLog类用来操作事务记录文件下面我们来看看这个类主要实现方法

4.1)append方法: 用来向文件尾部添加一条记录
   4.1.1)判断当前输入流logStream是否已清空(在同步处理器SyncRequestProcessor中据一定算法得出一个count,记录大于count就要rollLog,开启一个新的文件,算法是: 100000/2 + random.nextInt(100000/2), 这个十万是一个默认值可配置),清空开启一个新的文件写入
   4.1.2)padFile()判断是否要扩充文件容量预分配buffer,当buffer容量小于等于4k的时候预分配,每次扩充预分配64k容量
   4.1.3)数据序列化,写入输入流缓存
 
4.2)read(zxid): 读取事务日志, 这个方法在服务当机恢复的时候,用来遍历事务日志来恢复数据。Zxid是事物日志号递增生成,在FileTxnLog中会将大于zxid的所有日志文件组合成一个FileTxnIterator用来遍历从zxid开始的所有日志
   4.2.1)FileTxnIterator的构造器中调用init方法,init方法中过滤出所有需要读的日志文件,并利用goToNextLog()方法打开第一个日志日志文件的输入流
   4.2.2)FileTxnIterator的next方法用来从日志文件中读取一条记录,校验并反序列化出来,读取成功返回true,如果读到了文件末尾调goToNextLog()读下一个文件,以此递归直到最后
   4.2.3)FileTxnIterator的getTxn()方法,返回next()方法中读取的记录
 
4.3)commit()方法,将流中数据刷到硬盘SyncRequestProcessor中任务会定时调用异步刷盘
4.4)truncate(zxid)方法,用来删除日志,主要是在恢复数据的时候,利用leader的最后有效zxid,来删除learner的无效多余的事务记录。类似于数据库中的truncate操作概念,它并不是一条一条删除记录,大于zxid的文件直接将文件删除掉,zxid所在文件直接修改文件的长度,将文件长度设置到zxid所在的位置
      
4.5)序列化事务记录



4.6)反序列化事务记录

    


5FileTxnSnapLog            
  这是一个工具类主要用来操作TxnLog和Snapshot文件,我们主要关注一下restore方法

=====================================斩秋|http://blog.csdn.net/quhongwei_zhanqiu=======================================
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  zookeeper
相关文章推荐