以下、実施の形態について図面を参照して詳細に説明する。
〔第1の実施の形態〕
図1は、第1の実施の形態に係るストレージシステムの構成例を示す図である。図1に示すストレージシステム1は、ストレージ制御装置10と、複数の記憶装置21〜28とを含む。記憶装置21〜28は、HDD、SSD(Solid State Drive)などの不揮発性記憶装置である。また、ストレージ制御装置10には、ホスト装置30が接続されている。
ストレージ制御装置10は、記憶装置21〜28に対するデータアクセス処理を制御する装置である。例えば、ストレージ制御装置10は、ホスト装置30からのI/O要求に応じて、所定の記憶装置にアクセスする。このストレージ制御装置10は、アクセス制御部11と、復旧制御部12とを備える。なお、アクセス制御部11および復旧制御部12の処理は、例えば、ストレージ制御装置10が備えるCPU(Central Processing Unit)が所定のプログラムを実行することで実現される。
アクセス制御部11は、記憶装置21〜28へのアクセス処理を、それぞれ複数の記憶装置の記憶領域によって構成される論理記憶領域ごとに管理する。本実施の形態では例として、記憶装置21〜24のそれぞれの記憶領域によって構成される第1の論理記憶領域(以下、「RLU#1」と呼ぶ。RLU:RAID Logical Unit)と、記憶装置25〜28のそれぞれの記憶領域によって構成される第2の論理記憶領域(以下、「RLU#2」と呼ぶ)とが設定されているものとする。
アクセス制御部11は、RLU#1を、パリティを用いてデータが冗長化されるとともに、パリティが複数の記憶装置に分散して配置されるように管理する。例えば、アクセス制御部11は、RLU#1を、RAID−5またはRAID−6によって管理する。同様に、アクセス制御部11は、RLU#2を、パリティを用いてデータが冗長化されるとともに、パリティが複数の記憶装置に分散して配置されるように管理する。
復旧制御部12は、論理記憶領域を構成する記憶装置が故障したとき、次のような処理を実行する。ここでは例として、RLU#1の一部を構成する記憶装置24が故障した場合について説明する。
復旧制御部12は、RLU#1の一部を構成する記憶装置24が故障したことを検出したとき(ステップS1)、RLU#1のデータのうち故障した記憶装置24に記録されていたデータを生成して、生成したデータ(以下、「RLU#1のリビルドデータ」と呼ぶ)を、RLU#2のうちパリティが記録されていたパリティ領域に格納する(ステップS2)。前述のように、RLU#2では、パリティが記憶装置25〜28に分散して配置されている。このため、RLU#1のリビルドデータは、記憶装置25〜28に分散して格納される。
上記のステップS2の処理により、RLU#1におけるデータの冗長性を回復させることができる。一方、RLU#2では、RLU#2の記憶領域が記憶装置単位で切り離されることがなく、RLU#2の記憶領域のうちパリティ領域のみが、RLU#2の記憶領域として使用できない状態になる。これにより、RLU#2の記憶領域にはパリティ領域以外のデータがそのまま残ることになるので、データの再構築や再配置などを行うことなく、RLU#2に記録されたデータを容易に利用できる。
このように、RLU#2におけるデータの再構築や再配置を行う必要がなくなることから、記憶装置24が故障した際の処理の負荷が軽減される。従って、記憶装置24が故障した際の処理が、ホスト装置30からのI/O要求に応じたアクセス制御部11のアクセス処理に与える影響を少なくすることができ、ホスト装置30からのI/O要求に応じたアクセス処理速度が著しく低下しないようにすることができる。
また、復旧制御部12は、RLU#1のリビルドデータをRLU#2のパリティ領域に格納した際に、アクセス制御部11に、RLU#1,#2を次のように管理させることができる。
復旧制御部12は、アクセス制御部11に、故障した記憶装置24の記憶領域の代わりにRLU#2のパリティ領域をRLU#1に組み込み、データの冗長度を維持した状態でRLU#1の管理を続行させる。これにより、アクセス制御部11は、一部のデータの書き込み先の位置や読み出し元の位置が変わること以外、記憶装置24の故障前と同様の処理によってRLU#1に対するデータアクセス処理を制御できる。また、アクセス制御部11がデータの冗長度を維持したままRLU#1の管理を続行できるようになるまでの期間において、記憶装置21〜23ではデータの再配置が行われない。このため、この期間におけるストレージ制御装置10の処理負荷が軽減され、ホスト装置30からのI/O要求に応じたアクセス処理速度が著しく低下しないようにすることができる。
これとともに、復旧制御部12は、アクセス制御部11に、RLU#2からパリティ領域を切り離し、データの冗長度を低下させた状態でRLU#2の管理を続行させる。すなわち、アクセス制御部11は、RLU#2のRAIDレベルを変更して、RLU#2の管理を続行する。前述のように、RLU#2の記憶領域にはパリティ領域以外のデータがそのまま残っているので、ストレージ制御装置10は、RLU#2でのデータの再構築や再配置を行うことなく、RLU#2に対するデータアクセス処理を継続することができる。
また、RLU#2の記憶領域にはパリティ領域以外のデータがそのまま残っていることから、ホスト装置30から読み出しを要求されたRLU#2内のデータを、データの計算を行うことなく、記憶装置25〜28のいずれかから読み出すことができる。このため、ホスト装置30からの要求に応じてRLU#2からのデータ読み出し速度を低下させないようにすることもできる。
〔第2の実施の形態〕
図2は、第2の実施の形態に係るストレージシステムの全体構成例を示す図である。図2に示すストレージシステム100は、CE(Controller Enclosure)200と、DE(Drive Enclosure)300とを含む。また、CE200には、ホスト装置400が接続されている。
CE200は、CM(Controller Module)201,202を備える。CM201,202のそれぞれは、ホスト装置400からの要求に応じて、DE300内の記憶装置に対するデータの読み書きを行う。CM201,202は、DE300内の記憶装置によって実現される物理記憶領域をRAIDによって管理し、これらの物理記憶領域に対するアクセスを制御する。
なお、CM201,202は、例えばルータなどを介して互いに接続されていてもよい。また、CMは、CE200内に1つのみ設けられてもよいし、3つ以上設けられてもよい。ただし、CMが複数設けられることで、DE300に対するアクセス制御系統が冗長化され、アクセス制御処理の信頼性が向上する。
DE300は、CM201,202からのアクセス制御対象となる複数の記憶装置を備える。本実施の形態において、DE300は、記憶装置としてHDDを備えるディスクアレイ装置である。なお、DE300が備える記憶装置としては、SSDなどの他の種類の不揮発性記憶装置を使用することもできる。また、CE200には、複数のDE300が接続されていてもよい。
ホスト装置400は、ユーザの操作に応じて、CM201,202に対して、DE300内のHDDへのアクセスを要求する。ホスト装置400は、例えば、ユーザの操作に応じて、CM201,202のいずれかを通じて、DE300内のHDDからのデータの読み出しや、DE300内のHDDに対するデータの書き込みを行うことができる。
なお、CE200内のCM201,202は、ともに同様の構成を有し、同様の処理を実行可能である。そこで、以下、CM201についてのみ説明し、CM202についての説明を省略する。
図3は、CMのハードウェア構成例を示す図である。
CM201は、CPU211によって装置全体が制御されている。CPU211には、RAM(Random Access Memory)212および複数の周辺機器が、バス217を介して接続されている。RAM212は、CM201の主記憶装置として使用され、CPU211に実行させるプログラムの少なくとも一部や、このプログラムによる処理に必要な各種データを一時的に記憶する。
CPU211には、周辺機器の例として、SSD213、入力I/F(インタフェース)214、CA(Channel Adapter)215およびDI(Drive Interface)216が接続されている。
SSD213は、CM201の二次記憶装置として使用され、CPU211によって実行されるプログラムやその実行に必要な各種のデータなどを記憶する。なお、二次記憶装置としては、例えば、HDDなどの他の種類の不揮発性記憶装置が使用されてもよい。
入力I/F214には、操作キーなどを備える入力装置214aが接続されている。入力I/F214は、入力装置214aに対する操作入力に応じた信号をCPU211に出力する。
CA215は、ホスト装置400とCM201との間でデータを送受信するインタフェース処理を実行する。CA215とホスト装置400とは、例えば、FC(Fibre Channel)規格に従って通信する。
DI216は、DE300とCM201との間でデータを送受信するインタフェース処理を実行する。DI216とDE300とは、例えば、SAS(Serial Attached SCSI,SCSI:Small Computer System Interface)規格に従って通信する。
図4は、CMの処理機能の構成例を示すブロック図である。
CM201は、アクセス制御部220および復旧制御部230を備える。アクセス制御部220および復旧制御部230の処理は、例えば、CM201のCPU211が所定のプログラムを実行することで実現される。また、CM201の記憶装置には、RAID管理テーブル240が記憶される。RAID管理テーブル240は、例えばSSD213に記憶される。
アクセス制御部220は、ホスト装置400からのI/O要求に応じて、DE300内のHDDにアクセスする。アクセス制御部220は、例えば、ホスト装置400からデータの読み出し要求を受けたとき、要求されたデータをDE300内の所定のHDDから読み出して、ホスト装置400に送信する。一方、アクセス制御部220は、ホスト装置400からデータの書き込み要求を受けたとき、ホスト装置400から受信した書き込み対象のデータを、DE300内の所定のHDDに書き込む。
また、アクセス制御部220は、RAID管理テーブル240に設定された情報に基づいて、DE300内のHDDに記録するデータをRAIDによって管理する。アクセス制御部220は、RLUごとに記録データを所定のRAIDレベルによって管理する。RLUは、DE300に搭載された複数のHDDの物理記憶領域を組み合わせて構成される論理記憶領域であり、RAIDグループとも呼ばれる。アクセス制御部220は、例えば、各RLUを、RAID−0,5,6を用いて管理することが可能である。
RAID管理テーブル240は、RLUごとに、RLUの識別番号、適用されるRAIDレベル、RLUに属するHDDを示す情報、RLUの制御状態を示す情報などを保持する。アクセス制御部220は、RAID管理テーブル240を参照することで、例えば、データを記録する際の記録先のHDDや、その記録の際に用いるRAIDレベルなどを判定する。
また、アクセス制御部220は、DE300内のHDDにおける故障の発生を検出した場合には、故障が発生したことを、故障したHDDを識別する情報とともに復旧制御部230に通知する。さらに、アクセス制御部220は、復旧制御部230からの要求に応じて、DE300内のHDDにアクセスする場合もある。例えば、アクセス制御部220は、復旧制御部230からの要求に応じて、故障したHDDのデータを再構築して別のHDDに格納するリビルド処理や、故障したHDDが交換されたときに、リビルド処理によって記録されたデータを交換されたHDDに書き戻すコピーバック処理などを実行する。
復旧制御部230は、アクセス制御部220によってDE300内のHDDの故障が検出された場合に、リビルド処理をアクセス制御部220に実行させる。後述するように、復旧制御部230は、リビルド処理におけるデータの格納先として、ホットスペア(Hot Spare)のHDDの他、故障したHDDが属するRLU以外のRLUの記憶領域のうちのパリティの記憶領域を選択することができる。リビルド処理におけるデータの格納先を他のRLUにおけるパリティの記憶領域とした場合には、データの再配置を行うことなくRAIDレベルが変更される。復旧制御部230は、リビルド処理やコピーバック処理、RAIDレベルの変更処理などを、RAID管理テーブル240の情報を更新することで制御する。
ここで、リビルド処理おけるデータの格納先を他のRLUのパリティ領域とする場合の処理例について説明する。本実施の形態では、RAID−6で運用されているRLUに属する2つのHDDが故障した場合に、故障したHDDのうち1つのHDDに記録されていたデータを再構築して、RAID−6で運用されている他のRLUにおけるパリティ領域に格納する。これにより、故障したHDDが属していたRLUと、他のRLUにおけるデータがパリティ領域に格納されたRLUとを、ともにRAID−5によって暫定的に運用できるようにする。
さらに、復旧制御部230は、故障したHDDが交換されると、故障したHDDが属するRLUと、リビルド処理におけるデータの格納先とされた他のRLUとを、HDDの故障が発生する前の状態に戻す処理を実行する。
なお、以下の説明では、HDDを識別するディスク番号を「DISK#xx」と記述し、ディスク番号が「DISK#xx」であるHDDを、単に「DISK#xx」と呼ぶ。さらに、RLUを識別するRLU番号を「RLU#yy」と記述し、RLU番号が「RLU#yy」であるRLUを、単に「RLU#yy」と呼ぶ。
図5は、第2の実施の形態におけるHDDの故障時の処理例を示す図である。
図5における「状態1」は、RLU#00およびRLU#01がともに正常に運用されている状態を示す。RLU#00は、DISK#00〜#04の物理記憶領域によって構成され、RAID−6によって管理される。RLU#01は、DISK#10〜#14の物理記憶領域によって構成され、RAID−6によって管理される。
また、RLU#00には、データD0〜D(n−1)、PパリティP0〜P(m−1)およびQパリティQ0〜Q(m−1)が格納されているものとする(ただし、n,mはともに1以上の整数)。一方、RLU#01には、データD’0〜D’(n−1)、PパリティP’0〜P’(m−1)およびQパリティQ’0〜Q’(m−1)が格納されているものとする。
データD0〜D(n−1)は、ホスト装置400からRLU#00に対して書き込みを要求されたデータを一定長に分割したデータブロックである。また、データD’0〜D’(n−1)は、ホスト装置400からRLU#01に対して書き込みを要求されたデータを一定長に分割したデータブロックである。
PパリティP0〜P(m−1),P’0〜P’(m−1)と、QパリティQ0〜Q(m−1),QパリティQ’0〜Q’(m−1)とは、それぞれ異なる計算方法で得られるパリティである。例えば、図5において、PパリティP0は、データD0〜D2の排他的論理和として計算される一方、QパリティQ0は、データD0〜D2に対して重み付けした値の排他的論理和として計算される。
なお、RLU#00に記録される最大ブロック数nと、RLU#01に記録される最大ブロック数nとは、同じ値でなくてもよい。また、RLU#00におけるPパリティ、Qパリティそれぞれの最大パリティ数m(すなわち、最大ストライプ数)と、RLU#01におけるPパリティ、Qパリティそれぞれの最大パリティ数m(すなわち、最大ストライプ数)も、同じ値でなくてもよい。ただし、次の「状態2」に示す処理を実行可能にするためには、RLU#00における最大パリティ数mは、RLU#01における最大パリティ数m以上である必要がある。
ここで、RLU#01に属するDISK#13,#14が故障したものとする。DISK#13,#14が故障すると、RLU#01においてデータの冗長性が失われる。復旧制御部230は、データが3重に冗長化された(すなわち、RAID−6で管理された)他のRLU(ここでは例としてRLU#00)を選択し、選択したRLUと、HDDが故障したRLUとを結合する。ここで言う「RLUの結合」とは、HDDが故障したRLUの物理記憶領域に、故障したHDDの代わりに、正常状態である他のRLUのパリティ領域を組み込むことを示す。これにより、復旧制御部230は、各RLUをデータが2重に冗長化されたRAID−5によって暫定的に運用できるようにする。
RLU#01に属するDISK#13,#14が故障すると、復旧制御部230は、図5の「状態2」に示すように、他方のRLU#00におけるPパリティまたはQパリティの記憶領域をデータの格納先として、RLU#01のリビルド処理をアクセス制御部220に開始させる。図5の例では、復旧制御部230は、DISK#13に記録されていたデータを再構築し、再構築したデータ(以下、「リビルドデータ」と呼ぶ)をRLU#00におけるQパリティの記憶領域に格納するように、アクセス制御部220に要求する。
例えば、アクセス制御部220は、データD’0〜D’2を基に、DISK#13に記録されていたPパリティP’0を計算によって再構築し、再構築したPパリティP’0を、RLU#00におけるQパリティQ0の記憶領域に上書きする。また、アクセス制御部220は、データD’4,D’5およびPパリティP’1を基に、DISK#13に記録されていたデータQ’1を計算によって再構築し、再構築したデータQ’1を、RLU#00におけるQパリティQ1の記憶領域に上書きする。
RLU#01のリビルド処理が終了すると、復旧制御部230は、図5の「状態3」に示すように、RLU#00,#01を結合状態にする。すなわち、復旧制御部230は、故障したDISK#13,#14をRLU#01から切り離す。さらに、復旧制御部230は、RLU#00における、RLU#01のリビルドデータが格納されたQパリティ領域を、RLU#00から切り離し、切り離したQパリティ領域をRLU#01に組み込む。
これにより、RLU#01を構成する物理記憶領域は、図5中の太線で示す領域となる。復旧制御部230は、アクセス制御部220に、RLU#00のQパリティ領域を組み込んだRLU#01を、RAID−5相当の管理方法で暫定的に運用させる。これとともに、復旧制御部230は、アクセス制御部220に、Qパリティ領域を除くRLU#00の領域を、RAID−5相当の管理方法で暫定的に運用させる。
以上のようなリビルド処理およびRLUの結合処理により、HDDが2台故障したRLU#01については、データの冗長度を2重冗長状態に回復させることができる。また、RLU#01のリビルド先としてRAID−6で管理されていたRLU#00が選択されることで、RLU#00は、データの冗長度が低下するものの、データの冗長性を持つ状態に保たれる。従って、RLU#00,#01の全体としては、データの冗長性を持つ状態に保つことができる。
図6は、第2の実施の形態におけるHDDの交換時の処理例を示す図である。
DISK#13,#14が新たなHDDに交換されると、図6の「状態4」に示すように、RLU#01についてのコピーバック処理が実行される。復旧制御部230は、アクセス制御部220に、RLU#00のQパリティ領域に記録されたデータを、交換されたDISK#13にコピーさせる。アクセス制御部220は、RLU#00のQパリティ領域からデータを読み出し、DISK#13における、その読み出し元と同じストライプ番号の位置に、読み出したデータを書き込む。
コピーバック処理が終了すると、復旧制御部230は、RLU#00,#01を結合状態から分離状態に遷移させる。この処理では、復旧制御部230は、交換されたディスク#13,#14をRLU#01に組み込むとともに、RLU#00のQパリティ領域をRLU#01から切り離す。また、復旧制御部230は、RLU#00のQパリティ領域をRLU#00に組み込み直す。
図6の「状態5」は、RLUが分離された状態を示し、復旧制御部230は、この状態からさらに、RLU#00,#01の各RAIDレベルをRAID−6に戻すためのデータ復元処理を実行させる。復旧制御部230は、アクセス制御部220に、RLU#00におけるQパリティを再計算し、Qパリティ領域に上書きするように要求する。アクセス制御部220は、例えば、DISK#00〜#02に格納されたデータD0〜D2を用いてQパリティQ0を再計算し、DISK#04におけるデータD0〜D2と同じストライプ番号の位置に上書きする。
これとともに、復旧制御部230は、アクセス制御部220に、RLU#01のデータのうちDISK#14に格納するデータを再構築させ、DISK#14に格納させる。アクセス制御部220は、例えば、データD’0〜D’2を基にQパリティQ’0を再計算し、DISK#14におけるデータD’0〜D’2と同じストライプ番号の位置に格納する。また、アクセス制御部220は、データD’0,D’2およびPパリティP’1(またはQパリティQ’1)を基にデータD’0を再構築し、DISK#14におけるデータD’4,D’5と同じストライプ番号の位置に格納する。
なお、図6の「状態5」では、データが復元される位置を点線で表している。
データの復元処理が完了すると、復旧制御部230は、図6の「状態6」に示すように、RLU#00,#01の各RAIDレベルをともにRAID−6に変更し、RLU#00,#01を図5の「状態1」と同様の正常状態に復帰させる。
ここで、2台のHDDが故障した場合の処理の参考例を示す。図7は、HDD故障時およびHDD交換時における処理の参考例を示す図である。
図7の「状態11」は、前述の図5の「状態1」から、DISK#13,#14が故障した状態を示す。図7では参考例として、この「状態11」から、DISK#00〜#03を用いてRLU#00をRAID−5で運用するとともに、DISK#04,#10〜#12を用いてRLU#01をRAID−5で運用する処理を示す。この場合、まず、RLU#00,#01の両方におけるリビルド処理が実行される。
RLU#00では、データブロックとPパリティとが、DISK#00〜#03において再配置される。そして、図7の「状態12」に示すように、DISK#04がRLU#00から切り離され、RLU#00は、DISK#00〜#03の記憶領域を用いてRAID−5によって運用される。
また、RLU#01からは、故障したDISK#13,#14が切り離され、RLU#00から切り離されたDISK#04が、RLU#01に組み込まれる。RLU#01では、DISK#10〜#12に格納されていたデータを基に不足分のデータブロック(例えばデータD’3)およびPパリティ(例えばPパリティP’0)が再構築される。そして、再構築されたデータブロックおよびPパリティが、DISK#04,#10〜#12に再配置される。データの再配置が完了すると、図7の「状態12」に示すように、RLU#01はRAID−5によって運用される。
この後、DISK#13,#14が新たなHDDに交換されると、RLU#00,#01の両方におけるデータ復元処理が実行される。「状態12」においてDISK#04,#10〜#12に再配置されたRLU#01のデータは、一旦RAM212に読み出され、読み出されたデータはDISK#10〜#14に再配置される。さらに、RLU#01におけるQパリティが再計算され、DISK#10〜#14のQパリティ領域に格納される。このようなRLU#01におけるデータ復元処理が終了すると、図7の「状態13」に示すように、RLU#01は、図5の「状態1」のように、DISK#10〜#14を用いてRAID−6によって運用される。
また、「状態12」においてDISK#00〜#03に再配置されたRLU#00のデータは、一旦RAM212に読み出され、読み出されたデータはDISK#00〜#04に再配置される。さらに、RLU#00におけるQパリティが再計算され、DISK#00〜#04のQパリティ領域に格納される。このようなRLU#00におけるデータ復元処理が終了すると、図7の「状態13」に示すように、RLU#00は、図5の「状態1」のように、DISK#00〜#04を用いてRAID−6によって運用される。
ここで、図5,図6に示した本実施の形態の処理と、図7に示した処理とを比較する。
図7の処理では、状態11から状態12に遷移する過程で、DISK#00〜#04,#10〜#12のすべてにおいてデータの再配置が行われる。これに対して、図5における状態1から状態3まで遷移する過程では、DISK#00〜#04,#10〜#12の記憶領域のうち、RLU#00のQパリティ領域においてデータの上書きが実行されるのみであり、それ以外の領域ではデータの書き込みが一切行われない。
このため、DISK#13,#14の故障が発生してから、RLU#00,#01がともにRAID−5による暫定運用を開始するまでの期間では、図5の処理の方がDISK#00〜#04,#10〜#12におけるデータの書き込み頻度が明らかに少ない。従って、図5の処理の方が、上記期間におけるCM201のCPU211の処理負荷が低くなる。このため、ホスト装置400からのI/O要求に応じたHDDへのアクセス処理に対してリビルド処理が与える影響が小さくなり、I/O要求に対する応答速度が著しく低下することを抑制できる。
また、状態3におけるRLU#00の領域は、状態1と比較してQパリティ領域が切り離されただけの状態となる。このため、状態3において、ホスト装置400からのI/O要求に応じたRLU#00へのアクセス処理手順を、状態1でのアクセス処理手順から大きく変えないようにすることができる。例えば、状態3において、ホスト装置400から、RLU#00からの読み出しが要求された場合、アクセス制御部220は、状態1とまったく同じ処理手順で要求されたデータを読み出す。また、状態3において、ホスト装置400からRLU#00に対する書き込みが要求された場合、アクセス制御部220は、Qパリティの計算および記録を行わないこと以外、状態1と同じ処理手順でデータを書き込む。
さらに、図7の処理では、状態12から状態13に遷移する過程でも、DISK#00〜#04,#10〜#12のすべてにおいてデータの再配置が行われる。これに対して、図5の状態3から図6の状態6に遷移する過程では、DISK#00〜#04の記憶領域のうちRLU#00のQパリティ領域に記録されていたデータが、交換されたDISK#14にコピーされるのみであり、それ以外のデータの再配置は行われない。
このため、DISK#13,#14を交換してから、RLU#00,#01がともにRAID−6による運用を再開するまでの期間でも、図5,図6の処理の方がDISK#00〜#04,#10〜#12におけるデータのアクセス頻度が明らかに少ない。従って、図5,図6の処理の方が、上記期間におけるCM201のCPU211の処理負荷が低くなり、ホスト装置400からのI/O要求に応じたHDDへのアクセス処理に対して、RLU#00,#01が元の状態に復帰するための処理が与える影響が小さくなる。
なお、図7の状態12のように、RLU#00をDISK#00〜#03で構成するとともに、RLU#01をDISK#04,#10,#11で構成する場合には、RLU#00におけるデータの再配置を行わずに、RLU#00をRAID−5で暫定運用することもできる。しかしながら、この場合には、RAID−5で暫定運用されたRLU#00に対してホスト装置400からデータの読み出し要求があったとき、一部のデータについてはデータ再構築のための計算が必要になり、読み出し要求に対する応答速度が低下する可能性がある。これに対して、図5の状態3では、RLU#00の領域には、ホスト装置400からの読み出し要求対象となるデータブロックがすべて記憶されている。このため、データの読み出し要求を受けたときにデータを再構築する必要がなくなり、読み出し要求に対する応答速度の低下を防止できる。
なお、上記の図5,図6では、DISK#13,#14が故障した際に、RAID−6で運用されている他のRLUのパリティ領域に対してリビルドデータを格納した。しかしながら、他の例として、RAID−4またはRAID−5で運用されている他のRLUのパリティ領域に対してリビルドデータを格納してもよい。この場合、パリティ領域にRLU#01のリビルドデータが格納されたRLUは、RAID−1によって運用が継続される。
次に、図8は、RAID管理テーブルに登録される情報の例を示す図である。
RAID管理テーブル240には、RLUごとにレコード241が登録される。各レコード241には、RLUを識別する「RLU番号」が登録される。また、各レコード241には、「ディスク番号」、「RAIDレベル」、「ストライプ数」、「Pパリティ状態」、「Pパリティ退避元RLU番号」、「Qパリティ状態」、「Qパリティ退避元RLU番号」、「RAID状態」および「重要度」が登録される。
「ディスク番号」は、RLUを構成する物理記憶領域が属するHDDの識別番号である。RLUは、複数のHDDの物理記憶領域によって構成されるので、「ディスク番号」は、それらの複数のHDDのそれぞれについて登録される。さらに、「ディスク番号」によって識別されるHDDのそれぞれには、「ディスク状態」、「退避先RLU番号」および「退避先パリティ識別」が登録される。
「ディスク状態」は、対応するHDDの動作状態を示す。「ディスク状態」には、「正常」、「故障」、「リビルド中」、「退避中」および「コピーバック中」のいずれかが設定される。「正常」は、対応するHDDが正常に動作していることを示し、「故障」は、対応するHDDが故障していることを示す。「リビルド中」は、故障したHDDのRLU領域に記録されていたデータのリビルド処理を実行中であることを示す。「退避中」は、リビルド処理が完了し、故障したHDDに記録されていたデータがすべて他のRLUのパリティ領域に格納されている状態を示す。「コピーバック中」は、交換されたHDDに対して他のRLUのパリティ領域からリビルドデータを書き戻す処理を実行中であることを示す。
「退避先RLU番号」および「退避先パリティ識別」は、同じレコード241内の「ディスク状態」の欄に「リビルド中」または「退避中」が設定されている場合にのみ、情報が登録される。「退避先RLU番号」は、リビルドデータの格納先として決定された他のRLUの識別番号を示す。「退避先パリティ識別」は、他のRLUにおけるリビルドデータの格納領域が、他のRLUにおけるPパリティとQパリティのどちらの領域かを示す。
「RAIDレベル」は、対応するRLUの通常運用時におけるRAIDレベルを示す。
「ストライプ数」は、対応するRLUを構成する各HDDに記録される最大のストライプ数を示す。
「Pパリティ状態」は、「RAIDレベル」にRAID−4,5,6のいずれかが設定されている場合に、Pパリティ領域がどのように使用されているかの状態を示す。「Pパリティ状態」には、対応するRLUにおけるデータブロックに基づくPパリティが格納されている「通常状態」と、他のRLUのリビルドデータが格納されている「退避データ格納中」とのいずれかが設定される。
「Pパリティ退避元RLU番号」は、「Pパリティ状態」に「退避データ格納中」が設定されている場合に、Pパリティ領域に格納されたリビルドデータが属している他のRLUの識別番号を示す。
「Qパリティ状態」は、「RAIDレベル」にRAID−6が設定されている場合に、Qパリティ領域がどのように使用されているかの状態を示す。「Qパリティ状態」には、対応するRLUにおけるデータブロックに基づくQパリティが格納されている「通常状態」と、他のRLUのリビルドデータが格納されている「退避データ格納中」とのいずれかが設定される。
「Qパリティ退避元RLU番号」は、「Qパリティ状態」に「退避データ格納中」が設定されている場合に、Qパリティ領域に格納されたリビルドデータが属している他のRLUの識別番号を示す。
「RAID状態」は、対応するRLUの状態を示す。「RAID状態」には、「2パリティ使用可」、「1パリティ使用可」、「非冗長状態」、「他のRLUからのリビルド中」、「他のRLUへのコピーバック中」、「他のRLUへリビルド中」、「他のRLUへ退避中」、「他のRLUからのコピーバック中」および「アクセス禁止」のいずれかが設定される。
「2パリティ使用可」は、「RAIDレベル」にRAID−6が設定されているのみ設定され得る。「2パリティ使用可」は、Pパリティ領域とQパリティ領域の両方が通常状態(すなわち、他のRLUのリビルドデータの退避先として使用されていない状態)であることを示す。「1パリティ使用可」は、「RAIDレベル」にRAID−4,5,6が設定されている場合に設定され得る。「1パリティ使用可」は、Pパリティ領域またはQパリティのいずれかが通常状態であることを示す。「非冗長状態」は、データの冗長性がない状態を示す。
「他のRLUからのリビルド中」は、Pパリティ領域とQパリティ領域の少なくとも一方に対して、他のRLUのリビルドデータの格納処理が実行中であることを示す。「他のRLUへのコピーバック中」は、Pパリティ領域とQパリティ領域の少なくとも一方に格納された他のRLUのリビルドデータを、元のRLUに対して書き戻す処理が実行中であることを示す。
「他のRLUへのリビルド中」は、他のRLUのパリティ領域をデータの格納先としたリビルド処理を実行中であることを示す。「他のRLUへ退避中」は、リビルド処理が完了し、他のRLUのパリティ領域にリビルドデータが格納された状態を示す。「他のRLUからのコピーバック中」は、他のRLUのパリティ領域に格納されたリビルドデータを、交換後のHDDに書き戻す処理を実行中であることを示す。
「アクセス禁止」は、対応するRLUに対するホスト装置400からのアクセスを禁止した状態(RLUの運用が停止された状態)を示す。
「重要度」は、対応するRLUに付与された重要度を示す。
図9は、RLUに属する2つのHDDが故障した場合の処理手順の例を示すフローチャートである。
[ステップS11]アクセス制御部220は、同一RLUに属する2台のHDDが故障したことを検出すると、故障したHDDのディスク番号と、それらのHDDが属するRLUのRLU番号とを復旧制御部230に通知する。
以下、例として、RLU#01に属するDISK#13,#14が故障したものとして説明を続ける。復旧制御部230は、RAID管理テーブル240におけるRLU#01に対応するレコード241において、DISK#13,#14にそれぞれ対応付けられた「ディスク状態」を、「正常」から「故障」に更新する。また、復旧制御部230は、RLU#01に対応するレコード241の「RAID状態」を、「2パリティ使用可」から「非冗長状態」に更新する。
[ステップS12]復旧制御部230は、使用可能なホットスペアディスクがDE300内にあるかを判定する。復旧制御部230は、使用可能なホットスペアディスクがある場合(S12:Yes)にはステップS13の処理を実行する一方、使用可能なホットスペアディスクがない場合(S12:No)にはステップS14の処理を実行する。
[ステップS13]復旧制御部230は、故障したDISK#13に記録されていたRLU#01のデータを再構築し、得られたリビルドデータを、使用可能なホットスペアディスクに対して書き込むように、アクセス制御部220を制御する。アクセス制御部220によるリビルドデータの格納が完了すると、復旧制御部230は、RLU#01からDISK#13,#14を切り離すとともに、ホットスペアディスクをRLU#01に組み込む。復旧制御部230は、アクセス制御部220に、RAID−5によってRLU#01の運用を続行させる。
[ステップS14]復旧制御部230は、RAID管理テーブル240のレコード241のうち、HDDが故障したRLU#01以外のRLUに対応するレコード241を参照して、リビルドデータの格納先とするRLUを探索する。
まず、復旧制御部230は、RAID−6で正常に運用継続中(すなわち、Pパリティ領域およびQパリティ領域が通常状態)であり、かつ、RLU#01に付与された重要度と同一またはそれ以下の重要度が付与されたRLUを探索する。具体的には、復旧制御部230は、RAID管理テーブル240から、「ストライプ数」に設定された値がRLU#01のストライプ数以上であり、かつ、「RAIDレベル」にRAID−6が設定され、かつ、「RAID状態」に「2パリティ使用可」が設定され、かつ、「重要度」に、RLU#01に付与された重要度以下の値が設定されたレコード241を抽出する。復旧制御部230は、抽出したレコード241のうち、「重要度」に設定された値が最も低いレコード241に対応するRLUを、リビルドデータの格納先に決定する。
[ステップS15]復旧制御部230は、ステップS14で条件に合致するRLUがあった場合(S15:Yes)には、ステップS18の処理を実行する一方、ステップS14で条件に合致するRLUがなかった場合(S15:No)には、ステップS16の処理を実行する。
[ステップS16]復旧制御部230は、RAID−4またはRAID−5で正常に運用継続中(すなわち、Pパリティ領域が通常状態)であり、かつ、RLU#01に付与された重要度より低い重要度が付与されたRLUを探索する。具体的には、復旧制御部230は、RAID管理テーブル240から、「ストライプ数」に設定された値がRLU#01のストライプ数以下であり、かつ、「RAIDレベル」にRAID−4またはRAID−5が設定され、かつ、「RAID状態」に「1パリティ使用可」が設定され、かつ、「重要度」に、RLU#01に付与された重要度より低い値が設定されたレコード241を抽出する。復旧制御部230は、抽出したレコード241のうち、「重要度」に設定された値が最も低いレコード241に対応するRLUを、リビルドデータの格納先に決定する。
[ステップS17]復旧制御部230は、ステップS16で条件に合致するRLUがあった場合(S17:Yes)には、ステップS18の処理を実行する。一方、復旧制御部230は、ステップS16で条件に合致するRLUがなかった場合(S17:No)には、RLU#01についてのリビルド処理の実行を断念する。この場合、RLU#01については、データの冗長性がない状態のまま、ホスト装置400からの要求に応じたアクセスが行われる。
[ステップS18]以下、ステップS15またはステップS17において、リビルドデータの格納先としてRLU#00が決定されたものとして、説明を続ける。
復旧制御部230は、RLU#01に対応するレコード241の「RAID状態」を、「非冗長状態」から「他のRLUへリビルド中」に更新する。また、復旧制御部230は、同じレコード241内のDISK#13に対応付けられた欄において、「ディスク状態」を「リビルド中」に更新するとともに、「退避先RLU番号」にRLU#00を、「退避先パリティ識別」にQパリティをそれぞれ登録する。
また、リビルドデータの格納先としてRAID−6のRLU#00が選択された場合(S15:Yes)には、復旧制御部230は次のようなテーブル設定処理を行う。復旧制御部230は、RLU#00に対応するレコード241において、「RAID状態」を「2パリティ使用可」から「他のRLUからのリビルド中」に、「Qパリティ状態」を「通常状態」から「退避データ格納中」にそれぞれ更新する。また、復旧制御部230は、同じレコード241の「Qパリティ退避元RLU番号」に「RLU#01」を登録する。
一方、リビルドデータの格納先としてRAID−4またはRAID−5のRLU#00が選択された場合(S17:Yes)には、復旧制御部230は次のようなテーブル設定処理を行う。復旧制御部230は、RLU#00に対応するレコード241において、「RAID状態」を「1パリティ使用可」から「他のRLUからのリビルド中」に、「Pパリティ状態」を「通常状態」から「退避データ格納中」にそれぞれ更新する。また、復旧制御部230は、同じレコード241の「Pパリティ退避元RLU番号」に「RLU#01」を登録する。
以上のテーブル設定処理が終了すると、復旧制御部230は、故障したDISK#13に記録されていたRLU#00のデータを再構築し、得られたリビルドデータをRLU#00のパリティ領域に書き込むように、アクセス制御部220に要求する。リビルドデータの格納先としてRAID−6のRLU#00が選択された場合(S15:Yes)には、リビルドデータはRLU#00のQパリティ領域に書き込まれる。一方、リビルドデータの格納先としてRAID−4またはRAID−5のRLU#00が選択された場合(S17:Yes)には、リビルドデータはRLU#00のPパリティ領域に書き込まれる。
[ステップS19]アクセス制御部220によるリビルドデータの書き込みが完了すると、復旧制御部230は、次のようなテーブル設定処理を行うことで、RLU#00とRLU#01とを結合状態にするとともに、それぞれのRAIDレベルを変更する。
復旧制御部230は、RLU#01のレコード241の「RAID状態」を「他のRLUへ退避中」に更新するとともに、同じレコード241内のDISK#13に対応付けられた「ディスク状態」を「退避中」に更新する。
また、リビルドデータの格納先としてRAID−6のRLU#00が選択された場合(S15:Yes)には、復旧制御部230は、RLU#00に対応するレコード241の「RAID状態」を「1パリティ使用可」に更新する。一方、リビルドデータの格納先としてRAID−4またはRAID−5のRLU#00が選択された場合(S17:Yes)には、復旧制御部230は、RLU#00に対応するレコード241の「RAID状態」を「非冗長状態」に更新する。
以上のテーブル設定処理により、RLU#00における1種類のパリティ領域がRLU#00から切り離されるとともに、切り離されたパリティ領域がRLU#01に組み込まれる。これにより、RLU同士が結合状態になるとともに、各RLUのRAIDレベルが実質的に変更される。
アクセス制御部220は、RLU#01のレコード241において、「RAIDレベル」にRAID−6が設定され、かつ、「RAID状態」が「他のRLUに退避中」に更新されたとき、RLU#01をRAID−5で制御する。
また、アクセス制御部220は、RLU#00のレコード241において、「RAIDレベル」にRAID−6が設定され、かつ、「RAID状態」が「1パリティ使用可」に更新されたとき、RLU#00をRAID−5で制御する。一方、アクセス制御部220は、RLU#00のレコード241において、「RAIDレベル」にRAID−4またはRAID−5が設定され、かつ、「RAID状態」が「非冗長状態」に更新されたとき、RLU#00をRAID−1で制御する。
なお、以上の図9の処理において、ステップS14では、RLU#01のリビルドデータの格納先として、RLU#01と同等の重要度かそれより低い重要度が付与されたRLUを選択した。これにより、RLU#01より重要度が高いRLUにおけるデータの冗長度を低下させないようにすることができる。
また、ステップS16では、RLU#01のリビルドデータの格納先として、RLU#01より低い重要度が付与されたRLUを選択した。これにより、RLU#01と同等以上の重要度が付与されたRLUにおいて、データの冗長性が失われる事態を回避できる。
すなわち、これらのステップS14,S16の処理により、重要度が高いRLUほどデータの安全性を高めることができる。
ここで、図10は、結合状態とされたRLUに対するI/O要求が発行されたときの処理手順の例を示すフローチャートである。この図10では例として、RLU#00と結合状態とされたRLU#01に対して、ホスト装置400から読み出しが要求された場合の処理手順を示す。なお、この図10の処理は、データブロックごとに実行される。
[ステップS31]アクセス制御部220は、ホスト装置400から、RLU#01内のデータブロックに対する読み出し要求を受信する。
[ステップS32]アクセス制御部220は、読み出しを要求されたデータブロックが、初期状態でRLU#00に属していたHDD(DISK#10〜#14)のうち、故障したHDD(DISK#13またはDISK#14)に記録されているかを判定する。アクセス制御部220は、データブロックが故障したHDDに記録されている場合(S32:Yes)には、ステップS34の処理を実行する。一方、アクセス制御部220は、データブロックが故障していないHDD(DISK#10〜#12のいずれか)に記録されている場合(S32:No)には、ステップS33の処理を実行する。
[ステップS33]アクセス制御部220は、読み出しを要求されたデータブロックを、故障していないHDD(DISK#10〜#12のいずれか)から読み出し、ホスト装置400に返信する。
[ステップS34]アクセス制御部220は、読み出しが要求されたデータブロックが、リビルド処理の対象とされているかを判定する。具体的には、アクセス制御部220は、RLU#01に対応するレコード241において、読み出しが要求されたデータブロックが記録されたHDDに対応する「ディスク状態」に「リビルド中」または「退避中」が設定されていた場合、データブロックがリビルド対象とされていると判定して(S34:Yes)、ステップS35の処理を実行する。この場合、データブロックはDISK#13に記録されていたことになる。一方、「ディスク状態」に「故障中」が設定されていた場合、データブロックがリビルド対象とされていないと判定して(S34:No)、ステップS41の処理を実行する。この場合、データブロックはDISK#14に記録されていたことになる。
[ステップS35]アクセス制御部220は、RLU#01に対応するレコード241から、「ディスク状態」に「退避中」が設定されたディスク番号を特定する。ここでは、DISK#13に対応する「ディスク状態」に「退避中」が設定されているものとする。
アクセス制御部220は、DISK#13に対応付けられた「退避先パリティ識別」を参照して、リビルドデータの格納先がQパリティ領域かを判定する。アクセス制御部220は、リビルドデータの格納先がQパリティ領域であった場合(S35:Yes)には、ステップS36の処理を実行する。一方、アクセス制御部220は、リビルドデータの格納先がQパリティ領域でなかった場合(S35:No)には、ステップS38の処理を実行する。
[ステップS36]アクセス制御部220は、RLU#01に対応するレコード241において、DISK#13に対応付けられた「退避先RLU番号」に設定されたRLU番号を読み出す。ここでは、「退避先RLU番号」にはRLU#00が設定されているものとする。
アクセス制御部220は、RLU#00の物理記憶領域における、読み出し対象のデータブロックの位置を特定する。この位置特定処理は、読み出しが要求されたデータブロックが属するストライプ番号をNs(ただし、Nsは0を初期値とする整数)とすると、RLU#00でのストライプ番号Nsにおいて、QパリティがどのHDDに記録されているかを特定するものである。ここで、Qパリティが記録されているHDDを、ディスク番号Nq(ただし、Nqは0を初期とする整数)と表す。なお、RLU#00に対応するレコード241に対して、RLU#00に属するHDDがDISK#00,#01,#02,#03,#04の順に登録されているものとすると、Nq=0,1,2,3,4は、それぞれDISK#00,#01,#02,#03,#04に対応する。
アクセス制御部220は、RLU#00に対応するレコード241を参照し、RLU#00に属するHDDの数を認識する。RLU#00に属するHDDの数をNdとすると、アクセス制御部220は、Qパリティが記録されているHDDのディスク番号Nqを、次の式に従って計算する。
Nq=(Nd−1)−{(Ns/Nd)の剰余}
[ステップS37]アクセス制御部220は、ステップS36で特定した位置からデータブロックを読み出し、ホスト装置400に返信する。
[ステップS38]アクセス制御部220は、RLU#01に対応するレコード241において、DISK#13に対応付けられた「退避先パリティ識別」を参照して、リビルドデータの格納先がPパリティ領域かを判定する。アクセス制御部220は、リビルドデータの格納先がPパリティ領域であった場合(S38:Yes)には、ステップS39の処理を実行する。
一方、アクセス制御部220は、RLU#01に対応するレコード241において、1つのHDD(ここではDISK#13)に対応する「ディスク状態」が「リビルド中」である場合には、ステップS41の処理を実行する。この状態とは、DISK#13に記録されていたデータのリビルド処理が完了しておらず、退避先RLUのPパリティ領域およびQパリティ領域のいずれにも、読み出しを要求されたデータが格納されていない可能性がある状態(S35:NoかつS38:No)である。
[ステップS39]アクセス制御部220は、RLU#01に対応するレコード241において、DISK#13に対応付けられた「退避先RLU番号」に設定されたRLU番号を読み出す。ここでは、「退避先RLU番号」にはRLU#00が設定されているものとする。
アクセス制御部220は、RLU#00の物理記憶領域における、読み出し対象のデータブロックの位置を特定する。この位置特定処理は、RLU#00でのストライプ番号Nsにおいて、PパリティがどのHDDに記録されているかを特定するものである。ここで、Pパリティが記録されているHDDを、ディスク番号Np(ただし、Npは0を初期とする整数)と表す。なお、RLU#00に対応するレコード241に対して、RLU#00に属するHDDがDISK#00,#01,#02,#03,#04の順に登録されているものとすると、Np=0,1,2,3,4は、それぞれDISK#00,#01,#02,#03,#04に対応する。
アクセス制御部220は、RLU#00に対応するレコード241を参照し、RLU#00に属するHDDの数Ndを認識する。アクセス制御部220は、Pパリティが記録されているHDDのディスク番号Npを、次の式に従って計算する。
Np=〔〔Nd+Nd−2−{(Ns/Nd)の剰余}〕/Nd〕の剰余
[ステップS40]アクセス制御部220は、ステップS39で特定した位置からデータブロックを読み出し、ホスト装置400に返信する。
[ステップS41]アクセス制御部220は、RLU#01に対応するレコード241において「ディスク状態」に「正常」が設定されたHDD(ここでは、DISK#10,#11,#12とする)を特定する。アクセス制御部220は、DISK#10,#11,#12のそれぞれにおけるストライプ番号Nsのデータ(それぞれ、データブロック、Pパリティ、Qパリティのいずれか)のうち、データブロックと1つ以上のパリティとを基に、読み出しを要求されたデータブロックを計算する。アクセス制御部220は、計算により得られたデータブロックを、ホスト装置400に返信する。
図11は、故障したHDDが交換された場合の処理手順の例を示すフローチャートである。ここでは例として、RLU#01に属するDISK#13,#14が交換された場合の処理について説明する。
[ステップS51]アクセス制御部220は、例えば、DISK#13,#14との通信が回復したことを検知すると、その旨を復旧制御部230に通知する。通知を受けた復旧制御部230は、DISK#13,#14が交換されたと判定して、ステップS52の処理を実行する。
[ステップS52]復旧制御部230は、交換されたDISK#13,#14が属するRLU(ここではRLU#01)を特定し、特定したRLUに対応するRAID管理テーブル240内のレコード241を参照する。復旧制御部230は、RLU#01に対応するレコード241から、「退避先RLU番号」に情報が設定されているHDD(ここではDISK#13)を抽出し、抽出したHDDに対応付けられた「退避先パリティ識別」を読み出す。復旧制御部230は、「退避先パリティ識別」にQパリティが設定されていた場合(S52:Yes)には、ステップS53の処理を実行する。一方、復旧制御部230は、「退避先パリティ識別」にPパリティが設定されていた場合(S52:No)には、ステップS56の処理を実行する。
[ステップS53]復旧制御部230は、RLU#01に対応するレコード241において、「退避先パリティ識別」にQパリティが設定されていたHDD(ここではDISK#13)に対応付けられた「ディスク状態」を、「コピーバック中」に更新する。これとともに、復旧制御部230は、RLU#01に対応するレコード241の「RAID状態」を「他のRLUからのコピーバック中」に更新する。さらに、復旧制御部230は、「退避先RLU番号」に設定されたRLU(ここではRLU#00とする)に対応するレコード241を参照し、そのレコード241の「RAID状態」を「他のRLUへのコピーバック中」に更新する。
以上のテーブル設定処理が終了すると、復旧制御部230は、アクセス制御部220に対して、RLU#00からRLU#01へのコピーバック処理を開始するように要求する。アクセス制御部220は、RLU#00のレコード241の「Qパリティ状態」が「退避データ格納中」であることから、コピーバック処理におけるデータの読み出し元をQパリティ領域と認識する。また、アクセス制御部220は、RLU#00のレコード241において、DISK#13に対応付けられた「退避先パリティ識別」が「Qパリティ」に設定されていることから、RLU#00のQパリティ領域から読み出したデータの書き戻し先がDISK#13であることを認識する。アクセス制御部220は、RLU#00のQパリティ領域からデータを読み出し、交換されたDISK#13に対して書き戻す。
アクセス制御部220によるコピーバック処理が終了すると、復旧制御部230は、RLU#01に対応するレコード241において、ディスク#13に対応付けられた「ディスク状態」を「正常」に更新するとともに、ディスク#13に対応付けられた「退避先RLU番号」および「退避先パリティ識別」に設定されていた情報を消去する。
[ステップS54]復旧制御部230は、RLU#01におけるDISK#14のデータを復元するようにアクセス制御部220に要求する。アクセス制御部220は、RLU#01に対応するレコード241の「ディスク状態」から、DISK#10〜#13に正常なデータが記録されていることを認識する。アクセス制御部220は、DISK#10〜#13に記録されているRLU#01のデータを基に、故障前のDISK#14に記録されていたデータを再計算し、算出したデータを交換されたDISK#14に書き込む。
アクセス制御部220によるデータ復元処理が終了すると、復旧制御部230は、RLU#01に対応するレコード241において、DISK#14に対応付けられた「ディスク状態」を「正常」に更新する。これとともに、復旧制御部230は、RLU#01に対応するレコード241の「RAID状態」を「2パリティ使用可」に更新する。これらのテーブル設定処理により、RLU#01は、DISK#13,#14が故障する前と同様に、RAID−6によって運用されるようになる。
[ステップS55]復旧制御部230は、RLU#00におけるQパリティを再計算するようにアクセス制御部220に要求する。アクセス制御部220は、DISK#00〜#04に記録されているブロックデータを基にQパリティを計算し、算出したQパリティをRLU#00におけるQパリティ領域に上書きする。
RLU#00における全Qパリティ領域にQパリティが書き込まれると、復旧制御部230は、RLU#00に対応するレコード241において、「Qパリティ状態」を「通常状態」に更新し、「Qパリティ退避元RLU番号」に設定されたRLU#01を消去する。また、復旧制御部230は、RLU#00に対応するレコード241の「RAIDレベル」にRAID−6が設定されている場合、同じレコード241の「RAID状態」を「2パリティ使用可」に更新する。一方、復旧制御部230は、RLU#00に対応するレコード241の「RAIDレベル」にRAID−4またはRAID−5が設定されている場合、同じレコード241の「RAID状態」を「1パリティ使用可」に更新する。これらのテーブル設定処理により、RLU#00は、DISK#13,#14が故障する前と同様のRAIDレベルによって運用されるようになる。
[ステップS56]復旧制御部230は、RLU#01に対応するレコード241において、「退避先パリティ識別」にPパリティが設定されていたHDD(ここではDISK#13とする)に対応付けられた「ディスク状態」を、「コピーバック中」に更新する。これとともに、復旧制御部230は、RLU#01に対応するレコード241の「RAID状態」を「他のRLUからのコピーバック中」に更新する。さらに、復旧制御部230は、「退避先RLU番号」に設定されたRLU(ここではRLU#00とする)に対応するレコード241を参照し、そのレコード241の「RAID状態」を「他のRLUへのコピーバック中」に更新する。
以上のテーブル設定処理が終了すると、復旧制御部230は、アクセス制御部220に対して、RLU#00からRLU#01へのコピーバック処理を開始するように要求する。アクセス制御部220は、RLU#00のレコード241の「Pパリティ状態」が「退避データ格納中」であることから、コピーバック処理におけるデータの読み出し元をPパリティ領域と認識する。また、アクセス制御部220は、RLU#00のレコード241において、DISK#13に対応付けられた「退避先パリティ識別」が「Pパリティ」に設定されていることから、RLU#00のPパリティ領域から読み出したデータの書き戻し先がDISK#13であることを認識する。アクセス制御部220は、RLU#00のPパリティ領域からデータを読み出し、交換されたDISK#13に対して書き戻す。
アクセス制御部220によるコピーバック処理が終了すると、復旧制御部230は、RLU#01に対応するレコード241において、ディスク#13に対応付けられた「ディスク状態」を「正常」に更新するとともに、ディスク#13に対応付けられた「退避先RLU番号」および「退避先パリティ識別」に設定されていた情報を消去する。
[ステップS57]このステップS57では、前述のステップS54と同様の手順で、交換されたDISK#14のデータが復元される。データ復元処理が終了すると、復旧制御部230は、RLU#01に対応するレコード241において、DISK#14に対応付けられた「ディスク状態」を「正常」に更新する。これとともに、復旧制御部230は、RLU#01に対応するレコード241の「RAID状態」を「2パリティ使用可」に更新する。これらのテーブル設定処理により、RLU#01は、DISK#13,#14が故障する前と同様に、RAID−6によって運用されるようになる。
[ステップS58]復旧制御部230は、RLU#00におけるPパリティを再計算するようにアクセス制御部220に要求する。アクセス制御部220は、DISK#00〜#04に記録されているブロックデータを基にPパリティを計算し、算出したPパリティをRLU#00におけるPパリティ領域に上書きする。
RLU#00における全Pパリティ領域にPパリティが書き込まれると、復旧制御部230は、RLU#00に対応するレコード241において、「Pパリティ状態」を「通常状態」に更新し、「Pパリティ退避元RLU番号」に設定されたRLU#01を消去する。また、復旧制御部230は、RLU#00に対応するレコード241の「RAIDレベル」にRAID−6が設定されている場合、同じレコード241の「RAID状態」を「2パリティ使用可」に更新する。一方、復旧制御部230は、RLU#00に対応するレコード241の「RAIDレベル」にRAID−4またはRAID−5が設定されている場合、同じレコード241の「RAID状態」を「1パリティ使用可」に更新する。これらのテーブル設定処理により、RLU#00は、DISK#13,#14が故障する前と同様のRAIDレベルによって運用されるようになる。
なお、以上の図9〜図11では、通常運用時にRAID−6によって運用されるRLU#01において2つのHDDが故障した場合の処理を示したが、他の例として、同様のRLU#01において1つのHDDが故障した場合に、故障したHDDに記録されていたデータを他のRLU#00のパリティ領域に格納するようにしてもよい。この場合、リビルドデータがRLU#00のパリティ領域に退避された状態では、データが3重に冗長化された状態のままRLU#01の運用を継続できる。
〔第3の実施の形態〕
第3の実施の形態に係るストレージシステムは、第2の実施の形態で説明したCMにおける処理手順が変形されたものである。そこで、第3の実施の形態について、第2の実施の形態と同じ符号を用いて説明する。
図12は、第3の実施の形態におけるHDD故障時の処理例を示す図である。
第3の実施の形態では、RAID−6で運用されているRLUに属する2台のHDDが故障したとき、故障した2台のHDDのリビルドデータを、RAID−6で運用されている他のRLUのPパリティ領域およびQパリティ領域に格納する。これにより、2台のHDDが故障したRLUにおけるデータの冗長度を低下させないようにする。
図12における「状態21」は、図5における「状態1」と同様の状態であり、RLU#00,#01はともにRAID−6によって管理されている。ここで、RLU#01に属するDISK#13,#14が故障したものとする。復旧制御部230は、データが3重に冗長化された(すなわち、RAID−6で管理された)他のRLU(ここでは例としてRLU#00)を選択し、選択したRLUと、HDDが故障したRLUとを結合する。
具体的には、RLU#01に属するDISK#13,#14が故障すると、復旧制御部230は、図12の「状態22」に示すように、アクセス制御部220に次のようなリビルド処理を実行させる。復旧制御部230は、故障したDISK#13に記録されていたデータを再構築し、再構築したデータをRLU#00におけるPパリティ領域に格納するように、アクセス制御部220に要求する。これとともに、復旧制御部230は、故障したDISK#14に記録されていたデータを再構築し、再構築したデータをRLU#00におけるQパリティ領域に格納するように、アクセス制御部220に要求する。
RLU#01のリビルド処理が終了すると、復旧制御部230は、図12の「状態23」に示すように、RLU#00,#01を結合状態にする。すなわち、復旧制御部230は、故障したDISK#13,#14をRLU#01から切り離す。さらに、復旧制御部230は、RLU#00における、RLU#01のリビルドデータが格納されたPパリティ領域およびQパリティ領域を、RLU#00から切り離し、切り離したPパリティ領域およびQパリティ領域をRLU#01に組み込む。
これにより、RLU#01を構成する物理記憶領域は、図5中の太線で示す領域となる。復旧制御部230は、アクセス制御部220に、RLU#00のPパリティ領域およびQパリティ領域を組み込んだRLU#01を、RAID−6相当の管理方法で暫定的に運用させる。これとともに、復旧制御部230は、アクセス制御部220に、Pパリティ領域およびQパリティ領域を除くRLU#00の領域を、RAID−0相当の管理方法で暫定的に運用させる。
以上のようなリビルド処理およびRLUの結合処理により、HDDが2台故障したRLU#01については、データの冗長度を3重冗長状態に回復させることができる。一方、RLU#01のリビルド先としてRAID−6で管理されていたRLU#00が選択されることで、RLU#00は、データの冗長度がない状態となる。このため、RLU#01のリビルドデータの格納先としては、RLU#01よりも低い重要度が付与されたRLUが選択されることが望ましい。
以上の図12において、状態21から状態23まで遷移する過程では、DISK#00〜#04,#10〜#12の記憶領域のうち、RLU#00のPパリティ領域およびQパリティ領域においてデータの上書きが実行されるのみであり、それ以外の領域ではデータの書き込みが一切行われない。このため、図5の場合と同様に、DISK#13,#14の故障が発生してから、RLU#00,#01がともにRAID−5による暫定運用を開始するまでの期間において、DISK#00〜#04,#10〜#12におけるデータの書き込み頻度が少なくなる。従って、上記期間におけるCM201のCPU211の処理負荷が低くなる。このため、ホスト装置400からのI/O要求に応じたHDDへのアクセス処理に対してリビルド処理が与える影響が小さくなり、I/O要求に対する応答速度が著しく低下することを抑制できる。
また、状態23におけるRLU#00の領域は、状態21と比較してPパリティ領域およびQパリティ領域が切り離されただけの状態となる。このため、状態23において、ホスト装置400からのI/O要求に応じたRLU#00へのアクセス処理手順を、状態21でのアクセス処理手順から大きく変えないようにすることができる。例えば、状態23において、ホスト装置400から、RLU#00からの読み出しが要求された場合、アクセス制御部220は、状態21とまったく同じ処理手順で要求されたデータを読み出す。また、状態23において、ホスト装置400からRLU#00に対する書き込みが要求された場合、アクセス制御部220は、PパリティおよびQパリティの計算および記録を行わないこと以外、状態21と同じ処理手順でデータを書き込む。
図13は、第3の実施の形態におけるHDDの交換時の処理例を示す図である。
DISK#13,#14が新たなHDDに交換されると、図13の「状態24」に示すように、RLU#01についてのコピーバック処理が実行される。復旧制御部230は、アクセス制御部220に、RLU#00のPパリティ領域に記録されたデータを、交換されたDISK#13にコピーさせるとともに、RLU#00のQパリティ領域に記録されたデータを、交換されたDISK#14にコピーさせる。
アクセス制御部220は、RLU#00のPパリティ領域からデータを読み出し、DISK#13における、その読み出し元と同じストライプ番号の位置に、読み出したデータを書き込む。また、アクセス制御部220は、RLU#00のQパリティ領域からデータを読み出し、DISK#14における、その読み出し元と同じストライプ番号の位置に、読み出したデータを書き込む。
コピーバック処理が終了すると、復旧制御部230は、RLU#00,#01を結合状態から分離状態に遷移させる。この処理では、復旧制御部230は、交換されたディスク#13,#14をRLU#01に組み込むとともに、RLU#00のPパリティ領域およびQパリティ領域をRLU#01から切り離す。また、復旧制御部230は、RLU#00のPパリティ領域およびQパリティ領域をRLU#00に組み込み直す。
図13の「状態25」は、RLUが分離された状態を示し、復旧制御部230は、この状態からさらに、RLU#00のRAIDレベルをRAID−6に戻すためのデータ復元処理を実行させる。復旧制御部230は、アクセス制御部220に、RLU#00におけるPパリティを再計算し、Pパリティ領域に上書きするように要求するとともに、RLU#00におけるQパリティを再計算し、Qパリティ領域に上書きするように要求する。アクセス制御部220は、例えば、DISK#00〜#02に格納されたデータD0〜D2を用いてPパリティP0およびQパリティQ0を再計算し、DISK#04,#05のそれぞれにおけるデータD0〜D2と同じストライプ番号の位置に上書きする。なお、図13の「状態25」では、データが復元される位置を点線で表している。
データの復元処理が完了すると、復旧制御部230は、図13の「状態26」に示すように、RLU#00,#01の各RAIDレベルをともにRAID−6に変更し、RLU#00,#01を図12の「状態21」と同様の正常状態に復帰させる。
ここで、前述の図12の状態23から図13の状態26に遷移する過程では、DISK#00〜#04の記憶領域のうちRLU#00のPパリティ領域およびQパリティ領域に記録されていたデータが、交換されたDISK#13,#14にそれぞれコピーされるのみであり、それ以外のデータの再配置は行われない。
このため、DISK#13,#14を交換してから、RLU#00,#01がともにRAID−6による運用を再開するまでの期間において、DISK#00〜#04,#10〜#12におけるデータのアクセス頻度を少なくすることができる。従って、上記期間におけるCM201のCPU211の処理負荷が低くなり、ホスト装置400からのI/O要求に応じたHDDへのアクセス処理に対して、RLU#00,#01が元の状態に復帰するための処理が与える影響が小さくなる。
図14は、第3の実施の形態において、RLUに属する2つのHDDが故障した場合の処理手順の例を示すフローチャートである。
[ステップS71]復旧制御部230は、図9のステップS11と同様の手順で、RLU#01に属するDISK#13,#14が故障したことを検出する。復旧制御部230は、RAID管理テーブル240におけるRLU#01に対応するレコード241において、DISK#13,#14にそれぞれ対応付けられた「ディスク状態」を、「正常」から「故障」に更新する。また、復旧制御部230は、RLU#01に対応するレコード241の「RAID状態」を、「2パリティ使用可」から「非冗長状態」に更新する。
[ステップS72]復旧制御部230は、使用可能なホットスペアディスクが2台、DE300内にあるかを判定する。復旧制御部230は、使用可能なホットスペアディスクが2台ある場合(S72:Yes)にはステップS73の処理を実行する一方、使用可能なホットスペアディスク1台以下の場合(S72:No)にはステップS74の処理を実行する。
[ステップS73]復旧制御部230は、故障したDISK#13に記録されていたRLU#01のデータを再構築し、得られたリビルドデータを、使用可能な第1のホットスペアディスクに対して書き込むように、アクセス制御部220に要求する。また、復旧制御部230は、故障したDISK#14に記録されていたRLU#01のデータを再構築し、得られたリビルドデータを、使用可能な第2のホットスペアディスクに対して書き込むように、アクセス制御部220に要求する。
アクセス制御部220によるリビルドデータの格納が完了すると、復旧制御部230は、RLU#01からDISK#13,#14を切り離すとともに、2台のホットスペアディスクをRLU#01に組み込む。復旧制御部230は、アクセス制御部220に、RAID−6によってRLU#01の運用を続行させる。
[ステップS74]復旧制御部230は、RAID管理テーブル240のレコード241のうち、HDDが故障したRLU#01以外のRLUに対応するレコード241を参照して、リビルドデータの格納先とするRLUを探索する。
まず、復旧制御部230は、RAID−6で正常に運用継続中(すなわち、Pパリティ領域およびQパリティ領域が通常状態)であり、かつ、RLU#01に付与された重要度より低い重要度が付与され、かつ、RLU#01と同数以上のストライプ数を有するRLUを探索する。復旧制御部230は、探索されたRLUのうち最も低い重要度が付与されたRLUを、リビルドデータの格納先に決定する。
[ステップS75]復旧制御部230は、ステップS74で条件に合致するRLUがあった場合(S75:Yes)には、ステップS76の処理を実行する。一方、復旧制御部230は、ステップS74で条件に合致するRLUがなかった場合(S75:No)には、RLU#01についてのリビルド処理の実行を断念する。この場合、RLU#01については、データの冗長性がない状態のまま、ホスト装置400からの要求に応じたアクセスが行われる。
[ステップS76]以下、ステップS75において、リビルドデータの格納先としてRLU#00が決定されたものとして、説明を続ける。
復旧制御部230は、RLU#01に対応するレコード241の「RAID状態」を、「非冗長状態」から「他のRLUへリビルド中」に更新する。また、復旧制御部230は、同じレコード241内のDISK#13に対応付けられた欄において、「ディスク状態」を「リビルド中」に更新するとともに、「退避先RLU番号」にRLU#00を、「退避先パリティ識別」にPパリティをそれぞれ登録する。
また、復旧制御部230は、RLU#00に対応するレコード241において、「RAID状態」を「2パリティ使用可」から「他のRLUからのリビルド中」に、「Pパリティ状態」を「通常状態」から「退避データ格納中」にそれぞれ更新する。また、復旧制御部230は、同じレコード241の「Pパリティ退避元RLU番号」に「RLU#01」を登録する。
以上のテーブル設定処理が終了すると、復旧制御部230は、故障したDISK#13に記録されていたRLU#00のデータを再構築し、得られたリビルドデータをRLU#00のPパリティ領域に書き込むように、アクセス制御部220に要求する。
[ステップS77]アクセス制御部220によるPパリティ領域へのリビルドデータの書き込みが完了すると、復旧制御部230は、RLU#01に対応するレコード241内のDISK#14に対応付けられた欄において、「ディスク状態」を「リビルド中」に更新するとともに、「退避先RLU番号」にRLU#00を、「退避先パリティ識別」にQパリティをそれぞれ登録する。
また、復旧制御部230は、RLU#00に対応するレコード241において、「Qパリティ状態」を「通常状態」から「退避データ格納中」に更新するとともに、Qパリティ退避元RLU番号」に「RLU#01」を登録する。
以上のテーブル設定処理が終了すると、復旧制御部230は、故障したDISK#14に記録されていたRLU#00のデータを再構築し、得られたリビルドデータをRLU#00のQパリティ領域に書き込むように、アクセス制御部220に要求する。
[ステップS78]アクセス制御部220によるQパリティ領域へのリビルドデータの書き込みが完了すると、復旧制御部230は、次のようなテーブル設定処理を行うことで、RLU#00とRLU#01とを結合状態にするとともに、RLU#00のRAIDレベルを変更する。
復旧制御部230は、RLU#01のレコード241の「RAID状態」を「他のRLUへ退避中」に更新するとともに、同じレコード241内のDISK#13,#14にそれぞれ対応付けられた「ディスク状態」を「退避中」に更新する。また、復旧制御部230は、RLU#00に対応するレコード241の「RAID状態」を「非冗長状態」に更新する。
以上のテーブル設定処理により、RLU#00における両方のパリティ領域がRLU#00から切り離されるとともに、切り離されたパリティ領域がRLU#01に組み込まれる。これにより、RLU同士が結合状態になるとともに、RLU#00のRAIDレベルが実質的に変更される。アクセス制御部220は、RLU#00のレコード241において、「RAIDレベル」にRAID−6が設定され、かつ、「RAID状態」が「非冗長状態」に更新されたとき、RLU#00を実質的にRAID−0で制御する。
上記の図14の処理において、ステップS74では、RLU#01のリビルドデータの格納先として、RLU#01より低い重要度が付与されたRLUが選択される。これにより、RLU#01と同等以上の重要度が付与されたRLUにおいて、データの冗長性が失われる事態を回避でき、このRLUにおけるデータの安全性を維持することができる。
次に、図15は、第3の実施の形態において、結合状態とされたRLUに対するI/O要求が発行されたときの処理手順の例を示すフローチャートである。この図15では例として、RLU#00と結合状態とされたRLU#01に対して、ホスト装置400から読み出しが要求された場合の処理手順を示す。なお、この図15の処理は、データブロックごとに実行される。
[ステップS91]アクセス制御部220は、ホスト装置400から、RLU#01内のデータブロックに対する読み出し要求を受信する。
[ステップS92]アクセス制御部220は、読み出しを要求されたデータブロックが、初期状態でRLU#00に属していたHDD(DISK#10〜#14)のうち、故障したHDD(DISK#13またはDISK#14)に記録されているかを判定する。アクセス制御部220は、データブロックが故障したHDDに記録されている場合(S92:Yes)には、ステップS94の処理を実行する。一方、アクセス制御部220は、データブロックが故障していないHDD(DISK#10〜#12のいずれか)に記録されている場合(S92:No)には、ステップS93の処理を実行する。
[ステップS93]アクセス制御部220は、読み出しを要求されたデータブロックを、故障していないHDD(DISK#10〜#12のいずれか)から読み出し、ホスト装置400に返信する。
[ステップS94]アクセス制御部220は、読み出しを要求されたデータブロックの退避先が、他のRLUのQパリティかを判定する。具体的には、アクセス制御部220は、RLU#01のレコード241を参照し、読み出しを要求されたデータブロックが再構築される前に記録されていたHDDに対応付けられた「退避先パリティ識別」に、Qパリティが設定されているかを判定する。
復旧制御部230は、「退避先パリティ識別」にQパリティが登録されている場合(S94:Yes)には、ステップS95の処理を実行する。なお、この場合、読み出しを要求されたデータブロックは、DISK#14に記録されていたことになる。一方、復旧制御部230は、「退避先パリティ識別」にQパリティが設定されていない場合(S94:No)には、ステップS97の処理を実行する。
[ステップS95]アクセス制御部220は、RLU#01に対応するレコード241において、DISK#14に対応付けられた「退避先RLU番号」に設定されたRLU番号を読み出す。ここでは、「退避先RLU番号」にはRLU#00が設定されているものとする。
アクセス制御部220は、図10のステップS36と同様の手順で、RLU#00の物理記憶領域における、読み出し対象のデータブロックの位置(すなわち、Qパリティが記録されているHDDのディスク番号Nq)を特定する。
[ステップS96]アクセス制御部220は、ステップS95で特定した位置からデータブロックを読み出し、ホスト装置400に返信する。
[ステップS97]復旧制御部230は、読み出しを要求されたデータブロックの退避先が、他のRLUのPパリティかを判定する。具体的には、アクセス制御部220は、RLU#01のレコード241を参照し、読み出しを要求されたデータブロックが再構築される前に記録されていたHDDに対応付けられた「退避先パリティ識別」に、Pパリティが設定されているかを判定する。
復旧制御部230は、「退避先パリティ識別」にPパリティが登録されている場合(S97:Yes)には、ステップS98の処理を実行する。なお、この場合、読み出しを要求されたデータブロックは、DISK#13に記録されていたことになる。一方、復旧制御部230は、「退避先パリティ識別」にPパリティが設定されていない場合(S97:No)には、ステップS100の処理を実行する。
[ステップS98]アクセス制御部220は、RLU#01に対応するレコード241において、DISK#13に対応付けられた「退避先RLU番号」に設定されたRLU番号を読み出す。ここでは、「退避先RLU番号」にはRLU#00が設定されているものとする。
アクセス制御部220は、図10のステップS39と同様の手順で、RLU#00の物理記憶領域における、読み出し対象のデータブロックの位置(すなわち、Pパリティが記録されているHDDのディスク番号Np)を特定する。
[ステップS99]アクセス制御部220は、ステップS98で特定した位置からデータブロックを読み出し、ホスト装置400に返信する。
[ステップS100]このステップS100は、DISK#13,#14の少なくとも一方に記録されていたデータのリビルド処理が完了しておらず、退避先RLUのPパリティ領域およびQパリティ領域の少なくとも一方に、読み出しを要求されたデータが格納されていない可能性がある状態(S94:NoかつS97:No)において実行される。このとき、アクセス制御部220は、図10のステップS41と同様の手順で、DISK#10,#11,#12のそれぞれにおけるストライプ番号Nsのデータ(それぞれ、データブロック、Pパリティ、Qパリティのいずれか)のうち、データブロックと一方のパリティとを基に、読み出しを要求されたデータブロックを計算する。アクセス制御部220は、計算により得られたデータブロックを、ホスト装置400に返信する。
図16は、第3の実施の形態において、故障したHDDが交換された場合の処理手順の例を示すフローチャートである。ここでは例として、RLU#01に属するDISK#13,#14が交換された場合の処理について説明する。
[ステップS111]復旧制御部230は、図11のステップS51と同様の手順で、DISK#13,#14が交換されたことを検知する。
[ステップS112]復旧制御部230は、交換されたDISK#13,#14が属するRLU(ここではRLU#01)を特定し、特定したRLUに対応するRAID管理テーブル240内のレコード241を参照する。
復旧制御部230は、RLU#01に対応するレコード241から、「退避先パリティ識別」にPパリティが設定されているHDD(ここではDISK#13)を抽出する。復旧制御部230は、RLU#01に対応するレコード241において、抽出したHDD(DISK#13)に対応付けられていた「ディスク状態」を、「コピーバック中」に更新する。これとともに、復旧制御部230は、RLU#01に対応するレコード241の「RAID状態」を「他のRLUからのコピーバック中」に更新する。
さらに、復旧制御部230は、DISK#13に対応付けられていた「退避先RLU番号」に設定されたRLU(ここではRLU#00とする)に対応するレコード241を参照し、そのレコード241の「RAID状態」を「他のRLUへのコピーバック中」に更新する。
以上のテーブル設定処理が終了すると、復旧制御部230は、アクセス制御部220に対して、RLU#00のPパリティ領域からRLU#01のDISK#13へのコピーバック処理を開始するように要求する。アクセス制御部220は、RLU#00のPパリティ領域からデータを読み出し、交換されたDISK#13に対して書き戻す。
アクセス制御部220によるPパリティ領域からのコピーバック処理が終了すると、復旧制御部230は、RLU#01に対応するレコード241において、ディスク#13に対応付けられた「ディスク状態」を「正常」に更新するとともに、ディスク#13に対応付けられた「退避先RLU番号」および「退避先パリティ識別」に設定されていた情報を消去する。
[ステップS113]復旧制御部230は、RLU#00におけるPパリティを再計算するようにアクセス制御部220に要求する。アクセス制御部220は、DISK#00〜#04に記録されているブロックデータを基にPパリティを計算し、算出したPパリティをRLU#00におけるPパリティ領域に上書きする。
RLU#00における全Pパリティ領域にPパリティが書き込まれると、復旧制御部230は、RLU#00に対応するレコード241において、「Pパリティ状態」を「通常状態」に更新し、「Pパリティ退避元RLU番号」に設定されたRLU#01を消去する。
[ステップS114]復旧制御部230は、RLU#01に対応するレコード241から、「退避先パリティ識別」にQパリティが設定されているHDD(ここではDISK#14)を抽出する。復旧制御部230は、RLU#01に対応するレコード241において、抽出したHDD(DISK#14)に対応付けられていた「ディスク状態」を、「コピーバック中」に更新する。
以上のテーブル設定処理が終了すると、復旧制御部230は、アクセス制御部220に対して、RLU#00のQパリティ領域からRLU#01のDISK#14へのコピーバック処理を開始するように要求する。アクセス制御部220は、RLU#00のQパリティ領域からデータを読み出し、交換されたDISK#14に対して書き戻す。
アクセス制御部220によるQパリティ領域からのコピーバック処理が終了すると、復旧制御部230は、RLU#01に対応するレコード241において、ディスク#14に対応付けられた「ディスク状態」を「正常」に更新するとともに、ディスク#14に対応付けられた「退避先RLU番号」および「退避先パリティ識別」に設定されていた情報を消去する。
[ステップS115]復旧制御部230は、RLU#00におけるQパリティを再計算するようにアクセス制御部220に要求する。アクセス制御部220は、DISK#00〜#04に記録されているブロックデータを基にQパリティを計算し、算出したQパリティをRLU#00におけるQパリティ領域に上書きする。
RLU#00における全Qパリティ領域にQパリティが書き込まれると、復旧制御部230は、RLU#00に対応するレコード241において、「Qパリティ状態」を「通常状態」に更新し、「Qパリティ退避元RLU番号」に設定されたRLU#01を消去する。
[ステップS116]復旧制御部230は、次のようなテーブル設定処理を行うことで、RLU#00,#01の各RAIDレベルを変更する。
復旧制御部230は、RLU#01に対応するレコード241の「RAID状態」を「2パリティ使用可」に更新する。これにより、RLU#01は、DISK#13,#14が故障する前と同様に、RAID−6によって運用されるようになる。また、復旧制御部230は、RLU#00に対応するレコード241の「RAID状態」を、「2パリティ使用可」に更新する。これにより、RLU#00は、DISK#13,#14が故障する前と同様に、RAID−6によって運用されるようになる。
なお、上記の図16の処理では、Pパリティ領域からDISK#13へのコピーバック処理を行った後、Qパリティ領域からのDISK#14へのコピーバック処理を行ったが、これらのコピーバック処理の処理順は逆であってもよい。また、これらのコピーバック処理が並列に実行されてもよい。
〔第4の実施の形態〕
以下、第4の実施の形態に係るストレージシステムについて説明する。第4の実施の形態に係るストレージシステムは、第2の実施の形態に係るストレージシステムにおけるCM201,202がそれぞれ備える処理機能が、次の図17のように変形されたものである。
図17は、第4の実施の形態におけるCMの処理機能の構成例を示すブロック図である。なお、図17では、図4と同様の構成要素には同じ符号を付して示す。
第4の実施の形態において、CM201aは、アクセス制御部220a、復旧制御部230およびアクセス監視部250を備える。アクセス制御部220a、復旧制御部230およびアクセス監視部250の各処理は、例えば、CM201aのCPU211が所定のプログラムを実行することで実現される。また、CM201aのHDD213には、RAID管理テーブル240に加えて、アクセス履歴251が記憶される。
アクセス制御部220aは、ホスト装置400からのI/O要求コマンドをコマンドキュー221に一時的に格納し、コマンドキュー221に格納された順にI/O要求を処理する。コマンドキュー221は、アクセス制御部220aが起動中である期間において、例えばCM201aのRAM212に生成される。
また、復旧制御部230は、第2のRLUと結合された状態の第1のRLUに対して、ホスト装置400からの読み出し要求に応じたアクセス処理を行う際に、アクセス監視部250に対して、第2のRLUにおける過去の一定期間におけるアクセス回数を問い合わせる。
復旧制御部230は、アクセス監視部250から通知されたアクセス回数や、コマンドキュー221に現在格納されている第2のRLUに対するI/O要求の数に応じて、ホスト装置400から要求されたデータの読み出し方を変更する。
アクセス制御部220aによるその他の処理は、図4のアクセス制御部220の処理と同様である。
アクセス監視部250は、アクセス制御部220aによる、ホスト装置400からのI/O要求に応じたHDDへのアクセス処理を監視し、アクセス処理の履歴をアクセス履歴251に格納する。アクセス監視部250は、RAID管理テーブル240を参照することで、RLUごとのアクセス処理の履歴をアクセス履歴251に登録する。また、アクセス監視部250は、復旧制御部230からの要求に応じて、所定のRLUに対する過去の一定期間におけるアクセス回数を算出し、復旧制御部230に通知する。
図18は、第4の実施の形態において、結合状態とされたRLUに対する読み出し要求が発行されたときの処理手順の例を示すフローチャートである。この図18では例として、図10と同様に、RLU#00と結合状態とされたRLU#01に対して、ホスト装置400から読み出しが要求された場合の処理手順を示す。また、図18では、図10と同様の処理には同じステップ番号を付与して示している。なお、この図18の処理は、データブロックごとに実行される。
図18に示す読み出し要求発行時の処理は、図10におけるステップS34とステップS35との間に、ステップS34a,S34bを加えたものである。
[ステップS34a]アクセス制御部220aは、RLU#01に対応するレコード241から、「ディスク状態」に「退避中」が設定されたディスク番号を特定する。ここでは、DISK#13に対応する「ディスク状態」に「退避中」が設定されているものとする。
アクセス制御部220aは、DISK#13aに対応付けられた「退避先RLU番号」に設定されたRLU番号を読み出す。ここでは、「退避先RLU番号」にはRLU#00が設定されているものとする。アクセス制御部220aは、RLU#00におけるアクセスの状況に応じて、読み出しを要求されたデータを、退避先RLU(ここではRLU#00)のパリティ領域から読み出すか、あるいは、RLU#01における故障していないDISK#10,#11,#12に記録されたデータを基に計算して送信するかを決定する。
具体的には、アクセス制御部220aは、アクセス監視部250に対して、RLU#00における過去の一定期間におけるアクセス回数を問い合わせ、アクセス回数を認識する。また、アクセス制御部220aは、コマンドキュー221に現在格納されている未処理のI/Oコマンドのうち、RLU#00をアクセス先とするI/Oコマンドの数を算出する。
例えば、過去の一定期間におけるRLU#00へのアクセス回数が所定回数未満である場合や、RLU#00に対する未処理のI/Oコマンド数が所定数未満である場合には、RLU#00のパリティ領域からRLU#01のデータを読み出したとしても、RLU#00に対するI/O処理速度は大きく低下しないと考えられる。このことから、アクセス制御部220aは、過去の一定期間におけるRLU#00へのアクセス回数が所定回数未満であり、なおかつ、RLU#00に対する未処理のI/Oコマンド数が所定数未満である場合には、読み出しを要求されたデータをRLU#00のパリティ領域から読み出すこと(すなわち、ステップS35以降の処理を実行すること)を決定する。
一方、過去の一定期間におけるRLU#00へのアクセス回数が所定回数以上である場合や、RLU#00に対する未処理のI/Oコマンド数が所定数以上である場合には、RLU#00のパリティ領域からRLU#01のデータを読み出したとき、RLU#00に対するI/O処理速度が大きく低下してしまう可能性がある。このことから、アクセス制御部220aは、少なくとも、過去の一定期間におけるRLU#00へのアクセス回数が所定回数以上であるか、または、RLU#00に対する未処理のI/Oコマンド数が所定数以上である場合には、読み出しを要求されたデータを、DISK#10,#11,#12に記録されたデータを基に計算すること(すなわち、ステップS41の処理を実行すること)を決定する。
[ステップS34b]アクセス制御部220aは、ステップS34aにおいて、読み出しを要求されたデータをRLU#00のパリティ領域から読み出すことを決定した場合(S34b:Yes)には、ステップS35の処理を実行する。一方、アクセス制御部220aは、ステップS34aにおいて、読み出しを要求されたデータを、DISK#10,#11,#12に記録されたデータを基に計算することを決定した場合(S34b:No)には、ステップS41の処理を実行する。
以上の図18の処理によれば、故障したHDDに記録されていたデータブロックに対する読み出しがホスト装置400から要求された際に、データ退避先のRLUにおけるI/O処理速度にできるだけ影響を与えないように、読み出し方法を自動的に選択することができる。
なお、上記のステップS34a,S34bでは、アクセス回数とI/Oコマンド数の両方を基に読み出し方法を決定したが、アクセス回数とI/Oコマンドの一方のみを基に読み出し方法を決定してもよい。例えば、アクセス制御部220aは、過去の一定期間におけるRLU#00へのアクセス回数が所定回数未満である場合、ステップS35の処理を実行する一方、アクセス回数が所定回数以上である場合、ステップS41を実行してもよい。あるいは、アクセス制御部220aは、コマンドキュー221に現在格納されている未処理のI/Oコマンド数が所定数未満の場合、ステップS35の処理を実行する一方、I/Oコマンド数が所定数以上の場合、ステップS41の処理を実行してもよい。
また、上記の図18では、データの読み出し方法をアクセス回数やI/Oコマンド数を基に決定したが、例えば、どちらのデータ読み出し方法を選択するかは、ユーザによってRLUごとに事前に設定されていてもよい。
また、図18のステップS34a,S34bの処理は、前述の第3の実施の形態に適用されてもよい。例えば、図15のステップS92の次に、図18のステップS34a,S34bの処理を挿入する。そして、読み出しを要求されたデータをRLU#00のパリティ領域から読み出すことを決定した場合(S34b:Yes)には、ステップS94の処理を実行する。一方、読み出しを要求されたデータを、DISK#10,#11,#12に記録されたデータを基に計算することを決定した場合(S34b:No)には、ステップS100の処理を実行する。
以上の各実施の形態に関し、さらに以下の付記を開示する。
(付記1) それぞれ複数の記憶装置の記憶領域によって構成される第1の論理記憶領域および第2の論理記憶領域に対するデータアクセス処理を制御し、前記第1の論理記憶領域および前記第2の論理記憶領域のそれぞれを、パリティを用いてデータが冗長化されるとともに、パリティが複数の記憶装置に分散して配置されるように管理するアクセス制御部と、
前記第1の論理記憶領域の一部を構成する記憶装置が故障したとき、前記第1の論理記憶領域のデータのうち故障した記憶装置に記録されていたデータを生成して、生成したデータを前記第2の論理記憶領域のうちパリティが記録されていたパリティ領域に格納する復旧制御部と、
を有するストレージ制御装置と、
前記第1の論理記憶領域を構成する複数の記憶装置と、
前記第2の論理記憶領域を構成する複数の記憶装置と、
を備えることを特徴とするストレージシステム。
(付記2) 前記復旧制御部は、前記生成したデータを前記パリティ領域に格納するとともに、前記アクセス制御部に、前記故障した記憶装置の記憶領域の代わりに前記パリティ領域を前記第1の論理記憶領域に組み込み、データの冗長度を維持した状態で前記第1の論理記憶領域の管理を続行させ、前記第2の論理記憶領域から前記パリティ領域を切り離し、データの冗長度を低下させた状態で前記第2の論理記憶領域の管理を続行させることを特徴とする付記1記載のストレージシステム。
(付記3) 前記アクセス制御部は、前記第1の論理記憶領域に前記パリティ領域が組み込まれた状態において、ホスト装置から前記第1の論理記憶領域のうち前記故障した記憶装置に記録されていたデータの読み出しを要求されたとき、過去の一定期間における前記ホスト装置からの前記第2の論理記憶領域に対するアクセス要求の履歴に基づいて、読み出しを要求されたデータを前記パリティ領域から読み出すか、または、記憶装置の故障前に前記第1の論理記憶領域を構成していた複数の記憶装置のうち前記故障した記憶装置以外の記憶装置に格納されているデータを基に、読み出しを要求されたデータを算出するかを選択することを特徴とする付記2記載のストレージシステム。
(付記4) 前記アクセス制御部は、前記第1の論理記憶領域に前記パリティ領域が組み込まれた状態において、ホスト装置から前記第1の論理記憶領域のうち前記故障した記憶装置に記録されていたデータの読み出しを要求されたとき、前記ホスト装置から受信した前記第2の論理記憶領域に対するアクセス要求のうち未処理のアクセス要求の数に基づいて、読み出しを要求されたデータを前記パリティ領域から読み出すか、または、記憶装置の故障前に前記第1の論理記憶領域を構成していた複数の記憶装置のうち前記故障した記憶装置以外の記憶装置に格納されているデータを基に、読み出しを要求されたデータを算出するかを選択することを特徴とする付記2記載のストレージシステム。
(付記5) 前記復旧制御部は、前記故障した記憶装置が新たな記憶装置に交換されると、前記パリティ領域に格納されたデータを交換された記憶装置に転送し、前記第2の論理記憶領域における前記パリティ領域以外の領域に格納されたデータを基にパリティを計算して、算出されたパリティを前記パリティ領域に書き込むことを特徴とする付記1〜4のいずれか1つに記載のストレージシステム。
(付記6) 前記復旧制御部は、前記第1の論理記憶領域の一部を構成する記憶装置が故障し、前記第2の論理記憶領域としてデータが3重に冗長化された論理記憶領域を選択する際、前記第1の論理記憶装置と同じ重要度またはそれより低い重要度が付与された論理記憶領域を選択することを特徴とする付記1〜5のいずれか1つに記載のストレージシステム。
(付記7) 前記復旧制御部は、前記第1の論理記憶領域の一部を構成する記憶装置が故障し、前記第2の論理記憶領域としてデータが2重に冗長化された論理記憶領域を選択する際、前記第1の論理記憶装置に付与された重要度より低い重要度が付与された論理記憶領域を選択することを特徴とする付記1〜5のいずれか1つに記載のストレージシステム。
(付記8) それぞれ複数の記憶装置の記憶領域によって構成される第1の論理記憶領域および第2の論理記憶領域に対するデータアクセス処理を制御し、前記第1の論理記憶領域および前記第2の論理記憶領域のそれぞれを、パリティを用いてデータが冗長化されるとともに、パリティが複数の記憶装置に分散して配置されるように管理するアクセス制御部と、
前記第1の論理記憶領域の一部を構成する記憶装置が故障したとき、前記第1の論理記憶領域のデータのうち故障した記憶装置に記録されていたデータを生成して、生成したデータを前記第2の論理記憶領域のうちパリティが記録されていたパリティ領域に格納する復旧制御部と、
を有することを特徴とするストレージ制御装置。
(付記9) 前記復旧制御部は、前記生成したデータを前記パリティ領域に格納するとともに、前記アクセス制御部に、前記故障した記憶装置の記憶領域の代わりに前記パリティ領域を前記第1の論理記憶領域に組み込み、データの冗長度を維持した状態で前記第1の論理記憶領域の管理を続行させ、前記第2の論理記憶領域から前記パリティ領域を切り離し、データの冗長度を低下させた状態で前記第2の論理記憶領域の管理を続行させることを特徴とする付記8記載のストレージ制御装置。
(付記10) 前記アクセス制御部は、前記第1の論理記憶領域に前記パリティ領域が組み込まれた状態において、ホスト装置から前記第1の論理記憶領域のうち前記故障した記憶装置に記録されていたデータの読み出しを要求されたとき、過去の一定期間における前記ホスト装置からの前記第2の論理記憶領域に対するアクセス要求の履歴に基づいて、読み出しを要求されたデータを前記パリティ領域から読み出すか、または、記憶装置の故障前に前記第1の論理記憶領域を構成していた複数の記憶装置のうち前記故障した記憶装置以外の記憶装置に格納されているデータを基に、読み出しを要求されたデータを算出するかを選択することを特徴とする付記9記載のストレージ制御装置。
(付記11) 前記アクセス制御部は、前記第1の論理記憶領域に前記パリティ領域が組み込まれた状態において、ホスト装置から前記第1の論理記憶領域のうち前記故障した記憶装置に記録されていたデータの読み出しを要求されたとき、前記ホスト装置から受信した前記第2の論理記憶領域に対するアクセス要求のうち未処理のアクセス要求の数に基づいて、読み出しを要求されたデータを前記パリティ領域から読み出すか、または、記憶装置の故障前に前記第1の論理記憶領域を構成していた複数の記憶装置のうち前記故障した記憶装置以外の記憶装置に格納されているデータを基に、読み出しを要求されたデータを算出するかを選択することを特徴とする付記9記載のストレージ制御装置。
(付記12) 前記復旧制御部は、前記故障した記憶装置が新たな記憶装置に交換されると、前記パリティ領域に格納されたデータを交換された記憶装置に転送し、前記第2の論理記憶領域における前記パリティ領域以外の領域に格納されたデータを基にパリティを計算して、算出されたパリティを前記パリティ領域に書き込むことを特徴とする付記8〜11のいずれか1つに記載のストレージ制御装置。
(付記13) それぞれ複数の記憶装置の記憶領域によって構成される第1の論理記憶領域および第2の論理記憶領域に対するデータアクセス処理を制御し、前記第1の論理記憶領域および前記第2の論理記憶領域のそれぞれを、パリティを用いてデータが冗長化されるとともに、パリティが複数の記憶装置に分散して配置されるように管理するストレージ制御装置におけるストレージ制御方法であって、
前記第1の論理記憶領域の一部を構成する記憶装置が故障したとき、前記第1の論理記憶領域のデータのうち故障した記憶装置に記録されていたデータを生成して、生成したデータを前記第2の論理記憶領域のうちパリティが記録されていたパリティ領域に格納する、
ことを特徴とするストレージ制御方法。
(付記14) 前記第1の論理記憶領域の一部を構成する記憶装置が故障したとき、前記生成したデータを前記パリティ領域に格納するとともに、前記故障した記憶装置の記憶領域の代わりに前記パリティ領域を前記第1の論理記憶領域に組み込み、データの冗長度を維持した状態で前記第1の論理記憶領域の管理を続行し、前記第2の論理記憶領域から前記パリティ領域を切り離し、データの冗長度を低下させた状態で前記第2の論理記憶領域の管理を続行することを特徴とする付記13記載のストレージ制御方法。
(付記15) 前記第1の論理記憶領域に前記パリティ領域が組み込まれた状態において、ホスト装置から前記第1の論理記憶領域のうち前記故障した記憶装置に記録されていたデータの読み出しを要求されたとき、過去の一定期間における前記ホスト装置からの前記第2の論理記憶領域に対するアクセス要求の履歴に基づいて、読み出しを要求されたデータを前記パリティ領域から読み出すか、または、記憶装置の故障前に前記第1の論理記憶領域を構成していた複数の記憶装置のうち前記故障した記憶装置以外の記憶装置に格納されているデータを基に、読み出しを要求されたデータを算出するかを選択することを特徴とする付記14記載のストレージ制御方法。
(付記16) 前記第1の論理記憶領域に前記パリティ領域が組み込まれた状態において、ホスト装置から前記第1の論理記憶領域のうち前記故障した記憶装置に記録されていたデータの読み出しを要求されたとき、前記ホスト装置から受信した前記第2の論理記憶領域に対するアクセス要求のうち未処理のアクセス要求の数に基づいて、読み出しを要求されたデータを前記パリティ領域から読み出すか、または、記憶装置の故障前に前記第1の論理記憶領域を構成していた複数の記憶装置のうち前記故障した記憶装置以外の記憶装置に格納されているデータを基に、読み出しを要求されたデータを算出するかを選択することを特徴とする付記14記載のストレージ制御方法。
(付記17) 前記故障した記憶装置が新たな記憶装置に交換されると、前記パリティ領域に格納されたデータを交換された記憶装置に転送し、前記第2の論理記憶領域における前記パリティ領域以外の領域に格納されたデータを基にパリティを計算して、算出されたパリティを前記パリティ領域に書き込むことを特徴とする付記13〜16のいずれか1つに記載のストレージ制御方法。
(付記18) 前記第1の論理記憶領域の一部を構成する記憶装置が故障し、前記第2の論理記憶領域としてデータが3重に冗長化された論理記憶領域を選択する際、前記第1の論理記憶装置と同じ重要度またはそれより低い重要度が付与された論理記憶領域を選択することを特徴とする付記13〜17のいずれか1つに記載のストレージ制御方法。
(付記19) 前記第1の論理記憶領域の一部を構成する記憶装置が故障し、前記第2の論理記憶領域としてデータが2重に冗長化された論理記憶領域を選択する際、前記第1の論理記憶装置に付与された重要度より低い重要度が付与された論理記憶領域を選択することを特徴とする付記13〜17のいずれか1つに記載のストレージ制御方法。