胡律师:13306647218

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

时间:2021-07-31 07:21:12

背景

在许多IO方案中,必须确保数据已安全写入磁盘,以便在系统宕机重新启动后仍可以读取数据。 但是,我们知道,linux系统的IO路径仍然很复杂,分为许多层,每个层都有buffer,有可能提高IO的读写速度。 用户状态APP和库函数也可能有自己的buffer,这增加了IO路径的复杂性。 可以看出,要将数据安全写入磁盘,不仅仅是调整写入/写入就可以了。

那么,该怎么办呢? 许多人会考虑许多方法,例如使用fflush ()、fsync )、fdatasync )、sync )、open )、O_DIRECT和O_SYNC标志。 嗯,这些手段(或几种组合)确实可以保证数据安全性的持续化,但它们的区别是什么呢? fflush (和fsync )的区别是什么? O_DIRECT是什么意思? 你能保证数据的安全性持续化吗? O_DIRECT和O_SYNC的区别是什么? O_SYNC和fsync ()是什么? fsync能完成msync的功能吗? 本文试图理解和解释这些概念的作用和差异。

Linux IO

一图胜千言是指,为了解析这些概念的差异,我特意画了图,仔细一看,应该能清楚地知道它们的作用和差异。

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

下面将重点介绍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相关参数的说明。

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

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

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

和innodb相关文档: https://lwn.net/Articles/457667/

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

fsync和fdatasync的区别: http://man7. org/Linux/man-pages/man2/fsync.2.html

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

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

msync :3358主7.org/Linux /主页/主2 /主2 /主同步2.html

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

DAX

实际上也有一种叫做DAX (直接访问)的IO模式,看起来和O_DIRECT很像,不是吗? 此模式必须同时支持文件系统和块驱动程序。 一般主要用于非volatile memory,本质上是绕过page cache直接操作设备。 DAX的正文先不深入探讨,等会我自己写支持DAX模式的ramdisk块设备驱动程序,然后格式化为ext4文件系统,以-o dax模式挂载,详细研究DAX的IO路径

最后,附加常见场景中的Linux路径跟踪。 3359 my.oschina.net /文件选项/博客/3061822

参见

参考

:https://博客. pyt hian.com/innodb -闪存- Linux-io /