Web更新

# UnuntuでZFSを使ってみよう ## 第11回 ZFSでの読み書きの仕組みを知ろう

前回は、Ubuntu 20.04 LTSでのauto-snapshot の機能について説明しました。今回は、ZFSでどのようにストレージに読み書きするかを説明します。ZFSのストレージデバイスへの読み書きは、非同期で行われます。

ZFSの書き込み

ZFS の非同期書き込み

ZFSのストレージデバイスの書き込みは、非同期で行われます。通常ファイルを書き込んだ場合、ARC(Adaptive Replacement Cache)というメモリ上のファイルキャッシュにデータが配置完了した時点で書き込み完了とされます。同期書き込みオプション(O_DIRECT)を伴う場合は、log領域(ZIL=ZFS Intent Log)にジャーナル情報が書かれた時点で書き込み完了とされます。

ARCに配置されたデータは、非定期にストレージへ書き込みます。これはHDDのように、シーケンシャル書き込みが速いストレージに有効です。現在ではストレージとしてSSDが使われていることが多いです。しかしSASなどを使用している場合や、かつてのテープドライブの代替としてHDDを使用する場合もあるため、その用途ではとても有効です。

ZFSのブロック書き込み

ZFSではファイルブロック単位で書き込みを行います。ファイル書き込み時に、必ず新しいファイルブロックを作成します。これをCoW(Copy on Write)と言います。

ZFSの内部構成は、Super Node→ファイルシステム単位のNode→ファイル単位のNode→ファイルブロック、のツリー構造です。

1.ファイル書き込み前は、以下図の状態とします。

2.ファイルに書き込みが発生するとき、変更される部分のファイルブロックを新しく書き込みます。
このとき、Blockの書き込み前のチェックサムを計算し、Block書き込み後に再読み込み直してチェックサムを再度計算します。この書き込み前と書き込み後のチェックサムが一致していない場合、新たなブロックへ書き直します。このため、Block書き込み時点での書き込みミスを防ぐことができます。このチェックサムはメタデータとして保存されます。

3.ファイル書き込み終了後、Nodeを新しく作成し、既存のBlockと書き込み完了したBlockを新しいNodeにリンクします。

4.最後に、既存のNodeの代わりに新しいNodeを上位のNodeにリンクして書き込みが完了します。書き込み後、不要になったNode・Blockは、定期的なタイミングで削除されます。

CoWの方法では、完全にファイル書き込み完了するまで既存のデータを破壊しないところが特徴です。また、完全に書き込みが終わり、Nodeを切り替えるときだけがAtomicな変更となります。

ZFSの読み込み

ARC(Adaptive Replacement Cache)による高速読み込み

ZFSのストレージデバイスからの読み込みは、ARCに残っていればそれをそのままメモリ上の読み込み情報とします。ARCに残っていない場合は、ストレージからARCに読み込み、それを読み込み情報としてメモリ上に配置します。このため、ARC上にファイル情報が残っている場合、ZFSは非常に高速にディスクの内容を読み取れることになります。

読み込んだデータの検査

読み込んだファイルブロックのチェックサムがメタ情報上のチェクサムと異なるとき、リードエラーとなります。zpoolがMirorされている場合、もう1つのディスクからファイルブロックを読み込み直します。zpoolがRAID構成をとっている場合、ジャーナル情報からファイルブロックを構成し直します。読み直した、もしくは構成し直したファイルブロックが正しい場合、ARCにその情報を配置します。同時に、壊れたファイルブロックを廃棄し、新たに正しいファイルブロックを書き直します。
このファイルブロックの破壊はサイレントコラプト(またはサイレントエラー)と呼ばれ、長期間HDDにアクセスしない場合などに発生します。ZFSでは上記のようにサイレントコラプトを自動的に検知し、Mirror・RAID構成のときは自動的に修正します。これをセルフヒーリングと呼びます。

このサイレントコラプトを防ぐためには、zpool scrub プール名コマンドを実行してスクラブを実行します。スクラブを行うと指定したzpool上のすべてのブロックを対象に検査を行い、損傷しているか報告し、セルフヒーリング可能であれば修復します。スクラブは非常に負荷のかかる動作なので、長時間必要な場合があります。定期的なスクラブは、期間を慎重に設定しましょう。

終わりに

今回は、ZFSの読み書きの仕組みを説明しました。ZFSがストレージへの読み書き時にチェックサムを検査することで正しいデータが読み書きできること、間違ったデータはMirror/RAID構成であれば自動的に修復することが分かりました。次回はARCとZILについて説明します。次回をお楽しみに。

さて、このコラムを掲載いただいているデジタル・ヒュージ・テクノロジー社は老舗のOSSインテグレーターです。特にLinuxは強く、OSSを活用した業務システムの実績も多いです。興味がある方は以下のページもご覧ください。
DHT OSS導入コンサルティングサービス

関連記事一覧