ZFS 能否应对突然断电?(如果磁盘本身没有发生故障或变得不可靠,哪些事件会导致池不可恢复)

Sti*_*lez 5 zfs data-loss-prevention data-integrity

所有资源都说 ZFS 没有 fsck 或恢复工具,为 ZIL 使用电池供电的 SSD 等。

如果突然以某种方式拔掉插头(尽管有 UPS 等,但总断电,但假设没有物理损坏,没有磁头崩溃等),SSD 会将缓存写入 nvram,然后安静下来......

ZFS 在重新启动时处于一致状态(即使某些数据丢失)和池可用/可读的机会有多大?

更新

我意识到我实际上是想问一些更接近的问题,尽管数据基本上完好无损,但哪些事件会导致 ZFS 放弃读取池的能力?目前尚不清楚 ZFS 可以从哪些方面恢复(或可以在给定正确的硬件的情况下恢复)以及哪些方面不能(或在没有合适的硬件的情况下不能恢复),因为它在内部做了很多自我检查和修复。显然冗余不足+磁盘故障(或其他主要硬件问题)是一种情况,由于固件/软件错误而完全擦除/覆盖是另一种情况。但假设存储介质、硬件和软件仍然可靠/正常工作,还有什么地方出了问题,结果是失去了一个池?它对池修复的限制在哪里?哪些情况必须在它不能出现之前出现,以及必须发生什么才能产生它们?

War*_*ung 4

\n

当 ZFS 重新启动时,有多大机会处于一致状态(即使某些数据丢失)并且池可用/可读?

\n
\n\n

ZFS 的运行方式类似于事务数据库管理系统,旧数据在更新时不会像传统文件系统那样被覆盖。相反,新数据被写入磁盘上的其他位置,然后更新文件系统元数据结构以指向新数据,只有这样旧数据的块才会被释放以供文件系统重用。这样,如果新数据更新未 100% 提交到持久存储,突然断电就会将旧数据副本保留在原处。您不会更换一半的块或类似的事情,从而导致数据损坏。

\n\n

最重要的是,ZFS 使用复杂的校验和方案,允许文件系统检测误写或损坏的数据。

\n\n

如果您使用具有冗余存储的 ZFS,则相同的方案允许文件系统在修复文件系统时在两个或多个数据冗余副本之间进行选择。也就是说,如果您有给定块的两个副本,并且其中只有一个与其存储的校验和匹配,则文件系统知道它应该使用干净的副本修复损坏的副本。

\n\n

当您尝试读取或修改数据 \xe2\x80\x94 时,这些修复可能会即时发生,文件系统可能会意识到所请求的块不完全符合 \xe2\x80\x94 或在操作期间zfs scrub。通常安排清理在具有很少访问的文件的 ZFS 池上定期运行,因为文件系统在正常操作过程中不会发现硬件数据丢失。在不可靠的硬件上运行的 ZFS 池在每次清理后显示一定数量的固定块是很常见的。

\n\n

清理有点像fsck其他 Unix 类型的文件系统,只不过它是在文件系统已挂载并可用时在线发生的;它在后台发生,并且仅在池空闲时发生。此外,fsck实现通常只检查元数据,而不检查数据,但 ZFS 会检查两者,因此可以检测两者中的错误。如果这些完整性机制决定需要替换其中一个块,则它可以使用校验和来决定用哪个副本替换损坏的副本。

\n\n
\n

假设存储介质、硬件和软件仍然可靠/正常工作,那么还有什么问题会导致池丢失?

\n
\n\n

据我所知,还没有这样的案例。您提到的三件事之一失败,或者 ZFS 将挂载池并从中读取。

\n\n
\n

明显冗余不足+磁盘故障(或其他主要硬件问题)是一种情况

\n
\n\n

是的,尽管这可能发生在比我认为你考虑的更微妙的情况下。

\n\n

拿一个简单的双向镜子。我认为您正在考虑将其中一个磁盘从计算机上物理删除,或者至少由于某种原因无法访问。但是,想象一下两个磁盘上的 12345 扇区都已损坏。那么 ZFS 中所有巧妙的校验和和冗余都无法帮助您:两个副本都已损坏,因此无法读取包含该扇区的整个块。

\n\n

但这里有一个聪明的地方:因为 ZFS 既是文件系统又是卷管理器 \xe2\x80\x94,而不是像硬件 RAID + ext4LVM2 + ext4 \xe2\x80\x94 这样的闪存zpool status,命令会告诉你你哪个文件被不可恢复地损坏了。如果删除该文件,池会立即恢复到未损坏的状态;问题已经解决。将文件系统与 RAID 和 LVM 部分分开的应急措施无法做到这一点。

\n\n
\n

哪些情况必须出现才能出现,以及必须发生什么情况才会出现这些情况?

\n
\n\n

我所知道的唯一情况类似于上面的示例,其中数据损坏已经损坏了足够多的关键文件系统元数据的冗余副本,以至于 ZFS 无法读取它。

\n\n

因此,今天的超大磁盘 \xe2\x80\x94 为 100 万亿位!\xe2\x80\x94 我建议您配置 ZFS(或任何其他 RAID 或 LVM 系统)至少具有双冗余。在 ZFS 术语中,这意味着raidz2、3路镜像或更高版本。

\n\n

也就是说,ZFS 通常会存储所有文件系统元数据的附加副本,超出用于常规文件数据的正常冗余级别。例如,2 路镜像将存储 2 个常规用户数据副本,但存储 4 个所有元数据副本。您可以将其调回以提高性能,但无法完全关闭它。

\n\n
\n\n

ZFS 手册中有一章介绍ZFS 故障模式,您可能会觉得它很有启发。

\n