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业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
OSC 周日乱弹 —— 朋友圈的照片能提取 JSON 文件?
Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @ 巴拉迪维: U can be mad at the way things went.U can swear and curse the fate. But when it comes to the end, u have to let go. #今日歌曲推荐# 《Leaving the Past to Pass》- The Poodles 手机党少年们想听歌,请使劲儿戳(这里) @Loni :起床加班了 真想摁死起床的闹钟, @夏目Jane :幸福的人还在睡觉,我们已经上班了! 夏目(@夏目Jane )骑着摩托车去上班, 被交警拦下来了。 “对,右一那个带着白手套的是夏目(@夏目Jane )。” 能不能不去上班呀, 不能, 你已经满周岁了。 @Sharon啊 :你已经满18岁啦,要学会自己周六去上班。 生日快乐。呀。 可以吃蛋糕咯。 “祝你生日快乐。@Sharon啊” 可今天上班哇, 早晨能吃到蛋糕么…… @罗马的王 :早上时间紧迫有口吃的就不错了 时间再紧张, 大王(@罗马的王)也要给七只猫铲屎呀!!! “我怀疑人类养我就是为...
- 下一篇
Linux百度网盘 | Docker for WSL2 | VSCode Java安装包 | Edge for Win7
回顾一周社区热门资讯 第【二十八】期:20190615-20190621 点击相应标题,跳转阅读全文。 Chrome 76 Beta:增强暗黑模式、更快捷地安装PWA 应用 Chrome 73 就已引入暗黑模式,最初只是在 macOS 中提供,后面的 Chrome 74 稳定版才将该特性逐渐推送到更多的Windows 10 设备上。在 Chrome 76 Beta 中,暗黑模式得到了进一步的优化,开发者只需要添加一段额外代码,在检测到系统使用暗黑模式访问时,浏览器就会自动切换至「暗黑模式」。 .NET Core 3.0 Preview 6 发布,新增用于 ARM64 的 Alpine Docker 镜像 包括用于编译程序集的更新,以改进启动性能,以及通过对链接器和EventPipe 的改进来优化应用程序的大小。此外,.NET Core 团队还为 Alpine on ARM64 发布了新的 Docker 镜像。 Java 13 进入 RDP 1,新特性有哪些? Java 13(JDK 13)目前已经进入了 Rampdown Phase One(RDP 1)状态,该状态意味着特性已经冻结,...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- Mario游戏-低调大师作品
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Red5直播服务器,属于Java语言的直播服务器
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS8编译安装MySQL8.0.19
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS6,CentOS7官方镜像安装Oracle11G
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装