mycat 实施指南
在过去的几期中,我们通过查看非传统文件系统(例如tmpfs和devfs)走了一些弯路。 现在,该回到基于磁盘的文件系统了,我们通过查看ext3来实现。 由Stephen Tweedie博士设计的ext3文件系统建立在现有ext2文件系统的框架上; 实际上,ext3与ext2非常相似,只是有一个小(但很重要)的区别-它支持日志记录。 然而,即使有这么小的添加,我想您也会发现ext3具有一些令人惊讶和有趣的功能。 在本文中,我将为您很好地了解ext3与当前可用的其他日记文件系统的比较。 在我的下一篇文章中,我们将启动并运行ext3。
了解Ext3
那么, 如何 EXT3比较ReiserFS文件系统? 在以前的文章中,我解释的ReiserFS是如何非常适合处理小文件(4K以下),并且在某些情况下,ReiserFS的”小文件性能比ext2和ext3的更大的十到十五倍 。 但是,尽管ReiserFS有很多优点,但也有缺点。 在ReiserFS的当前实现(版本3.6)中,某些文件访问模式实际上会导致性能大大低于ext2和ext3,特别是在读取大型邮件目录时。 另外,ReiserFS的NFS兼容性记录也不佳,稀疏文件性能也很差。 相反,ext3是一个非常完善的文件系统。 它很像ext2; 它不会为您提供ReiserFS所提供的惊人的快速小文件性能,但也不会给您带来任何意外的性能或功能故障。
ext3的优点之一是,因为它基于ext2代码,所以ext2和ext3的磁盘格式是相同的。 这意味着可以将完全卸载的ext3文件系统重新安装为ext2文件系统,这绝对没有问题。 不仅如此。 由于ext2和ext3使用相同的元数据,因此可以将ext2升级到ext3文件系统 。 是的,你看的没错。 通过升级一些关键的系统实用程序,安装现代的2.4内核并在每个文件系统中键入单个tune2fs
命令,可以将现有的ext2服务器转换为日记ext3系统。 您甚至可以在挂载 ext2文件系统时执行此操作。 过渡是安全的,可逆的且非常容易,并且与转换为XFS,JFS或ReiserFS不同,您无需从头开始备份和重新创建文件系统。 现在,暂时考虑一下现有的成千上万个生产ext2服务器,这些服务器距离ext3升级只有几分钟的路程。 然后,您将很好地了解ext3对Linux社区的重要性。
如果我必须用一个词来形容ext3,我会称其为“舒适”。 对现有的ext2系统进行ext3启用非常容易,而且这样做之后,您就不会遇到任何意外的性能怪癖。 ext3在舒适度部门中还有另一种出色的表现。 ext3恰好是可用于Linux的最可靠的日志文件系统之一,如下所述。
Ext3的可靠性
除了与ext2兼容之外,ext3还通过共享ext2的元数据格式继承了其他好处。 首先,ext3用户可以使用坚如磐石的fsck工具。 您会记得,使用日记文件系统的要点之一是首先避免了详尽的fsck的需要。 但是,如果最终从不稳定的内核,不良的硬盘驱动器或其他东西中获取损坏的元数据,您将不胜感激ext3继承了ext2的fsck。 相反,ReiserFS文件系统”的fsck正处于起步阶段,和固定片状元数据时, 它显示了可能是一个困难和危险的过程。
仅元数据日记
有趣的是,ext3处理日记的方式与ReiserFS和其他日记文件系统的方式非常不同。 使用ReiserFS,XFS和JFS,文件系统驱动程序记录元数据 ,但不提供记录数据的准备 。 使用仅元数据的日记记录,您的文件系统元数据将变得坚如磐石,您可能永远不需要执行详尽的fsck。 但是,意外重启和系统锁定可能导致最近修改的数据严重损坏。 Ext3使用了几个创新的解决方案来避免这些问题,我们将在稍后讨论。
但是首先,必须准确了解仅元数据的日记最终会如何困扰您。 举例来说,假设您在机器意外锁定并强制重新启动时正在修改名为/tmp/myfile.txt的文件。 如果您使用的是仅元数据的日记文件系统,例如ReiserFS,XFS或JFS,则由于有了元数据日志,您的文件系统元数据将易于修复,并且您无需费力地坐下来。
但是,很有可能,当您将/tmp/myfile.txt加载到文本编辑器中时,您的文件不仅会丢失最近的更改,而且会包含大量垃圾,甚至可能完全无法读取。 这并非总是会发生,但可能会发生并且经常发生。
这就是为什么。 典型的日志文件系统(例如ReiserFS,XFS和JFS)对元数据有额外的特殊照顾,但对数据的关注不是很多。 在上面的示例中,文件系统驱动程序正在修改几个文件系统块。 文件系统驱动程序更新了适当的元数据,但没有时间将数据从其缓存刷新到磁盘上的新块。 因此,当您将/tmp/myfile.txt加载到文本编辑器中时,文件的部分或全部包含垃圾-系统锁定之前未及时初始化的数据块。
ext3方法
既然我们对这个问题有了一个很好的一般理解,让我们看看ext3是如何实现日记功能的。 在ext3中,日志记录代码使用称为“日志记录块设备”层或JBD的特殊API。 JBD的设计旨在明确实现在任何类型的块设备上实现日志的目的。 Ext3通过“加入” JBD API来实现日记功能。 例如,ext3文件系统代码将通知JBD它正在执行的修改,并且还将在修改磁盘上的某些数据之前请求JBD的许可。 这样,将为JBD提供适当的机会来代表ext3文件系统驱动程序管理日志。 这是一个很好的安排,并且由于JBD是作为单独的通用实体开发的,因此将来可以将其用于向其他文件系统添加日记功能。
这是有关JBD管理的ext3日记的一些巧妙的东西。 例如,ext3的日志存储在一个inode中-一个文件。 根据您“ ext3-enable”文件系统的方式,您是否可以看到位于/.journal的该文件。 当然,通过将日志存储在inode中,ext3能够将所需的日志添加到文件系统中,而无需对ext2元数据进行不兼容的扩展。 这是ext3文件系统保持与ext2元数据以及ext2文件系统驱动程序向后兼容的关键方式之一。
不同的日记方法
毫不奇怪,事实证明,存在多种实现日记的方法。 例如,文件系统开发人员可以设计一个日记,该日记存储需要在主机文件系统上修改的字节范围 。 这种方法的优点是您的日志将能够以非常有效的方式存储对文件系统的微小修改,因为它只会记录需要修改的单个字节,仅此而已。
JBD采用了另一种方法,并且在某些方面更好。 JBD不会记录必须更改的字节范围,而是自己存储完整的修改后的文件系统块。 ext3文件系统驱动程序也使用这种方法,并将修改后的块的完整副本(1K,2K或4K)存储在内存中,以跟踪未决的IO操作。 起初,这似乎有点浪费。 毕竟,完整块包含已修改的数据,但也可能包含未修改的 (已在磁盘上)数据。
JBD使用的方法称为物理日记帐,这意味着JBD使用完整的物理块作为实现日记帐的基础货币。 相反,仅存储修改后的字节范围而不是完整块的方法称为逻辑日志记录 ,这是XFS使用的方法。 因为Ext3使用物理日志,Ext3日记将有较大的相对磁盘上占用空间比,也就是说,一个XFS杂志。 但是由于ext3在内部和日记中使用完整的块,因此ext3不会像实现逻辑日记那样处理那么多的复杂性。 另外,使用完整块使ext3可以执行一些其他优化,例如将单个块内的多个待处理IO操作“压缩”到相同的内存数据结构中。 反过来,这允许ext3在单个写入操作中而不是多个写入操作中将这些多个更改写入磁盘。 另外,由于文字块数据存储在内存中,因此在将其写入磁盘之前几乎不需要或不需要对内存中数据进行大规模处理,从而大大减少了CPU开销。
Ext3,数据保护器
现在,我们终于可以看到ext3文件系统如何有效地提供元数据和数据日记功能,从而避免了我在本文前面描述的数据损坏问题。 实际上,ext3实际上有两种方法来确保数据和元数据的完整性。
最初,ext3旨在执行完整的数据和元数据日志记录。 在这种模式下(称为“数据=新闻”模式),JBD将所有对文件系统的更改记录在日志中,无论是对数据还是对元数据进行的更改。 由于数据和元数据均已记录日志,因此JBD可以使用日志将元数据和数据都恢复到一致状态。 全数据日志记录的缺点是它可能很慢,尽管您可以通过设置相对较大的日志来减少性能损失。
最近,在ext3中添加了新的日志记录模式,该模式提供了完整日志记录的优点,但不会造成严重的性能损失。 此新模式仅通过记录元数据来工作。 但是,ext3文件系统驱动程序会跟踪与每个元数据更新相对应的特定数据块,并将它们分组为一个称为事务的单个实体。 当事务适当地应用于文件系统时,数据块首先被写入磁盘。 写入后,元数据更改将被写入日志。 通过使用这种技术(称为“数据=有序”模式),即使只有元数据更改记录在日志中,ext3也可以提供数据和元数据一致性。 ext3默认使用此模式。
结论
如今,许多人正在尝试确定哪种Linux日志文件系统是“最佳”的。 实际上,每个应用程序都没有一个“正确的”文件系统。 每个人都有自己的优势。 这是拥有众多可供选择的下一代Linux文件系统的好处之一。 因此,与其选择一个任意的“最佳”文件系统并将其用于每个可能的应用程序,不如了解每个文件系统的优缺点,这样您就可以明智地决定使用哪个文件系统,这是可取的。
Ext3具有许多优势。 它的设计使其非常易于部署。 它基于可靠的ext2文件系统代码,并且继承了出色的fsck工具。 ext3的日记功能经过专门设计,可确保元数据和数据的完整性。 总而言之,ext3是一个真正出色的文件系统,并且是现在古老的ext2文件系统的值得继承的文件。 当我们启动并运行ext3时,请加入我的下一篇文章。 在此之前,您可能需要检查以下资源。
翻译自: https://www.ibm.com/developerworks/opensource/library/l-fs7/index.html
mycat 实施指南