(57)【要約】  ユーザデータと冗長コードを分散して格納する計算機システムの性能を向上させる。  複数の計算機におけるユーザデータ領域及び冗長コード領域の位置を示すグループ情報を生成し、各計算機は、ライトデータのライト要求を受けた場合、ローカルの記憶デバイスへライトデータを書き込み、グループ情報に基づいて他の計算機から転送先計算機を選択し、ライトデータに基づく転送データを転送先計算機へ送信し、各計算機は、複数の他の計算機から複数の転送データを夫々受信した場合、グループ情報に基づいて複数の転送データから冗長コードを生成し、ローカルの記憶デバイスへ冗長コードを書き込み、複数の計算機の構成が変更される場合、各計算機は、変更された構成に基づいてグループ情報を変更する。
2017145223.tif 000002
【特許請求の範囲】
【請求項１】
複数の計算機を備え、
各計算機は、記憶デバイスを含み、
各計算機は、前記記憶デバイスに基づく論理記憶領域のうち、ユーザデータを格納するユーザデータ領域と、前記ユーザデータに基づく冗長コードを格納する冗長コード領域とを含む、複数のグループを設定し、各グループに対し、前記複数の計算機における前記ユーザデータ領域及び前記冗長コード領域の位置を示すグループ情報を生成し、
各計算機は、ライトデータのライト要求を受けた場合、ローカルの記憶デバイスへ前記ライトデータを書き込み、前記グループ情報に基づいて他の計算機から転送先計算機を選択し、前記ライトデータに基づく転送データを前記転送先計算機へ送信し、
各計算機は、複数の他の計算機から複数の転送データを夫々受信した場合、前記グループ情報に基づいて前記複数の転送データから冗長コードを生成し、ローカルの記憶デバイスへ前記冗長コードを書き込み、
前記複数の計算機の構成が変更される場合、各計算機は、前記変更された構成に基づいて前記グループ情報を変更し、ローカルの記憶デバイスからユーザデータを読み出し、変更後のグループ情報に基づいて、前記読み出されたユーザデータに基づく変更後の冗長コードを格納する計算機である新冗長コード計算機を選択し、前記読み出されたユーザデータに基づく再転送データを前記新冗長コード計算機へ送信し、変更前のグループ情報に基づいて、前記読み出されたユーザデータに基づく変更前の冗長コードを格納している計算機である旧冗長コード計算機を選択し、前記変更前の冗長コードを消去することを要求する消去要求を、前記旧冗長コード計算機へ送信する、
計算機システム。
【請求項２】
各計算機は、前記ライトデータを書き込む論理記憶領域を選択し、前記論理記憶領域に対応するユーザデータ領域を選択し、前記グループ情報に基づいて、前記選択されたユーザデータ領域に対応する冗長コード領域を含む前記転送先計算機を選択し、前記ライトデータを前記転送データとして前記転送先計算機へ送信し、
前記複数の計算機の構成が変更される場合、各計算機は、ローカルの記憶デバイスからユーザデータを読み出し、前記読み出されたユーザデータを再転送データとして前記新冗長コード計算機へ送信する、
請求項１に記載の計算機システム。
【請求項３】
各計算機は、プロセッサを含み、
前記プロセッサは、前記複数の転送データを受信した場合、前記グループ情報に基づいて、前記複数の転送データから前記冗長コードを生成し、ローカルの記憶デバイスへ前記冗長コードを書き込む、
請求項２に記載の計算機システム。
【請求項４】
前記プロセッサは、一つの計算機に位置する複数のグループが互いに異なることを条件として、前記グループ情報の生成及び変更を行い、
前記グループ情報の変更後の冗長度は、前記グループ情報の変更前の冗長度に等しい、
請求項３に記載の計算機システム。
【請求項５】
前記複数の計算機の何れかが前記計算機システムから離脱する場合、前記プロセッサは、前記離脱する計算機を含まないグループ情報を、前記変更後のグループ情報として生成する、
請求項４に記載の計算機システム。
【請求項６】
計算機が前記計算機システムへ加入する場合、前記プロセッサは、前記加入する計算機を含むグループ情報を、前記変更後のグループ情報として生成する、
請求項５に記載の計算機システム。
【請求項７】
前記複数の計算機の何れかの障害が発生した場合、前記プロセッサは、前記グループ情報に基づいて、前記障害を持つ計算機以外の計算機に格納されているユーザデータから前記障害を持つ計算機に格納されているユーザデータを復元し、前記障害を持つ計算機を含まないグループ情報を、前記変更後のグループ情報として生成する、
請求項６に記載の計算機システム。
【請求項８】
前記プロセッサは、ローカルの記憶デバイスに基づくプールを生成し、前記プールに基づく仮想ボリュームを生成し、
前記プロセッサは、前記ライト要求に応じて、前記プール内の論理記憶領域を前記仮想ボリュームへ割り当て、
前記プロセッサは、前記割り当てられた論理記憶領域に対応するユーザデータ領域を特定し、
前記プロセッサは、前記仮想ボリュームにアクセスするアプリケーションプログラムを実行し、
前記障害が発生した場合、前記プロセッサは、前記障害を持つ計算機で実行されている特定アプリケーションプログラムを、前記障害を持つ計算機以外の計算機へ移行する場合の前記複数の計算機の間の通信量と、前記複数の計算機の夫々のリソースの使用量とに基づいて、前記特定アプリケーションプログラムの移行先の計算機を選択し、前記復元されたユーザデータを前記移行先の計算機へコピーし、前記特定アプリケーションプログラムを前記移行先の計算機へ移行する、
請求項７に記載の計算機システム。
【請求項９】
複数の計算機は、複数のサイトに配置され、
各計算機は、ユーザデータ領域と冗長コード領域を含む複数のサイトグループを設定し、各サイトグループに対し、前記複数のサイトにおけるユーザデータ領域及び冗長コード領域の位置を示すサイトグループ情報を生成し、
各計算機は、前記ライト要求を受けた場合、ローカルの記憶デバイスへ前記ライトデータを書き込み、
各計算機は、前記ライト要求と非同期で、前記サイトグループ情報に基づいて他のサイトから転送先サイトを選択し、前記ライトデータに基づくサイト転送データを前記転送先サイトへ送信し、
各計算機は、複数の他のサイトから複数のサイト転送データを夫々受信した場合、前記サイトグループ情報に基づいて前記複数のサイト転送データからサイト冗長コードを生成し、ローカルの記憶デバイスへ前記サイト冗長コードを書き込み、
前記複数のサイトの構成が変更される場合、各計算機は、前記変更された複数のサイトの構成に基づいて前記サイトグループ情報を変更し、ローカルの記憶デバイスからデータを読み出し、変更後のサイトグループ情報に基づいて、前記読み出されたデータに対応する変更後のサイト冗長コードを格納するサイトである新冗長コードサイトを選択し、前記読み出されたデータに基づくサイト再転送データを前記新冗長コードサイトへ送信し、変更前のサイトグループ情報に基づいて、前記読み出されたデータに対応する変更前のサイト冗長コードを格納するサイトである旧冗長コードサイトを選択し、前記変更前のサイト冗長コードを消去することを要求する消去要求を、前記旧冗長コードサイトへ送信する、
請求項１に記載の計算機システム。
【請求項１０】
各計算機は、複数の記憶デバイスを含み、
各計算機は、ユーザデータ領域と冗長コード領域を含む複数の記憶デバイスグループを設定し、各記憶デバイスグループに対し、複数の記憶デバイスにおけるユーザデータ領域と冗長コード領域の位置を示す記憶デバイスグループ情報を生成し、
各計算機は、前記ライト要求を受けた場合、前記複数の記憶デバイスの中の第一記憶デバイスへ前記ライトデータを書き込み、前記記憶デバイスグループ情報に基づいて、前記ライトデータから記憶デバイス冗長コードを生成し、前記記憶デバイスグループ情報に基づいて、前記複数の記憶デバイスの中の第二記憶デバイスへ前記記憶デバイス冗長コードを書き込み、
前記複数の記憶デバイスの構成が変更される場合、前記変更された複数の記憶デバイスに対応する計算機は、前記変更された複数の記憶デバイスの構成に基づいて前記記憶デバイスグループ情報を変更し、記憶デバイスからデータを読み出し、変更後の記憶デバイスグループ情報に基づいて、前記読み出されたデータに対応する変更後の記憶デバイス冗長コードを格納する記憶デバイスである新冗長コード記憶デバイスを選択し、前記読み出されたデータに基づく記憶デバイス再転送データを前記新冗長コード記憶デバイスへ書き込み、変更前の記憶デバイスグループ情報に基づいて、前記読み出されたデータに対応する変更前の記憶デバイス冗長コードを格納している記憶デバイスである旧冗長コード記憶デバイスを選択し、前記変更前の記憶デバイス冗長コードを消去することを要求する消去要求を、前記旧冗長コード記憶デバイスへ発行する、
請求項１に記載の計算機システム。
【請求項１１】
各計算機は、プロセッサを含み、
前記記憶デバイスは、不揮発性半導体メモリと、前記不揮発性半導体メモリに接続される内部プロセッサとを含み、
前記プロセッサは、前記ライトデータを書き込む論理記憶領域を選択し、前記論理記憶領域に対応するユーザデータ領域を選択し、前記ライトデータを伴うライトコマンドをローカルの記憶デバイスへ発行し、前記グループ情報に基づいて、前記選択されたユーザデータ領域に対応する冗長コード領域を含む前記転送先計算機を選択し、前記転送先計算機へ前記ライトデータを送信し、
前記内部プロセッサは、前記ライトコマンドを受けた場合、前記ライトデータを前記不揮発性半導体メモリへ書き込み、
前記プロセッサは、前記複数の転送データを受信した場合、前記グループ情報に基づいて、前記複数の転送データを伴う冗長コード生成コマンドをローカルの記憶デバイスへ発行し、
前記内部プロセッサは、前記冗長コード生成コマンドを受けた場合、前記複数の転送データから前記冗長コードを生成し、前記冗長コードを前記不揮発性半導体メモリへ書き込む、
請求項２に記載の計算機システム。
【請求項１２】
各計算機は、前記ライト要求を受けた場合、ローカルの記憶デバイスへ前記ライトデータを書き込み、前記ライトデータに基づいて一次冗長コードを生成し、前記グループ情報に基づいて他の計算機から複数の転送先計算機を選択し、各転送先計算機へ、前記ライトデータの一部及び前記一次冗長コードから選択されたデータを転送データとして送信し、
前記複数の計算機の構成が変更される場合、各計算機は、ローカルの記憶デバイスからユーザデータを読み出し、前記読み出されたユーザデータに基づいて一次冗長コードを生成し、前記変更後のグループ情報に基づいて、複数の新冗長コード計算機を選択し、各新冗長コード計算機へ、前記読み出したユーザデータの一部及び前記生成した一次冗長コードから選択されたデータを、再転送データとして送信し、
複数の他の計算機から複数の再転送データを夫々受信した場合、前記グループ情報に基づいて、前記複数の再転送データから変更後の冗長コードを生成し、ローカルの記憶デバイスへ前記変更後の前記冗長コードを書き込み、変更前のグループ情報に基づいて、前記読み出されたユーザデータ及び一次冗長コードに対応する変更前の冗長コードを格納している計算機である前記旧冗長コード計算機を選択し、前記変更前の冗長コードを消去することを要求する前記消去要求を、前記旧冗長コード計算機へ送信する、
請求項１に記載の計算機システム。
【請求項１３】
複数の計算機を含む計算機システムの、制御方法であって、
各計算機内の記憶デバイスに基づく論理記憶領域のうち、ユーザデータを格納するユーザデータ領域と、前記ユーザデータに基づく冗長コードを格納する冗長コード領域とを含む、複数のグループを設定し、各グループに対し、前記複数の計算機における前記ユーザデータ領域及び前記冗長コード領域の位置を示すグループ情報を生成し、
各計算機がライトデータのライト要求を受けた場合、ローカルの記憶デバイスへ前記ライトデータを書き込み、前記グループ情報に基づいて他の計算機から転送先計算機を選択し、前記ライトデータの少なくとも一部を含む転送データを前記転送先計算機へ送信し、
各計算機が複数の他の計算機から複数の転送データを夫々受信した場合、前記グループ情報に基づいて前記複数の転送データから冗長コードを生成し、ローカルの記憶デバイスへ前記冗長コードを書き込み、
前記複数の計算機の構成が変更される場合、前記変更された構成に基づいて前記グループ情報を変更し、ローカルの記憶デバイスからユーザデータを読み出し、変更後のグループ情報に基づいて、前記読み出されたユーザデータに基づく変更後の冗長コードを格納する計算機である新冗長コード計算機を選択し、前記読み出されたユーザデータに基づく再転送データを前記新冗長コード計算機へ送信し、変更前のグループ情報に基づいて、前記読み出されたユーザデータに基づく変更前の冗長コードを格納している計算機である旧冗長コード計算機を選択し、前記変更前の冗長コードを消去することを要求する消去要求を、前記旧冗長コード計算機へ送信する、
ことを備える制御方法。
【請求項１４】
複数の計算機を制御するプロセスを前記計算機に実行させる制御プログラムを格納する計算機読取可能な記録媒体であって、
前記プロセスは、
各計算機内の記憶デバイスに基づく論理記憶領域のうち、ユーザデータを格納するユーザデータ領域と、前記ユーザデータに基づく冗長コードを格納する冗長コード領域とを含む、複数のグループを設定し、各グループに対し、前記複数の計算機における前記ユーザデータ領域及び前記冗長コード領域の位置を示すグループ情報を生成し、
ライトデータのライト要求を受けた場合、ローカルの記憶デバイスへ前記ライトデータを書き込み、前記グループ情報に基づいて他の計算機から転送先計算機を選択し、前記ライトデータの少なくとも一部を含む転送データを前記転送先計算機へ送信し、
複数の他の計算機から複数の転送データを夫々受信した場合、前記グループ情報に基づいて前記複数の転送データから冗長コードを生成し、ローカルの記憶デバイスへ前記冗長コードを書き込み、
前記複数の計算機の構成が変更される場合、前記変更された構成に基づいて前記グループ情報を変更し、ローカルの記憶デバイスからユーザデータを読み出し、変更後のグループ情報に基づいて、前記読み出されたユーザデータに基づく変更後の冗長コードを格納する計算機である新冗長コード計算機を選択し、前記読み出されたユーザデータに基づく再転送データを前記新冗長コード計算機へ送信し、変更前のグループ情報に基づいて、前記読み出されたユーザデータに基づく変更前の冗長コードを格納している計算機である旧冗長コード計算機を選択し、前記変更前の冗長コードを消去することを要求する消去要求を、前記旧冗長コード計算機へ送信する、
ことを備える、
記録媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、計算機システムに関する。
【背景技術】
【０００２】
従来の分散型ストレージシステムは、ユーザデータと当該ユーザデータの冗長コードを複数の計算機ノードに分散して格納し、データを保護する。障害が発生した計算機ノードからデータを復旧する際は、障害が発生した計算機ノード上のデータを、冗長コードから復元した後、生存している各計算機ノードに分散して、格納する。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】米国特許第７５４６３４２号明細書
【発明の概要】
【発明が解決しようとする課題】
【０００４】
このような分散型ストレージシステムにおける計算機ノードは、アプリケーションプログラムから受信したユーザデータを、複数の計算機ノードに分散させる。このため、アプリケーションプログラムが分散型ストレージシステムからデータを読み出す際、データが計算機ノード間のネットワーク上に転送されるため、レイテンシ及びスループットが悪化する。また、障害が発生した計算機ノードからのデータ復旧時も、ユーザデータを複数の計算機ノードに分散して復旧するため、同様の課題が生じる。
【課題を解決するための手段】
【０００５】
上記課題を解決するために、本発明の一態様である計算機システムは、複数の計算機を備える。各計算機は、記憶デバイスを含む。各計算機は、前記記憶デバイスに基づく論理記憶領域のうち、ユーザデータを格納するユーザデータ領域と、前記ユーザデータに基づく冗長コードを格納する冗長コード領域とを含む、複数のグループを設定し、各グループに対し、前記複数の計算機における前記ユーザデータ領域及び前記冗長コード領域の位置を示すグループ情報を生成し、各計算機は、ライトデータのライト要求を受けた場合、ローカルの記憶デバイスへ前記ライトデータを書き込み、前記グループ情報に基づいて他の計算機から転送先計算機を選択し、前記ライトデータに基づく転送データを前記転送先計算機へ送信し、各計算機は、複数の他の計算機から複数の転送データを夫々受信した場合、前記グループ情報に基づいて前記複数の転送データから冗長コードを生成し、ローカルの記憶デバイスへ前記冗長コードを書き込み、前記複数の計算機の構成が変更される場合、各計算機は、前記変更された構成に基づいて前記グループ情報を変更し、ローカルの記憶デバイスからユーザデータを読み出し、変更後のグループ情報に基づいて、前記読み出されたユーザデータに基づく変更後の冗長コードを格納する計算機である新冗長コード計算機を選択し、前記読み出されたユーザデータに基づく再転送データを前記新冗長コード計算機へ送信し、変更前のグループ情報に基づいて、前記読み出されたユーザデータに基づく変更前の冗長コードを格納している計算機である旧冗長コード計算機を選択し、前記変更前の冗長コードを消去することを要求する消去要求を、前記旧冗長コード計算機へ送信する。
【発明の効果】
【０００６】
ユーザデータと冗長コードを分散して格納する計算機システムの性能を向上させることができる。
【図面の簡単な説明】
【０００７】
【図１】実施例１に係る分散型ストレージシステムの障害からのデータ復旧処理の概要を示す。
【図２】分散型ストレージシステムのシステム構成例を示す。
【図３】分散型ストレージシステムのソフトウェア構成例を示す。
【図４】分散型ストレージシステムにおける複数ノードのページマッピングの例を示す。
【図５】分散型ストレージシステムの制御のための情報を示す。
【図６】保護レイヤ＃２の静的マッピングテーブル５０６を示す。
【図７】保護レイヤ情報５０１におけるログ構造化マッピングテーブル５０８を示す。
【図８】ローカル領域制御テーブル５０９を示す。
【図９】仮想化プロビジョニング情報５０２に含まれる情報を示す。
【図１０】ストレージ構成情報５０４の第一部分を示す。
【図１１】ストレージ構成情報５０４の第二部分を示す。
【図１２】キャッシュ情報５０３を示す。
【図１３】管理プログラム３０３の制御のための情報を示す。
【図１４】システム構成情報１３０１に含まれる情報を示す。
【図１５】リソース監視情報１３０２に含まれる情報を示す。
【図１６】ストレージプログラム３０２及び管理プログラム３０３の内部構成を示す。
【図１７】一時配置パタンテーブル３０００を示す。
【図１８】ストレージプログラム３０２が実行するリード処理のフローチャートを示す。
【図１９】ストレージプログラム３０２が実行する同期ライト処理のフローチャートを示す。
【図２０】ストレージプログラム３０２が実行する非同期ライト処理のフローチャートを示す。
【図２１】ストレージプログラム３０２が実行するデステージ処理のフローチャートを示す。
【図２２】ストレージプログラム３０２が実行する容量枯渇管理処理のフローチャートを示す。
【図２３】管理プログラム３０３及びストレージプログラム３０２における、ノード障害からの復旧処理のフローチャートを示す。
【図２４】ストレージプログラム３０２が実行するデータコピー処理のフローチャートを示す。
【図２５】ストレージプログラム３０２が実行するコレクションリード処理のフローチャートを示す。
【図２６】ストレージプログラム３０２が実行するコレクションライト処理のフローチャートを示す。
【図２７】ストレージプログラム３０２が実行する冗長化先変更処理の概念を示す。
【図２８】ストレージプログラム３０２が実行する冗長化先変更処理のフローチャートを示す。
【図２９】管理プログラム３０３が実行する仮想マシン移動先選定処理のフローチャートを示す。
【図３０】ノード設定画面の構成例を示す。
【図３１】配置ポリシ設定画面の構成例を示す。
【図３２】実施例２におけるオフロード構成を示す。
【図３３】分散型ストレージシステムの制御のためにフラッシュドライブ３３０１で管理されるログ構造化マッピングテーブル５０８ｂの構成例について示す。
【図３４】コーディネータプログラム３４０１とドライブプログラム３４０２間の通信インタフェースを示す。
【図３５】実施例２のリード処理のフローチャートを示す。
【図３６】実施例２の同期ライト処理のフローチャートを示す。
【図３７】実施例２のデステージ処理のフローチャートを示す。
【図３８】実施例２のコレクションリード処理のフローチャートを示す。
【図３９】実施例３の冗長化処理を示す。
【図４０】実施例３のデータ復元処理を示す。
【図４１】実施例３の冗長化先変更処理を示す。
【発明を実施するための形態】
【０００８】
以下、図面を参照して本発明の実施形態を説明する。
【０００９】
尚、以下に説明する実施形態は特許請求の範囲にかかる発明を限定するものではなく、また実施形態の中で説明されている特徴の組み合わせの全てが発明の解決手段に必須であるとは限らない。
【００１０】
以下の説明では、「テーブル」、「リスト」、「キュー」等の表現にて各種情報を説明することがあるが、各種情報は、これら以外のデータ構造で表現されていても良い。データ構造に依存しないことを示すために「ＸＸテーブル」、「ＸＸリスト」等を「ＸＸ情報」と呼ぶことがある。各情報の内容を説明する際に、「識別情報」、「識別子」、「名」、「ＩＤ」、「番号」等の表現を用いるが、これらについてはお互いに置換が可能である。
【００１１】
また、以下の説明では、同種の要素を区別しないで説明する場合には、参照符号又は参照符号における共通番号を使用し、同種の要素を区別して説明する場合は、その要素の参照符号を使用又は参照符号に代えてその要素に割り振られたＩＤを使用することがある。
【００１２】
また、以下の説明では、「プログラム」を主語として処理を説明する場合があるが、プログラムは、プロセッサ（例えばＣＰＵ（Central Processing Unit））によって実行されることで、定められた処理を、適宜に記憶資源（例えばメモリ）及び／又はインターフェースデバイス（例えば通信ポート）等を用いながら行うため、処理の主語がプロセッサとされてもよい。プログラムを主語として説明された処理は、プロセッサあるいはそのプロセッサを有する装置が行う処理又はシステムとしてもよい。また、プロセッサは、処理の一部または全部を行うハードウェア回路を含んでもよい。プログラムは、プログラムソースから計算機のような装置にインストールされてもよい。プログラムソースは、例えば、プログラム配布サーバまたは計算機が読み取り可能な記憶メディアであってもよい。プログラムソースがプログラム配布サーバの場合、プログラム配布サーバはプロセッサ（例えばＣＰＵ）と記憶資源を含み、記憶資源はさらに配布プログラムと配布対象であるプログラムとを記憶してよい。そして、プログラム配布サーバのプロセッサが配布プログラムを実行することで、プログラム配布サーバのプロセッサは配布対象のプログラムを他の計算機に配布してよい。また、以下の説明において、２以上のプログラムが１つのプログラムとして実現されてもよいし、１つのプログラムが２以上のプログラムとして実現されてもよい。
【実施例１】
【００１３】
本実施例は、分散型ストレージシステムを開示する。分散型ストレージシステムは、それぞれがストレージデバイスを含む複数の計算機ノードを含む。複数の計算機ノードは、ネットワークにより互いに接続される。分散型ストレージシステムは、複数の計算機ノードのストレージデバイスによってストレージプールを作成し、ストレージプールを用いて仮想的なストレージシステムを実現する。【００１４】
本開示において、ストレージデバイスは、１台のＨＤＤ（Hard Disk Drive）やＳＳＤ（Solid State Drive）等の１台のストレージドライブ、複数台のストレージドライブを含むＲＡＩＤ装置、及び複数のＲＡＩＤ装置を含む。ストライプ（ストライプデータ）は、データ保護のための冗長コードの生成の元となるデータユニットである。ストライプを、冗長コードと区別するためにユーザデータと呼ぶことがある。ストライプは、計算機ノード内のストレージデバイスに格納されると共に、他の計算機ノードにおける冗長コードの生成において使用される。【００１５】
ストライプタイプは、冗長コードを生成するストライプのクラスである。或るストライプが属するストライプタイプは、例えば、当該ストライプの論理アドレスと当該ストライプを格納する計算機ノードとによって決定される。ストライプタイプの識別子であるストライプタイプ番号は、対応する計算機ノードのグループを示す。一つのストライプは、互いに異なる複数の保護レイヤのストライプタイプに属することができる。ホストは、計算機ノード、当該計算機ノードで動作するプロセッサ、又は当該プロセッサが実行するアプリケーションプログラムである。【００１６】
図１は、実施例１に係る分散型ストレージシステムの障害からのデータ復旧処理の概要を示す。【００１７】
複数の計算機ノード１０１は、ネットワークを介し互いに通信する。以下において、計算機ノードを、単にノードと呼ぶ。複数のノード１０１は夫々、ノード＃０〜＃３と表される。【００１８】
ノード１０１は、ストレージプログラム３０２、アプリケーションプログラム（アプリ）３０１、管理プログラム３０３を実行する。ストレージプログラム３０２は、ドライブ１０５を管理しており、仮想ボリューム１０７をアプリケーションプログラム３０１に提供する。ノード＃０〜＃３は、アプリケーションプログラムＡ〜Ｄが夫々実行し、ストレージプログラムＡ〜Ｄが夫々実行する。ストレージプログラムＡ〜Ｄは、仮想ボリュームＡ〜Ｄを夫々提供する。【００１９】
正常時、ノード＃０のストレージプログラムＡは、アプリケーションプログラムＡから受信したユーザデータＤ１を自ノード＃０（ローカル）のストレージドライブに格納し、さらに静的マッピングテーブル５０６Ａを用いて、ユーザデータＤ１に対する冗長コードを格納する他ノード＃１を選択し、他ノード＃１（リモート）にユーザデータを転送する。当該ノード１０１Ｂは、他ノードから受信したユーザデータに基づいてノード間の冗長コードＰを生成し、冗長コードＰを自ノードのストレージドライブ１０５に格納する。以後、自ノードや自サイトを自系と呼び、他ノードや他サイトを他系と呼ぶことがある。【００２０】
管理プログラム３０３は、各ノード上で動作するストレージプログラム３０２、アプリケーションプログラム３０１とネットワークを介し、後述の管理オペレーションを発行する。この図の例では、管理プログラム３０３は、ノード＃３でのみ動作しているが、複数のノード上で動作してもよい。【００２１】
以上のようなシステムにおいて、ノード＃０に障害が発生した際、まず、管理プログラム３０３は、障害ノード＃０上で動作していたストレージプログラムＡを、生存している別ノード＃１に再起動する。この際、ストレージプログラムＡは、アプリケーションプログラムＡに提供していた仮想ボリュームＡを提供する。当該仮想ボリュームＡは、ストレージドライブ１０５を消失しているため、データの実体がない。そのため、ストレージプログラムＡは、当該仮想ボリュームＡへのアクセスに対し、コレクション処理により、データを復旧し、アプリケーションプログラムＡへデータを返却する。【００２２】
次に、管理プログラム３０３は、アプリケーションプログラムのフェイルオーバ先のノード＃１を選定し、フェイルオーバ先のノード＃１上で動作するストレージプログラムＢへデータ移行要求を発行する。ストレージプログラムＢは、ストレージプログラムＡの仮想ボリュームＡを、内部の仮想ボリュームとしてマッピングする外部接続を行い、自身のストレージデバイスとして処理できるようにする。次に、ストレージプログラムＢは、新たな仮想ボリュームＡｎを作成し、外部接続された仮想ボリュームＡから仮想ボリュームＡｎへデータ移行１１１を行う。これにより、分散型ストレージシステムは、障害の発生したノード＃０上のデータを、生存ノード＃１上で動作するストレージプログラムＢへコピーし、新たに格納し直すことで、データを復旧する。【００２３】
また、分散型ストレージシステムは、データ復旧処理と同時に、ノード＃０の減設処理を実行する。減設処理では、まず、減設前の静的マッピングテーブル５０６Ａに対し、減設後の構成で、新たな静的マッピングテーブル５０６Ｂを生成する。次に、分散型ストレージシステムは、各ノードに格納しているデータに対し、新たな静的マッピングテーブル５０６Ｂに基づき、冗長コードを格納するノードである冗長コードノード（冗長化先ノード）を決定し、新しく冗長コードＰｎを再生成する。その後、古い静的マッピングテーブル５０６Ａに基づき生成した冗長コードＰは、不要となるため、ストレージプログラムＢは、冗長コードＰを削除する。【００２４】
この図の例では、２個のストライプから１個の冗長コードを生成する２Ｄ１Ｐを用いる場合の静的マッピングテーブル５０６Ａ、５０６Ｂを示す。静的マッピングテーブル５０６は、ユーザデータ部分の行列であるＤ領域と、冗長コード部分の行列であるＰ領域とを含む。Ｄ領域とＰ領域における列番号は、ノード番号を示す。Ｄ領域における行番号は、ストライプ位置番号を示す。ストライプ位置は、予め設定されたストライプサイズ毎の論理記憶領域である。ストライプ位置は、論理アドレス順に繰り返し配置される。行列の要素に示された数字は、ストライプタイプ番号を示す。Ｐ領域は、冗長コードを格納するノードとストライプタイプ番号を示す。【００２５】
静的マッピングテーブル５０６において、Ｄ領域において同一のストライプタイプを持つ複数のノードのユーザデータが、対応するストライプ位置へ書き込まれる場合、Ｐ領域において当該ストライプタイプを持つ冗長コードのノードへ送信される。【００２６】
静的マッピングテーブル５０６Ａは正常時の４個のノードに対するマッピングを示す。静的マッピングテーブル５０６Ｂは減設後の３個のノードに対するマッピングを示す。【００２７】
以上のように、分散型ストレージシステムは、各ノードのアプリケーションプログラム３０１によりアクセスされるデータをローカルのドライブ１０５へ格納する。これにより、アプリケーションプログラム３０１の性能を向上させることができる。更に、分散型ストレージシステムは、ノード１０１の障害が発生した場合、アプリケーションプログラム３０１のフェイルオーバ先ノードに、データを復旧することで、復旧したアプリケーションプログラム３０１に対して、ネットワークを介さないデータ読み出しを実現する。また、分散型ストレージシステムのノード数を変更する構成変更が行われた場合、分散型ストレージシステムは、変更後の構成に合わせて静的マッピングテーブル５０６を変更することで、冗長度を維持することができる。【００２８】
また、ストレージプログラム３０２が冗長コードを生成することにより、ドライブ１０５が特別な機能を持つことなく、冗長化を行うことができる。【００２９】
ライト要求を受けたノードは、転送先計算機を選択し、ライトデータに基づく転送データを転送先計算機へ送信する。複数の他のノード１０１から複数の転送データを夫々受信したノード１０１は、グループ情報に基づいて複数の転送データから冗長コードを生成する。複数のノード１０１の構成が変更される場合、ノード１０１は、ユーザデータを読み出し、ユーザデータに基づく変更後の冗長コードを格納する計算機である新冗長コード計算機を選択し、読み出されたユーザデータに基づく再転送データを新冗長コード計算機へ送信する。転送データは、ライトデータ、ライトデータの一部、中間コード、後述するＣｌａｓｓ１  Ｃｏｄｅ等であってもよい。再転送データは、ユーザデータ、ユーザデータの一部、中間コード、Ｃｌａｓｓ１  Ｃｏｄｅ等であってもよい。【００３０】
図２は、分散型ストレージシステムのシステム構成例を示す。【００３１】
ノード１０１は、例えば一般的なサーバ計算機の構成を有している。ノード１０１のハードウェア構成は特に限定されない。ノード１０１は、バックエンドネットワーク２０３を介して他のノード１０１とバックエンドポート２０８を通じて接続する。【００３２】
複数のノード１０１は、ドメイン２０１を形成する。ドメイン２０１は、例えば地理的な地域と対応させてもよいし、仮想的又は物理的なバックエンドネットワーク２０３のトポロジと対応させてもよい。外部ネットワーク２０４は、複数のドメイン２０１を接続する。以下において、各ドメインは、地理的に互いに離れた複数のサイトの一つに対応づけられているとする。【００３３】
ノード１０１の内部構成において、バックエンドポート２０８、プロセッサパッケージ２０７、ディスクドライブ（以下においてドライブとも呼ぶ）１０５が内部ネットワーク２０２を介して接続されている。プロセッサパッケージ２０７は、メモリ２０５、プロセッサ２０６（例えばＣＰＵ）を含む。【００３４】
メモリ２０５は、プロセッサ２０６により実行するプログラムを格納する。メモリ２０５は、揮発性のＤＲＡＭであってもよいし、不揮発のＳＣＭ（Ｓｔｏｒａｇｅ  Ｃｌａｓｓ  Ｍｅｍｏｒｙ）などを用いてもよい。【００３５】
ドライブ１０５は、例えば、ＦＣ（Ｆｉｂｒｅ  Ｃｈａｎｎｅｌ）、ＳＡＳ（Ｓｅｒｉａｌ  Ａｔｔａｃｈｅｄ  ＳＣＳＩ）、ＳＡＴＡ（Ｓｅｒｉａｌ  Ａｄｖａｎｃｅｄ  Ｔｅｃｈｎｏｌｏｇｙ  Ａｔｔａｃｈｍｅｎｔ）などのインタフェースを持つハードディスクドライブや、ＳＳＤ（Ｓｏｌｉｄ  Ｓｔａｔｅ  Ｄｒｉｖｅ）などである。また、ドライブ１０５は、ＮＡＮＤ、ＰＲＡＭ、ＲｅＲＡＭなどのＳＣＭを用いてもよいし、揮発性のメモリを用いてもよい。ドライブ１０５は、揮発性メモリを使用する場合、バッテリによってストレージデバイスを不揮発化してもよい。【００３６】
図３は、分散型ストレージシステムのソフトウェア構成例を示す。【００３７】
ノード１０１上には、ハイパーバイザ３０４が動作しており、ハイパーバイザ３０４上で、仮想マシン（ＶＭ）３０７が動作している。仮想マシン上には、用途に応じ、ストレージプログラム３０２、アプリケーションプログラム３０１、管理プログラム３０３が動作している。【００３８】
ハイパーバイザ３０４は、ハイパーバイザ３０４上で動作する複数の仮想マシン３０７に対し、プロセッサ２０６、メモリ２０５、ドライブ１０５、及びバックエンドネットワーク２０３といったハードウェア資源の割り当てを管理し、仮想マシン３０７からのハードウェア資源へのアクセス要求を実際にハードウェアへ渡すためのコンポーネントである。仮想マシン３０７上では、ＯＳ（Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ）が動作しており、その上で各種プログラムを動作させている。仮想マシン３０７は、各種プログラムに対し、ハイパーバイザ３０４から提供された仮想的な資源の割り当てを管理し、これら資源へのプログラムからのアクセス要求をハイパーバイザ３０４へ渡すためのコンポーネントである。【００３９】
ストレージプログラム３０２は、ドライブ１０５へのストレージＩ／Ｏを管理するためのプログラムである。ストレージプログラム３０２は、ハードウェア資源であるドライブ１０５を束ねて、仮想化し、仮想ボリューム１０７として、ハイパーバイザ３０４を介し、他の仮想マシン３０７に提供する。例えば、ストレージプログラム３０２は、仮想ボリューム１０７をハイパーバイザ３０４に、ｉＳＣＳＩターゲット（ドライブ１０５）として、認識させることで、ハイパーバイザ３０４上に当該仮想ボリュームをマウントし、他の仮想マシン３０７へ当該ドライブ（仮想ボリューム）を提供する。ストレージプログラム３０２は、他の仮想マシン３０７からストレージＩ／Ｏのリクエストを受信すると、ドライブ１０５に対してストレージＩ／Ｏを行い、結果を返却する。また、他のノード１０１上で動作するストレージプログラム３０２との間で、ネットワークパス３０６を介して通信し、例えば、データ保護やデータ移行といったストレージの機能を実現する。【００４０】
アプリケーションプログラム３０１は、ユーザの業務に必要なプログラムである。アプリケーションプログラム３０１は、ストレージＩ／Ｏを行う際、ストレージパス３０５を介し、ハイパーバイザ３０４を介し、ストレージプログラム３０２が提供する仮想ボリュームへＩ／Ｏ要求を送信する。【００４１】
管理プログラム３０３は、ハイパーバイザ３０４、仮想マシン３０７、及びノード１０１の構成を管理するプログラムである。管理プログラム３０３は、仮想マシン３０７とハイパーバイザ３０４を介してネットワークＩ／Ｏを発行し、他の仮想マシン３０７に対して管理オペレーション３０８を発行する。【００４２】
全ての仮想マシン３０７は、他の仮想マシン３０７に対し、ハイパーバイザ３０４を介し、ネットワーク通信を行う。また、上述した、ストレージプログラム３０２、アプリケーションプログラム３０１、管理プログラムは３０３、仮想マシン３０７上ではなく、ハードウェア上に直接動作しているＯＳで動作させ、システムを実現してもよい。【００４３】
図４は、分散型ストレージシステムにおける複数ノードのページマッピングの例を示す。【００４４】
本実施例の分散型ストレージシステムは、複数の論理ボリュームでプール４０２Ａ、４０２Ｂを構成し、さらにプール４０２Ａ、４０２Ｂ上に構成される仮想ボリューム１０７Ａ〜１０７Ｃをアプリケーションプログラム３０１に提供する。ノード１０１Ａは、プール４０２Ａから仮想ボリューム１０７Ａ、１０７Ｂを提供する。ノード１０１Ｂは、プール４０２Ｂから仮想ボリューム１０７Ｃを提供する。【００４５】
一つのプール４０２は、１又は複数論理ボリュームで構成される。この論理ボリュームをプールボリューム４０１とも呼ぶ。プールボリューム４０１の実体は、ドライブ１０５の記憶領域である。プールボリューム４０１に対し、他のノード１０１のドライブ１０５の記憶領域が割り当てられることも可能である。【００４６】
ノード１０１Ａは、二種類のプールボリューム４０１を保持する。一つは、自ノードのドライブ１０５の記憶領域からなるプールボリューム４０１Ａである。プールボリューム４０１Ａが格納するデータは、自ノードのドライブ１０５に配置される。もう一方は、他のノード１０１Ｂのボリューム４０１Ｂをストレートマッピングするプールボリューム４０１Ｃである。これにより、ボリューム４０１Ｃは、プールボリューム４０１Ｃとして管理される。ノード１０１Ａは、プールボリューム４０１Ｃを介して、他ノードのプールボリューム４０１ＢのＩ／Ｏ処理を行うことができる。【００４７】
この機能は、ストレージ外部接続機能として知られている。ノード１０１Ａは、プールボリューム４０１Ｃへのアクセスに対し、プールボリューム４０１Ｃ内の論理アドレスであるプールボリュームアドレスを、他ノードのプールボリューム４０１Ｂのプールボリュームアドレスに変換し、変換されたアドレスを含むＩ／Ｏ要求を当該他ノードのノード１０１Ｂに送信する。ノード１０１Ａは、自ノードのプールボリューム４０１Ｃと他ノードのプールボリューム４０１Ｂとの間のページマッピングテーブルを保持する。ノード１０１Ｂも同様に、ノード１０１Ａ内のボリューム４０１Ａをプールボリュームとして管理する。【００４８】
ストレージプログラム３０２は、自ノードによるホストアクセス量が多い仮想ページを、自ノードのプールボリューム４０１にマッピングし、他ノードによるホストアクセス量が多い仮想ページを、当該他ノードのプールボリューム４０１にマッピングする。これにより、ホストへレスポンスタイムを短縮する。他ノードのプールボリューム４０１から割り当てられた仮想ページのデータは、他ノードのドライブ１０５に格納される。【００４９】
性能のために、アプリケーションプログラム３０１は、自ノードのプールボリューム４０１Ａにアクセスすることが望ましい。しかし、自ノードのプールボリューム４０１Ａの容量が枯渇した場合や、他ノードの障害によりそのノードのアプリケーションプログラム３０１を自ノードで再起動した場合等に、このような他ノードのプールボリューム４０１Ｂを用いることができる。このように、ストレージプログラム３０２がアプリケーションプログラム３０１へ仮想ボリュームを提供することにより、ドライブ１０５の容量の管理を容易にすることができる。【００５０】
図５は、分散型ストレージシステムの制御のための情報を示す。【００５１】
メモリ２０５は、保護レイヤ情報５０１、仮想化プロビジョニング情報５０２、キャッシュ情報５０３、ストレージ構成情報５０４、ストレージプログラム３０２を格納する。【００５２】
保護レイヤ情報５０１は、データ保護に関する情報である。仮想化プロビジョニング情報５０２は、仮想ボリュームのプロビジョニングに関する情報である。キャッシュ情報５０３は、ストレージプログラムのキャッシュに関する情報である。ストレージ構成情報５０４は、分散型ストレージシステムの構成に関する情報である。【００５３】
ストレージプログラム３０２は、ドライブ１０５へのストレージＩ／Ｏを管理するためのプログラムである。【００５４】
保護レイヤ情報５０１は、保護レイヤ＃１、＃２、＃３にそれぞれ対応する静的マッピングテーブル５０５、５０６、５０７を含む。保護レイヤ情報５０１は、さらに、ログ構造化マッピングテーブル５０８と、ローカル領域制御テーブル５０９とを含む。【００５５】
本実施例において、保護レイヤ＃１は、ノード１０１内の複数のドライブ１０５にデータを分散させることで保護する。保護レイヤ＃２は、サイト内の複数のノード１０１にデータを分散させることで保護する。保護レイヤ＃２は、複数のサイトにデータを分散させることで保護する。そのため、保護レイヤ＃１、＃２、＃３をそれぞれ、ノード保護レイヤ、サイト保護レイヤ、ジオ保護レイヤと呼ぶことがある。なお、保護レイヤの数は、３でなくてもよい。【００５６】
仮想化プロビジョニング情報５０２は、ページマッピングテーブル５１０を含む。【００５７】
ストレージ構成情報５０４は、仮想ボリューム管理テーブル５１１とプールボリューム管理テーブル５１２と、ドライブ管理テーブル５１３とを含む。ストレージ構成情報５０４は、さらに、ドライブ状態管理テーブル５１４と、ノード状態管理テーブル５１５と、サイト状態管理テーブル５１６とを含む。【００５８】
メモリ２０５は、この図に示す情報に加え、ＯＳ、インタフェースプログラムを含む、各種プログラムを格納する。メモリ２０５は、さらに、業務を実行するアプリケーションプログラム３０１を格納することがある。メモリ２０５に格納されている情報の全部又は一部のバックアップ５１７は、自ノード又は他ノードのドライブ１０５に同期又は非同期に保存されてもよい。【００５９】
以下において、ノード１０１が保持する情報を示すテーブルの構成例を説明する。各テーブルにおいて、一部のエントリのみが示されている。各テーブルにおいて、空白のセルは、データの記載が省略されたセルである。テーブルのセルにおいて、「０ｘ」は、１６進数の数字を示す。ドライブ番号はノード内で一意であり、ノード番号はサイト内で一意である。サイト番号はシステム内で一意である。【００６０】
図６は、保護レイヤ＃２の静的マッピングテーブル５０６を示す。【００６１】
データ数（ストライプ数）はｄ、パリティ数（冗長コード数）はｐ、サイクル数（ユーザデータ部分の行列の行数）はｃ、と表される。この図の例において、ｃは４、ｄは４、ｐは２（４Ｄ２Ｐ）である。即ち、データを格納するＤ領域６０１は４個のストライプサイズを有し、冗長コードを格納するＰ領域６０２は２個のストライプサイズを有する。静的マッピングテーブル５０６のマッピングは、プールボリュームアドレスに対してサイクル数毎に繰り返される。【００６２】
ストライプタイプは、ストライプのクラスである。ストライプタイプ内の複数のストライプから１又は複数の冗長コードが生成される。ストライプは、予め定められたサイズのデータユニットである。この図の例においては、二つの冗長コードが生成され、それぞれ異なるノード１０１に格納される。同一ノードに複数の同一ストライプタイプが配置されないことを条件として、ストライプの数と冗長コードの数は、任意に設計することができる。冗長コードは、例えば、Ｅｒａｓｕｒｅ  Ｃｏｄｉｎｇにより生成される。これにより、分散型ストレージシステムは、構成変更前の静的マッピングテーブルの冗長度を変えることなく、構成変更後の静的マッピングテーブルを生成することができる。【００６３】
この図において、例えば、ノード番号１、２、３、７のノードにおけるストライプ位置番号０のストライプは、ストライプタイプ番号０のストライプタイプに属する。さらに、ストライプタイプ番号０のストライプタイプに属する冗長コードノードのノード番号は０、５である。即ち、ノード番号０、５のノードは、ストライプタイプ番号０の冗長コードを格納する。【００６４】
この図の例において、Ｄ領域６０１におけるストライプは、８個のノードに均等に分散される。ノードの記憶容量によって、ストライプタイプのデータノード数を変化させてもよい。また、ノードの総数が少ない場合や端数が発生する場合に、一部のストライプタイプの冗長コード数を減らしてもよい。異なるストライプタイプは異なるアルゴリズムにより冗長化を行ってもよい。また、ｃはｄと異なっていてもよい。【００６５】
冗長コードノードは、当該ストライプタイプの全てのデータノードと異なるノードから選択される。冗長コードノードには、データノードからのデータライトが集中する。したがって、冗長コードができるだけ均等に配置されるように、冗長コードノードが選択される。これにより、ドライブ１０５がＳＳＤである場合に、ノード１０１の寿命を平準化できる。ノード間において寿命が偏った場合には、平準化するように冗長コードＰ領域６０２の配置を変更してもよい。【００６６】
この図の例において、ストライプタイプは、プールボリュームアドレスにより決定される。これにより、一つのプールボリューム内の複数の領域は、複数のストライプタイプに分類される。また、冗長コードは、ストライプのボリューム内アドレスに依存しない。冗長コードノードは、同一ストライプタイプのデータから、ｄ個の任意のデータを選択し、選択したデータから冗長コードを生成する。【００６７】
保護レイヤ＃２における、ホストからのライトデータに対する冗長コードノードは、以下の方法で決定する。まず、ホストからのライト要求を受信したノードは、自ノード番号を特定する。次に、ライト要求により指定された論理アドレスから、ライト先のプールボリュームアドレスであるライト先アドレスを特定し、以下の計算式により、ストライプ位置番号を決定する。【００６８】
ストライプ位置番号  ＝  （ライト先アドレス値  ÷  ストライプサイズ）ｍｏｄ  ｃ【００６９】
自ノード番号とストライプ位置番号が決定されると、当該ノードは、当該保護レイヤの静的マッピングテーブル５０６を参照し、ストライプタイプ番号を特定し、冗長コードノードを決定する。【００７０】
保護レイヤ＃１、３の静的マッピングテーブル５０５、５０７は、保護レイヤ＃２と同様の構成である。保護レイヤ＃１では、ノード番号の代わりにドライブ番号が用いられる。保護レイヤ＃３では、ノード番号の代わりにサイト番号が用いられる。【００７１】
静的マッピングテーブル５０６を、ストライプタイプ番号毎にまとめると、ストライプタイプテーブル５０６ｓのように表すことができる。ストライプタイプテーブル５０６ｓは、一つのサイト内のノード１０１間で共有される情報である。ストライプタイプテーブル５０６ｓは、ノードストライプタイプ番号毎に、対応するストライプ（ユーザデータ）を格納するデータノードのノード番号と、ストライプから生成される冗長コードを格納する冗長コードノードのノード番号との、関係を示す。ノードストライプタイプ番号は、ノード間のストライプタイプの識別情報である。【００７２】
図７は、保護レイヤ情報５０１におけるログ構造化マッピングテーブル５０８を示す。【００７３】
ログ構造化マッピングテーブル５０８は、データマッピングテーブル７０１、冗長コードマッピングテーブル７０２、及び逆マッピングテーブル７０３を含む。【００７４】
データマッピングテーブル７０１は、当該テーブル７０１を保持するノード１０１が自ノードのドライブ１０５に格納しているユーザデータを管理する。データマッピングテーブル７０１は、ユーザデータを格納する論理記憶領域毎のエントリを有する。各エントリは、論理ドライブ番号と、論理アドレスと、物理ドライブ番号と、物理アドレスと、物理記憶領域のサイズとを含む。【００７５】
データマッピングテーブル７０１は、ノード１０１は、ユーザデータのプールボリュームアドレス（論理アドレス）から、当該データを格納するドライブ１０５（物理ドライブ）内のドライブアドレス（物理アドレス）を知ることができる。つまり、データマッピングテーブル７０１は、プールボリュームを示す論理ドライブ番号と、当該プールボリュームにおけるユーザデータのプールボリュームアドレス（論理アドレス）と、ドライブ１０５を示す物理ドライブ番号と、当該ドライブ内の物理記憶領域のドライブアドレス（物理アドレス）を対応付ける。データマッピングテーブル７０１は、物理記憶領域のサイズを格納する。例えば、データマッピングテーブル７０１において、論理ドライブ番号０ｘ００００、論理アドレス０ｘ００００のデータは、自ノードのドライブの物理ドライブ番号０ｘ００１０、物理アドレス０ｘ０８００に、データ長５１２Ｂｙｔｅｓで格納されていることを示す。データマッピングテーブル７０１は、さらに、格納しているデータの状態を示す情報を格納する。例えば、状態情報は、データが対応する冗長コードノードにデータを転送済であるか否かを示す。後述するように、ライトデータは、Ｓｙｎｃ／Ａｓｙｎｃの設定に従い、ライトデータのホストライト処理と同期又は非同期に、冗長コード生成のために冗長コードノードに転送される。【００７６】
冗長コードマッピングテーブル７０２は、当該テーブル７０２を保持するノード１０１が自ノードのドライブ１０５に格納している冗長コードを管理する。管理する冗長コードは、サイト間冗長コード、ノード間冗長コード、及びノード内冗長コードを含む。冗長コードマッピングテーブル７０２は、冗長コードを格納する論理記憶領域毎のエントリを有する。各エントリは、サイト番号と、ノード番号と、論理ドライブ番号と、論理アドレスと、物理ドライブ番号と、物理アドレスと、物理記憶領域のサイズとを含む。【００７７】
これにより、ノード１０１は、ユーザデータを格納するプールボリュームアドレスから、当該ユーザデータの冗長コードの物理アドレスを知ることができる。例えば、冗長コードマッピングテーブル７０２において、サイト番号０、ノード番号２、論理ドライブ番号０ｘ００００、論理アドレス０ｘ００００の冗長コードは、自ノードのドライブの物理ドライブ番号０ｘ０００３、物理アドレス０ｘ２０００に格納されている。つまり、他ノードのプールボリュームにおけるユーザデータのプールボリュームアドレス（論理アドレス）と、自ノードに格納した冗長コードのドライブ１０５の物理記憶領域のドライブアドレス（物理アドレス）を対応付ける。【００７８】
逆マッピングテーブル７０３は、冗長コードの格納位置から当該冗長コードの基になるユーザデータの格納位置を知る逆変換テーブルである。ノード１０１は、ユーザデータに障害が発生したときは、当該テーブル７０３を参照し、復旧に必要なデータを特定する。逆マッピングテーブル７０３は、冗長コードを格納する論理記憶領域毎のエントリを有する。各エントリは、冗長コードを格納する論理記憶領域の、論理ドライブ番号、論理アドレスと、当該冗長コードに対応するユーザデータを格納する論理記憶領域の、サイト番号、ノード番号、論理ドライブ番号、論理アドレス、サイズを含む。各エントリは更に、冗長コードの生成に用いられたライトデータが有効か無効かを示すフラグを含んでもよい。【００７９】
例えば、逆マッピングテーブル７０３において、サイト番号０、ノード番号０、物理ドライブ番号０ｘ００００、物理アドレス０ｘ００００に格納された冗長コードは、サイト番号０、ノード番号１、物理ドライブ番号０ｘ００００、物理アドレス０ｘ２０００のデータと、サイト番号０、ノード番号２、物理ドライブ番号０ｘ０００１、物理アドレス０ｘ１３００のデータと、サイト番号０、ノード番号３、物理ドライブ番号０ｘ０００４、物理アドレス０ｘ００００のデータと、サイト番号０、ノード番号７、物理ドライブ番号０ｘ００１０、物理アドレス０ｘ０４００のデータとから、生成されたことを示している。【００８０】
本実施例の分散型ストレージシステムは、ログ構造化方式でデータを格納する。ログ構造化方式は、プールボリューム内の論理アドレスのデータが新たなデータで更新される場合に、物理アドレスのデータを新たなデータで更新することなく、新たなデータを新たな物理アドレスに追記する。したがって、一つの論理アドレスのデータとして、旧データと新データとが物理記憶領域に格納され得る。また、不要となった旧データは、適宜消去される。ログ構造化方式により、冗長コードの更新のための読み出しが不要となり、ドライブ１０５へのライト処理の時間を短縮できる。なお、分散型ストレージシステムは、ログ構造化方式を実装しなくてもよい。【００８１】
図８は、ローカル領域制御テーブル５０９を示す。【００８２】
この図において、矢印はポインタを表す。ローカル領域制御テーブル５０９は、有効リスト８０１、無効リスト８０２、フリーリスト８０３、ローカル領域量テーブル８０４を含む。ローカル領域制御テーブル５０９は、自ノード内のドライブ１０５内の領域であるローカル領域を管理する。リスト８０１〜８０３において、各ローカル領域はドライブ番号及びドライブ内のＬＢＡ（Ｌｏｇｉｃａｌ  Ｂｌｏｃｋ  Ａｄｄｒｅｓｓ）で示される。【００８３】
有効リスト８０１は、有効領域のリストである。有効領域は、最新のユーザデータ又は最新の冗長コードを格納する領域である。この図の例において、ドライブ番号０のドライブ１０５において、ＬＢＡ０、４、５のブロックは、それぞれ、有効データを格納している。【００８４】
無効リスト８０２は、無効領域のリストである。無効領域は、古いユーザデータ又は古い冗長コードを格納する領域である。古く、無効な冗長コードは、当該冗長コードの生成に使用されている全ストライプが無効である冗長コードである。この図の例において、ドライブ番号０のドライブ１０５において、ＬＢＡ１、３、７のブロックは、それぞれ、無効データを格納している。フリーリスト８０３は、未使用領域のリストである。【００８５】
ローカル領域量テーブル８０４は、複数のデータタイプの夫々のエントリを有する。ドライブ１０５に格納されるデータは、冗長コードタイプ及びライトデータタイプのいずれか一つのデータタイプに分類される。さらに、冗長コードタイプは、ノード冗長コード、サイト冗長コード、ジオ冗長コードの各タイプ分類され、ライトデータタイプは、各サイトストライプタイプに分類される。【００８６】
各エントリは、目標使用量、実際使用量、及び有効領域の量を管理する。目標領域量は予め設定される。実際使用量は、対応する種類に割り当てられた有効領域及び無効領域の合計サイズを示す。有効領域量は、対応する種類に割り当てられた有効領域の合計サイズを示す。ストレージプログラム３０２は、各データタイプの量を個別に管理することで、各データタイプのデータ量を適切に制御できる。ストレージプログラム３０２は、ホストＩ／Ｏと同期又は非同期に、ローカル領域制御テーブル５０９を更新する。【００８７】
図９は、仮想化プロビジョニング情報５０２に含まれる情報を示す。【００８８】
仮想化プロビジョニング情報５０２は、ページマッピングテーブル５１０を含む。ページマッピングテーブル５１０は、仮想ボリューム内の仮想ページ毎のエントリを有する。各エントリは、仮想ボリューム番号と、当該仮想ボリューム内の仮想ページの論理アドレスと、当該仮想ページのサイズを示す範囲と、プールボリューム番号と、当該プールボリューム内の論理ページのプールボリュームアドレスとの対応関係を保持する。【００８９】
本実施例において、ページマッピングテーブル５１０は、当該テーブル５１０を保持するノード１０１により提供される仮想ボリュームの情報を保持している。仮想ページには、前述の自ノード１０１Ａのプールボリューム４０１Ｃを介して又は直接に、他ノード１０１Ｂのプールボリューム４０１Ｂの論理ページが割り当てられることがある。ページマッピングテーブル５１０は、仮想ページと、自ノード１０１Ａのプールボリューム４０１Ａ又は他ノード１０１Ｂのプールボリューム４０１Ｂとの関係を示す。ページマッピングテーブル５１０は、仮想ボリューム内の仮想ページの先頭ＬＢＡとアドレス範囲と、仮想ページの先頭ＬＢＡに対応する、プールボリューム内の論理ページの先頭ＬＢＡを保持する。【００９０】
図１０は、ストレージ構成情報５０４の第一部分を示す。【００９１】
第一部分に含まれる各テーブルは、異なる記憶リソース種別の管理情報を示す。【００９２】
仮想ボリューム管理テーブル５１１は、仮想ボリュームの情報を示す。本実施例において、仮想ボリューム管理テーブル５１１は、当該情報を保持するノード１０１が提供する仮想ボリュームの情報を示す。ノード１０１は、提供する仮想ボリュームへのアクセスを受け付ける。仮想ボリューム管理テーブル５１１は、障害発生にそなえ、自ノードがオーナではない仮想ボリュームの情報を保持してもよい。【００９３】
仮想ボリューム管理テーブル５１１は、仮想ボリューム毎のエントリを有する。各エントリは、仮想ボリューム番号、当該仮想ボリュームのサイズ（容量）、当該仮想ボリュームの提供先のノード（オーナノード）のノード番号のリストを含む。仮想ボリュームのサイズは、割り当てられている論理ページの総量ではなく、仮想ボリュームの仮想容量（最大容量）を示す。さらに、各エントリは、冗長コードの生成及び書き込みが、ライトデータの自ノードのストレージデバイスへの書き込みと同期か非同期かを示す情報を含む。同期／非同期の情報は、保護レイヤ毎に与えられる。例えば、保護レイヤが保護レイヤ＃３（ジオ保護レイヤ）である場合、同期に設定されるとレイテンシが増加するため、非同期に設定される。【００９４】
プールボリューム管理テーブル５１２は、プールボリュームの情報を示す。本実施例において、プールボリューム管理テーブル５１２は、当該テーブル５１２を保持するノード１０１が提供するプールボリュームと、他ノード１０１が提供するプールボリュームとを示す。プールボリューム管理テーブル５１２は、プールボリューム毎のエントリを有する。各エントリは、プールボリューム番号、当該プールボリュームのサイズ（容量）、当該プールボリュームを提供するノードのノード番号の情報を含む。【００９５】
ドライブ管理テーブル５１３は、各プールボリュームに割り当てられるドライブを示す。本実施例において、ドライブ管理テーブル５１３は、当該テーブル５１３を保持するノード１０１に含まれる自ノードのドライブ１０５の情報を示す。【００９６】
ドライブ管理テーブル５１３は、プールボリューム毎のエントリを有する。各エントリは、プールボリューム番号、当該プールボリュームに用いられているドライブの種類（ＳＳＤやＮＬ−ＳＡＳドライブなど）、当該プールボリュームのためにストライピングしているドライブ番号の組（ＲＡＩＤを構成するドライブ番号の組）、そのドライブのサイズ（容量）を含む。ストライピングを実施しない場合、一つのプールボリュームに対して一つのドライブのみが割り当てられる。なお、一つのドライブ内の複数の領域は、互いに異なるプールボリュームに割り当てられ得る。【００９７】
なお、ストレージ構成情報５０４は、他ノードのプールボリュームを自ノードのプールボリュームとして管理するための外部接続管理情報を含んでいてもよい。【００９８】
図１１は、ストレージ構成情報５０４の第二部分を示す。【００９９】
第二部分に含まれる各テーブルは、分散型ストレージシステムにおける障害管理情報を示す。【０１００】
ドライブ状態管理テーブル５１４は、自ノード内のドライブ１０５毎のエントリを有する。各エントリは、ドライブ番号、当該ドライブの状態、当該ドライブのエラーカウント、当該ドライブの冗長コード変更ポインタを含む。自ノードが属するサイトを、自サイトと呼ぶ。【０１０１】
ノード状態管理テーブル５１５は、自サイトにおける他ノード毎のエントリを有する。各エントリは、ノード番号、当該ノードの状態、当該ノードのエラーカウントを含む。【０１０２】
サイト状態管理テーブル５１６は、分散型ストレージシステムにおけるサイト毎のエントリを有する。各エントリは、サイト番号、当該サイトの状態、当該サイトのエラーカウントを含む。本実施例において、自ノードは他サイトの代表ノードとのみ通信できるとする。そのため、代表ノードのエラーは、当該サイトのエラーを意味する。【０１０３】
ノード１０１のプロセッサ２０６は、自ノードのドライブ１０５又は他ノード１０１との通信においてエラーを検出すると、保持する管理情報５１４〜５１６においてエラーカウントをインクリメントする。【０１０４】
いずれかのハードウェアリソース（ドライブ、ノード又はサイト）におけるエラーカウントが、予め設定された第１閾値に達すると、プロセッサ２０６は、当該リソースの状態を正常状態から警告状態に変化させる。さらに、エラーカウントが、予め設定された第２閾値に達すると、プロセッサ２０６は、当該リソースの状態を警告状態から閉塞状態に変化させる。警告状態と閉塞状態は、異常状態である。【０１０５】
図１２は、キャッシュ情報５０３を示す。【０１０６】
ノード１０１は、それぞれ、固有のキャッシュ情報５０３を保持する。キャッシュ情報５０３は、データダーティキュー１２０１、コードダーティキュー１２０２、中間ダーティキュー１２０３、クリーンキュー１２０４、フリーキュー１２０５、キャッシュビットマップテーブル１２０６を含む。ダーティキュー１２０１、１２０２、１２０３は、ドライブ１０５に未反映なキャッシュ上のデータを示す。【０１０７】
キューにおけるセルはエントリを示し、エントリの情報は、キャッシュビットマップテーブル１２０６内の情報に対応し、キャッシュビットマップテーブル１２０６から選択された情報を格納する。キュー内の矢印は、エントリ間をつなぐポインタを表す。黒丸は始点である。【０１０８】
データダーティキュー１２０１は、自ノードのドライブ１０５に格納されるホストからのライトデータを示す。データダーティキュー１２０１は、ドライブストライプタイプ番号とデータの格納位置である自ノードのドライブ番号との組毎のキューを含む。ドライブストライプは、保護レイヤ＃１のストライプである。【０１０９】
コードダーティキュー１２０２は、冗長コード生成のために他ノードから受信したデータを指す。当該データ及び当該データから生成される冗長コードは、ダーティデータである。コードダーティキュー１２０２は、ストライプタイプとデータ位置の組毎のキューを含む。ノード１０１は、複数保護レイヤに属するため、異なる保護レイヤのストライプタイプのキューが用意される。即ち、コードダーティキュー１２０２は、ノードストライプタイプと冗長コードの格納位置のノード番号との組毎のキュー、サイトストライプタイプと冗長コードの格納位置のサイト番号との組毎のキューを含む。ノードストライプは、保護レイヤ＃２のストライプである。サイトストライプは、保護レイヤ＃３のストライプである。【０１１０】
例えば、コードダーティキュー１２０２のうち「Ｓｔｒｉｐｅ  Ｔｙｐｅ＃０、Ｎｏｄｅ＃０」のキューは、ノードストライプタイプ番号０のノードストライプに属し、ノード番号０のノードに格納されるデータのためのキューである。【０１１１】
中間ダーティキュー１２０３は、ドライブ１０５に未反映なキャッシュ上の中間コードを指す。中間コードは、新データと旧データから生成されるデータである。例えば、中間コードは、新データと旧データのｘｏｒで計算される。即ち、中間コードは、新データと旧データの差分データである。ノード１０１は、中間コードを使用してドライブ１０５に格納されている旧データの冗長コードを、新データの冗長コードに更新することができる。中間コードの使用方法の詳細は後述する。【０１１２】
中間ダーティキュー１２０３の構成は、コードダーティキュー１２０２と同様である。つまり、中間ダーティキュー１２０３は、ストライプタイプとデータ位置の組毎のキューを含む。ノード１０１は、複数保護レイヤに属するため、異なる保護レイヤのストライプタイプのキューが用意される。【０１１３】
クリーンキュー１２０４は、ドライブ１０５に反映済みのキャッシュ上のデータを指す。フリーキュー１２０５は、使用されていないキャッシュの領域を指す。【０１１４】
キャッシュビットマップテーブル１２０６は、キャッシュ内の所定サイズの一スロット毎のエントリを有する。各エントリは、データの論理アドレス、スロットのキャッシュアドレス（メモリ２０５上の位置）、当該スロットのサイズ、当該スロット内のデータがダーティであるか否かを示すダーティビットマップ、及び当該スロット内のデータがステージングされたか否かを示すステージングビットマップを含む。【０１１５】
論理アドレスは、ログ構造化マッピングテーブル５０８を参照して説明したストライプの論理アドレスが対応する。他ノード１０１から転送されたストライプの論理アドレスは、例えば、サイト番号、ノード番号、ＬＤＥＶ番号、及びＬＢＡ、オフセットを含む。ダーティビットマップは、その領域のどの部分がダーティ状態かを示す。ステージングビットマップは、当該領域のどの部分がキャッシュ上にステージング済みかを示す。たとえば、１ビットはドライブ１０５の１ブロックに対応する。【０１１６】
図１３は、管理プログラム３０３の制御のための情報を示す。【０１１７】
システム構成情報１３０１は、システムの構成に関する情報である。リソース監視情報１３０２は、システムのプログラムが使用する仮想的又は物理的なハードウェア資源の利用状況に関する情報である。【０１１８】
システム構成情報１３０１は、物理マシンの構成情報を示す物理マシン構成管理テーブル１３０３、仮想マシンの構成情報を示す仮想マシン構成管理テーブル１３０４、仮想マシンの物理マシンへの配置情報を示す仮想マシン配置管理テーブル１３０５を含む。【０１１９】
リソース監視情報１３０２は、プロセッサ２０６、メモリ２０５、ドライブ１０５それぞれの利用状況の情報を示すＣＰＵ／メモリ／ストレージ管理テーブル１３０６と、ネットワークの利用状況の情報を示すネットワーク管理テーブル１３０７を含む。【０１２０】
上述した情報の全部又は一部のバックアップ５１７は、ドライブ１０５に同期又は非同期に保存されてもよい。【０１２１】
図１４は、システム構成情報１３０１に含まれる情報を示す。【０１２２】
物理マシン構成管理テーブル１３０３は、分散型ストレージシステム内の物理マシン（ノード１０１）毎のエントリを有する。各エントリは、物理マシン番号、最大資源、状態情報を含む。物理マシン番号は、物理マシンに割り当てられ、システム内で一意な番号である。最大資源は、物理マシンが保有するハードウェア資源の最大数（量）を示しており、ＣＰＵ、メモリ、ネットワーク、ストレージ、それぞれの情報を含む。状態情報は、正常、警告、障害、増設中、及び減設中といった状態を含む。正常状態は、当該物理マシンが正常に動作していることを示し、警告状態は、当該物理マシンの資源利用率が高く規定の閾値を超過した状態を示し、障害状態は、当該物理マシンに障害が発生し、動作していないことを示す。さらに、増設中状態は、当該物理マシンを増設対象物理マシンとして、サイト２０１に追加（加入）中である状態を示し、減設中状態は、当該物理マシンを増減設対象物理マシンとして、サイト２０１から除外（離脱）中である状態を示す。【０１２３】
増設中状態は、具体的には、分散型ストレージシステムにおける、増設先のサイト保護レイヤに、増設対象物理マシン（ノード１０１）を追加途中であることを示す。更に増設中状態は、各物理マシン（ノード１０１）上のストレージプログラム３０２は、既存の静的マッピングテーブルに新しいノード番号の列を追加した新しい静的マッピングテーブルを生成し、当該静的マッピングテーブルに基づき、冗長コードを再生成中であることを示す。減設中状態は、具体的には、分散型ストレージシステムにおける、減設先のサイト保護レイヤから、減設対象物理マシン（ノード１０１）を除外途中であることを示す。更に減設中状態は、各物理マシン（ノード１０１）上のストレージプログラム３０２は、既存の静的マッピングテーブルから減設対象ノードのノード番号の列を除外した新しい静的マッピングテーブルを生成し、当該静的マッピングテーブルに基づき、冗長コードを再生成中であることを示す。【０１２４】
仮想マシン構成管理テーブル１３０４は、分散型ストレージシステム内の仮想マシン毎のエントリを有する。各エントリは、仮想マシン番号、最大資源、状態情報を含む。仮想マシン番号は、仮想マシン３０７に割り当てられる、システム内で一意な番号である。最大資源は、仮想マシンが保有するハイパーバイザ３０４により、提供される仮想的なハードウェア資源の最大数（量）を示しており、ＣＰＵ、メモリ、ネットワーク、ストレージ、それぞれの情報を含む。状態情報は、正常、警告、及び障害といった状態を含む。正常状態は、当該仮想マシンが正常に動作していることを示し、警告状態は、当該仮想マシンの資源利用率が高く規定の閾値を超過した状態を示し、障害状態は、当該仮想マシンに障害が発生し、動作していないことを示す。【０１２５】
仮想マシン配置管理テーブル１３０５は、分散型ストレージシステム内の仮想マシン毎のエントリを有する。各エントリは、仮想マシン番号、物理マシン番号を含む。仮想マシン番号は、配置される仮想マシンの番号を示しており、物理マシン番号は、当該仮想マシンを配置する先の物理マシンを示している。【０１２６】
図１５は、リソース監視情報１３０２に含まれる情報を示す。【０１２７】
ＣＰＵ／メモリ／ストレージ監視テーブル１３０６は、仮想マシン毎のエントリを有する。各エントリは、仮想マシン番号と使用資源を含む。仮想マシン番号は、仮想マシン３０７に割り当てられる、システム内で一意な番号である。使用資源は、仮想マシンが現在、利用している資源の情報を示す。当該情報が予め設定された閾値を超過した場合、管理プログラム３０３は、仮想マシン構成管理テーブル１３０４の状態情報を、警告に更新する。【０１２８】
ネットワーク監視テーブル１３０７は、仮想マシン毎のエントリを有する、各エントリは、一つのソース仮想マシン番号と、幾つかのターゲットマシン番号とを含む。ソース仮想マシン番号は、ネットワークＩ／Ｏの送信元となる仮想マシン番号を示しており、ターゲット仮想マシン番号は、ネットワークＩ／Ｏの受信先となる仮想マシンの番号を示している。ネットワーク監視テーブル１３０７は、仮想マシン間のネットワークＩ／Ｏの通信関係を示したマトリクスであり、後述するように、管理プログラム３０３は、仮想マシン間で互いに大量にネットワークＩ／Ｏをしている仮想マシン群を検出し、当該仮想マシン群を、同一物理マシンに配置することで、物理マシン外へのネットワークＩ／Ｏ量を低減させることができる。【０１２９】
図１６は、ストレージプログラム３０２及び管理プログラム３０３の内部構成を示す。【０１３０】
以下で説明する各種プログラムは、プロセッサ２０６により実行される。ストレージプログラム３０２は、メイン処理プログラム１６０１、ホストＩ／Ｏ処理プログラム１６０２、周期処理プログラム１６０３、及びイベント処理プログラム１６０４を含む。【０１３１】
ホストＩ／Ｏ処理プログラム１６０２は、リード処理プログラム１６０５、コレクションリード処理プログラム１６０６、同期ライト処理プログラム１６０７、コレクションライト処理プログラム１６０８を含む。【０１３２】
メイン処理プログラム１６０１は、ストレージプログラム３０２が起動したとき、最初に呼び出されるプログラムであり、処理内で、ホストＩ／Ｏ処理プログラム１６０２、周期処理プログラム１６０３、イベント処理プログラム１６０４を呼び出す。メイン処理プログラムは、ユーザや管理プログラム３０３から、明示的に終了指示を受けるまで、上記処理をループ実行する。【０１３３】
ホストＩ／Ｏ処理プログラム１６０２は、ホストから仮想ボリューム１０７に対するＩ／Ｏ要求（リード要求又はライト要求）を受領した場合に、そのＩ／Ｏ要求を処理するプログラムであり、Ｉ／Ｏ要求の内容に応じて、リード処理プログラム１６０５、コレクションリード処理プログラム１６０６、同期ライト処理プログラム１６０７、コレクションライト処理プログラム１６０８の何れかを実行する。Ｉ／Ｏ要求が複数ある場合、ホストＩ／Ｏ処理プログラム１６０２は、全Ｉ／Ｏ要求を処理し終えるまで、ループして実行してもよい。【０１３４】
リード処理プログラム１６０５は、ホストからの要求が、リード要求であった場合に実行し、ホストから指定されたデータをドライブ又はキャッシュから読み出し、返却する。【０１３５】
コレクションリード処理プログラム１６０６は、リード処理時に、障害ノード１０１上のデータがリード対象である場合に実行し、障害データを復旧した後、ホストへデータを返却する。【０１３６】
同期ライト処理プログラム１６０７は、ホストからの要求が、ライト要求であった場合に実行し、ホストから指定されたアドレスにデータを書き込む。【０１３７】
コレクションライト処理プログラム１６０８は、ライト処理時に、障害ノード上のデータがライト対象である場合に実行し、ホストから書き込まれたデータの冗長コードを生成するため、冗長コードノードにデータを転送する。【０１３８】
周期処理プログラム１６０３は、デステージ処理プログラム１６０９、非同期ライト処理プログラム１６１０、容量枯渇管理処理プログラム１６１１を含む。周期処理プログラム１６０３は、周期処理として登録されたプログラムを一定周期で実行する。周期処理プログラム１６０３は、周期処理として登録された他のプログラムを実行してもよい。【０１３９】
デステージ処理プログラム１６０９は、キャッシュ上にありドライブ１０５に未反映であるデータ（ダーティデータ）を、ドライブ１０５に格納するプログラムである。【０１４０】
非同期ライト処理プログラム１６１０は、Ａｓｙｎｃが指定された保護レイヤで、まだ他ノードに転送されていないデータを他ノードに転送する。【０１４１】
容量枯渇管理処理プログラム１６１１は、ドライブ１０５上のデータ量が、予め設定された目標使用量を超えている場合に、ガベージコレクション要求を発行し、不要なデータの消去を試みる。これにより、ストレージプログラム３０２は、必要なデータを限られた領域に格納できる。【０１４２】
イベント処理プログラム１６０４は、データ移行処理プログラム１６１２、データコピー処理１６１３、アドレス解決処理１６１４、構成変更処理プログラム１６１５、冗長化先変更処理プログラム１６１６、ガベージコレクション処理プログラム１６１７、データ再転送処理プログラム１６１８、データ消去処理プログラム１６１９を含む。イベント処理プログラム１６０４は、他ノードからのネットワークを介したイベント要求に対し、要求内容に応じた各種プログラムを実行し、実行結果を返却する。例えば、他ノードからガベージコレクションの要求を受信した場合、イベント処理プログラム１６０４は、ガベージコレクション処理プログラム１６１７を実行し、実行結果をイベント送信元の他ノードに返却する。【０１４３】
データ移行処理プログラム１６１２は、管理プログラム３０３からの要求により、実行するプログラムであり、ストレージプログラム３０２が提供する仮想ボリューム１０７内のデータを、別の仮想ボリューム１０７にコピーし、その後、ホストへ、コピー先の仮想ボリューム１０７を、新しいアクセス先として、提供しなおすプログラムである。【０１４４】
データコピー処理プログラム１６１３は、データ移行処理プログラム１６１２により、呼び出されるプログラムであり、移動元の仮想ボリューム１０７から移動先の仮想ボリューム１０７へのコピーを行うプログラムである。【０１４５】
アドレス解決処理プログラム１６１４は、データコピー処理プログラム１６１３により、呼び出されるプログラムであり、他ノードの仮想ボリュームを外部接続している状態で、当該他ノードの仮想ボリュームにアクセスする際、他ノードに、アクセス先のデータの物理アドレスを問合せるプログラムである。これにより、ストレージプログラム３０２は、リード要求を他ノードへネストして発行する必要がなくなり、ネットワーク通信量を削減できる。【０１４６】
構成変更処理プログラム１６１５は、管理プログラム３０３からの要求により、実行するプログラムであり、保護レイヤへのノードの増設、及び減設を実行する。【０１４７】
冗長化先変更処理プログラム１６１６は、構成変更処理プログラム１６１５により、呼び出されるプログラムであり、構成変更の情報に基づき、各ノード１０１内のユーザデータの冗長コードを、構成変更後の新しい静的マッピングテーブルに基づき、再生成するプログラムである。【０１４８】
ガベージコレクション処理プログラム１６１７は、容量枯渇管理処理プログラム１６１１からの要求に応じて呼び出され、不要なデータで生成された冗長コードを消去し、容量枯渇を回避する。【０１４９】
データ再転送処理プログラム１６１８は、他ノードのガベージコレクション処理プログラム１６１７からの要求に応じて自ノードの必要なデータを冗長コードノードへ再転送する。これにより、新しく冗長コードを生成することで、不要なデータを含む古い冗長コードを消去することができ、ドライブの容量枯渇を回避できる。【０１５０】
データ消去処理プログラム１６１９は、他ノードのガベージコレクション処理プログラム１６１７からの要求に応じて自ノードの不要なデータを消去する。【０１５１】
管理プログラム３０３は、状態管理処理プログラム１６２０、移動先選定処理プログラム１６２１を含む。【０１５２】
図１７は、一時配置パタンテーブル３０００を示す。【０１５３】
一時配置パタンテーブル３０００は、配置パタンと、ネットワーク通信コストとを含む。配置パタンは、ノード１０１である物理マシン毎のエントリを有する。各エントリは、物理マシン番号と、当該物理マシンに配置される幾つかの仮想マシン番号とを含む。ネットワーク通信コストは、仮想マシン同士のネットワーク通信のうち、別の物理マシンに配置された仮想マシンとのネットワーク通信コスト（通信帯域）である。【０１５４】
以下、分散型ストレージシステムの動作について説明する。【０１５５】
まず、正常時の分散型ストレージシステムの動作について説明する。【０１５６】
図１８は、ストレージプログラム３０２が実行するリード処理のフローチャートを示す。【０１５７】
本処理は、ホスト（例えばアプリケーションプログラム３０１）からリード要求が発行された場合に実行される。【０１５８】
まず、ストレージプログラム３０２は、受信したリード要求の指定アドレスで示されるアクセス先仮想ページに、プールボリューム内の論理ページが割り当て済であるか否かを、ページマッピングテーブル５１０を参照して判定する（Ｓ１８０１）。指定アドレスは、例えば、仮想ボリューム番号及びＬＢＡで指定される。ＬＢＡは、開始ＬＢＡ及びブロック長で表されてもよい。具体的には、ストレージプログラム３０２は、ページマッピングテーブル５１０を参照し、指定アドレスから、対応するプールボリューム番号とＬＢＡを検索する。ストレージプログラム３０２は、対応するアドレス情報の有無で、仮想ページに論理ページが未割り当てか否かを判定する。【０１５９】
論理ページが未割り当てである場合（Ｓ１８０１：Ｎ）、ストレージプログラム３０２は、排他が必要か否か判定する（Ｓ１８０５）。ストレージプログラム３０２は、仮想ボリューム管理テーブル５１１を参照し、仮想ボリュームのオーナノードが自ノードのみである場合に排他不要と判定する。【０１６０】
排他が必要の場合（Ｓ１８０５：Ｙ）は、ストレージプログラム３０２は、排他を取得して（Ｓ１８０６）、再度、仮想ページにプールボリューム内の論理ページが割り当て済であるか否かを判定する（Ｓ１８０７）。排他方法の一例として、ストレージプログラム３０２は、リードアドレスから一意に決まる代表ノードを、ハッシュ関数を使用して特定し、代表ノードに調停を依頼し、代表ノードが調停を行う。【０１６１】
論理ページが割り当て済である場合（Ｓ１８０７：Ｙ）、ストレージプログラム３０２は、排他を解除し（Ｓ１８１４）、ステップＳ１８０２に進む。論理ページが未割り当てである場合（Ｓ１８０７：Ｎ）、ストレージプログラム３０２は、ゼロデータを返し（Ｓ１８０８）、ステップＳ１８０５の判定と同様に排他要否を判定する（Ｓ１８０９）。排他が必要である場合（Ｓ１８０９：Ｙ）には、排他がすでに取得されているため、ストレージプログラム３０２は、排他を解放する（Ｓ１８１０）。【０１６２】
ステップＳ１８０１において論理ページが割り当て済であり（Ｓ１８０１：Ｙ）、且つ仮想ページに自ノードのプールボリューム内の論理ページが割り当てられている場合（Ｓ１８０２：Ｙ）、ストレージプログラム３０２は、自ノードのキャッシュ領域を確保し（Ｓ１８０３）、当該プールボリュームからデータをリードして、当該リードデータをホストへ返す（Ｓ１８０４）。ストレージプログラム３０２は、プールボリューム管理テーブル５１２及び外部接続管理情報を参照して、仮想ページに自ノードのプールボリューム内の論理ページが割り当てられているか否か判定する。【０１６３】
仮想ページに、自ノードのプールボリューム４０１Ａを介して他ノード１０１のプールボリューム４０１Ｂ内の論理ページが割り当てられる場合、当該仮想ページに他ノードのプールボリューム内の論理ページが割り当てられていると判定される。【０１６４】
キャッシュ領域の確保において、ストレージプログラム３０２は、キャッシュ情報５０３を参照して、対象論理アドレスに対応付けられているキャッシュ領域を特定する。対応するキャッシュ領域が存在しない場合、ストレージプログラム３０２は、フリーキュー１２０５から新たな領域を確保する。フリーキュー１２０５が空の場合、ストレージプログラム３０２は、クリーンキュー１２０４から新たな領域を確保する。クリーンキュー１２０４が空の場合、ストレージプログラム３０２は、ダーティキュー１２０１、１２０２又は１２０３内の領域をデステージしてフリー領域に変化させる。【０１６５】
アクセス先仮想ページに他ノードのプールボリューム４０１Ｂ内の論理ページが割り当てられている場合（Ｓ１８０２：Ｎ）、リード要求の転送先となる当該他ノードが障害状態でないか否か、ノード状態管理テーブル５１５により、判定する（Ｓ１８１１）。ステップＳ１８１１の判定の結果、転送先の他ノードが障害状態でない（正常状態である）場合（Ｓ１８１１：Ｎ）、ストレージプログラム３０２は、当該他ノードのノード１０１にリード要求を転送する（Ｓ１８１２）。これにより、他ノード１０１は、本フローチャートに従ったリード処理を実行する。ストレージプログラム３０２は、自ノードではリードデータをキャッシュしない。つまり、仮想ページに割り当てられる論理ページが他ノードにあれば、ストレージプログラム３０２は、リードデータを自ノードのメモリ２０５にキャッシュせず（リードスルー）、他ノード１０１がリードデータをキャッシュする。ステップＳ１８１１の判定の結果、転送先の他ノードが障害状態である場合（Ｓ１８１１：Ｙ）、コレクションリード処理を呼び出し、実行する（Ｓ１８１３）。【０１６６】
図１９は、ストレージプログラム３０２が実行する同期ライト処理のフローチャートを示す。【０１６７】
本処理は、ホスト（例えばアプリケーションプログラム）からライト要求が発行された場合に実行される。本処理は、自ノードのプールボリュームにライトデータを格納することに加え、ノード間冗長コード及びサイト間冗長コードを生成するために、他ノードのノード１０１にライトデータを転送する。【０１６８】
ライト要求を受けたノード１０１のストレージプログラム３０２は、アクセス先仮想ページにプールボリューム内の論理ページが割り当て済であるかどうかを判定する（Ｓ１９０１）。【０１６９】
論理ページが未割り当てである場合（Ｓ１９０１：Ｎ）、ストレージプログラム３０２は、仮想ページをプールボリュームに割り当てる処理を実行する。ストレージプログラム３０２は、まずページマッピングテーブル５１０の更新の排他が必要か否か判定する（Ｓ１９１１）。排他を取得する理由は、他ノード１０１が同時に割り当てを行う場合に、仮想ページに対して、複数の異なる論理ページが割り当てられることを防ぐためである。【０１７０】
ストレージプログラム３０２は、仮想ボリューム管理テーブル５１１を参照し、オーナノードに自ノード以外が含まれている場合は、排他が必要であると判定し、オーナノードが自ノードのみである場合、排他が不要であると判定する。排他が必要と判定した場合（Ｓ１９１１：Ｙ）、ストレージプログラム３０２は、排他を取得する（Ｓ１９１２）。排他の取得方法は、前述のリード処理において示した方法と同様である。【０１７１】
次に、ストレージプログラム３０２は、仮想ページに論理ページが割り当て済であるか否かを、再度判定する（Ｓ１９１３）。これは、ステップＳ１９０１で仮想ページに割り当て済みであるか否かを判定した後、ステップＳ１９１２で排他を取得する前に、他ノードによって排他が取得されている可能性があるからである。【０１７２】
ページが未割り当てである場合（Ｓ１９１３：Ｎ）、ストレージプログラム３０２は、仮想ページに割り当てるプールボリューム及びその中の論理ページを決定する（Ｓ１９１４）。ここでストレージプログラム３０２は、自ノードのプールボリューム内に空きページがあるかどうかをチェックする。具体的には、ストレージプログラム３０２は、プールボリューム及びその中の論理ページを選択し、静的マッピングテーブル５０６を用いて当該論理ページのストライプタイプを特定し、ローカル領域量テーブル８０４において、当該ストライプタイプのエントリにおいて、実際使用量が目標使用量より少ないか判定する。実際使用量が目標使用量より少ない場合、ストレージプログラム３０２は、当該仮想ページに自ノードのプールボリューム内の論理ページを割り当てる。空きページが自ノードに存在しない場合、ストレージプログラム３０２は、外部接続機能により他ノードのプールボリュームをローカルにマウントし、その空きページを仮想ページに割り当てる。【０１７３】
プールボリュームを決定すると、ストレージプログラム３０２は、当該プールボリューム内の論理ページを仮想ページに割り当てる（Ｓ１９１５）。具体的には、ストレージプログラム３０２は、ページマッピングテーブル５１０の対応関係を更新する。【０１７４】
次に、ストレージプログラム３０２は、排他が必要か否かを判定する（Ｓ１９１６）。この判定は、ステップＳ１９１１と同様である。排他が必要な場合（Ｓ１９１６：Ｙ）、又はＳ１９１３でページが割り当て済みである場合（Ｓ１９１３：Ｎ）、ストレージプログラム３０２は、取得済みの排他を解放する（Ｓ１９１７）。排他が不要な場合（Ｓ１９１６：Ｎ）、ストレージプログラム３０２は、ステップＳ１９０２に進む。【０１７５】
ステップＳ１９０１で論理ページが割り当て済である場合（Ｓ１９０１：Ｙ）、ストレージプログラム３０２は、ライト要求の仮想ボリュームにおける論理アドレス（仮想ページ）に、自ノードのプールボリュームが割り当てられているかを、ページマッピングテーブル２１５を参照して判定する（Ｓ１９０２）。【０１７６】
自ノードのプールボリュームが割り当てられていない場合（Ｓ１９０２：Ｎ）、次にライト要求の転送先となる他ノードが障害状態でないか否かを、ノード状態管理テーブル５１５により判定する（Ｓ１９１８）。ステップＳ１９１８の判定の結果、転送先の他ノードが障害状態でない（正常状態である）場合（Ｓ１９１８：Ｎ）、ストレージプログラム３０２は、他ノード１０１にライト要求を転送する（Ｓ１９１８）。他ノード１０１は、本フローチャートに従った同期ライト処理を実行する。データコヒーレンシの維持のため、ストレージプログラム３０２は、自ノードでライトデータをキャッシュしない。ステップＳ１９１８の判定の結果、転送先の他ノードが障害状態である場合（Ｓ１９１８：Ｙ）、ストレージプログラム３０２は、コレクションライト処理を呼び出し、実行する（Ｓ１９２０）。【０１７７】
仮想ページに自ノードのプールボリュームが割り当てられている場合（Ｓ１９０２：Ｙ）、ストレージプログラム３０２は、保護レイヤ毎のライト処理を開始する（Ｓ１９０３〜Ｓ１９１０）。例えば、分散型ストレージシステムが三つの保護レイヤで構成されている場合、ストレージプログラム３０２は、３レイヤで計３回処理を繰り返す。なお、本実施例において、ノード保護レイヤは、同期ライトに設定されている。【０１７８】
ストレージプログラム３０２は、当該レイヤが同期ライト対象かどうかを判定する（Ｓ１９０３）。具体的には、ストレージプログラム３０２は、仮想ボリューム管理テーブル５１１において、ライト対象の仮想ボリュームに対応するＳｙｎｃ／Ａｓｙｎｃフィールドを参照して判定する。【０１７９】
同期ライトの対象ではない場合（Ｓ１９０３：Ｎ）、ストレージプログラム３０２は、ライトデータ（ストライプ）を他ノード１０１に転送することなく、データマッピングテーブル７０１の領域の状態フィールドに”未完了”と記録する。状態フィールドは、各保護レイヤの状態を示す。状態フィールドが”未完了”を示すキャッシュ上のデータは、転送まで維持される。【０１８０】
ストレージプログラム３０２は、全ての保護レイヤで処理が完了したかを判定し（Ｓ１９１０）、完了していたら本処理を終了する。完了していない場合（Ｓ１９１０：Ｎ）、ストレージプログラム３０２は、次の保護レイヤの処理をステップＳ１９０３から繰り返す。同期ライト対象の場合（Ｓ１９０３：Ｙ）、ストレージプログラム３０２は、自ノードのキャッシュ領域において、キャッシュ確保を実施する（Ｓ１９０４）。その方法は、前述のリード処理における方法と同様である。【０１８１】
次に、ストレージプログラム３０２は、ライトデータのストライプタイプを特定し、ライトデータの転送先の冗長コードノードを決定する（Ｓ１９０５）。ストレージプログラム３０２は、冗長コードノードを以下の方法で特定する。ストレージプログラム３０２は、指定アドレスに基づいて、静的マッピングテーブル５０６におけるストライプ位置番号を算出し、算出したストライプ位置番号と自ノード番号とから、当該保護レイヤの静的マッピングテーブルを参照して、ストライプタイプ番号（静的マッピングテーブルの要素）を決定する。ストレージプログラム３０２は、当該保護レイヤの静的マッピングテーブル５０６を参照して、ストライプタイプ番号から、冗長コードノードを決定する。ストレージプログラム３０２は、例えば、保護レイヤ＃２の静的マッピングテーブル５０６を参照して、ノード間冗長コードを最終的に格納する冗長コードノードを決定する。ストレージプログラム３０２は、例えば、保護レイヤ＃３の静的マッピングテーブル５０７を参照して、冗長コードサイト（保護レイヤ＃３の冗長コードを格納するサイト）を決定する。例えば、各サイトの代表ノードが予め設定されており、ストレージプログラム３０２は、冗長コードサイトの代表ノードを冗長コードノードとして決定する。【０１８２】
次に、ストレージプログラム３０２は、中間コードを転送するか否か判定する（Ｓ１９０６）。中間コードは、旧データ（今までの最新データ）と新データ（今回ライトするデータ）の更新差分を表す。例えばＲＡＩＤ５に相当する冗長コードの場合、中間コードは、旧データと新データのｘｏｒ値である。その他、Ｅｒａｓｕｒｅ  Ｃｏｄｉｎｇを用いる場合、ストレージプログラム３０２は、行列の係数を乗算した複数のｘｏｒ結果を生成してもよい。【０１８３】
中間コード転送の要否の判定基準としていくつかの基準を使用することができる。例えば、ストレージプログラム３０２は、冗長コードノードの冗長コード領域の残量が閾値より少ないとき、中間コード転送要と判定する。これにより、冗長コードノードは、必要な冗長コードを確実に格納できる。この場合、ストレージプログラム３０２は、冗長コードノードのローカル領域量の情報を冗長コードノードから取得する。【０１８４】
ストレージプログラム３０２は、自ノードにおいてキャッシュヒット時のレスポンス低減効果が小さい場合に、中間コードを生成してもよい。例えば、自ノードにおいてライトスルーモードが設定されているとき、自ノードにおいて所定の低レイテンシドライブが使用されているとき、自ノードが閾値より高い負荷状態であるとき、又は、ノード間通信距離が閾値より長いとき、ストレージプログラム３０２は、中間コード転送要と判定する。【０１８５】
または、ストレージプログラム３０２は、ドライブ１０５のライト寿命が十分ある場合に、中間コード転送要と判定してもよい。なお、ライトスルーモードにおいて、ストレージプログラム３０２は、ライトデータをキャッシュからドライブ１０５にデステージした後に、ホストに完了応答を返す。【０１８６】
中間コード転送要と判定した場合（Ｓ１９０６：Ｙ）、ストレージプログラム３０２は、キャッシュ上の新データとドライブ１０５から読み出した旧データとから中間コードを生成し（Ｓ１９０７）、冗長コードノードのキャッシュに中間コードをライトする（Ｓ１９０８）。ストレージプログラム３０２は、自アドレス情報（サイト番号、ノード番号、ＬＤＥＶ番号、ＬＢＡ、ＴＬ（Ｔｒａｎｓｆｅｒ  Ｌｅｎｇｔｈ））及び中間コードであることを示す識別子と共に、中間コードを、冗長コードノードへ転送する。ＬＤＥＶ番号は、プールボリュームの識別子である。【０１８７】
冗長コードノードにおいて、中間コードと同一転送元アドレスのダーティデータが存在する場合、冗長コードノードのストレージプログラム３０２は、中間コードとそのダーティデータのｘｏｒを算出して、キャッシュ上のデータを更新する。冗長コードノードのストレージプログラム３０２は、当該中間コードに関する情報を、中間ダーティキュー１２０３に接続する。冗長コードノードは、同一冗長コードの元となる異なる転送元からの中間コードのｘｏｒを算出して、キャッシュ上のデータを更新してもよい。【０１８８】
ステップＳ１９０６において、中間コードを転送しないと判定した場合（Ｓ１９０６：Ｎ）、ストレージプログラム３０２は、冗長コードノードにライトデータを転送し、冗長コードノードは、受信したライトデータをキャッシュに格納する（Ｓ１９０９）。ライトデータの転送元ノードは、冗長コードノードに、転送データの自アドレス情報（サイト番号、ノード番号、ＬＤＥＶ番号、ＬＢＡ、ＴＬ）と通常データであることを示す識別子と共に、ライトデータを転送する。冗長コードノードにおいて、ストレージプログラム３０２は、ライトデータに対応する情報を、対応するコードダーティキュー１２０２に接続する。【０１８９】
図２０は、ストレージプログラム３０２が実行する非同期ライト処理のフローチャートを示す。【０１９０】
本処理は、ホストＩ／Ｏとは非同期に実行され、Ａｓｙｎｃが指定された保護レイヤで、まだ他ノードに転送されていないデータを転送する。非同期ライト処理におけるステップＳ２００２〜Ｓ２００９は、同期ライト処理におけるステップＳ１９０４〜Ｓ１９１０と同様である。ここでは、同期ライト処理との差分のみを説明する。各ノード１０１において、ストレージプログラム３０２は、ページマッピングテーブル５１０を参照し、登録されている全仮想ボリュームについて、本処理を実行する。【０１９１】
ストレージプログラム３０２は、対象の仮想ページが非同期ライトの対象であるかを判定する（Ｓ２００１）。具体的には、ストレージプログラム３０２は、データマッピングテーブル７０１において、仮想ページに対応するプールボリューム内の論理ページの状態をチェックする。当該保護レイヤにおいて、”未完了”の状態であれば、ストレージプログラム３０２は、非同期ライト対象と判定し（Ｓ２００１：Ｙ）、ステップＳ２００２に進む。【０１９２】
全ての仮想ページの処理が終了したら（Ｓ２００９：Ｙ）、ストレージプログラム３０２は、本フローを終了する。ストレージプログラム３０２は、非同期ライト処理を周期的に実行してもよいし、常時実行してもよい。ストレージプログラム３０２は、”未完了”状態のページ量に応じて本処理の実行頻度やデータ転送速度を動的に変更してもよい。【０１９３】
例えば、仮想ボリューム管理テーブル５１１の同期／非同期の情報において、保護レイヤ＃３（ジオ保護レイヤ）が非同期に設定されている場合、ライト要求時にサイト間のデータ転送を行わないことから、アプリケーションプログラム３０１の応答時間の増加を防ぐことができる。【０１９４】
図２１は、ストレージプログラム３０２が実行するデステージ処理のフローチャートを示す。【０１９５】
本処理はキャッシュ上にダーティデータ、つまり、ドライブ１０５に未反映のデータが存在する場合に、ホストＩ／Ｏと非同期で実行される。キャッシュには、２種類のダーティデータが存在する。一つは、自ノードのドライブ１０５に格納されるライトデータである。他の一つは、冗長コード生成のために他ノード１０１から転送されたデータである。ここで、他ノードから転送されたデータは、中間コードを含む。ダーティデータは、データダーティキュー１２０１、コードダーティキュー１２０２及び中間ダーティキュー１２０３で管理されている。このフローチャートは、データダーティキュー１２０１及びコードダーティキュー１２０２で管理されているダーティデータのデステージ処理を示す。【０１９６】
まず、ストレージプログラム３０２は、データダーティキュー１２０１及びコードダーティキュー１２０２を参照し、対象のダーティデータを見つける。ストレージプログラム３０２は、対象データが、自ノードのドライブ１０５に格納するためのライトデータであるか否かを判定する（Ｓ２１０１）。対象データがデータダーティキュー１２０１によって示されている場合、対象データはライトデータである。【０１９７】
対象データがライトデータである場合（Ｓ２１０１：Ｙ）、ストレージプログラム３０２は、当該ライトデータを自ノードのドライブ１０５にライトする（Ｓ２１０７）。データは、ログ構造化形式で格納される。前述のログ構造化マッピングテーブル５０８に示したように、ライトデータをドライブ１０５にログ構造化形式で格納する際に、ストレージプログラム３０２は、プールボリュームアドレスとドライブアドレスとの対応関係、及びデータの状態を、データマッピングテーブル７０１に記録する。【０１９８】
ドライブ１０５に空き領域が無い場合、ストレージプログラム３０２は、後述する容量枯渇管理処理を実行してからドライブ１０５へのデータのライトを実行してもよい。【０１９９】
ストレージプログラム３０２は、全ダーティデータを処理したかどうかを判定する（Ｓ２１０６）。全ダーティデータの処理が終了している場合（Ｓ２１０６：Ｙ）、ストレージプログラム３０２は、本フローを終了する。【０２００】
対象データがライトデータではない場合、つまり、対象データが冗長コード生成のためのデータ（他ノードから受信したデータ）である場合（Ｓ２１０１：Ｎ）、ストレージプログラム３０２は、同一ストライプタイプのダーティデータを見つける（Ｓ２１０２）。【０２０１】
具体的には、ストレージプログラム３０２は、コードダーティキュー１２０２における対象データのキューにおいて、対象データを含む、異なるノード１０１から転送された複数のライトデータを取得する。ストレージプログラム３０２は、予めユーザにより指定されたデータ保護の方針を示す配置ポリシ（ＸＤＹＰ：最大ユーザデータ数Ｘに対して冗長コード数Ｙ）に従い、可能な限りＸ個のデータを取得する。配置ポリシについては、後述する。【０２０２】
具体的には、ストレージプログラム３０２は、静的マッピングテーブル５０６又は５０７が示すデータノード数を超えない範囲で、できるだけ多くのストライプを選択する。これにより、ストレージプログラム３０２は、できるだけ配置ポリシを満たす冗長化を行うことができる。ここで選択されるライトデータの転送元ノードは、全て異なる。対象データのキューが、当該ストライプタイプに属する全データノードからのライトデータを示す場合、ストレージプログラム３０２は、全データノードからのライトデータを選択する。ストライプの選択において、転送元ノードでの論理アドレスは問わない。【０２０３】
このように、冗長コード生成の要素となるライトデータの数は固定されておらず、不定である。また、冗長コード生成の要素となるライトデータの論理アドレスの組も不定である。これにより、ストレージプログラム３０２は、転送されたライトデータのみから効率的に冗長コードを生成できる。コードダーティキュー１２０２において、同一ストライプタイプの他ノード１０１からのライトデータが存在しない場合、ストレージプログラム３０２は、単一対象データを冗長コードとして、ドライブ１０５に格納してもよい。また、データをデステージする際に、転送元ノードからのデータはフロントエンドライトに同期して転送されるため、その時点では転送元ノードのドライブに書き出されておらず、デステージされる前に新たに同期ライト処理が発生するとキャッシュ上で当該ライトデータが上書きされる可能性がある。このため、冗長コードノードでは、転送元ノードがデステージ完了したデータのみ冗長コードの生成に使用するようにしなければならない。この実現のために、転送元ノードがデステージした旨を、冗長コードノードに通知してもよい。但し、転送元ノードがデステージタイミングで冗長コードノードにデータ転送する場合は、冗長コードノードはこの条件を考慮しなくてよい。【０２０４】
ストレージプログラム３０２は、中間ダーティキュー１２０３における同一ストライプタイプのキューからダーティデータを見つけてもよい。ストレージプログラム３０２は、ドライブ１０５に格納されており対応する冗長コードと中間コードのｘｏｒを算出して冗長コードを更新する。更新された冗長コードが、対象データの転送元ノードとは異なるノードのライトデータのみから生成されている場合、ストレージプログラム３０２は、対象データと更新された冗長コードとから新たな冗長コードを生成する。【０２０５】
ストレージプログラム３０２は、できるだけ旧ライトデータの比率が大きくなるように、冗長コードを生成するライトデータを選択してもよい。ストレージプログラム３０２は、旧ライトデータのみで冗長コードを生成できる場合、旧ライトデータのストライプのみを選択して冗長コードを生成する。冗長コード生成における旧データの比率を大きくすることで、当該冗長コードが無効データとなる時期を早め、冗長コード格納領域の空き容量を効率的に増加させることができる。【０２０６】
ストレージプログラム３０２は、選択したライトデータから冗長コードを算出し、ドライブ１０５にライトする（Ｓ２１０３、Ｓ２１０４）。【０２０７】
複数のユーザデータの組み合わせから冗長コードを書き出した後、他ノードがその組み合わせから冗長コードを生成する必要がある場合、ストレージプログラム３０２は、他ノードへ冗長コードを生成したユーザデータの組み合わせ情報を通知する。例えば、ストレージプログラム３０２は、冗長コードを生成したユーザデータのノード番号、ストライプ番号、ドライブ番号、ＬＢＡを組み合わせ情報として通知する。通知を受信した他ノードは、組み合わせ情報に基づき、２つ目以降の冗長コードを生成する。これにより、複数の冗長コードノードにおいて、同じユーザデータの組み合わせで、冗長コードを生成することができる。【０２０８】
ドライブ１０５へのライトは、ステップＳ２１０７と基本的には同様に、ログ構造化形式による追記である。これにより、旧データの読み出しを省略し、高速及び効率的な冗長コードの生成及びドライブライト処理を実現する。【０２０９】
ストレージプログラム３０２は、算出した冗長コードの格納位置の物理領域と、プールボリューム内の論理ページとの対応関係を、データマッピングテーブル７０１ではなく、冗長コードマッピングテーブル７０２に記録する。ストレージプログラム３０２は、さらに、逆マッピングテーブル７０３において、プールボリュームアドレスとドライブアドレスとの対応関係を記録する。冗長コードは複数のライトデータから生成されるため、逆マッピングテーブル７０３は、一つのドライブアドレスに対して複数の参照を持つ。【０２１０】
ストレージプログラム３０２は、冗長コードをドライブ１０５にライトしたら、冗長コードをクリーンキューに変更し、ライトの完了を転送元ノードに通知する（Ｓ２１０５）。この通知を受信した転送元ノードは、データマッピングテーブル７０１における対象データの対象保護レイヤの状態を“完了”に変化させる。状態フィールドは、ノード障害時に当該データを再転送対象とするかどうかを判定するために参照される。ストレージプログラム３０２は、全ダーティデータの処理を完了したら（Ｓ２１０６：Ｙ）、本フローを終了する。そうでなければ、ストレージプログラム３０２は、Ｓ２１０１において次のダーティデータを処理する。【０２１１】
中間コードのデステージにおいて、ストレージプログラム３０２は、ドライブ１０５に格納されている旧冗長コードと中間コードとから、新たな冗長コードを生成し、ドライブ１０５における旧冗長コードにオーバーライトする。オーバーライトであるため、ログ構造化マッピングテーブル５０８は変わらない。中間コードによる冗長コードの更新は、データノードからの旧データのリードを必要とするが、冗長コードノードにおけるローカル領域の使用量を低減できる。【０２１２】
中間ダーティキュー１２０３に、一つの冗長コードに対する複数の中間コードが存在する場合、ストレージプログラム３０２は、全中間コードのｘｏｒを算出して新中間コードを生成し、当該新中間コードによって冗長コードを更新する。同一冗長コードに対応する複数の中間コードは、同一論理アドレスの異なる世代のデータ及び異なるノード１０１の中間コードを含む。【０２１３】
ストレージプログラム３０２は、冗長コードマッピングテーブル７０２を使用して、中間ダーティキュー１２０３から選択した中間コードの冗長コードの物理アドレスを知ることができる。さらに、ストレージプログラム３０２は、逆マッピングテーブル７０３を使用して、当該冗長コードに対応する中間コードの論理アドレスを特定することができる。【０２１４】
冗長コード更新の具体例を、以下に示す。以下では、Ｅｒａｓｕｒｅ  Ｃｏｄｉｎｇとして、リードソロモン符号を用いたＲＡＩＤ６を例に挙げる（ｄ＝３、ｐ＝２）。ガロア係数をＡ１〜Ａ３とする。【０２１５】
（１）コードダーティキュー１２０２
ストレージプログラム３０２は、コードダーティキュー１２０２からＸ１〜Ｘ３のダーティデータを選択し、下記の式で、冗長コードＰ１又はＰ２を算出する。
Ｐ１＝Ｘ１ｘｏｒＸ２ｘｏｒＸ３
Ｐ２＝（Ｘ１＊Ａ１）ｘｏｒ（Ｘ２＊Ａ２）ｘｏｒ（Ｘ３＊Ａ３）
冗長コードＰ１、Ｐ２は、それぞれ、自ノードのストレージデバイスの新規領域にライトされる。【０２１６】
（２）中間ダーティキュー１２０３
ストレージプログラム３０２は、中間ダーティキュー１２０３から、自ノードのドライブ１０５にライト済みの旧冗長コードＰ１ｏ又はＰ２ｏに対応する新らたな中間ダーティデータＭ１、Ｍ２を抽出する。中間ダーティデータの個数は２とは限らない。ストレージプログラム３０２は、下記の式で新中間コードＭＰ１又はＭＰ２を算出する。
ＭＰ１＝Ｍ１ｘｏｒＭ２
ＭＰ２＝（Ｍ１＊Ａ１）ｘｏｒ（Ｍ２＊Ａ２）【０２１７】
ストレージプログラム３０２は、下記の式で新たな冗長コードＰ１又はＰ２を算出する。
Ｐ１＝Ｐ１ｏｘｏｒＭＰ１
Ｐ２＝Ｐ２ｏｘｏｒＭＰ２
新冗長コードＰ１、Ｐ２は、旧領域（Ｐ１ｏ、Ｐ２ｏ）にオーバーライトされる。【０２１８】
また、ストレージプログラム３０２は、予め設定されたデータ数ｄ以下のライトデータで、冗長コードを生成することがあり得る。このとき、ストレージプログラム３０２は、不足分のライトデータを０データとして、冗長コードを生成する。【０２１９】
例えば、データ数ｄが３に設定されている場合、ストレージプログラム３０２は、３つのライトデータＸ１、Ｘ２、Ｘ３から冗長コードを生成する。しかし、３つ目のライトデータＸ３が、いつまでも他ノードから転送されない場合、ストレージプログラム３０２は、他の挿入済みのライトデータＸ１、Ｘ２をデステージすることができない。そこで、ストレージプログラム３０２は、以下のように不足分のライトデータＸ３を０データとして、冗長コードを生成し、デステージを行う。
Ｐ＝Ｘ１ｘｏｒＸ２ｘｏｒ０【０２２０】
このようなデータ数ｄに満たないライトデータ数で生成された冗長コードに対して、不足分のライトデータが、冗長コード生成後に、他ノードから転送された場合、ストレージプログラム３０２は、当該ライトデータで当該冗長コードを更新してよい。例えば、ストレージプログラム３０２は、上述した例で生成した冗長コードＰを、以下のように更新し、新たな冗長コードＰｎを生成する。
Ｐｎ＝ＰｘｏｒＸ３【０２２１】
以上のように、デステージ時に、データ数ｄに満たないライトデータ数で生成した冗長コードが存在する場合、ストレージプログラム３０２は、このような冗長コードを見つけ、不足分のライトデータで、当該冗長コードを更新してもよい。これにより、ライトデータの転送元ノードは、中間コードを生成せずとも、冗長コードを更新することができ、限られた容量を効率的に利用することができる。【０２２２】
上述のように、冗長コードノードは、一つのストライプタイプ内のライトデータから動的にライトデータを選択し、選択したライトデータから冗長コードを生成する。これにより、冗長コードノードは、既存冗長コードを読み出すことなく、転送されたライトデータから効率的に冗長コードを生成することができる。【０２２３】
本実施例における冗長コードノードによるライトデータの動的な選択において、選択されるライトデータの組み合わせ及び選択されるストライプ数の少なくとも一方が不定である。上記の例で、冗長コードノードは、ストライプ数及びアドレス組み合わせの双方から独立してライトデータを選択するが、その一方が固定されていてもよい。ここで、アドレス組み合わせにおけるアドレスは、ノード、プールボリューム及びプールボリュームアドレスで指定されるアドレスである。【０２２４】
冗長コードのドライブ１０５へのライトに、ログ構造化方式が適用されてなくてもよい。つまり、冗長コードノードは、旧冗長コードと同一アドレス組み合わせから生成した新冗長コードをローカル領域に追記することなく、旧冗長コードを新冗長コードに書き換えてもよい。ログ構造化方式が採用されない構成において、既存の全冗長コードと異なるアドレス組み合わせの冗長コードは、ローカル領域に追記される。【０２２５】
上記の例で、冗長コードノードは、予め定義されたストライプタイプ内のライトデータのみから冗長コードを生成する。なお、分散型ストレージシステムは、プールボリュームアドレスに対してストライプタイプを定義することなく、他のルールを用いてライトデータの組み合わせを決定し、その組み合わせから冗長コードを生成してもよい。【０２２６】
ここでは、ストレージプログラム３０２が実行する容量枯渇管理処理について説明する。【０２２７】
まず、ノード１０１上のストレージプログラム３０２内の容量枯渇管理処理プログラム１６１１が、自ノードで、ライトデータタイプの中の何れかのストライプタイプの実際使用量が目標使用量を超過していることを検出すると、容量枯渇管理処理を実行する。【０２２８】
次に、容量枯渇管理処理プログラム１６１１は、容量枯渇を検出したストライプタイプの冗長コードを格納する冗長コードノードに、削減対象のストライプタイプの情報を指定し、容量削減処理の要求を発行する。容量削減処理の要求を受信した冗長コードノードは、削減対象のデータタイプから生成された冗長コードを消去して、容量削減要求元の容量に空き容量を確保しようとする。【０２２９】
ここで、冗長コードノードは、全て無効ライトデータに対応する冗長コードを、もはや保持する意味はなく、即座に消去２２０４できる。しかし、少なくとも一つの有効ライトデータに対応する冗長コードを消去すると、有効ライトデータの冗長度が下がるため、冗長コードノードは、その冗長コードを消去することができない。したがって、冗長コードノードは、冗長コードを消去する前に、その冗長コードの生成に用いられたライトデータが、有効か無効かを判定し、有効である場合、当該有効データを再度、転送してもらうことで、転送された有効データとキャッシュ上に存在する別の有効データとから、新しく冗長コードを生成し、有効ライトデータの冗長度を下げないようにする。【０２３０】
図２２は、ストレージプログラム３０２が実行する容量枯渇管理処理のフローチャートを示す。【０２３１】
本処理は、何れかの実際使用量が目標使用量を超えている場合に、データの消去を試みる。これにより、分散型ストレージシステムは、必要なデータを限られた領域に格納できる。消去するデータタイプは、ライトデータタイプと冗長コードタイプである。ストレージプログラム３０２は、本処理をホストＩ／Ｏと非同期に実施してもよい。実際使用量と目標使用量の関係は、ローカル領域量テーブル８０４に示される。【０２３２】
まず、ストレージプログラム３０２は、ローカル領域量テーブル８０４を参照し、選択した対象データタイプの実際使用量が、目標使用量を超過しているか否か判定する（Ｓ２３０１）。【０２３３】
ステップＳ２３０１にて、判定の結果、対象データタイプの実際使用量が目標使用量を超過していない場合（Ｓ２３０１：Ｎ）、ストレージプログラム３０２は、容量枯渇管理処理を終了する。ステップＳ２３０１にて、判定の結果、対象データタイプの実際使用量が目標使用量を超過している場合（Ｓ２３０１：Ｙ）、ストレージプログラム３０２は、容量削減処理を実行する（Ｓ２３０２）。このとき、実際使用量を超過しているデータタイプが、ライトデータである場合、容量超過を検出したノードである容量超過ノードのストレージプログラム３０２は、当該ライトデータの冗長コードを格納するノードである冗長コードノードに対し、実際使用量が超過しているデータタイプの情報を指定し、容量削減処理を要求する容量削減要求を発行する。実際使用量を超過しているデータタイプが、冗長コードであった場合、自ノードのストレージプログラム３０２が、容量削減処理を実行する。【０２３４】
次に、容量削減処理について説明する。【０２３５】
冗長コードノードは、容量削減要求を受信すると（Ｓ２３０５）、ログ構造化マッピングテーブル５０８を参照することで、消去対象とする冗長コードを探索する（Ｓ２３０６）。探索の際、容量削減処理の要求元ノードが他ノードである場合、消去したいデータは、当該他ノードの、無効ライトデータであるため、冗長コードノードは、当該他ノードの無効ライトデータを含む冗長コードを探索する。容量削減処理の要求元ノードが自ノードである場合、消去したいデータは、自ノードの冗長コードであるため、冗長コードノードは、冗長コードを探索する。この際、冗長コードノードは、可能な限り無効ライトデータから生成された冗長コードを探索することで、後述するデータ再転送処理の発行回数を抑えネットワーク通信量を削減することができる。【０２３６】
次に、冗長コードノードは、探索結果の冗長コードに対して、冗長コードの生成に用いられたライトデータが無効データか否か判定する（Ｓ２３０７）。例えば、冗長コードノードは、逆マッピングテーブル７０３に、冗長コードの生成に用いられたライトデータが有効か無効かを示すフラグを設け、それを用いて判定してもよいし、各ライトデータを格納するノードに対し、ライトデータの有効無効を問合せてもよい。【０２３７】
ステップＳ２３０７で、判定の結果、冗長コードを生成したライトデータが、無効ライトデータである場合（Ｓ２３０７：Ｎ）、冗長コードノードは、当該無効ライトデータを格納するノードであるデータノードに対して、当該無効ライトデータのデータ消去処理を要求する消去要求を発行する（Ｓ２３０９）。【０２３８】
ここでは、データ消去処理について説明する。消去要求を受信したデータノードは、データ消去処理として、消去要求のあったデータを消去し、完了応答を要求元ノードに返却する（Ｓ２３１７〜Ｓ２３１９）。具体的には、データノードは、ローカル領域制御テーブル５０９の無効リスト８０２から消去対象ライトデータを削除し、フリーリスト８０３に繋ぎ直す。【０２３９】
ステップＳ２３０７で、判定の結果、冗長コードを生成したライトデータが、有効ライトデータである場合（Ｓ２３０７：Ｙ）、冗長コードノードは、当該有効ライトデータを格納するノードであるデータノードに対して、当該無効ライトデータのデータ再転送処理を要求するデータ再転送要求を発行する（Ｓ２３０８）。【０２４０】
ここでは、データ再転送処理について説明する。再転送要求を受信したデータノードは、データ再転送処理として、再転送要求のあったデータをドライブ１０５又はキャッシュから読み出し、要求元ノード（当該ライトデータの冗長コードノード）に再転送し、完了応答を返却する（Ｓ２３１４〜Ｓ２３１６）。再転送された有効データは、冗長コードノードにおいて、キャッシュ情報５０３のコードダーティキュー１２０２に接続し直され、デステージ処理プログラム１６０９で、再度冗長コードが生成され、ドライブ１０５に書き出される。【０２４１】
次に、冗長コードノードは、消去対象の冗長コードの生成に用いられたライトデータに対して、上述したデータ消去処理、又はデータ再転送処理が完了したか否か判定する（Ｓ２３１０）。ステップＳ２３１０で、判定の結果、未完了の場合（Ｓ２３１０：Ｎ）、冗長コードノードは、未完了のライトデータに対して、ステップＳ２３０７〜Ｓ２３０９の処理を再実行する。ステップＳ２３１０で、判定の結果、完了の場合（Ｓ２３１０：Ｙ）、冗長コードノードは、消去対象の冗長コードの生成に用いられた全てのライトデータに対して、データ消去処理、又はデータ再転送処理が完了したため、当該消去対象の冗長コードを消去する（Ｓ２３１１）。ここで冗長コードノードは、具体的には、冗長コードマッピングテーブル７０２における対象領域のドライブアドレスとプールボリュームアドレスの関係を削除し、無効リスト８０２から対象領域を削除してフリーリスト８０３に再接続し、ローカル領域量テーブル８０４において対応する冗長コードタイプの実際使用量を削減する。【０２４２】
次に、冗長コードノードは、消去要求のあったデータタイプから生成された冗長コード、又は消去要求のあったデータタイプの冗長コードを全て探索し終えたか否か判定する（Ｓ２３１２）。ステップＳ２３１３で、判定の結果、全ての冗長コードを探索し終えていない場合、冗長コードノードは、ステップＳ２３０６〜Ｓ２３１１を再度実行する（Ｓ２３１２：Ｎ）。ステップ２３１３で、判定の結果、全ての冗長コードを探索し終えた場合（Ｓ２３１２：Ｙ）、冗長コードノードは、冗長コードの消去が完了したことを、容量削減処理の要求元である容量超過ノードに返却し、処理を終了する（Ｓ２３１３）。【０２４３】
以下、異常時の分散型ストレージシステムの動作について説明する。【０２４４】
図２３は、管理プログラム３０３及びストレージプログラム３０２における構成管理処理のフローチャートを示す。【０２４５】
本処理は、管理プログラム３０３とストレージプログラム３０２の２つのプログラムにより、実現される。本処理により、ノード障害、ノード減設、ノード増設等の、構成変更時の処理が実行される。【０２４６】
まず、ノード１０１のうち特定の状態管理ノードにおける管理プログラム３０３が実行する状態管理処理について説明する。状態管理ノードは、管理プログラム３０３が動作するノードであり、全てのノード１０１であってもよいし、予め設定された一部のノードであってもよい。【０２４７】
管理プログラム３０３は、ハイパーバイザ３０４、及び仮想マシン３０７からリソースの使用情報を取得する（Ｓ２４０１）。【０２４８】
次に、管理プログラム３０３は、取得したリソースの使用情報を、リソース監視情報１３０２に更新する（Ｓ２４０２）。ここで管理プログラム３０３は、各物理マシン、又は仮想マシンから取得したリソース使用情報を、取得元の物理マシン、又は仮想マシンに対応するリソース監視情報１３０２のエントリに反映する。その後、管理プログラム３０３は、反映されたエントリを参照し、リソースの使用状況が、ユーザ又はシステムにより、予め設定された閾値を超過している場合、システム構成情報１３０１の状態情報を警告状態に更新する。さらに、リソースの取得に要する通信時に、エラーが返却されたノード（物理マシン）、又は仮想マシン３０７は、システム構成情報１３０１の状態情報を障害状態に更新する。【０２４９】
次に、管理プログラム３０３は、システム構成情報１３０１を参照し、物理マシンと仮想マシンの状態を確認する（Ｓ２４０３）。【０２５０】
次に、管理プログラム３０３は、システム構成情報１３０１の状態情報を参照し、状態が障害状態のノード（物理マシン）が存在するか否か判定する（Ｓ２４０４）。ステップＳ２４０４で、判定の結果、障害状態のノード（物理マシン）が存在しない場合（Ｓ２４０４：Ｎ）、管理プログラム３０３は、次のステップＳ２４０５に移る。ステップＳ２４０４で、判定の結果、障害状態のノード（物理マシン）が存在する場合（Ｓ２４０４：Ｙ）、管理プログラム３０３は、障害状態のノード（物理マシン）で動作していた、ストレージプログラム３０２を別の正常に動作しているノード（物理マシン）上に再起動する。前述したように、各ノード１０１が、メモリ２０５内の制御情報を、別の再起動先ノード（物理マシン）のドライブ１０５内のバックアップ５１７にバックアップしておくことで、再起動先ノードは、制御情報を維持したまま、障害ノード上で動作していたストレージプログラムを再起動させる。なお、再起動先ノードは、再起動先ノードで動作している物理マシン上に、障害ノード上で動作していたストレージプログラム３０２を新規仮想マシンとして再起動してもよいし、既に動作しているストレージプログラムを動作させている仮想マシン上に、障害ノード上で動作していたストレージプログラムを別プロセスとして、再起動してもよい。【０２５１】
障害ノード上から再起動先ノードに再起動されたストレージプログラム３０２は、ホストに対して、仮想ボリュームを提供する。ただし、当該仮想ボリュームは、ドライブ１０５を持たないため、ホストから当該仮想ボリュームに対するアクセスは、後述するコレクションリード処理プログラム１６０６、及びコレクションライト処理プログラム１６０８を実施し、ホストへ結果を返却する。【０２５２】
次に、管理プログラム３０３は、障害ノードと保護レイヤに含まれる全てのノードとに対し、構成変更処理を要求する構成変更要求を発行する（Ｓ２４０８）。このとき、構成変更要求は、構成変更対象（増設対象や減設対象など）のノード番号を含む。ストレージプログラム３０２が実行する構成変更処理については、後述する。【０２５３】
次に、管理プログラム３０３は、障害ノード上で動作していたアプリケーションプログラムを動作させる仮想マシンの移動先のノードを選定する（Ｓ２４０９）。仮想マシン移動先選定処理では、各ノードのリソースの利用状態をチェックし、各ノードのリソース使用負荷が分散するように、障害ノード上の仮想マシンの復旧先である移動先ノードを選定する。移動先選定処理の詳細は、後述する。【０２５４】
次に、管理プログラム３０３は、障害ノード上で動作していたストレージプログラム３０２により提供されていた仮想ボリューム上のデータを、アプリケーションプログラムのための仮想マシンの移動先ノードの仮想ボリュームへ移動させることを要求するデータ移行要求を、移動先ノードのストレージプログラムへ発行する（Ｓ２４１０）。これにより、再起動先ノードは、障害ノード上のデータを復旧することと、そのデータを生存ノードへ移行することとを、同時に実現することができる。もし、スペアドノードを使用してスペア領域へデータを一時的に復旧した場合、障害ノードを別のノードにリプレースした後、一時的に復旧したデータを、スペアドノードからリプレースしたノードへ書き戻す必要があり、復旧に要する保守工数が増加する。本処理では、障害ノードの減設（つまり、保護レイヤからの障害ノードを除外する）処理と、データの復旧処理とを同時に実行することで、ノードのリプレースや一時データの書き戻しを必要としないため、復旧に要する保守工数を削減する効果がある。【０２５５】
次に、データの移行が終わると、管理プログラム３０３は、仮想マシンを移動先ノードに移動する（Ｓ２４１１）。【０２５６】
次に、管理プログラム３０３は、現在の処理は、障害復旧処理であるかどうかを判定し、障害復旧処理である場合（Ｓ２４１２：Ｙ）、再起動されたストレージプログラムを終了し、このフローを終了する（Ｓ２４１３）。例えば、管理プログラム３０３は、障害復旧の処理ルート（Ｓ２４０７）を実行することで、障害ノード上のストレージプログラム３０２を再起動先ノードに再起動したとき、再起動先ノードのストレージプログラムが動作する仮想マシンＩＤをメモリ上に記憶しておく。管理プログラム３０３は、Ｓ２４１３において、記憶された仮想マシンＩＤを参照して、障害ノードから再起動したストレージプログラムが存在すれば、当該ストレージプログラムが動作する仮想マシンを終了する。障害復旧処理でない場合（Ｓ２４１２：Ｎ）、状態管理処理を終了する。【０２５７】
また、状態管理処理では、障害復旧処理だけでなく、ノードの増減設処理、及び複数ノード（物理マシン）間のリソース使用負荷の分散（リバランス）処理を実行することができる。【０２５８】
ステップＳ２４０５では、管理プログラム３０３は、物理マシンの増減設要求があるか否か判定する。具体的には、管理プログラム３０３は、ノードの増減設要求を、ユーザ又はシステムから受け取ると、システム構成情報１３０１の物理マシン構成管理テーブル１３０３の状態情報の対応するエントリを、要求内容に応じて増設中又は減設中に更新しておき、この状態情報を参照し、増設要求又は減設要求があるか判定する。この際、管理プログラム３０３は、増設要求又は減設要求を受信した後、続けてストレージプログラムへ構成変更要求を発行し、仮想マシンのリバランスを実行してもよい。【０２５９】
ステップＳ２４０５で、判定の結果、増減設要求がある場合（Ｓ２４０５：Ｙ）、ステップＳ２４０８〜Ｓ２４１３を実行する。ステップＳ２４０５で、判定の結果、増減設要求がない場合（Ｓ２４０５：Ｎ）、ステップＳ２４０６を実行する。【０２６０】
ステップＳ２４０６では、管理プログラム３０３は、物理マシンのリソース利用状態に偏りがあり、リソース使用を分散させるため、仮想マシンを複数物理マシン間で、リバランスが必要か否かを判定する（Ｓ２４０６）。具体的には、管理プログラム３０３は、システム構成情報１３０１の状態情報を参照し、状態が警告状態であるかどうか判定する。状態情報が警告状態である場合、管理プログラム３０３は、リソースの使用状態が閾値を超えているため、仮想マシンのリバランスが必要であると判定する。【０２６１】
ステップＳ２４０６で、判定の結果、仮想マシンのリバランスが必要な場合（Ｓ２４０６：Ｙ）、管理プログラム３０３は、ステップＳ２４０９〜Ｓ２４１３を実行し、当該物理マシン又は仮想マシンに対して、仮想マシンのリバランス処理を実行する。ステップＳ２４０６で、判定の結果、仮想マシンのリバランスが不要な場合（Ｓ２４０６：Ｎ）、管理プログラムは、このフローを終了する。【０２６２】
次に、構成変更処理について説明する。【０２６３】
ストレージプログラム３０２は、構成変更要求を受信すると、要求された構成変更情報から増減設対象ノード番号を取得し（Ｓ２４１４）、増減設対象ノード番号に基づいて新しい静的マッピングテーブルを生成する（Ｓ２４１５）。【０２６４】
図１の例において、ノード＃０に障害が発生したとき、ストレージプログラム３０２は、構成変更前の静的マッピングテーブル５０６Ａから、ノード＃０のノードを減設し、構成変更後の新しい静的マッピングテーブル５０６Ｂを生成する。【０２６５】
静的マッピングテーブルの生成処理では、まず、構成変更前の静的マッピングテーブル５０６Ａから、一つのストライプタイプを選択する。【０２６６】
図１の例において、ストレージプログラム３０２は、ストライプタイプ番号３を選択している。次に、ストレージプログラム３０２は、選択したストライプタイプ番号３のストライプを、減設対象のノード＃０のストライプに割り当てられたストライプタイプ番号と交換する。具体的には、ストレージプログラム３０２は、ノード＃０のＤ０（ノード番号＝０、ストライプ位置番号＝０）のストライプタイプ番号０と、ノード＃３のＤ０（ノード番号＝３、ストライプ位置番号＝０）のストライプタイプ番号３とを交換し、ノード＃０のＤ１のストライプタイプ番号２と、ノード＃２のＤ１のストライプタイプ番号３とを交換し、ノード＃０のＰのストライプタイプ番号１と、ノード＃１のＰのストライプタイプ番号３とを交換する。以上のようにして、ストレージプログラム３０２は、構成変更後の新しい静的マッピングテーブル５０６Ｂを生成する。ノードを増設する場合、ストレージプログラム３０２は、減設処理と逆に、増設対象ノード上に、新規ストライプタイプ番号を定義し、当該ストライプタイプ番号を、同一ノード（同一列）に同一ストライプタイプが重複しないよう、各ノードのストライプタイプ番号と交換し、構成変更後の新しい静的マッピングテーブルを生成する。【０２６７】
次に、ストレージプログラム３０２は、構成変更後の静的マッピングテーブルに基づき、後述する冗長化先変更処理を実行する（Ｓ２４１６）。冗長化先変更処理は、各ノードに格納しているライトデータに対し、新たな静的マッピングテーブルに基づき、冗長化先（冗長コード格納先、例えば、冗長コードノード）を決定し、新しく冗長コードを再生成する。その後、古い静的マッピングテーブルに基づき生成した冗長コードは、不要となるため、削除する。これにより、ライトデータを移動させずに、保護レイヤ情報を更新できるため、アプリケーションプログラムとアプリケーションプログラムがアクセスするデータの同ノードへの配置を維持することができる。【０２６８】
次に、冗長化先変更処理が完了すると、ストレージプログラム３０２は、不要となった構成変更前の静的マッピングテーブルを破棄し、要求元へ応答し、このフローを終了する（Ｓ２４１７）。具体的には、ストレージプログラム３０２は、メモリ２０５上及びドライブ１０５上のバックアップ５１７から、不要な静的マッピングテーブル５０５〜５０７を消去する。【０２６９】
次に、データ移行処理について説明する。【０２７０】
前述のように、ステップＳ２４１０において、管理プログラム３０３は、移行元の仮想ボリュームと移行先の仮想ボリュームを指定するデータ移行処理の要求を、移動先ノードのストレージプログラム３０２へ発行する。【０２７１】
データ移行要求を受信した移動先ノードのストレージプログラム３０２は、まず、移行先の仮想ボリューム（移行先ボリューム）を自ノード上に作成する（Ｓ２４１８）。具体的には、ストレージプログラム３０２は、仮想ボリューム管理テーブル５１１を参照し、空きエントリを探す。ストレージプログラム３０２は、空きエントリが見つかったら、当該エントリを新規仮想ボリュームとして、仮想ボリューム管理テーブル５１１に、仮想ボリュームのサイズ、保護レイヤ毎の同期／非同期保護設定、及びオーナノード番号を登録する。【０２７２】
次に、移動先ノードのストレージプログラム３０２は、移行元のストレージプログラム３０２、例えば再起動先ノードにより再起動されたストレージプログラム３０２により提供される仮想ボリューム（移行元ボリューム）を、ストレージ外部接続機能により、自ノードのストレージプログラム３０２に接続する（Ｓ２４１９）。【０２７３】
次に、移動先ノードのストレージプログラム３０２は、外部接続された仮想ボリュームから、新規に作成した自ノードの仮想ボリュームへデータコピー処理を実行する（Ｓ２４２０）。データコピー処理の詳細については、後述する。【０２７４】
次に、データコピー処理が完了すると、移動先ノードのストレージプログラム３０２は、ホストへのストレージＩ／Ｏのメインパスを、移行先ボリュームに切り替え、このフローを終了する（Ｓ２４２１）。これにより、ホストは、以降、移行先ボリュームへアクセスするようになる。【０２７５】
以上の構成管理処理によれば、分散型ストレージシステムは、正常なノードの数の変化に応じて、ユーザデータと冗長コードの配置を変更することで、冗長度を維持することができる。ノードの障害時や減設時、分散型ストレージシステムは、減設対象のノードを含まない組み合わせで、冗長コードを再生成することで、各ノード上のデータの冗長度を回復することができる。また、ノードの増設時、分散型ストレージシステムは、既存のノードと増設対象のノードを含む組み合わせで、冗長コードを再生成することで、各ノード上のデータの冗長度を維持することができる。【０２７６】
図２４は、ストレージプログラム３０２が実行するデータコピー処理のフローチャートを示す。【０２７７】
データコピー処理は、指定された移行元ボリューム内のデータを、指定された移行先ボリュームにコピーする。データコピー処理を実行するストレージプログラム３０２は、移行元ボリュームを提供するストレージプログラム３０２が実行してもよいし、移行先ボリュームを提供するストレージプログラム３０２が実行してもよいし、移行元と移行先に無関係なストレージプログラム３０２が実行してもよい。ストレージプログラム３０２は、データコピー処理において、アドレス解決処理を実行することにより、移行元と移行先のストレージプログラムの間のネットワークＩ／Ｏ通信量を削減する。【０２７８】
まず、ストレージプログラム３０２は、移行元ボリューム内のコピー元データのアドレスであるコピー元アドレスを指定し、コピー元アドレスに自ノードのプールボリューム内の論理ページが割り当てられているか否かを、ページマッピングテーブル５１０及び外部接続管理情報を参照して判定する（Ｓ２５０１）。コピー元アドレスは、例えば、仮想ボリューム番号と論理アドレスで指定される。【０２７９】
ステップＳ２５０１で、判定の結果、ストレージプログラム３０２は、コピー元アドレスに自ノードの論理ページが割り当てられている場合（Ｓ２５０１：Ｙ）、ストレージプログラム３０２は、リード処理を実行し、コピー元アドレスのデータを読み出す。リード処理の詳細については、前述のとおりである。ステップＳ２５０１で、判定の結果、コピー元アドレスに自ノードの論理ページが割り当てられていない場合（Ｓ２５０１：Ｎ）、ストレージプログラム３０２は、コピー元データを格納する他ノードのストレージプログラム３０２に対して、アドレス解決処理を要求するアドレス解決要求を発行する（Ｓ２５０６）。このとき、ストレージプログラム３０２は、アドレス解決要求に、例えば、仮想ボリューム番号、論理アドレス、リード属性を指定する。アドレス解決処理の詳細については、後述する。【０２８０】
次に、ストレージプログラム３０２は、アドレス解決処理完了の応答を受けると、返却された情報を元に、コピー元データを格納する他ノードに対して、解決されたコピー元アドレスからコピー元データを読み出すことを要求するリード要求を発行する（Ｓ２５０２）。リード処理の詳細については、前述の通りである。【０２８１】
次に、ストレージプログラム３０２は、移行先ボリューム内のコピー先アドレスに、自ノードのプールボリューム内の論理ページが割り当てられているか否かを判定する（Ｓ２５０３）。コピー先アドレスに、自ノードの論理ページが割り当てられているか否かの判定方法は、Ｓ２５０１と同様である。ステップＳ２５０３で、判定の結果、コピー先アドレスに自ノードの論理ページが割り当てられている場合（Ｓ２５０３：Ｙ）、ストレージプログラム３０２は、リードされたコピー元データをライトデータとして指定し、コピー先アドレスをライト先アドレスに指定して、ライト処理を実行する（Ｓ２５０４）。【０２８２】
ステップＳ２５０３で、判定の結果、コピー先アドレスに自ノードの論理ページが割り当てられていない場合（Ｓ２５０３：Ｎ）、コピー先アドレスに割り当てられている他ノードに対して、アドレス解決要求を発行する（Ｓ２５０７）。このとき、ストレージプログラム３０２は、アドレス解決要求に、例えば、仮想ボリューム番号、論理アドレス、ライト属性を指定する。アドレス解決処理の詳細については、後述する。【０２８３】
次に、コピー先アドレスが解決されると、ストレージプログラム３０２は、リードされたコピー元データをライトデータ、解決されたコピー先アドレスをライト先アドレスに指定し、ライト処理を実行する（Ｓ２５０４）。ライト処理の詳細については、前述のとおりである。【０２８４】
次に、ストレージプログラム３０２は、移行元ボリューム上のデータを全てコピーしたかどうか、判定する（Ｓ２５０５）。ステップＳ２５０５で、判定の結果、コピー対象データが、まだ存在する場合（Ｓ２５０５：Ｙ）、ステップＳ２５０１〜Ｓ２５０４を再度実行する。ステップＳ２５０５で、判定の結果、コピー対象データが、まだ存在する場合（Ｓ２５０５：Ｎ）、ストレージプログラム３０２は、データコピー処理を終了する。【０２８５】
次に、アドレス解決処理について説明する。【０２８６】
ストレージプログラム３０２は、アドレス解決要求を受信すると、アドレス解決要求に基づいて、アドレス解決の属性がリード属性かライト属性かを判定する。【０２８７】
アドレス解決要求が、リード属性である場合、アドレス解決要求により指定された領域に自ノードの論理ページが割り当てられているか否かを判定する（Ｓ２５０８）。判定方法は、ステップＳ２５０１で述べた方法と同様である。ステップＳ２５０８で、判定の結果、指定された領域に自ノードの論理ページが割り当てられている場合（Ｓ２５０８：Ｙ）、アドレス解決要求により指定された領域に割り当てられたアドレスである解決アドレスを、ページマッピングテーブル５１０により解決する（Ｓ２５０９）。次に、ストレージプログラム３０２は、得られた解決アドレスを、アドレス解決要求の発行元ノード上のストレージプログラム３０２に返却する（Ｓ２５１０）。解決アドレスは、例えば、プールボリューム番号とプールボリュームアドレスとにより表される。【０２８８】
ステップＳ２５０８で、判定の結果、指定された領域に自ノードの論理ページが割り当てられていない場合（Ｓ２５０８：Ｎ）、ストレージプログラム３０２は、当該データを格納する他ノードのストレージプログラム３０２に対して、アドレス解決要求を発行し（Ｓ２５１１）、完了応答を待機する（Ｓ２５１２）。その後、ストレージプログラム３０２は、他ノードのストレージプログラム３０２から、アドレス解決完了の応答を受信したら、返却された情報を、アドレス解決要求の発行元に返却する（Ｓ２５１０）。【０２８９】
アドレス解決要求がライト属性である場合、ストレージプログラム３０２は、ステップＳ２５０８において、アドレス解決要求により指定された仮想ボリュームに対して、仮想ページの新規割り当て処理を実行する。仮想ページに自ノードのプールボリューム内の論理ページを割り当てる場合（Ｓ２５０８：Ｙ）、自ノードのプールボリューム内の論理ページを仮想ページに割り当て、割り当てた当該プールボリューム番号とプールボリュームアドレスで表される解決アドレスを、アドレス解決処理の発行元に返却する（Ｓ２５０９、Ｓ２５１０）。仮想ページに他ノードのプールボリューム内の論理ページを割り当てる場合（Ｓ２５０８：Ｎ）、その他ノードに対して、ライト属性を指定したアドレス解決要求を発行し（Ｓ２５１１）、完了の応答を待機する（Ｓ２５１２）。その後、応答が返却されると、ストレージプログラム３０２は、結果をアドレス解決要求の発行元に返却する（Ｓ２５１０）。仮想ページの割り当てについては、前述の同期ライト処理で述べたとおりである。【０２９０】
もし、仮想ページの割り当てが、複数のノード上のストレージプログラムにネストして、割り当てられているとき、リード要求を順番に転送すると、結果返却の際、読み出したデータをネストした全てのストレージプログラムを介して、返却するため、ネットワーク通信量が増加する。本実施例のアドレス解決処理は、データの読み出し元のノードで、データの読み出し先のノードと、論理ドライブ、及び論理アドレスを先に解決することで、リード要求の発行に伴う読み出しデータのネットワーク転送を１回に抑えることができ、ネットワーク通信量を削減する効果がある。【０２９１】
次に、ストレージプログラム３０２が実行するコレクションリード処理について説明する。【０２９２】
ノードＡは、障害ノードであり、データＸを格納している。ノードＢは、障害ノード上のデータＸの冗長コードＸｘｏｒＹｘｏｒＺを格納している。ノードＣは、当該冗長コードの基になるデータＹを格納しており、ノードＣ上のホストが、障害ノード上のデータＸをリードしている。ノードＤは、当該冗長コードの基になるデータＺを格納している。【０２９３】
ノードＣ上のホストが、障害ノード上のデータＸに対してリード処理を発行したとき、ノードＣは、ノードＡは障害ノードであるため、リード対象データＸの冗長コードを格納するノードＢに対し、コレクションリード処理の要求を発行する。データの復旧に必要な冗長コードマッピングテーブルや逆マッピングテーブルは、冗長コードノードのローカルのドライブ１０５に格納しているため、ノードＣがコレクションリード処理を冗長コードノードに要求することで、これらの制御情報をノード間で通信する必要がなくなり、オーバヘッドを削減する効果がある。コレクションリード処理の要求を受信したノードＢは、データの復旧に必要なライトデータＹ、Ｘ、及び冗長コードＸ＊Ｙ＊Ｚを、自ノード及び他ノードのドライブ１０５から読み出し、データＸを復旧する。その後、ノードＢは、復旧したデータを、コレクションリード処理要求の発行元に返却する。【０２９４】
図２５は、ストレージプログラム３０２が実行するコレクションリード処理のフローチャートを示す。【０２９５】
コレクションリード処理は、ホストからリード要求を受信したノードであるリード要求受信ノードの処理（ステップＳ２６０９〜Ｓ２６１２）と、冗長コードノードの処理（ステップＳ２６０１〜Ｓ２６０８）とを含む。【０２９６】
まず、リード要求受信ノードの処理（ステップＳ２６０９〜Ｓ２６１２）について説明する。【０２９７】
リード要求受信ノードのストレージプログラム３０２は、リード対象ユーザデータが、障害ノード上に存在すると判定した場合、冗長コードノード上のストレージプログラム３０２に、コレクションリード要求を発行する（Ｓ２６０９）。このとき、コレクションリード要求は、例えば、リード対象ユーザデータのサイト番号、ノード番号、プールボリューム（論理ドライブ）番号、プールボリュームアドレスを指定する。また、冗長コードノードは、前述の静的マッピングテーブルの説明で示した方法を用いて、静的マッピングテーブルより、リード対象ユーザデータのノード番号とプールボリュームアドレスから、特定する。【０２９８】
次に、リード要求受信ノードのストレージプログラム３０２は、コレクションリード要求に対する応答を受信するまで、待機する（Ｓ２６１０）。ストレージプログラム３０２は、コレクションリード要求に対する応答を受信すると（Ｓ２６１１）、返却されたリード対象ユーザデータをホストへ返却し、処理を終了する（Ｓ２６１２）。【０２９９】
次に、冗長コードノードの処理（ステップＳ２６０１〜Ｓ２６０８）について説明する。冗長コードノードのストレージプログラム３０２は、コレクションリード要求を受信すると、当該プログラムを実行する。ストレージプログラム３０２は、キャッシュ上に、コレクションリード要求の要求ユーザデータが存在するか否か判定する（Ｓ２６０１）。具体的には、ストレージプログラム３０２は、キャッシュ情報５０３のコードダーティキュー１２０２から、要求ユーザデータのノード番号、論理ドライブ、論理アドレスと一致するエントリのデータが存在するか否かを確認する。ステップＳ２６０１で、判定の結果、キャッシュ上に要求ユーザデータが存在する場合（Ｓ２６０１：Ｙ）、ストレージプログラム３０２は、当該ユーザデータを、要求元のリード要求受信ノードに返却し、処理を終了する（Ｓ２６０８）。本処理ルートは、当該ユーザデータは、まだデステージ処理が実行されておらず、該ユーザデータの冗長コードが生成されていない状態にあることを意味する。したがって、このような状態にあるユーザデータは、要求ユーザデータを冗長コードから計算しなおす必要がないため、高速にユーザデータを返却することができる。【０３００】
ステップＳ２６０１で、判定の結果、キャッシュ上に要求ユーザデータが存在する場合（Ｓ２６０１：Ｎ）、ストレージプログラム３０２は、冗長コードから、要求ユーザデータを復旧する処理に移行する。まず、ストレージプログラム３０２は、ログ構造化マッピングテーブル５０８の冗長コードマッピングテーブル７０２を参照し、指定されたノード番号、論理ドライブ、及び論理アドレスから、要求ユーザデータの冗長コードの格納位置を特定する。次に、逆マッピングテーブル７０３を参照し、特定した格納位置から、当該冗長コードの生成に用いられた他ノードのユーザデータを特定する（Ｓ２６０２）。【０３０１】
次に、ストレージプログラム３０２は、ステップＳ２６０２で特定した、他ノードのユーザデータに対して、リード要求を発行する（Ｓ２６０３）。リード要求を発行後、ストレージプログラム３０２は、自ノードに格納している冗長コードをリードし（Ｓ２６０４）、その後、他ノードからリード処理の完了応答を待機する（Ｓ２６０５）。その後、ストレージプログラム３０２は、他ノードからのリード処理の完了応答を受信すると、他ノードからリードしたユーザデータと、自ノードからリードした冗長コードとから、リード要求ユーザデータを復旧する（Ｓ２６０６、Ｓ２６０７）。その後、ストレージプログラム３０２は、復旧したユーザデータを、要求元であるリード要求受信ノードに返却し、処理を終了する（Ｓ２６０８）。【０３０２】
以上のコレクションリード処理によれば、ノードの障害時、一時的なストレージプログラムが、コレクションリード要求を冗長コードノードへ発行し、冗長コードノードがデータを復旧することができる。これにより、一時的なストレージプログラムは、障害ノードのデータを移動先ノードへコピーすることができる。【０３０３】
次に、ストレージプログラム３０２が実行するコレクションライト処理について説明する。【０３０４】
ノードＡは、障害ノードであり、データＸを格納している。ノードＢは、障害ノード上のデータＸの冗長コードＸｘｏｒＹｘｏｒＺを格納している。ノードＣは、当該冗長コードの基になるデータＹを格納しており、ノードＣ上のホストが、障害ノード上のデータＸをリードしている。ノードＤは、当該冗長コードの基になるデータＺを格納している。【０３０５】
ノードＣ上のホストが、障害ノード上のデータＸに対してライト処理を発行したとき、ノードＣは、ノードＡは障害ノードであるため、コレクションライト処理を実行し、ライト対象データＸの冗長コードを格納する冗長コードノードＢに対し、冗長コード転送のためのデータ転送処理を実行する。ノードＣは、冗長コードノードＢに、中間コードを転送する必要がある場合、コレクションリード処理により、ライト対象ユーザデータを復旧してから、当該復旧したライト対象ユーザデータと新規ライトユーザデータで、中間コードを生成し、生成した中間コードを冗長コードノードに転送する。【０３０６】
図２６は、ストレージプログラム３０２が実行するコレクションライト処理のフローチャートを示す。【０３０７】
ここでは、同期ライト処理について、記載しているが、非同期ライト処理についても、同様にして、コレクションライト処理を実施する。【０３０８】
まず、ホストからライト要求を受信したライト要求受信ノードのストレージプログラム３０２は、ライト対象ユーザデータが同期ライト対象か否か判定する（Ｓ２７０１）。判定方法は、前述の同期ライト処理のとおりである。ステップＳ２７０１で、判定の結果、同期ライト対象である場合（Ｓ２７０１：Ｙ）、ストレージプログラム３０２は、静的マッピングテーブルの説明で示した方法で、ライト対象データのストライプタイプを特定し、特定したストライプタイプと静的マッピングテーブルから、冗長コードノードを決定する（Ｓ２７０２）。次に、ストレージプログラム３０２は、中間コードの転送が必要か否か判定する（Ｓ２７０３）。【０３０９】
ステップＳ２７０３で、判定の結果、中間コードの転送が必要であると判定された場合（Ｓ２７０３：Ｙ）、ストレージプログラム３０２は、中間コードを生成するために、コレクションリード処理を実行し、ライト対象ユーザデータの復旧処理を行う（Ｓ２７０６）。次に、ストレージプログラム３０２は、復旧したライト対象データと、新規ライトデータから、中間コードを生成し、生成した中間コードを冗長コードノードに転送する（Ｓ２７０７、Ｓ２７０８）。ステップＳ２７０３で、判定の結果、中間コードの転送が必要でないと判定された場合（Ｓ２７０３：Ｎ）、ストレージプログラム３０２は、ライトデータを冗長コードノードに転送する（Ｓ２７０４）。次に、ストレージプログラム３０２は、全保護レイヤで、処理を完了したか否かを判定する（Ｓ２７０５）。ステップＳ２７０５で、判定の結果、全保護レイヤで、処理を完了していない場合（Ｓ２７０５：Ｎ）、ストレージプログラム３０２は、処理を完了していない保護レイヤに対し、ステップＳ２７０１から処理を再実行する。ステップＳ２７０５で、判定の結果、全保護レイヤで、処理を完了している場合（Ｓ２７０５：Ｙ）、ストレージプログラム３０２は、処理を終了する。【０３１０】
図２７は、ストレージプログラム３０２が実行する冗長化先変更処理の概念を示す。【０３１１】
この図は、分散型ストレージシステムが、静的マッピングテーブル（構成変更前）１１０Ａから静的マッピングテーブル（構成変更後）１１０Ｂに、保護レイヤにおける格納位置を変更することを示している。具体的には、ノード＃０〜＃３が、２Ｄ１Ｐでノード間のデータ保護を行っていた分散型ストレージシステムに対し、ノード＃３を当該保護レイヤから除外する。さらに、この図は、静的マッピングテーブル５０６Ａにおいて、ノード＃１のＤ０（ノード番号＝１、ストライプ位置番号＝０）のストライプに該当するユーザデータに対し、冗長コードの格納位置をノード＃２からノード＃０に変更する処理を示している。【０３１２】
冗長コードの格納位置の変更は、以下のようにして行う。まず、ノード＃１は、冗長化先変更メイン処理１６１６Ａを実行し、Ｄ０のストライプに該当するユーザデータＸを読み出し、構成変更後の静的マッピングテーブル５０６Ｂを参照する。その後、冗長コードノード＃０に、当該ユーザデータを転送する。構成変更後の冗長コードノード＃０は、転送されたユーザデータから新しい冗長コードＸｘｏｒＺを生成し、ドライブへ格納する。このとき、冗長コードを生成するデータの組み合わせ（ストライプタイプ）は、構成変更後の静的マッピングテーブル５０６Ｂに基づき決定する。具体的には、ノード＃０は、ノード＃１のＤ０のストライプに該当するユーザデータＸとノード＃２のＤ１のストライプに該当するユーザデータＺとで、冗長コードを生成する。【０３１３】
また、冗長コードの格納位置を変更したユーザデータＸの構成変更前の古い冗長コードは、もはや不要であるため、ノード＃１は、古い冗長コードの消去要求をノード＃２に発行する。ノード＃２は、古い冗長コードの消去要求を受信すると、冗長化先変更サブ処理１６１６Ｂを実行し、要求のあったユーザデータに対応する冗長コードを、ログ構造化マッピングテーブルを参照し、探索し、当該冗長コードの消去を試みる。以上のようにして、分散型ストレージシステムは、冗長化先変更処理として、ユーザデータの冗長コードノードを変更し、保護レイヤの構成変更を行う。【０３１４】
図２８は、ストレージプログラム３０２が実行する冗長化先変更処理のフローチャートを示す。【０３１５】
冗長化先変更処理は、後述する構成変更処理から実行される処理であり、各ノード１０１のドライブ１０５に格納しているユーザデータに対する旧冗長コードノードを、構成変更後の新しい静的マッピングテーブルに基づいて新冗長コードノードを変更し、冗長コードを再生成する。冗長化先変更処理は、格納位置が変更される冗長コードの生成に用いられたユーザデータを格納するデータノードにより実行される冗長化先変更メイン処理と、構成変更前の旧冗長コードノードにより実行される冗長化先変更処理サブ処理とを含む。【０３１６】
まず、冗長化先変更メイン処理について説明する。【０３１７】
冗長化先変更メイン処理では、ストレージプログラム３０２は、各ドライブ１０５内のユーザデータに対して、論理アドレス順に、ユーザデータの冗長コードノードを変更していく。まず、ストレージプログラム３０２は、対象ユーザデータのストライプタイプを対象ストライプタイプとして特定し、対象ストライプタイプの構成変更処理が必要か否か判定する（Ｓ２９０１）。ここで、対象ストライプタイプの構成変更処理が必要であるとは、例えば、構成変更前後の静的マッピングテーブルにおいて、対象ストライプタイプの冗長コードを格納するノード番号が変更されていること、又は対象ストライプタイプのユーザデータの組み合わせが変更されていることである。【０３１８】
ステップＳ２９０１で、判定の結果、対象ストライプタイプの構成変更処理が必要である場合（Ｓ２９０１：Ｙ）、ストレージプログラム３０２は、対象ユーザデータをドライブ１０５からリードする（Ｓ２９０２）。次に、ストレージプログラム３０２は、対象ストライプタイプと構成変更後の静的マッピングテーブルから、対象ストライプタイプの構成変更後の新冗長コードノードを決定する（Ｓ２９０３）。次に、ストレージプログラム３０２は、ステップＳ２９０３で決定した新冗長コードノードに、対象ユーザデータを転送する（Ｓ２９０４）。ライトデータを受信した新冗長コードノードのストレージプログラム３０２は、キャッシュ情報５０３のコードダーティキュー１２０２に、受信したライトデータをキューイングし、デステージ処理で、冗長コードを生成し、ドライブ１０５に格納する。【０３１９】
次に、ストレージプログラム３０２は、対象ストライプタイプと構成変更前の静的マッピングテーブルから、対象ストライプタイプの構成変更前の旧冗長コードノードを特定する（Ｓ２９０５）。次に、ストレージプログラム３０２は、ステップＳ２９０６で特定した旧冗長コードノードに対し、構成変更前の冗長コードを消去することを要求する冗長コード消去要求を発行する（Ｓ２９０６）。冗長コード消去要求は、例えば、対象ユーザデータのサイト番号、ノード番号、論理ドライブ番号、及び論理アドレスを含む。構成変更前の旧冗長コードノードにより実行される冗長化先変更サブ処理の詳細は、後述する。【０３２０】
次に、ストレージプログラム３０２は、対象ストライプタイプ内の全ユーザデータに対して、処理を完了したか否かを判定する（Ｓ２９０７）。例えば、ストレージプログラム３０２は、ドライブ状態管理テーブル５１４に、冗長コード変更ポインタを保持し、当該ポインタにより、当該ユーザデータに対する処理が完了しているか否かを判定する。具体的には、ストレージプログラム３０２は、論理アドレスに対し、若い論理アドレスから、一定のデータサイズで、順に冗長化先変更処理を実行し、１つのデータに対し、処理が完了すると、冗長コード変更ポインタを更新する。このとき、ストレージプログラム３０２は、冗長コード変更ポインタが指す論理アドレスよりも小さい値の論理アドレスに対する冗長化先変更処理が完了済みであると判定でき、冗長コード変更ポインタが指す論理アドレスよりも大きい値の論理アドレスに対する冗長化先変更処理が未完了であると判定できる。【０３２１】
ステップＳ２９０７で、判定の結果、処理が未完了のユーザデータが存在する場合（Ｓ２９０７：Ｎ）、ストレージプログラム３０２は、当該ユーザデータに対して、Ｓ２９０２から処理を実行する。【０３２２】
ステップＳ２９０７で、判定の結果、対象ストライプタイプ内の全ユーザデータに対する処理が完了した（処理が未完了のユーザデータが存在しない）場合（Ｓ２９０７：Ｙ）、ストレージプログラム３０２は、ドライブ１０５内の全ストライプタイプに対して処理を完了したか否かを判定する（Ｓ２９０８）。ステップＳ２９０８で、判定の結果、全ストライプタイプに対して処理を完了している場合（Ｓ２９０８：Ｙ）、ストレージプログラム３０２は、処理を終了する。ステップＳ２９０８で、判定の結果、全ストライプタイプに対して処理を完了していない場合（Ｓ２９０８：Ｎ）、ストレージプログラム３０２は、処理が未完了のストライプタイプに対して、ステップＳ２９０１から処理を再実行する。【０３２３】
ステップＳ２９０１で、判定の結果、当該ストライプタイプの構成変更処理が必要でない場合（Ｓ２９０１：Ｎ）、ストレージプログラム３０２は、ドライブ１０５内の全ストライプタイプに対して処理を完了したか否かを判定する（Ｓ２９０８）。【０３２４】
次に、冗長化先変更サブ処理について説明する。【０３２５】
冗長コード消去要求を受信したストレージプログラム３０２は、冗長コード消去要求により指定された対象ユーザデータがキャッシュ上に存在するか否か判定する（Ｓ２９０９）。具体的には、ストレージプログラム３０２は、キャッシュ情報５０３のコードダーティキュー１２０２から、指定されたノード番号、論理ドライブ番号、及び論理アドレスと一致するユーザデータが存在するかどうか、確認する。【０３２６】
ステップＳ２９０９で、判定の結果、対象ユーザデータがキャッシュ上に存在する場合（Ｓ２９０９：Ｙ）、ストレージプログラム３０２は、当該ユーザデータをキャッシュ上から消去する。具体的には、ストレージプログラム３０２は、コードダーティキュー１２０２から当該ユーザデータのエントリを除外し、そのエントリをフリーキュー１２０５に繋ぎなおす。【０３２７】
ステップＳ２９０９で、判定の結果、対象ユーザデータがキャッシュ上に存在しない場合（Ｓ２９０９：Ｎ）、ストレージプログラム３０２は、対象ユーザデータが、構成変更後の新しい静的マッピングテーブルによって冗長化済みであることを示すフラグを設定する（Ｓ２９１０）。例えば、ストレージプログラム３０２は、ログ構造化マッピングテーブル５０８の逆マッピングテーブル７０３における、対象ユーザデータのエントリに、当該フラグを設定する。次に、ストレージプログラム３０２は、対象ユーザデータに対応する対象冗長コードが消去可能であるか否かを判定する（Ｓ２９１１）。具体的には、ストレージプログラム３０２は、ステップＳ２９１０で設定したフラグを確認し、対象冗長コードの逆マッピングテーブル７０３における、ユーザデータ毎のエントリのフラグを確認し、対象冗長コードの生成に用いられた全てのユーザデータが新しい静的マッピングテーブルによって冗長化済みである場合に、対象冗長コードが消去可能であると判定する。【０３２８】
ステップＳ２９１１で、判定の結果、対象冗長コードが消去可能である場合（Ｓ２９１１：Ｙ）、ストレージプログラム３０２は、対象冗長コードを消去する（Ｓ２９１２）。具体的には、ストレージプログラム３０２は、冗長コードマッピングテーブル７０２と逆マッピングテーブル７０３から対象冗長コードのエントリを削除し、ローカル領域管理テーブルの対象冗長コードのエントリを有効リスト８０１からフリーリスト８０３に繋ぎ直す。ステップＳ２９１１で、判定の結果、対象冗長コードが消去可能でない場合（Ｓ２９１１：Ｎ）、処理を終了する。【０３２９】
以上の冗長化先変更処理によれば、分散型ストレージシステムは、構成変更後の冗長コードを生成すると共に、構成変更前の冗長コードを消去することができる。これにより、分散型ストレージシステムは、構成変更前の冗長コードの記憶領域を、その後の冗長コードの記憶領域として利用することができる。【０３３０】
分散型ストレージシステムは、保護レイヤ＃３においても保護レイヤ＃２と同様の処理を行うことができる。ノードは、ライト要求を受けた場合、ライト要求と非同期で、サイトグループ情報（例えば、静的マッピングテーブル５０７）に基づいて他のサイトから転送先サイトを選択し、ライトデータに基づくサイト転送データ（例えば、ライトデータ）を転送先サイトへ送信する。また、ノードは、複数の他のサイトから複数のサイト転送データを夫々受信した場合、サイトグループ情報に基づいて複数のサイト転送データからサイト冗長コードを生成し、ローカルの記憶デバイス（例えば、ドライブ１０５）へサイト冗長コードを書き込む。複数のサイトの構成が変更される場合、ノードは、変更された複数のサイトの構成に基づいてサイトグループ情報を変更し、ローカルの記憶デバイスからデータを読み出し、変更後のサイトグループ情報に基づいて、読み出されたデータに対応する変更後のサイト冗長コードを格納するサイトである新冗長コードサイトを選択し、読み出されたデータに基づく再転送データを新冗長コードサイトへ送信し、変更前のサイトグループ情報に基づいて、読み出されたデータに基づくデータに対応する変更前のサイト冗長コードを格納するサイトである旧冗長コードサイトを選択し、変更前のサイト冗長コードを消去することを要求する消去要求を、旧冗長コードサイトへ送信する。これにより、複数のサイトの構成を変更する場合でも、冗長度を維持することができる。また、他の保護レイヤと併用することにより、信頼性を高めることができる。サイトグループは、保護レイヤ＃３のストライプタイプ等に対応する。サイト転送データは、ライトデータ、ライトデータの一部、中間コード、Ｃｌａｓｓ１  Ｃｏｄｅ等に対応する。【０３３１】
分散型ストレージシステムは、保護レイヤ＃１においても保護レイヤ＃２と同様の処理を行うことができる。保護レイヤ＃１において、ノードは、ライト要求を受けた場合、ローカルの複数の記憶デバイス（例えば、ドライブ１０５）の中の第一記憶デバイスへライトデータを書き込み、記憶デバイスグループ情報（例えば、静的マッピングテーブル５０５）に基づいて、ライトデータから記憶デバイス冗長コードを生成し、記憶デバイスグループ情報に基づいて、複数の記憶デバイスの中の第二記憶デバイスへ記憶デバイス冗長コードを書き込む。複数の記憶デバイスの構成が変更される場合、変更された複数の記憶デバイスに対応するノードは、変更された複数の記憶デバイスの構成に基づいて記憶デバイスグループ情報を変更し、記憶デバイスからデータを読み出し、変更後の記憶デバイスグループ情報に基づいて、読み出されたデータに対応する変更後の記憶デバイス冗長コードを格納する記憶デバイスである新冗長コード記憶デバイスを選択し、読み出されたデータに基づく記憶デバイス再転送データを新冗長コード記憶デバイスへ書き込み、変更前の記憶デバイスグループ情報に基づいて、読み出されたデータに対応する変更前の記憶デバイス冗長コードを格納する記憶デバイスである旧冗長コード記憶デバイスを選択し、変更前の記憶デバイス冗長コードを消去することを要求する消去要求を、旧冗長コード記憶デバイスへ発行する。これにより、複数のドライブの構成を変更する場合でも、冗長度を維持することができる。また、他の保護レイヤと併用することにより、信頼性を高めることができる。記憶デバイスグループは、保護レイヤ＃１のストライプタイプ等に対応する。記憶デバイス転送データは、ライトデータ、ライトデータの一部、中間コード、Ｃｌａｓｓ１  Ｃｏｄｅ等に対応する。【０３３２】
図２９は、管理プログラム３０３が実行する仮想マシン移動先選定処理のフローチャートを示す。【０３３３】
管理プログラム３０３は、仮想マシンの配置パタンを一時的に格納する一時配置パタンテーブル３０００を初期化する（Ｓ３００１）。具体的には、一時配置パタンテーブル３０００における配置パタンとネットワーク通信コストへ無効値を設定する。【０３３４】
次に、管理プログラム３０３は、仮想マシンの物理マシンへの配置パタンを生成する（Ｓ３００２）。配置パタンの生成方法は、例えば、一般的に知られている組み合わせ列挙のアルゴリズムにより、物理マシンと仮想マシンの配置の組み合わせを網羅的に列挙する。ただし、ストレージプログラム３０２が動作する仮想マシンは、ローカルのドライブ１０５を操作するため、移動対象仮想マシンとされない。又は、ストレージプログラム３０２が動作する仮想マシンが移動対象として選定された場合、当該配置パタンは、破棄される。【０３３５】
次に、管理プログラム３０３は、生成した配置パタンが、配置ポリシに適合するか否か判定する（Ｓ３００９）。具体的には、管理プログラム３０３は、後述する配置ポリシを示す配置ポリシ管理テーブルを参照し、例えば、配置ポリシにより異なる物理マシンに配置されるように設定されている複数の仮想マシンを、同じ物理マシンに配置するような配置パタンが生成された場合、当該配置パタンは配置ポリシに適合しないため、当該配置パタンを破棄する。これにより、管理プログラム３０３は、クラスタ構成をとるアプリケーションプログラム３０１を動作させている仮想マシンを物理的に別のノード１０１で動作させることができるため、ノード障害時のアプリケーションプログラム３０１への影響範囲を小さくすることができる。【０３３６】
さらに、例えば、配置ポリシにより同一物理マシンに配置するように設定されている複数の仮想マシンを、異なる物理マシンに配置するような配置パタンが生成された場合、当該配置パタンは配置ポリシに適合しないため、管理プログラム３０３は、当該配置パタンを破棄する。これにより、管理プログラム３０３は、多量にネットワーク通信を行う仮想マシン同士を、同一物理マシンに配置することで、これら仮想マシンのネットワーク通信を、ハイパーバイザ３０４により提供される仮想ネットワークを介した通信で実現することができるため、物理マシン間でのネットワーク通信量を削減することができる。【０３３７】
ステップＳ３００９で、判定の結果、生成した配置パタンが配置ポリシに適合しない場合（Ｓ３００９：Ｎ）、管理プログラム３０３は、ステップＳ３００７に移行する。【０３３８】
ステップＳ３００９で、判定の結果、生成した配置パタンが配置ポリシに適合する場合（Ｓ３００９：Ｙ）、管理プログラム３０３は、生成した配置パタンにおけるネットワーク通信コストを計算する。【０３３９】
具体的には、管理プログラム３０３は、以下の式により、特定の物理マシンのネットワーク通信コストを計算する。【０３４０】
物理マシンのネットワーク通信コスト  ＝  
自ノード物理マシンに配置された仮想マシンと他ノード物理マシンに配置された仮想マシンのネットワーク通信量の合計【０３４１】
例えば、物理マシンが３台（物理マシン＃０、＃１、＃３）、仮想マシンが５台（仮想マシン＃０、＃１、＃２、＃３、＃４）をシステム構成とするとき、物理マシンと仮想マシンを以下のように配置されたとする。【０３４２】
物理マシン＃０：仮想マシン＃０、＃１
物理マシン＃１：仮想マシン＃２、＃３
物理マシン＃２：仮想マシン＃４【０３４３】
このとき、物理マシン＃０のネットワーク通信コストは、以下のようになる。【０３４４】
物理マシン＃０のネットワーク通信コスト  ＝  
仮想マシン＃０−＃２間のネットワーク通信量
＋  仮想マシン＃０−＃３間のネットワーク通信量
＋  仮想マシン＃０−＃４間のネットワーク通信量
＋  仮想マシン＃１−＃２間のネットワーク通信量
＋  仮想マシン＃１−＃３間のネットワーク通信量
＋  仮想マシン＃１−＃４間のネットワーク通信量【０３４５】
管理プログラム３０３は、ネットワーク監視テーブル１３０７から、各仮想マシン間のネットワーク通信量を取得する。その後、管理プログラム３０３は、各物理マシンのネットワーク通信コストのうち、最大となるネットワーク通信コストを当該配置パタンのネットワーク通信コストとして、一時配置パタンテーブル３０００に設定する。【０３４６】
次に、管理プログラム３０３は、現在の一時配置パタンテーブル３０００のネットワーク通信コストが無効値、又はステップＳ３００３での計算結果が現在の一時配置パタンテーブル３０００のネットワーク通信コストより小さいか、否かを判定する（Ｓ３００４）。【０３４７】
ステップＳ３００４で、判定の結果、現在の一時配置パタンテーブル３０００のネットワーク通信コストが無効値又はステップＳ３００３での計算結果が現在の一時配置パタンテーブル３０００のネットワーク通信コストより、小さい場合（Ｓ３００４：Ｙ）、管理プログラム３０３は、ステップＳ３００５に移行する。【０３４８】
ステップＳ３００４で、判定の結果、現在の一時配置パタンテーブル３０００のネットワーク通信コストが無効値でなく、且つステップＳ３００３での計算結果が、現在の一時配置パタンテーブル３０００のネットワーク通信コストより大きい場合（Ｓ３００４：Ｎ）、管理プログラム３０３は、当該配置パタンを破棄し、ステップＳ３００７に移行する。【０３４９】
ステップＳ３００５で管理プログラム３０３は、現在選択中の配置パタンに仮想マシンを移動したとき、ネットワーク以外の仮想マシンのリソース、ＣＰＵ／メモリ／ストレージが物理マシンのリソース合計を超過しないか否か判定する。具体的には、管理プログラム３０３は、ＣＰＵ／メモリ／ストレージ監視テーブル１３０６を参照し、当該配置パタンでの同物理マシンに配置された仮想マシンのリソース合計が、物理マシン構成管理テーブル１３０３に格納された配置先の物理マシンのリソース最大値を超過していないか判定する。【０３５０】
ステップＳ３００５で、判定の結果、仮想マシンのリソース使用量の合計が、物理マシンの最大リソース量を超えていない場合（Ｓ３００５：Ｙ）、管理プログラム３０３は、現在の一時配置パタンテーブル３０００を、新しい計算結果の配置パタンで更新する（Ｓ３００６）。ステップＳ３００５で、判定の結果、仮想マシンのリソース使用量の合計が、物理マシンの最大リソース量を超えている場合（Ｓ３００５：Ｎ）、管理プログラム３０３は、ステップＳ３００７に移行する。【０３５１】
ステップＳ３００７で管理プログラム３０３は、仮想マシンの物理マシンへの全ての配置パタンに対して、処理を完了したか否かを判定し、まだ未完了の配置パタンが存在する場合（Ｓ３００７：Ｎ）、ステップＳ３００２から処理を実行する。ステップＳ３００７で、判定の結果、仮想マシンの物理マシンへの全ての配置パタンに対して、処理を完了した場合（Ｓ３００７：Ｙ）、管理プログラム３０３は、現在の一時配置パタンテーブル３０００に格納されている配置パタンを新しい配置パタンとして、決定する（Ｓ３００８）。【０３５２】
以上のように管理プログラム３０３は、仮想マシンの物理マシンへの配置先を決定することで、物理マシンの外部のネットワーク通信と、物理マシンの内部のネットワーク通信とを考慮した仮想マシンの物理マシンへの配置を実現できる。つまり、管理プログラム３０３は、内部のネットワーク通信量が多く、外部のネットワーク通信量が少ない配置パタンを見つけることができ、システム全体の物理ネットワークのネットワーク通信量を削減できる。【０３５３】
以下、管理プログラム３０３により管理者へ提供されるＧＵＩ（Ｇｒａｐｈｉｃａｌ  Ｕｓｅｒ  Ｉｎｔｅｒｆａｃｅ）について説明する。各ＧＵＩは、分散型ネットワークシステムに接続された端末装置により、表示され、管理者からの入力を受け付けてもよい。【０３５４】
図３０は、ノード設定画面の構成例を示す。【０３５５】
ノード設定画面におけるＧＵＩ３１１４は、ユーザにノード構成の設定情報を表示し、管理者がノード構成を設定するためのインタフェースを提供する。ＧＵＩ３１１４は、ノード情報３１０１、ノード構成設定３１０２、ドライブ構成設定３１０７、及びデータ保護設定３１１０を含む。各カラムへの入力は、ユーザが任意の値を入力することでもよいし、ユーザがプルダウンにより登録済みの情報を選択することでもよい。【０３５６】
ノード情報３１０１は、ノード毎のエントリを有する。各エントリは、ノードＩＤ、ノード名、ＩＰアドレス、状態を含む。ノードＩＤは、ノード、つまり物理マシンの識別子を示しており、システムで一意な値である。本識別子は、ノードの追加、及び変更時に、システムにより決定される。ノード名は、ノードの追加及び変更時にユーザが指定した任意の文字列を示す。ＩＰアドレスは、ノードに追加及び変更時にユーザが指定したＩＰアドレス、又はシステムが決定したＩＰアドレスを示す。状態は、ノードの状態を示しており、例えば、正常、障害、復旧中、構成変更中を含む。状態が、復旧中又は構成変更中である場合、復旧処理、及び構成変更処理の進捗をユーザに示してもよい。【０３５７】
以上により、ユーザは、システムを構成している各ノードの構成、及び状態を確認することができる。【０３５８】
ノード構成設定３１０２は、ノード名３１０３、ＩＰアドレス３１０４、サイト設定３１０５、ジオ設定３１０６を含む。ユーザが各項目の値を入力後、ノード構成設定３１０２下部に設けられた「追加」、「変更」、又は「削除」ボタンを押すことにより、管理プログラム３０３は、処理を実行する。追加の場合、管理プログラム３０３は、設定対象ノードを新たにシステムに追加する。変更の場合、管理プログラム３０３は、設定対象ノードの設定を、入力した値に変更する。削除の場合、管理プログラム３０３は、設定対象ノードをシステムから削除する。【０３５９】
ノード名３１０３は、設定対象ノードの名称を指定できる。ユーザは、本項目に、設定対象ノードを入力する。ＩＰアドレス３１０４は、設定対象ノードに設定するＩＰアドレスを指定できる。ユーザが本項目に任意の値を入力してもよい。また、ＩＰアドレス３１０４に対しＡＵＴＯが選択された場合、システムが使用可能なＩＰアドレスを検索し、使用可能なＩＰアドレスを自動で設定対象ノードに設定する。管理プログラム３０３は、ノード情報３１０１のテーブルにより、設定されたＩＰアドレスを確認できる。サイト設定３１０５は、設定対象ノードが属するサイト保護レイヤ（保護レイヤ＃２）のゾーンを指定できる。このゾーンは、後述するデータ保護設定で、登録することができ、このゾーンに追加されたノード間で、冗長コードを生成し、ノード間のデータの保護を行う。ジオ設定３１０６は、設定対象ノードが属するジオ保護レイヤ（保護レイヤ＃３）のゾーンを指定できる。このゾーンは、後述するデータ保護設定で、登録することができ、このゾーンに追加されたサイト間で、冗長コードを生成し、サイト間のデータの保護を行う。【０３６０】
ドライブ構成設定３１０７は、ノード名３１０８、ドライブ名３１０９を含む。ユーザが各項目の値を入力後、ドライブ構成設定３１０７下部に設けられた「追加」、又は「削除」ボタンを押すことにより、管理プログラム３０３は、処理を実行する。追加の場合、管理プログラム３０３は、設定対象のノードに、指定されたドライブを追加する。削除の場合、管理プログラム３０３は、設定対象のノードから、指定されたドライブを削除する。【０３６１】
ノード名３１０８は、ドライブを追加する対象のノードの名称を指定できる。ドライブ名３１０９は、追加対象のドライブの名称を指定できる。ドライブの名称は、システムにより検出されたドライブの名称が表示される。【０３６２】
データ保護設定３１１０は、レイヤ名３１１１、保護レベル３１１２、保護方式３１１３を含む。ユーザが各項目の値を入力後、データ保護設定３１１０下部に設けられた「追加」、「変更」、又は「削除」ボタンを押すことにより、管理プログラム３０３は、処理を実行する。追加の場合、管理プログラム３０３は、設定対象の保護レイヤを新たにシステムに追加する。変更の場合、管理プログラム３０３は、設定対象の保護レイヤの設定を、入力した値に変更する。削除の場合、管理プログラム３０３は、設定対象の保護をシステムから削除する。【０３６３】
レイヤ名３１１１は、設定対象の保護レイヤの名称を指定できる。保護レベル３１１２は、設定対象の保護レイヤのデータ保護の方針（ＸＤＹＰ：最大Ｄａｔａ数Ｘ、冗長コード数Ｙ）を指定できる。ノード数がＸ＋Ｙに満たない場合、リソースのストレージ容量が異なる場合などにおいて、分散型ストレージシステムは、実構成内においてこれらに近い値を保護レベル３１１２として使用する。保護方式３１１３は、設定対象の保護レイヤにおいて、冗長コード生成のためのデータ転送をホストＩ／Ｏと同期で実施するか、非同期で実施するかを指定できる。【０３６４】
図３１は、配置ポリシ設定画面の構成例を示す。【０３６５】
配置ポリシ設定画面におけるＧＵＩ３２０１は、ユーザに仮想マシンの配置ポリシを設定するインタフェースを提供する。ＧＵＩ３２０１は、配置ポリシ情報３２０２、配置ポリシ設定３２０３を含む。各カラムへの入力は、ユーザが任意の値を入力することでもよいし、ユーザがプルダウンにより登録済みの情報を選択することでもよい。【０３６６】
配置ポリシ情報３２０２は、ポリシＩＤ、ポリシ名、仮想マシンＩＤ、及びポリシ種別の情報をユーザに表示する。ポリシＩＤは、新規ポリシ追加時に、システムにより割り当てられる識別子であり、システムがポリシを参照するときに使用される。ポリシ名は、ユーザが任意に指定可能な文字列であり、ユーザがポリシを確認するときに使用する。仮想マシンＩＤは、当該ポリシの設定対象である仮想マシンの識別子である。当該仮想マシンに対して、設定したポリシが適用される。ポリシ種別は、適用するポリシの種類であり、例えば、同ノード配置と別ノード配置の２種類がある。同ノード配置は、適用対象の複数の仮想マシンを同ノード（物理マシン）に配置することを意味する。別ノード配置は、適用対象の複数の仮想マシンをそれぞれ別ノード（物理マシン）に配置することを意味する。【０３６７】
配置ポリシ設定３２０３は、配置ポリシの設定インタフェースをユーザに提供する。配置ポリシ設定３２０３は、ポリシ名３２０４、ポリシ種別３２０５、及び仮想マシン名３２０６を含む。ユーザが各項目の値を入力後、配置ポリシ設定３２０３下部に設けられた「変更」、「追加」、又は「削除」ボタンを押すことにより、管理プログラム３０３は、設定情報をシステムに反映する。追加の場合、管理プログラム３０３は、設定対象のポリシを新たにシステムに追加する。変更の場合、管理プログラム３０３は、設定対象のポリシを、入力した値に変更する。削除の場合、管理プログラム３０３は、設定対象のポリシをシステムから削除する。【０３６８】
ポリシ名３２０４は、設定対象のポリシの名称を指定する。ポリシ種別３２０５は、適用するポリシの種類を指定する。ポリシ種別の説明は、先に述べたとおりである。仮想マシン名３２０６は、ポリシ適用対象の仮想マシンの名称を指定する。
【実施例２】
【０３６９】
図３２は、実施例２におけるオフロード構成を示す。【０３７０】
本実施例においては、ドライブ１０５の代わりにフラッシュドライブ３３０１が用いられる。ネットワーク２０３により接続されたノード１０１のバックエンドポート２０８は、仮想的又は物理的なネットワーク２０３を介して複数のフラッシュドライブ３３０１に接続されている。一つのサイトには、１又は複数のノード１０１が設置されている。【０３７１】
ノード１０１は、他のノード１０１を介することなく、バックエンドネットワーク２０３を介してフラッシュドライブ３３０１それぞれと通信可能であり、ローカルドライブとして使用できる。一つのフラッシュドライブ３３０１は、一つのノード１０１とのみ通信する。【０３７２】
バックエンドネットワーク２０３は、複数のノード１０１を相互接続してもよく、バックエンドネットワーク２０３が接続されたノード１０１間は、バックエンドネットワーク２０３を使用して通信する。バックエンドネットワーク２０３で接続されていないノード間の通信は、例えば、外部ネットワーク２０４を使用する。【０３７３】
フラッシュドライブ３３０１は、バックエンドネットワーク２０３に接続するためのＩ／Ｆ、データを一時的に格納するバッファメモリ、フラッシュドライブ３３０１を制御する内部プロセッサ、及びデータを格納する複数のフラッシュメモリを含む。【０３７４】
本実施例の分散型ストレージシステムは、冗長コード生成処理、及びログ構造化形式でのデータ格納処理を、フラッシュドライブ３３０１で実施することにより、オフロード構成を実現する。これにより、ノード１０１は、冗長コードの生成及びログ構造化形式を意識することなく、ライト処理を実施できるため、ライト処理の時間を短縮できる。【０３７５】
本実施例のオフロード構成は、具体的には、次に説明するコーディネータプログラム３４０１とドライブプログラム３４０２で実現される。コーディネータプログラム３４０１は、ノード１０１上で動作するプログラムであり、ホストからストレージＩ／Ｏを受信し、ノード１０１間、及びフラッシュドライブ３３０１間での通信処理を実施する。【０３７６】
ドライブプログラム３４０２は、フラッシュドライブ３３０１の内部プロセッサ上で動作するプログラムであり、コーディネータプログラム３４０１から受信したコマンドを処理する。【０３７７】
この図の例では、分散型ストレージシステムは、ノード１０１Ａ〜１０１Ｃを含む。ノード１０１Ａ〜１０１Ｃは、プロセッサ２０６Ａ〜２０６Ｃを夫々含む。ノード１０１Ａは、フラッシュドライブ３３０１Ａ〜３３０１Ｃを含み、ノード１０１Ｂは、フラッシュドライブ３３０１Ｄ〜３３０１Ｅを含み、ノード１０１Ｃは、フラッシュドライブ３３０１Ｆ〜３３０１Ｇを含む。プロセッサ２０６Ａ〜２０６Ｃは、コーディネータプログラム３４０１Ａ〜３４０１Ｃを夫々実行する。フラッシュドライブ３３０１Ａ〜３３０１Ｇは、ドライブプログラム３４０２Ａ〜３４０２Ｇを夫々実行する。【０３７８】
ノード１０１Ｂのコーディネータプログラム３４０１Ｂは、ホストからライト要求を受信すると、フラッシュドライブ３３０１Ｄ上で動作するドライブプログラム３４０２Ｄへ、ホストからのユーザデータＤＡＴＡ１を書き込むためのライトコマンドを発行する。それと同時に、フラッシュドライブ３３０１Ｅ上で動作するドライブプログラム３４０２Ｅへ、ノード内の冗長コードを生成するためのコマンドを発行し、さらにノード間の冗長コードを生成するため、ノード１０１Ａ上で動作するコーディネータプログラム３４０１ＡにユーザデータＤＡＴＡ１を転送する。【０３７９】
ドライブプログラム３４０２Ｄは、受信したユーザデータＤＡＴＡ１を、フラッシュドライブ３３０１Ｄ内の不揮発媒体へ格納する。ドライブプログラム３４０２Ｅは、フラッシュドライブ３３０１Ｅ内のバッファメモリ上に存在するコードダーティキューへ、受信したユーザデータＤＡＴＡ１をキューイングし、デステージ処理でユーザデータＤＡＴＡ１から冗長コードＣｏｄｅ４を生成し、不揮発媒体へ格納する。つまり、フラッシュドライブ３３０１Ｄとフラッシュドライブ３３０１Ｅが、一つのストライプタイプのデータドライブ、及び冗長コードドライブに夫々対応する。冗長コードドライブは、ユーザデータのライト先アドレスと、実施例１で説明した静的マッピングテーブルに基づいて、決定される。また、この図の例の分散型ストレージシステムは、一つのユーザデータから冗長コードを生成しているが、冗長コードは、複数のドライブにライトされたユーザデータ同士で生成してもよい。【０３８０】
ノード１０１Ｃは、ホストからユーザデータＤＡＴＡ２のライト要求を受信すると、ノード１０１Ｂと同様に処理する。【０３８１】
これにより、ノード１０１Ａは、ノード１０１Ｂとノード１０１ＣからユーザデータＤＡＴＡ１、ＤＡＴＡ２を受信する。ノード１０１Ａのコーディネータプログラム３４０１Ａは、冗長コードを格納するフラッシュドライブ３３０１Ａを決定し、冗長コード書き込みのためのコマンドを用いて、受信したユーザデータＤＡＴＡ１、ＤＡＴＡ２を当該フラッシュドライブ３３０１Ａへ書き込む。【０３８２】
冗長コード書き込みのコマンドを受信したドライブプログラム３４０２Ａは、フラッシュドライブ３３０１Ａ内のバッファメモリに存在するコードダーティキューに受信したユーザデータをキューイングし、デステージ処理でノード間の冗長コードＣｏｄｅ１を生成し、不揮発媒体へ格納する。【０３８３】
また、コーディネータプログラム３４０１は、各フラッシュドライブ３３０１の容量が枯渇しないように、容量の管理を行う。具体的には、コーディネータプログラム３４０１は、フラッシュドライブ３３０１の実際使用量を、後述するローカル領域量テーブルを用いて監視し、目標使用量を超過したフラッシュドライブ３３０１Ｂのユーザデータの冗長コードを格納するフラッシュドライブ３３０１Ｂ上のドライブプログラム３４０２Ｂに対し、容量削減要求を発行し、不要な冗長コード及びユーザデータの消去処理を行う。【０３８４】
また、管理プログラム３０３は、一つ又は複数のノード１０１上で動作しており、各ノード１０１上のコーディネータプログラム３４０１に対して、ノード１０１の追加や削除、復旧処理といった管理オペレーションを発行する。【０３８５】
図３３は、分散型ストレージシステムの制御のためにフラッシュドライブ３３０１で管理されるログ構造化マッピングテーブル５０８ｂの構成例について示す。【０３８６】
フラッシュドライブ３３０１内のバッファメモリ３５０４は、ログ構造化マッピングテーブル５０８ｂを格納する。【０３８７】
ログ構造化マッピングテーブル５０８ｂは、ログ構造化マッピングテーブル５０８内の情報に加え、アドレス識別子変換テーブル３５０１とアドレス識別子フリーリスト３５０２を含む。【０３８８】
アドレス識別子変換テーブル３５０１は、データを一意に識別するためのアドレス識別子と、論物（論理アドレス−物理アドレス）変換情報であるログ情報との、対応関係を示す。フラッシュドライブ３３０１は、ユーザデータが書き込まれる度に、論物変換情報を更新し、更新した論物変換情報をログ情報として、ドライブ内で一意な識別子であるアドレス識別子を付与し、管理する。フラッシュドライブ３３０１は、他フラッシュドライブが保持されている冗長コードに対し、その冗長コードの生成に用いられたユーザデータの情報を、アドレス識別子を用いて保持する。【０３８９】
これにより、フラッシュドライブ３３０１は、ガベージコレクション処理やウェアレベリング処理を行うことにより自ノードのフラッシュドライブに格納されているユーザデータの物理アドレスが変更されても、他ノードのフラッシュドライブへ変更後の物理アドレスを通知しなくてよいため、フラッシュドライブ３３０１間の通信オーバヘッドを削減できる。【０３９０】
アドレス識別子フリーリスト３５０２は、未使用のアドレス識別子を格納している。コーディネータプログラム３４０１は、ユーザデータを書き込むとき、アドレス識別子フリーリスト３５０２の先頭からアドレス識別子を取得（デキュー）し、取得したアドレス識別子とともにフラッシュドライブ３３０１へユーザデータを書き込む。【０３９１】
フラッシュドライブ３３０１は、指定されたアドレス識別子と共にログ情報をアドレス識別子変換テーブル３５０１へ格納する。また、コーディネータプログラム３４０１は、無効ユーザデータを消去する契機（ＩＮＶＡＬＩＤＡＴＥコマンド発行契機）で、消去されたアドレス識別子を、アドレス識別子フリーリスト３５０２の末尾へ登録（エンキュー）する。【０３９２】
なお、フラッシュドライブ３３０１は、ログ構造化マッピングテーブル５０８ｂのバックアップ３５０６をフラッシュメモリ３５０５へ格納してもよい。【０３９３】
図３４は、コーディネータプログラム３４０１とドライブプログラム３４０２間の通信インタフェースを示す。【０３９４】
コーディネータプログラム３４０１は、次のコマンドをドライブプログラム３４０２へ発行することができる。【０３９５】
Ｄ＿ＷＲＩＴＥコマンド３６０１は、ユーザデータを格納するフラッシュドライブ上のドライブプログラムに対し、ドライブ番号、ＬＢＡ、データ転送長、アドレス識別子を引数として、ユーザデータの書き込みを行う。【０３９６】
Ｐ＿ＷＲＩＴＥコマンド３６０２は、冗長コードを格納するフラッシュドライブ上のドライブプログラムに対し、ドライブ番号、データ転送長、データ格納情報を引数として、冗長コード生成のためのユーザデータの書き込みを行う。データ格納情報は、ユーザデータを格納するフラッシュドライブのノード番号、ドライブ番号、ＬＢＡ、アドレス識別子を含む。【０３９７】
Ｄ＿ＲＥＡＤコマンド３６０３は、ユーザデータを格納するフラッシュドライブ上のドライブプログラムに対し、ドライブ番号、ＬＢＡ、データ転送長を引数として、有効ユーザデータを読み出す。【０３９８】
ＯＬＤ＿Ｄ＿ＲＥＡＤコマンド３６０４は、ユーザデータを格納するフラッシュドライブ上のドライブプログラムに対し、ドライブ番号、アドレス識別子、データ転送長を引数として、無効ユーザデータを読み出す。本コマンドは、コレクションリードの際に、障害データを復旧するために使用される。【０３９９】
Ｐ＿ＧＥＴコマンド３６０５は、ドライブ番号を引数として、冗長コードを格納するフラッシュドライブから、そのフラッシュドライブにおけるデステージ処理で生成された冗長コードの生成において、生成に用いられたユーザデータを示す冗長コード構成情報を取得する。冗長コード構成情報は、ユーザデータを格納するフラッシュドライブのノード番号、ドライブ番号、ＬＢＡ、及びアドレス識別子を含む。【０４００】
Ｐ＿ＰＵＳＨコマンド３６０６は、ドライブ番号と、冗長コード構成情報を引数として、２つ目以降の冗長コードを格納するフラッシュドライブに対し、冗長コード構成情報を通知する。【０４０１】
ＩＮＶＡＬＩＤコマンド３６０７は、容量枯渇管理処理時、ユーザデータを格納するフラッシュドライブに対し、ドライブ番号、アドレス識別子を引数として、不要となった無効ユーザデータを消去する。【０４０２】
ＳＥＡＲＣＨコマンド３６０８は、容量枯渇管理処理時、冗長コードを格納するフラッシュドライブに対し、削除対象の冗長コードの探索を依頼し、探索結果として、削除対象冗長コードの冗長コード情報と、削除対象冗長コードの冗長コード構成情報とを取得する。削除対象冗長コードの冗長コード情報は、冗長コードを格納するフラッシュドライブのドライブ番号とＬＢＡを含む。削除対象冗長コードの冗長コード構成情報は、ユーザデータを格納するフラッシュドライブのドライブ番号、ＬＢＡ、アドレス識別子、及び当該ユーザデータが有効ユーザであるか無効ユーザデータであるかを示す情報を含む。【０４０３】
Ｐ＿ＲＥＡＤコマンド３６０９は、コレクションリード処理時、冗長コードを格納するフラッシュドライブから、復旧対象ユーザデータの冗長コード、及び冗長コード構成情報を取得する。冗長コード構成情報は、冗長コードを生成したユーザデータの格納位置、ノード番号、ドライブ番号、ＬＢＡ、アドレス識別子を含む。【０４０４】
以上のコマンドにより、コーディネータプログラム３４０１とドライブプログラム３４０２間で通信を行うことにより、オフロード構成を実現する。【０４０５】
以下、実施例２の分散型ストレージシステムの動作について説明する。【０４０６】
図３５は、実施例２のリード処理のフローチャートを示す。【０４０７】
本実施例のリード処理において、コーディネータプログラム３４０１は、ドライブプログラム３４０２からユーザデータを読み込む処理である。【０４０８】
コーディネータプログラム３４０１は、ホストからのリード要求が、自ノード内のフラッシュドライブへのアクセスであるか否かを判定する（Ｓ３７０１）。【０４０９】
ステップＳ３７０１で、判定の結果、他ノードのフラッシュドライブへのアクセスである場合（Ｓ３７０１：Ｎ）、コーディネータプログラム３４０１は、他ノードのコーディネータプログラム３４０１へリード要求を転送する（Ｓ３７０７）。リード要求を受信した他ノードのコーディネータプログラム３４０１は、本処理と同様にリード要求を処理する。【０４１０】
ステップＳ３７０１で、判定の結果、自ノードのフラッシュドライブへのアクセスである場合（Ｓ３７０１：Ｙ）、コーディネータプログラム３４０１は、アクセス先のフラッシュドライブが障害ドライブであるか否かを判定する（Ｓ３７０２）。【０４１１】
ステップＳ３７０２で、判定の結果、アクセス先のドライブが障害ドライブである場合（Ｓ３７０２：Ｙ）、コーディネータプログラム３４０１は、後述するコレクションリード処理を実行する（Ｓ３７０８）。【０４１２】
ステップＳ３７０２で、判定の結果、アクセス先のドライブが障害ドライブでない場合（Ｓ３７０２：Ｎ）、コーディネータプログラム３４０１は、Ｄ＿ＲＥＡＤコマンドをアクセス先のフラッシュドライブ上のドライブプログラム３４０２に発行し（Ｓ３７０３）、処理の完了を待機する（Ｓ３７０４）。【０４１３】
ドライブプログラム３４０２は、Ｄ＿ＲＥＡＤコマンドを受信すると、ログ構造化マッピングテーブル５０８ｂのアドレス識別子変換テーブル３５０１の論物変換情報を参照し、指定された論理アドレスを物理アドレスに変換する（Ｓ３７０９）。【０４１４】
次に、ドライブプログラム３４０２は、不揮発媒体から指定されたユーザデータを読み込み、結果を、コーディネータプログラム３４０１に返却する（Ｓ３７１０、Ｓ３７１１）。【０４１５】
コーディネータプログラム３４０１は、ドライブプログラム３４０２から完了応答を受信すると、返却されたユーザデータをホストへ返却する（Ｓ３７０６）。【０４１６】
図３６は、実施例２の同期ライト処理のフローチャートを示す。【０４１７】
本実施例の同期ライト処理において、コーディネータプログラム３４０１は、ドライブプログラム３４０２へユーザデータを書き込む。コーディネータプログラム３４０１は、ログ構造化形式を意識することなく、データを書き出すことができるため、ライト処理時間を短縮できる。【０４１８】
コーディネータプログラム３４０１は、ホストからのライト要求が、自ノード内のフラッシュドライブへのアクセスであるか否かを判定する（Ｓ３８０１）。【０４１９】
ステップＳ３８０１で、判定の結果、他ノードのフラッシュドライブへのアクセスである場合（Ｓ３８０１：Ｎ）、コーディネータプログラム３４０１は、他ノードのコーディネータプログラム３４０１へライト要求を転送する（Ｓ３８１０）。ライト要求を受信した他ノードのコーディネータプログラム３４０１は、本処理と同様にライト要求を処理する。【０４２０】
ステップＳ３８０１で、判定の結果、自ノードのフラッシュドライブへのアクセスである場合（Ｓ３８０１：Ｙ）、コーディネータプログラム３４０１は、アクセス先のフラッシュドライブが障害ドライブであるか否か判定する（Ｓ３８０２）。【０４２１】
ステップＳ３８０２で、判定の結果、アクセス先のドライブが障害ドライブである場合（Ｓ３８０２：Ｙ）、コーディネータプログラム３４０１は、図２７で説明したコレクションライト処理を実行する（Ｓ３７１１）。【０４２２】
ステップＳ３８０２で、判定の結果、アクセス先のドライブが障害ドライブでない場合（Ｓ３８０２：Ｎ）、コーディネータプログラム３４０１は、アドレス識別子フリーリストから、フリーのアドレス識別子を取得する（Ｓ３８０３）。【０４２３】
次に、コーディネータプログラム３４０１は、取得したアドレス識別子を含むＤ＿ＷＲＩＴＥコマンドをアクセス先のフラッシュドライブ上のドライブプログラム３４０２に発行する（Ｓ３８０４）。【０４２４】
ドライブプログラム３４０２は、Ｄ＿ＷＲＩＴＥコマンドを受信すると、受信したユーザデータを、キャッシュ情報のデータダーティキューに接続し（Ｓ３８１３）、結果をコーディネータプログラム３４０１に返却する（Ｓ３８１４）。【０４２５】
次に、コーディネータプログラム３４０１は、冗長コードを格納するためのユーザデータ転送を行うため、処理対象の保護レイヤの冗長コードの格納位置が、自ノードか否かを判定する（Ｓ３８０５）。【０４２６】
ステップＳ３８０５で、判定の結果、他ノードに冗長コードを格納する場合（Ｓ３８０５：Ｎ）、コーディネータプログラム３４０１は、他ノードのコーディネータプログラム３４０１に、Ｐ＿ＷＲＩＴＥコマンドを転送する（Ｓ３８１２）。Ｐ＿ＷＲＩＴＥコマンドを受信した他ノードのコーディネータプログラム３４０１は、冗長コードを格納するフラッシュドライブを、例えばラウンドロビンを用いて決定し、決定したフラッシュドライブ上のドライブプログラムへＰ＿ＷＲＩＴＥコマンドを発行する。【０４２７】
ステップＳ３８０５で、判定の結果、自ノードに冗長コードを格納する場合（Ｓ３８０５：Ｙ）、コーディネータプログラム３４０１は、冗長コード格納位置の自ノードのフラッシュドライブ３３０１へＰ＿ＷＲＩＴＥコマンドを発行する（Ｓ３８０６）。【０４２８】
Ｐ＿ＷＲＩＴＥコマンドを受信したドライブプログラム３４０２は、受信したユーザデータを、キャッシュ情報のコードダーティキューに接続し、結果をコーディネータプログラム３４０１に返却する（Ｓ３８１５、Ｓ３８１６）。【０４２９】
次に、コーディネータプログラム３４０１は、全保護レイヤにおいて、冗長コードのためのデータ転送を完了したか否かを判定する（Ｓ３８０７）。【０４３０】
ステップＳ３８０７で、判定の結果、未処理の保護レイヤが存在する場合（Ｓ３８０７：Ｎ）、コーディネータプログラム３４０１は、ステップＳ３８０５から処理を実行する。【０４３１】
ステップＳ３８０７で、判定の結果、未処理の保護レイヤが存在する場合（Ｓ３８０７：Ｙ）、コーディネータプログラム３４０１は、フラッシュドライブからのコマンド完了を待機し、完了を受信すると、ライト要求の完了応答をホストへ返却する（Ｓ３８０８、Ｓ３８０９）。【０４３２】
図３７は、実施例２のデステージ処理のフローチャートを示す。【０４３３】
本実施例のデステージ処理において、ドライブプログラム３４０２は、不揮発媒体へユーザデータを書き込む。ドライブプログラム３４０２は、実施例１で説明したデステージ処理のステップＳ２１０１〜Ｓ２１０７と同様のステップＳ３９０１〜Ｓ３９０７を行う。ここでは、実施例１のデステージ処理との差違についてのみ説明する。【０４３４】
ドライブプログラム３４０２は、Ｓ３９０３において、最初の冗長コードを生成し、Ｓ３９０４において、当該冗長コードを媒体へ書き込んだ後、Ｓ３９０５において、当該冗長コードを生成したユーザデータの組み合わせ情報を、バッファメモリに一時保存する。【０４３５】
コーディネータプログラム３４０１は、冗長コードの生成に用いられたユーザデータの組み合わせ情報であって、ドライブプログラム３４０２により保存された組み合わせ情報を、Ｐ＿ＧＥＴコマンドにより取得する（Ｓ３９０９）。コーディネータプログラム３４０１は、本処理を、周期的に実行してもよいし、常時実行してもよい。【０４３６】
Ｐ＿ＧＥＴコマンドの結果、ドライブプログラム３４０２からユーザデータの組み合わせ情報が返却さなければ（Ｓ３９０９：Ｎ）、コーディネータプログラム３４０１は、処理を終了する。【０４３７】
Ｐ＿ＧＥＴコマンドの結果、ドライブプログラム３４０２からユーザデータの組み合わせ情報が返却されれば（Ｓ３９０９：Ｙ）、コーディネータプログラム３４０１は、２つ目以降の冗長コードを格納するフラッシュドライブのドライブプログラム、又は２つ目以降の冗長コードを格納するノードのコーディネータプログラムへ、当該組み合わせ情報を通知する（Ｓ３９１０）。これにより、組み合わせ情報を受信したコーディネータプログラムは、ノード間の冗長コードを格納するフラッシュドライブのドライブプログラムへ当該組み合わせ情報を通知する。【０４３８】
ユーザデータの組み合わせ情報を受信したドライブプログラム３４０２は、バッファメモリ上のコードダーティキューから、組み合わせ情報により指定されたユーザデータを検出し（Ｓ３９１１）、当該ユーザデータで次の（２つ目以降の）冗長コードを生成し（Ｓ３９１２）、生成された冗長コードを不揮発媒体へ書き込む（Ｓ３９１３）。【０４３９】
次に、実施例２の容量枯渇管理処理について説明する。【０４４０】
本実施例では、コーディネータプログラム３４０１が、容量枯渇管理処理及び容量削減処理を実行し、ドライブプログラム３４０２が、データ再転送処理及びデータ消去処理を行う。さらに、実施例１のストレージプログラム３０２による消去対象冗長コードの探索処理は、本実施例においては、ドライブプログラム３４０２にオフロードされる。【０４４１】
実施例１の容量枯渇管理処理との差分について以下で説明する。自ノード、又は他ノードのコーディネータプログラム３４０１で実行される容量枯渇管理処理から、容量削減要求を受信したコーディネータプログラム３４０１は、Ｓ２３０５と同様の容量削減処理を実行する。【０４４２】
その後、コーディネータプログラム３４０１は、容量削減処理のＳ２３０６の代わりに、コーディネータプログラム３４０１は、消去対象冗長コードを探索するＳＥＡＲＣＨコマンドを、ドライブプログラム３４０２に発行する。【０４４３】
ＳＥＡＲＣＨコマンドを受信したドライブプログラム３４０２は、消去対象とする冗長コードを探索する。この際、ドライブプログラム３４０２は、容量削減が必要なドライブ番号を引数とし、当該ドライブ番号の無効ユーザデータから生成された冗長コードを探索する。【０４４４】
ドライブプログラム３４０２は、消去対象の冗長コードが見つかると、当該冗長コード情報と当該冗長コード構成情報とを、コーディネータプログラム３４０１に返却する。冗長コード情報は、冗長コードの格納位置のドライブ番号、ＬＢＡを含み、容量削減処理で、冗長コード削除時に、削除対象の冗長コードを指定する際に使用される。冗長コード構成情報は、冗長コードの生成に用いられたユーザデータの、ノード番号、ドライブ番号、アドレス識別子を含み、容量削減処理で、ユーザデータを消去、又は再転送する際に使用する。また、無効ユーザデータ消去は、コーディネータプログラム３４０１が、ドライブプログラム３４０２に、消去対象のユーザデータを識別するアドレス識別子を引数に、ＩＮＶＡＬＩＤコマンドを発行し、無効ユーザデータの消去を行う。【０４４５】
図３８は、実施例２のコレクションリード処理のフローチャートを示す。【０４４６】
本実施例のコレクションリード処理において、コーディネータプログラム３４０１は、ドライブプログラム３４０２から障害ユーザデータを読み込む。【０４４７】
コーディネータプログラム３４０１は、冗長コード及び冗長コード構成情報を取得するために、復旧対象のユーザデータの冗長コードを格納するフラッシュドライブのドライブプログラム３４０２へ、Ｐ＿ＲＥＡＤコマンドを発行する（Ｓ４１０１）。その後、コーディネータプログラム３４０１は、Ｐ＿ＲＥＡＤコマンドの結果が返却されるまで、待機する（Ｓ４１０２）。【０４４８】
復旧対象のユーザデータの冗長コードを格納するフラッシュドライブのドライブプログラム３４０２は、Ｐ＿ＲＥＡＤコマンドを受信すると、フラッシュドライブ内のバッファメモリのコードダーティキューに、復旧対象ユーザデータが存在するか否か判定する（Ｓ４１１１）。【０４４９】
ステップＳ４１１１で、判定の結果、復旧対象ユーザデータが存在する場合（Ｓ４１１１：Ｙ）、ドライブプログラム３４０２は、当該復旧対象ユーザデータをコーディネータプログラム３４０１に返却する（Ｓ４１１５）。【０４５０】
ステップＳ４１１１で、判定の結果、復旧対象ユーザデータが存在する場合（Ｓ４１１１：Ｎ）、ドライブプログラム３４０２は、ログ構造化マッピングテーブル５０８ｂ内の冗長コードマッピングテーブルから、復旧対象ユーザデータの冗長コードを特定する（Ｓ４１１２）。次に、ドライブプログラム３４０２は、ログ構造化マッピングテーブル５０８ｂ内の逆マッピングテーブルから、冗長コード構成情報を特定する（Ｓ４１１３）。【０４５１】
次に、ドライブプログラム３４０２は、特定した冗長コードと冗長コード構成情報を、コーディネータプログラム３４０１に返却する（Ｓ４１１４）。【０４５２】
コーディネータプログラム３４０１は、Ｐ＿ＲＥＡＤコマンドの結果を受信すると、返却されたデータが、復旧対象ユーザデータであるか否か判定する（Ｓ４１０３、Ｓ４１０４）。【０４５３】
ステップＳ４１０４で、判定の結果、復旧対象ユーザデータが返却された場合（Ｓ４１０４：Ｙ）、コーディネータプログラム３４０１は、当該復旧対象ユーザデータを、ユーザデータのリード要求元に返却し、処理を終了する。【０４５４】
ステップＳ４１０４で、判定の結果、復旧対象ユーザデータが返却されていない場合（Ｓ４１０４：Ｙ）、コーディネータプログラム３４０１は、返却された冗長コード構成情報から、復旧に必要なユーザデータを特定し、特定されたユーザデータのアドレス識別子を指定するＯＬＤ＿Ｄ＿ＲＥＡＤコマンドを発行することにより、特定されたユーザデータを読み込む。ここで、必要なユーザデータが他ノードに格納されている場合、コーディネータプログラム３４０１は、ＯＬＤ＿Ｄ＿ＲＥＡＤコマンドを、他ノードのコーディネータプログラム３４０１に転送する。コーディネータプログラム３４０１は、ドライブプログラム３４０２から、ＯＬＤ＿Ｄ＿ＲＥＡＤコマンドの結果が返却されるまで、待機する（Ｓ４１０６）。【０４５５】
ドライブプログラム３４０２は、ＯＬＤ＿Ｄ＿ＲＥＡＤコマンドを受信すると、ログ構造化マッピングテーブル５０８ｂ内のアドレス識別子変換テーブルから、指定されたアドレス識別子に対応するユーザデータの物理アドレスを特定し（Ｓ４１１６）、当該ユーザデータを不揮発媒体から読み出し（Ｓ４１１７）、当該ユーザデータをコーディネータプログラム３４０１に返却する（Ｓ４１１８）。【０４５６】
コーディネータプログラム３４０１は、全てのＯＬＤ＿Ｄ＿ＲＥＡＤコマンドの結果を受信すると（Ｓ４１０７）、Ｐ＿ＲＥＡＤコマンドで読み出した冗長コードと、ＯＬＤ＿Ｄ＿ＲＥＡＤコマンドで読み出したユーザデータとから、復旧対象ユーザデータを計算して復旧する（Ｓ４１０８）。その後、コーディネータプログラム３４０１は、復旧したユーザデータを、ユーザデータの要求元に返却し（Ｓ４１０９）、このフローを終了する。【０４５７】
次に、実施例２における冗長化先変更処理について説明する。【０４５８】
本実施例の冗長化先変更処理は、コーディネータプログラム３４０１が実施例１と同様の冗長化先変更メイン処理を実行し、ドライブプログラム３４０２が実施例１と同様の冗長化先変更サブ処理を実行することで実現される。【０４５９】
コーディネータプログラム３４０１は、管理プログラム３０３から構成変更要求を受信すると、実施例１と同様の構成変更処理を実行し、冗長化先変更メイン処理を実行する。冗長化先変更メイン処理において、コーディネータプログラム３４０１は、フラッシュドライブ３３０１から、ユーザデータを順に読み出す。次に、コーディネータプログラム３４０１は、静的マッピングテーブルを参照し、構成変更後の冗長化先を決定し、Ｐ＿ＷＲＩＴＥコマンドを用いて、読み出したユーザデータを構成変更後の冗長化先へ書き出す。さらに、コーディネータプログラム３４０１は、構成変更前の静的マッピングテーブルを参照し、古い冗長コードを格納するフラッシュドライブに対して、冗長化先を変更したユーザデータを指定し、当該ユーザデータの冗長コードを消去するコマンドを発行する。【０４６０】
構成変更に伴う冗長コードの消去コマンドを受信したドライブプログラム３４０２は、冗長化先変更サブ処理を実行し、実施例１の冗長化先変更処理のフローチャートに従って処理を実行した後、結果をコーディネータプログラム３４０１に返却する。【０４６１】
次に、実施例２におけるデータコピー処理について説明する。【０４６２】
本実施例のデータコピー処理は、実施例１のデータコピー処理及びアドレス解決処理を、コーディネータプログラム３４０１が実行することで実現される。【０４６３】
コーディネータプログラム３４０１は、管理プログラム３０３からデータ移行要求を受信すると、実施例１と同様のデータ移行処理を実行し、データコピー処理を実行する。コーディネータプログラム３４０１は、実施例１と同様の説明したデータコピー処理及びアドレス解決処理を実行し、データのコピーを行う。【０４６４】
次に、実施例２における障害復旧処理について説明する。【０４６５】
本実施例の復旧処理は、実施例１の復旧処理と同様に実施する。但し、本実施例において、管理プログラム３０３は、構成変更処理及びデータ移行処理の要求を、コーディネータプログラム３４０１に対して発行する。
【実施例３】
【０４６６】
本実施例では、冗長化のためのノード間の転送を効率化する方法について説明する。本実施例の分散型ストレージシステムの構成は、実施例１と同様である。但し、本実施例において冗長コードを生成する冗長化処理は、実施例１と異なる。【０４６７】
実施例１では、ノードに対するライト量に対し、冗長度に比例して転送量が増加する。例えば、２ノード障害時にデータを回復するためには、１個のノードから、２個のノードのキャッシュメモリに対してライトデータが転送される。つまり、ノードに対するライト量の２倍のネットワーク転送が発生する。以下において、他のノードでの冗長コード生成のための転送量を削減する方法を述べる。【０４６８】
図３９は、実施例３の冗長化処理を示す。【０４６９】
この図は、ノード１０１Ａから１０１Ｄまでの４ノードを持つ分散型ストレージシステムが、２Ｄ２Ｐ冗長構成（２つのユーザデータから２つの冗長コードを生成する構成）でデータを保護する例を示している。つまり、本システムは、２ノード障害時に全てのデータを回復できる冗長性を持つ。【０４７０】
例えば、ノード１０１は、受信したデータ長の長いライトデータを二つのデータブロックのユーザデータｄ１、ｄ２に分割し、さらに、二つのパリティｐ、ｑを生成する。パリティもデータブロックとして扱われる。パリティｐ、ｑを、一次的な冗長コード（Ｃｌａｓｓ１  Ｃｏｄｅ）と呼ぶ。次に、ノード１０１は、ユーザデータ及びパリティを、他のノード１０１のキャッシュ（バッファ）に分散コピーする。データユニットは、一つ又は複数のデータブロックの組み合わせである。【０４７１】
この図の例において、ノード１０１Ａは、受信したライトデータを二つのデータブロックのユーザデータｄ１ａ、ｄ２ａに分割し、それらのユーザデータからパリティｐａ、ｑａを生成する。同様に、ノード１０１Ｂは、受信したライトデータを二つのデータブロックのユーザデータｄ１ｂ、ｄ２ｂに分割し、それらのユーザデータからパリティｐｂ、ｑｂを生成する。同様に、ノード１０１Ｃは、受信したライトデータを二つのデータブロックのユーザデータｄ１ｃ、ｄ２ｃに分割し、それらのユーザデータからパリティｐｃ、ｑｃを生成する。同様に、ノード１０１Ｄは、受信したライトデータを二つのデータブロックのユーザデータｄ１ｄ、ｄ２ｄに分割し、それらのユーザデータからパリティｐｄ、ｑｄを生成する。【０４７２】
本実施例のノード１０１は、三つのデータブロックを、他の三つのノード１０１へ夫々コピーする。コピーが完了した時点で、必要な冗長性が得られている（２ノード障害時のデータ回復が可能）ため、同期的なライト処理が完了する。【０４７３】
各ノード１０１は、それぞれ、一つのユーザデータｄ２及び二つのパリティｐ、ｑを、他の三つのノード１０１のキャッシュ（バッファ）に、それぞれコピーする。各ノードは、他の三つのノードからのデータブロック（ライトデータ又はパリティ）をキャッシュに格納する。【０４７４】
ノード１０１Ａ〜１０１Ｄは、それぞれ、非同期的に、他の三つのノードから集約したデータブロック（ユーザデータ又はパリティ）からパリティｘ、ｙを生成し、ローカルドライブに書き込み、キャッシュを解放する。当該パリティｘ、ｙを、Ｃｌａｓｓ２  Ｃｏｄｅと呼ぶ。ノード１０１Ａは、他のノードから受信したデータブロックから、パリティｘａ、ｙａを生成する。同様に、ノード１０１Ｂは、他のノードから受信したデータブロックから、パリティｘｂ、ｙｂを生成する。同様に、ノード１０１Ｃは、他のノードから受信したデータブロックから、パリティｘｃ、ｙｃを生成する。同様に、ノード１０１Ｄは、他のノードから受信したデータブロックから、パリティｘｄ、ｙｄを生成する。【０４７５】
例えば、ノード１０１Ｃは、ノード１０１Ａからパリティｐａを受信し、ノード１０１Ｂからパリティｐｂを受信し、ノード１０１Ｄからパリティｑｄを受信する。ノード１０１Ｃは、それらのデータブロックから、パリティｘ、ｙを生成して、ローカルドライブに書き込み、キャッシュを解放する。【０４７６】
また、ノード１０１Ａ〜１０１Ｄは、それぞれ、ユーザデータｄ１、ｄ２をローカルドライブに書き込み、キャッシュを解放する。例えば、ノード１０１Ａは、ユーザデータｄ１ａ、ｄ２ａをローカルドライブに書き込み、キャッシュを解放する。【０４７７】
実施例１では、２ノード障害時にデータ回復を可能とするために、ノード１０１は、ライトデータｄ１、ｄ２を他の２ノードに転送する。これに対して、本実施例は、ライトデータの一部ｄ２と、ライトデータから生成した一次的冗長コード（パリティｐ、ｑ）を他ノードに転送する。したがって、本実施例の分散型ストレージシステムは、要求される冗長性を維持しつつ、ノード間のデータ転送を効率化することができる。また、ストライプのデータｄ１、ｄ２が全てローカルドライブに格納される。【０４７８】
この図は、２Ｄ２Ｐ冗長構成の例を示すが、本実施例の方法は、任意のｍＤｎＰ構成（ｍ、ｎは自然数）に適用できる。ライトデータ（ｍＤ）は、ローカルドライブに格納され、冗長度を１減らした状態（冗長度がｎ−１）のデータが他ノードに転送される。【０４７９】
例えば、３Ｄ２Ｐ構成（ｄ１、ｄ２、ｄ３、ｐ、ｑ）において、ライトデータ（ｄ１＋ｄ２＋ｄ３）はローカルドライブに格納され、データブロックｄ２、ｄ３、ｐ、ｑが異なるノードにそれぞれ転送される。転送されるデータブロックの組はこれに限定されず、例えば、データブロックｄ１、ｄ２、ｄ３、ｐが他ノードに転送されてもよい。【０４８０】
本実施例の冗長化処理と、実施例１で述べた、一つのストライプタイプ内のストライプから動的にストライプを選択し、選択したストライプから冗長コードを生成し、それらについての情報をメタデータ（例えばログ構造化マッピングテーブル５０８）として格納する冗長化処理とを組み合わせることにより、リードモディファイライト及びネットワークの転送量を低減でき、ライト処理の高性能を実現できる。また、本実施例の冗長化処理は、実施例１で述べた複数の保護レイヤを有するシステムに適用できる。【０４８１】
また、受信したライトデータのデータ長が短い場合（例えばランダムライト）は、冗長化のためのデータ転送は、ネットワークの帯域への影響が小さい。そのため、データ長が予め設定された閾値より大きい場合（シーケンシャルライト）のみ、本実施例の冗長化処理を実行してもよい。データ長が閾値以下の場合、例えば、実施例１に示す冗長化処理が適用される。【０４８２】
これにより、プロセッサ処理とネットワーク帯域の利用率を向上できる。この場合、分散型ストレージシステムは、メタデータ（例えばログ構造化マッピングテーブル５０８）に、Ｃｌａｓｓ２  Ｃｏｄｅの生成方法を適用しているか否かを示す情報を付加し、当該情報に従って冗長化処理を切り替えてもよい。また、分散型ストレージシステムは、Ｃｌａｓｓ１  ｃｏｄｅを、ノード内（ノード保護レイヤ）パリティとしてローカルドライブに書き込み、パリティ生成の処理を効率化してもよい。【０４８３】
図４０は、実施例３のデータ復元処理を示す。【０４８４】
この図は、ノード１０１Ａ及び１０１Ｂが故障し、ライトデータを復元する例を示す。【０４８５】
ノード１０１Ｃ及び１０１Ｄは、それぞれＣｌａｓｓ２  ｃｏｄｅから、Ｃｌａｓｓ１  ｃｏｄｅを復元し、さらに、Ｃｌａｓｓ１  ｃｏｄｅからノード１０１Ａ及び１０１Ｂのユーザデータを復元する。【０４８６】
具体的には、ノード１０１Ｃは、ノード１０１Ｄからパリティｑｄを取得し、パリティｑｄと、ローカルのパリティｘｃ、ｙｃとから、ノード１０１Ａのパリティｐａとノード１０１Ａのパリティｐｂを復元する。ここで、ノード１０１Ｄは、ノード１０１Ｄのローカルユーザデータｄ１ｄ、ｄ２ｄからパリティｑｄを復元してもよいし、ローカルにパリティｐｄを保存していれば、パリティｐｄで代用してもよい。【０４８７】
ノード１０１Ｄは、ノード１０１Ｃからパリティｑｃを取得し、パリティｑｃと、ローカルのパリティｘｄ、ｙｄとから、ノード１０１Ａ及び１０１Ｂのｑパリティ（ｑａ、ｑｂパリティ）を復元する。ここでノード１０１Ｃは、ノード１０１Ｃのローカルユーザデータｄ１ｃ、ｄ２ｃからパリティｑｃを復元する。【０４８８】
さらに、ノード１０１Ｃは、ノード１０１Ｄにより復元されたパリティｑａと、ノード１０１Ｃにより復元されたｐａパリティとから、ユーザデータｄ１ａ、ｄ２ａを復元する。ノード１０１Ｄは、ノード１０１Ｃにより復元されたパリティｐｂと、ノード１０１Ｄにより復元されたパリティｑｂとから、ユーザデータｄ１ｂ、ｄ２ｂを復元する。以上のように、２段階の復元処理により、ライトデータを回復することができる。【０４８９】
図４１は、実施例３の冗長化先変更処理を示す。【０４９０】
この図は、本実施例の冗長化処理のための冗長化先変更処理を示す。この図は、ノード１０１Ａ〜１０１Ｄの構成で組まれていたシステムに対し、新たなノード１０１Ｅを追加したときに、冗長化先を変更する例を示す。【０４９１】
旧冗長化先であるノード１０１Ｃ上にユーザデータの冗長コードを格納していたノード１０１Ａ、１０１Ｂ、１０１Ｄは、Ｃｌａｓｓ１  ｃｏｄｅを再生成し、Ｃｌａｓｓ１  ｃｏｄｅを旧冗長化先以外のノードへ転送する。更に、旧冗長化先であるノード１０１Ｃは、Ｃｌａｓｓ２  ｃｏｄｅを消去する。【０４９２】
具体的には、ノード１０１Ａは、ローカルドライブからライトデータｄ１ａ、ｄ２ａを読み出し、読み出されたライトデータｄ１ａ、ｄ２ａから、ノード１０１Ｃへ転送したパリティｐａを再生成し、ノード１０１Ｂに転送し、さらに、パリティｐａの冗長化先を変更したことを、ノード１０１Ｃに通知する。ノード１０１Ｂ、１０１Ｄも、パリティｐｂ、ｑｄに対して同様の処理を夫々行う。ノード１０１Ｃは、パリティｐａ、ｐｂ、ｑｄの全ての冗長化先が変更されたことを示す通知を受信すると、これらのパリティから生成されたＣｌａｓｓ２  ｃｏｄｅであるパリティｘｃ、ｙｃを消去する。この通知は、変更前のパリティの消去要求であってもよい。さらに、新冗長化先であるノード１０１Ｅは、ノード１０１Ｄから転送されたパリティｑｄと、ノード１０１Ａ、１０１Ｃから夫々転送されてきたデータｄ２ａ及びパリティｐｃとから、Ｃｌａｓｓ２  ｃｏｄｅであるパリティｘｅ、ｙｅを生成し、それらをドライブへ格納する。【０４９３】
以上のようにして、分散型ストレージシステムは、冗長コードの格納位置を変更することができる。【０４９４】
以上の各実施例によれば、分散型ストレージシステムは、障害が発生した計算機ノードのデータを復旧する際、アプリケーションプログラムと、当該アプリケーションプログラムによりアクセスされるユーザデータとを、復旧先の計算機ノードに復旧する。更に、復旧したユーザデータ及び冗長コードを消失したユーザデータに対し、新たなユーザデータの組み合わせから冗長コードを再生成する。【０４９５】
このように、データの冗長度を低下させずに、アプリケーションプログラムと当該アプリケーションプログラムがアクセスするデータを同一計算機ノードに維持することで、ネットワークを介さないデータの読み出しを実現し、レイテンシ及びスループットを向上させることができる。【０４９６】
用語について説明する。計算機システムは、分散型ストレージシステム等に対応する。計算機は、計算機ノード１０１等に対応する。記憶デバイスは、ドライブ１０５等に対応する。論理記憶領域は、プールボリューム内の領域等に対応する。ユーザデータ領域は、ストライプ、ライトデータタイプの領域等に対応する。冗長コード領域は、冗長コードタイプの領域等に対応する。グループは、保護レイヤ＃２（サイト保護レイヤ）のストライプタイプ等に対応する。グループ情報は、静的マッピングテーブル５０６等に対応する。冗長コードは、保護レイヤ＃２の冗長コード等に対応する。不揮発性半導体メモリは、フラッシュメモリ等に対応する。一次冗長コードは、Ｃｌａｓｓ１  Ｃｏｄｅ等に対応する。冗長コードは、実施例１及び２の冗長コード、Ｃｌａｓｓ２  Ｃｏｄｅ等に対応する。制御プログラムは、ストレージプログラム３０２、管理プログラム３０３等に対応する。ライトコマンドは、Ｄ＿ＷＲＩＴＥコマンド３６０１等に対応する。冗長コード生成コマンドは、Ｐ＿ＷＲＩＴＥコマンド３６０２等に対応する。【０４９７】
以上、本発明の実施形態を説明したが、これは本発明の説明のための例示であって、本発明の範囲を上記構成に限定する趣旨ではない。本発明は、他の種々の形態でも実施する事が可能である。
【符号の説明】
【０４９８】
１０１…計算機ノード、  １０５…ドライブ、  １０７…仮想ボリューム、  ２０１…ドメイン、  ２０２…内部ネットワーク、  ２０３…バックエンドネットワーク、  ２０４…外部ネットワーク、  ２０５…メモリ、  ２０６…プロセッサ、  ２０７…プロセッサパッケージ、  ２０８…バックエンドポート、  ４０１…プールボリューム
【図１】
2017145223.tif 000003
【図２】
2017145223.tif 000004
【図３】
2017145223.tif 000005
【図４】
2017145223.tif 000006
【図５】
2017145223.tif 000007
【図６】
2017145223.tif 000008
【図７】
2017145223.tif 000009
【図８】
2017145223.tif 000010
【図９】
2017145223.tif 000011
【図１０】
2017145223.tif 000012
【図１１】
2017145223.tif 000013
【図１２】
2017145223.tif 000014
【図１３】
2017145223.tif 000015
【図１４】
2017145223.tif 000016
【図１５】
2017145223.tif 000017
【図１６】
2017145223.tif 000018
【図１７】
2017145223.tif 000019
【図１８】
2017145223.tif 000020
【図１９】
2017145223.tif 000021
【図２０】
2017145223.tif 000022
【図２１】
2017145223.tif 000023
【図２２】
2017145223.tif 000024
【図２３】
2017145223.tif 000025
【図２４】
2017145223.tif 000026
【図２５】
2017145223.tif 000027
【図２６】
2017145223.tif 000028
【図２７】
2017145223.tif 000029
【図２８】
2017145223.tif 000030
【図２９】
2017145223.tif 000031
【図３０】
2017145223.tif 000032
【図３１】
2017145223.tif 000033
【図３２】
2017145223.tif 000034
【図３３】
2017145223.tif 000035
【図３４】
2017145223.tif 000036
【図３５】
2017145223.tif 000037
【図３６】
2017145223.tif 000038
【図３７】
2017145223.tif 000039
【図３８】
2017145223.tif 000040
【図３９】
2017145223.tif 000041
【図４０】
2017145223.tif 000042
【図４１】
2017145223.tif 000043
【国際調査報告】
2017145223.tif 000044
2017145223.tif 000045