自我修复文件系统对于一般用途有多大益处?

自我修复文件系统对于一般用途有多大益处?

我最近研究了高级文件系统(Btrfs、ZFS)的数据冗余和可用性,并对它们提供的附加功能很感兴趣,尤其是它们针对数据损坏的“自我修复”功能。

但是,我认为我需要退一步思考,尝试了解与传统的 mdadm-Raid1 + Ext4 解决方案相比,对于一般家庭/SMB 使用来说,这种好处是否大于其缺点(Btrfs 错误和未解决的问题以及 ZFS 可用性和性能影响)。无论哪种方式都可以进行镜像备份。

假设我有几个文件服务器,用于存档目的,资源有限,但有 ECC 内存和稳定的电源。

  1. 我遇到实际数据损坏导致文件无法读取的可能性有多大?如何解决?
  2. Ext4 或系统文件管理器是否已经能够检测到复制/移动操作中的数据错误,从而至少让我意识到问题的存在?
  3. 如果由于其中一个 madam-Raid1 驱动器有坏扇区而导致其中的一个驱动器保存了不同的数据,会发生什么情况?我是否仍能检索正确的文件,或者阵列是否无法确定哪个文件是正确的文件并完全丢失它?

答案1

是的,一个功能齐全的校验和文件系统是一件非常好的事情。然而,真正的动机并不在于神秘的“bitrot”,虽然这种情况很少发生。相反,主要优点是这样的文件系统提供和端到端数据校验和,通过错误的磁盘行为(如错误定向写入和数据损坏)主动保护您,这些错误与磁盘自身的私有 DRAM 缓存因电源问题而发生故障和/或行为不当有关。

我亲身经历过这个问题,当时 Linux RAID 1 阵列由于电源问题而损坏。一个磁盘的缓存开始损坏数据,而嵌入在磁盘扇区中的 ECC 本身没有捕获任何内容,只是因为写入的数据已经损坏并且ECC是根据损坏的数据本身来计算的。

由于其校验和日志检测到异常并暂停文件系统,XFS 限制了损坏;但是,一些文件/目录被无可挽回地损坏了。由于这是一台没有立即停机压力的备份机器,我使用 ZFS 重建了它。当问题再次发生时,在第一次清理期间,ZFS 通过从其他磁盘读取良好的副本来纠正受影响的块。结果:没有数据丢失,也没有停机。这是使用校验和文件系统的两个很好的理由。

值得注意的是,数据校验和非常有价值,因此需要设备映射器目标来提供它(通过模拟 T-10 DIF/DIX 规范),称为dm-完整性正是为将这种保护扩展到经典块设备(尤其是 RAID1/5/6 等冗余设备)而开发的。凭借Stratis 项目,它将被集成到一个综合管理CLI/API中。

但是,您说得有道理,这种文件系统带来的潜在优势应该与它们继承的劣势进行比较。ZFS 的主要问题是它没有被纳入标准内核,但除此之外它非常快速和稳定。另一方面,BTRFS 虽然被纳入了主流,有许多重要问题和性能问题(对于数据库或虚拟机的常见建议是禁用 CoW,这反过来又禁用了校验和 - 坦率地说,这不是一个可接受的答案)。我不会使用 BTRFS,而是使用 XFS 并希望获得最佳效果,或者使用受 dm-integrity 保护的设备。

答案2

  1. 我有一块 Seagate HDD,每次运行 zfs scrub 时,校验和都会失败。几周后就失败了。ZFS 和 Btrfs 有数据和元数据的校验和。ext4 只有元数据校验和。

  2. 仅限 CRC 错误和元数据校验和错误。可能会发生数据损坏。

  3. 如果有坏扇区,则不是问题。整个磁盘将“故障”,但另一个磁盘“完好”。问题是当数据具有正确的 CRC 时,但数据已损坏。由于磁盘较大,这种情况可能会随机发生。

答案3

我已经在生产环境中使用 ZFS 超过 6 年,无论是在服务器还是在家庭办公室 NAS 上,都是在 Linux 和 FreeBSD 上使用。我发现它稳定、快速、可靠,而且我亲眼看到它能够检测并(在能够)纠正简单md设备或ext4文件系统无法检测到的错误。

但是,我认为我需要退一步思考,并尝试了解这种好处是否大于其缺点(Btrfs 错误和未解决的问题以及 ZFS 可用性和性能影响)

关于许可,ZFS 是开源的,它只是根据 CDDL 许可证发布的,这并不是合法地与 Linux 内核发布的 GPLv2 许可证兼容。详情请见此处这并不意味着它处于“暂时的许可悬而未决”的状态,也不意味着有任何技术的不兼容。这仅仅意味着主线 Linux 内核源代码没有模块,必须从类似的地方获取它们https://zfsonlinux.org请注意,某些发行版(如 Debian)在其发行版中包含 ZFS通常可以通过单个apt命令在 Debian / Ubuntu 上安装 ZFS。

至于性能,如果有足够的 RAM,ZFS 的性能对我来说从接近 ext4 到超越 ext4 不等,这取决于内存、可用池空间和数据压缩性。在我看来,ZFS 最大的缺点是内存使用量:如果生产服务器的 RAM 少于 16 GiB,则可能需要避免使用 ZFS。这是一个过于简单的经验法则;网上有很多关于 ZFS 内存要求的信息。我个人在具有 32GB RAM 的家庭办公室 Linux 系统上运行了一个 10TB 池和一个 800GB 池以及一些备份池,性能非常好。这台服务器运行 LXC 并运行多个服务。

ZFS 的功能远不止数据校验和和自我修复功能;其强大的快照功能比 LVM 快照功能好得多,其内联 lz4 压缩功能实际上可以通过减少磁盘写入来提高性能。我个人在 10TB 池上实现了 1.55 倍的节省(在仅 6.3GiB 的磁盘空间中存储 9.76GiB 的数据)

根据我的经验,当池使用率达到 75% 或 80% 时,ZFS 性能会下降。只要您保持在该点以下,性能就足以满足一般家庭/SMB 使用。

在我见过的 ZFS 检测并纠正坏数据的情况下,根本原因尚不清楚,但很可能是坏的磁盘块。我也有 ECC 内存并使用 UPS,所以我不认为数据在 RAM 中被破坏了。事实上,您需要 ECC RAM 才能从 ZFS 校验和中获益。然而,在过去 6 年里,我看到过少数 (~10-15) 个块校验和失败的案例。ZFS 相对于 md RAID 的一个主要优势是 ZFS 知道哪些文件受到校验和错误的影响。因此,在没有冗余的备份池出现校验和错误的情况下,ZFS 告诉我精确的受影响的文件,允许我替换这些文件。

尽管 ZFS 使用的许可证与 Linux 内核不兼容,但安装模块非常容易(至少在 Debian 上),而且一旦熟悉了工具集,管理就很简单了。尽管网上很多人说 ZFS 会导致数据完全丢失,但我绝不自从迁移到 ZFS 后,我再也没有丢失过任何数据,而 ZFS 快照和数据校验和/冗余的组合让我避免了多次数据丢失。这显然是一个胜利,我个人永远不会再使用阵列了md

答案4

我可以补充一点,ZFS 非常强大,这主要归功于它的起源(它是由 Sun Microsystems 于 2001 年开发的)。目前可用的开源版本是 Sun Microsystems 大约 10 年前发布的最后一个开源版本之一的分支,在 Oracle 收购 Sun Microsystems 并关闭 ZFS 源代码后,开源社区对其进行了进一步开发。

Oracle 自己仍然维护着用于其企业存储系统的 ZFS 的闭源版本。

不过,ZFS 的学习难度有点大,因为它的功能非常强大,有很多地方可以调整。此外,它是我使用过的为数不多的易于维护的存储文件系统之一。我曾经遇到过一个案例,需要将池从 RAID5 设置迁移到 RAID6(或者更准确地说,从 RAID-Z1 迁移到 RAID-Z2)。通常,这样的操作意味着复制出所有数据,重新配置 RAID,然后再复制回数据。在 ZFS 中,您可以连接辅助存储,然后使用一个命令复制池,根据需要重新配置阵列,然后使用另一个命令将池复制回来。

但也存在一些问题:

  1. 要从 ZFS 获得任何好处,您需要让 ZFS 自己处理磁盘。因此,您的驱动器控制器需要支持 JBOD,以便 ZFS 直接查看磁盘。所有 RAID 配置都在 ZFS 中处理,因为它使用奇偶校验数据进行清理和其他任务,因此无法让 RAID 控制器隐藏它。
  2. 正如其他人所说,ECC 内存是强力推荐。ZFS 不需要它,但它完全期望写入 RAM 的任何内容都是不可变的,并且不会被破坏。因此,如果您在具有非 ECC RAM 的系统上运行它并且您的内存出现问题,ZFS 在清理阵列时可能会损坏您的数据(清理意味着 ZFS 从池中读取数据,计算它应该从保存在其他驱动器上的奇偶校验信息中读取的内容,并纠正它发现的任何错误)。
  3. 尽管 ZFS 在防止数据丢失方面非常出色,但其 RAID-Z1 仍然面临与 RAID5 相同的问题,也就是说,如果驱动器的 URE 率过高,大型 (1TB+) 驱动器阵列在重建阵列时单个磁盘发生故障后可能会完全失效,因为在数学上重建时,从其余驱动器的奇偶校验中读回所有数据几乎可以保证由于驱动器的大小而出现不可恢复的读取错误。如果您不是操作存储系统的专家,但恰好知道自己在做什么,请运行 RAID6/RAID-Z2。

对于初学者和家庭环境,我通常推荐 FreeNAS,它维护得很好,设置简单,这对初学者来说很好。

相关内容