每日一博 | Linux中如何保证数据安全落盘
背景
在很多IO场景中,我们经常需要确保数据已经安全的写到磁盘上,以便在系统宕机重启之后还能读到这些数据。但是我们都知道,linux系统的IO路径还是很复杂的,分为很多层,每一层都可能会有buffer来加速IO读写。同时,用户态的应用程序和库函数也可能拥有自己的buffer,这又给IO路径增加了一些复杂性。可见,要想保证数据安全的写到磁盘上,并不是简单调一个write/fwrite就可以搞定的。
那么要怎么做呢?很多人会想到很多办法,比如:fflush()、fsync()、fdatasync()、sync()、open()使用O_DIRECT或O_SYNC标志等。嗯,这些手段(或者某些组合)的确可以保证数据安全的持久化,那么它们之间有什么区别呢?fflush()和fsync()有啥区别?O_DIRECT是啥意思,它可以保证数据安全的持久化吗?O_DIRECT和O_SYNC区别什么?O_SYNC和fsync()呢?fsync能完成msync的功能吗?本文将试图理解、解释这些概念的作用和区别。
Linux IO
所谓一图胜千言,为了解析清楚这些概念的区别,我特意画了一张图,仔细看,应该可以清晰的看出它们的作用和区别。
这里重点说一下O_DIRECT和O_SYNC,首先要明确的是,O_DIRECT只是说数据不会经过page cache(一般用在用户态自己管理buffer)而是直接提交给块设备层,但是不会同步等待数据安全写入磁盘之后才返回(比如数据可能还在块层排队或者在磁盘自己的cache中)。而O_SYNC标志,虽然数据还是会写page cache,但是此时会采用write through的策略,并同步等待数据安全写入磁盘后才会返回。因此如果同时使用O_DIRECT和O_SYNC,则表示数据不会经过page cache并同步等待数据安全写入磁盘才返回,当然这样IO的性能会非常低下。
由于O_DIRECT会bypass page cache,因此如果有另一个进程使用普通的方式读文件,有可能会出现数据不一致的现象,这个也需要注意。
为了做一下辅助说明,此处我贴一下我探讨过程中看过的一些资料。首先是引用open系统调用:http://man7.org/linux/man-pages/man2/open.2.html 相关参数的说明:
以及innodb相关的文档:https://lwn.net/Articles/457667/
fsync和fdatasync的区别:http://man7.org/linux/man-pages/man2/fsync.2.html
msync:http://man7.org/linux/man-pages/man2/msync.2.html
DAX
其实还有一种IO模式,就是DAX(Direct Access ),是不是看上去和O_DIRECT很像。这种模式需要filesystem和block driver都支持才可以,一般主要用在non volatile memory上,本质上也是绕过page cache直接操作设备。DAX本文先不做深入探讨,后面我会自己写一个支持DAX模式的ramdisk块设备驱动,然后格式化为ext4文件系统并-o dax模式挂载,再来详细研究DAX的IO路径。https://www.kernel.org/doc/Documentation/filesystems/dax.txt
最后附上Linux在常见场景下的io路径跟踪:https://my.oschina.net/fileoptions/blog/3061822
参考
参照:https://blog.pythian.com/innodb-flushing-linux-io/
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
为 Android 重新设计的 Firefox,真是情有独钟
根据Mozilla官方宣布,为 Android 设计的新浏览器已经发布了,并且将在今年秋天发布一个功能丰富、完善的旗舰应用程序版本。新浏览器的特点总结起来就是速度更快,更注重隐私和使用GeckoView 引擎。 官方宣称,大约在两年半前就推出Firefox Focus,一款面向 iOS 和 Android 的移动浏览器,可以让用户在不被跟踪的情况下使用网络。随着火狐的关注度不断提高,他们意识到用户需要更有隐私和更安全的浏览体验,所以让火狐偏像Focus,并且功能更加齐全,使用更加方便。 目前所有其他主流的 Android 浏览器都是基于 Blink 的,Mozilla 在移动设备上的影响力还是有限的,而这款新版的浏览器是由 Firefox 自己的移动浏览器引擎 GeckoView 驱动的,GeckoView 是一个高性能的引擎,它同样为Focus 应用程序提供动力。GeckoView 使得有能力开发速度更快、更安全、更方便用户的浏览器。使用GeckoView 为 Android 打造的 Firefox 浏览器,在隐私类型和安全功能方面带来更大的灵活性,这也是新版最大的特色。GeckoV...
- 下一篇
Windows 10 1903 的第二次累积更新,还是存在 bug?
微软开始推出 Windows 10 1903 版本的第二次累积更新,修复了一些问题,主要有两个,第一个是Windows 事件查看器自定义视图时崩溃的问题,另一个是夜间灯关闭后无法工作的问题,他们把这次更新叫 “ 2019-06,基于 x64 的系统 (KB 4501375) 的 Windows 10 1903 版本的累积更新”。随着KB 4501375 的发布,Windows 10 1903 将升级为 18362.207。 第一个问题表现为,当在事件查看器中尝试展开、查看或创建自定义视图时,应用程序可能停止响应或关闭,在 Action 菜单中使用包含内置视图或日志的 Filter Current Log时,也可能会收到相同的错误。 微软在这次更新中还发现了一个问题:当在进行Windows 101903 的更新时,在操作系统语言改变了的设备上,Windows Sandbox 可能无法使用 “Error_file_NOT_FRED(0x80070002)”。微软正在制定解决方案,并将在即将发布的版本中提供更新。 微软还发布了“安装 Windows 101903 的兼容性更新”,“安装和恢复...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS8编译安装MySQL8.0.19
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS8安装Docker,最新的服务器搭配容器使用
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS关闭SELinux安全模块
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程