X
  • ZFS
    June 3, 2008

RAID-Z

Guest Author

安価なディスクで高速かつ信頼性の高いストレージを提供することが、RAID (Redundant Arrays of Inexpensive Disks) 本来の目的でした。安価なという点が重要なはずでしたが、現在こういった製品も販売されています。どうしてでしょうか。

RAID-5 (だけでなく、RAID-4、RAID-6、Even-Odd 法、Row Diagonal Parity 法など、ほかのデータ/パリティースキーマ) は、RAID の目的を完全に達成するものではありません。また、RAID-5 書き込みホールと呼ばれる致命的欠陥があるため、目的の完全達成は不可能です。ディスク故障時のデータ復旧のために、RAID ストライプのデータを更新するときは必ずパリティーも更新して、全ディスクでの XOR をゼロにしておかなければなりません。問題は、複数のディスクをアトミックにアップデートする方法がないということです。このため、ディスククラッシュや停電で RAID ストライブのデータが破損することがあります。

データブロック書き込みの直後で、かつ、書き込んだデータのパリティーブロック書き込みの前に電源が落ちた、という例を考えると、理解しやすいでしょう。ストライプ上でデータとパリティーが一致しなくなり、ストライプ全体の書き込みでたまたま以前と同じデータが上書きされないかぎり、不一致を解消する手段がありません。このため、ディスクエラーを起こしたストライプ上にあるブロックを読み込むと、RAID の修復プロセスが誤ったデータを生成します。さらに悪いことに、この現象を検知する手段がありません。正常なデータを出力しているときと変わりがないのです。

この問題について、ソフトウェアだけで完結する回避方法もありますが、その方法では速度が大きく低下するため、ソフトウェア RAID の市場価値がなくなってしまいます。現行の RAID 製品はいずれも、NVRAM を利用した電源断対策が可能なハードウェアで、RAID ロジックを処理しています。この対応は有効ですが、高価です。

既存の RAID スキーマには、ほかにも面倒なパフォーマンス問題があります。ストライプ一部の書き込みをする場合、つまり RAID ストライプ 1 つ分よりも小さなデータを更新する場合、新しいパリティーを計算するために、既存のデータとパリティーを読み込まなければなりません。これは大きなオーバーヘッドになります。ストライプ全体の書き込みでは、単純にすべての書き込みを非同期処理できますが、ストライプ一部の書き込みでは、同期読み取りをしなければ書き込みを始めることもできません。

繰り返しますが、これは高価なハードウェアを使えば解決可能な問題です。ディスク読み取りの終了を待つ間に、RAID アレイがストライプ一部の書き込みの内容を NVRAM に保存しておき、読み取りの待ち時間をユーザーに意識させないという対応が可能です。もちろん、NVRAM のバッファーがいっぱいになると、この仕組みは機能しなくなります。それで問題ない、というのがストレージベンダーの主張です。さらに費用をかけて NVRAM を増設すればよいのです。お金さえあれば問題はありません。

ストライプ一部の書き込みにはまだ問題があります。ZFS ようなトランザクション対応ファイルシステムでの問題です。ストライプ一部の書き込みにはライブデータの書き換えが必要ですが、このことが、トランザクションのセマンティクスを確保するためのルールと矛盾します (ZFS へのほかの書き込みと同様に、ストライプ全体の書き込み時に電源が落ちても、書き込み中のブロックはすべてライブでないため、問題ありません)。

厄介者の、ストライプ一部の書き込みさえなければよかったのですが。

RAID-Z 入門

RAID-Z は RAID-5 と似たデータ/パリティースキーマですが、ストライプ幅が可変である点が異なります。ブロックサイズにかかわらず、すべてのブロックで RAID-Z のストライプを構成します。つまり、RAID-Z への書き込みはすべてストライプ全体の書き込みになります。これを ZFS のトランザクションセマンティクスであるコピーオンライトと組み合わせると、RAID の書き込みホールを完全に回避できます。RAID-Z は、リードモディファイライトを行わないため、従来の RAID と比較して速度も向上しています。

あれ、それで全部 ? 可変幅ストライプ ? まったくわかりきったことだ。そんなに名案なら、皆がやってるはずだろう ?

仕掛けがあるのは、RAID-Z の再構築機能です。ストライプのサイズがそれぞれに異なるため、「全ディスクでの XOR をゼロにする」といった単純な処理ではありません。ファイルシステムのメタデータを走査して、RAID-Z のジオメトリを判断する必要があります。これは、ファイルシステムと RAID アレイが分離した製品では不可能なことで、RAID-Z のような仕組みがこれまでストレージ市場になかったことの理由でもあります。データの論理的構造と物理的構造を総合的に把握する必要があります。

あなたはこう言いたいのかもしれません。遅くないのか ? メタデータの走査にかかるコストは高くないのか ? たしかに、トレードオフは避けられません。容量に余裕がない場合は、比較的遅くなります。しかし実際は、よほど容量が逼迫していないかぎり、メタデータによる再構成のほうが高速です。ライブデータのコピー作成のみを行い、未割り当てディスクスペースのコピーに無駄な時間を使わないからです。

それよりもはるかに重要なことがあります。ZFS がメタデータを検証するということは、すべてのブロックで 256 ビットのチェックサムを確認できるということです。従来の RAID 製品では、これができません。ただ盲目的にすべてのディスクの XOR を確認するだけです。

RAID-Z の特長はどのような点でしょうか。データの自己修復ができます。ディスク全���のエラーだけでなく、サイレント破損を検出して修正することもできます。RAID-Z のブロックを読み込むたびに、ZFS がチェックサムを確認します。データディスクの内容が正しくない場合、ZFS はパリティーを読み込んで複合再構成を行い、どのディスクが不正なデータを返したのか探ります。そのうえで、破損したディスクを修復し、正しいデータをアプリケーションに返します。また、Solaris FMA で処理内容を通知し、システム管理者にサイレント破損を起こしているディスクがあることを知らせます。

最後に、RAID-Z には特別なハードウェアが必要ないということに注目してください。データを守るための NVRAM も、パフォーマンスを向上させるための書き込みバッファーも、必要ありません。ZFS と RAID-Z の併用で、RAID 本来の目的を遂行します。つまり、安価な普及品のディスクで、高速かつ信頼性が高いストレージを提供します。


耐久性の低下したハードウェア上のサイレント破損を、RAID-Z で検出し修正する実例については、Eric Lowe のブログを参照してください。

現行の RAID-Z はシングルパリティーアルゴリズムですが、RAID-Z の基本設計はどのような形態の RAID にも適応可能なものです。ダブルパリティー対応版は現在開発中です。

もう 1 つだけ、プログラマがには驚きの情報を。RAID-Z の実装は、599 行しかありません。


Technorati タグ:

Be the first to comment

Comments ( 0 )
Please enter your name.Please provide a valid email address.Please enter a comment.CAPTCHA challenge response provided was incorrect. Please try again.