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 之后目测坑还是挺多的,记录一下吧,看看到时候会不会成为一个系列. 直入正题吧 今天用一个项目小小练下手,发现调用相机,崩了.试试看调用相册,又特么崩了.然后看到控制台输出了以下信息 ...
随机推荐
- lintcode-387-最小差
387-最小差 给定两个整数数组(第一个是数组 A,第二个是数组 B),在数组 A 中取 A[i],数组 B 中取 B[j],A[i] 和 B[j]两者的差越小越好(|A[i] - B[j]|).返回 ...
- 使用Logstash同步数据至Elasticsearch,Spring Boot中集成Elasticsearch实现搜索
安装logstash.同步数据至ElasticSearch 为什么使用logstash来同步,CSDN上有一篇文章简要的分析了以下几种同步工具的优缺点:https://blog.csdn.net/la ...
- nginx 几个常用的标准模块介绍
ngx_http_ssl_module(https) 1:指明是否启用的虚拟主机的ssl功能 ssl on | off; 2:指明虚拟主机使用的证书文件 ssl_certificate /usr/lo ...
- IP ,路由
ifconfig 命令 ip信息 enp0s3: flags=4163<UP(已经启用),BROADCAST(支持广播),RUNNING,MULTICAST(支持多播)> ...
- jQuery之元素查找
在已经匹配出的元素集合中根据选择器查找孩子/父母/兄弟标签1. children(): 子标签中找2. find() : 后代标签中找3. parent() : 父标签4. prevAll() : 前 ...
- 《构建之法》第6~7章读后感和对Scrum的理解
第6章 敏捷流程 “敏捷流程”是一系列价值观和方法论的集合.从2001年开始,一些软件界的专家开始倡导“敏捷”的价值观和流程, 他们肯定了流行做法的价值,但是强调敏捷的做法更能带来价值. 敏捷开发原则 ...
- Java String简单知识点总结
1.字符串的比较 public void run(){ //str1在池中 String str1 = new String("String"); //str2,str3 存在于堆 ...
- 【BioCode】删除未算出PSSM与SS的蛋白质序列
代码说明: 由于一些原因(氨基酸序列过长),没有算出PSSM与SS,按照整理出来的未算出特征的文件,删除原来的蛋白质序列: 需删除的氨基酸文件732.txt(共732条氨基酸): 删除前 氨基酸共25 ...
- 转载免安装版mysql的配置
解压到自定义目录,我这里演示的是D:\wamp\mysql\ 复制根目录下的my-default.ini,改名为my.ini,my.ini用下面内容替换 #以下是复制内容,这行可不复制 [clie ...
- gulp 定义依赖关系
var gulp = require('gulp'); // 返回一个 callback,因此系统可以知道它什么时候完成 gulp.task('one', function(cb) { // 做一些事 ...