文件系统要解决的一个关键问题是怎样防止掉电或系统崩溃造成数据损坏,在此类意外事件中,导致文件系统损坏的根本原因在于写文件不是原子操作,因为写文件涉及的不仅仅是用户数据,还涉及元数据(metadata)包括 Superblock、inode bitmap、inode、data block bitmap等,所以写操作无法一步完成,如果其中任何一个步骤被打断,就会造成数据的不一致或损坏。

举一个简化的例子,我们对一个文件进行写操作,要涉及以下步骤:

  1. 从data block bitmap中分配一个数据块;

  2. 在inode中添加指向数据块的指针;

  3. 把用户数据写入数据块。

  • 如果步骤2完成了,3未完成,结果是数据损坏,因为该文件认为数据块是自己的,但里面的数据其实是垃圾;

  • 如果步骤2完成了,1未完成,结果是元数据不一致,因为该文件已经把数据块据为己有,然而文件系统却还认为该数据块未分配、随后又可能会把该数据块分配给别的文件、造成数据覆盖;

  • 如果步骤1完成了、2未完成,结果就是文件系统分配了一个数据块,但是没有任何文件用到这个数据块,造成空间浪费;

  • 如果步骤3完成了,2未完成,结果就是用户数据写入了硬盘数据块中,但白写了,因为文件不知道这个数据块是自己的。

日志文件系统(Journal File System)就是为解决上述问题而诞生的。

它的原理是在进行写操作之前,把即将进行的各个步骤(称为transaction)事先记录下来,保存在文件系统上单独开辟的一块空间上,这就是所谓的日志(journal),也被称为write-ahead logging,日志保存成功之后才进行真正的写操作、把文件系统的元数据和用户数据写进硬盘(称为checkpoint),这样万一写操作的过程中掉电,下次挂载文件系统之前把保存好的日志重新执行一遍就行了(术语叫做replay),避免了前述的数据损坏场景。

有人问如果保存日志的过程中掉电怎么办?最初始的想法是把一条日志的数据一次性写入硬盘,相当于一个原子操作,然而这并不可行,因为硬盘通常以512字节为单位进行操作,日志数据一超过512字节就不可能一次性写入了。所以实际上是这么做的:给每一条日志设置一个结束符,只有在日志写入成功之后才写结束符,如果一条日志没有对应的结束符就会被视为无效日志,直接丢弃,这样就保证了日志里的数据是完整的。

一条日志在它对应的写操作完成之后就没用了,占用的硬盘空间就可以释放。保存日志的硬盘空间大小是有限的,被循环使用,所以日志也被称为circular log。

至此可以总结一下日志文件系统的工作步骤了:

  1. Journal write : 把transaction写入日志中;

  2. Journal commit : 在一条日志保存好之后,写入结束符;

  3. Checkpoint : 进行真正的写操作,把元数据(metadata)和用户数据(user data)写入文件系统;

  4. Free : 回收日志占用的硬盘空间。

以上方式把用户数据(user data)也记录在日志中,称为Data Journaling,Linux EXT3文件系统就支持这种方式,这种方式存在效率问题:

就是每一个写操作涉及的元数据(metadata)和用户数据(user data)实际上都要在硬盘上写两次,一次写在日志里,一次写在文件系统上。元数据倒也罢了,用户数据通常比较大,拷贝几个GB的电影文件也要乘以2实在是降低了效率。

一个更高效的方式是Metadata Journaling,不把用户数据(user data)记录在日志中,它防止数据损坏的方法是先写入用户数据(user data)、再写日志,即在上述”Journal write”之前先写用户数据,这样就保证了只要日志是有效的,那么它对应的用户数据也是有效的,一旦发生掉电故障,最坏的结果也就是最后一条日志没记完,那么对应的用户数据也会丢,效果与Data Journaling丢弃日志一样,重要的是文件系统的一致性和完整性是有保证的。

Metadata Journaling又叫Ordered Journaling,大多数文件系统都采用这种方式。像Linux EXT3文件系统也是可以选择Data Journaling还是Ordered Journaling的。

参考资料:
Crash Consistency: FSCK and Journaling

来源:http://linuxperf.com/?p=153

提高软件的可靠性和效率,是每个 IT 人的使命

GOPS 2019 · 深圳站,4.12-13,不要错过软件工程的第三次革命

点击,访问大会官网

linux 2行数据为一条记录 该如何操作这一条记录_Linux 日志文件系统原来是这样工作的...相关推荐

  1. mysql返回前2行_取得前一次MySQL操作所影响的记录行数

    转载:http://blog.csdn.net/militala/article/details/5996510> mysql_affected_rows() 返回近来一次与 连接句柄 联系关系 ...

  2. java 执行linux命令行_10个高效Linux技巧及Vim命令对比

    专注于Java领域优质技术,欢迎关注 作者:vimtutor 来自:Vim教程网 Vim的很多命令和功能与Linux系统的命令和功能及其相似,可以说是一脉相承.Vim教程网(https://vimjc ...

  3. 一个将当前目录下HEX文件的第一行数据删除的程序...

    为什么要写这样一个函数 在使用SoftConsole开发M3程序时,生成的hex文件,必须要把第一行数据删除,才能在Libero中使用,所以写了这个小工具,这是2.0版本了,第一版是直接删除第一行数据 ...

  4. Linux系统 06 python环境配置04 之 python操作redis

    Redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set ...

  5. server多笔记录拼接字符串 sql_sqlserver 将多行数据查询合并为一条数据

    有这样一个需求:表T_FUN_TASK为任务表,有字段(TASKID,TASKNAME),表T_FUN_LOGBOOK为日志表,有字段(LOGID,TASKID,LOGDATE),一个任务可持续多天, ...

  6. awk ——awk将每个输入行解释为一条记录而将一行上的每个单词(由空格或行由制表符分隔)解释为每个字段。

    awk --awk将每个输入行解释为一条记录而将一行上的每个单词(由空格或行由制表符分隔)解释为每个字段. # space.txt root@357c42f4740c:/test# cat space ...

  7. 多条记录取最近日期的一条_Excel VBA:基于员工打卡记录的考勤数据统计

    微信公众号:金融数学 使用VBA做一个基于员工打卡记录的考勤数据分析工具; 1应用场景 某公司通过门禁系统记录了每位员工上下班打卡时间,现在需要对一段特定时间内员工出勤情况进行统计分析,包含加班时间( ...

  8. 《Linux命令行与shell脚本编程大全》第十五章 呈现数据

    15.1 理解输入和输出 现在知道两种显示脚本输出的方法 1)在显示器屏幕上显示 2)将输出文件重定向到文件中 15.1.1 标准文件描述符 Linux系统将每个对象当做文件处理.这包括输入和数出进程 ...

  9. 查询分析300万笔记录_给你100万条数据的一张表,你将如何查询优化?

    1.两种查询引擎查询速度(myIsam 引擎) InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多少行. ...

最新文章

  1. linux tomcat6 jmx,Zabbix3.2.6之通过JMX监控Tomcat
  2. Java中HashMap、LinkedHashMap和TreeMap区别使用场景
  3. 进程的创建与可执行程序的加载
  4. LeetCode(100)——相同的树(JavaScript)
  5. 代码帝:一个月10万行代码
  6. windows下Dos命令行设置代理
  7. 企业发卡系统源码/带有代理功能发卡平台源码
  8. 【Linux-网桥原理分析】
  9. 青少年软件编程C++二级题库(11-20)
  10. 清除Marco1!$A$1提示软件日志.
  11. Java学习之:如何将 java 程序打包成 .jar 文件
  12. 台式电脑计算机怎么添加任务栏,如何将我的电脑添加到任务栏中(win7)?
  13. 选择一款对的固定资产管理系统让固定资产管理轻松无比
  14. Jest测试语法系列之Expect
  15. 真正爱你的男孩是这样的
  16. 【产品经理】谁是产品经理,产品经理到底要做什么?
  17. 云创大数据云存储专利荣获“江苏专利奖优秀奖”
  18. QML实现的简单图文编辑器
  19. 好书推荐-- C大学教程,国外计算机科学教材系列
  20. 2010国庆节祝福短信大全,爱情篇

热门文章

  1. PS教程第二十二课:羽化选区
  2. [html] HTML5的Server-Sent和WebSocket有什么区别?
  3. [vue] 说说你对vue的template编译的理解?
  4. [css] 写出在不固定宽高的元素在固定高度的情况下水平垂直居中的方法
  5. [css] ::first-letter有什么应用场景?
  6. 前端学习(2658):vue3 computed
  7. 前端学习(1936)vue之电商管理系统电商系统之再关闭对话框defkeys
  8. 前端学习(1918)vue之电商管理系统电商系统之渲染权限列表的数据
  9. 前端学习(758):预解析二
  10. 课外阅读(XHTML和XML简介)