BTRFS能否保证断电时数据的一致性?

BTRFS能否保证断电时数据的一致性?

作为ZFS独家声明,ZFS号称刀枪不入ZFS 承认它可能容易受到电源故障的影响。

我找不到 BTRFS 的这样的声明。它(或设计/计划)在停电期间是否耐用?

答案1

我在 #btrfs IRC 上提出了这个问题,他们说should be ok if your hw isn't "buggy"not-"buggy" 意味着your hw has correct flush/barrier semantics

TL;DR:这意味着 btrfs 受到保护,不会因断电而导致数据损坏,其方式与 ZFS 类似。

原因如下:ZFS 和 btrfs 背后的总体思想是相似的。两者都使用 Merkle 树作为数据结构。写入可能需要更新磁盘上的多个块。文件系统通过将新数据写入空块来处理此问题(即使正在修改现有文件,因此不需要修改反映旧状态的块)并构建新的更新树。一旦所有繁重的工作完成,数据和更新树已写入磁盘,头指针将更新到新树,使更改可见。

以下是写入文件时的行为方式:

  1. 将数据写入磁盘上的空闲块。
  2. 复制 Merkle 树*,根据(1)中写入的更改进行更新。
  3. 要求硬件将数据刷新到磁盘 - 硬件写入所有待处理的数据。
  4. 将头指针更新为新的 Merkle 树。
  5. 释放不再需要的旧块。

如果 (4) 交易完成后断电。如果在步骤 (1) 到 (3) 期间断电,文件系统将恢复旧状态(步骤 (1) 中写入的数据丢失,但文件系统保持一致)。请注意,无需检查文件系统错误,这意味着文件系统立即可用,这是一个很大的优势(检查大型文件系统可能需要很长时间!)。

以下是“有缺陷的”硬件如何出错的示例:

  1. 将数据写入磁盘上的空闲块。
  2. 复制 Merkle 树*,根据(1)中写入的更改进行更新。
  3. 要求硬件将数据刷新到磁盘 - 硬件确认完成但不会完全刷新(例如,数据可能保留在磁盘的回写缓存中)。
  4. 将头指针更新为新的 Merkle 树。该数据在其他待处理数据之前被写入磁盘(例如,因为磁盘的磁头恰好位于正确的位置)。
  5. 步骤 (1) 和 (2) 中写入的数据将写入磁盘。
  6. 释放不再需要的旧块。

如果在 (4) 和 (5) 之间或执行步骤 (5) 期间断电,文件系统将变得不一致。因此,Merkle 树和/或数据可能仅被部分写入,从而导致文件系统变得不一致。

实际上,使用 RAID 控制器时必须特别小心。他们通常禁用磁盘上的回写式缓存,并使用自己的回写式缓存。这里出现问题的常见方式有两种:

*我在这里简化了事情。实际上没有必要复制整棵树。仅需要添加更改的部分 - 其余部分可以在旧树和新树之间共享

相关内容