千家信息网

Linux系统:保证数据安全落盘

发表于:2024-09-22 作者:千家信息网编辑
千家信息网最后更新 2024年09月22日,在很多IO场景中,我们经常需要确保数据已经安全的写到磁盘上,以便在系统宕机重启之后还能读到这些数据。但是我们都知道, linux系统 的IO路径还是很复杂的,分为很多层,每一层都可能会有buffer来
千家信息网最后更新 2024年09月22日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路径。
最后附上Linux在常见场景下的io路径跟踪:
https://my.oschina.net/fileoptions/blog/3061822


数据 安全 磁盘 系统 模式 路径 保证 设备 同步 复杂 作用 同时 场景 文件 标志 概念 用户 还是 支持 低下 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 吉安软件开发制作 阿里云服务器到期后发票 后台管理员数据库设计实例 河南中思创网络技术有限公司 中国物联网络技术有限公司 计算机网络技术转本科 河南惠普服务器虚拟化技术 计算机除了软件开发还有什么 修改数据库名的sql语句 软件开发监理需要什么资质 游族网络技术优化 嵌入式软件开发的主流技术 我的世界服务器怎么登陆 软件开发工程师与算法工程师 中国有自己的数据库技术吗 写出三种数据库访问接口技术 周鸿祎+两会+网络安全 前端开发怎么储存数据库 在软件开发中 有哪些阶段 软件开发文科生能学吗 阿里云服务器关机会清理软件吗 吉安软件开发制作 我的世界1.14服务器ip端口 网络安全伴我行文字 达梦数据库加密函数 网络安全国家队官网 美团饿了么软件开发公司 数据库开发几个阶段 access数据库后台共享 关于网络安全英语作文初中
0