业务开发算法 50 讲
黄清昊
Hashdata 数据库内核工程师,LeetCode 高赞答主,公众号微扰理论作者
23292 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 51 讲
业务开发算法 50 讲
15
15
1.0x
00:00/00:00
登录|注册

16|日志型文件系统:写入文件的时候断电了会发生什么?

Checkpointing: 实际写入磁盘数据结构
Journal Write: 记录操作到日志区
优势: 快速恢复到一致状态
步骤:
核心: 预写日志(WAL)
问题: 时间消耗大,不能解决所有问题
策略: 挂载时检查并修复错误
讨论: 日志记录时的限制和性能提升
思考: 利用磁盘调度特性提高写文件性能
安全硬件: 使用日志思想保证状态一致性
仅记录元数据: 减少日志空间
批量日志更新: 提高吞吐量
Checkpointing中断: 重做日志操作
Journal Write中断: 事务未提交,无影响
事务结束(TxE)
修改记录: Inodes, Bitmaps, 数据块
事务开始(TxB)
Journaling(日志型文件系统)
FSCK机制
影响: 文件损坏,系统状态不正确
原因: 写操作是操作序列,非单一操作
问题: 写文件时断电导致数据不一致
Bitmaps: 标记Inodes和Data Blocks使用状态
数据块区(Data Blocks): 存放实际数据
索引节点区(Inode): 存放文件数据块地址
超级块: 存放文件系统信息
数据存储: 数据放在数据块上
: 多个扇区组成(4KB)
扇区: 磁盘读写最小单位(512B)
重要性: 保证数据可持久化
功能: 提供文件接口,管理文件和目录
定义: 管理文件的操作系统子系统
课后练习
实际应用案例
优化思路
崩溃处理
日志区内容
解决方案
崩溃一致性问题
文件系统组成
磁盘与数据存储
文件系统基础
日志型文件系统

该思维导图由 AI 生成,仅供参考

你好,我是微扰君。
今天我们就来聊一聊操作系统最常见的外存——磁盘的问题。我们知道计算机的内存一旦断电,数据就会全部丢失,所以如果需要持久化一些数据,磁盘就是必不可少的硬件,甚至在计算机上运行的整个操作系统的大部分代码逻辑,其实也是存储在磁盘中的。
计算机要和磁盘打交道,就需要用到文件系统。
文件系统,其实就是操作系统中用于管理文件的子系统,它通过建立一系列诸如文件、目录,以及许多类似于 inode 这样的元数据的数据结构,把基础的文件访问能力抽象出来,给用户提供了一套好用的文件接口。
和一般的数据结构和算法主要考虑性能不同,文件系统还需要考虑一件非常重要的事情——数据的可持久化。因为文件系统一定要保证,计算机断电之后整个文件系统还可以正常运作,只要磁盘没有损坏,上面的数据在重新开机之后都可以正常访问。
这件事听起来感觉很简单,但是真正实践起来可要难得多,在过去几十年里为了解决各种各样不同的问题,文件系统层出不穷,今天我们就来讨论其中一个问题:写文件写到一半断电了,或者因为各种各样的原因系统崩溃了,系统重启之后文件是否还能被正常地读写呢?如果不能的话,我们应该怎么办呢
这个问题,我们一般叫崩溃一致性问题(crash-consistent problem)。目前最流行的解决方案是 Linux 中的 Ext3 和 Ext4 文件系统所采用的日志方案,也就是 journaling,而 Ext3 和 Ext4 自然也就是所谓的日志型文件系统。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

日志型文件系统是操作系统中用于管理文件的子系统,通过建立一系列数据结构,抽象出基础的文件访问能力,保证数据的可持久化。文章介绍了崩溃一致性问题的本质,即在写文件时可能出现的一致性问题,以及如何解决这一问题。文件系统中引入元数据带来了灵活性的同时,也带来了问题,每次写文件的操作实际上是一个操作序列,而不是一个单一的操作,这就引入了崩溃一致性问题。解决方案包括早期的FSCK机制和日志机制。FSCK机制通过挂载磁盘的时候检查错误并修复来解决问题,但其执行时间较长。相比之下,日志型文件系统采用日志机制,通过记录文件系统操作的日志,可以在系统崩溃后恢复到一个合法的状态,从而解决了崩溃一致性问题。文章深入浅出地介绍了文件系统的存储方式、元数据的问题以及解决方案,为读者提供了深入了解文件系统的基础知识。 日志型文件系统的核心思想是预写日志(WAL),即在执行真正的操作之前,先记录下要做的操作,以保证系统在崩溃后能恢复到正确状态。通过引入事务的概念,每次写文件操作都会记录对Inodes和Bitmaps的修改,并在记录前后引入事务开始和结束记录,从而实现原子性。日志的组织形式由一系列事务拼接而成,当系统崩溃时,可以根据日志恢复文件系统到合法状态。文章还提到了崩溃出现在不同阶段的处理方式,以及对日志记录方式的优化,如批量日志更新和只记录元数据等。通过引入预写日志的手段,日志型文件系统解决了文件状态不一致的问题,相比于传统的FSCK机制,提高了系统的恢复效率和性能。 总的来说,日志型文件系统通过引入预写日志的机制,解决了崩溃一致性问题,保证了文件系统的可靠性和一致性。同时,文章还提到了对日志记录方式的优化,为读者提供了深入了解文件系统的基础知识,并鼓励读者思考如何进一步提高文件系统的性能。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《业务开发算法 50 讲》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(14)

  • 最新
  • 精选
  • 有铭
    原来以前windows xp和更老的系统在非正常关机后,再开机就会有一个蓝屏在那扫啊扫的读磁盘,就是在干FSCK?

    作者回复: 哈哈哈 我觉得很可能是 不过也不是完全确定

    2022-01-21
    2
  • blentle
    限制应该是写入块的公平性吧.

    作者回复: blentle同学你好。 重要的是如果让几个不同的元数据和data block数据按照磁盘调度的顺序写入;一定也要保证commits操作是一个单独的阶段;也就是正式写入TxE之前,之前的所有写操作已经完成。 否则断电发生时,即使引入了日志机制,也仍然会有产生脏数据的风险。 可以加wechat: constant_variation 一起打卡学习

    2022-01-15
    2
    2
  • 女干部
    被作者的知识储备量吓到了

    作者回复: 哈哈哈 其实认真的话好好积累一年可能就可以了;多看一些经典的计算机课程更好; 我自己储备其实还很有待提高的 一起加油 可以加我微信 constant_variation

    2022-02-25
    1
  • 阿甘
    怎么发现事务以及提交了,但是实际文件操作没有成功呢?是不是有一个当前已经提交的事务id?如果是的话这个id的更改是不是要是事务性的?

    作者回复: 事实上,并不会真的去主动发现这件事。如果出现崩溃,文件系统会直接从checkpoint开始往后执行redo log里的所有指令。 另外事务ID就是一个自增的值而已,本身就是原子的操作。

    2022-01-26
  • 春风
    那么MySQL的redo log所谓的顺序写入,其实也要写几处地方吗?

    作者回复: 我理解数据库里面也有元数据等信息;一条数据的插入需要修改的地方很多;比如索引等。具体和不同的DBMS实现有关。

    2022-01-22
  • HappyHasson
    journaling log占用空间大小怎么设定,按照图解,应该不能弹性扩展吧,如果jouraling预留空间不够,会有数据搬迁?
    2022-04-07
    1
  • Jagger
    优化里提到,日志只记录元数据,不记录数据块,是否意味着要数据块区先确保数据块写完,才能记录TxE?
    2023-02-04归属地:上海
  • 平凡是唯一答案
    这个文章前面说了一句: 以及许多类似于 inode 这样的元数据的数据结构。 后面解释索引节点区的时候,说了这样一句: Inode 也是元数据主要存储的地方。 请问,这个文章当中,Inode 和 元数据 ,到底是什么关系? Inode就是元数据,还是说,Inode是存储元数据的区域啊?
    2022-12-29归属地:北京
  • 平凡是唯一答案
    这里有个阅读理解上的问题。 上文说,Linux将「文件」划分成几块区域:至少包括:超级块、索引节点区、数据块区。 下文开始具体说这几个区域。其中解释「超级块」的时候,是这样解释的。 超级块,是「文件系统」的第一个块。 那么,这里从阅读上就有歧义。Linux到底是将「文件」划分成了三个块,还是将「文件系统」划分成了三个块? 这里的「文件」和「文件系统」是个什么关系?
    2022-12-29归属地:北京
  • 全麦小面包
    用单片机往闪存写状态的例子,除了预写日志的方式,我觉得也可以额外加1个状态:"写入中"。 写入前将"写入中"状态置为1,写入完成后将"写入中"状态置为0。 若中间突然断电,重启后,因"写入中"状态为1,将所有状态擦除,置为默认值(就是不知道是否有默认值?还有,这样直接丢掉上一次操作是否可行?)。 麻烦老师指点下,谢谢~
    2022-09-27归属地:上海
收起评论
显示
设置
留言
14
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部