了解 ZFS 的错误报告(在 Linux 上)

Bin*_*rus 7 zfs checksum

我已经在 ZFS 上成功设置了 Debian 伸展,包括根文件系统。事情按预期进行,我认为我已经理解了基本概念 - 直到我重新阅读了 Sun 的 ZFS 文档。

我的场景是:

  • 我想防止(更准确地说:检测)无声位腐烂

  • 目前,我已经设置了一个带有一个 vdev 的根池,它是两个相同磁盘的镜像

  • 当然,我确实打开(即没有关闭)校验和

现在我遇到了这个文件。在页面的末尾,他们显示了zpool status示例配置的命令输出,

[...]
NAME        STATE     READ WRITE CKSUM
tank        DEGRADED     0     0     0
  mirror-0  DEGRADED     0     0     0
    c1t0d0  ONLINE       0     0     0
    c1t1d0  OFFLINE      0     0     0  48K resilvered
[...]
Run Code Online (Sandbox Code Playgroud)

接着是声明:

READ 和 WRITE 列提供设备上发生的 I/O 错误的计数,而 CKSUM 列提供设备上发生的不可纠正的校验和错误的计数。

首先,在这种情况下,“设备”是什么意思?他们是在谈论物理设备、vdev 还是其他东西?我的假设是他们正在谈论层次结构中的每个“设备”。vdev 错误计数器可能是其物理设备的错误计数器的总和,而池错误计数器可能是其 vdev 的错误计数器的总和。这样对吗?

其次,不可纠正的校验和错误是什么意思?这是一个我认为在谈论物理磁盘时通常使用的术语,无论是与从盘片到磁盘电子设备的数据传输有关,还是与磁盘上物理扇区的校验和或从磁盘端口(SATA、SAS、 ...)到主板(或控制器)。

真正感兴趣的是 ZFS 级别(而不是硬件级别)是否存在校验和错误。我目前确信 CKSUM 正在展示后者(否则,它没有多大意义),但我想确定。

第三,假设他们谈论的校验和错误确实是ZFS级别(而不是硬件级别)的校验和错误,为什么他们只显示不可纠正错误的数量?这没有任何意义。我们希望看到每个校验和错误,无论是否可以纠正,不是吗?毕竟,校验和错误意味着磁盘上存在某种硬件未检测到的数据损坏,因此我们可能希望在出现任何错误时立即更换该磁盘(即使镜像磁盘仍然可以充当“备份”)。所以我可能还不明白“不可纠正的错误”究竟是什么意思。

然后我遇到了这个更难理解的文档。在页面末尾附近,它指出

[...] ZFS 维护与池关联的所有数据错误的持久日志。[...]

然后声明

数据损坏错误总是致命的。它们的存在表明至少有一个应用程序由于池中的数据损坏而遇到 I/O 错误。冗余池中的设备错误不会导致数据损坏,也不会作为此日志的一部分进行记录。[...]

我很担心第三句话。根据该段,可能有两种错误:数据损坏错误和设备错误。两个磁盘的镜像配置无疑是多余的,因此(根据该段落)如果 ZFS 在其中一个磁盘上遇到校验和错误(在 ZFS 校验和级别,而不是硬件级别),则不会出现数据损坏错误。这意味着(再次根据该段落)此错误将不会被记录为持久错误日志的一部分。

这没有任何意义,所以我一定是搞错了什么。对我来说,切换到 ZFS 的主要原因是它能够自行检测静默位腐烂,即检测并报告设备上的错误,即使这些错误不会导致硬件/驱动程序级别的 I/O 故障。但是在持久日志中不包含此类错误将意味着在重新启动时丢失它们,这将是致命的(恕我直言)。

所以最终Sun在这里选择了令人担忧的措辞,或者我误解了一些概念(不是母语为英语的人)。

use*_*391 6

有关一般概述,请参阅使用 ZFS 解决问题,最有趣的部分:

配置输出的第二部分显示错误统计信息。这些错误分为三类:

  • READ – 发出读取请求时发生的 I/O 错误
  • WRITE – 发出写入请求时发生的 I/O 错误
  • CKSUM – 校验和错误,意味着设备因读取请求而返回损坏的数据

这些错误可用于确定损坏是否是永久性的。少量 I/O 错误可能表示暂时中断,而大量 I/O 错误可能表示设备存在永久性问题。这些错误不一定对应于应用程序解释的数据损坏。如果设备采用冗余配置,则设备可能会显示无法纠正的错误,而镜像或 RAID-Z 设备级别不会出现错误。在这种情况下,ZFS 成功检索到好的数据并尝试从现有副本中修复损坏的数据。


现在,对于您的问题:

首先,在这种情况下,“设备”是什么意思?他们是在谈论物理设备、vdev 还是其他东西?我的假设是他们正在谈论层次结构中的每个“设备”。vdev 错误计数可能是其物理设备的错误计数的总和,而池错误计数可能是其 vdev 的错误计数的总和。这样对吗?

每个设备都被独立检查,并总结了它自己的所有错误。如果两个镜像都存在此类错误,或者 vdev 本身不是冗余的,则它会向上传播。所以,换句话说,就是影响vdev本身的错误量(这也符合每行单独显示的逻辑)。

但我真正感兴趣的是 ZFS 级别(而不是硬件级别)是否存在校验和错误。我目前确信 CKSUM 正在展示后者(否则,它没有多大意义),但我想确定。

是的,这是硬件方面(非永久性的东西,如故障电缆、突然移除的磁盘、断电等)。我认为这也是一个观点:“软件方面”的故障意味着 ZFS 本身存在错误,因此尚未检查的不需要的行为(假设所有正常的用户交互都被认为是正确的)并且 ZFS 本身无法识别。幸运的是,它们现在非常罕见。不幸的是,它们在很多时候也很严重。

第三,假设他们谈论的校验和错误确实是 ZFS 级别(而不是硬件级别)的校验和错误,为什么他们只显示不可纠正错误的数量?这没有任何意义。我们希望看到每个校验和错误,无论是否可以纠正,不是吗?毕竟,校验和错误意味着磁盘上存在某种硬件未检测到的数据损坏,因此我们可能希望在出现任何错误之前立即更换该磁盘(即使镜像磁盘可以仍然充当“备份”)。所以我可能还不明白他们所说的“不可纠正”究竟是什么意思。

有故障的磁盘已由读/写错误指示(例如,来自磁盘的 URE)。校验和错误就是你所描述的:一个块被读取,它的返回值被树中它上面的块的校验和认为是不正确的,所以它不是返回它而是被丢弃并被标记为错误。“不可纠正”或多或少是一个定义,因为如果你得到垃圾并且知道它是垃圾,你不能纠正它,但你可以忽略不使用它(或再试一次)。不过,措辞可能会造成不必要的混乱。

根据该段,可能有两种错误:数据损坏错误和设备错误。两个磁盘的镜像配置无疑是多余的,因此(根据该段落)如果 ZFS 在其中一个磁盘上遇到校验和错误(在 ZFS 校验和级别,而不是硬件级别),则不会出现数据损坏错误。这意味着(再次根据该段落)此错误将不会被记录为持久错误日志的一部分。

本段中的数据损坏意味着您的某些文件部分或完全被破坏,无法读取,您需要尽快获取上次备份并替换它们。当 ZFS 的所有预防措施都已经失败并且无法再为您提供帮助时(但至少它现在会通知您这一点,而不是在下一次服务器启动检查磁盘运行时)。

对我来说,切换到 ZFS 的主要原因是它能够自行检测静默位腐烂,即检测并报告设备上的错误,即使这些错误不会导致硬件/驱动程序级别的 I/O 故障。但是在持久日志中不包含此类错误将意味着在重新启动时丢失它们,这将是致命的(恕我直言)。

ZFS 系统背后的想法是不需要将它们取下即可发现此类错误,因为可以在线检查文件系统。请记住,10 年前,这是当时大多数小规模系统所不具备的功能。所以这个想法是(当然在冗余配置上)您可以检查硬件的读写错误并使用已知的副本来纠正它们。此外,您可以每月清理以读取所有数据(因为无法知道未读取的数据是好的)并更正您发现的任何错误。

它就像一个旧书的大档案馆/图书馆:你有有价值的书和不那么有价值的书,有些书可能会随着时间的推移而腐烂,所以你需要一个人每周或每月四处走动,查看所有书籍的所有页面是否发霉,错误等,如果他发现任何东西,他会告诉你。如果你有两个相同的图书馆,他可以去另一栋楼,在同一页上看同一本书,然后用副本替换第一个图书馆中被毁坏的书页。如果他从不检查任何书,20 年后他可能会遇到令人讨厌的惊喜。