第22章 書き込みバリア
書き込みバリア は、揮発性書き込みキャッシュのあるストレージデバイスが電源を失った場合でも、ファイルシステムのメタデータが正しく書き込まれ、永続ストレージに順序付けられます。また、書き込みバリアが有効にされたファイルシステムは、fsync()を介して送信されるデータ が電源損失時に永続的になるようにします。
書き込みバリアを有効にすると、一部のアプリケーションにパフォーマンスが大幅に低下します。具体的には、fsync() を大きく使用したり、小規模なファイルを作成したり、削除したりするアプリケーションは、非常に遅くなる可能性があります。
22.1. Write Barriers の重要性
ファイルシステムは、メタデータを安全に更新して、一貫性を確保できるように細心の注意を払ってください。ジャーナル化されたファイルシステムバンドルメタデータがトランザクションに更新され、以下の方法で永続ストレージに送信します。
- まず、ファイルシステムはトランザクションのボディーをストレージデバイスに送信します。
- 次に、ファイルシステムはコミットブロックを送信します。
- トランザクションと対応するコミットブロックがディスクに書き込まれると、ファイルシステムは、トランザクションが power failure 後も存続することを想定します。
ただし、電源の失敗時のファイルシステムの整合性は、追加のキャッシュを持つストレージデバイスの複雑になります。ローカルの S-ATA や SAS ドライブなどのストレージターゲットデバイスは、サイズが 32MB から 64MB(最新のドライブで)書き込みキャッシュを持つ可能性があります。ハードウェア RAID コントローラーには、多くの場合、内部書き込みキャッシュが含まれます。さらに、NetApp、IBM、Hitachi、EMC(その他)には大きなキャッシュがあります。
キャッシュに格納されると、データの書き込みキャッシュ I/O が「complete」として報告します。キャッシュが機能しなくなった場合は、データも失われます。キャッシュデステージから永続ストレージへのキャッシュのデメンテーションであるため、元のメタデータの順番が変わる可能性があります。これが発生すると、完全なトランザクションに関連するトランザクションがなくてもコミットブロックがディスクに存在する可能性があります。これにより、ジャーナルは、初期化されていないトランザクションブロックを非初期化されたトランザクションブロックをファイルシステムに再生できます。これにより、データの不整合や破損が発生します。
Write Barriers の仕組み
書き込みバリアは、I/O の前後にストレージ書き込みキャッシュのフラッシュにより Linux カーネルで実装されます( 順番は重要 )。トランザクションが書き込まれると、ストレージキャッシュがフラッシュされ、コミットブロックが書き込まれ、キャッシュは再度フラッシュされます。これにより、以下が確保されます。
- ディスクにはすべてのデータが含まれます。
- 順序の並べ替えは発生していません。
バリアが有効になると、fsync() 呼び出しでストレージキャッシュのフラッシュも発行されます。これにより、fsync() が返された直後に電源損失が発生した場合でも、ファイルデータがディスク上の永続化されるようになります。