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 之后目测坑还是挺多的,记录一下吧,看看到时候会不会成为一个系列. 直入正题吧 今天用一个项目小小练下手,发现调用相机,崩了.试试看调用相册,又特么崩了.然后看到控制台输出了以下信息 ...
随机推荐
- C#中委托的理解
请注意,这只是个人关于C#中委托的一点点理解,参考了一些博客,如有不周之处,请指出,谢谢! 委托是一种函数指针,委托是方法的抽象,方法是委托的实例.委托是C#语言的一道坎,明白了委托才能算是C#真正入 ...
- 程序员必看电影:Java 4-ever
http://blog.csdn.net/zdwzzu2006/article/details/5863068
- (六)Jmeter重要组件的执行顺序及作用域
一.Jmeter重要组件: 1)配置元件---Config Element: 用于初始化默认值和变量,以便后续采样器使用.配置元件大其作用域的初始阶段处理,配置元件仅对其所在的测试树分支有效,如,在同 ...
- (转)ActiveMQ的重连机制
花了一天的时间,终于搞明白了我的疑问. failover://(tcp://localhost:6168)?randomize=false&initialReconnectDelay=100& ...
- javascript之彻底理解闭包
闭包是函数和声明该函数的词法环境的组合. function init() { var name = "Mozilla"; // name 是一个被 init 创建的局部变量 fun ...
- sublime py不能输入中文
设置环境变量PYTHONIOENCODING=UTF-8,重启sublime即可 转载请注明博客出处:http://www.cnblogs.com/cjh-notes/
- Spring 学习 3- AOP
什么是AOP aop就是纵向的编程,业务1和业务2都需要一个共同的操作,与其往每个业务中都添加同样的代码,不如写一遍代码,让两个业务共同使用这段代码. spring中面向切面编程用的是代理模式,它的实 ...
- 【数据库】Mysql更改默认引擎为Innodb的步骤方法
前言 InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定. 基本的差别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持.M ...
- 【Python】内置函数
一.内置函数表格 详细信息 二.内置函数详情 2.1 abs(x) 返回绝对值 1 2 >>> abs(-5) 5 2.2 all(iterable) 如果这个可迭代的元素都为真,就 ...
- PL/SQL中复制粘贴表结构信息
1.打开下图中的Tables文件夹 2.查找要找的表 3.右键单击找到的表—>Describe 4.复制所需的数据到EXCEL表中