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


11

正如ZFS专门指出的那样ZFS被称为无敌 ZFS承认它可能容易出现电源故障。

我找不到有关BTRFS的声明。在断电之间是否(或设计/计划为)持久?


再读一遍。“如果您的池由于硬件故障或断电而损坏,请参阅修复ZFS存储池范围的损坏。” (..)尝试使用以下zpool clear -F 命令恢复池
Michael D.

因此,您说“ ZFS不保证数据一致性,仅尝试恢复”?
ceremcem'2

是。有几个缓存要处理,硬盘内置缓存,操作系统缓存/缓冲区。在某个时候,可以使用a sync或a flush将高速缓存写入磁盘,或者在断电期间将数据写入磁盘。如果硬盘运行状况良好并且没有断电(或者在断电时将UPS连接到正确关闭的计算机),则ZFS可能会正常工作。您不能说FAT32左右。
Michael D.

2
数据丢失不是问题,因为发生断电是很自然的后果,但是在我的情况下,数据一致性是一个问题。在这种极端情况下,文件系统可能会丢失数据,但不会导致磁盘中的数据不一致。我需要连续快照功能,因此我将继续使用BTRFS。在我的情况下,NILFS2是最接近的选项。
ceremcem

1
我在#btrfs IRC上问过这个问题,他们说的should be ok if your hw isn't "buggy"不是-“越野车”的意思your hw has correct flush/barrier semantics。我已经在IRC上发布了与此问题相关的链接,希望有人会花一些时间来详细说明;但现在就这样。
Hi-Angel

Answers:


5

我在#btrfs IRC上问过这个问题,他们说的should be ok if your hw isn't "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控制器时必须格外小心。他们通常禁用磁盘上的写回缓存,而使用自己的写回缓存。这里有两种常见的出错方法:

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


谢谢您的解释。但是,所有要求(包括IRC对话)都需要引用。然后您的答案将被接受。
ceremcem

关于IRC日志,我在这里指的是@ Hi-Angel的评论。也许他可以提供参考?不过,我还添加了其他部分的参考。
马丁

BTRFS不使用Merkle树,它使用B树(因此为“ B-TRee FileSystem”),并且您的故障示例要求硬件无法正确实现写屏障(这在当今是不寻常的情况) 。否则,很好的答案。
奥斯汀·海默加恩

btrfs使用的树实际上是B树(此属性与树的“形状”有关,并且它们是自平衡的)和哈希/默克尔树(叶子包含一些数据的哈希,节点包含他们的孩子的哈希值,因此每次更改都会一直传播到根)。能够验证这些哈希值使btrfs和ZFS能够检测到损坏的数据(如果在“镜像”模式下使用,则可以从另一个磁盘读取该数据)。
马丁
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.