(57)【要約】【課題】本発明は、システムが故障した後にパリティを再計算するために必要な時間を低減し、ＲＡＩＤアレイ中のデータが破壊されることを防止できるシステムを提供する。【解決手段】記憶サブシステムは、複数のストライプのデータおよびそのパリティ値を記録する複数のディスクを含むＲＡＩＤアレイと、書き込み処理により更新しようとするストライプの直前データを記憶するための不揮発性メモリと、不揮発性メモリに記憶された該ストライプの既存の直前データを書き込み処理の実行前に記憶するように構成されたＲＡＩＤコントローラを備える。ＲＡＩＤコントローラは、システム故障により判読不可とみなされたストライプのデータブロックに対する不揮発性メモリ内の既存データと、判読可能なストライプのデータブロックから読み出されたデータとを用いて、破壊された特定ストライプに対して更新パリティ値を計算する。【選択図】図１
2008251034.tif 000002
【特許請求の範囲】
【請求項１】
記憶サブシステムであって、
一連のデータブロックからなる複数のストライプのデータおよびそのパリティ値を記録する複数のディスクを含むＲＡＩＤアレイと、
ＲＡＩＤアレイ内のディスクから独立した不揮発性メモリであって、書き込み処理により更新しようとするストライプの直前データを記憶するための不揮発性メモリとを備え、
直前データは、書き込み処理により更新しようとする各ブロック内に記憶された該ストライプの既存パリティ値および既存データを含み、
記憶サブシステムは、不揮発性メモリに記憶された該ストライプの直前データを書き込み処理の実行前に記憶するように構成されたＲＡＩＤコントローラをさらに備え、
ＲＡＩＤコントローラは、該ストライプの新規データおよび新規パリティ値がＲＡＩＤアレイに適正に書き込まれた後においては、不揮発性メモリから直前データを消去する一方、システム故障により破壊されたストライプを特定し、システム故障により判読不可とみなされたストライプのデータブロックに対する不揮発性メモリ内の既存データと、判読可能なストライプのデータブロックから読み出されたデータとを用いて、破壊された特定ストライプに対して更新パリティ値を計算することを特徴とする記憶サブシステム。
【請求項２】
ＲＡＩＤコントローラは、システム故障の後に、ストライプの直前データが不揮発性メモリ内に存在する場合には、該ストライプが破壊されたものと判断することを特徴とする請求項１に記載の記憶サブシステム。
【請求項３】
ＲＡＩＤコントローラは、書き込み処理が完了しなかったストライプのリストを保持し、該リストを用いて、破壊されたストライプを特定することを特徴とする請求項１に記載の記憶サブシステム。
【請求項４】
ＲＡＩＤコントローラは、各ビットでストライプ群を表し、各ビットの値で書き込み処理が完了しなかったストライプを表すビットマップを保持し、該ビットマップを用いて、破壊されたストライプを特定することを特徴とする請求項１に記載の記憶サブシステム。
【請求項５】
ＲＡＩＤコントローラは、更新パリティ値をＲＡＩＤアレイ内のストライプに書き込むことを特徴とする請求項１に記載の記憶サブシステム。
【請求項６】
一連のデータブロックからなる複数のストライプのデータおよびそのパリティ値を記録する複数のディスクを含むＲＡＩＤアレイと、ＲＡＩＤアレイ内のディスクから独立した不揮発性メモリとを備えた記憶サブシステムを作動させる方法であって、
書き込み処理の実行前に、書き込み処理により更新しようとするストライプの直前データをＲＡＩＤアレイから読み込むステップを有し、
直前データは、書き込み処理により更新しようとする各ブロック内に記憶された該ストライプの既存パリティ値および既存データを含み、
この作動方法はさらに、
該ストライプの直前データを不揮発性メモリに記憶させるとともに、該ストライプの新規データおよび新規パリティ値がＲＡＩＤアレイに適正に書き込まれた後においては、不揮発性メモリから直前データを消去するステップと、
システム故障により破壊されたストライプを特定するステップと、
システム故障により判読不可とみなされたストライプのデータブロックに対する不揮発性メモリ内の既存データと、判読可能なストライプのデータブロックから読み出されたデータとを用いて、破壊された特定ストライプに対して更新パリティ値を計算するステップとを有することを特徴とする作動方法。
【請求項７】
システム故障の後に、ストライプの直前データが不揮発性メモリ内に存在する場合には、該ストライプが破壊されたものと判断することを特徴とする請求項６に記載の作動方法。
【請求項８】
書き込み処理が完了しなかったストライプのリストを保持するとともに、該リストを用いて、破壊されたストライプを特定するステップを有することを特徴とする請求項６に記載の作動方法。
【請求項９】
各ビットでストライプ群を表し、各ビットの値で書き込み処理が完了しなかったストライプを表すビットマップを保持し、該ビットマップを用いて、破壊されたストライプを特定するステップを有することを特徴とする請求項６に記載の作動方法。
【請求項１０】
更新パリティ値をＲＡＩＤアレイ内のストライプに書き込むステップを有することを特徴とする請求項６に記載の作動方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明はディスクアレイのエラー補正の技術分野に関する。
【背景技術】
【０００２】
コンピュータ装置は、一般に、情報（例えばデータ及び／又はアプリケーションプログラム）を格納するために、ディスクドライブのような大容量の二次的なメモリを必要とする。従来のコンピュータ装置は、大容量のデータを永久的に保存するために、単一の“ウインチェスタ”型ハードディスクドライブをよく使用している。コンピュータと関連するプロセッサの性能が良くなるにしたがって、大容量のディスクドライブと高速のデータ移送性の要求が増してきた。それとともに、ディスクドライブ性能の変更や改良が為されてきた。例えば、データ及びトラック密度の増加、媒体改良、及び単一のディスクドライブにおいて、多数のヘッドとディスクを用いることにより、高速のデータ移送性が可能になった。
【０００３】
二次的な保存のために単一のディスクドライブを使用することの問題は、非常に大きい容量又は性能が必要となった場合の、ドライブ交換の費用である。別の問題は、単一のディスクドライブに余裕又はバックアップが不足することである。単一のディスクドライブが損傷したり、動作不能になったり、又は交換されると、そのシステムは停止する。
【０００４】
単一のディスクドライブシステムの上述の問題を軽減し又は解消するために従来行われてきたことは、並列に相互連結された複数のドライブを使用することである。データは、並列につながれた多数のドライブから同時に又は複数のドライブのシングルドライブから連続的にアクセスできる固まりに分解される。ディスクドライブを並列に連結したシステムの一つが、“高価でないディスクの冗長アレイ”（レイド：ＲＡＩＤ）として知られている。ＲＡＩＤシステムは、大きなシングルディスクドライブシステムと同一の記憶容量を有し、しかも低価格である。同様に、高速データ移送性もアレイの平行処理により達成される。
【０００５】
ＲＡＩＤシステムにより、アレイにディスクドライブを追加するにしたがって記憶容量が大きくなる。ＲＡＩＤシステムのディスクが壊れた場合、全体システムを停止することなく、ディスクを交換できる。壊れたディスク上のデータはエラー補正法を用いて回復できる。
【０００６】
<<ＲＡＩＤアレイ>>
ＲＡＩＤは、ＲＡＩＤレベル０からＲＡＩＤレベル５と呼ばれる６つのディスクアレイの形態を有する。それぞれのＲＡＩＤレベルは利点と欠点を有する。本説明では、ＲＡＩＤレベル４と５だけを説明する。しかしながら、それぞれのＲＡＩＤレベルの詳細な説明は、パターソン等によるA Case for Redundant Arrays of Inexpensive Disk (RAID)、 ACM SIGMOD Conference,１９８８年６月、に記述されている。この論文は本明細書中に組み込まれている。
【０００７】
ＲＡＩＤシステムはディスク破壊から保護する技術を提供する。ＲＡＩＤは多数の異なるフォーマット（既述）を包含するが、共通の特徴は、一つのディスク（又は複数のディスク）がディスクアレイ中に保存されたデータのパリティ情報を保存しているという点である。ＲＡＩＤレベル４のシステムは、全てのパリティ情報を単一のディスク上に保存するのに対して、ＲＡＩＤレベル５のシステムは公知のパターンにしたがってＲＡＩＤアレイの全体にわたってパリティブロックを保存する。ディスクが壊れた場合、ＲＡＩＤサブシステムに保存されたパリティ情報により、壊れたディスクから損失したデータを再び計算できる。
【０００８】
図１は、ＲＡＩＤレベル４を備えた従来のシステムを表したブロック図である。このシステムは、コンピュータシステム又はホストコンピュータに通信チャンネル１３０を介して接続されたＮ＋１個のディスク１１２−１１８を備えている。この実施例では、データは各ハードディスク上で４Ｋバイト（ＫＢ）のブロック又はセグメントに保存される。ディスク１１２はシステム用のパリティディスクであって、ディスク１１４−１１８はデータディスク０ないしデータディスクＮ−１である。ＲＡＩＤレベル４は、図１に示すように、アレイ中のすべてのディスクにデータブロックを分配するディスク“ストライピング”を使用する。ストライプは一群のデータブロックで、そこでは各ブロックがＮ個の別々のディスク上に保存されるとともに、対応するパリティブロックが一つのパリティディスク上に保存される。図１において、第１と第２のストライプ１４０と１４２は点線で示してある。最初のストライプ１４０はパリティ０ブロックとデータブロック０からＮ−１を備えている。図示する実施例では、最初のデータブロック０が、Ｎ＋１個のディスクアレイのディスク１１４上に保存される。第２のデータブロック１はディスク１１６に保存される。最後に、データブロックＮ−１はディスク１１８に保存される。公知の方法を用いてストライプ１４０に対するパリティが計算され、それはディスク１１２上にパリティブロック０として保存される。同様に、Ｎ個のデータブロックを有するストライプ１４２が、ディスク１１４にデータブロックＮ、ディスク１１６にデータブロックＮ＋１、さらにディスク１１８にデータブロック２Ｎ−１というように保存される。ストライプ１４２に対してパリティが計算され、それがパリティブロック１としてディスク１１２に保存される。
【０００９】
図１に示すように、ＲＡＩＤレベル４は、システム中の各ストライプに対してエラー補正情報を含む特別のパリティディスクドライブを付加する。システム中にエラーが発生した場合、ＲＡＩＤアレイはアレイ中のすべてのドライブを使用してシステム中のエラーを補正しなければならない。ＲＡＩＤレベル４は、データのごく一部を読み取る際に適正に動作する。しかし、ＲＡＩＤレベル４アレイは常に、アレイ中にデータを書き込む際に専用のパリティドライブを使用する。
【００１０】
ＲＡＩＤレベル５のアレイシステムもまたパリティ情報を記録する。しかし、単一のドライブ上にすべてのパリティセクターを保持することはない。ＲＡＩＤレベル５は、Ｎ＋１個のディスクのディスクアレイ中で利用可能なディスク上でパリティブロックの位置を循環させる。したがって、ＲＡＩＤレベル５のシステムは、パリティデータをＮ＋１個のディスクドライブ上で一度に１ブロックずつ順番に循環させて分散させることによりＲＡＩＤ４の性能を改善している。最初の組のブロックでは、パリティブロックは最初のドライブに保存される。第２組のブロックでは第２のディスクドライブに保存される。各セットがパリティブロックを有するように繰り返される。しかし、全てのパリティ情報が一つのディスクドライブに保存されることはない。ＲＡＩＤレベル５システムでは、一群のブロックに対するすべてのパリティ情報を一つのディスクに保持させていないので、一度にアレイ中のいくつかの複数のドライブに書き込みが可能である。したがって、ＲＡＩＤレベル５システム上では読み取りと書き込みの両方がＲＡＩＤ４アレイよりも素早く行われる。
【００１１】
図２はＲＡＩＤレベル５を有する従来のシステムを表すブロック図である。そのシステムは、通信チャンネル１３０によりコンピュータシステム又はホストコンピュータに接続したＮ＋１個のディスク２１２ないし２１８を備えている。ストライプ２４０では、パリティブロック０が第１のディスク２１２に保存されている。データブロック０は第２のディスク２１４に保存され、データブロック１が第３のディスク２１６に保存されている。最後に、データブロックＮ−１がディスク２１８に保存されている。ストライプ２４２では、データブロックＮが第１ディスク２１２に保存されている。第２のパリティブロック１は第２のディスク２１４に保存されている。データブロックＮ＋１はディスク２１６に保存されている。最後にデータブロック２Ｎ−１がディスク２１８に保存されている。Ｍ−１のストライプ２４２では、データブロックＭＮ−Ｎが第１のディスク２１２に保存されている。データブロックＭＮ−Ｎ＋１は第２のディスク２１４に保存されている。データブロックＭＮ−Ｎ＋２は第３のディスク２１６に保存されている。最後に、パリティブロックＭ−１はｎ番目のディスク２１８に保存されている。したがって、図２は、ＲＡＩＤレベル５システムがＲＡＩＤレベル４システムと同一のパリティ情報を保存していることを示しているが、ＲＡＩＤレベル５システムはパリティブロックの位置を利用可能なディスク２１２ないし２１８上で循環させている。
【００１２】
ＲＡＩＤレベル５では、パリティがディスクアレイに分配される。これによりディスクを多重検索できる。また、ある決められた数のディスクをパリティ要求のためにシステムに付加しなければならないので、ＲＡＩＤアレイのサイズが大きくなるのが防止される。
【発明の開示】
【発明が解決しようとする課題】
【００１３】
ＲＡＩＤレベル４及び５を備えた従来のシステムはいくつかの問題がある。最初の問題は、システムが故障すると、各ストライプのパリティ情報がこのストライプ中の他のディスク上に保存されているデータブロックと調和しないということである。そのために全ＲＡＩＤアレイについてパリティを再び計算しなければならない。どのパリティブロックが正しくないのか判断する方法がないので、パリティはすべて再度計算される。したがって、ＲＡＩＤアレイにおけるすべてのパリティブロックは再び計算されなければならない。ＲＡＩＤアレイに保存されているすべてのデータを読む必要があるので、すべてのＲＡＩＤアレイについてパリティを再び計算することは多大な時間の浪費である。例えば、２ＧＢのディスクを最大速度で読んでも終了するのに１５分から２０分かかる。しかし、殆どのコンピュータは非常に多くのディスクを並行して最大速度で読み取ることはできないので、ＲＡＩＤアレイについてパリティを再度計算するのは多くの時間がかかる。
【００１４】
ＲＡＩＤアレイに関してパリティを再度計算するのに要する時間を軽減する一つの方法は、ＲＡＩＤアレイに即座にアクセスして、オンライン状態の間にシステムに対するパリティを再度計算できるようにすることである。しかし、この方法は２つの問題がある。最初の問題は、パリティを再計算する間、不一致パリティを有するブロックが更なる破壊から保護されていないということである。この間にＲＡＩＤアレイ中のディスクが壊れると、システム中のデータを永久的に失う。この従来技術の第２の問題は、パリティ計算中にＲＡＩＤサブシステムは満足に動作しないということである。これはパリティの再計算に必要な複数の入力／出力（Ｉ／Ｏ）処理により生ずる時間遅延によるものである。
【００１５】
従来のシステムの第２の問題点は、ディスクが機能していない間のＲＡＩＤアレイへの書き込みにある。ＲＡＩＤサブシステムはパリティ情報を用いて故障したディスク上のデータを再計算できるので、そのＲＡＩＤサブシステムはたとえディスクが故障していてもデータを依然として読み込むことができる。また、多くのＲＡＩＤシステムは、ディスクが故障していても書き込みが継続できる。これは、システムが故障した場合に、壊れたＲＡＩＤアレイに書き込むことにより、データを破壊することがあるので問題である。例えば、ＲＡＩＤアレイを使用するオペレーティング・システムがクラッシュしたり、又はシステムへの電力供給が断たれた場合に、システム故障が生じる。従来のＲＡＩＤサブシステムはこの一連の事象に対する保護機能を備えていない。
【課題を解決するための手段】
【００１６】
本発明は、不揮発性ランダムアクセスメモリ（ＮＶ−ＲＡＭ）を使用してディスクアレイをエラー補正する方法である。
不揮発性ＲＡＭはディスクエラーからＲＡＩＤを回復させる速度を早くするために使用される。これは、パリティが一致しないすべてのディスクブロックのリストを保持することにより達成される。ディスクブロックのそのようなリストはＲＡＩＤサブシステムにおけるパリティブロックの全体数よりも小さい。ＲＡＩＤサブシステムにおけるパリティブロックの全体数は通常数十万のパリティブロックの範囲にある。不一致のパリティブロック数の情報により、従来技術で可能であった時間よりもかなり短時間の間に、リスト中で確認された数のブロックを、修正することができる。本発明はまた同時に起こるシステムの故障と壊れたディスクに対する保護の方法と、一つの壊れたディスクを用いてＲＡＩＤサブシステムへの安全に書き込む方法を提供するものである。
【発明の効果】
【００１７】
本発明によれば、システムが故障した後にパリティを再計算するために必要な時間を低減し、故障しているディスクにデータが書き込まれ、かつ、そのシステムがクラッシュした場合、ＲＡＩＤアレイ中のデータが破壊されるのを防止することができる。
【発明を実施するための最良の形態】
【００１８】
不揮発性ランダムアクセスメモリ（ＮＶ−ＲＡＭ）を用いてディスクアレイのエラーを補正する方法と装置を説明する。以下の説明において、本発明をさらに詳細に説明するために、ディスクの数や性質、ディスクブロックのサイズ等のような数多くの特定の細部を詳細に説明する。しかし、当業者にとって、それらの詳しい細部の説明がなくても本発明が実施できることは明らかである。その他の実施例では、本発明が不必要に不明瞭にならないように、公知の特徴部分は詳細に説明しない。
【００１９】
特に、多くの実施例ではストライプ中の一つのブロックだけが更新された場合を考えているが、説明する技術は多数のブロックを更新する場合でも同様に適用できる。
【００２０】
本発明は、システムが故障した後にパリティを再計算するために必要な時間を低減し、故障しているディスクにデータが書き込まれ、かつ、そのシステムがクラッシュした場合、ＲＡＩＤアレイ中のデータが破壊されるのを防止する方法を提供する。本発明はこれらの問題を解消するために不揮発性ＲＡＭを使用している。従来技術の説明とその問題は以下の通りである。この従来技術の問題は、システムが故障したときのパリティ破壊、壊れたディスクに対する書き込みによるデータ破壊、及びシステムとディスクが同時に障害を受けたときのデータ破壊について説明されている。
【００２１】
<<ＲＡＩＤを用いた損失データの再計算>>
ストライプ中に保存されたデータブロックを排他的論理和演算することによりパリティが計算される。Ｎ個のデータブロックから計算されたパリティ値は、ストライプのパリティブロックに記録される。いずれかの一つのブロックからのデータが例えばディスク破壊によって損失されると、ディスクに関する損失したデータはストライプ中に残っているブロックを排他的論理和演算することにより再計算される。一般的に、ストライプ中のデータブロックが修正されると、パリティがストライプに対して再計算されなければならない。Ｎ個すべてのデータブロックを書き込むことによってストライプを更新する場合、ディスクからデータを読むことなく、パリティを計算でき、パリティとデータはたった一回のＩ／Ｏサイクルの間に書き込むことができる。したがって、ストライプ中のＮ個数のすべてのデータブロックに対して書き込むのに要する時間は、最小となる。一つのデータブロックをディスクに書き込む場合、減算によるパリティが使用される（後述する）。一回のＩ／Ｏサイクルを行うには古いデータとパリティを読み込む必要があり、第２のＩ／Ｏサイクルでは新たなデータとパリティを書き込む必要がある。ＲＡＩＤアレイ中のディスク駆動部は同期していないので、書き込みは一般に正確に同時に起こることがない。ある場合には、パリティブロックはディスクに最初に到達し、その他の場合にはデータブロックの一つがディスクに最初に到達する。ここで説明する技術はブロックがディスクに到達する順番とは無関係である。
【００２２】
非同期駆動部を有するディスクに関する別の択一例において、最初にパリティを計算し、ディスクに書き込んだ後、データブロックをディスクに書き込む。ＲＡＩＤアレイ中のディスク上の各データブロックは４ＫＢのデータを保存する。以下の説明では、各４ＫＢブロック中のデータを一つの大きな整数（６４Ｋビットの長さ）として扱う。したがって、図面では、パリティとデータディスクのブロックに保存された情報について整数値が示してある。図面を簡単にして、説明を目的とするだけのために、この習慣を使用するものである。
【００２３】
図３Ａは従来のＲＡＩＤレベル４のサブシステム（Ｎ＝３の場合）を示す図で、４つのディスク３３０ないし３３６を備えている。図において、ディスク３３０はパリティディスクである。ディスク３３２ないし３３６はデータディスクである。図は、ＲＡＩＤアレイ中のディスク３３０ないし３３６に含まれるストライプ３２０を示す。ディスクブロック３３０Ａは、整数値１２を含むパリティブロックである。ディスクブロック３３２Ａないし３３６Ａはそれぞれストライプ３２０のデータブロックである。データブロック３３２Ａないし３３６Ａはデータ値４、７、及び１をそれぞれ含む。一つのストライプ３２０中の各ブロック３３２Ａないし３３６Ａのデータが整数として表されている。ストライプ３２０のパリティはデータブロック３３２Ａないし３３６Ａに保存されているデータ値の合計を示す。パリティブロック３３０Ａは値１２（すなわち４＋７＋１）を含む。図３Ａは、パリティを用いたエラー補正方法の単なる一つの例を示す図である。パリティ値はデータブロック３３２Ａないし３３６Ａの排他的論理和演算であるが、数学的加算特性は排他的論理和関数のそれに一致する。したがって、図３Ａでは加算が使用されている。
【００２４】
図３Ｂは、図３Ａに示すストライプ３２０上での動作のタイミング図である。そのテーブルはパリティ、データ０、データ１及びデータ２の見出しを有する。その値１２、４、７、及び１は対応するテーブルの見出しの下に表されている。
【００２５】
図３Ｂは時刻ＴＢの時点での失われたデータブロックを有するストライプを示すテーブルである。図３Ｂに示すように、ストライプ３２０は、図３Ａのデータディスク３３４から失われたデータブロック１中の損失データを含む。これは、データ１の見出しの下で箱により囲まれた疑問符を用いてテーブル中に示してある。時刻ＴＢの時点で、パリティ、データ０、およびデータ２はそれぞれ値１２、４、１を有する。データブロック１用のディスク３３４上のデータは以下のようにして即座に再計算される。
データ１＝パリティ−データ−データ２＝１２−４−１＝７              （１）
ここでデータブロック１は、パリティブロック、データブロック０、及びデータブロック２を用いて計算される。したがって、図３Ａに示すディスク３３４のデータブロック１に保存されたデータ値７は時刻ＴＣの時点で再計算される。図３Ｂにおいて、時刻ＴＣに、データブロック１に関して再計算された値７が括弧に囲まれて示されている。以下の図面では、再計算された値は括弧を用いて示してある。すなわち、括弧内に示された値は、壊れたディスクのデータを意味し、パリティとその他のディスク上にあるデータにより再計算されたものである。
【００２６】
図３Ｂに示すように、壊れたディスク上のデータは、パリティディスクとディスクアレイ中に残りのディスクを用いて再計算できる。図３Ａに示す壊れたディスク３３４は最終的に置き換えられ、ディスクの古い内容は再計算されて新しいディスクに書き込まれる。図３Ｃは新しいデータ１に関するディスク３３８を含むＲＡＩＤサブシステムのブロック図である。図３Ｃに示すように、ストライプ３２０は、パリティ、データ０、新たなデータ１、及びデータ２に対して値１２、４、７、及び１を有する。これらの値はパリティブロック３３０Ａ、データブロック３３２Ａ、３３８Ａ、及び３３６Ａに保存される。したがって、新しいディスク３３８はＲＡＩＤシステムの壊れたディスク３３４に置き換わり、それまでディスク３３４のデータブロック３３４Ａに保存されていたデータ値は以上のようにして計算されて、置換ディスク３３８のデータブロック３３８Ａに保存される。
【００２７】
新たなデータがデータブロックに書き込まれると、パリティブロックも更新される。ストライプ中のすべてのデータブロックが一度に更新されると、パリティは以上のようにして簡単に計算される。このとき、パリティのための新たな値がディスクに書き込まれる情報から再計算される。新たなパリティとデータのブロックは次にディスクに書き込まれる。ストライプ中の一部のデータブロックだけが修正されると、パリティブロックの更新がさらに難しくなる。というのも、それは多くのＩ／Ｏ処理が必要となるからである。この場合、パリティを更新するには２つの方法がある。減算によるパリティの更新と、再計算によるパリティの更新である。
【００２８】
例えば、一つのデータブロックに書き込みが行われた場合、ＲＡＩＤシステムは減算によりパリティを更新できる。ＲＡＩＤシステムはパリティブロックと上書きされるブロックを読み取る。システムはまずパリティ値から古いデータ値を減算し、データブロックの新たなデータ値を中間のパリティ値に加算し、そして新たなパリティとデータのブロックを共にディスクに書き込む。
【００２９】
パリティを再計算するために、ＲＡＩＤシステムはまずストライプ中のその他のＮ−１個のデータブロックを読み込む。Ｎ−１個のデータブロックを読んだ後、ＲＡＩＤシステムは、修正されたデータブロックと、ディスクからのＮ−１個のデータブロックを用いて最初からパリティを再計算する。パリティが再計算されると、新たなパリティとデータのブロックがディスクに書き込まれる。
【００３０】
パリティを更新するための減算と再計算の方法はともに、１より多いデータブロックが同一ストライプに書き込まれる場合に一般化することができる。減算の場合、パリティブロックといま正に上書きされようとしているすべてのデータブロックの現在の内容とが、まずディスクから読み取られる。再計算において、いま正に上書きされることのないすべてのデータブロックの現在の内容はまずディスクから読み込まれる。ストライプ中のすべてのＮ個のデータブロックが同時に書き込まれるのは、再計算によるパリティを縮小（縮退）する場合である。書き込まれないすべてのデータブロックはまずディスクから読み込まれるが、本実施例ではそのようなブロックはない。
【００３１】
<<システムが故障した場合に何故ストライプが不一致になるか>>
不一致のストライプは、当該ストライプ中の他のブロックの排他的論理和とはならないパリティブロックを備えている。ストライプは、システムが故障したとき、更新に関する書き込みの幾つかは終了しているがその他が未だ終了していないという場合に不一致となる。例えば、最初のデータブロックが上書きされる場合である。上述のように、ストライプのパリティブロックは再計算されてデータブロックと共に上書きされる。データブロックの一つがディスクに書き込まれたがその他は未だ書き込まれていないという状況でシステムが故障すると、ストライプが不一致となる。
【００３２】
ストライプは、それが更新される場合にのみ不一致となり得る。したがって、いずれの場合も、潜在的な不一致のストライプ数は更新中のストライプ数に限られる。そのため、本発明は、ＮＶ−ＲＡＭ中に、現在更新中のすべてのストライプを含むリストを保持する。これらのストライプだけが潜在的に壊れることがあるので、システム故障後に、ＮＶ−ＲＡＭ中のリストに保存されているストライプだけに対して、パリティが再計算される。これにより、上述した時間のかかる従来方法に比べて、システム故障後のパリティ再計算に要する全体時間を大幅に低減できる。
【００３３】
<<従来技術におけるシステム故障の際のパリティ破壊>>
以下の図面において、故障したデータディスクに関して括弧内に示した値は、ディスクに保存されている実際の値ではない。むしろ、ＲＡＩＤアレイ中の壊れたディスクに関して、メモリに保持されている計算値である。
【００３４】
図４Ａはシステムクラッシュを示す図で、変更値は図３Ａのディスク３３０ないし３３６に書き込まれる。その図は、データブロックがパリティブロックよりも前にディスクに達する場合のものである。図４Ａに示すように、時間は下方に向かって増大する。時刻ＴＡにおいて、パリティブロックは１２、データブロック０から２は４、７、及び１の値をそれぞれ有する。時刻ＴＢにおいて、新たな値２がデータブロック０に書き込まれ（値２の回りの箱で示してある）、これにより時刻ＴＡにデータブロック０に保存されている値４が置き換えられる。データブロック１と２に保存されているその他の値は変更されない。通常に動作している状態では、従来の方法では時刻ＴＣの値１０（箱で示す）がパリティの見出しの下に示したパリティディスクに書き込まれる。これにより、時刻ＴＢにデータブロック０への書き込みに対するパリティブロックが更新される。時刻ＴＣにパリティに対する新たな値１０がデータブロック０ないし２の値２、７、及び１からそれぞれ計算される。したがって、図４Ａのタイミング図は、データブロックがパリティブロックよりも前にディスクに達する場合の従来のＲＡＩＤサブシステムを示している。
【００３５】
図４Ａにおける時刻ＴＢとＴＣとの間にシステム故障が発生すると、このストライプに関するパリティが壊れる。そのタイミング図は、ストライプに関して再計算されたパリティが更新される以前に、時刻ＴＢに新たなデータ値２がデータディスク０に書き込まれることを示す。したがって、ＲＡＩＤサブシステムがその後再スタートすると、パリティディスクは正しい値１０の代わりに古い値１２（アンダーラインで示す）を持つ。これは、システム故障が発生する前にストライプが更新されないことに起因する。ストライプに関するパリティは壊れている。何故ならば、
パリティ＝データ０＋データ１＋データ２＝２＋７＋１＝１０≠１２      （２）
だからである。
【００３６】
同様に、図４Ｂは別の従来の図を示し、これはシステムクラッシュを示し、変更値は図３Ａのディスク３３０ないし３３６に書き込まれる。その図は、データブロック以前にパリティブロックがディスクに到達する場合のものである。時刻ＴＡにおいて、パリティブロックは値１２、ディスクブロック０ないし２は４、７、及び１をそれぞれ有する。時刻ＴＢにおいて、新たな値１０（値１０の回りを箱で示す）がパリティブロックに書き込まれ、それにより時刻ＴＡにパリティブロックに保存されている値１２を置き換える。データブロック０ないし２に保存されているデータ値は変更されない。時刻ＴＢにおけるパリティの新たな値１０は、データブロック１と２の値７と１、及びデータブロック０の新たな値２から計算される。通常に動作している場合、従来技術では、新たなデータ値２は、データ０の見出しの下に示すように、データディスク０に時刻ＴＣの時点で書き込まれる。これにより時刻ＴＢにおけるパリティブロックへの書き込みにしたがってデータブロック０が更新される。したがって、図４Ａのタイミング図は従来のＲＡＩＤサブシステムを示し、そこではパリティブロックがデータブロック以前にディスクに到達する。
【００３７】
図４Ｂにおける時刻ＴＢとＴＣとの間にシステムが故障すると、ストライプに関してパリティが壊れる。そのタイミング図は、ストライプのデータブロック０が更新される前に、時刻ＴＢの時点で新たなパリティ値１０がパリティディスクに書き込まれることを示している。したがって、ＲＡＩＤサブシステムがその後に再スタートすると、データディスク０は正しい値２の代わりに古い値４（アンダーラインで示す）を持つ。これは、システム破壊が発生する前にストライプが更新されかったことによる。ストライプに関するパリティは今壊れている。何故ならば、
パリティ＝データ０＋データ１＋データ２＝４＋７＋１＝１２≠１０      （３）
だからである。
【００３８】
図４Ａないし４Ｂは、ＲＡＩＤアレイ中のディスク駆動部が同期していない場合の、新たなデータがデータブロックに書き込まれる場合とパリティディスクが更新される場合の２つの事例を示す。図４Ａに示す最初の事例は、新たなデータ値がデータディスクに最初に到達し、その後にパリティディスクのパリティ値が更新される場合を示す。図４Ｂに示す第２の事例は、パリティがディスクに最初に到達し、その後にデータが更新される場合を示す。図４Ａと４Ｂに関して、時刻ＴＢとＴＣとの間でシステムが故障すると、ファイルシステムの破壊が発生する。システムが図４Ａと４Ｂの時刻ＴＢ後に故障した場合、図示するパリティ値は当該システムに関して正しいものではない。図４Ａに示すシステムの場合、新たなデータ値は合計値１０を有し、これは値２、７、及び１の合計に等しい。しかし、時刻ＴＢにおけるパリティ値は値１２を示している。したがって、パリティディスクに保存されているパリティ値は、データディスク０ないし２に保存されているデータ値のための新たなパリティ値と等しくない。同様に、図４Ｂに示す第２のシステムについて時刻ＴＢ後に故障が発生すると、データディスク０ないし２はそれぞれ４、７、及び１の値を持つ。それらのデータブロックに関するパリティ値は１２に等しい。しかし、このシステムのパリティは、新たなデータ値がディスクに書き込まれる前に更新されるので、時刻ＴＢの時点でパリティディスクに保存されているパリティは１０に等しい。したがって、時刻ＴＢの後に、パリティディスクに保存されたパリティはデータブロックのためのパリティ値と等しくない。これは、新たなデータが、システム故障の前に更新されていなかったからである。
【００３９】
従来の方法では、システムが故障して、システムが再スタートするとすべてのストライプについてパリティが再計算される。すべてのストライプに関する故障後のパリティの再計算方法には徹底的な計算が必要で、そのために極めて遅い。本発明はシステムが故障した後にパリティを再計算する方法である。そのシステムは、不揮発性ＲＡＭの中に進行中の書き込み値を備えたストライプのリストを維持する。システムが故障した後に再スタートすると、不揮発性ＲＡＭに保存されている進行中の書き込み値を有するリストだけが再計算される。
【００４０】
<<従来技術における破壊ディスクへの書き込みによるデータ破壊>>
故障した又は壊れたディスクを有するＲＡＩＤアレイに書き込みを行うと、システム故障中にデータ破壊が発生する。図６は、パリティをディスクに書き込む前に新たなデータ値に関してデータディスクが更新された場合、システム故障が発生すると、故障したディスクに関するデータが破壊されることを表した従来の図である。図６において、データ１の見出しの下で括弧内に示すことにより、データディスク１が故障していることを表している。時刻ＴＡに、パリティディスクは値１２を有する。データディスク１が故障した時刻ＴＡ以前は、パリティディスクの値は、値４、７、及び１をそれぞれ有するデータディスク０ないし２の合計に等しい。時刻ＴＡにおけるデータブロック１の値７が括弧で囲まれている。この値はデータディスク１に保存されている値を表すものではなく、代わりに、以下のようにして、ストライプのパリティブロックとデータブロック０ないし２から計算されたものである。
データ１＝パリティ−データ０−データ２＝１２−４−１＝７            （４）
【００４１】
時刻ＴＢでは、新たな値２がデータディスク０に書き込まれる（箱内で２を囲んで示す）。時刻ＴＢの時点では、パリティはデータディスク０に書き込まれている新たな値２に対して更新されておらず、値１２を持つ。したがって、データブロック１に関して計算された値は７ではなく、９である。これは、時刻ＴＢにおけるデータディスク１に関して、括弧内の値９を囲んで図６に示されている。
【００４２】
時刻ＴＣの時点で通常に動作する場合、パリティブロックは、時刻ＴＢの時点でデータブロック０に書き込まれる値２によって、１０に更新される。時刻ＴＣでのパリティに対する新たな値１０は長方形の中に示してある。パリティ値１０について、データブロック１に関する正しい値７が括弧内に示してある。図６に示すように、データディスク１が壊れているので、データブロック１に保存されているデータはディスクアレイにおけるその他のブロックから計算される。時刻ＴＢでデータブロック０に対して最初に書き込んだ後は、データブロック１の計算値は正しくなくなっている。データブロック１に関する値９は、時刻ＴＣにおけるパリティに関する次の書き込みが終了するまでは不正確である。
【００４３】
時刻ＴＢとＴＣとの間でシステム破壊が発生すると、故障したディスク又は壊れたディスクを有するＲＡＩＤアレイに書き込むことにより、ストライプ中のデータが破壊される。従来の方法に関して図６に示すように、パリティは更新されず、そのために値１２を有する（アンダーラインで示す）。したがって、ストライプのデータブロック１に関する計算値は不正確で、ストライプは以下のようにして破壊される。
データ１＝パリティ−データ０−データ２＝１２−２−１＝９≠７        （５）
【００４４】
同様のデータ破壊は、データが到達する前にパリティがディスクに到達した場合に発生する。
【００４５】
<<システムとディスクの同時故障によるデータ破壊>>
ＲＡＩＤシステムは、停電によりシステム故障が発生した場合、ディスク破壊を経験する可能性が大いにある。一般に、停電後に発生する過渡電圧の急激な立ち上がりによってディスクはダメージを受ける。したがって、システムとディスクの同時故障によって、ストライプが壊れる可能性がある。
【００４６】
図９はシステムとディスクの同時故障を示す従来の図で、そこではパリティがディスクに書き込まれる前に、新たなデータ値に関してデータディスクが更新される。時刻ＴＡでは、パリティディスクは値１２、データディスク０ないし２はそれぞれ４、７、及び１を有する。時刻ＴＢでは、新たな値２がデータディスク０に書き込まれる（箱で示す）。時刻ＴＢの時点では、パリティは、データディスク０に書き込まれた新たな値２に関して更新されず、値１２を有する。時刻ＴＢとＴＣとの間でシステム破壊が発生すると、ディスク１の値は破壊される。これは、時刻ＴＢとＴＣとの間に、システムとディスク同時に故障することにより発生する。
【００４７】
時刻ＴＣでは、システム故障によりパリティは更新されず、したがって値１０ではなく、値１２を有する。また、データディスク１はディスク故障により壊れる。データブロック１に関する計算値９は正しくない。以下のように、破壊されたパリティ値を用いてデータディスク１に関し、不正確に計算される。
データ１＝パリティ−データ０−データ２＝１２−２−１＝９≠７        （７）
【００４８】
パリティがデータよりも前にディスクに到達する場合、データが同様に破壊される。
【００４９】
<<本発明の概要>>
図８はＲＡＩＤシステム用にＮＶ−ＲＡＭを用いてエラー補正する本発明を示す図で、このシステムは、ホストコンピュータ８１０、ＮＶ−ＲＡＭ８１６を有するＲＡＩＤコントローラ８１４、及びＮ＋１個のディスク８２０ないし８２６を備えている。ホストコンピュータ８１０は第１の通信チャンネル８１２によりＲＡＩＤコントローラ８１４に接続されている。ＲＡＩＤコントローラ８１４は、不一致状態になる可能性のあるＲＡＩＤアレイ８２８のストライプを保存するためにＮＶ−ＲＡＭ８１６を備えている。ＲＡＩＤコントローラ８１４は、第２の通信チャネル８１８によりＲＡＩＤアレイ８２８のＮ＋１個のディスク８２０ないし８２６に接続されている。ＲＡＩＤアレイ８２８はパリティディスク８２０とＮ個のデータディスク８２２ないし８２６をそれぞれ備えている。
【００５０】
ＮＶ−ＲＡＭ８１６は、潜在的に不一致となり得るパリティディスク８２０に保存されているすべてのパリティブロックのリストを維持することにより、システム故障後にＲＡＩＤを回復する速度を増すべく使用されている。一般的には、このブロックのリストは小さい。それは、ＲＡＩＤアレイ８２８中のパリティブロックの全体数に対して数オーダー小さくできる。例えば、ＲＡＩＤアレイ８２８は数十万のパリティブロックを有するのに対して、潜在的に不一致のブロックは僅か数百以下である。潜在的に不一致となる少数のパリティブロックを知ることにより、パリティの再計算が格段に容易になる。その理由は、それらのパリティブロックだけを再保存すればよいからである。
【００５１】
本発明は、システム故障によりデータを破壊することなく、ＮＶ−ＲＡＭ８１６を用いて壊れたディスクを含むＲＡＩＤアレイ８２８にデータを安全に書き込むことができる。破壊される可能性のあるデータは、破壊動作が始まる前にＮＶ−ＲＡＭ８１６にコピーされる。システム故障後、ＮＶ−ＲＡＭ８１６に保存されたデータを用いて、ＲＡＩＤアレイ８２８を矛盾ない状態に回復する。
【００５２】
図１１ＡないしＣは、本発明により実行されるステップを示すフロー図である。まず図１１Ａを参照すると、ブート処理が実行される。判定ブロック１１０１では、システムがちょうど故障したか否か判定される。判定ブロックで正しいと判断された場合には、システムはステップ１１０２に進み（図１１Ｂ）、回復処理を実行する。判定ブロックで誤りと判断された場合、システムは通常処理のためにステップ１１０３に進む（図１１Ｃ）。
【００５３】
図１１Ｂは、システム故障後の回復のフロー図を示す。判定ブロック１１０４では、不正ストライプのリストとして特定されたストライプがＮＶ−ＲＡＭ内に残っているか否か判定する。判定ブロック１１０４で誤りと判断された場合、システムはリターンステップに進む。判定ブロック１１０４で正しいと判定された場合、システムはステップ１１０５に進む。
【００５４】
ステップ１１０５では、ストライプ番号が得られる。ステップ１１０６では、パリティを再計算するために必要な特定ストライプのデータブロックが読み込まれる。ステップ１１０７では、このストライプに関してパリティが再計算される。ステップ１１０８では、このストライプに対して新たなパリティブロックが書き込まれる。次に、このシステムは判定ブロック１１０４に戻る。
【００５５】
通常の処理が図１１Ｃに示してある。ステップ１１０９では、ストライプを更新するために必要なすべてのブロックが読み込まれる。ステップ１１１０では、このストライプに関する新たなパリティが、新たなデータを使って計算される。ステップ１１１１では、そのストライプのストライプ番号が、ＮＶ−ＲＡＭ中の不正ストライプのリストに書き込まれる。ステップ１１１２では、ストライプを更新するために必要なディスクブロックがディスクに書き込まれる。ステップ１１１３では、ストライプ番号がＮＶ−ＲＡＭの不正ストライプのリストから除去される。
【００５６】
<<ＮＶ−ＲＡＭを用いたシステム故障に対するパリティ破壊>>
図５は、ＮＶ−ＲＡＭを用いてパリティ破壊を防止する本発明を示す図である。図１１ＡないしＣを参照してタイミング図を説明する。図５はシステム破壊を示す本発明のタイミング図で、変更する値は図３Ａのディスク３３０ないし３３６に書き込まれる。その図は、パリティが新たなデータについて計算され、そのデータがパリティブロックを更新する前にデータに書き込まれる場合のものである。時刻ＴＡの時点で、パリティブロックは値１２、データブロック０ないし２は値４、７、及び１をそれぞれ有する。ＴＡの時点で、本発明に関する図１１Ｃのステップ１１０９が実行され、ストライプを更新するのに必要なブロックがメモリに書き込まれる。そのシステムはステップ１１１０を実行し、そこでは新たなパリティ値が新たなデータ値に基づいて計算される。時刻ＴＢの時点では、図１１Ｃのステップ１１１１が実行され、そこでストライプ番号がＮＶ−ＲＡＭに書き込まれる。
【００５７】
時刻ＴＣでは、ステップ１１１２で、新たなデータ値２（値２を囲む箱で示す）がデータブロック０に書き込まれ、時刻ＴＢにデータブロック０に保存されている値４に置き換わる。データブロック１と２に保存されているその他の値は変更されない。最初に、システムが故障しない通常の場合を考える。本発明では、新たなパリティ値１０（パリティの見出しの下に箱で示す）が時刻ＴＤにステップ１１１２で書き込まれる。これにより、時刻ＴＣにおけるデータブロック０への書き込みに対するパリティブロックが更新される。時刻ＴＥには、ステップ１１１３で、ＮＶ−ＲＡＭのストライプ番号がクリアされる。したがって、パリティディスクとデータディスク０ないし２に関するブロックを有するストライプがそれぞれ１０、２、７、及び１を有する。
【００５８】
次に、時刻ｔＣとｔＤとの間（ステップ１１１１と１１１３との間）にシステムが故障した場合を考える。このシステムはリブートし、図１１Ａのスタート時点で実行開始される。
【００５９】
判定ブロック１１０１では、時刻ＴＤにおいて、システム故障が発生すると、判定ブロック１１０１は正しい（Ｙｅｓ）と判定する。ストライプは、パリティに対する値１２（アンダーラインで示す）とデータディスク０ないし２に対する値２、７、及び１をそれぞれ有する。図５に示すように、時刻ＴＣにおいて、システム故障後のパリティは壊れている。これは次の理由からである。
パリティ＝データ０＋データ１＋データ２＝２＋７＋１＝１０≠１２      （９）
【００６０】
しかしながら、ストライプは矛盾のない状態まで回復できる。ＮＶ−ＲＡＭは回復対象であるストライプを指摘でき、すなわち更新されるストライプのリストを有する。パリティ値以外のすべての値はディスク上のものを用いることができる。（“２”という値は時刻ＴＣにおいてディスクに書き込まれたものである）。ストライプに関するデータ値はディスクから読み取られ、新たなパリティ値１０が計算される。
パリティ＝データ０＋データ１＋データ２＝２＋７＋１＝１０          （１０）
【００６１】
したがって、新たに計算されたパリティ値１０は、時刻ＴＤにステップ１１０８でパリティディスクに書き込まれ、ストライプは最早壊れていない。
【００６２】
以下のものは図１１Ｃの処理を説明する疑似コードの例である。
（１）ストライプを更新するために必要なすべてのディスクブロックを読む。
（２）新たなパリティの内容を計算する。
（３）ＮＶ−ＲＡＭの不正ストライプリストに書き込まれるように、ストライプに対するストライプに番号（＃）を付す。
（４）ストライプを更新するのに必要な全てのディスクブロックを書き込む。
（５）直前に書き込まれたストライプに対する番号をＮＶ−ＲＡＭ不正ストライプリストから取り除く。
【００６３】
システムの故障後に、図１１Ｂのスタートアップ手続の一部を以下の疑似コードを用いて説明する。
（ＮＶ−ＲＡＭ不正ストライプリストで特定されたすべてのストライプ）に関して
｛
（１）ストライプ中にあるすべてのデータブロックを読み取る。
（２）ストライプのためのパリティブロックを再計算する。
（３）ストライプのための新たなパリティブロックを書き込む。
｝
こうして、本発明によれば、ＮＶ−ＲＡＭを使用することにより、システム破壊後にパリティが壊れるのを防止できる。
【００６４】
<<リストの代わりにビットマップを用いることによるパリティ破壊の検出>>
前節では、壊れる可能性のあるストライプのリストをＮＶ−ＲＡＭに保持しており、システムが壊れた後の再起動した際に、リストにあるストライプに対してのみ、パリティブロックを再計算する必要がある。本発明の別の実施例は、ＮＶ−ＲＡＭ中のビットマップを用いて、壊れる可能性のあるストライプを指摘し、このとき、システム破壊した場合にそのパリティブロックを再計算する必要がある。
【００６５】
この方法ではビットマップを使用し、そこでは各ビットが１またはそれ以上のストライプ群を示している。一般的なディスクアレイは２５０，０００のストライプを備えている。ビットマップの各入力が一つのストライプを示す場合、そのビットマップは約３２ＫＢである。隣接する３２個のストライプ群を各ビットを用いて示すことにより、その容量を１ＫＢに縮小できる。
【００６６】
システム故障後にあっては、どのストライプがパリティ再計算を必要とするかを判断するために、リストに代わってビットマップを使用しているという点を除いて、この方法は“ストライプのリスト”と本質的に同一である。ビットマップ中にビットが設定されている群のすべてのストライプに対して、それらのパリティが再計算される。
【００６７】
通常処理中にビットマップを管理するのは、リストを管理するのと少し異なる。更新が完了するやいなやビットマップにおけるストライプのエントリ（ビット）を消去するのは最早不可能である。一つのビットは一以上のストライプの動作を指示することがあるからである。あるストライプの更新は行われるかもしれないが、同一ビットを共有する別のストライプは依然として動作中（アクティブ）であるかもしれない。
【００６８】
代わりに、ストライプを更新する直前に、ストライプのための適当なビットが設定されるが、更新が完了した後でも消去されない。ビットマップが大量のエントリを蓄積している場合、周期的に、不一致のストライプがないことを保証するために、すべてのブロックをディスクに記録した後、全ビットマップが消去される。以下の疑似コードはこれを実施する。
（１）ストライプを更新するために必要なすべてのブロックを読み込む。
（２）新たなパリティの内容を計算する。
（３）更新されるストライプに対するビットマップのエントリを設定する。
（４）ストライプの更新に必要なすべてのディスクブロックを書き込む。
（５）ビットマップが満杯の場合、すべてのブロックがディスクに到達するまで待機し、すべてのビットマップを消去する。
【００６９】
システム故障の際、ビットマップを用いる場合、リストを用いた場合よりも、より多くのブロックを再計算する必要があるが、システム内のすべてのストライプに関してパリティを再計算するのに比べると、依然として相当に時間を節約することができる。一般的なＲＡＩＤシステムは２５０，０００のストライプを有し、壊れる可能性のあるストライプがビットマップ内に２，５００あったとしても、それはシステム内のストライプの僅か１％に過ぎない。
【００７０】
ビットマップ法は書き込み−キャッシュディスクを用いると特に有益である。これは、停電時にデータがディスクに到達するのを保証するものではない。そのようなディスクは、実際にデータを書き込む前の所定時間、ＲＡＭにデータを保持することができる。これは、ストライプ更新段階が終了した後でも、パリティ破壊の可能性があることを意味する。たとえストライプがリストから除かれても、ストライプのパリティは依然として破壊される可能性があるので、リスト法は動作しない。
【００７１】
したがって、ビットマップ法を使用し、ビットマップがクリアされると同時に内部キャッシュを書き込むように各ディスクに指示すると、書き込み−キャッシュディスクドライブと組み合わせて本発明を動作させることができる。
【００７２】
<<ＮＶ−ＲＡＭを用いて壊れたディスクへ書き込む際のデータ破壊>>
本発明は、壊れたディスクからのデータを不揮発性ＲＡＭ内に保存することにより、破壊ディスクへの書き込み時におけるデータ破壊に対する問題を解消する。図７Ａは、故障したディスクからデータをＮＶ−ＲＡＭ内に保存することにより、データ破壊を防止する本発明のタイミング図である。図１１ＡないしＣを参照して図を説明する。図７Ａにおいて、パリティが更新される前にデータがディスクに書き込まれる。時刻ＴＡにおいて、壊れたデータディスク１は、括弧内に示した値７を有するように表示されている。括弧内の値７は、データディスク１が故障し、このディスクに対する再計算された値であることを示している。この値は、パリティディスクに保存されている値１２から、データディスク０と２の値４と１を減算することにより計算される。ステップ１１０９では、ストライプが時刻ＴＡにＲＡＩＤアレイから読み込まれる。ＮＶ−ＲＡＭは消去される。これは図７ＡにおいてＮＶ−ＲＡＭに関する見出しの下の疑問符で示してある。
【００７３】
時刻ＴＢの時点で、故障したデータディスク１の値７はステップ１１０９にしたがってＮＶ−ＲＡＭに書き込まれる。ＮＶ−ＲＡＭに書き込まれるデータディスク１に対する値７は、図７Ａ中の長方形箱を用いて示されている。次に、システムは図１１Ｃのステップ１１１０において、このストライプの新しいパリティ値を計算する。
【００７４】
時刻ＴＣでは、データディスク０の新しい値２（箱で示す）が、ステップ１１１２にしたがって、このストライプのパリティが更新される前に、ディスクに書き込まれる。したがって、時刻ＴＣには、データディスク１の値は９で、括弧内に示されている。システムが故障していない通常の場合、新たなパリティ値１０が時刻ＴＤにディスクに書き込まれ、ディスク１の再計算された正しい値が７になる。時刻ＴＣとＴＤとの間にシステム故障が発生すると、パリティの新たな値は、時刻ＴＣにデータディスク０に書き込まれる値２に関してＮＶ−ＲＡＭを用いて正しく更新される。
【００７５】
ステップ１１０６にしたがって、ＮＶ−ＲＡＭに保存されているすべての機能しているデータディスクに関する値を最初に読み取って、時刻ＴＤにパリティが正しく更新され、その値の計算は以下の通りである。
パリティ＝データ０＋ＮＶ−ＲＡＭ＋データ２＝２＋７＋１＝１０      （１２）
【００７６】
こうして、システムが故障した後に本発明が再スタートすると、パリティに関して正しい値１０が計算される。ステップ１１０８では、値１０が時刻ＴＤにパリティディスクに書き込まれ、計算された値Ｄ１を正しい値７に戻す。時刻ＴＥにおいて、ＮＶ−ＲＡＭはステップ１１１３でクリアされる。したがって、本発明によれば、ＮＶ−ＲＡＭを使用することによって、ディスクが故障したときに、システム故障によってデータが破壊されるのを防止できる。
【００７７】
図７Ｂは、データが更新される前にパリティがディスクに書き込まれる場合に、データを故障したディスクからＮＶ−ＲＡＭ内に保存することによりデータ破壊を防止する本発明のタイミング図である。時刻ＴＡにおいて、壊れたデータディスク１が、括弧内に示した値７を有するように示してある。この値は図７Ａを参照して上述のように計算される。ステップ１１０９では、時刻ＴＡにおいてストライプがＲＡＩＤアレイから読み込まれる。ＮＶ−ＲＡＭがクリアされ、それはＮＶ−ＲＡＭの見出しの下の疑問符で示してある。
【００７８】
時刻ＴＢにおいて、故障したデータディスク１の値７がステップ１１０９にしたがってＮＶ−ＲＡＭに書き込まれる。ＮＶ−ＲＡＭに書き込まれるデータディスク１の値７は図７Ｂで長方形箱により示してある。次に、システムは、図１１のステップ１１１０でストライプに関するパリティの新たな値を計算する。
【００７９】
時刻ＴＣでは、データブロック０を更新する前に、パリティの新たな値１０（箱で示す）が、ステップ１１０８でパリティディスクに書き込まれる。したがって、時刻ＴＣにおいて、データディスク１の値は５で、括弧内に示してある。時刻ＴＣとＴＤとの間でシステム故障が発生した場合、新たなパリティ値がＮＶ−ＲＡＭを用いてパリティディスクについて正しく更新される。判定ブロック１１０１では、システムが再起動した後、システム故障が発生したか否か判定する。そして、本実施例では判定ブロックでは正しい（Ｙｅｓ）に戻り、ステップ１１０４を継続する。
【００８０】
以下のように、パリティは時刻ＴＤにその値を再計算して正しく更新される。
パリティ＝壊れたディスクのＮＶ−ＲＡＭ（７）
＋壊れていないディスクのディスク上のデータ
＝４＋７＋１＝１２                                        （１３）
【００８１】
したがって、図７Ａないし７Ｂに示すように、システムがまさにストライプに書き込みを実施しようとするとき、故障したデータディスク１に関する値を不揮発性ＲＡＭ内に保存する。次に、データディスク０（パリティ）の新たな値をディスクに書き込む。新たな値を時刻ＴＣにディスク０（パリティディスク）に書き込んだ後にシステム破壊が発生すると、データディスク１の値が破壊される。システム故障後、新たなパリティ値（データディスク０）は、データディスク１のために計算された値５の代わりに、ＮＶ−ＲＡＭに保存されている値７を用いて計算される。パリティの値（データディスク０）は次にディスクに書き込まれる。これが完了すると、ＮＶ−ＲＡＭは消去される。
【００８２】
<<ＮＶ−ＲＡＭを用いたシステムとディスクの同時破壊>>
本発明は、ストライプブロックをＮＶ−ＲＡＭ内に保存することにより、システムとディスクの破壊が同時に発生したときの、パリティとデータの破壊に関する問題を解消する。ＮＶ−ＲＡＭを使用することにより、システム中の複数のブロック（以下の例では、データブロック０と１）を更新している間に、システム故障が発生した場合、システムを矛盾のない状態に回復できる。これらのデータブロックを変更すれば、このストライプのパリティも更新することが必要となる。本発明では、このため、ディスクから読み取られる任意のブロックを常にＮＶ−ＲＡＭ内に保存する（データブロック０を更新する前に、任意のブロックをＮＶ−ＲＡＭに書き込む）。したがって、ストライプ情報はＮＶ−ＲＡＭに保存されているデータから再計算できる。本発明は、そのために減算によるパリティと再計算によるパリティを用いる２つの解決法を提供するものである。
【００８３】
減算によるパリティでは、パリティブロックとデータブロックを含むデータは、それを更新する前にディスクから読み取られる。図１０Ａは、ストライプのブロックをＮＶ−ＲＡＭ内に保存することにより、パリティとデータの破壊を防止するための、本発明にかかるタイミング図である。図１１ＡないしＣを参照して図面を説明する。図１０Ａにおいて、パリティが更新される前にデータはディスクに書き込まれる。時刻ＴＡでは、パリティブロックとデータブロック０がＲＡＩＤアレイから読み込まれる。ＮＶ−ＲＡＭは消去される。これは、図１０Ａにおいて、ＮＶ−ＲＡＭ用の見出しの下の疑問符で示してある。
【００８４】
時刻ＴＢにおいて、パリティブロックとデータブロック０は、ディスクから読み込まれるときに、ＮＶ−ＲＡＭに書き込まれる。ＮＶ−ＲＡＭに書き込まれるパリティブロックとデータブロック０は、図１０Ａにおいて長方形の箱で示してある。システムは次にデータブロック０の値２に対する新たなパリティ値を計算する。
【００８５】
時刻ＴＣにおいて、データディスク０の新たな値２（箱で示す）は、ストライプのパリティを更新する前に、ディスクに書き込まれる。時刻ＴＣとＴＤとの間にシステム故障が発生すると、ＲＡＩＤアレイ中のディスクが故障し、本発明は壊れたディスクの３つの場合、パリティディスク、データディスク０、及びデータディスク１（又は２）について解決策を提供する。判定ブロック１１０１では、システム破壊が発生したか否か判定する。本実施例では、判定ブロックは正しい（Ｙｅｓ）に戻り、ステップ１１０４で継続される。パリティが減算により計算される場合、システム破壊により３つのディスクが壊れた事例について、それぞれ図１０Ａないし１０Ｃに示す。
【００８６】
図１０Ａの時刻ＴＤにおいて、時刻ＴＣとＴＤとの間で、システム故障によってパリティディスクが壊れる。この場合、何も行われない。いかなるデータも失われず、パリティディスクにはいかなる情報も書き込まれることがない。
【００８７】
図１０Ｂを参照すると、時刻ＴＤにおいて、時刻ＴＣとＴＤとの間のシステム故障によりデータディスク０が破壊される。この場合のパリティを再計算する一般式は、次の通りである。
パリティ＝“壊れたディスクのＮＶ−ＲＡＭ”
＋“壊れていないすべてのディスクのディスク上の値”
本実施例では、それは次のようになる。
パリティ＝ＮＶ（データ０）＋データ１＋データ２＝４＋７＋１＝１２
【００８８】
その結果、壊れたディスクに関するＮＶ−ＲＡＭ内に保存された値を、壊れたディスクに再保存するために、パリティが更新される。この特別な例では、パリティの新たな値は古い値に調和することがある。データ０の他にその他のデータブロックが更新され、しかもシステム破壊の前にそれらの一つがディスクに到達した場合、新たなパリティ値は古いものと一致することがない。
【００８９】
図１０Ｃを参照すると、時刻ＴＤにおいて、時刻ＴＣとＴＤとの間のシステム破壊によりデータディスク１が破壊される。この場合は、ステップ１１１４でＮＶ−ＲＡＭからパリティとデータディスク０の値を読み込み、それらをディスク（箱で示す）に書き込むことで処理される。したがって、データディスク０に対する変換は上書きされるが、ストライプは矛盾のない状態に戻る。データディスク１は、その値を括弧で囲うことにより、時刻ＴＤとＴＥにおいて破壊されたものとして示されている。そして、破壊されたデータディスク１の値は、以下のように、時刻ＴＤの時点で７に正しく計算される。
データ１＝ＮＶ（パリティ）−ＮＶ（データ０）−データ２
＝１２−４−１＝７                                        （１４）
ここで、ＮＶ（パリティ）とＮＶ（データ０）は、ＮＶ−ＲＡＭに保存されているパリティとデータブロック０の値である。時刻ＴＥには、ＮＶ−ＲＡＭがクリアされる。したがって、図１０Ｃにおいて、時刻ＴＣとＴＤとの間のシステム破壊後にデータディスク１（壊れたディスク２も同様に処理される）が故障しても、ストライプは本発明によって矛盾のない状態に保たれる。
【００９０】
この場合、以下のようにして、壊れたディスクの古い内容を最初に計算することにより処理できる。
Ｄ１計算値＝ＮＶパリティ  
−“更新されるディスクのＮＶ値”
−“更新されないデータディスクのディスク上の値”
【００９１】
新たなパリティ値は以下の式から計算される。
パリティ＝“上述のステップから得たＤ１計算値”
＋“壊れていないすべてのデータディスクに関するディスク上の値”
【００９２】
<<再計算によるパリティを用いたときのシステムとディスクが同時破壊>>
再計算によるパリティにおいて、更新されていないデータブロックはまずディスクから読み取られた後、まさに書き込まれようとしている新たなデータと組み合わせた値に基づいてパリティが再計算される。多数のデータブロックが一度に更新される場合に、これは一般に使用される。何故ならば、それらの場合に、減算によるパリティよりも一層効率的だからである。簡単にするために、本実施例では、一つのブロックだけを更新する。示されている方法は任意の数のブロックを更新する場合に適用される。
【００９３】
図１２Ａないし１２Ｃは再計算によるパリティのタイミング図である。時刻ＴＡ、ＴＢ、及びＴＣに関して、それらはすべて一致している。
【００９４】
時刻ＴＡにおいて、ステップ１１０９では、ブロックＤ１とＤ２がディスクから読み込まれる。ステップ１１１０において、システムは、ディスク１と２からちょうど読み込まれたデータと共にディスク０に関する新たなデータに基づいて新たなパリティを計算する。
【００９５】
時刻ＴＢにおいて、ステップ１１１１では、ブロックＤ１とＤ２が、それらが属するストライプを指定しながらＮＶ−ＲＡＭに書き込まれる。
【００９６】
時刻ＴＣにおいて、ステップ１１１２の間、新たな値“２”がディスク０に書き込まれる。通常の場合、パリティブロックはまたステップ１１１２の際中に書き込まれ、破壊されることはない。
【００９７】
本実施例では、ディスク故障との組み合わさったシステム故障がある。システムが故障した後にシステムがリブートすると、ステップ１１０１で処理が開始される。故障があるので、判定ブロックは正しい（Ｙｅｓ）に戻り、ステップ１１０２で続けられ、ＮＶ−ＲＡＭの内容に基づいてＲＡＩＤサブシステムを回復するために必要なステップを実行する。
【００９８】
図１２Ａは、パリティディスクが壊れた場合を示す。この場合、何も行われる必要がない。データディスクは壊れていないので、データが失われる可能性はない。
【００９９】
図１２Ｂは、更新すべきディスクが壊れた場合を示す。なお、時刻ＴＤにおいて、ディスク０に関して計算された値は正しくない。一般に、複数のブロックが更新されると、ＮＶ−ＲＡＭ内の情報は、失われたデータブロックを再生する上で十分ではない。これは、再計算によるパリティを用いる場合、ＮＶ−ＲＡＭに呼び出されるデータは、更新されないデータであるためである。壊れたディスク上のデータはどこにも保存されていない。
【０１００】
この場合、本発明では、壊れたディスクの内容をゼロに設定する新たなパリティ値を計算する。そのための一般式は次の通りである。
パリティ＝壊れていないディスクの合計
また、この実施例では、それは以下の通りである。
パリティ＝Ｄ１＋Ｄ２＝７＋１＝８
【０１０１】
時刻ＴＥに新たなパリティ値が書き込まれ、また時刻ＴＥにＤ１とＤ２に関するＮＶ−ＲＡＭ値がクリアされる。
【０１０２】
新たなデータを古いデータと同じ場所に書き込む従来のファイルシステムでは、データブロックをゼロ化することは行われない。しかし、ＷＡＦＬによれば、これは常に新たなデータをディスク上の不使用位置に書き込むものであり、書き込まれるブロックをゼロ化することは問題ない。何故ならば、ブロックの内容はファイルシステムの一部ではないからである。
【０１０３】
図１２Ｃは、更新されないディスクが壊れた場合を示す。なお、時刻ＴＤにおいて、ディスク１の計算値は正しくない。パリティを再計算する式は以下の通りである。
パリティ＝“壊れたディスクのＮＶ−ＲＡＭ値”
＋“壊れていないディスクに関するディスク上の値”
【０１０４】
本実施例では、それは次の通りである。
パリティ＝ＮＶ（Ｄ１）＋Ｄ０＋Ｄ２＝７＋２＋１＝１０
【０１０５】
時刻ＴＥに新たなパリティ値が書き込まれ、また時刻ＴＦにＤ１とＤ２に関するＮＶ−ＲＡＭ値がクリアされる。
【０１０６】
このようにして、不揮発性ランダムアクセスメモリ（ＲＡＭ）を用いたディスクアレイに関するエラー補正の方法と装置が開示されている。
【図面の簡単な説明】
【０１０７】
【図１】図１は従来のＲＡＩＤレベル４サブシステムのブロック図である。
【図２】図２は従来のＲＡＩＤレベル５サブシステムのブロック図である。
【図３Ａ】図３Ａは“ストライプ”に保存されたデータの再計算を表示する従来の図である。
【図３Ｂ】図３Ｂは“ストライプ”に保存されたデータの再計算を表示する従来の図である。
【図３Ｃ】図３Ｃは“ストライプ”に保存されたデータの再計算を表示する従来の図である。
【図４Ａ】図４Ａはシステム故障の際のパリティ破壊に対する従来のタイミング図である。
【図４Ｂ】図４Ｂはシステム故障の際のパリティ破壊に対する従来のタイミング図である。
【図５】図５は故障したディスクへの書き込みが発生したときにデータが破壊されるのを防止する本発明のタイミング図である。
【図６】図６は壊れたディスクによる書き込み上のディスク破壊を示すタイミング図である。
【図７Ａ】図７Ａは壊れたディスクによる書き込み上のデータ破壊を防止する本発明のタイミング図である。
【図７Ｂ】図７Ｂは壊れたディスクによる書き込み上のデータ破壊を防止する本発明のタイミング図である。
【図８】図８は本発明を示す図である。
【図９】図９はシステムとディスクが同時に故障することによりデータが破壊されるのを示すタイミング図である。
【図１０Ａ】図１０Ａはシステムとディスクが同時に故障することによりデータが破壊されるのを防止する本発明のタイミング図である。
【図１０Ｂ】図１０Ｂはシステムとディスクが同時に故障することによりデータが破壊されるのを防止する本発明のタイミング図である。
【図１０Ｃ】図１０Ｃはシステムとディスクが同時に故障することによりデータが破壊されるのを防止する本発明のタイミング図である。
【図１１Ａ】図１１Ａは回復処理を示す本発明のフロー図である。
【図１１Ｂ】図１１Ｂは回復処理を示す本発明のフロー図である。
【図１１Ｃ】図１１Ｃは回復処理を示す本発明のフロー図である。
【図１２Ａ】図１２Ａは再計算によるパリティのタイミング図である。
【図１２Ｂ】図１２Ｂは再計算によるパリティのタイミング図である。
【図１２Ｃ】図１２Ｃは再計算によるパリティのタイミング図である。
【符号の説明】
【０１０８】
８１０：ホストコンピュータ、８１４：ＲＡＩＤコントローラ、８１６：ＮＶ−ＲＡＭ、８１２：第１の通信チャンネル、８１８：第２の通信チャネル、８２０〜８２６：ディスク、８２８：ＲＡＩＤアレイ。
【図１】
2008251034.tif 000003
【図２】
2008251034.tif 000004
【図３Ａ】
2008251034.tif 000005
【図３Ｂ】
2008251034.tif 000006
【図３Ｃ】
2008251034.tif 000007
【図４Ａ】
2008251034.tif 000008
【図４Ｂ】
2008251034.tif 000009
【図５】
2008251034.tif 000010
【図６】
2008251034.tif 000011
【図７Ａ】
2008251034.tif 000012
【図７Ｂ】
2008251034.tif 000013
【図８】
2008251034.tif 000014
【図９】
2008251034.tif 000015
【図１０Ａ】
2008251034.tif 000016
【図１０Ｂ】
2008251034.tif 000017
【図１０Ｃ】
2008251034.tif 000018
【図１１Ａ】
2008251034.tif 000019
【図１１Ｂ】
2008251034.tif 000020
【図１１Ｃ】
2008251034.tif 000021
【図１２Ａ】
2008251034.tif 000022
【図１２Ｂ】
2008251034.tif 000023
【図１２Ｃ】
2008251034.tif 000024