该财产的文件sync=disabled
表明
File system transactions are only committed to stable storage periodically. This option will give the
highest performance. However, it is very dangerous as ZFS would be ignoring the synchronous transac-
tion demands of applications such as databases or NFS. Administrators should only use this option
when the risks are understood.
所以我试图了解这些风险。不幸的是,关于sync=disabled
崩溃/断电发生时到底会发生什么以及它对实际应用有何影响,存在一些相互矛盾的信息。
以下是各个论坛上讨论安全的评论的一小部分(转述)sync=disabled
:
sync=disabled
如果你不介意丢失最后5秒的写入,可以设置。- 不存在损坏风险
sync=disabled
,只有数据丢失。 - 即使使用
sync=disabled
. - 您只能从文件系统级别(而不是应用程序级别)实现崩溃一致性。
- 通过设置
sync=disabled
,您会失去数据库应用程序的事务安全性。 - 符合 ACID 的数据库是原子性的,即使使用
sync=disabled
. - 您故意对软件撒谎。即使 ACID 数据库和日志文件系统(在 ZFS 之上运行)也可能会被破坏,因为您违反了预期的写入语义。
那么是哪一个呢?我是否只丢失 5 秒的数据(就好像崩溃刚刚发生在 5 秒前,但带有sync=standard
),还是这 5 秒会引入一些事务不确定性,从而破坏 ACID 数据库的一致性?
需要明确的是,我知道我将丢失最后 5 秒的交易。问题是这 5 秒的丢失是否会导致应用程序级别的状态损坏(假设应用程序状态是 ZFS 本地,因此与远程服务器或单独的非 ZFS 磁盘的一致性并不重要)。
如果sync=disabled
能导致应用程序级别的状态损坏,请提供描述或序列图,说明如何发生这种损坏。
编辑:我想再次澄清,我不关心持久性,也不关心 5 秒的数据丢失。我的问题是仅有的关于一致性和交易安全。有一个巨大的丢失大约 5 秒的数据(由于事务回滚)和丢失一致性(如果损坏的数据无法修复,则丢失所有数据)之间的区别。
答案1
那么是哪一个呢?
所有这些都差不多——数据不是刷新到磁盘上就会丢失。
- 不存在损坏风险
sync=disabled
,只有数据丢失。
数据丢失还意味着存储数据损坏或逻辑不一致的可能性。这取决于什么数据完全丢失。
- 即使使用
sync=disabled
.- 您只能从文件系统级别(而不是应用程序级别)实现崩溃一致性。
这里的“一致性”仅涉及文件系统本身(即元数据)的一致性,而不涉及逻辑的存储在文件系统中的应用程序数据的一致性。
- 通过设置
sync=disabled
,您会失去数据库应用程序的事务安全性。
是的。
- 符合 ACID 的数据库是原子性的,ZFS 保留原子性和写入顺序,即使在
sync=disabled
订购不清楚。
内部事务组写入可以重新排序:
https://zfsonlinux.topicbox.com/groups/zfs-discuss/T17417b2984f6c8ff
或不:
https://zfsonlinux.topicbox.com/groups/zfs-discuss/T969c74e0a6dfdd74-M818821038c9248d92443f67a
- 您故意对软件撒谎。即使 ACID 数据库和日志文件系统(在 ZFS 之上运行)也可能会被破坏,因为您违反了预期的写入语义。
是的。
我是否只丢失 5 秒的数据……或者这 5 秒是否会引入一些事务不确定性,从而破坏 ACID 数据库的一致性?
两个都。两者都说明了同一件事 - 您丢失了(应用程序的)数据。
这一切都与应用程序和物理介质之间的所有层上的写入缓存有关。如果任何数据来自任何(非持久性)缓存不会刷新到它们丢失的媒体中。
禁用同步的文件系统不会刷新缓存的数据立即地当应用程序强制它执行但谎称数据已保存到存储中时。相反,数据保留在易失性存储器中,并且在软件或硬件错误、崩溃或断电的情况下会丢失。
例如,您编写文本文件并将其保存在文本编辑器中。但是即使您通过调用 fsync 强制文件系统,您的文本文件也不会立即到达存储介质。文件系统刷新你的数据稍后一些。
如果中间发生了不好的事情,您的文件就会丢失。
数据库还依赖于适当的 fsync 功能来实现持久性。
甚至像 hdd、ssd、raid 控制器这样的硬件存储也可能因为自身的缓存、固件错误或物理错误而对操作系统谎称写入成功。
https://www.sqlite.org/howtocorrupt.html(来自“同步失败”及下文}
https://sqlite.org/atomiccommit.html(9.2. 不完整的磁盘刷新)
https://www.postgresql.org/docs/current/runtime-config-wal.html#GUC-FSYNC
https://www.postgresql.org/docs/current/wal-async-commit.html