设为首页 收藏本站
查看: 545|回复: 0

[经验分享] 深入浅出文件系统中的日志系统功能

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2016-8-29 09:10:31 | 显示全部楼层 |阅读模式
1.日志系统出现的背景

日志系统出现在20世纪末。最早的日志文件系统出现在1990年IBM的JFS(journalfile system)上。1994年,为了更好地支持高性能,SilliconGraphics引进了XFS。从20011年开始,linux系统中就开始支持ext3fs。到了今天,ext4fs、Reiser4、ceph等文件系统都支持了日志系统。

2.日志系统的功能

日志文件系统的功能主要是为了提高文件系统的一致性和性能。

2.1一致性
通过日志系统记录写操作,避免异常关机、掉电等造成文件系统中元数据和文件数据的不一致,文件系统重启后能通过重放之前未完成的操作来实现一致性。

2.1性能
在当代的文件系统设计中,利用快速的日志设备来提高文件写操作的速度,比如SSD以及一些非易失性内存,都可以用来当作日志设备。此外,还可以在日志系统层次进行写合并等优化。

3.日志系统的原理

3.1日志系统避免文件系统崩溃的原理

在系统异常掉电、关机或者重启的情况下,很可能出现存储设备上的用户文件数据和文件索引、记录等元数据不一致的情况。针对这一问题,传统的Linux系统通过在开机时用fsck命令来检查元数据和用户文件数据是否一致。如果一致,可以认为文件系统完整无损;否则,需要定位是哪一块设备造成这一现象,随之进行恢复。如果fsck也不能恢复,可能需要进入单用户模式手动进行恢复。有了日志系统之后,写入的rawdata先到了独立于文件系统的日志设备或者资源上,只有当文件data写入到了文件系统磁盘或者日志设备之后,文件系统最后才会把rawdata写入到文件系统磁盘里面去。这样就能保证文件系统对应的磁盘里的rawdata和data的一致性。

根据写文件数据和元数据的先后顺序,日志文件系统可以分为下面几种:


Type
Wring                        file data to Log
Writing                        raw data to Log
comments
Write-back
Second                        step:
N,                        to disk
First                        step: Y
May                        crash when system crash before writing to disk
Ordered
First                        step: N, to                        disk
Second                        step: Y
Keep                        coherence
Data
Second                        step: Y
Firste                        step: Y
Affect                        performance
日志系统上会记录一条条待提交的写操作,根据每次提交记录的数目和日志设备是否满的状况,又可以分成下面几种方式:

Type
Sub-type
Comments
One                        record per commit
Quickly                        sync between log and disk, worse performance
Several                        records per commit
Commit                        when log is full
Slowly                        sync between log and disk, better performance
Commit                        when log isn't full
由于日志设备上记录的数据是非易失性的,系统重启后文件系统的初始化过程中会把日志设备上记录的、尚未写到文件系统盘上的rawdata乃至文件数据写到文件系统盘。这个过程就像把之前记录的写操作一个个复现,也叫做重放或者重演。


3.2日志文件系统加速文件写操作的原理
日志对写操作的优化来自于日志设备较之于普通文件系统磁盘写操作快得多的速度。两种设备写操作的速度差异越大,日志系统对写操作的性能提升就越多。和不用快速设备做logdevice的文件系统相比,每一次IO写操作,这种方案能节省的时间是之前一次文件系统盘写的时间减去一次logdevice写的时间。

当文件系统把元数据乃至文件数据写到日志设备后,就可以向上级返回写操作完成。此时,虽然数据还没有真正落到文件系统盘,但是后台会有线程或者类似机制把logdevice上的数据自动提交到文件系统盘上去。因此,日志文件系统只是尽快迅速地把写请求返回,以提高性能。代价就是元数据乃至文件数据在日志设备上额外的写操作。

4.日志系统举例

4.1ZFS
ZFS文件系统中的ZIL层对日志功能的支持非常灵活,既提供了CLI来指定用作日志功能的设备,又提供了参数来配置同步策略。ZFS中关于日志功能的最主要的操作有三个:

zil_commit        往日志设备添加记录
        当写操作创建好transaction并把它放到目标设备的操作队列之后,会直接调用zil_commit操作,把logrecord写到日志设备上去,也就是把内存中的metadata乃至data写到ZIL的日志设备上去。

zil_sync        从日志设备删除记录
        当目标设备上的某个transaction完成之后,会通过zil_sync从ZILlog device上找到transactionnumber一致的logrecord,把它从日志设备中删除。

zil_replay        重启时重放ZIL        log
        当ZFS文件系统重新起来之后,如果发现ZILlog device上还有没有logrecord,就把它zil_sync到磁盘。

由于ZIL的logdevice也是基于ZFS里的逻辑设备,因此理论上它也能够实现对logdevice上数据的checksum乃至压缩。此外,它还支持重复写操作的合并。

4.2ext3fs

Ext3区别于ext2的最主要特性就在于引进了日志功能,嫩够记录metadata,因此提供了更好的一致性。当然,由于ext3的日志设备也是普通的磁盘设备,对性能的影响很大。

4.3ext4fs
ext4文件系统通过在磁盘上保留一段小的连续区域(默认128MB)作为JBD。被提交的数据一份记录也被写到日志。一旦数据事务完全写到磁盘,将其从JBD中刷出。这样保证日志在擦除提交记录前将事务写到它们在磁盘上的最终位置(可能包含大量的寻道或者大量的读-写-擦除)。从一致性方面考虑,Ext4默认直接将文件系统元数据写到日志,而没有同时写文件数据到JBD2,因而不能提供最强的文件数据块的一致性。ext4fs日志文件在文件系统中是普通文件,通常隐藏不可见。日志文件消耗完整的块组,通过mke2fs可以将日志文件放在磁盘的中间。

此外,在ext3fs文件系统日志机制的基础上,ext4fs添加了对日志内容的checksum,这样对数据的一致性和正确性有了更多更及时的保护。

4.4ReiserFS

ReiserFS 是从一开始就按照记录日志的意图而开发的日志文件系统。ReiserFS 于 2001 年被引进到主流 2.4 内核(Linux 采用的第一个日志文件系统)。其默认的日志记录方法为预定,且支持以在线调整大小的方式扩展文件系统。


4.5ceph

ceph文件系统日志基于cephOSD的关键组成部分,能提高存储系统的一致性和性能。ceph文件系统里能够指定同步日志和文件系统盘的时间间隔,当间隔时间到,cephOSDdaemon会停止写操作,把所有日志系统上记录的写操作重放到磁盘上去。这样就保证了文件系统的一致性。此外,Ceph能将小的随机IO顺序地写入日志,让后端文件系统有更多时间来合并IO,提升系统的突发负载能力。美中不足的是,这可能带来剧烈的性能抖动,表现为一段时间内的高速写入,而之后一段时间内没有任何写入直至直至日志设备又有空闲空间能够启用。

4.6GFS

GFS是Google设计的一个可扩展的分布式文件系统。GFS日志系统包含了对元数据所作的修改的历史记录。它作为逻辑时间线定义了并发操作的执行顺序。文件、块以及它们的版本号都由它们被创建时的逻辑时间而唯一地、永久地被标识。由于GFS是分布式文件系统,所以只有操作日志复制到数个远程的机器上,并且确实写到本地和远程的磁盘上之后才回答用户的请求。

在一致性方面,GFSMaster节点同样可以用操作日志来恢复它的文件系统的状态。但为了将启动时间减至最小,日志就必须要比较小。每当日志的长度增长到超过一定的规模后,master就要检查它的状态,它可以从本地磁盘装入最近的检查点来恢复状态。

4.7JFS

(JOURNAL FILESYSTEM)一种字节级日志文件系统,借鉴了数据库保护系统的技术,以日志的形式记录文件的变化。JFS通过记录文件结构而不是数据本身的变化来保证数据的完整性。这种方式可以确保在任何时刻都能维护数据的可访问性。

需要注意的是:JFS只记录元数据上的操作,因此,重放这些日志只能恢复文件系统中结构关系和资源分配状态的一致性。它没有记录文件数据,也没有将这些数据恢复到一致状态。因此,恢复后某些文件数据可能丢失或失效,对数据一致性有关键性需求的用户应该使用同步I/O。
如果媒介出错,日志记录不是特别有效。特别地,在将日志或元数据写入磁盘的期间发生的I/O错误,意味着在系统崩溃后,要将文件系统恢复到一致状态,需要耗时并且有可能强加的全面完整性检查。
JFS日志记录的语义如下:当涉及元数据更改的文件系统操作--例如,unlink()--返回成功执行的返回码时,操作的结果已经提交到文件系统,即使系统崩溃了也可以发现。例如,一旦成功删除了文件,即使系统崩溃然后重启,它仍然是删除的并且不会再重新出现。
与其它日志文件系统相比,JFS没有提供写合并,在性能上处于劣势。其它日志文件系统,如VeritasVxFS 和TransarcEpisode,使用不同的日志风格并且缓慢地将日志数据写入磁盘。在执行多个并行操作的服务器环境中,通过将多个同步写操作组合成单一写操作的组提交来减少这种性能损失。JFS日志记录风格随着时间推移而得到不断改进,现在提供了异步日志记录,异步日志记录提高了文件系统的性能。

4.8XFS

XFS一种高性能的日志文件系统,最早于1993年,由SiliconGraphics为他们的IRIX操作系统而开发,是IRIX5.3版的默认文件系统。2000年5月,SiliconGraphics以GNU通用公共许可证发布这套系统的源代码,之后被移植到Linux内核上。XFS特别擅长处理大文件,同时提供平滑的数据传输。

当文件系统更新时,元数据会在实际的磁盘块被更新之前顺序写入日志。XFS的日志被保存在磁盘块的循环缓冲区上,不会被正常的文件系统操作影响。XFS日志大小的上限是64k个块和128MB中的较大值,下限取决于已存在的文件系统和目录的块的大小。在外置设备上部署日志会浪费超过最大日志大小的空间。XFS日志也可以被存在文件系统的数据区(称为内置日志),或者一个额外的设备上(以减少磁盘操作)。XFS的日志保存的是在更高层次上描述已进行的操作的“逻辑”实体。相比之下,“物理”日志存储每次事务中被修改的块。为了保证性能,日志的更新是异步进行的

5.日志文件系统发展想法

现在nvme、3D-Xpoint等新型技术和硬件的出现和推广,既对文件系统中日志系统的设计提出了心的要求和挑战,比如如何充分利用新技术和硬件的特性,更好地日志系统的组织结构、工作机制,以充分提高性能;同时,又为新的日志系统的设计提供了更多的日志设备的硬件选择空间。


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-264459-1-1.html 上篇帖子: LVM逻辑卷管理器 下篇帖子: 深入剖析linux磁盘管理
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表