(57)【特許請求の範囲】
【請求項１】
外部装置からＩ／Ｏリクエストを受信し処理するストレージシステムにおいて、
複数のフラッシュメモリを備えたフラッシュメモリデバイス（ＦＭＤ）を複数個と、
前記複数のＦＭＤのうち、前記受信したＩ／Ｏリクエストで指定されるアクセス先から特定されるＦＭＤにアクセスするコントローラーを備え、
前記コントローラーは、前記複数のＦＭＤの各々の性能情報及び容量情報を管理し、
前記コントローラーは、前記性能情報及び前記容量情報に基づいて、前記複数のＦＭＤのうちの一以上の第１のＦＭＤにより第１のパリティグループを構成し、該第１のパリティグループから一以上の論理ユニットを前記外部装置に提供し、
前記コントローラーは、前記複数のＦＭＤ、前記第１のパリティグループ、前記一以上の論理ユニットのそれぞれの単位で、使用可能か否かを示す閉塞フラグを管理し、
前記コントローラーは、前記第１のパリティグループを構成する一以上の第１のＦＭＤのうちのあるＦＭＤの空き記憶容量の不足を示す通知を該ＦＭＤから受信した場合、該ＦＭＤに対して閉塞フラグを付加し、前記外部装置からのライト要求に対して、代替ＦＭＤを追加した前記第１パリティグループによって処理し、前記外部装置からのリード要求に対して該代替ＦＭＤからデータを読み出すことを特徴とするストレージシステム。
【請求項２】
前記容量情報とは、以下の（１）乃至（３）、
（１）ＦＭＤに備えられているフラッシュメモリの数、
（２）ＦＭＤで採用されるブロックサイズ、
（３）ＦＭＤに備えられている複数のフラッシュメモリの総記憶容量、
のうちの少なくとも一つであることを特徴とする、
請求項１記載のストレージシステム。
【請求項３】
前記複数のＦＭＤの各々のＦＭＤは、前記フラッシュメモリを制御するＩ／Ｏ処理性能の異なるＦＭＤコントローラーをそれぞれ有し、
前記コントローラーは、前記複数のＦＭＤの性能情報として、前記ＦＭＤコントローラーのＩ／Ｏ処理性能の情報を取得することを特徴とする、
請求項１記載のストレージシステム。
【請求項４】
前記複数のＦＭＤには、ベンダー及び／又は製造年度の異なるＦＭＤが含まれることを特徴とする、
請求項１記載のストレージシステム。
【請求項５】
前記複数のＦＭＤに加えて、一又は複数のディスク型記憶装置が混在するが、前記第１のＦＭＤで構成される前記第１のパリティグループには、前記一又は複数のディスク型記憶装置のいずれも存在しないことを特徴とする、
請求項１記載のストレージシステム。
【請求項６】
前記コントローラーは、前記複数の第１のＦＭＤのうちのいずれかのＦＭＤが閉塞したことを検知した場合に、前記第１のパリティグループに適合する前記代替ＦＭＤを検索して該第１のパリティグループに追加し、前記閉塞したＦＭＤ内のデータを復元し、該復元したデータを前記代替ＦＭＤに書き込むことを特徴とする、
請求項１記載のストレージシステム。
【請求項７】
更に、前記第１のＦＭＤと異なる第２のＦＭＤを有し、
前記コントローラーは、一以上の第２のＦＭＤで第２のパリティグループを構成し、
前記第２のＦＭＤは、
複数の第３のＦＭＤと、
前記コントローラーからのアクセスに応じて前記複数の第３のＦＭＤに対するアクセスを制御する第２のＦＭＤコントローラーと
を備え、前記複数の第３のＦＭＤがそれぞれ前記コントローラーに認識され、
前記第３のＦＭＤは、
複数のフラッシュメモリと、
該複数のフラッシュメモリに対する入出力を制御する第３のＦＭＤコントローラーを有した内部コントローラーと
を備え、各第３のＦＭＤコントローラーは、前記第２のＦＭＤコントローラーからのアクセスに応じて前記入出力を制御することを特徴とする、
請求項１記載のストレージシステム。
【請求項８】
前記コントローラーは、前記複数のＦＭＤ毎に、前記ＦＭＤ内の閉塞を示す空き記憶容量の下限となる閾値を管理することを特徴とする、
請求項１記載のストレージシステム。
【請求項９】
前記ＦＭＤコントローラーは、前記コントローラーからの要求に応じて、又は、能動的に、当該ＦＭＤの空き容量の不足を示す通知を前記コントローラに対して送信することを特徴とする、
請求項３記載のストレージシステム。
【請求項１０】
前記ＦＭＤコントローラーは、前記コントローラーに対して、以下の（１）乃至（８）、
（１）ＦＭＤで採用されるブロックサイズ、
（２）ＦＭＤ内で利用可能なフラッシュメモリのブロック数、
（３）ＦＭＤ内の空き記憶容量、
（４）ＦＭＤ内の閉塞を示す空き記憶容量の下限となる閾値、
（５）ＦＭＤ内の閉塞を示す警告通知、
（６）ＦＭＤへ提供される電圧または電力が不足していることを示す通知、
（７）ＦＭＤの内部バスやＦＭＤコントローラーの障害を示す通知、
（８）ＦＭＤ内に格納されたデータのデータ化けを示す通知、
のうちの少なくとも一つの情報を送信することを特徴とする、
請求項３記載のストレージシステム。
【請求項１１】
前記コントローラーが、前記二以上の第２のＦＭＤで構成される前記第２のパリティグループについて、障害有無を第３のＦＭＤ単位で管理する、
請求項７記載のストレージシステム。
【請求項１２】
前記二以上の第２のＦＭＤで構成された前記第２のパリティグループは、複数のサブパリティグループで構成されており、
各サブパリティグループは、前記二以上の第２のＦＭＤのうちの少なくとも一つにおける二以上の第３のＦＭＤにより構成されており、
前記各サブパリティグループにより、一以上の論理的な記憶ユニットが提供され、
前記コントローラ―は、前記複数のサブパリティグループのうちの或るサブパリティグループ内でデータを復元できない場合でも、前記複数のサブパリティグループのうちの障害が発生していない他のサブパリティグループがあれば、該他のサブパリティグループ上に存在する記憶ユニットを閉塞せず入出力を行う、
請求項７記載のストレージシステム。
【請求項１３】
前記二以上の第２のＦＭＤで構成されたパリティグループは、複数のサブパリティグループで構成されており、
各サブパリティグループは、前記二以上の第２のＦＭＤのうちのそれぞれ異なる第２のＦＭＤに存在する第３のＦＭＤにより構成されている、
請求項７記載のストレージシステム。
【請求項１４】
少なくとも一つの第２のＦＭＤには、パリティグループに属しないスペアの第３のＦＭＤが備えられ、
前記コントローラーは、或る第２のＦＭＤで必要が生じた場合には、該第２のＦＭＤに存在する前記スペアの第３のＦＭＤを用いる、
請求項７記載のストレージシステム。
【請求項１５】
前記コントローラーは、前記必要が生じた第２のＦＭＤに、前記スペアの第３のＦＭＤが存在しない場合には、他の第２のＦＭＤに存在する前記スペアの第３のＦＭＤを用いる、
請求項１４記載のストレージシステム。
【請求項１６】
前記コントローラーは、前記必要が生じた第２のＦＭＤに、前記スペアの第３のＦＭＤが存在しない場合には、該第２のＦＭＤが属するパリティグループに適合する別の第２のＦＭＤを検索し、前記第２のＦＭＤ内のデータを前記別の第２のＦＭＤに書き込み、前記第２のＦＭＤを閉塞する、
請求項１４記載のストレージシステム。
【請求項１７】
前記コントローラーは、前記第１のパリティグループの構成要素として前記外部装置から指定された複数の第１のＦＭＤのそれぞれの内部構成が同じか否かをチェックし、同じでない場合には前記外部装置に警告を出力する、
請求項１記載のストレージシステム。
【請求項１８】
前記第１のパリティグループを構成する各第１のＦＭＤのブロックサイズよりも、各論理ユニットのブロックサイズが小さい、
請求項１記載のストレージシステム。
【請求項１９】
キャッシュメモリを更に備え、
前記コントローラ―は、前記Ｉ／Ｏリクエストがリードリクエストの場合に、前記リードリクエストに従って、前記複数のＦＭＤからデータを読出し、読み出したデータを、前記キャッシュメモリに一時蓄積した後に、前記キャッシュメモリに蓄積したデータを前記外部装置に送信し、前記読み出したデータを前記キャッシュメモリに蓄積する際に、前記キャッシュメモリに蓄積するデータの正否をチェックする、
請求項１記載のストレージシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、複数の記憶デバイスを備えたストレージシステムに関する。
【背景技術】
【０００２】
一般に、情報システムでは、記憶デバイスとしてＨＤＤ（ハードディスクドライブ）を用いるストレージシステムが備えられ、そのストレージシステムが、ストレージエリアネットワーク（ＳＡＮ）経由で、複数の上位装置（例えばホスト）からアクセスされる。ストレージシステムでは、ＲＡＩＤ（Redundant Array of Independent (or Inexpensive) Disks）技術に従う記憶制御が行われる。これにより、高信頼な情報システムが実現される。
【０００３】
一方で、近年、フラッシュメモリのビットコストが低下しつつあることから、フラッシュメモリが、有力な記憶デバイスとなりつつある。特許文献１に開示の技術では、フラッシュメモリの欠点である、書き換え回数増加を契機としたライト失敗に対する対策について開示されている。
【特許文献１】特許３５０７１３２号
【発明の開示】
【発明が解決しようとする課題】
【０００４】
ＨＤＤに代えて又は加えてフラッシュメモリを搭載し、フラッシュメモリで、上位装置に書かれる又は読み出されるデータを記憶するストレージシステムが考えられる。たくさんのフラッシュメモリを備えることにより、複数のＨＤＤでのストレージシステムと同程度の記憶容量を有するストレージシステムを実現することが期待できる。
【０００５】
しかし、特許文献１には、書き換え回数増加の対策は開示されているものの、一つの部品障害（閉塞）による対策についての開示は無い。このような対策がされていないと、一つの部品障害によって、フラッシュメモリに記憶されているデータが揮発するおそれがあり、そのため、複数のフラッシュメモリを備えたストレージシステムを大容量にすることはできても、ストレージシステムを高信頼にすることはできない。
【０００６】
本発明は、複数のフラッシュメモリを備えた大容量のストレージシステムを高信頼にすることを目的とする。
【課題を解決するための手段】
【０００７】
本発明に従うフラッシュメモリストレージシステムは、外部装置からＩ／Ｏリクエストを受信し処理するストレージシステムであって、複数のフラッシュメモリを備えたフラッシュメモリデバイス（ＦＭＤ）を複数個と、前記複数のＦＭＤのうち、前記受信したＩ／Ｏリクエストで指定のアクセス先から特定されるＦＭＤにアクセスするＩ／Ｏ処理制御部を有するコントローラーとを備える。
【０００８】
第一の実施態様では、前記複数のＦＭＤのうちの二以上のＦＭＤにより構成されたパリティグループが二つ以上存在することができる。前記複数のＦＭＤには、内部構成が異なるＦＭＤが含まれてもよい。各パリティグループは、同一の内部構成のＦＭＤで構成することができる。
【０００９】
第二の実施態様では、前記第一の実施態様において、前記内部構成とは、以下の（１）乃至（３）、
（１）ＦＭＤに備えられているフラッシュメモリの数、
（２）ＦＭＤで採用されるブロックサイズ、
（３）ＦＭＤに備えられている複数のフラッシュメモリの総記憶容量、
のうちの少なくとも一つとすることができる。
【００１０】
第三の実施態様では、前記第一の実施態様において、前記内部構成として、第一種、第二種及び第三種のうちの少なくとも一種類のＦＭＤタイプを含んだ複数種類のＦＭＤタイプとすることができる。前記第一種のＦＭＤタイプのＦＭＤである第一のＦＭＤは、複数のフラッシュメモリと、該複数のフラッシュメモリに対する入出力を制御する第一のＦＭＤ制御部を有した内部コントローラーとを備えることができる。前記ＦＭＤが該第一のＦＭＤの場合、前記第一のＦＭＤ制御部は、前記Ｉ／Ｏ処理制御部からのアクセスに応じて前記入出力を制御することができる。前記第二種のＦＭＤタイプのＦＭＤである第二のＦＭＤは、複数の前記第一ＦＭＤと、前記Ｉ／Ｏ処理制御部からのアクセスに応じて前記複数の第一ＦＭＤに対するアクセスを制御する第二のＦＭＤ制御部とを備えることができる。前記複数の第一ＦＭＤがそれぞれ前記コントローラーに認識される。各第一ＦＭＤの前記第一のＦＭＤ制御部は、前記第二のＦＭＤ制御部からのアクセスに応じて前記入出力を制御することができる。前記第三種のＦＭＤタイプのＦＭＤである第三のＦＭＤは、複数の前記第一ＦＭＤと、前記Ｉ／Ｏ処理制御部からのアクセスに応じて前記複数の第一ＦＭＤに対するアクセスを制御する第三のＦＭＤ制御部とを備えることができる。前記複数のＦＭＤが一つのデバイスとして前記コントローラーに認識される。各第一ＦＭＤの前記第一のＦＭＤ制御部は、前記第三のＦＭＤ制御部からのアクセスに応じて前記入出力を制御することができる。
【００１１】
第四の実施態様は、前記第三の実施態様において、前記内部構成とは、更に、前記内部コントローラー、前記第二のＦＭＤ制御部及び前記第三のＦＭＤ制御部のうちの少なくとも一つの性能とすることができる。
【００１２】
第五の実施態様では、前記複数のＦＭＤには、ベンダー及び／又は製造年度の異なるＦＭＤが含まれてもよい。
【００１３】
第六の実施態様では、前記第一の実施態様において、前記複数のＦＭＤに加えて、一又は複数のディスク型記憶装置が混在してもよい。前記ＦＭＤが含まれる前記パリティグループには、前記一又は複数のディスク型記憶装置のいずれも存在しないようにすることができる。
【００１４】
第七の実施態様では、各ＦＭＤが、自分の空きの記憶容量の不足を検知し、該不足を検知した場合に、所定のメッセージを通知する情報通知部を更に備えることができる。前記コントローラーが、前記所定のメッセージに応じた制御を実行することができる。
【００１５】
第八の実施態様では、前記第一の実施態様において、前記コントローラーが、構成制御部を更に備えることができる。前記構成制御部が、前記複数のＦＭＤのうちのいずれかのＦＭＤが閉塞したことを検知した場合に、該閉塞したＦＭＤが属するパリティグループを特定し、該パリティグループに適合する別のＦＭＤを検索し、前記閉塞したＦＭＤ内のデータを復元し、該復元したデータを、探し出された別のＦＭＤに書き込むことができる。
【００１６】
第九の実施態様では、前記二以上のパリティグループのうちの少なくとも一つが、二以上の第二ＦＭＤで構成することができる。前記第二ＦＭＤは、複数の第一ＦＭＤと、前記Ｉ／Ｏ処理制御部からのアクセスに応じて前記複数の第一ＦＭＤに対するアクセスを制御する第二のＦＭＤ制御部とを備えることができる。前記複数の第一ＦＭＤがそれぞれ前記コントローラーに認識される。前記第一のＦＭＤは、複数のフラッシュメモリと、該複数のフラッシュメモリに対する入出力を制御する第一のＦＭＤ制御部を有した内部コントローラーとを備えることができる。各第一ＦＭＤの前記第一のＦＭＤ制御部は、前記第二のＦＭＤ制御部からのアクセスに応じて前記入出力を制御することができる。
【００１７】
第十の実施態様では、前記第九の実施態様において、前記コントローラーが、前記二以上の第二ＦＭＤで構成されるパリティグループについて、障害有無を第一ＦＭＤ単位で管理することができる。
【００１８】
第十一の実施態様では、前記第九の実施態様において、前記二以上の第二ＦＭＤで構成されたパリティグループは、複数のサブパリティグループで構成することができる。各サブパリティグループは、前記二以上の第二ＦＭＤのうちの少なくとも一つにおける二以上の第一ＦＭＤにより構成することができる。前記各サブパリティグループにより、一以上の論理的な記憶ユニットが提供される。前記Ｉ／Ｏ処理制御部は、前記複数のサブパリティグループのうちの或るサブパリティグループ内でデータを復元できない場合でも、前記複数のサブパリティグループのうちの障害が発生していない他のサブパリティグループがあれば、該他のサブパリティグループ上に存在する記憶ユニットを閉塞せず入出力を行うことができる。
【００１９】
第十二の実施態様では、前記第九の実施態様において、前記二以上の第二ＦＭＤで構成されたパリティグループは、複数のサブパリティグループで構成することができる。各サブパリティグループは、前記二以上の第二ＦＭＤのうちのそれぞれ異なる第二ＦＭＤに存在する第一ＦＭＤにより構成することができる。
【００２０】
第十三の実施態様では、前記第九の実施態様において、少なくとも一つの第二ＦＭＤには、パリティグループに属しないスペアの第一ＦＭＤを備えることができる。前記コントローラーが、構成制御部を備えることができる。該構成制御部が、或る第二ＦＭＤで必要が生じた場合には、該第二ＦＭＤに存在する前記スペアの第一ＦＭＤを用いることができる。
【００２１】
第十四の実施態様では、前記第十三の実施態様において、前記構成制御部が、前記必要が生じた第二ＦＭＤに、前記スペアの第一ＦＭＤが存在しない場合には、他の第二ＦＭＤに存在する前記スペアの第一ＦＭＤを用いることができる。
【００２２】
第十五の実施態様では、前記第十三の実施態様において、前記構成制御部が、前記必要が生じた第二ＦＭＤに、前記スペアの第一ＦＭＤが存在しない場合には、該第二ＦＭＤが属するパリティグループに適合する別の第二ＦＭＤを検索し、前記第二ＦＭＤ内のデータを前記別の二ＦＭＤに書き込み、前記第二ＦＭＤを閉塞することができる。
【００２３】
第十六の実施態様では、前記コントローラーが、構成制御部を備えることができる。該構成制御部が、パリティグループの構成要素として前記外部装置から指定された複数のＦＭＤのそれぞれの内部構成が同じか否かをチェックし、同じでない場合には前記外部装置に警告を出力することができる。
【００２４】
第十七の実施態様では、前記複数のＦＭＤにより複数個の論理的な記憶ユニットが提供され、各ＦＭＤのブロックサイズよりも、各記憶ユニットのブロックサイズが小さい。
【００２５】
第十八の実施態様では、キャッシュメモリを更に備えることができる。前記Ｉ／Ｏ処理制御部は、前記Ｉ／Ｏリクエストがリードリクエストの場合に、前記リードリクエストに従って、前記複数のＦＭＤからデータを読出し、読み出したデータを、前記キャッシュメモリに一時蓄積した後に、前記キャッシュメモリに蓄積したデータを前記外部装置に送信し、前記読み出したデータを前記キャッシュメモリに蓄積する際に、前記キャッシュメモリに蓄積するデータの正否をチェックすることができる。
【００２６】
第十九の実施態様では、複数のアドレス空間を階層化することができる。各レイヤでのブロックサイズを異なるようにすることができる。レイヤとして、フラッシュメモリと、ＦＭＤと、二以上のＦＭＤにより構成されたパリティグループと、前記外部装置に提供される論理的な記憶ユニットとがある。
【００２７】
第二十の実施態様では、前記ＦＭＤは、ディスクのインターフェースと互換性のあるＩ／Ｏインターフェースを有することができる。
【００２８】
第二十一の実施態様では、前記ＦＭＤは、各フラッシュメモリに対する入出力を制御するＦＭＤ制御部を有した内部コントローラーを備えることができる。前記ＦＭＤ制御部は、フラッシュメモリにデータを書く場合には、所定の規則に従って、最近書いたフラッシュメモリ以外のフラッシュメモリに書くことができる。また、この場合、前記ＦＭＤ制御部は、フラッシュメモリにおける更新前のブロックを空き領域とすることができる。また、前記ＦＭＤ制御部は、空き領域としたブロックを、イレースコマンドで書込み可能とするために、複数ブロックを集めたセグメント単位でブロックデータを移動し、セグメント全体を空き領域として、イレースコマンドを実行することができる。
【００２９】
上述した各部は各手段と言い換えてもよい。各部或いは各手段は、ハードウェア（例えば回路）、コンピュータプログラム、或いはそれらの組み合わせ（例えば、コンピュータプログラムを読み込んで実行する一又は複数のＣＰＵ）によって実現することもできる。各コンピュータプログラムは、コンピュータマシンに備えられる記憶資源（例えばメモリ）から読み込むことができる。その記憶資源には、ＣＤ−ＲＯＭやＤＶＤ（Digital Versatile Disk）等の記録媒体を介してインストールすることもできるし、インターネットやＬＡＮ等の通信ネットワークを介してダウンロードすることもできる。
【００３０】
また、上述したコントローラー及び内部コントローラーのうちの少なくとも一つは、一又は複数のハードウェア資源で構成することができる。具体的には、例えば、一又は複数の回路基盤で構成することができる。
【発明の効果】
【００３１】
本発明によれば、複数のフラッシュメモリを備えた大容量のストレージシステムを高信頼にすることができる。
【発明を実施するための最良の形態】
【００３２】
以下、図面を参照して、本発明の実施の形態を説明する。
【００３３】
＜１．情報システムの構成＞。
【００３４】
図１は、本発明の一実施形態に係る情報システムのハードウェア構成の一例を示す図である。
【００３５】
情報システムは、例えば、ストレージシステム１０００、ホストコンピュータ（以後ホストと省略する）１１００及び管理サーバー１２００から構成される。ストレージシステム１０００、ホスト１１００及び管理サーバー１２００の数は、それぞれ、１以上とすることができる。ストレージシステム１０００とホスト１１００は、I/Oネットワーク１３００を介して、相互に接続される。ストレージシステム１０００と管理サーバー１２００は、管理ネットワーク（図示せず）またはI/Oネットワーク１３００を介して、相互に接続される。
【００３６】
ホスト１１００には、ホスト内部ネットワーク１１０４があり、そのネットワーク１１０４に、プロセッサ（図中ではProcと略記）１１０１と、メモリ（図中ではMemと略記）１１０２と、I/Oポート（図中ではI/O Pと略記）１１０３とが接続されている。管理サーバー１２００も、ホスト１１００と同じハードウェア構成を有することができる。
【００３７】
管理サーバー１２００は、表示装置を有し、その表示装置に、ストレージシステム１０００の管理用の画面を表示することができる。また、管理サーバー１２００は、管理操作リクエストを、ユーザー（例えば管理サーバー１２００のオペレーター）から受付け、その受け付けた管理操作リクエストを、ストレージシステム１０００に送信することができる。管理操作リクエストは、ストレージシステム１０００の操作のためのリクエストであり、例えば、パリティグループ作成リクエスト、内部LU作成リクエスト、及びパス定義リクエストがある。それぞれのリクエストについては、後述する。
【００３８】
I/Oネットワーク１３００は、ファイバーチャネルによる接続が第一に考えられるが、それ以外でも、ＦＩＣＯＮ（FIbre CONnection：登録商標）やEthernet（登録商標）とＴＣＰ／ＩＰとｉＳＣＳＩの組み合わせや、EthernetとNFS(Network File System)やCIFS(Common Internet File System)等のネットワークファイルシステムの組み合わせ等が考えられる。さらに、I/Oネットワーク１３００は、I/Oリクエストを転送可能な通信装置であればこれ以外でもよい。
【００３９】
ストレージシステム１０００は、コントローラー（図中はCTLと表記）１０１０と、キャッシュメモリ（図中はCache/Shared Memと表記）１０２０と、複数のフラッシュメモリデバイス（Flash Memory Device:以後FMDと省略することがある）１０３０とを備える。好ましい形態としては、コントローラー1010及びキャッシュメモリ1020は、それぞれ複数のコンポーネントから構成することが考えられる。なぜなら、コンポーネント単体に障害が発生して閉塞した場合でも、残りのコンポーネントを用いてリードやライトに代表されるI/Oリクエストを引き続き受けることができるためである。
【００４０】
コントローラー１０１０は、ストレージシステム１０００の動作を制御する装置（例えば回路基盤）である。コントローラー１０１０には、内部ネットワーク１０１６があり、そのネットワーク１０１６に、I/Oポート１０１３、キャッシュポート（図中ではC Pと表記）１０１５、管理ポート（図中ではM Pと表記）１０１６、バックエンドポート（図中ではB/E Pと表記）１０１４、プロセッサ（例えばＣＰＵ）１０１１及びメモリ１０１２が接続されている。コントローラー１０１０同士とキャッシュメモリ１０２０は、ストレージ内部ネットワーク１０５０にて相互に接続される。また、コントローラー１０１０と各FMD１０３０は、複数のバックエンドネットワーク１０４０にて相互接続される。
【００４１】
なお、ホスト1100及びストレージシステム１０００の内部のネットワークは、好ましくは、I/Oポート１０１３の有する転送帯域より広帯域であり、また、バスやスイッチ型のネットワークによって全てまた一部が代替されてもよい。また、図１では、I/Oポート1013は、コントローラー１０１０に一つ存在することになっているが、実際には、複数のI/Oポート1013がコントローラー１０１０に存在してもよい。
【００４２】
以上のハードウェア構成によって、ストレージシステム１０００のFMD1030に保存された全てまたは一部のデータを、ホスト１１００が読出したり書き込んだりすることができるようになる。
【００４３】
図４は、ホスト１１００とストレージシステム１０００のそれぞれに存在するコンピュータプログラムと情報を示す図である。
【００４４】
コントローラー１０１０では、プロセッサ１０１１とメモリ１０１２とI/Oポート１０１３とバックエンドポート１０１４とキャッシュポート１０１５とのうちの少なくとも一つによって、FMD情報４０５０とPG構成情報４０６０と内部LU構成情報４０７０とＬＵパス情報４０８０を保持し、且つ、I/O処理プログラム４０１０とキャッシュ制御プログラム４０２０と構成制御プログラム４０３０を実行する。なお、コントローラー１０１０で保持される情報の一部または全ては、ストレージシステム１０００内部でコントローラー１０１０外部の領域（例えばキャッシュメモリ１０２０や、FMD１０３０の一部）にて保持されてもよい。
【００４５】
以下、プログラムが主語になる場合は、実際にはそのプログラムを実行するプロセッサによって処理が行われるものとする。
【００４６】
Ｉ／Ｏ処理プログラム４０１０は、ホスト１１００からＩ／Ｏリクエスト（例えばリードコマンド又はライトコマンド）を受け、そのI/Oリクエストに従う処理を実行する。具体的には、例えば、Ｉ／Ｏ処理プログラム４０１０は、キャッシュメモリ１０２０に保存されたデータ（リードコマンドに従う読出し対象データ）を、ホスト１１００へ転送したり、ホスト１１００から受信したデータ（ライトコマンドに従う書込み対象データ）を、キャッシュメモリ１０２０へ保存する。なお、ホスト１１００からのＩ／Ｏリクエストがブロックアクセス形式の場合は、Ｉ／Ｏ処理プログラム4010は、アクセス対象である論理ボリューム（例えばSCSIでの論理ユニット(Logical Unit:LU))を提供するための処理も行うことができる。また、ホスト１１００からのＩ／Ｏリクエストがファイル形式の場合は、Ｉ／Ｏ処理プログラム4010は、アクセス対象であるファイルやディレクトリを提供するための処理を行うことができる。なお、Ｉ／Ｏ処理プログラム4010は、前記以外のＩ／Ｏリクエスト（例えば、データベースクエリーやＣＫＤ形式のＩ／Ｏリクエスト）でのアクセスを提供するために必要な処理を行っても良い。
【００４７】
キャッシュ制御プログラム４０２０は、Ｉ／Ｏ処理プログラム４０１０と連動または自立的に、ＦＭＤ１０３０が保存するデータをキャッシュメモリ１０２０へコピー（移動を含む）したり、キャッシュメモリ１０２０が保存するデータをＦＭＤ１０３０へコピーしたりすることができる。キャッシュ制御プログラム４０２０は、さらに、信頼性を向上させるための処理として、例えば、ＲＡＩＤに代表される冗長化データを、キャッシュメモリ１０２０に保存されたデータから作成する及び／又は更新することを行ってもよい。
【００４８】
構成制御プログラム４０３０は、構成変更及び／又は構成参照のリクエストに応答して、ＦＭＤ情報４０５０、ＰＧ構成情報４０６０、内部ＬＵ構成情報４０７０及びＬＵパス情報４０８０のうちの少なくとも一つを参照及び／又は更新する処理を行うことができる。構成変更及び／又は構成参照のリクエストは、例えば、管理サーバー１２００、ホスト１１００及びその他コンピュータのうちの少なくとも一つから発行される。
【００４９】
ＦＭＤ情報４０５０は、ＦＭＤ１０３０に関する情報を含む。ＰＧ構成情報４０６０は、パリティグループ（Parity Group: 以後PGと省略することがある）の構成情報を含む。内部ＬＵ構成情報４０３０は、パリティグループに含まれるＦＭＤの一部または全ての領域を内部的な論理ユニット（以後「内部ＬＵ」と省略する）として構成するための情報を含む。ＬＵパス情報は、内部LUとＩ／Ｏポート1013がホスト１１００に対して提供するLUとの間の対応関係を表す情報を含む。なお、以後の説明では、内部ＬＵは一つのパリティグループの領域に対応する場合を中心に説明するが、本発明はこれに限定されるものではない。内部ＬＵは、複数のパリティグループの領域からConcatenateやストライピングを伴って構成されてもよい。
【００５０】
ホスト１１００では、プロセッサ１１０１とメモリ１１０２とI/Oポート１１０３の少なくとも一つによって、OS４１０１とファイルシステム４１０２とアプリケーションプログラム（以後アプリケーションと省略する）４１０３の少なくとも一つが実行される。
【００５１】
アプリケーション４１０３は、ＯＳ４１０１やファイルシステム４１０２に依頼することで、ファイル等のデータを読み書きしつつ、ユーザーや他のコンピュータからのリクエストに応じて業務処理等を行うプログラム（例えばＷｅｂサーバープログラムやデータベース管理プログラム）である。
【００５２】
ＯＳ４１０１は、アプリケーション４１０３やファイルシステム４１０２から発行されるＩ／Ｏリクエストを、ストレージシステム１０００のI/Oポート１０１３へ送信したり、データをストレージシステム１０００から受信したりすることができる。ファイルシステム４１０２は、アプリケーションからのファイル形式のＩ／Ｏリクエストを、ブロック形式のＩ／Ｏリクエストやネットワークファイルシステムプロトコル形式のI/Oリクエストに変換してOS4101へI/Oリクエストの転送を依頼することができる。
【００５３】
なお、ホスト１１００は、これ以外のプログラムが実行されていてもよい。また、ホスト１１００は、ブロックＩ／ＯリクエストやファイルＩ／Ｏリクエスト以外にデータベースクエリーやＣＫＤ方式のリクエストを送信及び受信してもよい。また、ホスト１１００やコントローラー１０１０で実行されるＯＳやファイルシステムを含めたプログラムは、一部または全ての処理をハードウェアにて実装されてもよい。
【００５４】
＜２．本実施形態の概要＞。
【００５５】
フラッシュメモリ（以後ＦＭと省略することがある）は、ＨＤＤとは異なり、ヘッドシークや回転待ちが存在しないため、ランダムアクセスに適したブロック型の記憶デバイスである。しかし、フラッシュメモリは、パッケージ（半導体部品形式での提供形態をさす、以下、FMパッケージと言うこともある）単体では、データ容量や物理的な大きさがＨＤＤより小さい。そのため、ＨＤＤの交換では、保守員やユーザーが手でＨＤＤを引き抜くことができたが、フラッシュメモリをパッケージ単位で交換しようとした場合は、ピンセット等の特殊な工具で交換が必要となり、現実的でないと考えられる。そのため、ストレージシステム１０００の中の全FMパッケージを交換可能とするために、FMパッケージの配置方法を考え直す必要がある。
【００５６】
そこで、本実施形態では、複数のフラッシュメモリパッケージ（以後FMPと省略することがある）を一つのモジュールとする。そのモジュールが、FMD1030である。FMD1030は、一つのFMパッケージよりもデータ容量も物理的な大きさも増加した一つの保守部品である。好ましくは、ＦＭＤ1030は、ＨＤＤのインターフェースと互換性のあるＩ／Ｏインターフェースを有し、ＨＤＤが内蔵されていた部位にも内蔵可能な形状とすることで、ストレージシステムの保守に必要な作業の一部またはすべてをＨＤＤの場合と同一にすることができるようにすることも考えられる。
【００５７】
さらに、本実施形態では、ＦＭＤ1030に障害が発生した場合のデータ消失の回避とＩ／Ｏ性能の向上等の理由で、一つ以上（好ましくは複数）のＦＭＤでパリティグループが構成される。
【００５８】
なお、この場合、Ｉ／Ｏ性能（例えば、レスポンスタイム、転送帯域、ＩＯＰＳ（１秒当たりのI/Oリクエストの処理数）等）が大きく異なるＦＭＤ１０３０同士でパリティグループを構成してしまうと、ホスト1100にとっては一つのLUとして提供されているにもかかわらず、I/Oリクエストによってアクセスするアドレスによって、Ｉ／Ｏ性能が変化し得る。HDDを搭載したストレージシステムでは、I/O性能の変化を回避するための方法として、例えば、Ｉ／Ｏ性能が同一または近いＨＤＤ同士でパリティグループを構成する方法が考えられる。この方法の実現のためには、例えば、種類（例えば、型番或いはサポートインターフェース）が同じまたは近いＨＤＤを用いたり、性能（例えば、回転数やヘッド移動時間）が同じまたはその差が小さいＨＤＤを用いたりして、パリティグループを構成することが考えられる。
【００５９】
しかし、ＦＭＤは、半導体で構成された記憶デバイスのために、回転数やヘッド移動時間がない。
【００６０】
そこで、本実施形態では、こうした性能関連のパラメーターとして、ＦＭＤに含まれるフラッシュメモリパッケージの数を用いる。なぜならば、ＦＭＤ1030のＩ／Ｏポートの限界性能は、FMP単体の限界性能より高いため、FMP数が多いＦＭＤ1030のほうが、よりＩ／Ｏ性能が高くなる傾向があると考えられるからである。
【００６１】
図３は、本実施形態の概要を示す図である。
【００６２】
ストレージシステム１０００に４つの同一容量のＦＭＤ１０３０−１〜１０３０−４が備えられる場合を例として説明する。ここで、ＦＭＤ１０３０−１とＦＭＤ１０３０−２は内部に２つのFMPを有し、ＦＭＤ１０３０−３とＦＭＤ１０３０−４は内部に４つのFMPを有すものとする。
【００６３】
コントローラー１０１０は、パリティグループ構成を定義する場合に、それぞれのＦＭＤから、FMDの構成に関する情報（以下、FMD構成情報、例えば、FMPの数または型番）を取得することで、図中のパリティグループ１、２のように、同じFMP数を有するＦＭＤの集合としてのパリティグループを作成する。コントローラー１０１０は、さらに、パリティグループの一部の領域を論理ユニットとしてホストに提供することができる。それにより、ホストからその論理ユニットに対するアクセスを受け付けることができる。
【００６４】
なお、ストレージシステム１０００では、上記パリティグループ１とパリティグループ２の構成によって記憶階層を作ることができる。その場合の使い分けとして、例えば、更新が頻繁なデータが、FMP数の多いパリティグループ２に記憶されるようにし、それより更新が頻繁でないデータが、FMP数の少ないパリティグループ１に記憶されるように、コントローラー１０１０或いはホスト１１００が制御してもよい。
【００６５】
なお、一つのストレージシステム１０００に搭載される各FMD1030のFMP数は同一でも良いが、以下に例示する理由から、異なるFMP数を持つＦＭＤ１０３０が一つのストレージシステム１０００に混在することになるケースが多いと考えられる。
【００６６】
（混在理由１）ストレージシステム１０００は一般に大規模である。例えば、大規模エンタープライズストレージでは、多くのＦＭＤを搭載する必要があるために、内部構成の異なるＦＭＤを混在して用いることが考えられる。
【００６７】
（混在理由２）FMPのベンダー毎の製造能力に差がある。この場合、ベンダー毎にFMPに内蔵できる記憶容量が異なるため、同一容量のＦＭＤを製造したとしても、FMDに搭載されるFMP数が異なる。そのため、保守作業としてＦＭＤの交換作業を行う場合、異なるベンダーの同容量のデバイスを利用するとＦＭＰの数が異なり、性能が変わることがある。
【００６８】
（混在理由３）FMPの製造時期に差がある。同一ベンダーが製造した場合でも、半導体技術の進歩によって、FMPに内蔵可能な記憶容量が異なるため、同じベンダーの同一容量のＦＭＤであっても、FMDに搭載されるFMP数が異なる。そのため、保守作業としてＦＭＤの交換作業を行う場合、例え同一ベンダーの同容量のデバイスを利用したとしても、製造時期が異なるとＦＭＰの数が異なり、性能が変わることがある。具体的には、例えば、製造年度の異なるＦＭＤが混在している場合に、保守において、最も製造年度の古いＦＭＤを、ストレージシステムに存在しない最新の製造年度のＦＭＤに交換する場合が考えられる。
【００６９】
また、図には記していないが、ストレージシステム１０００に、ＦＭＤ１０３０とＨＤＤが混在した構成としてもよい。その場合、ＨＤＤとＦＭＤ１０３０では、Ｉ／Ｏ特性（例えば、ランダムアクセスかシーケンシャルアクセスか、ライトが多いのかリードが多いのか）が異なるため、ＨＤＤ同士でパリティグループを構成し、ＦＭＤについては、本実施形態で説明するパリティグループとすることができる。つまり、HDDのパリティグループとFMDのパリティグループとが一つのストレージシステム１０００に混在してもよい。
【００７０】
なお、今後の技術の発展方向によっては、ＦＭＤのＩ／Ｏ性能が、フラッシュメモリパッケージの数ではなく、フラッシュメモリパッケージ内部のコントローラーの性能（特に、例えば、プロセッサの性能）がネックとなる可能性もある。これに対応するには、以後説明を行う情報や処理についてのフラッシュメモリパッケージの数に関連する部分を、ＦＭＤ内部のコントローラーの性能に置き換えればよい。例えば、FMD内部のコントローラーの性能を外部に提供し、コントローラー１０１０は、FMD内部のコントローラー性能が同一（完全同一だけでなく近いことも含む）FMD同士でパリティグループを構成する方法が考えられる。
【００７１】
＜３．詳細＞。
【００７２】
＜３．０．ブロックサイズ＞。
【００７３】
より詳細な説明に入る前に、本実施形態におけるブロックサイズについて、図２０を用いて説明する。本実施形態では、アドレス空間（正確には、デバイスの識別子とデバイス内のアドレス空間を指す）が、以下の４レイヤに分かれており、それぞれのレイヤで、異なるブロックサイズを採用することができる。
【００７４】
（レイヤ１）FMPにアクセスするときに用いるアドレス空間。以後の説明で、本レイヤを明示する時は、単語の末尾に'[P]'をつけることがある。
【００７５】
（レイヤ２）FMD１０３０にアクセスする時に用いるアドレス空間。FMD１０３０は、FMPとは異なるブロックサイズを採用することがある。なぜなら、FMD１０３０は、複数のFMPから構成されており、また、後述するフラッシュメモリの特徴を回避するためである。以後の説明で、本レイヤを明示する時は、単語の末尾に'[D]'をつけることがある。
【００７６】
（レイヤ３）コントローラー１０１０がキャッシュメモリ１０２０上のデータを管理するための、パリティグループに割り当てられたアドレス空間。本実施形態では、さまざまなブロックサイズを持つFMD１０３０がコントローラー１０１０に接続されることが考えられる。そこで、I/O処理やキャッシュ制御処理ではそのような異なるブロックサイズをできるだけ考慮しなくてもよい様に、コントローラー１０１０が、所定のブロックサイズ（例えば、SCSIで最も一般的な最小ブロックサイズである５１２バイト）でパリティグループにアドレス空間を割り当てることができる。そのために、キャッシュメモリ１０２０とFMD１０３０間でデータをコピーするステージングやデステージング処理の時点でブロックサイズの変換が行われる。以後の説明で、本レイヤを明示する時は、単語の末尾に'[G]'をつけることがある。
【００７７】
（レイヤ４）LU（または後述する内部LU）にアクセスする時に用いるアドレス空間。ホスト１１００に対して５１２バイトのブロックサイズ以外のLUを提供することがあるために、キャッシュのレベルとは異なるブロックサイズが採用される。以後の説明で、本レイヤを明示する時は、単語の末尾に'[L]'をつけることがある。なお、レイヤ１からレイヤ４までの各ブロックには制御用のデータまたは冗長コードが含まれることがある（例えば、コントローラー１０１０は、データと共に冗長コードをＦＭＤ１０３０のブロック[D]に保存するようにI/Oリクエストを発行する）。
【００７８】
＜３．１．ＦＭＤ＞。
【００７９】
＜３．１．１．概要＞。
【００８０】
図２は、ＦＭＤのハードウェア構成及びソフトウェア構成のそれぞれの一例について示した図である。
【００８１】
ＦＭＤ１０３０は、Ｉ／Ｏポート２０３０と、ＦＭＤコントローラー２０１０と、複数のFMP２０２０とを備える。Ｉ／Ｏポート２０３０は、バックエンドネットワーク１０４０と、ＦＭＤコントローラー２０１０とに接続される。ＦＭＤコントローラー２０１０は、複数のＦＭＰ２０２０に接続される。
【００８２】
なお、好ましくは、ＦＭＤ１０３０は、複数のＩ／Ｏポート２０３０を備える。なぜならば、バックエンドネットワーク１０４０が冗長化されているために、冗長化された各々のバックエンドネットワーク１０４０とＦＭＤ１０３０が独立の部品で接続されたほうが冗長性維持のためには望ましいからである。
【００８３】
ところで、FMP２０２０は、前述の特徴以外に、ＨＤＤやＤＲＡＭ（Dynamic Random Access Memory）には無い以下に例示する（Ａ１）乃至（Ａ４）の特徴を有する
（Ａ１）アクセス単位はブロックである。
（Ａ２）ブロックデータを更新する場合、複数ブロックをまとめたセグメント単位でデータを削除するイレースコマンドの使用が必要である。
（Ａ３）同一ブロックに更新を繰り返すと更新処理が失敗することがある。
（Ａ４）更新を契機として別ブロックのデータ化けが発生することがある。
【００８４】
これらの特徴を考慮したＩ／Ｏ処理（コントローラー１０１０からのＩ／Ｏリクエストに応じてデータ更新や読み出し等）を行うために、ＦＭＤコントローラー２０１０には、例えば、ＦＭＤ  Ｉ／Ｏ処理プログラム２０１１やＦＭＤ内部構成情報通知プログラム２０１４やＦＭＤアドレス変換情報２０１２やＦＭＤ内部構成情報２０１３が備えられる。また、上記特徴に鑑み、ＦＭＤ１０３０は、複数のＦＭＰ２０２０の総記憶容量より少ない記憶容量をコントローラー１０１０へ報告することで、予備領域を確保することができる。
【００８５】
ＦＭＤアドレス変換情報２０１２は、FMDコントローラー２０１０が受信するＩ／Ｏリクエストに含まれるブロックアドレスとFMP２０２０のブロックの対応関係を含む。例えば、ＦＭＤアドレス変換情報２０１２は、以下に例示する種類（Ｂ１）及び（Ｂ２）の情報を各論理ブロックアドレス単位に持つことが考えられる。
（Ｂ１）アドレス[D]のデータが実際に保存されているFMPの識別子とアドレス[P]。
（Ｂ２）アドレス[D]が参照された回数。
【００８６】
ＦＭＤ内部構成情報２０１３は、各フラッシュメモリパッケージの障害状況を管理する情報で、好ましくは、各FMP２０２０内のセグメントを一つ以上集めた領域単位で以下に例示する種類（Ｃ１）及び（Ｃ２）の情報を保持している。
（Ｃ１）障害状況。
（Ｃ２）イレース済みフラグ。
【００８７】
当該情報２０１３は、また、FMDとしてコントローラー１０１０に提供する記憶領域（言い換えればアドレス空間）の属性（例えば、ブロックサイズ[D]、ブロック数[D]）と、空きブロックを管理するための情報を保持している。
【００８８】
ＦＭＤ Ｉ／Ｏ処理プログラム２０１１は、Ｉ／Ｏポート２０３０を通じてＦＭＤコントローラー２０１０が受信したＩ／Ｏリクエストを解析し、FMP２０２０が保存するデータの更新や、FMPからデータを読み出し後にコントローラー１０１０へのデータ転送等を行う。
【００８９】
＜３．１．２．ＦＭＤのＩ／Ｏ処理＞。
【００９０】
以下に、ＦＭＤ Ｉ／Ｏ処理プログラム２０１１の処理内容を示す。
【００９１】
（Ｓｔｅｐ１）ＦＭＤ  Ｉ／Ｏ処理プログラム２０１１は、Ｉ／Ｏリクエストを受信する。
【００９２】
（Ｓｔｅｐ２）もし、リクエストがリードリクエストの場合、ＦＭＤ  Ｉ／Ｏ処理プログラム２０１１は、当該リクエストに含まれる開始論理ブロックアドレス[D]とブロック長[D]とＦＭＤアドレス変換情報から、データが保存されている一つ以上のフラッシュメモリパッケージ２０２０と当該パッケージ内のブロック [P]を特定し、特定したブロック[P]からデータを読み出して、読み出したデータを、リクエスト送信元（コントローラー１０１０）に返し、Ｓｔｅｐ１へ戻る。もし、リクエストがライトリクエストの場合は、ＦＭＤ  Ｉ／Ｏ処理プログラム２０１１は、受信したブロックデータ毎にＳｔｅｐ３以降を実行する。
【００９３】
（Ｓｔｅｐ３）ＦＭＤ  Ｉ／Ｏ処理プログラム２０１１は、最近データ保存したFMP２０２０の次のＦＭＰから、以下の条件（Ｄ１）乃至（Ｄ３）の全てを満たすブロック[P]を検索する。
（Ｄ１）障害が発生していないこと。
（Ｄ２）空き領域である。
（Ｄ３）イレースコマンド実施済みのセグメントに含まれる。
【００９４】
なお、最近データ保存したＦＭＰ２０２０は、例えば、ＦＭＤ内部構成情報２０１３に、ＦＭＤ１０３０に搭載される各ＦＭＰ２０２０に対応したフラグエリアを設け、最近データ保存したＦＭＰに対応するフラグエリアに、フラグを立て（例えば"１"を書き）、その前にデータ保存したＦＭＰに対応するフラグエリアのフラグを倒す（例えば"１"を"０"に変える）ことで、特定することができる。他の方式としては、ＦＭＤコントローラー２０１０がＦＭＰへデータ保存をした時点で当該コントローラー内部にＦＭＰの識別子を保存することでも特定することができる。また、次のＦＭＰとは、例えば、前回データ保存したＦＭＰ２０２０の番号より１大きい番号のＦＭＰとすることができる。
【００９５】
上記条件に適合するブロック[P]が当該ＦＭＰから見つからない場合は、ＦＭＤ  Ｉ／Ｏ処理プログラム２０１１は、更に次のＦＭＰから検索を繰り返す。
【００９６】
（Ｓｔｅｐ４）ＦＭＤ  Ｉ／Ｏ処理プログラム２０１１は、見つけたブロック[P]に対して、ライトデータ（ライトリクエストに従うライト対象のデータ）の一部またはすべてを保存する。なお、当該プログラム２０１１は、保存処理に付随して以下の（Ｅ１）及び（Ｅ２）のいずれかまたはすべての処理を行ってもよい。
（Ｅ１）保存前に、ライトデータからLRC（Longitudinal Redundancy Check）やCRC（Cyclic Redundancy Check）等の冗長コードを計算し、その冗長コードと共にライトデータを保存する。なお、当該冗長コードは、リードリクエスト受付時に、データ化けの有無を確認するために使うもので、データ化けが発生した場合は、当該リードリクエストでエラーを返し、ＦＭＤ内部構成情報２０１３に、ブロック障害が発生したことを記録する。
（Ｅ２）保存後に、FMP２０２０から当該ブロックデータを読み込んで比較を行う。比較が失敗した場合は、ＦＭＤ内部構成情報２０１３にブロックに障害が発生したことを記録し、再びＳｔｅｐ３からやり直す。
【００９７】
（Ｓｔｅｐ５）ＦＭＤ  Ｉ／Ｏ処理プログラム２０１１は、アドレス変換情報２０１２のブロックアドレス[D]に対応するFMP２０２０とブロックアドレス[P]を、新たにデータ保存したFMPのブロック[P]を示すように更新し、更新前のブロック[P]は空き領域とする。
【００９８】
なお、ＦＭＤ  Ｉ／Ｏ処理プログラム２０１１は、別処理として、新たに空き領域となったブロックをイレースコマンドで書き込み可能にする処理（イレース処理）を実行することが考えられる。しかし、イレースコマンドは、複数ブロックを集めたセグメント単位でしか実行できないため、ブロックデータ移動によってセグメント全体を空き領域としてからイレースコマンドを実行し、完了した後に、FMD内部構成情報２０１３に、イレース済みフラグを立てる（すなわちイレース済みセグメントであることを記録する）ことが考えられる。当該処理は、リクエスト処理と連動あるいは非同期のタイミングで繰り返し行うことができる。
【００９９】
なお、これまで説明してきたイレース処理やリードやライトの処理方法については、前記（Ａ１）から（Ａ４）の特徴に鑑み、以下の（Ｆ１）乃至（Ｆ４）の一部または全ての条件を備えていれば、ほかの処理で代替されてもよい。
（Ｆ１）フラッシュメモリパッケージ内の同一ブロックへの更新集中の回避。
（Ｆ２）フラッシュメモリパッケージ内のブロック上書き前のイレース処理の実行。
（Ｆ３）冗長コードを伴ったデータ化けの検知及び修復。
（Ｆ４）複数のフラッシュメモリパッケージへのアクセスを分散可能とする処理（例えば、特許３５０７１３２号に記載の方法）。
【０１００】
＜３．１．３．ＦＭＤ内部構成情報通知プログラム＞。
【０１０１】
ＦＭＤ内部構成情報通知プログラム２０１４は、ＦＭＤの内部情報をコントローラー１０１０等に通知するプログラムである。当該プログラム２０１４が提供する情報の例を、以下（Ｇ１）乃至（Ｇ８）に示す。
（Ｇ１）ＦＭＤ1030のブロックサイズ[D]（コントローラー１０１０は、当該ブロックサイズ単位でアクセスを行ってくる）。
（Ｇ２）ＦＭＤの利用可能ブロック数[D]（コントローラー１０１０は、当該ブロック数とブロックサイズ[D]から利用可能な記憶容量を知ることがある）。
（Ｇ３）ＦＭＤ内部の空き記憶容量（またはブロック数）。当該記憶容量を提供する処理としては、ＦＭＤ内部構成情報２０１３での障害が発生したセグメント数（またはブロック数）を求めて以下の計算、
空きブロック数＝（全フラッシュメモリパッケージのブロック数）−（障害発生ブロック数）−（（Ｇ２）に記載のブロック数）
が行われればよい。なお、フラッシュメモリパッケージの一部の領域を管理用や内部冗長化等に用いている場合は、そのブロック数を考慮して（例えば減じて）計算してもよい。また、上記計算式は、FMPのブロックサイズを基準としているため、情報提供に当たってはFMDのブロックサイズに換算して提供することができる。
（Ｇ４）スレッショルド値。
（Ｇ５）（Ｇ３）の空きブロック数[D]を（Ｇ２）の利用可能ブロック数[D]で割った値が（Ｇ４）のスレッショルド値以下になった場合の警告。なお、この警告は、例えば、ＨＤＤが障害発生時に提供していた警告と同じ値を提供することで、ＨＤＤをエミュレーションしてもよい。
（Ｇ６）ＦＭＤ1030が搭載するFMP数。または、ＦＭＤ１０３０が搭載するFMP数から障害によって利用できないと判断したＦＭＰ数を引いた数。その他、ＦＭＤ内部構成情報通知プログラム２０１４は、以下の場合等に、Ｉ／Ｏリクエストのエラーメッセージをコントローラー１０１０へ通知してもよい。
（Ｇ７）ＦＭＤ１０３０へ提供される電圧または電力が不足していることや、ＦＭＤ１０３０の内部バスやＦＭＤコントローラー２０１０の破損。
（Ｇ８）ＦＭＤコントローラー２０１０による、FMPに保存されたデータのデータ化けの検知。
【０１０２】
＜３．２．ストレージシステムで管理する情報＞。
【０１０３】
図５は、コントローラー１０１０にて保存されるＦＭＤ情報４０５０の構成例を示す図である。
【０１０４】
ＦＭＤ情報４０５０は、それぞれのＦＭＤ１０３０に対応するＦＭＤ１０３０の識別子毎に以下の（Ｈ１）乃至（Ｈ５）の情報を持つ。
（Ｈ１）閉塞フラグ。閉塞フラグは、当該ＦＭＤに対して使用不可能な状況（たとえば、ハードウェア障害や、ＦＭＤ１０３０を抜き取った場合や、図２に示すＦＭＤ１０３０の場合は空き容量が少ないことによってコントローラー１０１０が報告を受けた場合）の場合にＹｅｓとなり、そうではない場合に、Ｎｏとなる。
（Ｈ２）ＷＷＮ（World Wide Name）。ＦＭＤ１０３０にアクセスするために必要なＦｉｂｒｅＣｈａｎｎｅｌの通信識別子。なお、実際のＦｉｂｒｅＣｈａｎｎｅｌではＷＷＮからＰｏｒｔ番号を作成して、その値を使って通信を行っているため、Ｐｏｒｔ番号を登録してもよい。また、これ以外にも、コントローラー１０１０からＦＭＤ１０３０に通信するための他の識別子（例えば、ＩＰアドレス、ＴＣＰ／ＩＰのポート番号、ｉＳＣＳＩ  Ｎａｍｅ等）で代替されてもよい。
（Ｈ３）ＬＵＮ（Logical Unit Number）。本実施形態では、ＦＭＤは一つの論理ユニットしか提供していないので、ＦＭＤが提供するＬＵの番号を保存すればよい。
（Ｈ４）FMDの型番。ストレージシステム１０００を長期間継続的に利用する場合、保守作業によって複数型番を併用することも考えられるため。
（Ｈ５）容量とブロックサイズとフラッシュメモリパッケージ枚数。これらの情報のうちの少なくとも一つが、ＦＭＤ１０３０のＦＭＤ内部構成情報通知プログラム２０１４によって、コントローラー１０１０に提供される。
【０１０５】
なお、図には記述されていないが、各FMD１０３０についてストレージシステムに搭載した物理的な場所が判る情報が、FMD情報４０５０に含められてもよい。
【０１０６】
図６は、ＰＧ構成情報４０６０の構成例を示す図である。
【０１０７】
ＰＧ構成情報４０６０は、それぞれのパリティグループ（ＰＧ）の識別子毎に、以下の（Ｉ１）乃至（Ｉ３）の情報を持つ。
（Ｉ１）閉塞フラグ。閉塞フラグはＰＧが使用不可能な状況の場合にＹｅｓとなり、そうではない場合にＮｏとなる。なお、使用不可能な状況とは、以下に例示する事象が多重に発生した場合が考えられる。
（事象１）ハードウェア障害。
（事象２）ＦＭＤ１０３０の抜き取り。
（事象３）図２に示すＦＭＤ１０３０の場合は空き容量が少ないことによってコントローラー１０１０が報告を受信。
（Ｉ２）ＲＡＩＤレベル。
（Ｉ３）パリティグループに属するＦＭＤ１０３０の数と、そのＦＭＤの識別子。
【０１０８】
なお、前述のとおり、コントローラー１０１０は、パリティグループに対してアドレス空間を割り当てることができる。図８は、ＲＡＩＤ１＋０を例に採ったパリティグループのアドレス空間[G]と、FMD１０３０のアドレス空間[D]の関係を示す。図９は、ＲＡＩＤ５を例に採った場合の同様の関係を示す。
【０１０９】
用例の説明：
図８及び図９は、４つのFMD８２００、８２１０、８２２２、８２３０を用いてパリティグループ８１００を構成する場合を示している。ハッチングされた箱８０１０は、FMDのブロック[D]を示し、そのブロックアドレス[D]を８０１１に示している。箱８０１０の中の点線の枠を持つ箱８０２０は、コントローラー１０１０がパリティグループ８１００に割り当てたブロック[G]で、コントローラー１０１０が割り当てるブロックアドレス[G]を８０２１に示す。なお、ブロック８０２０のブロックサイズ[G]は、ＳＣＳＩの規格が提供しうる最低のブロックサイズである５１２バイトとすることが考えられるが、これ以外のサイズでもよい。
【０１１０】
ＲＡＩＤ１＋０：
ＲＡＩＤ１＋０の場合、ミラーリングのために、コントローラー１０１０は、二つのＦＭＤで同じアドレス空間を割り当て（例では、ＦＭＤ８２００と８２１０、ＦＭＤ８２２０と８２３０）、その後ストライピングする。ストライピングの場合、コントローラー１０１０は、定められたブロック数（以後、ストライピング用連続ブロック数と呼ぶ）毎に、続きのアドレス空間[G]を別なＦＭＤへ切り替える（例では、ブロック[G]では４つ、ブロック[D]では２つ）。なお、ストライプサイズ（パリティグループ内の全ＦＭＤからデータを読み書きすることで行うＩ／Ｏサイズ）は、以下の式で算出することができる。
ストライプサイズ＝（ストライピング用連続ブロック数[G]）×（ＦＭＤの数／２）×（ブロックサイズ[G]）。
【０１１１】
なお、ＲＡＩＤ１の場合は、ＲＡＩＤ１＋０のストライピングを省略したものであるため、説明は省略する。
【０１１２】
ＲＡＩＤ５：
ＲＡＩＤ５の場合も、コントローラー１０１０は、ストライピング用連続ブロック数を単位にストライピング処理を行ったり、パリティ保存領域を割り当てる（例では、アドレスＰ０からＰ３が、アドレス０から１１までのパリティを保存する領域）。ＲＡＩＤ５の場合のストライプサイズは、以下の式で算出することができる。
ストライプサイズ＝（ストライピング用連続ブロック数[G]）×（ＦＭＤ数−１）×（ブロックサイズ[G]）。
【０１１３】
図７は、内部LU構成情報４０７０の構成例を示す図である。
【０１１４】
内部ＬＵ構成情報４０７０は、それぞれの内部ＬＵの識別子毎に以下の（Ｊ１）乃至（Ｊ４）情報を持つ。なお、ホスト１１００に記憶領域として提供されるLUは、この内部LUを元にパスを定義することによって、外部に提供される。なお、ここで言う「外部」とは、ホスト１１００に代えて又は加えて、他種の装置、例えば、仮想化スイッチや別のストレージシステムであっても良い。換言すれば、該他種の装置が、ホスト１１００に代わって又は加えて、ストレージシステムにＩ／Ｏリクエストを発行することができる。
（Ｊ１）閉塞フラグ。閉塞フラグは当該内部ＬＵに対して使用不可能な状況（例えば、パリティグループが閉塞している場合や、当該内部ＬＵに領域が割り当てられていない場合）の場合にＹｅｓとなり、そうではない場合にＮｏとなる。
（Ｊ２）ＰＧ識別子と開始アドレス[G]と終了アドレス[G]。当該内部ＬＵの記憶領域として用いるパリティグループと、パリティグループ内の開始ブロックアドレス[G]と終了ブロックアドレス[G]を示す。なお、本エントリは、コントローラー１０１０で管理されている。このため、当該ブロックアドレスは、コントローラーにとってのブロックで管理されるが、その場合も、開始アドレス[G]と終了アドレス[G]はＦＭＤ１０３０のブロックサイズやストライプサイズを考慮した値とすることで、複数の内部LUが同じストライピングやＦＭＤのブロック[D]を用いないようにすることができる。なお、内部LUに対して、複数のパリティグループの記憶領域を割り当てる場合、内部ＬＵ構成情報４０７０のエントリは、（Ｊ２）の情報が複数個登録され、さらに、（Ｊ２）で定義した空間を結合するための情報が加えられることになる。
（Ｊ３）ブロックサイズ[L]。コントローラー１０１０は、例えば、５１２バイトをブロックサイズとしているが、ホスト１１００はこれより大きいブロックサイズを希望する場合があるため、ホスト１１００からのリクエストが前提とするブロックサイズが保持される。
（Ｊ４）コンペアフラグ。コントローラー１０１０がキャッシュメモリ１０２０へステージングする際に、パリティやミラーの情報と比較するかどうかを指定するためのオプションである。そのような比較が行われれば、信頼性を向上させることができる。
【０１１５】
図13は、LUパス情報4080の構成例を示した図である。
【０１１６】
例えば、以下の（Ｋ１）乃至（Ｋ３）の情報が保持される。
（Ｋ１）ホスト１１００に対して提供する内部LUの識別子。
（Ｋ２）WWN（またはI/Oポート１０１３の識別子）。本情報は、ホスト１１００に対して提供する内部LUを、どのポート１０１３から提供するかを示す。なお、前述したように、ＷＷＮに代えて、ポート番号など、他種の識別子で代替されてもよい。
（Ｋ３）LUN。本情報は、ホストへ向けて提供する内部LUを、（Ｋ２）に記載のWWNのどのLUNとして提供するかを示す。
【０１１７】
なお、LUNは限られた数しか定義できないため、ストレージシステム１０００内で定義された全ての内部LUにWWNとLUNを割り当てる必要はなく、あるWWNとLUNをある時間帯はある内部LUに割り当て、別な時間は別な内部LUに割り当てることで、LUNの有効利用が行われても良い。
【０１１８】
＜３．３．パリティグループ定義＞。
【０１１９】
図１４は、構成制御プログラム４０３０にて実行される、パリティグループの定義処理について示したフローである。以下に個々のステップの説明を記す。
【０１２０】
（Ｓｔｅｐ１４００１）構成制御プログラム４０３０は、必要に応じて、管理サーバー１２００へ、ＦＭＤ情報４０５０の一部または全ての情報を提供する。なお、管理サーバー１２００は、以下の（方法１）及び（方法２）のいずれかまたはすべてを実施してもよい。
（方法１）型番、容量、ブロックサイズの一つ以上を基準に構成されたグループを表示装置に表示する。
（方法２）フラッシュメモリパッケージ（ＦＭＰ）数を基に構成されたグループを表示装置に表示する。
【０１２１】
また、「必要に応じて」とは、例えば、管理サーバー１２００が、ユーザーからの要求にて、コントローラー内部の情報を表示する必要が出たために、情報のリクエストを送信し、構成制御プログラム４０３０が、そのリクエストを受信したときである。
【０１２２】
（Ｓｔｅｐ１４００２）構成制御プログラム４０３０は、管理サーバー１２００から、複数のＦＭＤ１０３０の識別子（識別子は、物理的なストレージシステムへの搭載位置や論理的な識別情報でも代替可能である）とＲＡＩＤレベルとを含んだパリティグループ定義リクエストを受信し、そのリクエストに付随した情報（各ＦＭＤ識別子及びＲＡＩＤレベル）を基に、ＰＧ構成情報４０６０を作成及び／又は更新する。なお、前記処理の前に以下の（チェック１）乃至（チェック５）の少なくとも一つのチェック処理（または、チェックの結果を表示する処理）を加えることで、好ましくないパリティグループ構成の定義が回避されてもよい。
（チェック１）ストレージシステム１０００内のＦＭＤを除いた各コンポーネント（コントローラー、キャッシュメモリ、バックエンドＩ／Ｏネットワーク等を指す）の一つが障害等によって閉塞した場合に、パリティグループ定義リクエストに含まれる複数のＦＭＤ１０３０のうち二つ以上のＦＭＤ１０３０にアクセス（Ｉ／Ｏリクエストによるリード・ライトを含む）可能か否かのチェック。アクセス不可能であれば、パリティグループのデータ復元処理が失敗することになる。このチェックは、１点閉塞でＩ／Ｏリクエストを停止させないことを目的としたチェックである。なお、ＲＡＩＤ１やＲＡＩＤ１＋０等ミラーリングを伴うＲＡＩＤレベルでは、ミラーリング関係にある二つのＦＭＤの両方についてこの（チェック１）が行われても良い。
（チェック２）パリティグループ定義リクエストで指定された全てのＦＭＤ１０３０においてＦＭＰ数が異なるか否かのチェック。このチェックは、パリティグループ構成定義を支援するためのチェックである。
（チェック３）パリティグループ定義リクエストで指定された全てのＦＭＤ１０３０において型番が異なるか否かのチェック。ＦＭＤ１０３０の型番にＦＭＰ数が関係している場合は、（チェック２）が含まれてもよい。ただし、在庫切れなどの理由により、全て同じ型番のＦＭＤ１０２０を指定できない場合は、本チェックによる警告を無視してパリティグループ構成を定義することも考えられる。
（チェック４）パリティグループ定義リクエストに指定された全てのＦＭＤ１０３０において総記憶容量が異なるか否かのチェック。総記憶容量の有効利用を図ることが目的のチェックである。ただし、在庫切れなどで全て同じ容量のＦＭＤを指定できない場合は、本チェックによる警告を無視してパリティグループ構成を定義することも考えられる。
（チェック５）パリティグループ定義リクエストで指定された複数のＦＭＤ１０３０のブロックサイズ[D]が異なるか否かのチェック。FMDのブロックサイズ[D]はキャッシュメモリ１０２０へのステージングやデステージング時のデータ単位となるため、パリティグループ内でI/O性能の変化を軽減するためのチェックである。
【０１２３】
また、例えば、チェック６として、構成制御プログラム４０３０は、一つのパリティグループについて異種の記憶デバイス（例えば、ＨＤＤとＦＭＤ１０３０）が指定されているか否かをチェックし、異種の聞くデバイスが指定されている場合には、管理サーバー１２００に報告しても良い。
【０１２４】
（Ｓｔｅｐ１４００３）構成制御プログラムは、パリティグループを初期化（ミラーデータやパリティデータの作成を含む）
（Ｓｔｅｐ１４００４）構成制御プログラム４０３０は、ＰＧ構成情報４０６０の該当するパリティグループの閉塞フラグをＹｅｓからＮｏへ変更し、利用可能なことを示し、管理サーバー１２００に完了メッセージを返す。
【０１２５】
なお、ＦＭＤ１０３０の型番によってＦＭＰ数や総記憶容量を一意に特定できる場合、ストレージシステム１０００の外部（例えば、ストレージシステム１０００の製造会社のコンピュータ）で、各種チェック毎に、パリティグループの定義が可能なＦＭＤの型番リストを作成し、当該リストをコントローラー１０１０へダウンロードして前記チェックに用いてもよい。
【０１２６】
＜３．４．内部ＬＵ定義＞。
【０１２７】
図１５は、構成制御プログラム４０３０にて実行される、内部ＬＵの定義処理について示したフローである。以下に個々のステップの説明を記す。
【０１２８】
（Ｓｔｅｐ１５００１）構成制御プログラム４０３０は、必要に応じて、管理サーバー１２００からのリクエストに応じて、ＰＧ構成情報４０６０の一部または全てを管理サーバーへ送信する。
【０１２９】
（Ｓｔｅｐ１５００２）構成制御プログラム４０３０は、管理サーバー１２００から、以下に例示する（引数１）乃至（引数５）の一部または全ての情報を含んだ内部ＬＵ定義リクエストを受信したら、当該リクエストに付随した情報を基に、内部ＬＵ構成情報４０７０を作成及び／又は更新する。
（引数１）パリティグループの識別子。
（引数２）パリティグループの開始アドレス[G]。
（引数３）内部ＬＵの記憶容量またはパリティグループの終了アドレス[G]。
（引数４）内部ＬＵのブロックサイズ[L]。
（引数５）内部ＬＵのコンペアフラグ。
【０１３０】
なお、（引数３）については、終了アドレスが当該パリティグループのストライピングサイズの整数倍となることで、一つのパリティデータが複数の内部ＬＵで共有することを回避するチェックを実施してもよい。また、（引数２）と（引数３）は、パリティグループのブロックサイズで指定するとしたが、ストライピングサイズを単位として当該引数の値を受け取ってもよい。同様に、最終的にパリティグループの開始アドレス[G]と終了アドレス[G]を求められるのであれば、他の形式で引数を受け取ってもよい。
【０１３１】
（Ｓｔｅｐ１５００３）構成制御プログラム４０３０は、必要に応じて、内部ＬＵの初期化処理を行う。例えば、初期化処理の一環として内部ＬＵの管理領域を作成してもよい。
【０１３２】
（Ｓｔｅｐ１５００４）構成制御プログラム４０３０は、内部ＬＵ構成情報４０７０の該当する内部ＬＵの閉塞フラグをＹｅｓからＮｏへ変更し、内部LUが利用可能であることを示し、管理ホストに完了メッセージを返す。
【０１３３】
＜３．５．ＬＵパス定義＞。
【０１３４】
図１６は、構成制御プログラム４０３０にて実行される、ＬＵのパス定義処理について示したフローである。以下に個々のステップの説明を記す。
【０１３５】
（Ｓｔｅｐ１６００１）構成制御プログラム４０３０は、必要に応じて、管理サーバー１２００からの要求に応じて、内部ＬＵ構成情報４０７０とＬＵパス定義情報４０８０の一部または全てを管理サーバーへ送信する。
【０１３６】
（Ｓｔｅｐ１６００２）構成制御プログラム４０３０は、管理サーバー１２００から、内部ＬＵの識別子とポート情報（最終的にI/Oポート１０１３の識別子またはＷＷＮへ変換可能な識別情報であればこれら以外の情報でもよい）とＬＵＮを含んだパス定義リクエストを受信する。
【０１３７】
（Ｓｔｅｐ１６００３）構成制御プログラム４０３０は、リクエストで指定されたＷＷＮとＬＵＮが割り当て済みでないか確認し、割り当て済みの場合はエラーで応答して終了する。未割り当ての場合はＳｔｅｐ１６００４を行う。
【０１３８】
（Ｓｔｅｐ１６００４）構成制御プログラム４０３０は、リクエストに付随した情報を元に、ＬＵパス定義情報４０８０を作成及び／又は更新し、完了メッセージを管理サーバー１２００へ返す。
【０１３９】
なお、ホスト１１００からのアクセスパス多重化のために、内部ＬＵに対して複数のパス定義を行っても良い。また、定義されたパスの解除処理の場合は、管理サーバー１２００から、内部ＬＵの識別子か、或いは、ＷＷＮとＬＵＮの組み合わせを用いて、ＬＵパス定義情報の対応エントリを見つけ、当該エントリを削除することによって、パス設定を解除してもよい。また、LUパス定義リクエストでWWNとLUNを指定する代わりに、構成制御プログラム４０３０が空いているWWNとLUNを探して割り当ててもよい。
【０１４０】
＜３．６．閉塞検知＞。
【０１４１】
構成制御プログラム４０３０は、障害や電源断やコンポーネントの抜き去り等が原因のコンポーネント閉塞を検知する。以下に閉塞検知処理のフローを示す。
【０１４２】
（Ｌ１）構成制御プログラム４０３０は、各コンポーネントの状態を取得する。なお、コンポーネントがコントローラーやＦＭＤの場合は当該コンポーネント上で動作するプログラムの状態やログでもよい。また、当該プログラム４０３０は、問い合わせの代替として各コンポーネントからの報告を本処理に用いてもよい。
【０１４３】
（Ｌ２）構成制御プログラム４０３０は、取得した状態をチェックすることで、各コンポーネント閉塞の有無を判断し、閉塞が無い場合は（Ｌ１）に戻る。
【０１４４】
（Ｌ３）（Ｌ２）にて閉塞と判断した場合、構成制御プログラム４０３０は、閉塞と判断したコンポーネントの識別子を管理サーバー１２００へ転送し、ユーザーに表示する。
【０１４５】
なお、FMD１０３０の閉塞検知とその後のダイナミックスペアリングについては後述する。また、FMD１０３０以外のコンポーネント閉塞によって一部のFMD１０３０に対してアクセス不可能な状況が発生することもあるが、その場合も後述するような処理（特にダイナミックスペアリング）を行ってもよい。
【０１４６】
＜３．６．１．ＦＭＤ１０３０の閉塞検知＞。
【０１４７】
以下に、構成制御プログラム４０３０にて実行される、ＦＭＤ１０３０の閉塞検知処理のフローについて記す。
【０１４８】
（Ｍ１）ＦＭＤ１０３０は、構成制御プログラムからのリクエストに応じて、情報を返すか、あるいは能動的に報告を送信する。
【０１４９】
（Ｍ２）構成制御プログラム４０３０は、受け取った情報をチェックし、ＦＭＤの閉塞の有無を判断する。判断方法の一例を以下に挙げる。
（判断方法１）I/Oリクエストエラーに代表される処理失敗の情報の場合は、規定回数（１回以上を含む）受け取ったことで判断する。
（判断方法２）３．１．３章に記載した空き領域に関連する情報（３．１．３章に記載の（Ｇ３）空きブロック数を（Ｇ２）のＦＭＤブロック数で割った値が考えられる）の場合は、定められたスレッショルド値（本情報はコントローラー１０２０内部で保持されており、管理サーバー１２００経由でコントローラー１０２０へ設定されてもよい）を下回ったことで判断する。
（判断方法３）３．１．３章に記載した（Ｇ６）FMP数の場合は、出荷時や仕様書の数から一定の割合以下となったことで判断する。
【０１５０】
なお、ＦＭＤの実装のバリエーションとして、上記判断方法をＦＭＤ１０３０内部で実現し、該当した場合は、コントローラー１０１０に、ＨＤＤと同様のデバイス障害として報告を行うことが考えられる。その場合は、コントローラー１０１０は、当該障害を（判断方法１）によって判断すればよい。
【０１５１】
（Ｍ３）構成制御プログラム４０３０は、ＦＭＤ構成情報４０５０の閉塞と判断したＦＭＤの閉塞フラグをＹｅｓに変更し、FMDが利用不可能であることを示す。
【０１５２】
（Ｍ４）構成制御プログラム４０３０は、ＰＧ構成情報とＦＭＤ構成情報を参照することで、閉塞したＦＭＤ１０３０によってパリティグループがリード・ライトリクエストを処理できない状態かどうかを判断し、処理不可能な場合は該当するパリティグループの閉塞フラグをＹｅｓ（すなわち利用不可能）に変更する。なお、前記判断方法は、ＲＡＩＤ１＋０などのミラーリングを伴う冗長化方式の場合は、データを二重化しているペアとなるＦＭＤが両方とも閉塞状態かどうかで判断し、ＲＡＩＤ５の場合はパリティグループ中の閉塞状態のＦＭＤの数が２以上かどうかで判断する。
【０１５３】
（Ｍ５）構成制御プログラム４０３０は、内部ＬＵ構成情報を参照することで、閉塞したパリティグループ上にデータが保存された内部ＬＵの閉塞フラグをＹｅｓ（すなわち利用不可能）とする。
【０１５４】
（Ｍ６）構成制御プログラム４０３０は、必要に応じて、閉塞したFMD１０３０の識別情報を管理サーバー１３００に通知する。この通知には閉塞の理由となる情報（例えばどの判断方法で閉塞と判断したのか）を付随させてもよい。また、FMD１０３０の閉塞によって閉塞したパリティグループや内部LUやLUが存在する場合は、これらの識別情報を管理サーバー１３００に通知してもよい。なお、本通知を受け取った管理サーバー１３００は障害情報としてユーザーにこれらの情報を表示することが考えられる。
【０１５５】
なお、以後の説明では、閉塞状態のＦＭＤを含み、かつ、Ｉ／Ｏリクエストが可能なパリティグループの状態を、「縮退状態」と呼ぶ。この縮退状態のパリティグループに対するＩ／Ｏリクエストでは、データ復元処理を行って当該リクエストに応答する。なお、データ復元処理とは、冗長データから閉塞したＦＭＤのデータを復元することを指す。ミラーリングの場合は、閉塞したＦＭＤと同じデータが別のＦＭＤに存在するため、当該処理は当該ＦＭＤのデータを使用する。パリティ方式の場合は、本処理は閉塞せずに残ったデータとパリティから閉塞したＦＭＤのデータを計算することで復元する。
【０１５６】
＜３．６．２．ＦＭＤのダイナミックスペアリング＞。
【０１５７】
以下に、構成制御プログラム４０３０による、ダイナミックスペアリング処理について説明する。
【０１５８】
（Ｎ１）構成制御プログラム４０３０は、障害検知処理でＦＭＤ閉塞を検知するまで待つ。
【０１５９】
（Ｎ２）構成制御プログラム４０３０は、Ｎ１で閉塞と検知したＦＭＤが関連する（例えばそのＦＭＤが含まれる）パリティグループを、ＰＧ構成情報４０６０を参照することにより、見つける。
【０１６０】
（Ｎ３）構成制御プログラム４０３０は、見つけたパリティグループについて、データ復元処理が実行可能であるかどうか判断し、実行不可能な場合はあきらめる（例えば終了する）。実行可能な場合は、Ｎ４以降を行う。
【０１６１】
（Ｎ４）構成制御プログラム４０３０は、パリティグループに適合する代替ＦＭＤを検索する。なお、検索条件としては、パリティグループ定義で提供した情報やチェック項目と類似な以下に例示の条件が考えられる。
（条件１）FMDのデータ容量や型番やＦＭＰ数やブロックサイズ[D]。
（条件２）FMD以外のコンポーネント一点閉塞でFMD１０３０の二重閉塞とならないFMD1030の選択（パリティグループ閉塞をできるだけ回避するため）。
【０１６２】
（Ｎ５）構成制御プログラム４０３０は、データ復元処理で代替ＦＭＤへデータを復元する（以後復元コピー処理と呼ぶ）。より具体的な復元コピー処理の内容を以下に例示する。
（Ｎ５−１）構成制御プログラム４０３０は、コピーの完了位置を示す情報（コピー完了位置情報）をＦＭＤの先頭アドレスへ初期設定する。
（Ｎ５−２）構成制御プログラム４０３０は、コピー完了位置情報から、複数ブロック分だけ閉塞ＦＭＤのデータを復元（３．６．１章に記載の処理方法で）し、代替ＦＭＤへ書き込む。
（Ｎ５−３）構成制御プログラム４０３０は、コピー完了位置情報を書き込み済みブロック数分だけ進める。
（Ｎ５−４）コピー完了位置情報がFMDの終了アドレスに進むまで、構成制御プログラム４０３０は、（Ｎ５−１）から（Ｎ５−３）を繰り返す。
【０１６３】
（Ｎ６）構成制御プログラム４０３０は、代替ＦＭＤを新たにパリティグループに登録し、閉塞ＦＭＤを除外する。
【０１６４】
なお、ＦＭＤの閉塞理由が空き容量不足の場合は、ＦＭＤへ保存されているデータに対するリードリクエストが可能であるため、（Ｎ５−２）のデータ復元処理の代替として、パリティデータやミラーデータを用いずに、閉塞ＦＭＤからデータを読み込んでも良い。
【０１６５】
上記復元コピー中の閉塞ＦＭＤに対するＩ／Ｏリクエストについては、コピー完了位置情報以前のブロック[D]について代替ＦＭＤにデータが復元されているため、コントローラー１０１０は、そのデータをホスト１１００へ返したり（リードの場合）、代替ＦＭＤに対してライトデータを保存してもよい（ライトの場合）。なお、コピー完了位置情報以降のブロックアドレスに対しては、コントローラー１０１０は、以下の処理を実行することができる。
（Ｏ１）リードリクエストを受けた場合でＦＭＤの閉塞理由が空き領域不足の場合は、データ復元処理として、閉塞ＦＭＤからキャッシュメモリにデータをステージングした後に、そのデータをホスト１１００へ返す
（Ｏ２）（Ｏ１）以外でリードリクエストを受けた場合、データ復元処理で閉塞したＦＭＤ１０３０に保存されたデータをキャッシュメモリ１０２０へ復元し、そのデータをホスト１１００へ返す
（Ｏ３）ライトリクエストを受けた場合、冗長データ（パリティデータやミラーデータ）を更新し、これ以降のリードリクエストやライトリクエストで本リクエストのライトデータを復元できるようにする。
【０１６６】
＜３．７．ライト処理＞。
【０１６７】
図１７は、Ｉ／Ｏ処理プログラム４０１０がライトリクエストを受信した場合に行われる処理のフローである。また、図１０は、図８のＲＡＩＤ１＋０のパリティグループのＦＭＤ８２００とＦＭＤ８２１０とキャッシュ２枚（ＣＭ−ＡとＣＭ−Ｂ）上のデータの流れや変化の例を示す概要図である。さらに、図１１と図１２は、図９のＲＡＩＤ１パリティグループのＦＭＤ９２００とＦＭＤ９２３０とキャッシュ２枚（ＣＭ−ＡとＣＭ−Ｂ）上のデータの流れや変化の例を示す概要図である。
【０１６８】
＜３．７．１．概要図の前提と用例＞。
【０１６９】
図１０から１２は、ホスト１１００に対して、ブロックサイズ[L]を５１２Ｂ（Byte）で公開しており、かつ、パリティグループの先頭から領域を割り当てられた内部ＬＵについて、ブロック'３'にライトリクエストが到着した場合の、キャッシュメモリとＦＭＤと間のデータの流れとデータの変化を示した図である。また、キャッシュメモリとＦＭＤ上の数字つきの箱は、パリティグループにコントローラー１０１０が割り当てたブロック[G]と、当該ブロック[G]のアドレスを指す。本例では、FMDブロックサイズ[D]は、ブロックサイズ[G]の二倍である。
【０１７０】
なお、キャッシュメモリ１０２０の領域管理では、キャッシュメモリ上のデータ領域とＦＭＤ上のデータ領域を対応付ける情報を小さくするために、ＦＭＤの連続した複数ブロック[D]（例で４ブロック[G]かつ、2ブロック[D]）で、キャッシュ上の連続アドレス領域（キャッシュセグメント）を割り当てるようにしている。そのため、例えば、コントローラー１０１０は、キャッシュセグメント毎に、以下に例示する（Ｑ１）乃至（Ｑ６）の属性情報を管理している。
（Ｑ１）キャッシュセグメント上のアドレス。
（Ｑ２）パリティグループの識別子とパリティグループ上のブロックアドレス[G]。
（Ｑ３）キャッシュセグメント内のブロック[G]毎のステージングフラグ。概要図ではキャッシュ上のブロック[G]の下に黒帯がある場合は当該データがステージング済みを意味している。
（Ｑ４）キャッシュセグメント内のブロック[G]毎のダーティ（更新済みだが、ＦＭＤへは未反映であること）フラグ。概要図では、キャッシュブロック内のブロック[G]の上に黒帯がある場合はダーティを意味している。
（Ｑ５）旧データフラグ。
（６）パリティ更新要フラグ。図１１と１２の数字なしのＰと書かれた箱の上に黒帯がある場合は、パリティ更新が必要なことを意味し、数字なしのＰと書かれた箱のみの場合は更新不要を意味する。
【０１７１】
また、両概要図とも、リード用にブロック[G]の'０'と'１'はステージング済みの状態から説明を始める。
【０１７２】
＜３．７．２．ライトリクエスト処理フロー＞。
【０１７３】
図１７のフローと図１０から１２までの例を用いて、I/O処理プログラム４０１０がライトリクエストを受信した時の処理内容を説明する。
【０１７４】
（Ｓｔｅｐ１７００１）Ｉ／Ｏ処理プログラム４０１０は、コントローラー１０１０が受け取ったライトリクエストからＷＷＮとＬＵＮと開始ブロックアドレス[L]と、ブロック長[L]とライトデータを取得する。繰り返すが、予めコントローラー１０１０は当該ＬＵＮのブロックサイズ[L]として対応する内部ＬＵの内部ＬＵ構成情報４０７０のブロックサイズを報告しており、ライトリクエストの開始ブロックアドレスとブロック長は当該ブロックサイズ[L]を前提としている。なお、実際のライトリクエストにはＷＷＮのかわりにＰｏｒｔＩＤが含まれるため、ＰｏｒｔＩＤをＷＷＮに変換する必要がある。
【０１７５】
（Ｓｔｅｐ１７００２）Ｉ／Ｏ処理プログラム４０１０は、ＷＷＮとＬＵＮとＬＵパス定義情報から内部ＬＵ番号を求める。なお、ネットワークとしてＦｉｂｒｅＣｈａｎｎｅｌ以外を用いている場合は、ライトリクエストから内部ＬＵ番号を求めるほかの方法によってＳｔｅｐ１７００１とＳｔｅｐ１７００２を代替してもよい。例えば、ｉＳＣＳＩの場合は、ＩＰアドレスとＰｏｒｔ番号の組み合わせや、ｉＳＣＳＩターゲット名がＷＷＮの代わりとなり、ＬＵＮと組み合わせることで内部ＬＵ番号を求めることができる。
【０１７６】
（Ｓｔｅｐ１７００３）Ｉ／Ｏ処理プログラム４０１０は、内部ＬＵ構成情報４０７０を用いて、リクエストの開始ブロックアドレス[L]とブロック長[L]を、パリティグループの識別子と開始ブロックアドレス[G]と終了ブロックアドレス[G]へ変換する。変換計算は、以下の式で行う。
・開始ブロックアドレス[G] =（ブロックサイズ[L]*開始ブロックアドレス[L]/ブロックサイズ[G]）＋（内部LU構成情報の開始ブロックアドレス[G]）
・終了ブロックアドレス[G] =（ブロックサイズ[L]*ブロック長[L]/ブロックサイズ[G]）＋開始ブロックアドレス[G]。
【０１７７】
（Ｓｔｅｐ１７００５）Ｉ／Ｏ処理プログラム４０１０は、キャッシュ上にライトデータを保存する。この時、キャッシュ上に必要なブロック[G]のデータがステージング済の場合は、キャッシュ上のデータをライトデータで更新する。しかし、ステージング済みのブロックデータが存在する場合でも、本実施形態では、パリティ更新要フラグがＮｏ（更新済み）で、保存対象ブロックのダーティフラグが立っている場合（すなわち、前回のパリティ更新で元としたライトデータ）は、今回のパリティ更新で旧データとして用いる必要があるため、別キャッシュセグメントを確保してライトデータを保存する。キャッシュ上にライトデータがない場合も、必要に応じて、キャッシュセグメントを確保してライトデータを保存する。
【０１７８】
なお、ライトデータは二枚のキャッシュ両方に保存することで、キャッシュが１枚閉塞してもライトデータを保持できるようにする。また保存と共に、Ｉ／Ｏ処理プログラム４０１０は、保存したブロックのステージングフラグとダーティフラグとパリティ更新要フラグを立てて、ライトリクエストに対する応答をホスト１１００へ返す。図１０と図１１の（１）では、ブロック[G]'３'のライトデータがキャッシュ２枚にライトされ、ステージングフラグとダーティフラグが立っている。
【０１７９】
以上が、Ｉ／Ｏ処理プログラム４０１０のフローである。
【０１８０】
＜３．７．２．パリティ作成からデステージングまで＞。
【０１８１】
キャッシュ制御プログラム４０２０が繰り返し実行するパリティ作成とデステージングの手順を図１８に示す。
【０１８２】
（Ｓｔｅｐ１８００１）キャッシュ制御プログラム４０２０は、ＬＲＵ（Least Recently Used）等のキャッシュアルゴリズムによってパリティ作成またはデステージ対象のキャッシュセグメントを選択する。図１０〜１２（以下、「概要図」と記載することもある）ではブロック'２'と'３'が選択された。
【０１８３】
（Ｓｔｅｐ１８００２）キャッシュ制御プログラム４０２０は、デステージ対象のキャッシュセグメントのパリティグループＩＤやブロックアドレスを元にした計算式で、２枚のキャッシュのどちらに保存されたライトデータを、パリティ生成やデステージングに用いるか決定する。概要図ではＣＭ−Ａ上のライトデータを用いることにした。
【０１８４】
（Ｓｔｅｐ１８００３）キャッシュ制御プログラム４０２０は、デステージング対象キャッシュセグメントを、デステージング先となるＦＭＤ１０３０のブロックサイズ[D]に合わせて、セグメント中の未ステージ済みブロック[G]を埋める。これは、キャッシュメモリに対して、キャッシュメモリのブロック単位でデータを読み書きできるようにするために行われる。
【０１８５】
具体的には、キャッシュセグメント中の複数ブロック[G]を先頭からＦＭＤブロックサイズ[D]毎に区切り（つまり、デステージング単位に区切り）、その区切り毎にダーティなブロック[G]を持ち、かつ部分的未ステージング状態のブロック[G]がある場合は、ＦＭＤ１０３０から未ステージ状態のブロック[G]に対応するデータをコピーする。この時のコピーは、最初に、キャッシュ上の別領域にダーティなブロック[G]（例えばブロック'２'）と未ステージング状態のブロック[G]（例えばブロック'３'）を含むブロック[D]をステージングし、そこから未ステージング状態のブロック[G]だけコピーする。概要図（例えば図１０（１））ではブロック'３'が未ステージング状態である。
【０１８６】
（Ｓｔｅｐ１８００４）キャッシュ制御プログラム４０２０は、デステージング対象キャッシュセグメントについて、パリティ生成が必要な場合はＳｔｅｐ１８００５を行い、ミラーリングが必要な場合はＳｔｅｐ１８０１１を行う。
【０１８７】
（Ｓｔｅｐ１８００５）キャッシュ制御プログラム４０２０は、パリティ生成のためにキャッシュセグメントのデステージング先FMD１０３０に保存された旧データを、デステージング対象のキャッシュセグメントとは別なキャッシュセグメントにステージングする。なお、このステージングはＳｔｅｐ１８００３で行ったＦＭＤブロックサイズ化でステージングしたキャッシュセグメントと同じ領域を用いてもよいし、予めＳｔｅｐ１８００３で両方に必要なデータをステージングしておいてもよい（概要図の図１１の（２）では、両方に必要なデータをまとめてステージングした）。また、キャッシュ上に前回のパリティ更新で用いたデータがある場合は、ステージングを省略することができる。
【０１８８】
（Ｓｔｅｐ１８００６）キャッシュ制御プログラム４０２０は、デステージング対象のキャッシュセグメントに対応するパリティが保存されたブロック[L]を、FMD1020からキャッシュセグメントへステージングする（概要図の図１１の（２）では、ＣＭ−Ｂへブロック'Ｐ２'と'Ｐ３'をステージングする）。なお、キャッシュ上に前回計算したパリティが存在する場合は、ステージングを省略することができる。
【０１８９】
（Ｓｔｅｐ１８００７）キャッシュ制御プログラム４０２０は、デステージング対象のキャッシュセグメント上のライトデータと、Ｓｔｅｐ１８００５でステージングした旧データと、Ｓｔｅｐ１８００６でステージングした現在のパリティとを用いて、新たなパリティを計算し、それを、現在のパリティとは別なキャッシュセグメントへダーティフラグを立てて保存する。当該プログラム４０２０は、また、デステージ対象キャッシュセグメントのパリティ更新要フラグを下げて、Ｓｔｅｐ１８００５とＳｔｅｐ１８００６でステージングした旧データとパリティのキャッシュセグメントを破棄する。概要図の図１１の（３）で、ブロック'２'のパリティ'Ｐ２'がダーティとなっている。
【０１９０】
（Ｓｔｅｐ１８００８）キャッシュ制御プログラム４０２０は、Ｓｔｅｐ１８００７で計算した新たなパリティのキャッシュセグメントをデステージし、ダーティフラグを下げる。概要図の図１２の（４）では、パリティ'Ｐ２'と'Ｐ３'をデステージングしている。
【０１９１】
（Ｓｔｅｐ１８００９）キャッシュ制御プログラム４０２０は、デステージング対象キャッシュセグメントをデステージし、ダーティフラグを下げる。デステージングが完了したら片方のキャッシュ上のライトデータを破棄してデステージングが完了する。なお、本ステップとＳｔｅｐ１８００８の順序は問わない。
【０１９２】
（Ｓｔｅｐ１８０１１）キャッシュ制御プログラムは、Ｓｔｅｐ１８００３で未ステージング済みブロックを埋めるために別キャッシュセグメントへステージングしたデータを破棄する。そして、キャッシュ制御プログラム４０２０は、デステージング対象キャッシュセグメントのライトデータをミラー関係の二つのＦＭＤ１０３０へデステージングする。当該プログラムは、両方とも完了するまで待った後、キャッシュの片方のライトデータを破棄する。概要図の図１０の（３）は、ＣＭ−Ａからブロック'２'と'３'がデステージされたことを示す。
【０１９３】
以上がパリティ生成処理である。
【０１９４】
次に前記処理で用いられていたデステージングの処理内容を示す。
【０１９５】
（Ｒ１）キャッシュ制御プログラム４０２０は、キャッシュセグメントのパリティグループのブロックアドレス[G]を、ストライピングの計算とブロックサイズの変換によって、ＦＭＤの識別子とＦＭＤのブロックアドレス[D]に変換する。
【０１９６】
（Ｒ２）キャッシュ制御プログラム４０２０は、（Ｒ１）で求めたブロックアドレス[D]で、（Ｒ１）で求めたFMDに対して、ライトリクエストを送信する。
【０１９７】
リードについても同様に、キャッシュ制御プログラム４０２０は、パリティグループのブロックアドレス[G]をＦＭＤの識別子とＦＭＤのブロックアドレス[D]に変換して、リードリクエストをFMD1030に対して送信する。
【０１９８】
また、信頼性向上のため、キャッシュ制御プログラム４０２０は、ＦＭＤ１０３０へのデステージング時に、LRCやＣＲＣ等の冗長コードをライトデータに付加し、ステージング時にチェックしてもよい。さらに、キャッシュ制御プログラム４０２０は、デステージング後に、ＦＭＤに保存されたデータとキャッシュ上のデータを比較して、データが確実に保存されたことを確認してもよい。いずれの場合も、チェックで異常を検出した場合、キャッシュ制御プログラム４０２０は、ＦＭＤ閉塞検知処理やデータ復元処理を行うことができる。
【０１９９】
さらに、内部ＬＵ構成情報４０７０のデータコンペアフラグがＹｅｓとなっている内部ＬＵに対応するステージングについては、信頼性を向上させるために、キャッシュ制御プログラム４０２０は、ＲＡＩＤ１であれば、本来のデータをFMD１０３０からキャッシュメモリ１０２０へコピーするとともに、ミラーリングペアの別ＦＭＤからもデータを読み出して比較する。同様に、ＲＡＩＤ５の場合は、キャッシュ制御プログラム４０２０は、本来のデータをFMD１０３０からキャッシュメモリ１０２０へコピーするとともに、他のＦＭＤからパリティデータと他のデータを用いて回復させたデータと当該ＦＭＤから読み出したデータを比較する。ＨＤＤの場合、回復処理はヘッドの移動や回転待ちを伴うアクセスパターンが増加する場合もあり、回復処理で行うＩ／Ｏリクエスト数の増加以上の性能低下も考慮が必要であるが、ＦＭＤの場合はこうした性能低下の考慮は不要である。
【０２００】
＜３．８．リード処理＞。
【０２０１】
図１９は、Ｉ／Ｏ処理プログラム４０１０がリードリクエストを受信した場合に行われる処理の流れの一例を示す。以下、各ステップを説明する。
【０２０２】
（Ｓｔｅｐ１９００１）Ｉ／Ｏ処理プログラム４０１０は、コントローラー１０１０が受け取ったリードリクエストから、ＷＷＮ、ＬＵＮ、開始ブロックアドレス、ブロック長及びライトデータを取得する。
【０２０３】
（Ｓｔｅｐ１９００２）Ｉ／Ｏ処理プログラム４０１０は、ＷＷＮとＬＵＮを、ＬＵパス定義情報に基づいて、内部ＬＵＮに変換する。なお、ライト処理と同様の方法でＳｔｅｐ１９００１とＳｔｅｐ１９００２を代替してもよい。
【０２０４】
（Ｓｔｅｐ１９００３）Ｉ／Ｏ処理プログラム４０１０は、内部ＬＵ構成情報４０７０を用いて、リードリクエストの開始アドレスとブロック長（ホスト１１００へ予め通知したブロックサイズをベースとした開始ブロックアドレスとブロック長）を、コントローラー１０１０内部で管理するブロック長をベースとした値へ、変換する。
【０２０５】
（Ｓｔｅｐ１９００４）Ｉ／Ｏ処理プログラム４０１０は、さらに、内部ＬＵ構成情報４０７０を用いて、内部ＬＵＮと変換した開始ブロックアドレスとブロック長とを、パリティグループＩＤとパリティグループ上での開始ブロックアドレスと終了ブロックアドレスへ変換する。変換のための計算では、内部ＬＵ構成情報４０７０の開始アドレスに開始ブロックアドレスを加えた値をパリティグループ上での開始ブロックアドレスとし、パリティグループ上での開始ブロックアドレスにブロック長を加えた値をパリティグループ上での終了ブロックアドレスとする。
【０２０６】
（Ｓｔｅｐ１９００５）Ｉ／Ｏ処理プログラム４０１０は、リードリクエストで要求されたデータがキャッシュに存在するか確認し、存在しない場合はキャッシュセグメントを確保し、ステージング処理でキャッシュにデータをコピーする。
【０２０７】
（Ｓｔｅｐ１９００６）Ｉ／Ｏ処理プログラム４０１０は、キャッシュ上のデータをホスト１１００へ転送する。
【０２０８】
以上が、Ｉ／Ｏ処理プログラム４０１０のフローである。なお、本手順のいずれかのステップでＷＷＮやＬＵＮや開始ブロックアドレスやブロック長のチェックを行っても良い。
【０２０９】
なお、本実施形態としては、ＬＵのブロックサイズよりＦＭＤのブロックサイズが大きい形態で用いられることがある。なぜならば、ＦＭＤのＦＭＤアドレス変換情報２０１２のエントリ量は、ＦＭＤの記憶容量をブロックサイズで割った値に関係しており、将来はエントリ量が増加することが予測され、その結果、Ｉ／Ｏリクエストで必要なデータを見つけるための検索時間が増えてしまい、ＦＭＤのブロックサイズを８１９２バイトなど大きなブロックサイズにすることが考えられるからである。一方、通常のホストでは、ブロックサイズは、現時点では５１２Ｂブロックを基本としているからでもある。ただし、これは、ほかの関係を否定するものではない。ＬＵのブロックサイズがＦＭＤのブロックサイズ以上であれば、キャッシュ上のステージングやデステージング処理が効率が良いと考えられるので、こうした構成を積極的に採用することもありえる。
【０２１０】
また、ストレージシステム１０００は、一つの装置から構成される必要はない。例えば、FMD1030とコントローラー１０１０は別の装置として存在し、バックエンドI/Oネットワークにて接続されることも考えられる。さらに、コントローラー１０１０に、LUに対してアクセス可能なホストを限定するアクセス制御プログラムを付加したり、LUのレプリカを同じストレージシステム１０００内に作成するローカルレプリケーションプログラムや、異なるストレージシステムへミラーリングを行うリモートミラーリングプログラムを実行してもよい。より具体的には、例えば、リモートミラーリングを行うにあたってはコピー元とコピー先でFMD1030を用いたストレージシステムを採用することも考えられる。さらに、コピー元のストレージシステムは、FMD１０３０を用いたストレージシステム１０００を採用し、コピー先のストレージシステムには、HDDを用いたストレージを採用したリモートミラーリングを実施することも考えられる。その理由としては、FMD1030とHDDの性能特性やビットコストが異なる事や、FMDに内臓されたフラッシュメモリが電荷を操作することでデータを保持するのに対して、HDDの場合は磁気によってデータを保持するため、データ消失やデータ化けを起こしやすい環境（例えば、温度、湿度、X線、電場、及び磁場のうちの少なくとも一つを含む）が異なることを利用して耐障害性を向上させる事を挙げることができる。
【０２１１】
さて、以下、更に説明を続ける。
【０２１２】
＜４．FMD１０３０の代替デバイス＞。
【０２１３】
＜４．１．SFMD１０３０（２）＞。
【０２１４】
FMD１０３０には、いくつかのバリエーションが考えられる。図２１に、その一例を示す。
【０２１５】
SFMD１０３０（２）は、FMD1030のsubstituteデバイスである。SFMD１０３０（２）は、SFMDマスターコントローラー２１０１０と、複数のI/Oポート２０３０（２）と、複数のFMD1030とを備える。各FMD１０３０は、I/Oポート２０３０を介してSFMDマスターコントローラー２１０１０と接続されている。なお、I/Oポート２０３０は内部バスで代替してもよく、図が示すように一つのI/Oポート２０３０が接続された形態でも、複数のI/Oポートが接続された形態でもよい。なお、一つのSFMD1030(2)に含まれるFMD１０３０は、以下の項目（Ｔ１）乃至（Ｔ３）が同じであるほうが望ましいと考えられる。
（Ｔ１）記憶容量[D]。
（Ｔ２）ブロックサイズ[D]。
（Ｔ３）FMDコントローラー2010の性能。
【０２１６】
SFMDマスターコントローラー２１０１０は、複数のFMD1030をまとめて一つの記憶領域を提供するため、ストライピング処理を行う。すなわち、コントローラー１０１０が、SFMD１０３０（２）にアクセスする際は、FMD１０３０のアドレス空間[D]ではなく、新たなアドレス空間[SD]を用いる。I/Oリクエストを受信したSFMDマスターコントローラー２１０１０は、ストライピング処理を行うことで、I/Oリクエストに含まれる開始アドレス[SD]とブロック長[SD]から、データが保存されているFMD1030とその開始アドレス[D]とブロック長[D]を得て、I/Oリクエストを送信する。なお、SFMD１０３０（２）に対するI/Oリクエストのブロック長[SD]が長い場合は、データ受信又はデータ送信の途中で、前記変換とFMD1030に対するI/Oリクエストの送信が行われることは、FMD1030の場合と同じである。
【０２１７】
好ましくは、SFMD１０３０（２）のブロックサイズ[SD]は、FMD1010のブロックサイズ[D]と等しいと考えられる。また、SFMD１０３０（２）のブロック数[SD]（または記憶容量[SD])は、内蔵するFMD1030のブロック数[D]（または記憶容量[D])の総数に等しいが、制御目的にFMD1030のブロック[D]の一部を用いる場合は、総数から当該ブロック分を差し引いた数でもよい。
【０２１８】
SFMDマスターコントローラー２１０１０は、以下の（Ｕ１）乃至（Ｕ４）の情報を、コントローラー１０１０へ送信することができる。
（Ｕ１）ブロック数[SD]。
（Ｕ２）ブロックサイズ[SD]。
（Ｕ３）空きブロック数[SD]。
（Ｕ４）FMP2020の数、及び／又は、FMD1030の数。
【０２１９】
なお、SFMDマスターコントローラー21010は、上記情報に加えて、FMD内部構成情報通知プログラム２０１３が提供する情報の一部または全てをコントローラー１０１０へ送信してもよい。
【０２２０】
ところで、SFMD１０３０（２）は、FMD１０３０と異なり、或るFMD1030の空きブロック数がゼロになった時点で、たとえ他のFMD１０３０の空きブロック数がゼロ以上であっても、ライトリクエストは失敗する。そのため、（Ｕ３）の空きブロック数[SD]の値は、各FMD1030の空きブロック数の最小値（または最小値にFMD１０３０の数を掛けた数）を報告することが考えられる。
【０２２１】
SFMD１０３０（２）は、FMD１０３０と比較して、以下に示す欠点と利点があると考えられる。
（欠点）FMPの利用効率が悪い。アクセスパターンによっては、特定のFMD１０３０にライトリクエストが集中するため、コンポーネントが閉塞になるまでの時間が短い。
（利点）ボトルネック箇所が少ない。FMDコントローラー２０１０で行われる空き領域管理やアドレス変換は、FMDアドレス変換情報２０１２の検索を必要とする負荷が低くない処理であるため、FMD１０３０に内蔵するFMPの数を増加させても、FMDコントローラー２１０１０のボトルネック化によって、性能が向上しない場合がある。これを回避するため、ブロックサイズ[D]を大きくすることで、FMD１０３０のアドレス変換時に検索するFMDアドレス変換情報２０１２の大きさを小さくして性能向上する方法も考えられる。しかし、大きすぎるブロックサイズは、ランダムアクセスが多い環境ではアクセスに直接関係ないデータまでステージングやデステージングをしてしまうため、性能が劣化する。SFMD１０３０（２）の場合は、アドレス変換は、複数のFMDコントローラー２０１０にて分散して処理されるため、ボトルネックとなりにくく、かつ大容量のFMPを多く搭載してもブロックサイズを大きくする必要がない。
【０２２２】
なお、上記欠点を解決するため、コントローラー１０１０で行われる以下の一つ以上の処理をSFMDマスターコントローラー２１０１０でも実行することも考えられる。
（処理１）ダイナミックスペアリング。SFMD１０３０（２）に内蔵するFMD１０３０の一部をスペア用途として扱い、稼働中のFMD１０３０の空きブロック数が少なくなった場合に、ダイナミックスペアリングを行う。冗長領域を割り当てるためにFMPの利用効率は下がるが、特定のFMD１０３０にアクセスが集中することによるコンポーネント閉塞までの時間は長くなる。
（処理２）ミラーリングやパリティ等の冗長データの付加。
【０２２３】
なお、上記の処理の有無について、SFMDマスターコントローラー２１０１０がコントローラー１０１０からの要求に応じて情報を送信することが考えられる。また、SFMD１０３０（２）の型番によって有無がわかるのであれば、当該情報をコントローラー１０１０が取得することによって前記情報取得に代えてもよい。
【０２２４】
＜４．２．SFMDとFMDの混在ストレージシステム＞。
【０２２５】
SFMD１０３０（２）とFMD１０３０は、コントローラー１０１０から同じ方法でリードリクエストやライトリクエストを送信できる。そのため、ストレージシステム１０００は、複数のSFMD1030(2)を搭載することができ、こうした構成でも、これまで説明してきた処理が実行可能である。さらに、ストレージシステム１０００は、SFMD１０３０（２）とFMD1030の両方を搭載することも可能である。こうした構成は、FMD１０３０におけるFMP数の違いと同様の理由にて発生しうる。この場合、SFMD1030（２）とFMD１０３０では、内部構造に起因するI/O特性の差や閉塞までの時間（耐久性）が異なるため、パリティグループにSFMD1030(2)とFMD1030が混在しないような構成をとることが考えられる。これを実現するため、コントローラー１０１０は、両デバイスの内部構造に関連する情報を取得し、その情報を、パリティグループ構成定義時にユーザーに提供したり、チェック処理に用いたりすることが考えられる。また、ユーザーがLUを利用するときに、当該LUが、SFMD1030(2)かFMD1030のいずれで構成されているのかを表示することで、ストレージ階層を意識したシステム活用を促進することも考えられる。しかし、デバイスが不足している場合等の理由が考えられるため、パリティグループに両デバイスが混在してもよい。
【０２２６】
さらに、SFMD1030（２）は、ダイナミックスペアリングや冗長データの有無によって部品点数が増加するかわりに耐久性を向上させることができるため、前記と同様に、内部構造（ダイナミックスペアリングや冗長データの有無を含める）をコントローラー１０１０が取得し、SFMD1030（２）の中でもさらに、ダイナミックスペアリング有りのデバイスだけでパリティグループを構成したり、冗長データ有りのデバイスだけでパリティグループを構成したりすることも考えられる。
【０２２７】
＜５．FMD１０３０の代替デバイスその２＞。
【０２２８】
＜５．１．マルチLU-FMD＞。
【０２２９】
これまでの説明では、FMD１０３０またはFMD１０３０（２）は、一つのLUをコントローラー１０１０に提供する。しかし、そのためには、少なくともSFMDマスターコントローラー21010のようなストライピング機能をデバイスに持たせる必要がある。このため、FMDの製造コストが高くなる可能性がある。
【０２３０】
図２２に示す、マルチLUのFMD１０３０（３）は、内蔵する複数のFMD１０３０をコントローラー１０１０へ提供する。提供方式の一例としては、I/Oポート２０３０（３）が持つWWNに属するLUとして各FMD１０３０を提供する方法が考えられる。コンバーター２２０１０は、例えば、ＬＵＮにて指定されたＦＭＤ１０３０へアクセスリクエストを振り分けたり、ＦＭＤ１０３０のポート２０３０がポート２０３０（２）と異なる転送媒体である場合に変換処理を行ったりする。一方、コントローラー１０１０は、マルチLU-FMD１０３０（３）に内蔵された複数のFMD１０３０を認識し、障害発生の有無は当該FMD１０３０を単位として管理する。なお、保守員はマルチLU-FMD１０３０（３）単位で保守交換を行うことができる。
【０２３１】
＜５．２．マルチLU-FMD１０３０（３）を用いたパリティグループ構成＞。
【０２３２】
マルチLU-FMD１０３０（３）を用いてパリティグループを構成する場合、コントローラー１０１０は、或るマルチLU-FMD１０３０（３）から複数のFMD１０３０を選択してパリティグループを構成しないようにする必要がある。なぜならば、物理的な障害の単位、電源断の単位、及び、デバイスの抜き差しを行う単位のうちの少なくとの一つの単位は、マルチLU-FMD1030(３)であるため、同一デバイスから複数のFMD１０３０を用いていた状況でデバイス障害が発生すると、パリティグループのデータ復元処理が不可能になってしまうからである。
【０２３３】
上記パリティグループ構成を支援するために、コントローラー１０１０は、パリティグループ構成を定義する場合に以下の二つの方法を用いることが考えられる。
（方法１）パリティグループ構成定義時、コントローラー１０１０は、例えば、ＧＵＩ（Graphical User Interface）により、マルチLU-FMD１０３０(３)とそこに内蔵されているFMD1030の対応関係を表示し、ユーザーから、複数のFMD1030の指定を受け付ける。その指定を受けたコントローラー１０１０は、指定された複数のFMD１０３０の一部が同じマルチLU-FMD1030(3)に属していないかチェックを行う。
（方法２）パリティグループ構成定義時、コントローラー１０１０は、例えば、ＧＵＩにより、マルチLU-FMD１０３０(３)の一覧を表示し、ユーザーから、複数のマルチLU-FMD１０３０（３）の指定を受け付ける。指定を受けたコントローラー１０１０は、指定された複数のマルチLU-FMD1030(3)が、それぞれ互いに、搭載されたFMD１０３０の数と記憶容量が等しいことをチェックする。その後、コントローラー１０１０は、図２３に例示するように、各マルチLU-FMD1030(3)のFMD1030により構成するサブパリティグループを定義し、さらに、マルチLU-FMD１０３０(３)内の複数のサブパリティグループを、Concatenate等で結合した領域をパリティグループとして用いたり、ユーザーに提供したりする。なお、"Concatenate"について説明すると、例えば、ＬＵ１にＬＵ２をConcatenateするとは、ＬＵ１のアドレス空間の最後尾にＬＵ２のアドレス空間の先頭をくっつけることである。
【０２３４】
＜５．２．ダイナミックスペアリングと閉塞検知＞。
【０２３５】
マルチLU-FMD１０３０（３）を用いる場合も、SFMD1030(2)と同様に、特定のFMD１０３０にライトリクエストが集中することがある。そのため、コントローラー１０１０は、各マルチLU-FMD１０３０(３)内の各FMDの空き容量を把握し、いずれかのFMD１０３０に対して空きブロック数が少なくなってきた時点で、当該FMD１０３０を他のマルチLU-FMD１０３０(３)に内蔵されたFMD1030へダイナミックスペアリングを行う。あるいは、各マルチLU-FMD1030（３）利用時にあらかじめスペアリング用のFMD1030を確保しておき、或るFMD１０３０の空きブロック数が少なくなってきた時点で、当該FMD１０３０から、当該FMD１０３０と同じマルチLU-FMD1030(３)に内蔵されるスペアリング用のFMD1030へダイナミックスペアリングを行う方法も考えられる。あるいは、コントローラー１０１０が、空きブロック数が少なくなったマルチＬＵ−ＦＭＤ１０３０（３）内に、スペアリング用のＦＭＤ１０３０が無い場合には、他のマルチＬＵ−ＦＭＤ１０３０（３）のＦＭＤを自己のスペアリング用のＦＭＤ１０３０として使う方法も考えられる。また、コントローラー１０１０（例えば構成制御プログラム４０３０）が、コピー先のスペアリング用のＦＭＤ１０３０を、コピー元のＦＭＤ１０３０が属していたパリティグループ（或いはサブパリティグループ）の要素とし、そのコピー元のＦＭＤ１０３０を、そのパリティグループ（或いはサブパリティグループ）から外すことができる。具体的には、例えば、ＰＧ構成情報４０６０において、そのパリティグループ（或いはサブパリティグループ）に対応する欄に、コピー先のスペアリング用のＦＭＤ１０３０のＩＤを追加し、その欄から、コピー元のＦＭＤ１０３０のＩＤを削除することができる。
【０２３６】
なお、マルチLU-FMD１０３０（３）を内蔵したストレージシステムについても、これまで説明した処理が適用可能である。例えば、ユーザーがパリティグループ構成を定義する際は、各マルチLU-FMD１０３０から、内蔵するFMPの数またはFMD１０３０の数を取得し、同じ数のデバイス同士でパリティグループを構成する等がある。
【０２３７】
また、マルチLU-FMD1030(3)を内蔵したストレージシステムの場合、閉塞検知は、FMD1030単位で行うことができる。そのため、パリティグループとしてみた場合は、データ復元処理が不可能な場合でも、サブパリティグループとしてみた場合は、データ復元処理が可能または不要でI/Oリクエストを処理可能な場合がある。もし、内部LUが、このようなI/Oリクエストを処理可能なサブパリティグループだけで構成されている場合は、コントローラー１０１０は、パリティグループとしてはデータ復元処理が不可能と判断した場合でも、内部LUを閉塞とせずにI/Oリクエストを継続させてもよい。
【０２３８】
以上、本発明の実施形態を説明したが、これは本発明の説明のための例示であって、本発明の範囲をこの実施形態にのみ限定する趣旨ではない。本発明は、他の種々の形態でも実施することが可能である。例えば、コントローラー１０１０は、他の構成を採用することもできる。例えば、上記の構成に代えて、上位装置との通信を制御する複数の第一の制御部（例えば制御回路基板）と、FMD１０３０との通信を制御する複数の第二の制御部（例えば制御回路基板）と、上位装置とFMD１０３０との間で授受されるデータを記憶することができるキャッシュメモリと、ストレージシステム１０００を制御するためのデータを記憶することができる制御メモリと、各第一の制御部、各第二の制御部、キャッシュメモリ及び制御メモリを接続する接続部（例えば、クロスバスイッチなどのスイッチ）とを備えることができる。この場合、第一の制御部と第二の制御部の一方が、又は双方が協働して、前述したコントローラー１０１０としての処理を行うことができる。制御メモリは無くても良く、その場合、キャッシュメモリに、制御メモリが記憶する情報を記憶する領域が設けられても良い。
【図面の簡単な説明】
【０２３９】
【図１】図１は、本発明の一実施形態に係る情報システムのハードウェア構成の一例を示す図である。
【図２】図２は、ＦＭＤのハードウェア構成及びソフトウェア構成のそれぞれの一例について示した図である。
【図３】図３は、本実施形態の概要を示す図である。
【図４】図４は、ホスト１１００とストレージシステム１０００のそれぞれに存在するコンピュータプログラムと情報を示す図である。
【図５】図５は、コントローラー１０１０にて保存されるＦＭＤ情報４０５０の構成例を示す図である。
【図６】図６は、ＰＧ構成情報４０６０の構成例を示す図である。
【図７】図７は、内部LU構成情報４０７０の構成例を示す図である。
【図８】図８は、ＲＡＩＤ１＋０のパリティグループのアドレス空間を示す。
【図９】図９は、ＲＡＩＤ５のパリティグループのアドレス空間を示す。
【図１０】図１０は、図８のアドレス空間でのキャッシュ使用例を示す。
【図１１】図１１は、図９のアドレス空間でのキャッシュ使用例の一部を示す。
【図１２】図１２は、図９のアドレス空間でのキャッシュ使用例の残りの一部を示す。
【図１３】図１３は、LUパス定義情報４０８０の構成例を示す。
【図１４】図１４は、構成制御プログラム４０３０にて実行される、パリティグループの定義処理について示したフローである。
【図１５】図１５は、構成制御プログラム４０３０にて実行される、内部ＬＵの定義処理について示したフローである。
【図１６】図１６は、構成制御プログラム４０３０にて実行される、ＬＵのパス定義処理について示したフローである。
【図１７】図１７は、Ｉ／Ｏ処理プログラム４０１０がライトリクエストを受信した場合に行われる処理のフローである。
【図１８】図１８は、キャッシュ制御プログラム４０２０が繰り返し実行するパリティ作成とデステージングの手順を示す。
【図１９】図１９は、Ｉ／Ｏ処理プログラム４０１０がリードリクエストを受信した場合に行われる処理の流れの一例を示す。
【図２０】図２０は、アドレス空間の階層構造の一例を示す。
【図２１】図２１は、FMD１０３０のバリエーションの一つであるSFMD１０３０の構成例を示す。
【図２２】図２２は、FMD１０３０のバリエーションの一つであるマルチLU-FMD１０３０（３）の構成例を示す。
【図２３】図２３は、図２２のマルチLU-FMD１０３０（３）のFMD１０３０により構成されたサブパリティグループの一例を示す。
【符号の説明】
【０２４０】
１０００…ストレージシステム  １０１０…コントローラー  １０２０…キャッシュメモリ  １０３０…ＦＭＤ（フラッシュメモリデバイス）
【図１】
0004818812.tif 000002
【図２】
0004818812.tif 000003
【図３】
0004818812.tif 000004
【図４】
0004818812.tif 000005
【図５】
0004818812.tif 000006
【図６】
0004818812.tif 000007
【図７】
0004818812.tif 000008
【図８】
0004818812.tif 000009
【図９】
0004818812.tif 000010
【図１０】
0004818812.tif 000011
【図１１】
0004818812.tif 000012
【図１２】
0004818812.tif 000013
【図１３】
0004818812.tif 000014
【図１４】
0004818812.tif 000015
【図１５】
0004818812.tif 000016
【図１６】
0004818812.tif 000017
【図１７】
0004818812.tif 000018
【図１８】
0004818812.tif 000019
【図１９】
0004818812.tif 000020
【図２０】
0004818812.tif 000021
【図２１】
0004818812.tif 000022
【図２２】
0004818812.tif 000023
【図２３】
0004818812.tif 000024