(57)【特許請求の範囲】
【請求項１】
複数のノードを含むストレージシステムであって、
前記複数のノードの其々は、ストレージデバイスと、前記ストレージデバイスにデータを格納するコントローラと、を有し、
前記複数のノードのコントローラのうち、少なくとも１以上のコントローラは、
複数のデータと、前記複数のデータに対応する冗長データとからなる第１所定数のデータ要素で、データセットを構成し、
前記データセットの前記第１所定数のデータ要素を、前記複数のノードのうち、第１所定数の第１ノードに分散して配置し、
前記データセットを構成するデータ要素の数を、前記第１所定数から第２所定数増加させる指示を受信すると、前記データセットの前記第１所定数のデータ要素と、第２所定数のゼロデータとを、新たなデータ要素としてデータセットを再構成し、
前記再構成したデータセットのデータ要素を、前記第１所定数の前記第１ノードと第２所定数の第２ノードに分散させる配置であって、前記再構成したデータセットのデータ要素のうち、前記第２所定数の前記第２ノードにはゼロデータまたは前記冗長データを配置するように制御し、
少なくとも１以上の前記コントローラは、
前記再構成したデータセットのデータ要素を、前記第１所定数の前記第１ノードと前記第２所定数の前記第２ノードに分散させるとき、前記再構成したデータセットのデータ要素のうち、前記複数のデータ其々の配置先のノードは同じとなるように制御し、
前記第２所定数の前記第２ノードのうち、ゼロデータを配置したノードのコントローラは、前記ゼロデータの配置先に対する第１ライト要求を受信すると、
前記ゼロデータの配置先に前記第１ライト要求の第１ライトデータを格納し、
前記第１所定数の前記第１ノードと前記第２所定数の前記第２ノードのうち、前記再構成したデータセットの前記冗長データが配置されたノードに、前記第１ライトデータを送信するように制御し、
前記第１ライトデータを受信したノードのコントローラは、前記再構成したデータセットの前記冗長データと前記第１ライトデータを基に、前記冗長データを更新するように制御し、
前記第１所定数の前記第１ノードと第２所定数の第２ノードの其々は、各々のノードに配置する冗長データを格納するための空き容量であるパリティ空き容量を管理し、
前記第１ライトデータを受信したノードのコントローラは、
当該ノードにおけるパリティ空き容量が所定の容量以下である場合、前記再構成したデータセットの前記冗長データと前記第１ライトデータを基に、前記冗長データを更新して格納し、
当該ノードにおけるパリティ空き容量が所定の容量以下ではない場合、前記再構成したデータセットのデータ要素のうち、前記冗長データ以外のデータ要素を基に、前記再構成したデータセットの冗長データを生成し、当該パリティ空き容量の少なくとも一部に前記生成した冗長データを格納する
ことを特徴とするストレージシステム。
【請求項２】
前記第１ライトデータを受信したノードのコントローラは、前記冗長データを更新するとき、
前記第１所定数の前記第１ノードと前記第２所定数の前記第２ノードのうち、前記第１ライトデータを送信したノード以外の他ノードに配置された前記複数のデータ及びゼロデータを用いずに、前記冗長データを更新するように制御する
ことを特徴とする請求項１に記載のストレージシステム。
【請求項３】
前記第１所定数の前記第１ノードのうち、前記複数のデータを配置したノードのコントローラは、前記複数のデータのいずれかの配置先をライト先とする第２ライト要求を受信すると、
前記ライト先に配置されたデータを読み出し、
前記第２ライト要求の第２ライトデータと前記読み出したデータから中間コードを生成し、
前記第２ライトデータに基づいて、ライト先に配置されたデータを更新し、
前記第１所定数の前記第１ノードと前記第２所定数の前記第２ノードのうち、前記再構成したデータセットの前記冗長データが配置されたノードに、前記中間コードを送信するように制御し、
前記中間コードを受信したノードのコントローラは、前記再構成したデータセットの前記冗長データと前記中間コードを基に、前記冗長データを更新するように制御する
ことを特徴とする請求項１に記載のストレージシステム。
【請求項４】
前記中間コードを受信したノードのコントローラは、前記冗長データの更新するとき、
前記第１所定数の前記第１ノードと前記第２所定数の前記第２ノードのうち、前記中間コードを送信したノード以外の他ノードに配置された前記データ及びゼロデータを用いずに、前記冗長データを更新するように制御する
ことを特徴とする請求項３に記載のストレージシステム。
【請求項５】
前記データセットの前記第１所定数のデータ要素を、前記第１所定数の前記第１ノードに分散して配置しているとき、前記第１所定数の前記第１ノードの其々は、前記データセットの前記第１所定数のデータ要素の配置を管理するストライプマッピング情報を有し、
前記第１所定数の前記第１ノードのうち少なくとも１以上のノードは、
前記データセットを構成するデータ要素の数を、前記第１所定数から前記第２所定数増加させる前記指示を受信すると、前記ストライプマッピング情報を、前記再構成したデータセットのデータ要素の配置を管理するように更新し、
前記第１所定数の前記第１ノードと前記第２所定数の前記第２ノードのうちの他ノードに前記更新したストライプマッピング情報を送信するように制御し、
前記第１所定数の前記第１ノードと前記第２所定数の前記第２ノードの其々は、前記更新前のストライプマッピング情報と前記更新したストライプマッピング情報に基づいて、前記再構成したデータセットのデータ要素を分散させるように制御する
ことを特徴とする請求項１に記載のストレージシステム。
【請求項６】
前記第２所定数の前記第２ノードにゼロデータを配置する場合、前記第２所定数の前記第２ノードの其々は、当該ノードが有するストレージデバイスにゼロデータを格納する処理、または当該ノードにおけるゼロデータの配置先となるアドレスに、ゼロデータであることを示す情報を対応づけて管理する処理の少なくとも一方の処理を実行する
ことを特徴とする請求項１に記載のストレージシステム。
【請求項７】
前記第２所定数の前記第２ノードにゼロデータを配置する場合、前記第２所定数の前記第２ノードの其々は、当該ノードにおけるゼロデータの配置先となる論理アドレスに、当該ノードが有するストレージデバイスの実記憶領域を割り当てない
ことを特徴とする請求項１に記載のストレージシステム。
【請求項８】
前記第１所定数の前記第１ノードのそれぞれは、論理ボリュームを提供し、
前記再構成前のデータセットに含まれる前記複数のデータの其々は、別々のノードが提供する論理ボリュームのデータである
ことを特徴とする請求項１に記載のストレージシステム。
【請求項９】
前記データセットを構成するデータ要素の数を、前記第１所定数から第２所定数増加させる指示を受信する前に、前記複数のノードに加えて、少なくとも前記第２所定数の前記第２ノードを追加してスケールアウトする
ことを特徴とする請求項１に記載のストレージシステム。
【請求項１０】
前記再構成したデータセットのデータ要素に複数の冗長データが含まれ、前記第１所定数の前記第１ノードと第２所定数の第２ノードのうち、前記複数の冗長データと同数のノードに前記複数の冗長データを分散して配置する場合、
前記複数の冗長データが配置された各ノードは、当該ノードに配置された冗長データと、当該冗長データを生成または更新したときのデータセットの世代を識別する世代番号と、を対応づけて管理し、
前記再構成したデータセットのデータが配置されたノードに障害が発生した場合、前記冗長データが配置された少なくとも一以上のノードは、
前記複数の冗長データが配置された各ノードが管理する世代番号を取得して、他ノードで管理する世代番号が自ノードで管理する世代番号より小さいか否か判定し、
当該判定の結果、他ノードで管理する世代番号が自ノードで管理する世代番号より小さい場合、他ノードで管理する世代番号のうち、一番小さい世代番号の世代のデータセットにおける冗長データに、自ノードの冗長データをロールバックしてリビルド処理を実行し、
当該判定の結果、他ノードで管理する世代番号が自ノードで管理する世代番号より小さくない場合、自ノードで管理する冗長データでリビルド処理を実行する
ことを特徴とする請求項１に記載のストレージシステム。
【請求項１１】
複数のノードを含むストレージシステムであって、
前記複数のノードの其々は、ストレージデバイスと、前記ストレージデバイスにデータを格納するコントローラと、を有し、
前記複数のノードのコントローラのうち、少なくとも１以上のコントローラは、
複数のデータと、前記複数のデータに対応する冗長データとからなる第１所定数のデータ要素で、データセットを構成し、
前記データセットの前記第１所定数のデータ要素を、前記複数のノードのうち、第１所定数の第１ノードに分散して配置し、
前記データセットを構成するデータ要素の数を、前記第１所定数から第２所定数増加させる指示を受信すると、前記データセットの前記第１所定数のデータ要素と、第２所定数のゼロデータとを、新たなデータ要素としてデータセットを再構成し、
前記再構成したデータセットのデータ要素を、前記第１所定数の前記第１ノードと第２所定数の第２ノードに分散させる配置であって、前記再構成したデータセットのデータ要素のうち、前記第２所定数の前記第２ノードにはゼロデータまたは前記冗長データを配置するように制御し、
前記再構成したデータセットのデータ要素に複数の冗長データが含まれ、前記第１所定数の前記第１ノードと第２所定数の第２ノードのうち、前記複数の冗長データと同数のノードに前記複数の冗長データを分散して配置する場合、
前記複数の冗長データが配置された各ノードは、当該ノードに配置された冗長データと、当該冗長データを生成または更新したときのデータセットの世代を識別する世代番号と、を対応づけて管理し、
前記再構成したデータセットのデータが配置されたノードに障害が発生した場合、前記冗長データが配置された少なくとも一以上のノードは、
前記複数の冗長データが配置された各ノードが管理する世代番号を取得して、他ノードで管理する世代番号が自ノードで管理する世代番号より小さいか否か判定し、
当該判定の結果、他ノードで管理する世代番号が自ノードで管理する世代番号より小さい場合、他ノードで管理する世代番号のうち、一番小さい世代番号の世代のデータセットにおける冗長データに、自ノードの冗長データをロールバックしてリビルド処理を実行し、
当該判定の結果、他ノードで管理する世代番号が自ノードで管理する世代番号より小さくない場合、自ノードで管理する冗長データでリビルド処理を実行する
ことを特徴とするストレージシステム。
【請求項１２】
少なくとも１以上の前記コントローラは、
前記再構成したデータセットのデータ要素を、前記第１所定数の前記第１ノードと前記第２所定数の前記第２ノードに分散させるとき、前記再構成したデータセットのデータ要素のうち、前記複数のデータ其々の配置先のノードは同じとなるように制御する
ことを特徴とする請求項１１に記載のストレージシステム。
【請求項１３】
前記第２所定数の前記第２ノードのうち、ゼロデータを配置したノードのコントローラは、前記ゼロデータの配置先に対する第１ライト要求を受信すると、
前記ゼロデータの配置先に前記第１ライト要求の第１ライトデータを格納し、
前記第１所定数の前記第１ノードと前記第２所定数の前記第２ノードのうち、前記再構成したデータセットの前記冗長データが配置されたノードに、前記第１ライトデータを送信するように制御し、
前記第１ライトデータを受信したノードのコントローラは、前記再構成したデータセットの前記冗長データと前記第１ライトデータを基に、前記冗長データを更新するように制御する
ことを特徴とする請求項１２に記載のストレージシステム。
【請求項１４】
前記第１ライトデータを受信したノードのコントローラは、前記冗長データを更新するとき、
前記第１所定数の前記第１ノードと前記第２所定数の前記第２ノードのうち、前記第１ライトデータを送信したノード以外の他ノードに配置された前記複数のデータ及びゼロデータを用いずに、前記冗長データを更新するように制御する
ことを特徴とする請求項１３に記載のストレージシステム。
【請求項１５】
前記第１所定数の前記第１ノードのうち、前記複数のデータを配置したノードのコントローラは、前記複数のデータのいずれかの配置先をライト先とする第２ライト要求を受信すると、
前記ライト先に配置されたデータを読み出し、
前記第２ライト要求の第２ライトデータと前記読み出したデータから中間コードを生成し、
前記第２ライトデータに基づいて、ライト先に配置されたデータを更新し、
前記第１所定数の前記第１ノードと前記第２所定数の前記第２ノードのうち、前記再構成したデータセットの前記冗長データが配置されたノードに、前記中間コードを送信するように制御し、
前記中間コードを受信したノードのコントローラは、前記再構成したデータセットの前記冗長データと前記中間コードを基に、前記冗長データを更新するように制御する
ことを特徴とする請求項１１に記載のストレージシステム。
【請求項１６】
前記中間コードを受信したノードのコントローラは、前記冗長データの更新するとき、
前記第１所定数の前記第１ノードと前記第２所定数の前記第２ノードのうち、前記中間コードを送信したノード以外の他ノードに配置された前記データ及びゼロデータを用いずに、前記冗長データを更新するように制御する
ことを特徴とする請求項１５に記載のストレージシステム。
【請求項１７】
前記データセットの前記第１所定数のデータ要素を、前記第１所定数の前記第１ノードに分散して配置しているとき、前記第１所定数の前記第１ノードの其々は、前記データセットの前記第１所定数のデータ要素の配置を管理するストライプマッピング情報を有し、
前記第１所定数の前記第１ノードのうち少なくとも１以上のノードは、
前記データセットを構成するデータ要素の数を、前記第１所定数から前記第２所定数増加させる前記指示を受信すると、前記ストライプマッピング情報を、前記再構成したデータセットのデータ要素の配置を管理するように更新し、
前記第１所定数の前記第１ノードと前記第２所定数の前記第２ノードのうちの他ノードに前記更新したストライプマッピング情報を送信するように制御し、
前記第１所定数の前記第１ノードと前記第２所定数の前記第２ノードの其々は、前記更新前のストライプマッピング情報と前記更新したストライプマッピング情報に基づいて、前記再構成したデータセットのデータ要素を分散させるように制御する
ことを特徴とする請求項１１に記載のストレージシステム。
【請求項１８】
前記第２所定数の前記第２ノードにゼロデータを配置する場合、前記第２所定数の前記第２ノードの其々は、当該ノードが有するストレージデバイスにゼロデータを格納する処理、または当該ノードにおけるゼロデータの配置先となるアドレスに、ゼロデータであることを示す情報を対応づけて管理する処理の少なくとも一方の処理を実行する
ことを特徴とする請求項１１に記載のストレージシステム。
【請求項１９】
前記第２所定数の前記第２ノードにゼロデータを配置する場合、前記第２所定数の前記第２ノードの其々は、当該ノードにおけるゼロデータの配置先となる論理アドレスに、当該ノードが有するストレージデバイスの実記憶領域を割り当てない
ことを特徴とする請求項１１に記載のストレージシステム。
【請求項２０】
前記第１所定数の前記第１ノードのそれぞれは、論理ボリュームを提供し、
前記再構成前のデータセットに含まれる前記複数のデータの其々は、別々のノードが提供する論理ボリュームのデータである
ことを特徴とする請求項１１に記載のストレージシステム。
【請求項２１】
前記データセットを構成するデータ要素の数を、前記第１所定数から第２所定数増加させる指示を受信する前に、前記複数のノードに加えて、少なくとも前記第２所定数の前記第２ノードを追加してスケールアウトする
ことを特徴とする請求項１１に記載のストレージシステム。
【請求項２２】
複数のノードを含むシステムの制御方法であって、
前記複数のノードの其々は、ストレージデバイスと、前記ストレージデバイスにデータを格納するコントローラと、を有し、
前記複数のノードのコントローラのうち、少なくとも１以上のコントローラは、
複数のデータと、前記複数のデータに対応する冗長データとからなる第１所定数のデータ要素で、データセットを構成するステップと、
前記データセットの前記第１所定数のデータ要素を、前記複数のノードのうち、第１所定数の第１ノードに分散して配置するステップと、
前記データセットを構成するデータ要素の数を、前記第１所定数から第２所定数増加させる指示を受信すると、前記データセットの前記第１所定数のデータ要素と、第２所定数のゼロデータとを、新たなデータ要素としてデータセットを再構成するステップと、
前記再構成したデータセットのデータ要素を、前記第１所定数の前記第１ノードと第２所定数の第２ノードに分散させる配置であって、前記再構成したデータセットのデータ要素のうち、前記第２所定数の前記第２ノードにはゼロデータまたは前記冗長データを配置するステップと、
を有する処理を実行し、
少なくとも１以上の前記コントローラは、
前記再構成したデータセットのデータ要素を、前記第１所定数の前記第１ノードと前記第２所定数の前記第２ノードに分散させるとき、前記再構成したデータセットのデータ要素のうち、前記複数のデータ其々の配置先のノードは同じとなるように制御し、
前記第２所定数の前記第２ノードのうち、ゼロデータを配置したノードのコントローラは、前記ゼロデータの配置先に対する第１ライト要求を受信すると、
前記ゼロデータの配置先に前記第１ライト要求の第１ライトデータを格納し、
前記第１所定数の前記第１ノードと前記第２所定数の前記第２ノードのうち、前記再構成したデータセットの前記冗長データが配置されたノードに、前記第１ライトデータを送信するように制御し、
前記第１ライトデータを受信したノードのコントローラは、前記再構成したデータセットの前記冗長データと前記第１ライトデータを基に、前記冗長データを更新するように制御し、
前記第１所定数の前記第１ノードと第２所定数の第２ノードの其々は、各々のノードに配置する冗長データを格納するための空き容量であるパリティ空き容量を管理し、
前記第１ライトデータを受信したノードのコントローラは、
当該ノードにおけるパリティ空き容量が所定の容量以下である場合、前記再構成したデータセットの前記冗長データと前記第１ライトデータを基に、前記冗長データを更新して格納し、
当該ノードにおけるパリティ空き容量が所定の容量以下ではない場合、前記再構成したデータセットのデータ要素のうち、前記冗長データ以外のデータ要素を基に、前記再構成したデータセットの冗長データを生成し、当該パリティ空き容量の少なくとも一部に前記生成した冗長データを格納する
ことを特徴とする制御方法。
【請求項２３】
複数のノードを含むシステムの制御方法であって、
複数のデータと、前記複数のデータに対応する冗長データとからなる第１所定数のデータ要素で、データセットを構成するステップと、
前記データセットの前記第１所定数のデータ要素を、前記複数のノードのうち、第１所定数の第１ノードに分散して配置するステップと、
前記データセットを構成するデータ要素の数を、前記第１所定数から第２所定数増加させる指示を受信すると、前記データセットの前記第１所定数のデータ要素と、第２所定数のゼロデータとを、新たなデータ要素としてデータセットを再構成するステップと、
前記再構成したデータセットのデータ要素を、前記第１所定数の前記第１ノードと第２所定数の第２ノードに分散させる配置であって、前記再構成したデータセットのデータ要素のうち、前記第２所定数の前記第２ノードにはゼロデータまたは前記冗長データを配置するステップと、
を有し、
前記再構成したデータセットのデータ要素に複数の冗長データが含まれ、前記第１所定数の前記第１ノードと第２所定数の第２ノードのうち、前記複数の冗長データと同数のノードに前記複数の冗長データを分散して配置する場合、
前記複数の冗長データが配置された各ノードは、当該ノードに配置された冗長データと、当該冗長データを生成または更新したときのデータセットの世代を識別する世代番号と、を対応づけて管理し、
前記再構成したデータセットのデータが配置されたノードに障害が発生した場合、前記冗長データが配置された少なくとも一以上のノードは、
前記複数の冗長データが配置された各ノードが管理する世代番号を取得して、他ノードで管理する世代番号が自ノードで管理する世代番号より小さいか否か判定し、
当該判定の結果、他ノードで管理する世代番号が自ノードで管理する世代番号より小さい場合、他ノードで管理する世代番号のうち、一番小さい世代番号の世代のデータセットにおける冗長データに、自ノードの冗長データをロールバックしてリビルド処理を実行し、
当該判定の結果、他ノードで管理する世代番号が自ノードで管理する世代番号より小さくない場合、自ノードで管理する冗長データでリビルド処理を実行する
ことを特徴とする制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ストレージシステム、コンピュータ読み取り可能な記録媒体、システムの制御方法に関する。
【背景技術】
【０００２】
本技術分野の背景技術を開示する文献として、国際公開第２０１６／０５２６６５号（特許文献１）がある。この特許文献１には、ストレージシステムを構成する複数のノードにデータを分散して配置する技術について記載されている。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】国際公開第２０１６／０５２６６５号
【発明の概要】
【発明が解決しようとする課題】
【０００４】
ストレージシステムの可用性を高めるために、複数のノードの間で、データの冗長性を持たせる場合がある。この場合、一部のノードで障害が起きたとしても、他のノードのデータに基づいて、障害が起きたノード（障害ノード）のデータを復旧（リビルド）することができる。例えば、Ｘ個のデータと、当該Ｘ個のデータに対応するＹ個の冗長データをデータ要素とするデータセットについて、Ｘ＋Ｙ個の異なるノードに各データ要素を分散させた場合、Ｙ個までのノードの障害であれば、障害が起きていない残りのノードのデータ要素を用いて、障害ノードのデータ要素を復旧可能である（Ｘ，Ｙは１以上の整数とする）。なお、ストレージシステムのノード数は、Ｘ＋Ｙ個のみに限られず、Ｘ＋Ｙ個以上であれば良い。また、データを冗長化する方法は、ノード間でデータを複製（レプリケーション）する方法や、冗長データとしてパリティまたは消失訂正符号（Ｅｒａｓｕｒｅ  Ｃｏｄｅ）を用いる方法等、様々な方法がある。【０００５】
ところで、近年、ストレージシステムへの投資額を抑えたいとの要求が高まっており、データを保管するコストの低減がますます重要となってきている。データを保管するコストを低減する手段の一つとして、データに対する冗長データの割合を下げて、ストレージシステムのストレージの容量効率を高めることが考えられる。上述した例でいえば、Ｘ個のデータとＹ個の冗長データをデータ要素とするデータセットと比べて、Ｘ＋Ｚ個のデータとＹ個の冗長データをデータ要素とするデータセットは、データセットの冗長度はＹのままであるが、データに対する冗長データの割合は下がり、ストレージの容量効率が向上する（Ｚは１以上の整数とする）。【０００６】
このように、データセットのデータ要素数を増やす方法を採用するのに適した一例として、ＩｏＴ（Ｉｎｔｅｒｎｅｔ  ｏｆ  Ｔｈｉｎｇｓ）プラットフォーム等におけるデータレイク、すなわち多様なビッグデータの活用が容易なデータ管理システムにおいて、例えばデータの増大にあわせてストレージの容量効率を見直す場合が挙げられる。また、一例として、ストレージシステムに新たなノードを追加する場合が挙げられる。具体例としては、事業をスモールスタートするときには、ストレージシステムへの初期投資額を抑えるために少ないノードで運用し、事業で提供するサービスへの需要拡大にともない、新たにノードを追加してストレージシステムをスケールアウトする例が挙げられる。なお、これらの例は、あくまで一例であり、上述した方法を採用するシステムを何ら制限するものではない。【０００７】
特許文献１は、ストレージシステムに新たなノードを追加するとき、データを再配置することが開示されている。このように複数のノード間でデータを再配置する場合、ストレージシステムのデータ量が大きいほどノード間でのデータ転送量が増大して、ノード間を接続するネットワークの負荷や各ノードの負荷が増大し、Ｉ／Ｏ（Ｉｎｐｕｔ／Ｏｕｔｐｕｔ）性能等のシステム性能が一時的に低下する等の影響がでる恐れがある。【０００８】
そこで、複数のノードにデータ要素を分散して配置されたデータセットについて、データ要素を増加させるとき、ノード間でのデータ転送量を低減可能なストレージシステムを提供する。
【課題を解決するための手段】
【０００９】
上記課題を解決するために、本発明の一態様であるストレージシステムは、複数のノードを含み、複数のノードの其々はコントローラを有する。複数のノードのコントローラのうち、少なくとも１以上のコントローラは、複数のデータと、複数のデータに対応する冗長データとからなる第１所定数のデータ要素で、データセットを構成する。少なくとも１以上のコントローラは、データセットの第１所定数のデータ要素を、複数のノードのうち、第１所定数の第１ノードに分散して配置する。少なくとも１以上のコントローラは、データセットを構成するデータ要素の数を、第１所定数から第２所定数増加させる指示を受信すると、データセットの第１所定数のデータ要素と、第２所定数のゼロデータとを、新たなデータ要素としてデータセットを再構成する。少なくとも１以上のコントローラは、再構成したデータセットのデータ要素を、第１所定数の第１ノードと第２所定数の第２ノードに分散させる配置であって、再構成したデータセットのデータ要素のうち、第２所定数の第２ノードにはゼロデータまたは冗長データを配置するように制御する。
【発明の効果】
【００１０】
本発明によれば、ストレージシステムが有する複数のノードにデータ要素を分散配置されたデータセットについて、データ要素を増加させるとき、ノード間でのデータ転送量を低減可能であり、ストレージシステムの性能低下を抑えることができる。上記した以外の課題、構成および効果は、以下の発明を実施するための形態の説明により明らかにされる。
【図面の簡単な説明】
【００１１】
【図１】実施例１における分散型ストレージシステムの構成を示す図である。
【図２】分散型ストレージシステムのライト処理の概要を示す図である。
【図３】メモリの構成を示す図である。
【図４Ａ】ストライプマッピングテーブルの構成の概念を示す図である。
【図４Ｂ】ストライプマッピングテーブルの構成の具体例を示す図である。
【図５】キャッシュ管理テーブルの構成を示す図である。
【図６】パリティ管理テーブルの構成を示す図である。
【図７】ノード状態管理テーブルの構成を示す図である。
【図８Ａ】データ数とノード数を同時に増設するときのストライプマッピングテーブルの更新例を示す概念図である。
【図８Ｂ】データ数とノード数を同時に増設するときの逆引きテーブルの更新例を示す概念図である。
【図９Ａ】データ数とノード数を同時に減設するときのストライプマッピングテーブルの更新例を示す概念図である。
【図９Ｂ】データ数とノード数を同時に減設するときの逆引きテーブルの更新例を示す概念図である。
【図１０】ＥＣグループ拡縮処理のフローチャートである。
【図１１】クラスタ再構築処理のフローチャートである。
【図１２】ホストＩ／Ｏ処理のフローチャートである。
【図１３】ロールバック処理のフローチャートである。
【図１４】実施例２における分散型ストレージシステムの構成を示す図である。
【図１５】データセットのデータ要素を増加させるときの処理の一例を示す模式図である。
【発明を実施するための形態】
【００１２】
以下、図面を参照して本発明の実施形態を説明する。以下の記載および図面は、本発明を説明するための例示であって、説明の明確化のため、適宜、省略および簡略化がなされている。また、実施形態の中で説明されている特徴の組み合わせの全てが発明の解決手段に必須であるとは限らない。本発明が実施形態に制限されることは無く、本発明の思想に合致するあらゆる応用例が本発明の技術的範囲に含まれる。本発明は、当業者であれば本発明の範囲内で様々な追加や変更等を行うことができる。本発明は、他の種々の形態でも実施する事が可能である。特に限定しない限り、各構成要素は複数でも単数でも構わない。
【００１３】
以下の説明では、「テーブル」、「リスト」、「キュー」等の表現にて各種情報を説明することがあるが、各種情報は、これら以外のデータ構造で表現されていてもよい。データ構造に依存しないことを示すために「ＸＸテーブル」、「ＸＸリスト」等を「ＸＸ情報」と呼ぶことがある。各情報の内容を説明する際に、「識別情報」、「識別子」、「名」、「ＩＤ」、「番号」等の表現を用いるが、これらについてはお互いに置換が可能である。
【００１４】
また、以下の説明では、同種の要素を区別しないで説明する場合には、参照符号または参照符号における共通番号を使用し、同種の要素を区別して説明する場合は、その要素の参照符号を使用または参照符号に代えてその要素に割り振られたＩＤを使用することがある。
【００１５】
また、以下の説明では、プログラムを実行して行う処理を説明する場合があるが、プログラムは、プロセッサ（例えばＣＰＵ）によって実行されることで、定められた処理を、適宜に記憶資源（例えばメモリ）および／またはインターフェースデバイス（例えば通信ポート）等を用いながら行うため、処理の主体がプロセッサとされてもよい。同様に、プログラムを実行して行う処理の主体が、プロセッサを有するコントローラ、装置、システム、計算機、ノード、ストレージシステム、ストレージ装置、サーバ、管理計算機、クライアント、またはホストであってもよい。プログラムを実行して行う処理の主体（例えばプロセッサ）は、処理の一部または全部を行うハードウェア回路を含んでもよい。
【００１６】
プログラムは、プログラムソースから計算機のような装置にインストールされてもよい。プログラムソースは、例えば、プログラム配布サーバまたは計算機が読み取り可能な記憶メディアであってもよい。プログラムソースがプログラム配布サーバの場合、プログラム配布サーバはプロセッサ（例えばＣＰＵ）と記憶資源を含み、記憶資源はさらに配布プログラムと配布対象であるプログラムとを記憶してよい。そして、プログラム配布サーバのプロセッサが配布プログラムを実行することで、プログラム配布サーバのプロセッサは配布対象のプログラムを他の計算機に配布してよい。また、以下の説明において、２以上のプログラムが１つのプログラムとして実現されてもよいし、１つのプログラムが２以上のプログラムとして実現されてもよい。
【００１７】
以下の説明において、各フローチャートにおける判定のステップで「Ｙ」はＹｅｓを表し、「Ｎ」はＮｏを表すものとする。
【実施例１】
【００１８】
本実施形態における分散型ストレージシステム１００は、それぞれがストレージデバイスを含む複数のノード１０１を有し、ノード１０１間がネットワーク１０３により接続された構成である。分散型ストレージシステム１００は、複数のノード１０１のストレージデバイスによって、ストレージプールを実現する仮想的なストレージシステムを実現する。【００１９】
ストレージデバイスは、例えばＨＤＤ（Ｈａｒｄ  Ｄｉｓｋ  Ｄｒｉｖｅ）やＳＳＤ（Ｓｏｌｉｄ  Ｓｔａｔｅ  Ｄｒｉｖｅ）等の１台のストレージドライブ、複数台のストレージドライブ、複数台のストレージドライブを含むＲＡＩＤ（Ｒｅｄｕｎｄａｎｔ  Ａｒｒａｙｓ  ｏｆ  Ｉｎｄｅｐｅｎｄｅｎｔ  Ｄｉｓｋｓ）装置、または複数のＲＡＩＤ装置であっても良い。以下の説明において、ストレージデバイスは、ドライブ１０５と表現されることがある。【００２０】
ストライプとは、データブロック、またはデータ保護のためにデータブロックから生成されるパリティブロック（Ｃｌａｓｓ１  ｃｏｄｅ）のいずれかのデータユニットである。ストライプは、ノード１０１内のストレージデバイスに格納されると共に、他のノード１０１におけるパリティブロック（Ｃｌａｓｓ２  ｃｏｄｅ）の生成において使用される。【００２１】
ストライプグループは、ストライプ（データブロックまたはＣｌａｓｓ１  ｃｏｄｅ）と、当該ストライプから生成されるＣｌａｓｓ２  ｃｏｄｅの組合せである。各ストライプが属するストライプグループは、例えば、当該ストライプの論理アドレスと、当該ストライプを格納するノード１０１とによって決定される。【００２２】
ストライプグループは、データセットと呼ぶことがある。データセットは、所定数のデータ要素で構成される。ここで、データ要素とは、データセットに含まれるデータブロックとＣｌａｓｓ１  ｃｏｄｅとＣｌａｓｓ２  ｃｏｄｅである。データセットは、データブロックとＣｌａｓｓ２  ｃｏｄｅで構成されてもよく、Ｃｌａｓｓ１  ｃｏｄｅは含まれていてもよいし含まれなくてもよい。【００２３】
また、本実施例では、Ｅｒａｓｕｒｅ  Ｃｏｄｉｎｇ（ＥＣ）により、データブロックからＣｌａｓｓ２  ｃｏｄｅを生成する例を開示しており、ストライプグループをＥＣグループと呼ぶことがある。但し、ＥＣグループと記載しても、Ｃｌａｓｓ２  ｃｏｄｅの生成方法は必ずしもＥＣに限定されない。【００２４】
ストライプグループを構成するストライプについて、データブロックの数をＤ数と呼び、Ｃｌａｓｓ２  ｃｏｄｅの数をＰ数と呼ぶことがある。また、ストライプグループの構成について、自然数ｍ、ｎを用いて、ｍＤｎＰと表現する場合、ｍ個のデータブロックとｎ個のＣｌａｓｓ２  ｃｏｄｅでストライプグループが構成されることを示す。【００２５】
ホストは、分散型ストレージシステム１００にアクセスする計算機、当該計算機で動作するプロセッサまたは当該プロセッサが実行するプログラムである。【００２６】
データストアノードとは、特定のストライプグループに着目したとき、当該ストライプグループのデータブロックをローカルのドライブ１０５に格納するノード１０１である。パリティストアノードとは、特定のストライプグループに着目したとき、当該ストライプグループのＣｌａｓｓ２  ｃｏｄｅを、ローカルのドライブ１０５に格納するノード１０１である。【００２７】
図１は、実施例１における分散型ストレージシステム１００の構成を示す図である。分散型ストレージシステム１００は、複数のノード１０１と、複数のノード１０１間を接続するネットワーク１０３を有する。分散型ストレージシステム１００は、計算機システム、または情報処理システムと呼ばれてもよい。ネットワーク１０３は、バックエンドネットワークと呼ばれてもよい。【００２８】
ノード１０１は、計算機であればよく、例えば一般的なサーバ計算機の構成を有している。ノード１０１は、計算機、計算機ノード、サーバ、ストレージ装置、またはストレージシステムのいずれかの表現で呼ばれてもよい。【００２９】
ノード１０１は、バックエンドポート１０８、コントローラ１０７、ドライブ１０５、内部ネットワーク１０２を有する。バックエンドポート１０８、コントローラ１０７、ドライブ１０５は、内部ネットワーク１０２を介して接続されている。ノード１０１の各構成要素（バックエンドポート１０８、コントローラ１０７、ドライブ１０５、内部ネットワーク１０２）は、それぞれ１つでもよいし、複数あってもよい。なお、ノード１０１のハードウェア構成は、この例に限定されない。例えば、ノード１０１に、圧縮等の特定の処理を行う専用ハードウェア回路がさらに追加されてもよい。【００３０】
各ノード１０１のバックエンドポート１０８はネットワーク１０３と接続しており、ノード１０１はネットワーク１０３を介して他のノード１０１と接続する。バックエンドポート１０８は、ポートと呼ばれてもよい。【００３１】
コントローラ１０７は、１つまたは複数のメモリ１０４と、１つまたは複数のプロセッサ１０６と、を有する。コントローラ１０７は、例えばプロセッサパッケージであってもよい。プロセッサ１０６は、プログラムを実行する制御部であって、例えばＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）であってもよい。プロセッサ１０６は、メモリ１０４内のプログラムを実行して、コマンドに応じた各種の処理を実行する。プロセッサ１０６は、プログラムを実行する演算部または制御部であれば良い。以降では、プロセッサ１０６がメモリ１０４上のプログラムを実行して行われる処理を、ノード１０１やコントローラ１０７を処理の主体として記載することがある。【００３２】
メモリ１０４は、プロセッサ１０６により実行されるプログラムを格納する記憶部である。メモリ１０４は、揮発性のＤＲＡＭであってもよいし、不揮発のＳＣＭ（Ｓｔｏｒａｇｅ  Ｃｌａｓｓ  Ｍｅｍｏｒｙ）などを用いてもよい。【００３３】
ドライブ１０５は、ストレージデバイスであればよく、ストレージデバイスと呼ばれてもよい。ドライブ１０５は、例えば、ＦＣ（Ｆｉｂｒｅ  Ｃｈａｎｎｅｌ）、ＳＡＳ（Ｓｅｒｉａｌ  Ａｔｔａｃｈｅｄ  ＳＣＳＩ）、ＳＡＴＡ（Ｓｅｒｉａｌ  Ａｄｖａｎｃｅｄ  Ｔｅｃｈｎｏｌｏｇｙ  Ａｔｔａｃｈｍｅｎｔ）などのインタフェースを持つハードディスクドライブや、上記インタフェースに加えてＮＶＭｅ（Ｎｏｎ-Ｖｏｌａｔｉｌｅ  Ｍｅｍｏｒｙ  Ｅｘｐｒｅｓｓ）などのインタフェースを持つＳＳＤ（Ｓｏｌｉｄ  Ｓｔａｔｅ  Ｄｒｉｖｅ）などである。また、ドライブ１０５は、ＮＡＮＤ、ＰＲＡＭ、ＲｅＲＡＭなどのＳＣＭを用いてもよいし、揮発性のメモリを用いてもよい。ドライブ１０５は、揮発性メモリを使用する場合、バッテリによってストレージデバイスを不揮発化してもよい。【００３４】
ノード１０１は、メモリ１０４の一部を、キャッシュまたはバッファとして使用することができる。また、ノード１０１は、ＳＳＤなどドライブ１０５の一部を、キャッシュまたはバッファとして使用することができる。【００３５】
ノード１０１上でハイパーバイザが動作し、ハイパーバイザ上で１または複数の仮想マシンが稼働しても良い。仮想マシン上で、ＯＳやプログラムが動作してもよい。すなわち、ＯＳやプログラムは、ノード（物理計算機）１０１のハードウェア上で動作することもあれば、仮想マシン上で動作することもある。【００３６】
また、ホストは、仮想マシン上で動作するアプリケーションプログラム（ホストプログラム）２０１であってもよいし、物理的なホスト計算機（ホストコンピュータ）であっても良い。ＯＳやストレージコントローラプログラムが動作する仮想マシンと、ホストプログラムが動作する仮想マシンとが、同一のノード１０１上にあっても、ネットワーク１０３を介して接続する異なるノード１０１上にあってもよい。ここで、ストレージコントローラプログラムとは、分散型ストレージシステム１００を制御するためのプログラムであって、例えば図３に示す各種プログラム３０５〜３０７の一部または全部を含むプログラムである。また、ストレージコントローラプログラムは、ハイパーバイザの一部であっても良い。【００３７】
また、分散型ストレージシステム１００が複数のノード１０１を有するとき、ノード１０１の一部が異なるサイトにあっても良い。また、分散型ストレージシステム１００のノード１０１の一部または全部がクラウド上にあって、ネットワークを介して、ユーザにサービスが提供されても良い。【００３８】
このような構成例であっても、本発明を適用することができる。一般的に仮想マシンは、ハイパーバイザが提供する仮想的なハードウェア資源の上で稼動し、ハードウェア資源へのアクセスはハイパーバイザを経由する形態であるが、ハイパーバイザが備える機能によっては、ハードウェア資源を仮想マシンが直接アクセス可能となる場合がある。いわゆるパススルー技術である。【００３９】
以下、分散型ストレージシステム１００を主語とした処理については、特に限定しない限り、分散型ストレージシステム１００のいずれか一つのノード１０１で行ってもよいし、複数のノード１０１で連携または独立して行ってもよい。【００４０】
図１５は、分散型ストレージシステム１００が有する複数のノード１０１に、データ要素を分散して配置されたデータセットについて、データ要素を増加させるときの処理の一例を示す模式図である。【００４１】
分散型ストレージシステム１００について、ノード１０１を追加する前の構成を分散型ストレージシステム１００−１とし、ノード１０１を追加した後の構成を分散型ストレージシステム１００−２として、以下説明する。【００４２】
分散型ストレージシステム１００−１は、システムの可用性を高めるために、複数のノード１０１の間でデータの冗長性を持たせている。図１５の例によれば、Ｘ個のデータ（例えばＡｉ，Ｂｉ）と、当該Ｘ個のデータに対応するＹ個の冗長データ（例えばＰｉ）をデータ要素とするデータセットについて、Ｘ＋Ｙ個の異なるノード１０１に各データ要素を分散させている。ここで、Ｘ，Ｙは１以上の整数とする。また、ｉは１以上の整数であり、図１５において、データセットｉのデータ要素をＡｉ，Ｂｉ，Ｐｉで表している。【００４３】
分散型ストレージシステム１００−１は、Ｙ個までのノード１０１の障害であれば、障害が起きていない残りのノード１０１のデータ要素を用いて、障害が起きたノード（障害ノード）のデータ要素を復旧可能である。ここで、障害ノードのデータ要素を復旧するとは、分散型ストレージシステム１００−１で稼働する業務を停止することなく、障害ノードに格納されていたデータ要素をリビルドすることを含む。リビルド後のデータセットは、冗長度Ｙまで冗長性を回復できる。【００４４】
なお、分散型ストレージシステム１００−１のデータをバックアップしておくことで、Ｙ個を超えるノード１０１の障害が起きた場合でも、バックアップしたデータを用いて、データを復元することができる。【００４５】
図１５の分散型ストレージシステム１００−２の模式図は、各データセットについて、Ｚ個のデータをデータ要素として追加したときのデータ配置の一例を示すものである。ここで、Ｚは１以上の整数とする。Ｘ個のデータとＹ個の冗長データをデータ要素とするデータセットと比べて、Ｘ＋Ｚ個のデータとＹ個の冗長データをデータ要素とするデータセットは、データセットの冗長度はＹのままであるが、データに対する冗長データの割合は下がり、ストレージの容量効率が向上する。このように、データセットのデータ要素を増加させ、データに対する冗長データの割合を下げることで、分散型ストレージシステム１００のストレージの容量効率を高めることができる。結果として、データを保管するコストを低減することができ、分散型ストレージシステム１００への投資額を抑えることができる。【００４６】
分散型ストレージシステム１００−２は、分散型ストレージシステム１００−１に、Ｚ個以上の新たなノード１０１を追加した構成である。図１５の例でいえば、分散型ストレージシステム１００−１はＮｏｄｅ  Ｉ、Ｎｏｄｅ  ＩＩ、Ｎｏｄｅ  ＩＩＩで構成され、分散型ストレージシステム１００−２は分散型ストレージシステム１００−１にＮｏｄｅ  ＩＶを追加した構成である。この新たに追加したノードを、追加ノードと呼ぶ。【００４７】
図１５のＳ１に示すように、分散型ストレージシステム１００−２は、各データセットに追加されるＺ個のデータをゼロデータとし、そのゼロデータを追加ノードに配置するように制御する。データセットに新たに追加されたデータ要素がゼロデータであれば、データ要素を増加する前のデータセットのＸ個のデータに対応するＹ個の冗長データの値と、データ要素を増加した後のデータセットのＸ＋Ｚ個のデータに対応するＹ個の冗長データの値と、は一致する。したがって、冗長データを計算し直す必要がなく、その計算負荷をなくすことができるうえ、冗長データを計算するために各ノード１０１からデータを収集することも不要であり、ノード１０１間でのデータ転送量を低減できる。【００４８】
また、データ要素を増加する前のデータセットのＸ個のデータおよびＹ個の冗長データのデータ配置を、データ要素を増加した後も変更しないことで、ノード１０１間でのデータ移動が不要となり、ノード間１０１でのデータ転送量を低減できる。ここで、データ配置を変更しないとは、データを格納するノード１０１を変更しないことを意図するが、各ノード１０１内でデータを格納するストレージデバイスについても変更しなくて良い。【００４９】
ここで、データの分散方法として、複数のノード１０１のうち、特定のノードのみに冗長データを配置する方法と、各ノード１０１に冗長データを分散する方法がある。前者の特定のノードのみに冗長データを配置する方法では、追加ノードに配置するデータ要素を全てゼロデータとすることが可能となる。しかしながら、この方法では、冗長データの書き込みや読み出しが特定のノードに集中し、書き込みおよび読み出しの性能のボトルネックとなる可能性がある。また、各ノード１０１で消費されるストレージ容量を均一化しにくい。さらに、冗長データが配置される特定のノードで、業務アプリケーション（アプリケーションプログラム）を動作させないとすれば、プロセッサ等の計算機リソースの効率的な使用ができない可能性がある。以上の理由により、各ノード１０１に冗長データを分散する方法が、分散型ストレージシステム１００として望ましい実施形態の一つと考えられる。以下、各ノード１０１に冗長データを分散する方法を採用した場合について説明する。【００５０】
図１５のＳ２は、追加ノードに冗長データを配置する例について示す。追加ノードに、いずれのデータセットの冗長データを配置するかについては、分散型ストレージシステム１００で採用されるデータ分散方法に従って決められる。図１５の例では、４つのデータセットのデータ配置が示されており、そのうち１つのデータセットの冗長データが追加ノードに配置されている。残りの３つのデータセットについては、ゼロデータを追加ノードに配置している。【００５１】
上述のとおり、データセットに新たに追加されたデータ要素がゼロデータであれば、データ要素を増加する前の冗長データの値と、データ要素を増加した後の冗長データの値と、は一致する。したがって、追加ノードに配置する冗長データは、データ要素を増加する前の冗長データを配置していたノード（Ｎｏｄｅ  ＩＩＩ）から、当該冗長データを追加ノードに移動またはコピーすれば良い。また、冗長データを、同じデータセットの他のデータ要素から再計算して、追加ノードに配置しても良い。【００５２】
図１５のＳ３は、追加ノードに冗長データを配置する場合、データ要素を増加する前の冗長データを配置していたノード（Ｎｏｄｅ  ＩＩＩ）にゼロデータを配置することを示している。【００５３】
以上、分散型ストレージシステム１００に新たなノード１０１を追加する場合に、データセットのデータ要素数を増やすことで、ストレージの容量効率を向上させる方法について説明した。このような方法を採用するのに適した一例として、事業をスモールスタートするときには、分散型ストレージシステム１００への初期投資額を抑えるために少ないノード１０１で運用し、事業で提供するサービスへの需要拡大にともない、新たにノード１０１を追加して分散型ストレージシステム１００をスケールアウトする例が挙げられる。なお、この例は、あくまで一例であり、上述した方法を採用する分散型ストレージシステム１００を何ら制限するものではない。【００５４】
データを冗長化する方法は、ノード間でのデータを複製（レプリケーション）する方法や、冗長データとしてパリティまたは消失訂正符号（Ｅｒａｓｕｒｅ  Ｃｏｄｅ）を用いる方法等、様々な方法がある。【００５５】
分散型ストレージシステム１００のノード１０１の数（以下、ノード数とも呼ぶ）は、分散する各データセットのデータ要素の数以上であれば良い。すなわち、分散型ストレージシステム１００−１のノード数は、Ｘ＋Ｙ個のみに限られず、Ｘ＋Ｙ個以上であれば良い。同様に、分散型ストレージシステム１００−２のノード数は、Ｘ＋Ｙ＋Ｚ個のみに限られず、Ｘ＋Ｙ＋Ｚ個以上であれば良い。【００５６】
分散型ストレージシステム１００のノード数が、各データセットのデータ要素の数より多い場合でも、各データセットのデータ要素の其々は、分散型ストレージシステム１００の異なるノード１０１に分散して格納される。異なるデータセットの間で、分散するノードの組合せが異なっていても良い。【００５７】
各データセットに追加されるＺ個のデータをゼロデータとすることを上述したが、このゼロデータを配置する方法の具体例を述べる。１つ目の具体例は、ゼロデータを配置するノード１０１において、実際にゼロデータを格納する方法である。２つ目の具体例は、ゼロデータを配置するノード１０１において、当該データをゼロデータと管理する方法である。この場合、実際に当該ノード１０１のドライブ１０５にゼロデータが格納されていても、格納されていなくても良い。ゼロデータを格納不要とすることで、ゼロデータを格納する負荷を抑えることができる。また、ゼロデータを格納しない場合、当該ゼロデータの配置先となる論理アドレスに対し、当該ノード１０１が有する１以上のドライブ１０５からなる実記憶領域を割り当てても、割り当てなくても良い。ゼロデータの場合に実記憶領域を割り当てないことで、当該ノード１０１の未使用な実記憶領域を増やすことができ、ストレージの容量効率を向上できる。したがって、ゼロデータを配置するノード１０１において、当該データをゼロデータと管理する方法としては、当該ゼロデータの配置先となるアドレスに、ゼロデータであることを示す情報を対応づけて管理する方法や、当該ゼロデータの配置先となる論理アドレスに、実記憶領域を割り当てない方法等がある。ゼロデータの配置先となるアドレスに対し、読み出し要求があった場合に、ゼロデータを応答できれば、いずれの方法が採用されても良い。【００５８】
分散型ストレージシステム１００において、新たなノード１０１の追加は、ノード１０１を追加する命令を管理装置から受領したとき、または自動でノード１０１の追加を検知したときに実行しても良い。ここで、管理装置とは、分散型ストレージシステム１００を管理する装置である。データセットのデータ要素の増加は、管理装置からの命令に従って実行されて良い。新たなノード１０１の追加と、データセットのデータ要素の増加は、同じタイミングで行われても、異なるタイミングで行われても良い。【００５９】
また、新たなノード１０１を追加することは、本発明の実施に、必ずしも必須の構成でなくても良い。すなわち、データセットのデータ要素を増やした後のデータ要素数Ｘ＋Ｙ＋Ｚ個以上のノードを、分散型ストレージシステム１００−１が有していた場合、ノード１０１を追加しなくても、データセットのデータ要素を増やすことができる。【００６０】
このように、データセットのデータ要素数を増やす方法を採用するのに適した一例として、ＩｏＴ（Ｉｎｔｅｒｎｅｔ  ｏｆ  Ｔｈｉｎｇｓ）プラットフォーム等におけるデータレイク、すなわち多様なビッグデータの活用が容易なデータ管理システムにおいて、例えばデータの増大にあわせてストレージの容量効率を見直す場合が挙げられる。なお、この例は、あくまで一例であり、上述した方法を採用する分散型ストレージシステム１００を何ら制限するものではない。【００６１】
図２は、分散型ストレージシステム１００のライト処理の概要を示す図である。分散型ストレージシステム１００は、冗長化のため、ノード１０１間でデータブロックを転送する。【００６２】
以下において、ノード１０１は、データブロックに基づき一次的な冗長符号を生成して、当該データブロックとともに他のノード１０１に転送し、転送先のノード１０１で二次的な冗長符号を生成する方法について述べる。【００６３】
図２は、分散型ストレージシステム１００が有するノード１０１Ａ、１０１Ｂ、１０１Ｃ、１０１Ｄの４ノードにおいて、２Ｄ２Ｐの冗長構成でデータ保護する例を示している。つまり、分散型ストレージシステム１００は、２ノード障害時に全てのデータを回復できる冗長性を有する。【００６４】
例えば、ノード１０１Ａは、アプリケーションプログラムまたは仮想マシン２０１から受信したデータ長の長いライトデータブロック２０３を、２個のデータブロック（ａブロック２０４Ａ、ｂブロック２０４Ｂ）に分割し、さらに、それら分割したデータブロックから一次的な冗長符号であるｐ１ブロック２０５を１個生成する。この一次的な冗長符号は、例えばパリティブロック等の冗長コードであって、Ｃｌａｓｓ１  ｃｏｄｅと呼ぶことがある。【００６５】
次に、ノード１０１Ａは、データブロック２０４Ａ、２０４ＢおよびＣｌａｓｓ１  ｃｏｄｅ２０５を、他ノード１０１Ｂ〜１０１Ｄのキャッシュ（またはバッファ）に分散コピーする。図２の例では、ノード１０１Ａは、データブロック２０４Ａ、データブロック２０４Ｂ、Ｃｌａｓｓ１  ｃｏｄｅ２０５を、それぞれノード１０１Ｂ、ノード１０１Ｃ、ノード１０１Ｄにコピーする。コピー先となるノード１０１は、後述するストライプマッピングテーブル３０１を使用して、ライトデータを受信したノード番号と書き込み先アドレスから求める。以下、コピー先となるノード１０１を、宛先ノードと呼ぶことがある。【００６６】
コピーが完了した時点で、必要な冗長性が得られている（２ノード障害の回復が可能な）ため、同期的なライト処理が完了する。【００６７】
同様に、ノード１０１Ｂ〜１０１Ｄは、それぞれ受信したライトデータブロック（ＤＡＴＡ２〜ＤＡＴＡ４）を２つのデータブロックに分割し、さらに、Ｃｌａｓｓ１  ｃｏｄｅを生成する。ノード１０１Ｂ〜１０１Ｄの各々は、分割したデータブロックおよびＣｌａｓｓ１  ｃｏｄｅを、他の３つのノード１０１のキャッシュ（またはバッファ）に、分散コピーする。各ノード１０１は、他の３つのノード１０１それぞれから受信したデータブロックまたはＣｌａｓｓ１  ｃｏｄｅのコピーを、キャッシュ（またはバッファ）に格納する。【００６８】
ノード１０１Ａは、ライト処理とは非同期的に、他の３つのノード１０１から集約したデータブロックまたはＣｌａｓｓ１  ｃｏｄｅから、二次的な冗長符号であるｘ１ブロック２０６Ａおよびｙ１ブロック２０６Ｂを生成する。この二次的な冗長符号は、例えばパリティブロック等の冗長コードであって、Ｃｌａｓｓ２  ｃｏｄｅと呼ぶことがある。【００６９】
同様に、ノード１０１Ｂ〜１０１Ｄは、それぞれ、非同期的に、他の３つのノードから集約したデータブロックまたはＣｌａｓｓ１  ｃｏｄｅから、Ｃｌａｓｓ２  ｃｏｄｅを生成する。【００７０】
ノード１０１Ａ〜１０１Ｄの各々は、それぞれ生成したＣｌａｓｓ２  ｃｏｄｅをローカルなドライブ１０５に書き込む。また、ノード１０１Ａ〜１０１Ｄの各々は、当該Ｃｌａｓｓ２  ｃｏｄｅの生成に使用したデータブロックまたはＣｌａｓｓ１  ｃｏｄｅのコピーが格納されたキャッシュ（またはバッファ）の領域を解放する。【００７１】
図２は２Ｄ２Ｐ冗長構成の例を示すが、本実施例の方法は、任意のｍＤｎＰ構成（ｍ、ｎは自然数）に適用できる。ライトデータブロック（ｍＤ）は、ローカルなドライブ１０５に格納され、冗長度を１減らした個数（冗長度がｎ−１）のＣｌａｓｓ１  ｃｏｄｅと共に、他のノード１０１に転送される。例えば、３Ｄ２Ｐ構成（ｄ１、ｄ２、ｄ３、ｐ）において、ライトデータブロック（ｄ１＋ｄ２＋ｄ３）はローカルなドライブ１０５に格納され、データブロックｄ１、ｄ２、ｄ３、ｐが異なるノード１０１にそれぞれ転送される。【００７２】
図３は、メモリ１０４の構成を示す図である。分散型ストレージシステム１００の各ノード１０１のメモリ１０４には、分散型ストレージシステム１００を制御するための情報またはプログラムが格納される。例えば、メモリ１０４には、ストライプマッピングテーブル３０１、キャッシュ管理テーブル３０２、パリティ管理テーブル３０３、ノード状態管理テーブル３０４、ＥＣグループ拡縮処理プログラム３０５、ホストＩ／Ｏ処理プログラム３０６、およびロールバック処理プログラム３０７が格納される。各種プログラム３０５〜３０７は、プロセッサ１０６により、実行される。以下の説明において、ストライプマッピングテーブル３０１、キャッシュ管理テーブル３０２、パリティ管理テーブル３０３、ノード状態管理テーブル３０４を含む管理情報を、各種管理情報３０１〜３０４と呼ぶことがある。【００７３】
ストライプマッピングテーブル３０１は、ストライプグループ番号の組合せの情報を含み、データブロックやＣｌａｓｓ１  ｃｏｄｅのコピー先となる宛先ノードを決定するときや、障害が発生したノード１０１に格納されたデータブロックをリビルドするときに使用する。【００７４】
キャッシュ管理テーブル３０２は、Ｃｌａｓｓ２  ｃｏｄｅを生成するダーティデータ、またはＣｌａｓｓ２  ｃｏｄｅの整合性を維持するためのアンドゥデータのキャッシュに関する情報を含む。パリティ管理テーブル３０３は、ログストラクチャード形式で格納されるＣｌａｓｓ２  ｃｏｄｅの管理情報およびＣｌａｓｓ２  ｃｏｄｅを構成するデータブロックの格納位置情報を含む。ノード状態管理テーブル３０４は、各ノード１０１の運用状態の情報を含む。【００７５】
ＥＣグループ拡縮処理プログラム３０５は、ユーザまたはクラスタ管理プログラムからのＥＣグループ拡縮要求を制御するためのプログラムである。ホストＩ／Ｏ処理プログラム３０６は、アプリケーションプログラムや仮想マシンといったホストからのＩ／Ｏ要求を制御するためのプログラムである。ロールバック処理プログラム３０７は、データストアノードの障害時にパリティストアノード間でＣｌａｓｓ２  ｃｏｄｅの整合性を制御するためのプログラムである。【００７６】
メモリ１０４は、図３に示す情報およびプログラムに加え、ストレージ機能を実現するストレージプログラム、ＯＳ、インタフェースプログラムを含む、各種プログラムを格納する。メモリ１０４は、さらに、業務を実行するアプリケーションプログラムを格納することがある。【００７７】
上述した各種管理情報３０１〜３０４と、プログラム３０５〜３０７を含む各種プログラムの全部または一部のコピーは、バックアップ等の目的のため、ドライブ１０５に同期または非同期に保存されてもよい。【００７８】
以下、図４Ａ、図４Ｂ、図５，図６、図７を用いて、メモリ１０４が保持する情報（ストライプマッピングテーブル３０１、キャッシュ管理テーブル３０２、パリティ管理テーブル３０３、ノード状態管理テーブル３０４）の構成例を説明する。各テーブルにおいて、一部のエントリのみが示されている。各テーブルにおいて、空白のセルは、データの記載が省略されたセルである。テーブルのセルにおいて、「０ｘ」は、１６進数の数字を示す。【００７９】
図４Ａは、ストライプマッピングテーブル３０１の構成の概念を示す図である。図４Ａのストライプマッピングテーブル３０１は、分散型ストレージシステム１００が４台のノード（Ｅ０〜Ｅ３）でクラスタを構成していることを示している。ＥＣグループの構成は、２Ｄ２Ｐであり、サイクル数Ｃが２である。【００８０】
図４Ａに示すストライプマッピングテーブル３０１は、列要素（Ｅ０〜Ｅ３）として列番号４０１を含み、行要素（Ｄ１、Ｄ２、Ｐ１、ＸＹ）として行番号４０２を含む。【００８１】
列番号４０１は、要素番号と呼ぶことがある。要素番号は、例えばノード番号、ドライブ番号、またはノード番号およびドライブ番号の両方を指定する情報のいずれかであっても良い。【００８２】
行番号４０２は、データブロックを特定する情報（Ｄ１、Ｄ２）と、Ｃｌａｓｓ１  ｃｏｄｅを特定する情報（Ｐ１）と、Ｃｌａｓｓ２  ｃｏｄｅを特定する情報（ＸＹ）を含む。行番号４０２は、例えば、データブロック、Ｃｌａｓｓ１  ｃｏｄｅ、またはＣｌａｓｓ２  ｃｏｄｅの格納先を示す論理アドレスであっても良い。【００８３】
また、ストライプマッピングテーブル３０１は、列番号４０１と行番号４０２で指定される各セル４０３に、ストライプグループ番号（Ｓ０〜Ｓ３）を含む。ストライプグループ番号は、ストライプグループを識別する情報である。ストライプグループは、ストライプ（データブロックまたはＣｌａｓｓ１  ｃｏｄｅ）と、当該ストライプから生成されるＣｌａｓｓ２  ｃｏｄｅの組合せである。【００８４】
ストライプマッピングテーブル３０１で、同一のストライプグループ番号に対応するストライプとＣｌａｓｓ２  ｃｏｄｅは、当該ストライプグループ番号の同じストライプグループに属する。各ストライプが属するストライプグループは、例えば、当該ストライプの論理アドレス（行番号４０２に相当）と、当該ストライプを格納するノード１０１のノード番号（列番号４０１に相当）とによって決定される。そして、コントローラ１０７は、同じストライプグループに属する複数のストライプから、Ｃｌａｓｓ２  ｃｏｄｅを生成する。さらに、コントローラ１０７は、ストライプマッピングテーブル３０１で、当該ストライプグループ番号とＣｌａｓｓ２  ｃｏｄｅの行番号（ＸＹ）に対応するノード番号（列番号４０１）のノード１０１に、Ｃｌａｓｓ２  ｃｏｄｅを格納する。【００８５】
ストライプマッピングテーブル３０１は、データ部４０４、Ｃｌａｓｓ１  ｃｏｄｅ部４０５、およびＣｌａｓｓ２  ｃｏｄｅ部４０６の３つのセクタを含む。図４Ａの例では、データ部４０４は行番号４０２がＤ１およびＤ２のセクタであり、Ｃｌａｓｓ１  ｃｏｄｅ部４０５は行番号４０２がＰ１のセクタであり、Ｃｌａｓｓ２  ｃｏｄｅ部４０６は行番号４０２がＤ１およびＤ２のセクタである。【００８６】
データ部４０４は、アプリケーションプログラムや仮想マシンにより書き込まれたデータブロックに対応したストライプグループ番号を管理している。【００８７】
Ｃｌａｓｓ１  ｃｏｄｅ部４０５は、書き込まれたデータブロックを分割して生成されたＣｌａｓｓ１  ｃｏｄｅに対応したストライプグループ番号を管理している。Ｃｌａｓｓ１  ｃｏｄｅは、同じ列番号４０１のデータ部４０４に対応するデータブロックから生成する。例えば、列番号４０１がＥ０の場合、Ｅ０に対応するＤ１とＤ２の論理アドレスに書き込まれたデータブロックから、Ｃｌａｓｓ１  ｃｏｄｅ（Ｐ１）を生成する。【００８８】
Ｃｌａｓｓ２  ｃｏｄｅ部４０６は、その要素番号（列番号４０１）のノード１０１に格納されるＣｌａｓｓ２  ｃｏｄｅのストライプグループ番号を管理している。例えば、Ｅ０の列の場合、Ｃｌａｓｓ２  ｃｏｄｅは、ストライプグループ番号がＳ０であり、同じストライプグループ番号に対応するデータ部４０４およびＣｌａｓｓ１  ｃｏｄｅ部４０５から生成される。具体的には、Ｅ０の列のＣｌａｓｓ２  ｃｏｄｅは、Ｅ１の列のＤ１データブロックと、Ｅ２の列のＣｌａｓｓ１  ｃｏｄｅと、Ｅ３の列のＤ１データブロックから生成する。そのため、Ｅ１の列のＤ１データブロックと、Ｅ２の列のＣｌａｓｓ１  ｃｏｄｅと、Ｅ３の列のＤ１データブロックのコピー先となる宛先ノードは、Ｅ０のノード番号のノード１０１となる。【００８９】
また、例えば、以下のように計算することで、書き込まれたデータブロックおよびＣｌａｓｓ１  ｃｏｄｅのコピー先（転送先）となる宛先ノードを決定する。以下において、Ｃとは、データ部のサイクル数（行数）を示し、ストライプサイズは、１セルあたりのデータサイズを示す。ＬＢＡとは、ブロックの論理的なデータの場所を示す論理ブロックアドレス（Ｌｏｇｉｃａｌ  Ｂｌｏｃｋ  Ａｄｄｒｅｓｓ）である。以下において、ストライプマッピングテーブル３０１内のセル位置を（列番号４０１、行番号４０２）で示す。【００９０】
（１）データブロック
コントローラ１０７は、データブロックを、ローカルなノード１０１のドライブ１０５に、ＬＢＡ順にストレートマッピングされるように格納する。コントローラ１０７は、データブロックの宛先ノードを決定するため、列番号４０１をノード番号とし、行番号４０２を（ＬＢＡ  ／  ストライプサイズ）ｍｏｄ  Ｃとして、列番号４０１と行番号４０２を算出する。コントローラ１０７は、ストライプマッピングテーブル３０１のデータ部４０４において、（ノード番号、（ＬＢＡ  ／  ストライプサイズ）ｍｏｄ  Ｃ）のセル位置にあるセルに格納されたストライプグループ番号を取得する。コントローラ１０７は、ストライプマッピングテーブル３０１のＣｌａｓｓ２  ｃｏｄｅ部４０６において、取得した番号と同じストライプグループ番号を格納するセルの列番号４０１を取得し、当該列番号４０１に対応するノード１０１へデータブロックを転送する。【００９１】
（２）Ｃｌａｓｓ１  ｃｏｄｅ
コントローラ１０７は、Ｃｌａｓｓ１  ｃｏｄｅについて、列番号４０１をノード番号とし、行番号４０２をＰ１として、列番号４０１と行番号４０２を算出する。コントローラ１０７は、ストライプマッピングテーブル３０１のＣｌａｓｓ１  ｃｏｄｅ部４０５において、（ノード番号、Ｐ１）のセル位置にあるセルに格納されたストライプグループ番号を取得する。コントローラ１０７は、ストライプマッピングテーブル３０１のＣｌａｓｓ２  ｃｏｄｅ部４０６において、取得した番号と同じストライプグループ番号を格納するセルの列番号４０１を取得し、当該列番号４０１に対応するノード１０１へＣｌａｓｓ１  ｃｏｄｅを転送する。【００９２】
また、データブロックとＣｌａｓｓ１  ｃｏｄｅを受領した宛先ノードでは、データブロックとＣｌａｓｓ１  ｃｏｄｅからＣｌａｓｓ２  ｃｏｄｅを生成し、ドライブ１０５にマッピングされたデータ部４０４の終端からストレートマッピングされるように、ドライブ１０５に格納する。このとき、同一ストライプから生成された複数のＣｌａｓｓ２  ｃｏｄｅであるｘ、ｙパリティブロックは、ドライブ内の連続領域に格納される。これにより、Ｃｌａｓｓ２  ｃｏｄｅをシーケンシャルに読み出すことができ、リビルド時のペナリティを軽減できる効果がある。【００９３】
ストライプマッピングテーブル３０１は、図４Ａの例に限定されず、例えば同列内であれば任意にストライプグループ番号を入れ替えてよい。【００９４】
図４Ｂは、ストライプマッピングテーブル３０１の構成の具体例を示す図である。すなわち、図４Ａのストライプマッピングテーブル３０１は、図４Ｂに示す構成であってよい。【００９５】
図４Ｂのストライプマッピングテーブル３０１は、ノード番号からストライプグループ番号に変換するためのストライプグループ番号テーブル４０９と、ストライプグループ番号からノード番号に変換するノード番号テーブル４１０を有する。【００９６】
ストライプグループ番号テーブル４０９は、要素番号、ストライプグループ番号（Ｄ１）、ストライプグループ番号（Ｄ２）、およびストライプグループ番号（Ｐ１）を含む。要素番号は、データブロックを格納するノード番号であり、列番号４０１に対応する。ストライプグループ番号（Ｄ１）、ストライプグループ番号（Ｄ２）は、データ部４０４の各行に対応したストライプグループ番号である。ストライプグループ番号（Ｐ１）は、Ｃｌａｓｓ１  ｃｏｄｅ部４０５に対応したストライプグループ番号である。【００９７】
ノード番号テーブル４１０は、ストライプグループ番号、データブロック要素番号、Ｃｌａｓｓ１  ｃｏｄｅ要素番号、およびＣｌａｓｓ２  ｃｏｄｅ要素番号を含む。【００９８】
データブロック要素番号は、同行のストライプグループ番号に対応するデータ部４０４を有するノードのノード番号である。Ｃｌａｓｓ１  ｃｏｄｅ要素番号は、同行のストライプグループ番号に対応するＣｌａｓｓ１  ｃｏｄｅ部４０５を有するノードのノード番号である。Ｃｌａｓｓ２  ｃｏｄｅ要素番号は、同行のストライプグループ番号に対応するＣｌａｓｓ２  ｃｏｄｅ部４０６を有するノード（宛先ノード）のノード番号である。【００９９】
図５は、キャッシュ管理テーブル３０２の構成を示す図である。キャッシュ管理テーブル３０２は、ダーティキャッシュテーブル５０１とアンドゥキャッシュテーブル５０２を含む構成である。【０１００】
ダーティキャッシュデーブル５０１は、Ｃｌａｓｓ２  ｃｏｄｅを計算するためのデータブロックを管理している。ダーティキャッシュテーブル５０１は、ストライプグループ番号、要素番号、およびダーティキューを含む。ストライプグループ番号は、Ｃｌａｓｓ２  ｃｏｄｅを同一ストライプグループ番号のデータブロックで生成するための番号である。ストライプグループ番号ごとに、要素番号とダーティキューを管理する。要素番号は、ストライプマッピングテーブル３０１で管理している列要素の番号であり、データブロックの送信元である。ダーティキューは、Ｃｌａｓｓ２  ｃｏｄｅを生成するために、他ノードに転送されたデータブロックである。ダーティキューには、データブロック本体だけでなく、それらデータブロックが格納された位置情報（ノード番号、ドライブ番号）を保持する。【０１０１】
アンドゥキャッシュテーブル５０２は、データストアノードに障害が発生した時に、パリティストアノード間のＣｌａｓｓ２  ｃｏｄｅの整合性をとるためのアンドゥキューを管理している。アンドゥキャッシュテーブル５０２は、要素番号、タグ番号、アンドゥキュー、Ｉ／Ｏ範囲、および状態を含む。タグ番号は、ホストＩ／Ｏに付与される番号であり、当該システムが処理可能なホストＩ／Ｏの多重度分だけ番号が存在する。アンドゥキューは、Ｃｌａｓｓ２  ｃｏｄｅのロールバック処理時に使用するデータブロックまたは中間コードである。アンドゥキューには、アンドゥデータ本体だけでなく、アンドゥデータが格納された位置情報（ノード番号、ドライブ番号）を保持する。アンドゥデータは、ライトデータを受信した要素番号とタグ番号に対応するエントリにキューイングする。また、同要素番号、同タグ番号、且つ異なる世代番号のライトデータを受信した時に、一度破棄し、受信したライトデータを新たにキューイングする。Ｉ／Ｏ範囲は、受信したＩ／Ｏが同時にどのデータブロックを更新しているかを示す。これにより、データストアノード障害時に、当該エントリが整合性をとるべき、ノード（要素）を判別する。具体的には、Ｉ／Ｏ範囲情報として、開始アドレスとデータ転送長を記録する。状態は、各行の状態であり、Ｃｌａｓｓ２  ｃｏｄｅに整合性を確認した状態かどうかを確認する。データストアノードに障害が発生した時、状態が未チェックのエントリに対して、整合性がとれているかどうか他パリティストアノードに問い合わせて確認する。整合性を確認した後、エントリの状態をチェック済みに変更する。【０１０２】
図６は、パリティ管理テーブル３０３の構成を示す図である。パリティ管理テーブル３０３は、正引きテーブル６０１と逆引きテーブル６０２とフリーリスト６０３を含む管理情報である。【０１０３】
正引きテーブル６０１は、データブロックの格納アドレスをキーとして、Ｃｌａｓｓ２  ｃｏｄｅの格納アドレスを引くための情報を管理する管理情報である。データブロックの格納アドレス（ＤＡＴＡ  ＬＢＡ）からＣｌａｓｓ２  ｃｏｄｅの格納アドレス（ＰＡＲＩＴＹ  ＬＢＡ）を引く操作を正引きと呼ぶ。【０１０４】
正引きテーブル６０１は、データノード番号、データドライブ番号、データＬＢＡ、世代番号、パリティドライブ番号、およびパリティインデックス番号を情報として含む。データノード番号、データドライブ番号、およびデータＬＢＡは、データブロックを格納するノードの番号、ドライブの番号、ＬＢＡである。世代番号は、データブロックが書き出された世代を管理する番号であり、データブロックの更新時に更新される。世代番号は、データストアノード障害時におけるロールバック処理で使用する。パリティドライブ番号は、当該エントリと同行のデータブロックに対応するＣｌａｓｓ２  ｃｏｄｅを格納するドライブの番号である。パリティインデックス番号は、Ｃｌａｓｓ２  ｃｏｄｅの格納位置を示す番号である。正引きテーブル６０１は、格納しているＣｌａｓｓ２  ｃｏｄｅに対応する情報をパリティストアノードに格納する。【０１０５】
逆引きテーブル６０２は、Ｃｌａｓｓ２  ｃｏｄｅの格納アドレス（ＰＡＲＩＴＹ  ＬＢＡ）をキーとして、当該Ｃｌａｓｓ２  ｃｏｄｅを計算したデータブロックの格納アドレス（ＤＡＴＡ  ＬＢＡ）を引くための情報を管理する管理情報である。Ｃｌａｓｓ２  ｃｏｄｅの格納アドレスからデータブロックの格納アドレスを引く操作を逆引きと呼ぶ。【０１０６】
逆引きテーブル６０２は、パリティドライブ番号、パリティインデックス番号、およびパリティ構成情報を含む。一意なＣｌａｓｓ２  ｃｏｄｅに対して、そのＣｌａｓｓ２  ｃｏｄｅを構成するデータブロックの格納位置を管理している。パリティドライブ番号とパリティインデックス番号は、Ｃｌａｓｓ２  ｃｏｄｅを格納しているドライブ番号と格納位置を示す番号である。パリティ構成情報は、データノード番号、データドライブ番号、データＬＢＡ、および状態を含む。データノード番号、データドライブ番号、およびデータＬＢＡは、対応するＣｌａｓｓ２  ｃｏｄｅを計算したデータブロックの格納位置情報を示す。パリティ構成情報で使用する行（以降、スロットと呼ぶ）は、データ保護設定ｍＤｎＰのｍの数に対応しており、ＥＣグループの拡縮に合わせて、使用するスロットを増減させる。状態は、Ｃｌａｓｓ２  ｃｏｄｅを計算したデータブロックの状態を示しており、状態には、使用中（ＵＳＥ）と未使用（ＵＮＵＳＥ）がある。状態が未使用である場合、まだ当該Ｃｌａｓｓ２  ｃｏｄｅの当該スロットにデータブロックは書き込まれておらず、当該データブロックは、０データとして、Ｃｌａｓｓ２  ｃｏｄｅが計算される。【０１０７】
フリーリスト６０３は、Ｃｌａｓｓ２  ｃｏｄｅをログストラクチャードで管理する管理情報である。新規に計算されるＣｌａｓｓ２  ｃｏｄｅは、フリーリストより、取得された書き出し先へ書き出される。ＥＣグループの拡縮やガベージコレクションにより、Ｃｌａｓｓ２  ｃｏｄｅを消去したとき、消去したＣｌａｓｓ２  ｃｏｄｅが使用していたアドレスをフリーリストに追加する。【０１０８】
図７は、ノード状態管理テーブル３０４の構成を示す図である。ノード状態管理テーブル３０４は、各ノードの運用状態を管理する。ノード状態管理テーブル３０４は、データノード番号、データドライブ番号、進捗ポインタ、およびノード状態の情報を対応づけて管理している。【０１０９】
ノード状態は、当該ノード状態に対応付けられたノード番号で識別されるノードの状態を管理している。ノード状態には、ＮＯＲＭＡＬ、ＥＲＲＯＲ、およびＲＥＣＬＵＳＴＥＲＩＮＧがある。ＮＯＲＭＡＬは、当該ノードが正常状態であることを示し、ＥＲＲＯＲは、当該ノードが障害状態であることを示す。ＲＥＣＬＵＳＴＥＲＩＮＧは、当該ノードが、ノード増減設やＥＣグループ拡縮により、ＥＣクラスタを再構築している途中であることを示す。【０１１０】
進捗ポインタは、当該進捗ポインタに対応づけられたノード番号およびドライブ番号で識別されるノードおよびドライブについて、障害状態からの復旧の進捗状況、およびＥＣクラスタ再構築の進捗状況を示す。進捗ポインタは、当該ノードの当該ドライブのＬＢＡを示しており、進捗ポインタで示されたＬＢＡまでは、障害復旧またはクラスタ再構築処理が完了していることを示す。このため、障害復旧中やクラスタ再構築中は、当該進捗ポインタを参照して、読み出し先または書き込み先データブロックに対応するＣｌａｓｓ２  ｃｏｄｅの格納先ノードを決定する。【０１１１】
例えば、ＬＢＡの若い番号から順にクラスタ再構築処理を実行している場合、進捗ポインタが指し示すＬＢＡより、小さいＬＢＡは、クラスタ再構築が完了しているため、新規ストライプマッピングテーブルに基づき、Ｃｌａｓｓ２  ｃｏｄｅの格納先ノードを決定する。逆に、進捗ポインタが指し示すＬＢＡより、大きいＬＢＡは、クラスタ再構築が完了していないため、旧ストライプマッピングテーブルに基づきＣｌａｓｓ２  ｃｏｄｅの格納先ノードを決定する。【０１１２】
図８Ａと図８Ｂを用いて、データ数（Ｄ数）とノード数を同時に増設するとき、すなわちＥＣグループを拡張するときのストライプマッピングテーブル３０１とパリティ管理テーブル３０３の逆引きテーブル６０２の更新処理を説明する。【０１１３】
図８Ａは、データ数とノード数を同時に増設するときのストライプマッピングテーブル３０１の更新例を示す概念図である。ストライプマッピングテーブル３０１Ａは、ＥＣグループ拡張前のストライプマッピングテーブル３０１であり、ストライプマッピングテーブル３０１Ｂは、ＥＣグループ拡張後のストライプマッピングテーブル３０１である。【０１１４】
ストライプマッピングテーブル３０１Ａは、分散型ストレージシステム１００が５台のノード（Ｅ０１〜Ｅ０５）でクラスタを構成していることを示している。ＥＣグループの構成は、３Ｄ２Ｐであり、サイクル数Ｃが４である。【０１１５】
このクラスタ構成に６番目のノード（Ｅ０６）を追加し、更に３Ｄ２Ｐから４Ｄ２ＰにＥＣグループを拡張するときのストライプマッピングテーブル３０１の変更例を示す。【０１１６】
まず、コントローラ１０７は、既存のストライプマッピングテーブル３０１Ａに対して、６番目のノードの列（Ｅ０６）を追加する。【０１１７】
次に、コントローラ１０７は、追加した６番目の列（Ｅ０６）に対して、ストライプグループ番号を割り当てる。以下、追加した列へのストライプグループ番号の割り当て方の例を説明する。【０１１８】
（１）コントローラ１０７は、データ部に対して、割り当て数が拡張後のＤ数（４個）に満たないストライプグループ番号（Ｓ０１、Ｓ０２、Ｓ０３、Ｓ０５）を選択し、そのストライプグループ番号を、追加した列を含めデータ部内に割り当てるストライプグループ番号の合計数が拡張後のＤ数（４個）となるように、追加した列（Ｅ０６）に割り当てる。【０１１９】
（２）コントローラ１０７は、データ部に対して、ストライプグループ番号の割り当て数が、拡張後のＤ数（４個）に満たない番号（Ｓ０４、Ｓ０６、Ｓ０７）が存在すれば、そのストライプグループ番号の内、割り当て数が最小のストライプグループ番号（Ｓ０７）を消去し、他に拡張後のＤ数（４個）に満たない番号（Ｓ０４、Ｓ０６）に変更する。【０１２０】
（３）コントローラ１０７は、Ｃｌａｓｓ１  ｃｏｄｅ部に対して、割り当て数が０個のストライプグループ番号を選択（Ｓ０６）し、そのストライプグループ番号を、追加した列（Ｅ０６）を含めＣｌａｓｓ１  ｃｏｄｅ部内に割り当てる合計数が拡張後のＰ数−１個（１個）となるように、追加した列（Ｅ０６）に割り当てる。【０１２１】
（４）コントローラ１０７は、Ｃｌａｓｓ２  ｃｏｄｅ部に対して、他の列よりもストライプグループ番号の割り当て数が多い列を選択し、当該列に割り当てられたストライプグループ番号の内、追加した列（Ｅ０６）に上記（１）〜（３）割り当てられたストライプグループ番号と重複しないストライプグループ番号を選択（Ｓ０４）し、追加した列に移動する。【０１２２】
図８Ｂは、データ数とノード数を同時に増設するときの逆引きテーブル６０２の更新例を示す概念図である。コントローラ１０７は、Ｄ数が増加したとき、パリティ管理テーブル３０３の逆引きテーブル６０２が含むパリティ構成情報のスロットを、Ｄ数を増設した数と同等の数だけ増設する。これにより、Ｃｌａｓｓ２  ｃｏｄｅを構成するデータブロックにおいて、新たに増設したＤ数分のデータブロック位置情報を管理できるようにする。コントローラ１０７は、追加したスロットは、０データとして扱う。これにより、Ｃｌａｓｓ２  ｃｏｄｅを更新することなく、Ｄ数を拡張できるため、ネットワーク転送コストを削減できる。コントローラ１０７は、追加スロットに該当するノードおよびドライブに対して、データブロック書き込みが発生した時、書き込まれたデータブロックでＣｌａｓｓ２  ｃｏｄｅを更新し、当該スロットの情報を更新する。【０１２３】
以上の変更ようにすることで、データ部に対しての変更を少なくすることで、可能な限り既存データブロックのＣｌａｓｓ２  ｃｏｄｅ格納位置を変更しないできるため、ＥＣグループ拡張に伴うデータブロック転送量を削減できる。【０１２４】
図９Ａと図９Ｂを用いて、データ数（Ｄ数）とノード数を同時に減設するとき、すなわちＥＣグループを収縮するときのストライプマッピングテーブル３０１とパリティ管理テーブル３０３の逆引きテーブル６０２の更新処理を説明する。【０１２５】
図９Ａは、データ数とノード数を同時に減設するときのストライプマッピングテーブル３０１の更新例を示す概念図である。ストライプマッピングテーブル３０１Ｃは、ＥＣグループ収縮前のストライプマッピングテーブル３０１であり、ストライプマッピングテーブル３０１Ｄは、ＥＣグループ収縮後のストライプマッピングテーブル３０１である。【０１２６】
ストライプマッピングテーブル３０１Ｃは、分散型ストレージシステム１００が６台のノード（Ｅ０１〜Ｅ０６）でクラスタを構成していることを示している。ＥＣグループの構成は、４Ｄ２Ｐであり、サイクル数Ｃが４である。【０１２７】
このクラスタ構成から６番目のノード（Ｅ０６）を除外し、更に４Ｄ２Ｐから３Ｄ２ＰにＥＣグループを収縮するときのストライプマッピングテーブル３０１の変更例を示す。【０１２８】
まず、コントローラ１０７は、既存のマッピングテーブル３０１Ｃに対して、６番目のノードの列（Ｅ０６）を除外する。【０１２９】
次に、コントローラ１０７は、除外後のストライプマッピングテーブル３０１の各列に対して、ストライプグループ番号を割り当て直す。以下、当該割り当て直し方の例を説明する。【０１３０】
（１）コントローラ１０７は、データ部に対して、割り当て数が収縮後のＤ数（３個）を超過するストライプグループ番号（ここでは、Ｓ０１、Ｓ０４）を選択し、そのストライプグループ番号の内、割り当て数が最大のストライプグループ番号（Ｓ０１、Ｓ０４）の内、１つの割り当てを消去し、新しいストライプグループ番号（Ｓ０７）に変更する。【０１３１】
（２）コントローラ１０７は、Ｃｌａｓｓ２  ｃｏｄｅ部に対して、同列で重複しないように、新しく追加したストライプグループ番号を一つの列に割り当てる。【０１３２】
（３）コントローラ１０７は、Ｃｌａｓｓ２  ｃｏｄｅ部に対して、除外した列に割り当てられたストライプグループ番号（Ｓ０１）を同列で重複しないように、既存の列（Ｅ０１）に移動する。【０１３３】
図９Ｂは、データ数とノード数を同時に減設するときの逆引きテーブル６０２の更新例を示す概念図である。コントローラ１０７は、Ｄ数が減少したときは、パリティ管理テーブル３０３の逆引きテーブル６０２が含むパリティ構成情報のスロットを、Ｄ数を減設した数と同等の数だけ減設する。これにより、Ｃｌａｓｓ２  ｃｏｄｅを構成するデータブロックにおいて、減設対象となった不要なＤ数分のデータブロック位置情報を管理しないようにする。このとき、コントローラ１０７は、減設対象スロットのデータブロックを、０データ化しておく。具体的には、コントローラ１０７は、減設対象スロットに該当するデータブロックを転送し、パリティを当該データブロックで更新する。これにより、Ｃｌａｓｓ２  ｃｏｄｅを全て崩して再生成することなく、一部のデータブロックだけをパリティ構成情報から除外できる。【０１３４】
以上のようにすることで、可能な限り既存データブロックのＣｌａｓｓ２  ｃｏｄｅ格納位置を変更しないようにし、ＥＣグループ収縮に伴うデータブロック転送量を削減する。【０１３５】
図１０は、ＥＣグループ拡縮処理のフローチャートである。ユーザまたは管理プログラムから、分散型ストレージシステム１００がＥＣグループの拡縮要求を受信したときに、ノード１０１のコントローラ１０７で、ＥＣグループ拡縮処理プログラム３０５を実行することにより、ＥＣグループ拡縮処理を行う。【０１３６】
図１０のＳ１００１〜Ｓ１００５の処理は、分散型ストレージシステム１００のいずれかのノード１０１のコントローラ１０７で行われる。２以上のノード１０１で行うことも可能であるが、Ｓ１００４やＳ１００５の処理において全てのノード１０１で共有する各種管理情報３０１〜３０４を更新するので、これらの情報がノード間で不整合となるのを防ぐため、本実施例では、一つのノード１０１でＳ１００１〜Ｓ１００５の処理を行うとする。【０１３７】
例えば、ユーザまたは管理プログラムからＥＣグループの拡縮要求を受信したノード１０１で、Ｓ１００１〜Ｓ１００５の処理を行うとする。例えば、分散型ストレージシステム１００が有する複数のノード１０１のうち、一つをマスターノードとし、その他のノード１０１をスレーブノードとする場合、マスターノードがＳ１００１〜Ｓ１００５の処理を実行してもよい。マスターノードは、ユーザまたは管理プログラムからＥＣグループの拡縮要求を受信して本処理を行う。スレーブノードがユーザまたは管理プログラムからＥＣグループの拡縮要求を受信する場合には、マスターノードはスレーブノードからＥＣグループの拡縮要求を受信して本処理を行う。【０１３８】
コントローラ１０７は、ノード状態管理テーブル３０４を参照して、分散型ストレージシステム１００のクラスタが既に再構築処理中ではないかどうかを判定する（Ｓ１００１）。具体的には、コントローラ１０７は、ノード状態管理テーブル３０４を参照して、各ノードのノード状態が「ＲＥＣＬＵＳＴＥＲＩＮＧ」であれば、クラスタが既に再構築処理中であると判定する。【０１３９】
Ｓ１００１の判定の結果、クラスタが再構築処理中であった場合（Ｓ１００１：Ｙ）、コントローラ１０７はＥＣグループ拡縮処理を終了する。または、コントローラ１０７は、ＥＣグループの拡縮要求をキューイングしておき、現在のクラスタ再構築処理が完了してから、キューイングした要求を取り出し、要求を実行してもよい。【０１４０】
Ｓ１００１の判定の結果、クラスタが再構築中でない場合（Ｓ１００１：Ｎ）、コントローラ１０７は、ＥＣグループの拡縮要求が収縮要求かどうか判定する（Ｓ１００２）。ここで、収縮要求とは、クラスタからノードを減設する操作を指す。【０１４１】
Ｓ１００２の判定の結果、収縮要求である場合（Ｓ１００２：Ｙ）、コントローラ１０７は、ＥＣグループを収縮した場合に十分な空き容量があるか否か判定する（Ｓ１００３）クラスタからノードを減設する場合、パリティ部の比率が増加するため、十分な空き容量がなくデータ部の使用率が高いと、収縮後に十分なパリティ部の記憶容量が確保できない可能性がある。【０１４２】
Ｓ１００３の判定の結果、十分な空き容量がない場合（Ｓ１００３：Ｎ）、コントローラ１０７は、ＥＣグループ拡縮処理を終了する。Ｓ１００３の判定の結果、十分な空き容量がある場合（Ｓ１００３：Ｙ）、コントローラ１０７は、Ｓ１００４の処理を実行する。【０１４３】
Ｓ１００４では、コントローラ１０７は、ストライプマッピングテーブル３０１をＥＣ拡縮後の構成に合わせて更新する。更新したストライプマッピングテーブル３０１を、新規ストライプマッピングテーブルと呼ぶことがある。更新前のストライプマッピングテーブル３０１を、旧ストライプマッピングテーブルと呼ぶことがある。新規ストライプマッピングテーブルと旧ストライプマッピングテーブルの両方を指す用語として、新旧ストライプマッピングテーブルと呼ぶことがある。コントローラ１０７は、新旧ストライプマッピングテーブルを保存する。【０１４４】
Ｓ１００２の判定の結果、収縮要求でない場合（Ｓ１００２：Ｎ）も、コントローラ１０７は、Ｓ１００４の処理を実行する。【０１４５】
コントローラ１０７は、ＥＣグループ拡縮処理に備えて、各種管理情報３０１〜３０４を初期化する。具体的には、パリティ管理テーブル３０３内のパリティ構成情報のスロット数をＥＣグループ拡縮後の構成に合わせて追加し、更にノード状態管理テーブル３０４内の進捗ポインタを初期化し、更に新規ストライプマッピングテーブルに基づき、キャッシュ管理テーブル３０２を新たに作成する（Ｓ１００５）。【０１４６】
マスターノードのコントローラ１０７は、他のスレーブノード１０１に、Ｓ１００４およびＳ１００５で更新した各種管理情報３０１〜３０４を転送し、クラスタ再構築処理を要求する。各ノード１０１コントローラ１０７は、クラスタ再構築処理を実行する（Ｓ１００６）。各ノード１０１で実行されるクラスタ再構築処理の詳細については、図１１にて述べる。【０１４７】
クラスタ再構築処理が終わると、各ノード１０１のコントローラ１０７は、それぞれのノード１０１内において、Ｃｌａｓｓ２  ｃｏｄｅを新規ストライプマッピングテーブルに対応するように、詰め直す（Ｓ１００７）。具体的には、ストライプマッピングテーブル３０１の変更により、Ｃｌａｓｓ２  ｃｏｄｅの開始アドレスが変更されるため、新規ストライプマッピングテーブルでＣｌａｓｓ２  ｃｏｄｅ部にあたるＬＢＡに格納されたＣｌａｓｓ２  ｃｏｄｅのインデックス番号を変更する。また、新規ストライプマッピングテーブルでデータ部領域にあたるＬＢＡに格納されたＣｌａｓｓ２  ｃｏｄｅは、新規ストライプマッピングテーブルでＣｌａｓｓ２  ｃｏｄｅ部領域となるように読み出して、書き直す。【０１４８】
最後に、コントローラ１０７は、各種管理情報３０１〜３０４を更新する。具体的には、コントローラ１０７は、旧ストライプマッピングテーブルや旧キャッシュ管理テーブルを破棄して、各種管理情報３０１〜３０４をＥＣグループ拡縮後の情報に更新する（Ｓ１００８）。例えば、マスターノードのコントローラ１０７が各種管理情報３０１〜３０４を更新した後、他のスレーブノードに更新した各種管理情報３０１〜３０４を転送して、同期させてもよい。【０１４９】
図１１は、クラスタ再構築処理のフローチャートである。クラスタ再構築処理は、図１０のＥＣグループ拡縮処理の一部（Ｓ１００６）であり、各ノード１０１のコントローラ１０７により実行される。クラスタ再構築処理は、ＥＣグループの拡縮に伴うクラスタの再構築処理である。具体的には、クラスタ再構築処理は、新旧ストライプマッピングテーブルを比較して、ストライプグループ番号が変化しているデータブロックに対して、新規ストライプマッピングテーブルに従うように、当該データブロックに対応するＣｌａｓｓ２  ｃｏｄｅを更新する。なお、ＳＭＴとは、ストライプマッピングテーブル３０１を意味する。【０１５０】
以下の説明では、あるストライプのデータブロックを処理対象としたとき、当該ストライプのデータブロックを格納するノード１０１をデータストアノードとし、当該ストライプが属するストライプグループのＣｌａｓｓ２  ｃｏｄｅを格納するノード１０１をパリティストアノードとする。【０１５１】
まず、データストアノードにおけるクラスタ再構築処理のフローチャートを説明する。データストアノードのコントローラ１０７は、自身のノードが有するストライプについて、ＬＢＡの若い番号から順に処理対象として、以下のクラスタ再構築処理を実行する。【０１５２】
コントローラ１０７は、ノード状態管理テーブル３０４の進捗ポインタを参照し、処理対象がＬＢＡ終端かどうかを確認する（Ｓ１１０１）。【０１５３】
Ｓ１１０１の確認の結果、処理対象がＬＢＡ終端でない場合（Ｓ１１０１：Ｎ）、コントローラ１０７は、処理対象のＬＢＡに対応するストライプグループ番号が新規ストライプマッピングテーブルと旧ストライプマッピングテーブルで同じかどうか確認する（Ｓ１１０２）。【０１５４】
Ｓ１１０２の確認の結果、処理対象のＬＢＡに対応するストライプグループ番号が新旧ストライプマッピングテーブルで同じである場合（Ｓ１１０２：Ｙ）、コントローラ１０７は、何も処理せず、進捗ポインタを更新して、次のＬＢＡへ処理を進める（Ｓ１１０９）。【０１５５】
Ｓ１１０２の確認の結果、処理対象のＬＢＡに対応するストライプグループ番号が新旧ストライプマッピングテーブルで異なる場合（Ｓ１１０２：Ｎ）、コントローラ１０７は、処理対象のＬＢＡの排他を取得する（Ｓ１１０３）。【０１５６】
コントローラ１０７は、旧ストライプマッピングテーブルにおけるストライプグループ番号が、新規ストライプマッピングテーブルで解散しているかどうか確認する（Ｓ１１０４）。解散とは、旧ストライプマッピングテーブルで割り当てられていたストライプグループ番号が、新規ストライプマッピングテーブルで割り当てられていない状態を意味する。【０１５７】
Ｓ１１０４の確認の結果、旧ストライプマッピングテーブルで割り当てられていたストライプグループ番号が解散している場合（Ｓ１１０４：Ｙ）、コントローラ１０７は、当該ストライプグループ番号に対応するパリティストアノードのＣｌａｓｓ２  ｃｏｄｅは、不要であるため、破棄する。コントローラ１０７は、旧ストライプマッピングテーブルに対応するパリティストアノードへ当該ＬＢＡのデータブロックのＣｌａｓｓ２  ｃｏｄｅへパージ指示を送信する（Ｓ１１０５）。パージ指示を受信するパリティストアノードのフローチャートは、後述する。【０１５８】
Ｓ１１０４の確認の結果、旧ストライプマッピングテーブルで割り当てられていたストライプグループ番号が解散していない場合（Ｓ１１０４：Ｎ）、当該ストライプグループ番号に対応するパリティストアノードのＣｌａｓｓ２  ｃｏｄｅを構成する処理対象のＬＢＡのデータブロックは不要であるため、コントローラ１０７は、Ｃｌａｓｓ２  ｃｏｄｅを構成するデータブロックから除外する。コントローラ１０７は、旧ストライプマッピングテーブルに対応するパリティストアノードへ除外対象のデータブロック（除外データ）を更新属性で転送する（Ｓ１１０６）。除外データを受信するパリティストアノードのフローチャートは、後述する。【０１５９】
コントローラ１０７は、処理対象のドライブ１０５が減設対象のドライブかどうか確認する（Ｓ１１０７）。Ｓ１１０７の確認の結果、減設対象でない場合（Ｓ１１０７：Ｎ）、コントローラ１０７は、新規ストライプマッピングテーブルに対応するパリティストアノードへＣｌａｓｓ２  ｃｏｄｅを生成するため、処理対象のＬＢＡに格納しているデータブロックを読み出して、新規属性で転送する（Ｓ１１０８）。コントローラ１０７は、進捗ポインタを更新する（Ｓ１１０９）。Ｓ１１０７の確認の結果、減設対象である場合も（Ｓ１１０７：Ｙ）、コントローラ１０７は、Ｓ１１０９を実行する。【０１６０】
コントローラ１０７は、処理対象のＬＢＡの排他を取得しているか確認する（Ｓ１１１０）。Ｓ１１１０の確認の結果、処理対象のＬＢＡの排他を取得している場合（Ｓ１１１０：Ｙ）、コントローラ１０７は、処理対象のＬＢＡの排他を解放し、次のＬＢＡへ処理を進める（Ｓ１１１１）。Ｓ１１１０の確認の結果、処理対象のＬＢＡの排他を取得していない場合（Ｓ１１１０：Ｎ）、コントローラ１０７は、次のＬＢＡへ処理を進める（Ｓ１１１１）。【０１６１】
Ｓ１１０１の確認の結果、処理対象がＬＢＡ終端である場合（Ｓ１１０１：Ｙ）、コントローラ１０７は、データストアノードのクラスタ再構築処理を終了する。【０１６２】
次に、パリティストアノードにおけるクラスタ再構築処理のフローチャートを説明する。【０１６３】
まず、パリティストアノードが、パージ指示を受信したときに実行される処理について説明する。パリティストアノードのコントローラ１０７は、パージ指示を受信したら、パージ対象のデータブロックに対応するパリティ構成情報を取得し、パージ対象のデータブロックのスロットの状態をパージ中（ＰＵＲＧＩＮＧ）に更新し、全てのスロットがパージ中あるいは未使用（ＦＲＥＥ）かどうかを確認する（Ｓ１１１２）。Ｓ１１１２の確認の結果、使用中（ＵＳＩＮＧ）のスロットが残存する場合（Ｓ１１１２：Ｎ）、コントローラ１０７は処理を終了する。Ｓ１１１２の確認の結果、全てのスロットがパージ中あるいは未使用（ＦＲＥＥ）である場合、当該Ｃｌａｓｓ２  ｃｏｄｅは、もはやどのノードも使用していないため、コントローラ１０７はＣｌａｓｓ２  ｃｏｄｅを消去して、処理を終了する（Ｓ１１１３）。Ｃｌａｓｓ２  ｃｏｄｅの消去では、コントローラ１０７は、パリティ管理テーブル３０３の正引きテーブル６０１と逆引きテーブル６０２の対象エントリを消去し、消去対象のＣｌａｓｓ２  ｃｏｄｅを格納していたＬＢＡをフリーリスト６０３に挿入する。【０１６４】
次に、パリティストアノードが、データブロックを新規属性または更新属性で受信した時の処理について説明する。パリティストアノードのコントローラ１０７は、データブロックを受信したら、受信したブロックが更新属性かどうかを確認する（Ｓ１１１４）。【０１６５】
Ｓ１１１４の確認の結果、更新属性でなく新規属性である場合（Ｓ１１１４：Ｎ）、コントローラ１０７は、新規ライトデータを受信しているため、受信ブロックをダーティキャッシュに格納する（Ｓ１１２３）。格納したダーティキャッシュは、図１２で説明するように、パリティストアノードのホストＩ／Ｏ処理プログラムに従って処理される。【０１６６】
Ｓ１１１４の確認の結果、更新属性である場合（Ｓ１１１４：Ｙ）、受信したデータブロックは除外データまたは中間コードであるため、コントローラ１０７は、受信したブロックを使用して格納されたＣｌａｓｓ２  ｃｏｄｅをＲｅａｄ  Ｍｏｄｉｆｙ  Ｗｒｉｔｅにより更新する。【０１６７】
まず、コントローラ１０７は、正引きテーブル６０１を参照して、更新対象のＣｌａｓｓ２  ｃｏｄｅを特定する（Ｓ１１１５）。具体的には、コントローラ１０７は、受信したブロックの格納位置情報を参照し、当該格納位置情報に対応する正引きテーブル６０１のエントリを参照して、Ｃｌａｓｓ２  ｃｏｄｅ格納位置を特定する。【０１６８】
次に、コントローラ１０７は、特定したＣｌａｓｓ２  ｃｏｄｅの格納位置であるＬＢＡの排他を取得する（Ｓ１１１６）。コントローラ１０７は、逆引きテーブル６０２を取得して、更新対象のスロットを特定する（Ｓ１１１７）。具体的には、特定したＣｌａｓｓ２  ｃｏｄｅの格納ＬＢＡに対応する逆引きテーブル６０２のエントリを参照し、参照したエントリ中のパリティ構成情報から、受信したブロックの格納位置情報と一致するスロットを特定する。【０１６９】
コントローラ１０７は、更新対象のＣｌａｓｓ２  ｃｏｄｅをドライブ１０５から読み出し（Ｓ１１１８）、読み出したＣｌａｓｓ２  ｃｏｄｅと受信したブロックでＸＯＲ計算を行い、Ｃｌａｓｓ２  ｃｏｄｅを更新する（Ｓ１１１９）。コントローラ１０７は、更新したＣｌａｓｓ２  ｃｏｄｅをドライブ１０５に格納する（Ｓ１１２０）。【０１７０】
コントローラ１０７は、パリティ管理テーブル３０３の逆引きテーブル６０２を更新する（Ｓ１１２１）。具体的には、コントローラ１０７は、逆引きテーブル内にあるパリティ構成情報のうち、除外データの対象となるスロットの情報を消去する。受信ブロックが中間コードである場合は、パリティ管理テーブル３０３の更新は行わない。【０１７１】
コントローラ１０７は、Ｓ１１１６で取得した排他を解放する（Ｓ１１２２）。最後に、コントローラ１０７は、受信したブロックをアンドゥキャッシュに格納して、処理を終了する（Ｓ１１２４）。【０１７２】
図１２は、ホストＩ／Ｏ処理のフローチャートである。アプリケーションプログラムや仮想マシンといったホストからＩ／Ｏ要求を受信したときに、ノード１０１のコントローラ１０７で、ホストＩ／Ｏ処理プログラム３０６を実行することにより、ホストＩ／Ｏ処理が開始される。【０１７３】
まず、Ｉ／Ｏ要求を受信したノード（データストアノード）のコントローラ１０７で実行するホストＩ／Ｏ処理について説明する。【０１７４】
コントローラ１０７は、受信したＩ／Ｏ要求からＩ／Ｏ処理対象となるデータブロック位置（データブロックの格納先）を特定し、データブロック位置の排他を取得する（Ｓ１２０１）。これにより、Ｉ／Ｏ処理を並列して処理した場合でもデータ不整合が発生しないようにする。【０１７５】
コントローラ１０７は、Ｉ／Ｏ要求が読み出し処理かどうかを判定する（Ｓ１２０２）。Ｓ１２０２の判定の結果、読み出し処理である場合（Ｓ１２０２：Ｙ）、コントローラ１０７は、ドライブ１０５から要求対象のデータブロックを読み出して、読み出したデータブロックをホストに転送する（Ｓ１２０３）。最後に、コントローラ１０７は、取得していた排他を解放して処理を終了する（Ｓ１２１０）
Ｓ１２０２の判定の結果、Ｉ／Ｏ要求が読み出し処理ではなく書き込み処理である場合（Ｓ１２０２：Ｎ）、コントローラ１０７は、新規ライトかどうかを判定する（Ｓ１２０４）。Ｓ１２０４の判定の結果、新規ライトである場合（Ｓ１２０４：Ｙ）、コントローラ１０７は、Ｃｌａｓｓ１  ｃｏｄｅを計算する（Ｓ１２０８）。なお、Ｃｌａｓｓ１  ｃｏｄｅは、ストライプグループの構成がｍＤｎＰの場合、ｎ−１個だけ生成する。【０１７６】
Ｓ１２０４の判定の結果、新規ライトではなく更新ライトである場合（Ｓ１２０４：Ｎ）、コントローラ１０７は、ドライブ１０５からライト先アドレスに格納されたデータブロックを読み出して（Ｓ１２０５）、読み出したデータブロックとライトデータとで、データブロックの中間コードを計算する。同様に、コントローラ１０７は、Ｃｌａｓｓ１  ｃｏｄｅの中間コードを計算する（Ｓ１２０６）。【０１７７】
Ｃｌａｓｓ１  ｃｏｄｅの中間コードの計算方法について説明する。Ｃｌａｓｓ１  ｃｏｄｅの中間コードの計算方法は、書き込まれたライトデータブロックのブロックサイズおよび新規ライトか、更新ライトかにより、異なる。Ｃｌａｓｓ１  ｃｏｄｅの中間コード（Ｐｘ）は、以下のように計算する。【０１７８】
[数１]
Ｐｘ＝Ｐ１'＋Ｐ１
ここで、ＰｘはＣｌａｓｓ１  ｃｏｄｅの中間コードであり、Ｐ１'は新規ライトデータブロックにより生成したＣｌａｓｓ１  ｃｏｄｅ、Ｐ１は既にドライブ１０５へ書き出されたデータブロックで生成したＣｌａｓｓ１  ｃｏｄｅとする。数式１から数式５に関するＸＯＲ演算を、単に"＋"として表記する。【０１７９】
例として、ストライプグループの構成を４Ｄ２Ｐとし、４つのデータブロックを新規ライトで書き込む場合のＣｌａｓｓ１  ｃｏｄｅの中間コード（Ｐｘ）の計算方法を以下に示す。【０１８０】
[数２]
Ｐｘ＝Ｐ１'＋Ｐ１
＝（Ｄ１'＋Ｄ２'＋Ｄ３'＋Ｄ４'）＋（０＋０＋０＋０）
＝Ｄ１'＋Ｄ２'＋Ｄ３'＋Ｄ４'
ここで、新規ライト対象の４つのデータブロックを、Ｄ１'、Ｄ２'、Ｄ３'、Ｄ４'とする。０は０データを示す。【０１８１】
例として、ストライプグループの構成を４Ｄ２Ｐとし、２つのデータブロックを新規ライトで書き込む場合のＣｌａｓｓ１  ｃｏｄｅの中間コード（Ｐｘ）の計算方法を以下に示す。【０１８２】
[数３]
Ｐｘ＝Ｐ１'＋Ｐ１
＝（Ｄ１'＋Ｄ２'＋０＋０）＋（０＋０＋０＋０）
＝Ｄ１'＋Ｄ２'
ここで、新規ライト対象の２つのデータブロックを、Ｄ１'、Ｄ２'とする。【０１８３】
新規ライトの場合、新規ライト対象のデータブロック以外のストライプは、０データとして扱い、Ｃｌａｓｓ１  ｃｏｄｅの中間コード（Ｐｘ）を生成する。０データのＸＯＲ演算は、結果に影響を与えないため、上記のようになる。新規ライト対象のデータブロックの数が、１ブロックや３ブロックの場合も同様に計算できる。【０１８４】
例として、ストライプグループの構成を４Ｄ２Ｐとし、４つのデータブロックを更新ライトで書き込む場合のＣｌａｓｓ１  ｃｏｄｅの中間コード（Ｐｘ）の計算方法を以下に示す。【０１８５】
[数４]
Ｐｘ＝Ｐ１'＋Ｐ１
＝（Ｄ１'＋Ｄ２'＋Ｄ３'＋Ｄ４'）＋（Ｄ１＋Ｄ２＋Ｄ３＋Ｄ４）
＝Ｍ１＋Ｍ２＋Ｍ３＋Ｍ４
ここで、更新ライト対象の４つのデータブロックを、Ｄ１'、Ｄ２'、Ｄ３'、Ｄ４'とする。また、既にドライブ１０５に書き込まれているデータブロックをＤ１、Ｄ２、Ｄ３、Ｄ４とする。また、更新ライト対象のデータブロックと、当該データブロックのライト先に格納されたデータブロックから計算する中間コードを、Ｍ１、Ｍ２、Ｍ３、Ｍ４とする。Ｍ１、Ｍ２、Ｍ３、Ｍ４は、それぞれＤ１'＋Ｄ１、Ｄ２'＋Ｄ２、Ｄ３'＋Ｄ３、Ｄ４'＋Ｄ４で計算される。【０１８６】
例として、ストライプグループの構成を４Ｄ２Ｐとし、２つのデータブロックを更新ライトで書き込む場合のＣｌａｓｓ１  ｃｏｄｅの中間コード（Ｐｘ）の計算方法を以下に示す。【０１８７】
[数５]
Ｐｘ＝Ｐ１'＋Ｐ１
＝（Ｄ１'＋Ｄ２'＋Ｄ３＋Ｄ４）＋（Ｄ１＋Ｄ２＋Ｄ３＋Ｄ４）
＝Ｍ１＋Ｍ２
ここで、更新ライト対象の２つのデータブロックを、Ｄ１'、Ｄ２'とする。また、既にドライブ１０５に書き込まれているデータブロックをＤ１、Ｄ２、Ｄ３、Ｄ４とする。また、更新ライト対象のデータブロックと、当該データブロックのライト先に格納されたデータブロックから計算する中間コードを、Ｍ１、Ｍ２とする。Ｍ１、Ｍ２は、それぞれＤ１'＋Ｄ１、Ｄ２'＋Ｄ２で計算される。【０１８８】
更新ライトの場合、更新ライト対象のデータブロックについて、既存データブロックとＸＯＲ計算することで、Ｃｌａｓｓ１  ｃｏｄｅの中間コード（Ｐｘ）を生成する。同データ同士のＸＯＲ演算は、０データとなり、結果に影響を与えないため、上記のようになる。更新ライト対象のデータブロックの数が、１ブロックや３ブロックの場合も同様に計算できる。【０１８９】
以上のように、書き込みパタンごとに適した計算方法により、Ｃｌａｓｓ１  ｃｏｄｅの中間コード（Ｐｘ）を計算することで、ＸＯＲ計算回数を減らし、パリティ計算処理を高速化する。【０１９０】
コントローラ１０７は、ストライプマッピングテーブル３０１を参照して、Ｃｌａｓｓ２  ｃｏｄｅの格納先となる宛先ノードを決定し、Ｓ１２０６で計算したデータブロックの中間コード、およびＣｌａｓｓ１  ｃｏｄｅの中間コードを宛先ノードへ転送する。データ転送の際、コントローラ１０７は、更新属性の情報を付与し、中間コードを転送する（Ｓ１２０７）。【０１９１】
コントローラ１０７は、ストライプマッピングテーブル３０１を参照して、Ｃｌａｓｓ２  ｃｏｄｅの格納先となる宛先ノードを決定し、Ｓ１２０８で計算したＣｌａｓｓ１  ｃｏｄｅとデータブロックを宛先ノードへ転送する。データ転送の際、コントローラ１０７は、新規属性の情報を付与し、Ｃｌａｓｓ１  ｃｏｄｅとデータブロックを転送する（Ｓ１２０９）。【０１９２】
なお、Ｓ１２０７およびＳ１２０９において、コントローラ１０７は、ノード状態管理テーブル３０４を参照して、ノード状態がクラスタ再構築中の場合は、進捗ポインタを参照し、データ格納先アドレスが既に、クラスタ再構築が完了しているかどうかを確認する。データ格納先アドレスのクラスタ再構築が完了している場合、コントローラ１０７は、新規ストライプマッピングテーブルに従い宛先ノードを決める。データ格納先アドレスのクラスタ再構築が未完了の場合、コントローラ１０７は、旧ストライプマッピングテーブルに従い宛先ノードを決める。【０１９３】
コントローラ１０７は、ローカルのドライブ１０５へ受信したライトデータブロックを書き込む（Ｓ１２１０）。最後に、コントローラ１０７は、Ｓ１２０１で取得したデータブロック位置の排他を解放して、データストアノードにおけるホストＩ／Ｏ処理を終了する（Ｓ１２１１）。【０１９４】
次に、宛先ノードであるパリティストアノードのコントローラ１０７で実行するホストＩ／Ｏ処理について説明する。本処理は、キャッシュ容量の消費量を定期的に確認し、非同期的に実行してもよいし、またはＳ１２０７またはＳ１２０９のデータ転送でパリティ生成用データを受信した契機で起動し、データストアノードにおけるホストＩ／Ｏ処理（ライト処理の場合）と同期的に実行してもよい。【０１９５】
コントローラ１０７は、キャッシュ消費量が閾値を超過しているかどうか確認する（Ｓ１２１２）。Ｓ１２１２の確認の結果、キャッシュ消費量が閾値を超過していない場合（Ｓ１２１２：Ｎ）、コントローラ１０７は、パリティストアノードにおけるホストＩ／Ｏ処理を終了する。【０１９６】
Ｓ１２１２の確認の結果、キャッシュ消費量が閾値を超過している場合（Ｓ１２１２：Ｙ）、コントローラ１０７は、フリーリスト６０３に空きがあるかどうかを確認する（Ｓ１２１３）。【０１９７】
Ｓ１２１３の確認の結果、フリーリスト６０３に空きがない場合（Ｓ１２１３：Ｎ）、新規Ｃｌａｓｓ２  ｃｏｄｅの書き出し先を確保できないため、コントローラ１０７は、既存Ｃｌａｓｓ２  ｃｏｄｅのうち、パリティ構成情報のいくつかのスロットが未使用のＣｌａｓｓ２  ｃｏｄｅを選択し、そのＣｌａｓｓ２  ｃｏｄｅへデステージ対象のデータブロックをＲｅａｄ  Ｍｏｄｉｆｙ  Ｗｒｉｔｅにより、更新する。まず、コントローラ１０７は、パリティ構成情報を参照して、いくつかのスロットが未使用となっているＣｌａｓｓ２  ｃｏｄｅを選択する（Ｓ１２１６）。次に、コントローラ１０７は、更新対象のＣｌａｓｓ２  ｃｏｄｅの排他を取得し（Ｓ１１１６）、選択したＣｌａｓｓ２  ｃｏｄｅをドライブから読み出す。（Ｓ１１１８）。次に、コントローラ１０７は、ダーティキャッシュに格納しているデータブロックのうち、未使用スロットに対応するデータブロックを選択し、選択したデータブロックを使用して、Ｃｌａｓｓ２  ｃｏｄｅを更新する（Ｓ１２１７）。例えば、図６に示すように、パリティ構成情報のうち、データストアノード番号０ｘ０３に接続されたドライブ番号０ｘ００００に対応するスロットが未使用である場合、ダーティキャッシュに格納されたデータブロックのうち、データストアノード番号０ｘ０３に接続されたドライブ番号０ｘ００００に格納されたデータブロックからコピーされたデータブロックが選択される。【０１９８】
次に、コントローラ１０７は、更新したＣｌａｓｓ２  ｃｏｄｅをドライブ１０５へ書き出し（Ｓ１１２０）、パリティ管理テーブルを更新する（Ｓ１１２１）。具体的には、更新に使用したデータブロックに対応する正引きテーブル６０１のエントリを更新したＣｌａｓｓ２  ｃｏｄｅの書き出し先アドレスで更新する。更に、コントローラ１０７は、更新したＣｌａｓｓ２  ｃｏｄｅに対応する逆引きテーブル６０２のエントリの未使用スロットを、Ｃｌａｓｓ２  ｃｏｄｅの再計算に使用したデータブロックの格納位置情報で更新する。最後に、コントローラ１０７は、取得した排他を解放して、処理を終了する（Ｓ１１２２）。【０１９９】
Ｓ１２１３の確認の結果、フリーリスト６０３に空きがある場合（Ｓ１２１３：Ｙ）、コントローラ１０７は、新規Ｃｌａｓｓ２  ｃｏｄｅの書き出し先を確保できるため、複数のデータブロックで新規Ｃｌａｓｓ２  ｃｏｄｅを計算し、ドライブ１０５へ書き出す。まず、コントローラ１０７は、フリーリスト６０３からＣｌａｓｓ２  ｃｏｄｅの書き出し先を取得し、ダーティキャッシュテーブル５０１から、同一ストライプグループ番号のデータブロック、またはＣｌａｓｓ１  ｃｏｄｅを選択する（Ｓ１２１４）。選択するデータブロック、またはＣｌａｓｓ１  ｃｏｄｅは、同一ストライプグループ番号であれば、任意のブロックでよい。次に、コントローラ１０７は、選択したデータブロック、またはＣｌａｓｓ１  ｃｏｄｅでＣｌａｓｓ２  ｃｏｄｅを計算する（Ｓ１２１５）。Ｃｌａｓｓ２  ｃｏｄｅは、ｍＤｎＰの場合、ｎ個だけ生成する。次に、コントローラ１０７は、書き出し先アドレスの排他を取得し（Ｓ１１１６）、Ｃｌａｓｓ２  ｃｏｄｅを書き出す（Ｓ１１２０）。【０２００】
次に、コントローラ１０７は、パリティ管理テーブル３０３を更新する（Ｓ１１２１）。具体的には、コントローラ１０７は、選択したデータブロックに対応する正引きテーブル６０１のエントリを取得した書き出し先アドレスで更新し、更に取得したＣｌａｓｓ２  ｃｏｄｅの書き出し先アドレスに対応する逆引きテーブル６０２のエントリを、Ｃｌａｓｓ２  ｃｏｄｅの計算に使用したデータブロックの格納位置情報で更新する。最後に、コントローラ１０７は、Ｓ１１１６で取得した排他を解放して、パリティストアノードにおけるホストＩ／Ｏ処理を終了する（Ｓ１１２２）。【０２０１】
図１３は、ロールバック処理のフローチャートである。データストアノードに障害が生じたとき、障害の発生したデータストアノードのパリティブロック（Ｃｌａｓｓ２  ｃｏｄｅ）を格納している各パリティストアノードのコントローラ１０７で、ロールバック処理プログラム３０７を実行することにより、ロールバック処理を行う。ロールバック処理では、データストアノードに障害が発生したときに、パリティストアノード間でＣｌａｓｓ２  ｃｏｄｅの整合性を確認し、不整合があった場合、Ｃｌａｓｓ２  ｃｏｄｅの整合性をとるための処理を行う。【０２０２】
まず、コントローラ１０７は、アンドゥキャッシュテーブル５０２の状態を参照して、全てのエントリに対して、整合性の確認をとったかどうか確認する（Ｓ１３０１）。Ｓ１３０１の確認の結果、全てのエントリに対して、まだ整合性がとれていない場合（Ｓ１３０１：Ｎ）、コントローラ１０７は、整合性を未確認であるキャッシュエントリを一つ選択する（Ｓ１３０２）。【０２０３】
次に、コントローラ１０７は、選択したエントリのＩ／Ｏ範囲情報から整合性をとるべき、他のパリティストアノードノード（問い合わせ先ノード）を選定する（Ｓ１３０３）。具体的には、コントローラ１０７は、Ｉ／Ｏ範囲における開始アドレスと、データ転送長から、ライト対象となったデータブロックを特定する。ライト先が複数のデータブロックに跨っている場合、それらのデータブロックのＣｌａｓｓ２  ｃｏｄｅを格納する他のパリティストアノードを、問い合わせ先ノードとして選定する。例えば、開始アドレスが０ｘ００００００００、データ転送長が１６ＫＢ、およびデータブロック単位が４ＫＢの場合、アドレス０ｘ００００００００から４ブロックが更新対象である。このため、これら４ブロックのストライプグループ番号をストライプマッピングテーブル３０１から求め、問い合わせ先ノードを選定する。【０２０４】
次に、コントローラ１０７は、選定した問い合わせ先ノードから、選択中のエントリと同タグ番号のエントリの世代番号を取得する（Ｓ１３０４）。コントローラ１０７は、取得した世代番号が、自ノードのエントリに記録された世代番号より小さいか否か確認する（Ｓ１３０５）
Ｓ１３０５の確認の結果、取得した世代番号が、自ノードのエントリに記録された世代番号より小さい場合（Ｓ１３０５：Ｙ）、コントローラ１０７は、最新ライトデータを未受信のパリティストアノードが存在するとして、自系ノードのＣｌａｓｓ２  ｃｏｄｅをロールバックすることで、Ｃｌａｓｓ２  ｃｏｄｅの整合性をとる。この処理は、Ｒｅａｄ  Ｍｏｄｉｆｙ  Ｗｒｉｔｅに使用するデータブロックが、ロールバック用ブロックであること（Ｓ１３０６）以外は、図１１で説明したフローチャートと同様である（Ｓ１１１５〜Ｓ１１１８、Ｓ１１２０〜Ｓ１１２２）。Ｓ１３０６では、コントローラ１０７は、選択中エントリのキャッシュエントリに格納されたデータブロック、または中間コードを使用して、Ｃｌａｓｓ２  ｃｏｄｅをＲｅａｄ  Ｍｏｄｉｆｙ  Ｗｒｉｔｅすることで、Ｃｌａｓｓ２  ｃｏｄｅを更新する。【０２０５】
コントローラ１０７は、アンドゥキャッシュテーブル５０２において、整合性を確認したエントリの状態を確認済み（ＣＨＥＣＫＥＤ）に更新して、当該エントリの確認を完了し、またＳ１３０１を実施する（Ｓ１３０７）。【０２０６】
Ｓ１３０５の確認の結果、取得した世代番号が、自ノードのエントリに記録された世代番号より小さくない場合も（Ｓ１３０５：Ｎ）、コントローラ１０７はＳ１３０７を実施する。【０２０７】
Ｓ１３０１の確認の結果、全てのエントリに対して、整合性の確認がとれた場合、コントローラ１０７はロールバック処理を終了する（Ｓ１３０１：Ｙ）。
【実施例２】
【０２０８】
図１４は、実施例２における分散型ストレージシステム１００の構成を示す図である。分散型ストレージシステム１００について、実施例１における図１が示す構成と、実施例１における図１４が示す構成との主な差は、実施例２のノード１０１のバックエンドポート１０８については、ネットワーク１０３に加えて、仮想的または物理的なバックエンドネットワーク１４０６を介して複数のフラッシュドライブ１４０１と接続されている点である。【０２０９】
以下、実施例１と同様の構成要素には同じ符号をつけて、説明を省略する。実施例１で説明した各種管理情報３０１〜３０４や各種プログラム３０５〜３０７、また各種処理（例えば図１０〜図１３の処理）については、以下特に説明がない限り、実施例２も同様である。【０２１０】
一つのサイトには、１または複数のノード１０１が設置されている。ノード１０１は、他のノード１０１を介することなく、バックエンドネットワーク１４０６を介してフラッシュドライブ１４０１それぞれと通信可能であり、ローカルなドライブ１０５として使用できる。一つのフラッシュドライブ１４０１は、一つのノード１０１とのみ通信する。【０２１１】
バックエンドネットワーク１４０６は、複数のノード１０１を相互接続してもよく、バックエンドネットワーク１４０６が接続されたノード１０１間は、バックエンドネットワーク１４０６を使用して通信してもよい。バックエンドネットワーク１４０６で接続されていないノード１０１間の通信は、ネットワーク１０３を使用する。【０２１２】
フラッシュドライブ１４０１は、ノード１０１と接続するためのインタフェース１４０２、データを一時的に格納するバッファメモリ１４０４、フラッシュドライブ１４０１を制御する内部プロセッサ１４０３、およびデータを格納する複数のフラッシュメモリ１４０５を含んで構成される。【０２１３】
本実施例は、パリティブロック（Ｃｌａｓｓ１  ｃｏｄｅまたはＣｌａｓｓ２  ｃｏｄｅ）の計算処理、当該パリティブロックのメタデータ管理、およびログストラクチャード形式でのデータ格納処理をフラッシュドライブ１４０１で実施する。これにより、ノード１０１は、パリティブロック（Ｃｌａｓｓ１  ｃｏｄｅまたはＣｌａｓｓ２  ｃｏｄｅ）の生成、当該パリティブロックの構成管理、ログストラクチャード形式を意識することなく、ライト処理を実施できるため、ノード１０１の処理負荷を削減でき、その分の計算リソ−スをアプリケーションプログラムや仮想マシンに割り当てることができる。【０２１４】
具体的には、実施例１で述べた各種管理情報３０１〜３０４をフラッシュドライブ１４０１内のバッファメモリ１４０４に格納し、一部プログラムをフラッシュドライブ１４０１内の内部プロセッサ１４０３で実行する。一部プログラムとは、パリティ計算およびパリティのメタデータ管理、およびログストラクチャード管理を実行するプログラムである。【０２１５】
なお、本発明は、上記した実施例に限定されるものではなく、様々な変形例が含まれる。実施例１と実施例２の構成は、他の実施例の構成要素と組合せて実施しても良い。実施例１または実施例２の構成の一部を、他の実施例の構成の一部と代替して実施しても良い。実施例１、実施例２の構成の一部を除いて実施しても良い。【０２１６】
また、以下の構成についても、実施例１または実施例２の技術的範囲に含まれる。【０２１７】
分散型ストレージシステム１００は、ＥＣグループを拡張または収縮する場合、各ノード１０１のデータに対し、変更前のＥＣグループの構成から、変更後のＥＣグループの構成へ論理構成を切り替える。【０２１８】
分散型ストレージシステム１００は、ＥＣグループの拡張または収縮前後の新旧ストライプマッピングテーブルを参照して、新旧ストライプマッピングテーブルのストライプグループ番号の割り当て状態とノード構成に応じて、分散型ストレージシステム１００のクラスタを再構築する。特に、分散型ストレージシステム１００は、新旧ストライプマッピングテーブルを比較し、新旧ストライプマッピングテーブルで割り当てられたストライプグループ番号が異なるデータブロックがある場合、以下の処理を実行する。以下、当該データブロックを「対象データブロック」と呼ぶ。対象データブロックとして、Ｃｌａｓｓ１  ｃｏｄｅを含んでいてもよい。【０２１９】
（１）分散型ストレージシステム１００は、旧ストライプマッピングテーブルにおけるストライプグループ番号が、新規ストライプマッピングテーブルに存在しないとき、旧ストライプマッピングテーブルにおけるストライプグループ番号で生成したパリティブロック（Ｃｌａｓｓ２  ｃｏｄｅ）を削除する通知をパリティストアノードに送信する。パリティストアノードは、当該Ｃｌａｓｓ２  ｃｏｄｅを削除する。【０２２０】
（２）分散型ストレージシステム１００は、旧ストライプマッピングテーブルにおけるストライプグループ番号が、新規ストライプマッピングテーブルに存在するとき、対象データブロックをパリティストアノードに送信する。パリティストアノードは、旧ストライプマッピングテーブルにおけるストライプグループ番号で生成したＣｌａｓｓ２  ｃｏｄｅの構成から対象データブロックを除去するように、Ｃｌａｓｓ２  ｃｏｄｅを更新する。【０２２１】
（３）分散型ストレージシステム１００は、対象データブロックを格納するデータストアノードが減設対象でなければ、パリティストアノードに対象データブロックを転送して、
新規ストライプマッピングテーブルにおけるストライプグループ番号で生成したパリティを生成または更新する。【０２２２】
分散型ストレージシステム１００は、動的に選択したデータでパリティを計算し、選択したデータの格納位置情報を記録するシステムであり、ＥＣグループの拡張または収縮に合わせ、管理情報（例えば、ストライプマッピングテーブル３０１等）を更新する。例えば、分散型ストレージシステム１００は、ＥＣグループを拡張するとき管理情報に新規スロットを追加し、０データとして初期化する。また、分散型ストレージシステム１００は、ＥＣグループを収縮するとき、管理情報から０データとなった既存スロットを削除する。【０２２３】
分散型ストレージシステム１００は、追加ノードへのライトデータのパリティ計算方法を、パリティ空間に空き容量に応じて、既存パリティを書き換えるか、新規パリティを生成するか切り替える。また、分散型ストレージシステム１００は、同じストライプから計算される複数のパリティを、ドライブ１０５の連続領域に格納する。【０２２４】
分散型ストレージシステム１００は、パリティを生成したデータまたは更新した中間コードを世代番号と共に管理し、データストアノードの障害時にノード１０１間で世代番号の整合性を確認して、必要であればパリティをロールバックする。【０２２５】
分散型ストレージシステム１００は、ＥＣグループを拡張または収縮する前後において、ストライプグループの組換え数が少なくなるように、ストライプマッピングテーブル３０１を更新する。分散型ストレージシステム１００は、データ転送先管理部と一次的なパリティ転送先管理部と二次的なパリティ転送先管理部の３つの部分に対して、順にストライプグループの割り当てを変更する。【０２２６】
分散型ストレージシステム１００は、ＥＣグループを拡張するのと同時にクラスタを構成するノード１０１を増設するとき、拡張後のＤ数に満たないストライプグループに対し、追加ノードのセルを組み込んでストライプグループを組み直す。また、分散型ストレージシステム１００は、拡張後のＤ数に満たないストライプグループを解散して、解散したストライプグループが割り当てられていたセルを、拡張後のＤ数に満たない他ストライプグループに組み込み、ストライプグループを組み直す。また、分散型ストレージシステム１００は、既存ノードに割り当てられたパリティのセルのうち、割り当て数に偏りがあるノードのセルを、同ノードでストライプグループが重複しないように追加ノードに割り当て直す。【０２２７】
分散型ストレージシステム１００は、既存パリティブロックに対して、ＲＭＷ（Ｒｅａｄ−Ｍｏｄｉｆｙ  Ｗｒｉｔｅ）動作により、パリティを構成するデータブロックに新規データブロックを追加することで、新規パタンにパリティブロックを書き換えて，ＥＣグループを拡張する。分散型ストレージシステム１００は、追加ノードに対してのライト要求時にパリティブロックの書き換えを実施することで、ＥＣグループ拡張でのネットワーク転送とライト時のデータ保護のためのネットワーク転送を共通化する。ネットワーク転送が必要なデータブロックを追加したノードに局所化することで，ＥＣグループ拡張中のネットワーク転送量を削減できる。【０２２８】
分散型ストレージシステム１００は、ＥＣグループを収縮するのと同時にクラスタを構成するノード１０１を減設するとき、除外ノードに割り当てられたセルを除外ノードと共にストライプマッピングテーブル３０１から除外してストライプグループを組み直す。分散型ストレージシステム１００は、収縮後のＤ数を超過するストライプグループのうち、いくつかのセルを選択し、それらで新規ストライプグループを組み直す。分散型ストレージシステム１００は、除外ノードに割り当てられたパリティのセルを、そのパリティを構成するデータブロックが割り当てられていない既存ノードのセルに割り当て直す。【０２２９】
分散型ストレージシステム１００は、上述したパリティの計算方法を、ドライブ１０５内部で実行する。【０２３０】
本発明の一態様によれば、分散型ストレージシステム１００は、ＥＣグループ拡縮前後のストライプマッピングテーブル３０１のストライプグループ番号の割り当て状態とノード構成に応じて、既存パリティブロックを書き換えるか（Ｒｅａｄ  Ｍｏｄｉｆｙ  Ｗｒｉｔｅ）、新規パリティブロックを生成するかを使い分けることで、ＥＣグループ拡縮時のパリティブロック組換え処理のライトペナルティを削減する。また、パリティ空間の空き容量に応じて、追加ノードへのライト時のパリティブロック計算方法を更新ライトと新規ライトで使い分けることにより、追加ノードに対するライトペナルティを削減する。さらに、パリティブロックの格納先数が冗長度に依存しない符号化方式において、ＥＣグループ拡縮の前後で、ストライプの組換え数が少なくなるように、ストライプマッピングテーブル３０１を更新することで、ノード間のデータ転送量を削減する。複数のストレージデバイスを含む分散型ストレージシステム１００において、ＥＣグループ拡縮時における、ライトペナルティおよびネットワーク転送量を削減することで、ＥＣグループ拡縮に要する時間の短縮でき、更にホストＩ／Ｏ性能を高めることができる。【０２３１】
分散型ストレージシステム１００は、データセット（ＥＣグループ、ストライプグループ）のデータ要素を増加させるとき、新たなノードにはゼロデータまたは冗長データを配置する。分散型ストレージシステム１００は、複数のノードを含むストレージシステムである。前記複数のノードの其々は、ストレージデバイスと、前記ストレージデバイスにデータを格納するコントローラと、を有する。前記複数のノードのコントローラのうち、少なくとも１以上のコントローラは、複数のデータと、前記複数のデータに対応する冗長データとからなる第１所定数のデータ要素で、データセットを構成する。当該コントローラは、前記データセットの前記第１所定数のデータ要素を、前記複数のノードのうち、第１所定数の第１ノードに分散して配置する。当該コントローラは、前記データセットを構成するデータ要素の数を、前記第１所定数から第２所定数増加させる指示を受信すると、前記データセットの前記第１所定数のデータ要素と、第２所定数のゼロデータとを、新たなデータ要素としてデータセットを再構成する。当該コントローラは、前記再構成したデータセットのデータ要素を、前記第１所定数の前記第１ノードと第２所定数の第２ノードに分散させる配置であって、前記再構成したデータセットのデータ要素のうち、前記第２所定数の前記第２ノードにはゼロデータまたは前記冗長データを配置するように制御する。【０２３２】
少なくとも１以上の前記コントローラは、前記再構成したデータセットのデータ要素を、前記第１所定数の前記第１ノードと前記第２所定数の前記第２ノードに分散させるとき、前記再構成したデータセットのデータ要素のうち、前記複数のデータ其々の配置先のノードは同じとなるように制御する。すなわち、データセットのデータ要素を増加させるとき、データ（ユーザデータ）は、他ノードに移動しないでよいので、データ転送量を削減できる。【０２３３】
前記第２所定数の前記第２ノードのうち、ゼロデータを配置したノードのコントローラは、前記ゼロデータの配置先に対する第１ライト要求を受信すると、前記ゼロデータの配置先に前記第１ライト要求の第１ライトデータを格納し、前記第１所定数の前記第１ノードと前記第２所定数の前記第２ノードのうち、前記再構成したデータセットの前記冗長データが配置されたノードに、前記第１ライトデータを送信するように制御する。前記第１ライトデータを受信したノードのコントローラは、前記再構成したデータセットの前記冗長データと前記第１ライトデータを基に、前記冗長データを更新するように制御する。ゼロデータを書き換えるときに、冗長データ（Ｃｌａｓｓ２  ｃｏｄｅ）をＲｅａｄ  Ｍｏｄｉｆｙ  Ｗｒｉｔｅで更新する。【０２３４】
前記第１ライトデータを受信したノードのコントローラは、前記冗長データの更新するとき、前記第１所定数の前記第１ノードと前記第２所定数の前記第２ノードのうち、前記第１ライトデータを送信したノード以外の他ノードに配置された前記複数のデータ及びゼロデータを用いずに、前記冗長データを更新するように制御する。冗長データ（Ｃｌａｓｓ２  ｃｏｄｅ）の更新に、ライトデータと冗長データ以外のデータは使わないでもよいので、データ転送量を削減できる。【０２３５】
前記第１所定数の前記第１ノードのうち、前記複数のデータを配置したノードのコントローラは、前記複数のデータのいずれかの配置先をライト先とする第２ライト要求を受信すると、前記ライト先に配置されたデータを読み出し、前記第２ライト要求の第２ライトデータと前記読み出したデータから中間コードを生成する。当該コントローラは、前記第２ライトデータに基づいて、ライト先に配置されたデータを更新する。当該コントローラは、前記第１所定数の前記第１ノードと前記第２所定数の前記第２ノードのうち、前記再構成したデータセットの前記冗長データが配置されたノードに、前記中間コードを送信するように制御する。前記中間コードを受信したノードのコントローラは、前記再構成したデータセットの前記冗長データと前記中間コードを基に、前記冗長データを更新するように制御する。データを書き換えるときに、中間コードを用いて、冗長データ（Ｃｌａｓｓ２  ｃｏｄｅ）をＲｅａｄ  Ｍｏｄｉｆｙ  Ｗｒｉｔｅで更新する。【０２３６】
前記中間コードを受信したノードのコントローラは、前記冗長データの更新するとき、前記第１所定数の前記第１ノードと前記第２所定数の前記第２ノードのうち、前記中間コードを送信したノード以外の他ノードに配置された前記データ及びゼロデータを用いずに、前記冗長データを更新するように制御する。冗長データ（Ｃｌａｓｓ２  ｃｏｄｅ）の更新に、中間コードと冗長データ以外のデータは使わないでもよいので、データ転送量を削減できる。【０２３７】
前記データセットの前記第１所定数のデータ要素を、前記第１所定数の前記第１ノードに分散して配置しているとき、前記第１所定数の前記第１ノードの其々は、前記データセットの前記第１所定数のデータ要素の配置を管理するストライプマッピング情報を有する。前記第１所定数の前記第１ノードのうち少なくとも１以上のノードは、前記データセットを構成するデータ要素の数を、前記第１所定数から前記第２所定数増加させる前記指示を受信すると、前記ストライプマッピング情報を、前記再構成したデータセットのデータ要素の配置を管理するように更新する。当該少なくとも１以上のノードは、前記第１所定数の前記第１ノードと前記第２所定数の前記第２ノードのうちの他ノードに前記更新したストライプマッピング情報を送信するように制御する。前記第１所定数の前記第１ノードと前記第２所定数の前記第２ノードの其々は、前記更新前のストライプマッピング情報と前記更新したストライプマッピング情報に基づいて、前記再構成したデータセットのデータ要素を分散させるように制御する。【０２３８】
前記第２所定数の前記第２ノードにゼロデータを配置する場合、前記第２所定数の前記第２ノードの其々は、当該ノードが有するストレージデバイスにゼロデータを格納する処理、または当該ノードにおけるゼロデータの配置先となるアドレスに、ゼロデータであることを示す情報を対応づけて管理する処理の少なくとも一方の処理を実行する。あるいは、前記第２所定数の前記第２ノードにゼロデータを配置する場合、前記第２所定数の前記第２ノードの其々は、当該ノードにおけるゼロデータの配置先となる論理アドレスに、当該ノードが有するストレージデバイスの実記憶領域を割り当てない。【０２３９】
前記第１所定数の前記第１ノードのそれぞれは、論理ボリュームを提供する。前記再構成前のデータセットに含まれる前記複数のデータの其々は、別々のノードが提供する論理ボリュームのデータである。【０２４０】
前記データセットを構成するデータ要素の数を、前記第１所定数から第２所定数増加させる指示を受信する前に、前記複数のノードに加えて、少なくとも前記第２所定数の前記第２ノードを追加してスケールアウトする。【０２４１】
前記第１所定数の前記第１ノードと第２所定数の第２ノードの其々は、各々のノードに配置する冗長データを格納するための空き容量であるパリティ空き容量を管理する。前記第１ライトデータ（新規ライトデータ）を受信したノード（パリティストアノード）のコントローラは、当該ノードにおけるパリティ空き容量が所定の容量以下である場合、前記再構成したデータセットの前記冗長データと前記第１ライトデータを基に、前記冗長データを更新して格納する。一方、前記第１ライトデータを受信したノードのコントローラは、当該ノードにおけるパリティ空き容量が所定の容量以下ではない場合、前記再構成したデータセットのデータ要素のうち、前記冗長データ以外のデータ要素を基に、前記再構成したデータセットの冗長データを生成し、当該パリティ空き容量の少なくとも一部に前記生成した冗長データを格納する。【０２４２】
前記再構成したデータセットのデータ要素に複数の冗長データが含まれ、前記第１所定数の前記第１ノードと第２所定数の第２ノードのうち、前記複数の冗長データと同数のノードに前記複数の冗長データを分散して配置する場合、前記複数の冗長データが配置された各ノードは、当該ノードに配置された冗長データと、当該冗長データを生成または更新したときのデータセットの世代を識別する世代番号と、を対応づけて管理する。前記再構成したデータセットのデータが配置されたノードに障害が発生した場合、前記冗長データが配置された少なくとも一以上のノードは、前記複数の冗長データが配置された各ノードが管理する世代番号を取得して、他ノードで管理する世代番号が自ノードで管理する世代番号より小さいか否か判定する。当該少なくとも一以上のノードは、当該判定の結果、他ノードで管理する世代番号が自ノードで管理する世代番号より小さい場合、他ノードで管理する世代番号のうち、一番小さい世代番号の世代のデータセットにおける冗長データに、自ノードの冗長データをロールバックしてリビルド処理を実行する。一方、当該少なくとも一以上のノードは、当該判定の結果、他ノードで管理する世代番号が自ノードで管理する世代番号より小さくない場合、自ノードで管理する冗長データでリビルド処理を実行する。【０２４３】
本発明の実施形態の例として、以下の（１）〜（４）のステップを前記少なくとも１以上のコントローラに実行させるプログラム、または当該プログラムを記録したコンピュータ読み取り可能な記録媒体を含む。【０２４４】
（１）複数のデータと、前記複数のデータに対応する冗長データとからなる第１所定数のデータ要素で、データセットを構成する。【０２４５】
（２）前記データセットの前記第１所定数のデータ要素を、第１所定数の第１ノードに分散して配置する。【０２４６】
（３）前記データセットを構成するデータ要素の数を、前記第１所定数から第２所定数増加させる指示を受信すると、前記データセットの前記第１所定数のデータ要素と、第２所定数のゼロデータとを、新たなデータ要素としてデータセットを再構成する。【０２４７】
（４）前記再構成したデータセットのデータ要素を、前記第１所定数の前記第１ノードと第２所定数の第２ノードに分散させる配置であって、前記再構成したデータセットのデータ要素のうち、前記第２所定数の前記第２ノードにはゼロデータまたは前記冗長データを配置する。【０２４８】
本発明の実施形態の例として、複数のノードを含むシステムの制御方法であって、以下の（５）〜（８）のステップを有する制御方法を含む。【０２４９】
（５）複数のデータと、前記複数のデータに対応する冗長データとからなる第１所定数のデータ要素で、データセットを構成する。【０２５０】
（６）前記データセットの前記第１所定数のデータ要素を、前記複数のノードのうち、第１所定数の第１ノードに分散して配置する。【０２５１】
（７）前記データセットを構成するデータ要素の数を、前記第１所定数から第２所定数増加させる指示を受信すると、前記データセットの前記第１所定数のデータ要素と、第２所定数のゼロデータとを、新たなデータ要素としてデータセットを再構成する。【０２５２】
（８）前記再構成したデータセットのデータ要素を、前記第１所定数の前記第１ノードと第２所定数の第２ノードに分散させる配置であって、前記再構成したデータセットのデータ要素のうち、前記第２所定数の前記第２ノードにはゼロデータまたは前記冗長データを配置する。
【符号の説明】
【０２５３】
１００  分散型ストレージシステム
１０１  ノード
１０２  内部ネットワーク
１０３  ネットワーク
１０４  メモリ
１０５  ドライブ
１０６  プロセッサ
１０７  コントローラ
１０８  バックエンドポート
【図１】
0006798007.tif 000002
【図２】
0006798007.tif 000003
【図３】
0006798007.tif 000004
【図４Ａ】
0006798007.tif 000005
【図４Ｂ】
0006798007.tif 000006
【図５】
0006798007.tif 000007
【図６】
0006798007.tif 000008
【図７】
0006798007.tif 000009
【図８Ａ】
0006798007.tif 000010
【図８Ｂ】
0006798007.tif 000011
【図９Ａ】
0006798007.tif 000012
【図９Ｂ】
0006798007.tif 000013
【図１０】
0006798007.tif 000014
【図１１】
0006798007.tif 000015
【図１２】
0006798007.tif 000016
【図１３】
0006798007.tif 000017
【図１４】
0006798007.tif 000018
【図１５】
0006798007.tif 000019