btrfs:寻找有关坏扇区/读取错误/中等错误的 btrfs 错误模式的经验

btrfs:寻找有关坏扇区/读取错误/中等错误的 btrfs 错误模式的经验

在运行使用 HDFS 的 Hadoop 集群(因此数据已经复制了 3 次)时,我们经常会遇到 ext4 问题,因为某些坏扇区(文件系统无法读取或写入它们)导致 ext4 以只读方式重新挂载文件系统。

到目前为止一切顺利,我们正在更换磁盘,但我偶然发现了 btrfs 及其元数据重复,我感兴趣的是 btrfs 在这种情况下会如何反应?

数据错误对我们来说并不重要,因为数据已经由 HDFS 进行校验和复制,但更强大的元数据处理(例如,如果元数据不能写入一个地方,则使用重复的元数据)将是一个好处,因为理论上如果我们切换到 btrfs,只读重新挂载和所需的 fsck 就不应该经常发生...

那么这里有没有人运行没有 raid 的桌面硬盘上的 btrfs 并且可以告诉我文件系统对中等错误的恢复能力如何?

例如,单个磁盘上的元数据复制是否用于修复损坏的元数据,或者文件系统是否仍然出现故障?

答案1

我肯定没有专家并且对文件系统总体上没有什么经验。所以,请谨慎对待我写的内容 :)

现在先抛开免责声明:Btrfs(据我所知)目前还不具备容错能力,需要在这方面进行认真的工作。如果我没记错的话,ZFS 应该能更好地满足您的要求。我自己也考虑过 btrfs,但我还不太想使用它。顺便说一下,opensuse(我认为)提供了对它的支持,所以也许您可以在那里找到一些信息。

如果您在其他地方找到解决方案,请进行更新。

希望我能帮上忙。

http://en.wikipedia.org/wiki/ZFS

对于 ZFS,数据完整性是通过在整个文件系统树中使用(基于 Fletcher 的)校验和或(SHA-256)哈希来实现的。[17] 每个数据块都经过校验,校验和值保存在指向该块的指针中,而不是实际的块本身。接下来,对块指针进行校验,并将值保存在其指针中。此校验和一直沿文件系统的数据层次结构向上进行,直到根节点,根节点也经过校验和,从而创建 Merkle 树。[17] 大多数文件系统都无法检测到传输过程中的数据损坏或幻影读/写(数据写入/读取的校验和正确,但实际上是错误的),因为它们将校验和与数据一起存储。ZFS 将每个块的校验和存储在其父块指针中,因此整个池都会自我验证。[18]

当访问一个块时,无论它是数据还是元数据,都会计算其校验和并将其与存储的校验和值进行比较,以判断其“应该”是什么。如果校验和匹配,数据将通过编程堆栈传递给请求它的进程。如果值不匹配,则如果存储池通过 ZFS 镜像或 RAID 具有冗余,则 ZFS 可以修复数据。[19] 如果存储池由单个磁盘组成,则可以通过指定“copies=2”(或“copies=3”)来提供这种冗余,这意味着数据将在磁盘上存储两次(三次),从而有效地将磁盘的存储容量减半(或者,对于“copies=3”,减少到三分之一)。[20] 如果存在冗余,ZFS 将获取数据的副本(或通过 RAID 恢复机制重新创建它),并重新计算校验和——理想情况下会重现最初预期的值。如果数据通过此完整性检查,系统便可以使用已知良好的数据更新错误副本,以便恢复冗余。

相关内容