几年前,MongoDB因为存在与磁盘持久性相关的不安全默认值而引发了一些热议(例如,参见this question)。 必须数据库实现的哪些措施才能确保对磁盘的写入是安全的?在写入之后调用fsync()
是否足够,或者是否必须采取其他预防措施,例如日记或使用磁盘的特定方式?
答案 0 :(得分:2)
调用fsync()
会将缓冲区缓存中的脏页刷新到磁盘。这取决于服务器上的负载,因为在缓存中有大量脏页并启动刷新可能导致系统挂起或进入无响应状态。但是,它建议调整一些内核转盘,使其具有vm.dirty_expire_centisecs
,vm.dirty_background_ratio
的最佳值,以确保所有写入安全且快速,并且不会长时间保留在缓存中。具有较低的值可能会降低平均I / O速度,因为不断尝试将脏页写出来只会更频繁地触发I / O拥塞代码。
或者,某些数据库提供直接I / O作为文件系统的一项功能,从而文件读取和写入直接从应用程序传输到存储设备,从而绕过缓存。直接I / O主要用于使用O_DIRECT标志管理自己的缓存的应用程序(数据库)。