BTRFSは停電中にデータの一貫性を保証できますか?

BTRFSは停電中にデータの一貫性を保証できますか?

〜のようにZFS独自の声明ZFSは無敵だと主張します。ZFSは停電に対して脆弱である可能性があることを認めます。

BTRFSでそのような声明が見つかりませんでした。停電時にも耐久性がありますか(または設計/計画)ありますか?

答え1

#btrfs IRCにこの質問をしましたが、彼らはshould be ok if your hw isn't "buggy"「バギー」ですyour hw has correct flush/barrier semantics

重要な要約:これは、ZFSと同様にbtrfsが停電によるデータ破損から保護されることを意味します。

理由は次のとおりです。 ZFSとbtrfsの一般的なアイデアは似ています。どちらも Merkle ツリーをデータ構造として使用します。。書き込みには、ディスクの複数のブロックを更新する必要があるかもしれません。ファイルシステムは、空のブロックに新しいデータを書き込むことによってそれを処理します(既存のファイルが変更されても古い状態を反映するブロックを変更する必要はありません)。新しいアップデートツリーを構築してください。すべての難しい作業が完了し、データと更新されたツリーがディスクに書き込まれると、ヘッドポインタが新しいツリーに更新され、変更が表示されます。

ファイルに書き込むときに動作する方法は次のとおりです。

  1. ディスクの空きブロックにデータを書き込みます。
  2. (1)で行った変更に応じて、更新されたMerkle Tree *のコピーを作成します。
  3. ハードウェアにデータをディスクにフラッシュするように要求します。ハードウェアは保留中のすべてのデータを書き込みます。
  4. 新しいMerkleツリーへのヘッドポインタを更新します。
  5. 不要になった古いブロックを解放します。

(4) 取引が完了した後に電源が遮断された場合。 (1)から(3)の間で電源が切れると、ファイルシステムは以前の状態に戻ります((1)で記録されたデータは失われますが、ファイルシステムは一貫性を維持します)。ファイルシステムにエラーがあるかどうかを確認する必要はありません。これはファイルシステムをすぐに使用できることを意味し、これは大きな利点です(大きなファイルシステムを確認するのに時間がかかることがあります!)。

以下は、「欠陥のある」ハードウェアがどのように間違っている可能性があるかの例です。

  1. ディスクの空きブロックにデータを書き込みます。
  2. (1)で行った変更に応じて、更新されたMerkle Tree *のコピーを作成します。
  3. ハードウェアにデータをディスクにフラッシュするように要求します。ハードウェアは完了を承認しますが、完全にフラッシュするわけではありません(たとえば、データがディスクの後書きキャッシュに残ることがあります)。
  4. 新しいMerkleツリーへのヘッドポインタを更新します。このデータは、保留中の他のデータの前にディスクに書き込まれます(たとえば、ディスクヘッドが正しい位置にあるため)。
  5. (1)と(2)の手順で記録されたデータがディスクに書き込まれます。
  6. 不要になった古いブロックを解放します。

(4)と(5)の間、または(5)段階で電源が切れると、ファイルシステムが一致しなくなります。その結果、メルクルツリーおよび/またはデータが部分的にのみ記録され、ファイルシステムが一貫性を失う可能性があります。

実際にRAIDコントローラを使用するときは特別な注意が必要です。。通常、ディスク上の後書きキャッシュを無効にし、独自の後書きキャッシュを使用します。ここで問題を引き起こす可能性がある2つの一般的な方法があります。

*ここで内容を簡素化しています。実際にツリー全体をコピーする必要はありません。変更された部分を追加するだけです。残りは既存のツリーと新しいツリーの間で共有できます。

関連情報