Crash Consistency : FSCK and Journaling
现在开始今天的第三篇博客的撰写,不能扯淡了,好多任务啊。但是还是忍不住吐槽一下,之前选择这篇文章纯属是个意外,我把Crash看做了Cache,唉,要不然也就不用写这篇文章了。
1. 这篇博客讲什么?
本文讲述两种方法来增强文件系统的健壮性,也就是说机器的突然故障对数据造成的影响可以被恢复。第一种被称之为FSCK(File System Checker),说白了就是扫描整个磁盘按照各种情况进行恢复,本文对它不感兴趣(因为复杂且不实用,喜欢的可以看后面的参考资料);第二种是Journaling方法,这个是重点。
2. The Crash Consistency Problem
为什么这个问题会存在呢?如果说所有的磁盘写操作都是原子操作,那岂不是就没这个问题了么?最多给Cache也换成那种断点数据不丢失的存储介质。但是事实上,做不到原子啊,天知道在传输的哪一步出问题,而且也不能指望出问题后这个失败的操作没有后遗症。
3. FSCK
不准备详细介绍这个方法,一句话总结:“丢了一把钥匙,我却要翻遍整个屋子”。
4. Journaling
其实这个又被称作Write-Ahead Logging,跟之前说到的Log-Structure的思想差不多,也就是在更新文件状态前先写数据,这两者有着严格的时间先后顺序。简单来说就是先把数据写入磁盘中的Journaling中,确保写入完成之后再将数据写入到它们最终的地址同时更新状态表明写入成功。
- 首先看看这个Journaling跟文件系统是怎么共存在磁盘的。如下图:
好了,下面正式介绍这个操作吧。 data journaling
假设我们现在要往磁盘里面写入inode,bitmap以及一个datablock,那么为了确保安全,我们先将这些数据写入磁盘的Journaling中,同时我们存入这个操作的元数据,结果是这样子的:
其中的TxB表示translation begin,里面存储了操作的元数据,比如inode、bitmap、datanode的真实目的地址(就是最终要把这些数据存在哪儿)以及某种形式的Transection ID(TID);TxE表明transection end,里面当然也包含了TID了。 那么整个的写入操作的过程是这样的:- Journal write:将上面提到的那个结果TxB和TxW包装的数据写入磁盘的Journaling区域,并且等候操作的完成;
- Checkpoint: 将数据写入到它们最终目的地。
一个问题
上面这么操作可行么?答案是不可以,因为真实写操作的时候,磁盘内部可能因为调度而将写的顺序改变,也就是说并不一定是先写TxB,然后Inode 等等,所以可能出现磁盘除了data block外的结果块写完了,然后再去写data block而在这个过程中挂了。这样一来Journaling就认为希望完成了,而实际上却没有。
为了解决这个问题,只能分步写了,见下图:
- Journal write: 写传输内容(包括TxB,metadata以及data),等候完成;
- Journal commit:写TxE,等候完成;
- Checkpoint:同上
Journaling空间管理
按照上面的操作,Journaling空间迟早被耗尽,所以怎么办,必须有空间回收机制。所以呢,就把整个Journaling当做一个环形存储,空间到头了就从头开始写。为了便于管理,新增一个Journal Super Block,见下图:
那么什么时候回收呢?很简单,每次checkpoint之后那些数据就没用了,所以就checkpoint之后回收吧。 以上这种叫做data journaling。data journaling总体执行顺序

效率? 按照上面的操作应该是可以执行了,但是效率是个问题,因为每个写操作都需要写两次,第一次写入journaling,然后再写到最终目的地。为了提高效率,就考虑直接将data写入到最终目的地。那么问题来了,什么时候写data。必须在Journal commit之前!! 这种叫做metadata journaling。
- data write:
- Journal metadata write
- Journal commit
- checkpoint metadata
- free
metadata journaling总体执行顺序

一个很玄乎的错误 这个错误是这样的,对于metadata journaling适用。磁盘地址1000出存储了文件夹foo的数据;此时,在这个文件夹下创建一个新文件,于是需要将文件夹foo的数据(这是metadata哦)做修改;然后,删除文件夹foo以及其包含的所有文件;然后写文件foobar,目的地址恰好也是在block1那边,于是一切正常;注意第一步第三步操作都没有被checkpoint,而第二步压根不需要Journaling。此时机器故障了,那么重启之后根据Journaling数据恢复,此时的Journaling是这样的:
恢复的时候首先checkpoint第一步操作,于是将“修改后的文件夹数据”写入地位为1000的block;接着checkpoint文件foobar,由于是metadata journaling,所以foobar的数据本身是没有的,只有metadata。于是乎,foobar的数据永远丢失了~~~
那么怎么处理这个问题呢?
有两种方法:- 只有当被删除的block被从journal中checkpoint之后才去使用;也就是说block被删除之后,如果此时journal中还有关于这个block的操作没有被checkpoint,则不用这个block。
- 每次删除block后,将Journal中关于这个block的操作设置为revoked,那么恢复的时候,跳过所有的revoked操作。
终于写完了~~~~~~~~~~~~~~~~~~~~~~~~~~~~
5. 参考资料
❝
- http://pages.cs.wisc.edu/~remzi/OSTEP/file-journaling.pdf
❞
Crash Consistency : FSCK and Journaling的更多相关文章
- 原来 Linux 日志文件系统是这样工作的~
关注「开源Linux」,选择"设为星标" 回复「学习」,有我为您特别筛选的学习资料~ 作者:Linux Performance 链接:http://linuxperf.com/?p ...
- 《Remus: High Availability via Asychronous Virtual Machine Replication》翻译
Abstract 想要让应用能够躲过硬件故障是一项非常昂贵的任务,因为这通常意味着对软件进行重构,使它包含复杂的恢复逻辑的同时需要部署专用的硬件,而这些对于提升大型的或者遗留的应用的可靠性是巨大的障碍 ...
- Some current MySQL Architecture writings
Posted on 19/09/2014 by Stewart Smith So, I’ve been looking around for a while (and a few times now) ...
- 转-4年!我对OpenStack运维架构的总结
4年!我对OpenStack运维架构的总结 原创: 徐超 云技术之家 今天 前言 应“云技术社区”北极熊之邀,写点东西.思来想去云计算范畴实在广泛,自然就聊点最近话题异常火热,让广大云计算从业者爱之深 ...
- 对OpenStack运维架构的总结(转)
这里,仅从技术角度出发,谈谈OpenStack云平台在部署.架构和运维实施等方面的感想. 缘起,在2014年大二首次接触到OpenStack,当时国内外资料远没有当前这么丰富,为安装一个OpenSta ...
- Configuring High Availability and Consistency for Apache Kafka
To achieve high availability and consistency targets, adjust the following parameters to meet your r ...
- iOS.Crash.OniOS8.WhenCall[popToRootViewController]
系统iOS 8.x, ARC. CrashCase: 在UIViewController中有一个类型为UIScrollView的实例变量scrollView, 点击UIViewController中的 ...
- 【腾讯Bugly干货分享】聊聊苹果的Bug - iOS 10 nano_free Crash
本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/hnwj24xqrtOhcjEt_TaQ9w 作者:张 ...
- iOS 10 开发适配系列 之 权限Crash问题
升级 iOS 10 之后目测坑还是挺多的,记录一下吧,看看到时候会不会成为一个系列. 直入正题吧 今天用一个项目小小练下手,发现调用相机,崩了.试试看调用相册,又特么崩了.然后看到控制台输出了以下信息 ...
随机推荐
- Ubuntu16.04安装json-c
1. 安装依赖 sudo apt-get install git gcc clang libtool autoconf automake doxygen valgrind 一些版本要求,如果版本过低可 ...
- JavaScript DOM编程艺术学习笔记-第一章JavaScript简史
一,JavaScript的起源 JavaScript是Netscape与Sun公司合作开发,它是一种脚本语言,通常只能通过Web浏览器去完成一些操作.JavaScript为程序员提供了一些操控Web浏 ...
- mb_strlen(,utf-8);可以除去中文字符,统一返回是几个字符
mb_strlen(,utf-8);可以除去中文字符,统一返回是几个字符
- java 基础 --File
1, 创建文件 File file = new File(path); file.createNewFile(); //如果路径不存在,会抛异常 file.mkdir();//如果路径不存在,返回fa ...
- spring 整合 struts2 + Hibernate application配置文件(基于注解)
下面是 application.xml 文件. <?xml version="1.0" encoding="UTF-8"?> <beans x ...
- 阿里巴巴分布式数据库服务DRDS研发历程
淘宝TDDL研发历史和背景 分布式关系型数据库服务(Distribute Relational Database Service,简称DRDS)是一种水平拆分.可平滑扩缩容.读写分离的在线分布式数据库 ...
- Using the command line to manage files on HDFS--转载
原文地址:http://zh.hortonworks.com/hadoop-tutorial/using-commandline-manage-files-hdfs/ In this tutorial ...
- elsarticle模板 去掉Preprint submitted to
参考:http://latex.org/forum/viewtopic.php?t=11123 修改elsarticle.cls文件. 我的CTeX装在c盘中,elsarticle.cls文件路径为: ...
- InnoDB事务日志(redo log 和 undo log)详解
数据库通常借助日志来实现事务,常见的有undo log.redo log,undo/redo log都能保证事务特性,undolog实现事务原子性,redolog实现事务的持久性. 为了最大程度避免数 ...
- java中main函数怎么调用外部非static方法
使用外部方法时(不管是static还是非static),都要先new一个对象,才能使用该对象的方法. 举例如下: 测试函数(这是错误的): public class Test { public sta ...