X
  • ZFS
    June 2, 2008

ZFS 端到端数据完整性

Guest Author

文件系统的工作归结为:当被请求读取块时,它应该返回上次写到此块的数据。如果它做不到这一点(由于磁盘脱机或数据已经被损坏或篡改),那么它应该能检测并返回错误。

难以置信的是,大多数文件系统未能做到这一点。它们依赖底层硬件来检测和报告错误。如果磁盘返回坏数据,一般文件系统甚至无法检测到这一点。

即使我们可以假设所有磁盘都是完美的,数据也很容易在传输中受到损坏:控制器 bug、DMA 奇偶校验错误等等。您知道的只是数据离开磁盘片时是完好无缺的。如果将数据当作一个包,则这就像 UPS 所说的那样,“我们保证您的包裹在我们包装时没有损坏”。这根本不是您寻求的保证。

过程中的损坏不仅仅是一个学术问题:甚至像糟糕的供电这样的小事都可能导致无提示数据损坏。

任何昂贵的存储阵列都无法解决这个问题。I/O 路径仍然易受攻击,但它变得更长:不管阵列存在什么样的硬件和固件 bug,在离开磁盘片之后,数据必须要能够存活。

如果您位于 SAN 上,您将使用磁盘固件读盘器设计的网络。上帝保佑您。

怎么办?一种选择是在每个磁盘块中存储校验和。大多数现代磁盘驱动器可以使用比通常的 512 字节略大的扇区来格式化,通常是 520 或 528。这些额外的字节可用于存放块校验块。但有效利用此校验和要比想象中困难:校验和的有效性极大地依赖于它的存储位置和它的评估时间。

在许多存储阵列中(请参阅 Dell|EMC PowerVault paper 中的一个典型示例,当中有这些问题的完整描述),数据与其阵列内的校验和进行比较。不幸的是,这没有多少用处。它不会检测常见的固件 bug,比如幻象写(上一次写操作,但实际上从未对磁盘执行过),因为数据和校验和存储为单元,所以它们是自我一致的 (self-consistent),即使当磁盘返回坏数据时。从阵列到主机的其他 I/O 路径仍不受保护。简而言之,这种块校验和提供了一种好的方法来确保阵列产品不会比它所包含的磁盘可靠性低,但也仅此而已。

NetApp 的块附加校验和方法似乎与此类似,但事实上要强大得多。与许多阵列一样,NetApp 使用 520 字节扇区来格式化其驱动器。然后,它将其分组为 8 扇区块:4K 的数据(WAFL 文件系统块大小)和 64 字节的校验和。当 WAFL 读取块时,它将校验和与数据进行比较,就像阵列一样,但有一个关键的不同之处:它在数据已经通过 I/O 路径进行了比较之后,才进行比较,所以它会验证块在从磁盘片到内存的过程中没有受到损坏。

这是一个主要的改进,但仍不足够。块级校验和只能证明块是自我一致的;它不能证明这是一个正确的块。再次请出我们的 UPS,“我们保证您收到的包裹没有损坏。但我们不保证它是您的包裹”。

所有这些方案的基本问题在于,它们不在数据与保护它的校验和之间提供故障隔离。

ZFS 数据认证

端到端数据完整性需要在数据已经到达主机的内存之后,按照独立的校验和验证数据。知道每个块仅仅与自身一致,或者它在 I/O 路径一些先前的点上是正确的还远远不够。我们的目标是检测所有可能发生的损坏,包括人工错误,比如替换文件系统磁盘,或者输入了错误的 dd(1) 参数。(您有没有过这样的经历:本来想键入 "if=" 结果却键入了 "of="?)

ZFS 存储池实际上只是一个块树。ZFS 将每个块的校验和存储在其父块指针而非块本身中,以此提供数据与校验和之间的故障隔离。树中的每个块都包含所有子块的校验和,所以整个池是自我验证的。[超级块(树根)是特殊情况,因为它没有父块;有关如何处理这种情况的详细信息,我们将在另一篇文章中介绍。]

当数据和校验和不一致时,ZFS 知道校验和可以信任,因为校验和本身属于树中更高一层的其他块,而该块已通过验证。

ZFS 使用其端到端的校验和检测并更正无提示数据损坏。如果磁盘瞬时返回坏数据,ZFS 将检测到它并重试读取。如果磁盘属于镜像或 RAID-Z 组,则 ZFS 将同时检测并更正错误:它将使用校验和确定哪个副本是正确的,为应用程序提供好数据并修复损坏的副本。

与以往一样,注意 ZFS 端到端数据完整性不需要任何特殊硬件。您不需要高价的磁盘或阵列,您不需要使用 520 字节的扇区重新格式化驱动器,您不需要修改应用程序来从中获益。它是完全自动的,而且它使用的是廉价磁盘。

等一等,这还没完!

ZFC 存储池的块形成一棵 Merkle 树,其中每个块验证其所有子块。实践证明,Merkle 树可以为树的任何组件以及整个树提供了加密强认证。ZFS 为每个块使用了 256 位校验和,并提供了从简单快捷的 fletcher2(默认值)到慢但安全的 SHA-256 校验和功能。使用类似 SHA-256 的加密散列时,超级块校验和为整个存储池提供了持续更新的数字签名。

如果您叫 UPS 发送包裹,这肯定能派上用场。


Technorati Tags:

Be the first to comment

Comments ( 0 )
Please enter your name.Please provide a valid email address.Please enter a comment.CAPTCHA challenge response provided was incorrect. Please try again.Captcha