Linux中如何保证数据安全落盘


本文摘自PHP中文网,作者步履不停,侵删。

背景

在很多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

所谓一图胜千言,为了解析清楚这些概念的区别,我特意画了一张图,仔细看,应该可以清晰的看出它们的作用和区别。

8e7941d0-51d1-415d-b7a3-c7db93325f12.jpg

这里重点说一下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 相关参数的说明:

19937a72-2263-4fe7-bedf-8f6a544cab28.jpg

d26b1c59-e4fd-48a3-97a9-31425ed492da.jpg

c7710d272b1f0da876969c0ed2538cceb4a.jpg

阅读剩余部分

相关阅读 >>

Linux系统日志在哪?

Linux系统怎么进行安全设置

Linux下如何设置用户密码永不过期

使用Linux的alternatives命令替换选择软件的版本方法详解

Linux中如何查看文件的行数、单词数与字符数

云服务器 ecs 提供的实例怎么查询规格资源

Linux一些常用的命令

怎么安装Linux下的安装包

Linux find命令的用法有哪些

Linux负载查看用什么命令?

更多相关阅读请进入《Linux》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...