Database 安全地持久化到磁盘

Database 安全地持久化到磁盘,database,filesystems,Database,Filesystems,几年前,MongoDB因为具有与磁盘持久性相关的不安全默认值而受到一些批评(例如,请参阅)。数据库实现必须采取哪些措施来确保磁盘写入是安全的?写入后调用fsync()就足够了,还是必须采取其他预防措施,如日志记录或使用磁盘的特定方式?调用fsync()会将缓冲区缓存中的脏页刷新到磁盘上。这取决于服务器上的负载,因为缓存中有大量脏页并启动刷新可能会导致系统挂起或进入无响应状态。不过,它建议调整一些内核转盘,使其具有vm.dirty\u expire\u centisecs,vm.dirty\u b

几年前,MongoDB因为具有与磁盘持久性相关的不安全默认值而受到一些批评(例如,请参阅)。数据库实现必须采取哪些措施来确保磁盘写入是安全的?写入后调用
fsync()
就足够了,还是必须采取其他预防措施,如日志记录或使用磁盘的特定方式?

调用
fsync()
会将缓冲区缓存中的脏页刷新到磁盘上。这取决于服务器上的负载,因为缓存中有大量脏页并启动刷新可能会导致系统挂起或进入无响应状态。不过,它建议调整一些内核转盘,使其具有
vm.dirty\u expire\u centisecs
vm.dirty\u background\u ratio
的最佳值,以确保所有写入都安全、快速,并且不会长时间保留在缓存中。具有较低的值可能会降低平均I/O速度,因为不断尝试写出脏页只会更频繁地触发I/O拥塞代码

或者,一些数据库提供直接I/O作为文件系统的一项功能,从而文件读写直接从应用程序转到存储设备,绕过缓存。直接I/O主要用于使用O_Direct标志管理自身缓存的应用程序(数据库)