• 存储系列之 从ext2到ext3、ext4 的变化与区别


    引言:ext3 和 ext4 对 ext2 进行了增强,但是其核心设计并没有发生变化。所以建议先查看上上篇的《存储系列之 Linux ext2 概述 》,有了ext2的基础,看这篇就是so easy了。所以这篇约70%来自转载+整理,当然整理也是需要花时间的,原则是尽量简单化。最近参加过几场一个在线教育平台的公开课,有句名言“架构就是把复杂的事情简单化,把简单的事情做没了”,非常赞同,而且我认为不管是架构,还是解决问题,还是现在的写文档,都合适。开始进入干货时间。

     

    一、日志文件系统

    1、日志文件系统的提出

    (1)EXT2文件系统在异常关机后,再开机后会造成文件系统的数据不一致,这时必须做文件系统的修复工作,将不一致与错误的地方修复。然而,此工作相当耗时的,特别是容量大的文件系统,而且也不能百分之百保证所有的数据都不会流失。

    (2)CPU速度越来越快,RAM内存越来越大,磁盘高速缓存的容量迅速增加。因此对于大多数的读操作请求来说,有可能直接从高速缓存中得到满足,而不必去真正访问磁盘。

    这样为了解决问题、顺应时代的发展,人们设计了“日志式文件系统 (Journal File System,JFS)” 。

    ext3就是在ext2的基础上增加了这种日志功能。

    JFS最大的特点是,它会将整个磁盘的写入动作完整记录在磁盘的某个区域上,以便有需要时可以回溯追踪

    由于文件的写入包含许多的细节,必须对目录的inode、目录所在块、文件的inode和文件本身执行写操作,每一个细节进行到一半若被中断,就会造成文件系统的不一致,因而需要修复。
    然而,在日志式文件系统中,由于详细纪录了每个细节,故当在某个过程中被中断时,系统可以根据这些记录直接回溯到被中断的部分,而不必花时间去检查其他的部分,故修复速度相当快,几乎不需要花时间。
     
     飞客数据恢复中心提供

    2、三种日志模式

    (1)日记,Journal

    (慢,但风险小)元数据和文件内容都在提交到主文件系统前写入
    这样将提高稳定性但性能上有所损失,因为所有的数据都要写入2次
    如果没有在/etc/fstab 中加上这个选项,修改中的档案遇上kernel panic或突然断电的时候就可能发生损毁的情况,当然,这还是得看软体是怎么写入档案的。
     

    (2)顺序,Ordered

    (中速,中等风险)顺序和写回类似,但在对应的元数据标记为提交前,强制写入文件内容。这是很多Linux发行版默认的方式
     

    (3)回写,Writeback

    (快,但风险最大;在某种感觉上和ext2相当): 这边会写入日志的只有 metadata 而已,档案的内容并不会跟着写入日志里面。
    这样的作法让整个效率变快了不少,不过也同样造成了档案写入时不按顺序的结果。
    举例来说,档案在附加变大的同时发生了 crash 的情况,就可能造成下次挂载时档案后面就附加一堆垃圾数据的情况。
     
    尽管ext3缺少一些当代文件系统的特点,像是动态的inode、树状的资料储放结构等等,都是被视作ext3的缺点之一,不过在这些特点之外,ext3在文件系统回复上面就有了很好的表现。
    跟树状结构的文件系统相比,在ext3上面metadata是放在固定的位置,而且在写入的同时会重复写入的一些资料让ext2/3在面临资料损毁的情况下还有挽回的机会。
     

    二、ext3的特点

    1、高可用性
    宕机发生后,恢复ext3文件系统的时间只要数十秒钟。


    2、数据的完整性:
    ext3文件系统能够极大地提高文件系统的完整性,避免了意外宕机对文件系统的破坏。

    在保证数据完整性方面,ext3文件系统有2种模式可供选择。其中之一就是“同时保持文件系统及数据的一致性”模式。

    采用这种方式,你永远不再会看到由于非正常关机而存储在磁盘上的垃圾文件。


    3、文件系统的速度:
    尽管使用ext3文件系统时,有时在存储数据时可能要多次写数据,但是,从总体上看来,ext3比ext2的性能还要好一些。

    这是因为ext3的日志功能对磁盘的驱动器读写头进行了优化。所以,文件系统的读写性能较之Ext2文件系统并来说,性能并没有降低。


    4、数据转换
      由ext2文件系统转换成ext3文件系统非常容易,只要简单地键入两条命令即可完成整个转换过程,用户不用花时间备份、恢复、格式化分区等。

    用一个ext3文件系统提供的小工具tune2fs,它可以将ext2文件系统轻松转换为ext3日志文件系统。另外,ext3文件系统可以不经任何更改,而直接加载成为ext2文件系统。


    5、多种日志模式
     Ext3有多种日志模式,一种工作模式是对所有的文件数据及metadata(定义文件系统中数据的数据,即数据的数据)进行日志记录(data=journal模式);

    另一种工作模式则是只对metadata记录日志,而不对数据进行日志记录,也即所谓data=ordered或者data=writeback模式。

    系统管理人员可以根据系统的实际工作要求,在系统的工作速度与文件数据的一致性之间作出选择。

    三、ext4特点

    Linux kernel 自2008年的2.6.28 开始正式支持新的文件系统 Ext4。

    Ext4 是 Ext3 的改进版,修改了 Ext3 中部分重要的数据结构,而不仅仅像 Ext3 对 Ext2 那样,只是增加了一个日志功能而已。

    Ext4 可以提供更佳的性能和可靠性,还有更为丰富的功能:

    1. 与 Ext3 兼容。

    执行若干条命令,就能从 Ext3 在线迁移到 Ext4,而无须重新格式化磁盘或重新安装系统。

    原有 Ext3 数据结构照样保留,Ext4 作用于新数据,当然,整个文件系统因此也就获得了 Ext4 所支持的更大容量。


    2. 更大的文件系统和更大的文件。

    较之 Ext3 目前所支持的最大 16TB 文件系统和最大 2TB 文件,Ext4 分别支持 1EB(1,048,576TB, 1EB=1024PB, 1PB=1024TB)的文件系统,以及 16TB 的文件。


    3. 无限数量的子目录。

    Ext3 目前只支持 32,000 个子目录,而 Ext4 支持无限数量的子目录


    4. Extents。

    Ext3 采用间接块映射,当操作大文件时,效率极其低下。比如一个 100MB 大小的文件,在 Ext3 中要建立 25,600 个数据块(每个数据块大小为 4KB)的映射表。

    而 Ext4 引入了现代文件系统中流行的 extents 概念,每个 extent 为一组连续的数据块,上述文件则表示为“该文件数据保存在接下来的 25,600 个数据块中”,提高了不少效率。


    5. 多块分配。

    当写入数据到 Ext3 文件系统中时,Ext3 的数据块分配器每次只能分配一个 4KB 的块,写一个 100MB 文件就要调用 25,600 次数据块分配器,而 Ext4 的多块分配器“multiblock allocator”(mballoc) 支持一次调用分配多个数据块。


    6. 延迟分配。

    Ext3 的数据块分配策略是尽快分配,而 Ext4 和其它现代文件操作系统的策略是尽可能地延迟分配,直到文件在 cache 中写完才开始分配数据块并写入磁盘,这样就能优化整个文件的数据块分配,与前两种特性搭配起来可以显著提升性能


    7. 快速 fsck。

    以前执行 fsck 第一步就会很慢,因为它要检查所有的 inode,现在 Ext4 给每个组的 inode 表中都添加了一份未使用 inode 的列表,今后 fsck Ext4 文件系统就可以跳过它们而只去检查那些在用的 inode 了。


    8. 日志校验。

    日志是最常用的部分,也极易导致磁盘硬件故障,而从损坏的日志中恢复数据会导致更多的数据损坏。

    Ext4 的日志校验功能可以很方便地判断日志数据是否损坏,而且它将 Ext3 的两阶段日志机制合并成一个阶段,在增加安全性的同时提高了性能。


    9. “无日志”(No Journaling)模式。

    日志总归有一些开销,Ext4 允许关闭日志,以便某些有特殊需求的用户可以借此提升性能。


    10. 在线碎片整理。

    尽管延迟分配、多块分配和 extents 能有效减少文件系统碎片,但碎片还是不可避免会产生

    Ext4 支持在线碎片整理,并将提供 e4defrag 工具进行个别文件或整个文件系统的碎片整理。

     

    11. inode 相关特性

    Ext4 支持更大的 inode,较之 Ext3 默认的 inode 大小 128 字节,Ext4 为了在 inode 中容纳更多的扩展属性(如纳秒时间戳或 inode 版本),默认 inode 大小为 256 字节。Ext4 还支持快速扩展属性(fast extended attributes)和 inode 保留(inodes reservation)。


    12. 持久预分配(Persistent preallocation)。

    P2P 软件为了保证下载文件有足够的空间存放,常常会预先创建一个与所下载文件大小相同的空文件,以免未来的数小时或数天之内磁盘空间不足导致下载失败。

    Ext4 在文件系统层面实现了持久预分配并提供相应的 APIlibc 中的 posix_fallocate()),比应用软件自己实现更有效率。


    13. 默认启用 barrier。

    磁盘上配有内部缓存,以便重新调整批量数据的写操作顺序优化写入性能,因此文件系统必须在日志数据写入磁盘之后才能写 commit 记录。(若 commit 记录写入在先,而日志有可能损坏,那么就会影响数据完整性。)

    Ext4 默认启用 barrier,只有当 barrier 之前的数据全部写入磁盘,才能写 barrier 之后的数据。(可通过 "mount -o barrier=0" 命令禁用该特性。)(也可以参考:是否关闭barrier
     

     

    (图片来自:Ext4中两种不同类型的块组其中,GDT全局描述符和LDT局部描述符跟内部缓存相关,后续文章再讲解。)

     

     

    参考资料:

      https://blog.csdn.net/macrossdzh/article/details/5973639(ext2、ext3与ext4的区别)

    《操作系统设计与实现》第三版 上册

     

     

  • 相关阅读:
    《Mybatis 手撸专栏》第8章:把反射用到出神入化
    《Mybatis 手撸专栏》第9章:细化XML语句构建器,完善静态SQL解析
    你说写代码,最常用的3个设计模式是啥?
    netty系列之:netty中常用的xml编码解码器
    java高级用法之:JNA中的回调
    netty系列之:protobuf在UDP协议中的使用
    netty系列之:使用Jboss Marshalling来序列化java对象
    可能有人听过ThreadLocal,但一定没人听过ThreadLocal对象池
    java高级用法之:绑定CPU的线程ThreadAffinity
    netty系列之:netty对marshalling的支持
  • 原文地址:https://www.cnblogs.com/orange-CC/p/12673073.html
Copyright © 2020-2023  润新知