现在开始今天的第三篇博客的撰写,不能扯淡了,好多任务啊。但是还是忍不住吐槽一下,之前选择这篇文章纯属是个意外,我把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. 参考资料

  1. http://pages.cs.wisc.edu/~remzi/OSTEP/file-journaling.pdf

Crash Consistency : FSCK and Journaling的更多相关文章

  1. 原来 Linux 日志文件系统是这样工作的~

    关注「开源Linux」,选择"设为星标" 回复「学习」,有我为您特别筛选的学习资料~ 作者:Linux Performance 链接:http://linuxperf.com/?p ...

  2. 《Remus: High Availability via Asychronous Virtual Machine Replication》翻译

    Abstract 想要让应用能够躲过硬件故障是一项非常昂贵的任务,因为这通常意味着对软件进行重构,使它包含复杂的恢复逻辑的同时需要部署专用的硬件,而这些对于提升大型的或者遗留的应用的可靠性是巨大的障碍 ...

  3. 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. 转-4年!我对OpenStack运维架构的总结

    4年!我对OpenStack运维架构的总结 原创: 徐超 云技术之家 今天 前言 应“云技术社区”北极熊之邀,写点东西.思来想去云计算范畴实在广泛,自然就聊点最近话题异常火热,让广大云计算从业者爱之深 ...

  5. 对OpenStack运维架构的总结(转)

    这里,仅从技术角度出发,谈谈OpenStack云平台在部署.架构和运维实施等方面的感想. 缘起,在2014年大二首次接触到OpenStack,当时国内外资料远没有当前这么丰富,为安装一个OpenSta ...

  6. Configuring High Availability and Consistency for Apache Kafka

    To achieve high availability and consistency targets, adjust the following parameters to meet your r ...

  7. iOS.Crash.OniOS8.WhenCall[popToRootViewController]

    系统iOS 8.x, ARC. CrashCase: 在UIViewController中有一个类型为UIScrollView的实例变量scrollView, 点击UIViewController中的 ...

  8. 【腾讯Bugly干货分享】聊聊苹果的Bug - iOS 10 nano_free Crash

    本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/hnwj24xqrtOhcjEt_TaQ9w 作者:张 ...

  9. iOS 10 开发适配系列 之 权限Crash问题

    升级 iOS 10 之后目测坑还是挺多的,记录一下吧,看看到时候会不会成为一个系列. 直入正题吧 今天用一个项目小小练下手,发现调用相机,崩了.试试看调用相册,又特么崩了.然后看到控制台输出了以下信息 ...

随机推荐

  1. CentOS 7 安装 MySql 8

    1-安装 CentOS 7   2-安装 NETCORE SDK      SDK 安装文档:https://dotnet.microsoft.com/download/linux-package-m ...

  2. 《我是一只IT小小鸟》 读书笔记

    <我是一只IT小小鸟>讲述了IT人员的成长经历,邀请了许多名IT行业的职员,学生,研究生写了自己的亲身经历和人生感悟,以书中可以看到我国IT行业的快速进步,以及看到IT员在这条道路上的坎坷 ...

  3. BETA阶段第一天

    1.提供当天站立式会议照片一张 2.每个人的工作 今天完成工作 林一心 服务器调试 张杭镖 数据库调整 赵意 前端设计 江鹭涛 前端设计 3.发布项目燃尽图 4.每日每人总结 林一心:服务器端的配置不 ...

  4. Haproxy + Rabbit 集群 简要介绍

    # 两台主机都安装上rabbitMQ yum install -y rabbitmq-server   # 两台主机都配置/etc/hosts文件 192.168.23.10 rabbitmq1 19 ...

  5. virsh 命令行管理虚拟机

    重用命令和选项 1:查看运行的虚拟机 virsh list   2:查看所有的虚拟机(关闭和运行的虚拟机) virsh list --all   3:连接虚拟机 virsh console +域名(虚 ...

  6. 第八次JAVA语言笔记

  7. Ubuntu 16.04 LTS安装sogou输入法详解

    http://blog.csdn.net/qq_21792169/article/details/53152700 最近开始学习linux 在安装输入法中遇到的一些问题,最终成功安装,也得益于网络上的 ...

  8. Bootstrap-tagsinput标系统使用心得

    最近工作中由于需求使用到了Bootstrap-tagsinput标系统,我的需求是: 1)能够从后台数据库获取标签信息展示到前端页面: 2)能够实现输入标签添加到后台,并ajax刷新页面: 3)能够实 ...

  9. phaser入手

    做phaser小程序,必须先把环境弄好 发现怎么导入都无济于事. 最后决定亲自操刀,在原代码中,引入全局变量.

  10. Spring学习-1 框架总览

    Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的.框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架. spring ...