(57)【要約】  プロセッサと、メモリと、記憶領域とを含むノードを複数有し、前記プロセッサは、前記ストライプの更新処理を行う場合に、第１のノードに含まれるデータブロックと、前記第１のノードに含まれかつ処理対象ストライプに含まれるパリティブロックとから、中間パリティを生成し、前記中間パリティを、第２のノードに転送し、前記第２のノードのブロックにパリティとして格納させ、前記中間パリティを生成する基となったデータブロックと、前記パリティを格納したブロックと、前記第１及び第２のノード以外の処理対象ストライプ内のデータブロックと、でストライプを構成する。
2018229944.tif 000002
【特許請求の範囲】
【請求項１】
プロセッサと、メモリと、記憶領域とを含むノードを複数有し、複数の前記ノードでデータブロックとパリティブロックとを含んでストライプを構成するストレージシステムであって、
前記プロセッサは、前記ストライプの更新処理を行う場合に、
第１のノードに含まれるデータブロックと、前記第１のノードに含まれかつ処理対象ストライプに含まれるパリティブロックとから、中間パリティを生成し、
前記中間パリティを、第２のノードに転送し、前記第２のノードのブロックにパリティとして格納させ、
前記中間パリティを生成する基となったデータブロックと、前記パリティを格納したブロックと、前記第１及び第２のノード以外の処理対象ストライプ内のデータブロックと、でストライプを構成する
ことを特徴とするストレージシステム。
【請求項２】
請求項１に記載のストレージシステムであって、
前記パリティを格納する第２のノードは、前記更新処理前に前記処理対象ストライプのデータブロックを格納していないノードである
ことを特徴とするストレージシステム。
【請求項３】
請求項１に記載のストレージシステムであって、
前記第２のノードに含まれかつ前記処理対象ストライプに含まれるデータブロックと前記中間パリティとから、パリティを生成して、前記第２のノードに格納し、
前記ストライプの構成では、さらに、前記更新処理前には前記処理対象ストライプのデータブロックを格納していないノードに含まれる追加データブロックを含む
ことを特徴とするストレージシステム。
【請求項４】
請求項３に記載のストレージシステムであって、
前記追加データブロックは、前記パリティの値に影響しない所定のデータを格納する
ことを特徴とするストレージシステム。
【請求項５】
請求項１に記載のストレージシステムであって、
前記ストライプを構成した場合に、前記処理対象ストライプを解除する
ことを特徴とするストレージシステム。
【請求項６】
請求項１に記載のストレージシステムであって、
前記中間パリティを生成する基となったデータブロックは、前記処理対象ストライプの更新処理後に、当該構成したストライプと、他のストライプとに所属し、
前記他のストライプが処理対象ストライプとして更新処理された場合に、前記他のストライプから除外されることを特徴とする
ことを特徴とするストレージシステム。
【請求項７】
請求項６に記載のストレージシステムであって、
前記パリティは、前記処理対象ストライプの更新処理よりも前の更新処理で他のストライプより除外されたブロックに格納されることを特徴とする
ことを特徴とするストレージシステム。
【請求項８】
請求項１に記載のストレージシステムであって、
前記ノードが追加された場合に、複数のストライプに前記更新処理を行う
ことを特徴とするストレージシステム。
【請求項９】
プロセッサと、メモリと、記憶領域とを含むノードを複数有し、複数の前記ノードでデータブロックとパリティブロックとを含んでストライプを構成するストレージシステムの制御方法であって、
前記プロセッサは、前記ストライプの更新処理を行う場合に、
第１のノードに含まれるデータブロックと、第１のノードに含まれかつ処理対象ストライプに含まれるパリティブロックとから、中間パリティを生成し、中間パリティ生成工程と、
前記中間パリティを、第２のノードに転送し、前記第２のノードのブロックにパリティとして格納させるパリティ格納工程と、
前記中間パリティを生成する基となったデータブロックと、前記パリティを格納したブロックと、前記第１及び第２のノード以外の処理対象ストライプ内のデータブロックと、でストライプを構成するストライプ構成工程と、
を行うことを特徴とするストレージシステムの制御方法。 
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ストレージシステムに関する。
【背景技術】
【０００２】
ＩＴ投資額が横ばいになる一方で、データ量の増大化が進んでいる。ストレージシステムのコスト低減がますます重要となってきている。【０００３】
例えば、分散型ストレージシステムの一つとして、多数の汎用サーバをネットワークにより接続しストレージプールを生成する、ＳｅｒｖｅｒＳＡＮ型ストレージシステムが、将来に普及すると見られている。特に、大規模なビッグデータ分析等のためにサーバＮｏｄｅに高速なＳＳＤを搭載して高性能な分析を狙うシステムにおいて、ＳｅｒｖｅｒＳＡＮ型ストレージシステムは、有効なソリューションであると考えられる。【０００４】
また、複数のストレージ装置（Ｎｏｄｅ）により、ＲＡＩＤ（Ｒｅｄｕｎｄａｎｔ  Ａｒｒａｙ  ｏｆ  Ｉｎｅｘｐｅｎｓｉｖｅ（またはＩｎｄｅｐｅｎｄｅｎｔ）  Ｄｉｓｋｓ）グループを構成し、ＲＡＩＤグループに基づいて生成された論理ボリュームを、上位装置（例えばホストコンピュータ）へ提供するストレージシステムが知られている。【０００５】
このような冗長構成のストレージシステムでは、ＲＡＩＤグループのビットコスト、即ち容量効率はＲＡＩＤを構成するデータブロック数と冗長化のための保護ブロック（ミラーブロック、またはパリティブロック）数の比率によって決まる。ＲＡＩＤ５、またはＲＡＩＤ６の構成において、データブロック（Ｄ）の数をｎとし、パリティブロック（Ｐ）の数をｍとするストライプ構成、即ちｎＤ＋ｍＰで構成されたＲＡＩＤグループの容量効率は、ｎ／（ｎ＋ｍ）となる。例えば、３Ｄ＋１Ｐ（ＲＡＩＤ５）で構成されたＲＡＩＤグループの容量効率は、３／（３＋１）＝７５％である。【０００６】
本技術分野の背景技術として、特許文献１には、ＳｅｒｖｅｒＳＡＮ型ストレージシステムにおいて、Ｗｒｉｔｅデータを各Ｎｏｄｅへ適切に分散配置することで、リードレイテンシを削減しつつ高信頼なシステムを構築する方法が開示されている。【０００７】
また、本技術分野の他の背景技術として、特許文献２には、既存のＲＡＩＤグループを拡張することにより、システムの容量効率を改善する方法が開示されている（例：３Ｄ＋１Ｐ→４Ｄ＋１Ｐ）。
【先行技術文献】
【特許文献】
【０００８】
【特許文献１】国際公開第２０１６／０５１５１２号
【特許文献２】特開２０１０−６６８３２号公報
【発明の概要】
【発明が解決しようとする課題】
【０００９】
特許文献１では、ＲＡＩＤグループ構成（ストライプ構成とも呼称する）を維持したＮｏｄｅ増設方法が開示されている。近年では、ストレージシステムの導入コストを削減するため、小規模構成で運用を開始（スモールスタート）し、事業規模等に応じて順次Ｎｏｄｅを増設していく運用ケースが増加している。【００１０】
しかしながら、小規模構成で運用を開始し、特許文献１に記載の方法でＮｏｄｅ増設を行った場合、Ｎｏｄｅ数が増加しても容量効率の高いストライプ構成での運用ができないという課題があった。【００１１】
具体的には、例えば、Ｎｏｄｅ数を３で運用を開始した場合、ストライプを構成する各データは全て異なるＮｏｄｅ内に格納しなければならないというＲＡＩＤ５の制約から、２Ｄ＋１Ｐ（容量効率６７％）が最も容量効率のよいストライプ構成となる。【００１２】
一方で、Ｎｏｄｅ数を１０で運用を開始した場合、９Ｄ＋１Ｐ（容量効率９０％）といった容量効率の高いストライプ構成での運用も可能であるが、前述の通り、Ｎｏｄｅ数が３から増設を繰り返してＮｏｄｅ数が１０となった場合、容量効率６７％の状態で運用を継続せざるを得ない。【００１３】
また、特許文献２では、ストライプ構成を拡張することにより、システムの容量効率を改善する方法が開示されている。しかし、特許文献２に記載の方法では、システム内に格納されている全データの再配置が必要となる。特に、本発明の主な対象であるＳｅｒｖｅｒＳＡＮ型のストレージシステム、すなわちＳｃａｌｅ−ｏｕｔ型のシステムでは、一般的にＮｏｄｅ間の帯域がストレージ内部の帯域に比べて狭いことが多く、ストライプ構成の拡張処理が完了するまでに膨大な時間を要してしまうという課題があった。【００１４】
そこで本発明は、ストライプ構成を拡張する際に、Ｎｏｄｅ間でのデータの移動量を削減して、ノードの増設処理を高速化することを目的とする。
【課題を解決するための手段】
【００１５】
本発明は、プロセッサと、メモリと、記憶領域とを含むノードを複数有し、複数の前記ノードでデータブロックとパリティブロックとを含んでストライプを構成するストレージシステムであって、前記プロセッサは、前記ストライプの更新処理を行う場合に、第１のノードに含まれるデータブロックと、前記第１のノードに含まれかつ処理対象ストライプに含まれるパリティブロックとから、中間パリティを生成し、前記中間パリティを、第２のノードに転送し、前記第２のノードのブロックにパリティとして格納させ、前記中間パリティを生成する基となったデータブロックと、前記パリティを格納したブロックと、前記第１及び第２のノード以外の処理対象ストライプ内のデータブロックと、でストライプを構成する。
【発明の効果】
【００１６】
本発明によれば、ストライプの構成を拡張する際にＮｏｄｅ間のデータ移動量を削減する。これにより、Ｓｃａｌｅ−ｏｕｔ構成において、データの再配置の移動量を低減して高速に容量効率を改善することができる。
【図面の簡単な説明】
【００１７】
【図１】本発明の実施例１を示し、計算機システムのハードウェア構成の一例を示すブロック図である。
【図２】本発明の実施例１を示し、キャッシュメモリの制御情報格納領域の一例を示すブロック図である。
【図３】本発明の実施例１を示し、キャッシュメモリの制御プログラム格納領域の一例を示すブロック図である。
【図４】本発明の実施例１を示し、記憶ドライブのデータ構成の一例を示すブロック図である。
【図５Ａ】本発明の実施例１を示し、ＲＡＩＤグループ構成の一例を示す図である。
【図５Ｂ】本発明の実施例１を示し、ＲＡＩＤグループ構成のデータ配置の一例を示す図である。
【図６】本発明の実施例１を示し、計算機システムの記憶領域の論理構成の一例を示す図である。
【図７】本発明の実施例１を示し、ストライプ管理テーブルの一例を示す図である。
【図８】本発明の実施例１を示し、Ｎｏｄｅ管理テーブルの一例を示す図である。
【図９】本発明の実施例１を示し、ドライブ管理テーブルの一例を示す図である。
【図１０】本発明の実施例１を示し、Ｐｏｏｌ  Ｖｏｌｕｍｅ管理テーブルの一例を示す図である。
【図１１】本発明の実施例１を示し、Ｐｏｏｌ管理テーブルの一例を示す図である。
【図１２】本発明の実施例１を示し、ＶＶＯＬ管理テーブルの一例を示す図である。
【図１３Ａ】本発明の実施例１を示し、パリティＮｏｄｅテーブルの一例を示す図である。
【図１３Ｂ】本発明の実施例１を示し、未割当ブロック管理テーブルの一例を示す図である。
【図１４】本発明の実施例１を示し、Ｎｏｄｅ増設時のストライプ構成の更新処理の概要を示す図である。
【図１５】本発明の実施例１を示し、Ｎｏｄｅ増設処理の一例を示すフローチャートである。
【図１６】本発明の実施例１を示し、ストライプ構成の更新処理の一例を示すフローチャートである。
【図１７】本発明の実施例１を示し、ストライプ構成の更新処理（周期）の一例を示すフローチャートである。
【図１８】本発明の実施例１を示し、ストライプ構成の更新処理（周期先頭）の一例を示すフローチャートである。
【図１９】本発明の実施例１を示し、ストライプ構成の更新処理（周期中盤）の一例を示すフローチャートである。
【図２０】本発明の実施例１を示し、ストライプ構成の更新処理（周期終端前）の一例を示すフローチャートである。
【図２１】本発明の実施例１を示し、ストライプ構成の更新処理（周期終端）の一例を示すフローチャートである。
【図２２】本発明の実施例１を示し、ストライプ構成の更新処理（端数）の一例を示すフローチャートである。
【図２３】本発明の実施例１を示し、ストライプ構成の更新処理（端数＝１）の一例を示すフローチャートである。
【図２４】本発明の実施例１を示し、ストライプ構成の更新処理（端数２以上）の一例を示すフローチャートである。
【図２５】本発明の実施例１を示し、Ｎｏｄｅ障害時のリビルド処理の一例を示すフローチャートである。
【図２６】本発明の実施例２を示し、管理サーバの構成の一例を示すブロック図である。
【発明を実施するための形態】
【００１８】
以下、本発明の一実施形態について添付図面を用いて説明する。
【００１９】
なお、以下の説明では、「ａａａテーブル」の表現にて各種情報を説明することがあるが、各種情報は、テーブル以外のデータ構造で表現されていても良い。データ構造に依存しないことを示すために「ａａａテーブル」を「ａａａ情報」と呼ぶこともできる。
【００２０】
また、以下の説明では、「プログラム」を主語として処理を説明する場合があるが、プログラムは、プロセッサ（例えばＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ））によって実行されることで、定められた処理を、適宜に記憶資源（例えばメモリ）及び／又は通信インタフェースデバイス（例えばポート）を用いながら行うため、処理の主語がプログラムとされても良い。
【００２１】
プログラムを主語として説明された処理は、プロセッサ或いはそのプロセッサを有する計算機（例えば、管理計算機、ホスト計算機、コントローラ等）が行う処理としても良い。また、コントローラ（ストレージコントローラ）は、プロセッサそれ自体であっても良いし、コントローラが行う処理の一部又は全部を行うハードウェア回路を含んでも良い。プログラムは、プログラムソースから各コントローラにインストールされても良い。プログラムソースは、例えば、プログラム配布サーバ又はコンピュータ読取可能な記憶メディアであっても良い。
【００２２】
また、以下の説明では、要素の識別情報として、ＩＤが使用されるが、それに代えて又は加えて他種の識別情報が使用されてもよい。また、以下の説明では、同種の要素を区別しないで説明する場合には、参照符号又は参照符号における共通番号を使用し、同種の要素を区別して説明する場合は、その要素の参照符号を使用又は参照符号に代えてその要素に割り振られたＩＤを使用することがある。
【００２３】
また、以下の説明では、Ｉ／Ｏ（Ｉｎｐｕｔ／Ｏｕｔｐｕｔ）要求は、ライト要求又はリード要求であり、アクセス要求と呼ばれてもよい。
【実施例１】
【００２４】
本実施例１に係るストレージシステムを含む計算機システムの概要を説明する。図１は、本実施例１に係る計算機システムのハードウェア構成の一例を示すブロック図である。【００２５】
計算機システム１は、１以上のホスト計算機（以下、ホストという）１０と、管理サーバ２０と、複数のＮｏｄｅ１００−１〜１００ｎとを含む。ホスト１０と、管理サーバ２０と、Ｎｏｄｅ１００−１〜１００ｎとは、ネットワーク１５０を介して接続されている。なお、Ｎｏｄｅ１００の個々を特定しない場合には、「−」以降を省略した符号「１００」を用いる。他の構成要素の符号についても同様である。【００２６】
ネットワーク１５０は、ローカルエリアネットワーク（ＬＡＮ：Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）であっても良く、ワイドエリアネットワーク（ＷＡＮ：Ｗｉｄｅ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）であってもよい。また、ホスト１０とＮｏｄｅ１００が一つの計算機であってもよい。また、ホスト１０とＮｏｄｅ１００−１〜１００ｎのそれぞれが仮想マシンであってもよい。【００２７】
ホスト１０は、例えば、アプリケーションを実行する計算機であり、アプリケーションにより利用されるデータをＮｏｄｅ１００から読み出し、アプリケーションにより生成されたデータをＮｏｄｅ１００へ書き込む。【００２８】
管理サーバ２０は、管理者によって使用される計算機である。管理サーバ２０は、情報を入力するための入力デバイス（図示省略）と、情報を表示するための出力デバイス（図示省略）とを含んでもよい。管理サーバ２０は、入力デバイスに対する管理者の操作により、Ｎｏｄｅ１００の増設または縮退時のデータの再配置処理の設定を受け付け、Ｎｏｄｅ１００に受け付けたデータの再配置処理を実行させる。【００２９】
Ｎｏｄｅ１００は、１以上のポート１１０と、１以上の管理Ｉ／Ｆ１２０と、１以上のＣＰＵ１３０と、１以上のキャッシュメモリ（図中ＣＭ：Ｃａｃｈｅ  Ｍｅｍｏｒｙ）１４０と、１以上の記憶ドライブ１６０と、内部ネットワーク１５０とを有する。【００３０】
ポート１１０と、管理Ｉ／Ｆ１２０と、ＣＰＵ１３０と、ＣＭ１４０、及び記憶ドライブ１６０は、内部ネットワーク１５０を介して接続されている。【００３１】
ポート１１０は、ホスト１０とのインタフェースの一例である。ポート１１０は、Ｎｏｄｅ１００を、ネットワーク１５０等を介して、他のＮｏｄｅ１００等の種々の装置と接続する。【００３２】
管理Ｉ／Ｆ１１２は、Ｎｏｄｅ１００を、管理サーバ２０と接続するためのインタフェースである。ポート１１０と、管理Ｉ／Ｆ１２０は、同一のものであっても良い。【００３３】
ＣＰＵ１３０は制御部であり、キャッシュメモリ１４０の制御プログラム格納領域１４２に格納されたプログラムを実行して各種処理を実行する。ＣＰＵ１３０は、各種コマンド（例えばＳＣＳＩにおけるＲＥＡＤコマンドやＷＲＩＴＥコマンドなど）を記憶ドライブ１６０に送信する。【００３４】
キャッシュメモリ１４０は、ホスト１０から記憶ドライブ１６０に書き込むデータ（ライトデータ）や、記憶ドライブ１６０から読み出したデータ（リードデータ）を一時的に格納する。【００３５】
また、キャッシュメモリ１４０内には、各種プログラムを格納する制御プログラム格納領域１４２と、各種情報を格納する制御情報格納領域１４１が設定される。なお、これらの情報は、キャッシュメモリ１４０以外の専用メモリ上に格納されていてもよく、また、記憶ドライブ１６０、キャッシュメモリ１４０内の複数の構成の記憶領域を用いて論理的な共有メモリを構成し、各種情報についてキャッシュ管理を行うようにしてもよい。【００３６】
記憶ドライブ１６０は、１以上の記憶媒体を含む。記憶媒体は、例えば、磁気ディスク、フラッシュメモリ、その他の不揮発性半導体メモリ（ＰＲＡＭ、ＲｅＲＡＭ等）である。【００３７】
Ｎｏｄｅ１００は、複数の記憶ドライブ１６０の記憶領域で構成される容量プール（以下、単にプールという）を管理する。Ｎｏｄｅ１００は、プール内の記憶領域を用いてＲＡＩＤグループを構成する。すなわち、Ｎｏｄｅ１００は、各Ｎｏｄｅ内の記憶ドライブ１６０を用いて、複数の論理的なＲＡＩＤグループを構成する。【００３８】
当該論理的なＲＡＩＤグループは、複数のサブ記憶領域列で構成されている。各サブ記憶領域列は、複数のサブ記憶領域で構成されている。複数のサブ記憶領域は、ＲＡＩＤグループを構成する複数の記憶ドライブ１６０に跨っており、複数の記憶ドライブ１６０にそれぞれ対応している。【００３９】
ここで、一つのサブ記憶領域を、「ストライプブロック」と呼び、サブ記憶領域列を、「ストライプ」と呼ぶ。複数のストライプ列によって、ＲＡＩＤグループの記憶領域が構成されている。【００４０】
ＲＡＩＤには、いくつかのレベル（以下、「ＲＡＩＤレベル」という）がある。例えば、ＲＡＩＤ５では、ＲＡＩＤ５に対応したホストコンピュータから指定された書き込み対象のデータは、所定サイズのデータ（以下、便宜上「データ単位」という）に分割される。各データ単位は、複数のデータ要素に分割される。複数のデータ要素は、同一のストライプ内の複数のストライプブロックにそれぞれ書き込まれる。【００４１】
ＲＡＩＤ５では、記憶ドライブ１６０、またはＮｏｄｅ１００に障害が発生したことにより、対応する記憶ドライブ１６０から読み出せなくなったデータ要素をリビルドするために、各データ単位に対して、"パリティ"と呼ばれる冗長な情報（以下、「冗長コード」）が生成される。【００４２】
冗長コードも、複数のデータ要素と同一のストライプ内のストライプブロックに書き込まれる。本実施例１では、ストライプブロックのうち、ユーザデータが格納されるものを「データブロック」と呼び、パリティデータが格納されるものを「パリティブロック」と呼ぶ。【００４３】
例えば、ＲＡＩＤグループを構成する記憶ドライブ１６０（すなわちＮｏｄｅ１００）の数が４である場合、そのうちの３個の記憶ドライブ１６０に対応する３個のデータブロックに、データ単位を構成する３個のデータ要素が書き込まれ、残りの一つの記憶ドライブ１６０に対応するパリティブロックに、冗長コードが書き込まれる。以下、データ要素と冗長コードとを区別しない場合には、両者をそれぞれストライプブロックということもある。【００４４】
ＲＡＩＤ６では、各データ単位に対して、２種類の冗長コード（Ｐパリティ、Ｑパリティという）が生成されて、それぞれの冗長コードが同一のストライプ内の異なるパリティブロックに書き込まれる。これにより、データ単位を構成する複数のデータ要素のうちの２個のデータ要素を読み出すことができない場合に、２種類の冗長コードから、これら２個のデータ要素を復元することができる。【００４５】
上記に説明した以外にもＲＡＩＤレベルは存在する（例えばＲＡＩＤ１〜４）。データの冗長化技術として、３重ミラー（Ｔｒｉｐｌｉｃａｔｉｏｎ）や、パリティを３個用いたトリプルパリティ技術等も知られている。冗長コードの生成技術についても、ガロア演算を用いたＲｅｅｄ−ｓｏｌｏｍｏｎ符号や、ＥＶＥＮ−ＯＤＤ等さまざまな技術が存在する。以下においては、主にＲＡＩＤ５について説明するが、冗長化技術を上述した方法に置き換え可能である。【００４６】
Ｎｏｄｅ１００は、記憶ドライブ１６０のうちいずれかの記憶ドライブ１６０、あるいはＮｏｄｅ１００のうちいずれかのＮｏｄｅ１００が故障した場合に、故障した記憶ドライブ１６０に格納されているデータ要素を復元する。【００４７】
すなわち、ノード１００内の記憶ドライブ１６０でＲＡＩＤグループを構成し、さらに、ノード１００間でＲＡＩＤグループを構成するようにしても良い。【００４８】
ＣＰＵ１３０は、故障した記憶ドライブ１６０に格納されていたデータ要素を復元するために必要なストライプブロック（例えば、他のデータブロック及びパリティブロック）を、ポート１１０を介して、当該データを格納している他の複数のＮｏｄｅ内の記憶ドライブ１６０から取得する。ＣＰＵ１３０は、取得したストライプブロックをキャッシュメモリ１４０に格納する。その後、キャッシュメモリ１４０のストライプブロックに基づいてストライプブロックまたはパリティブロックを復元し、当該ストライプブロックを所定の記憶ドライブ１６０に格納する。【００４９】
例えば、ＲＡＩＤ５で構成されたＲＡＩＤグループのストライプブロックに対して、ＣＰＵ１３０は、ストライプを構成する複数のデータブロックの排他的論理和（ＸＯＲ）を演算することによってＰパリティを生成する。ＲＡＩＤ６で構成されたＲＡＩＤグループのデータブロックに対して、ＣＰＵ１３０は、更に、ストライプを構成する複数のデータブロックに所定の係数を掛けた後、それぞれのデータブロックの排他的論理和を演算することによって、Ｑパリティを生成する。【００５０】
以下、ＣＰＵ１３０の処理をＮｏｄｅ１００の処理として説明することがある。【００５１】
図２は、キャッシュメモリ１４０内の制御情報格納領域１４１を示すブロック図である。【００５２】
制御情報格納領域１４１は、ストライプ管理テーブル１００１と、Ｎｏｄｅ管理テーブル１００２と、ドライブ管理テーブル１００３と、Ｐｏｏｌ  Ｖｏｌｕｍｅ管理テーブル１００４と、Ｐｏｏｌ管理テーブル１００５と、ＶＶＯＬ管理テーブル１００６と、パリティＮｏｄｅテーブル１００７と、更新中ストライプ管理テーブル１００９と、未割当ブロック管理テーブル１００８と、コピーポインタ１０１０とを格納する。各情報については後述する。【００５３】
図３は、キャッシュメモリ１４０内の制御プログラム格納領域１４２を示すブロック図である。【００５４】
制御プログラム格納領域１４２は、Ｎｏｄｅ増設処理プログラム１１０１と、ストライプ更新処理プログラム１１０２と、リビルド処理プログラム１１０３と、Ｉ／Ｏ処理プログラム１１０４とを格納する。なお、Ｉ／Ｏ処理プログラム１１０４以外の各プログラムの処理については後述する。Ｉ／Ｏ処理プログラム１１０４は、アクセス要求を受け付けて記憶ドライブ１６０に読み書きを実行するプログラムで、周知または公知の技術を適用すればよい。【００５５】
ＣＰＵ１３０は、各プログラムを実行することによって、所定の機能を提供する機能部として稼働する。例えば、ＣＰＵ１３０は、Ｎｏｄｅ増設処理プログラム１１０１に従って処理することでＮｏｄｅ増設部として機能する。他のプログラムについても同様である。さらに、ＣＰＵ１３０は、各プログラムが実行する複数の処理のそれぞれの機能を提供する機能部としても稼働する。計算機及び計算機システムは、これらの機能部を含む装置及びシステムである。【００５６】
ノード１００の各機能を実現するプログラム、テーブル等の情報は、記憶ドライブ１６０や不揮発性半導体メモリ、ハードディスクドライブ、ＳＳＤ（Ｓｏｌｉｄ  Ｓｔａｔｅ  Ｄｒｉｖｅ）等の記憶デバイス、または、ＩＣカード、ＳＤカード、ＤＶＤ等の計算機読み取り可能な非一時的データ記憶媒体に格納することができる。【００５７】
図４は、記憶ドライブ１６０のデータ構成の一例を示すブロック図である。【００５８】
記憶ドライブ１６０は、Ｎｏｄｅ１００等の装置との間で、ＳＣＳＩコマンド処理の最小単位（例えば、５１２Ｂｙｔｅ）であるサブブロック２００を単位として、データの受け渡しを行う。【００５９】
スロット２０１は、キャッシュメモリ１４０上でのデータをキャッシュする際の管理単位であり、例えば、２５６ＫＢである。スロット２０１は、連続する複数のサブブロック２００の集合で構成される。ストライプブロック２０２は、複数（例えば、２個）のスロット２０１を格納する。【００６０】
図５Ａ、図５Ｂは、本実施例１に係るＲＡＩＤグループ構成の概略図である。【００６１】
図５Ａは各Ｎｏｄｅ１００−１〜１００−４内の記憶ドライブ１６０、及びストライプ構成の詳細を示す図である。図５ＢはＮｏｄｅ１００−１〜１００−４内のストライプブロック２０２の配置を示す図である。図示では、ｎ＝４として、４つのＮｏｄｅ１００でＲＡＩＤ５のグループを構成する例を示す。【００６２】
各Ｎｏｄｅ１００には、複数の記憶ドライブ１６０が含まれており、記憶ドライブ１６０は、一定サイズのストライプブロック２０２に分割されている。【００６３】
計算機システム１では、管理サーバ２０が、各Ｎｏｄｅ１００−１〜１００−４内の所定のストライプブロック２０２を選択し、Ｎｏｄｅ１００−１〜１００−４間で論理的なＲＡＩＤグループ（ストライプ２０３）を構成する。なお、図５Ａにおいて、Ｎｏｄｅ１００−３については図示を省略した。【００６４】
図５Ｂでは、例えば、ストライプ２０３−０は、「Ａ０」、「Ｂ０」、「Ｃ０」、「Ｐ０」のストライプブロック２０２で構成される。「Ａ０」、「Ｂ０」、「Ｃ０」、「Ｐ０」は、それぞれ各Ｎｏｄｅ１００−１〜１００−４のドライブ＃０の先頭のストライプブロック２０２から構成されている。【００６５】
図５Ｂでは、各ノード１００−１〜１００−４で、ストライプ２０３−０〜２０３−９を構成した例を示す。【００６６】
以下では、図中「Ａ０」、「Ｂ０」、「Ｃ０」のように、ユーザデータが格納されるストライプブロック２０２をデータブロックと呼び、図中「Ｐ０」のように、パリティデータが格納されるストライプブロック２０２をパリティブロックと呼ぶ。【００６７】
ストライプ２０３を構成するストライプブロック２０２のうち、２以上のストライプブロック２０２が同一のＮｏｄｅ１００に存在した場合、Ｎｏｄｅ障害発生時に、ストライプ２０３の冗長度が一度に２以上低下してしまい、データロストが発生する可能性がある。そのため、全てのストライプ２０３は、異なるＮｏｄｅ１００内のストライプブロック２０２から構成される必要がある。【００６８】
また、ストライプ２０３を構成するストライプブロック２０２の数は、必ずしもＮｏｄｅ１００の数と同じである必要はなく、例えばＮｏｄｅ１００の数が１０で構成されている計算機システム１で、３Ｄ＋１Ｐのストライプを構成する場合は、１０台のＮｏｄｅ１００のうち４つのＮｏｄｅ１００を選択し、各Ｎｏｄｅ１００内で所定のストライプブロック２０２でストライプ２０３を構成すればよい。【００６９】
なお、以降の説明では、Ｎｏｄｅ１００内の記憶ドライブ１６０の構成を説明する必要がある場合のみ図５Ａを用いて説明し、それ以外は、説明の簡略化のため図５Ｂを用いて説明する。【００７０】
図６は、本実施例１に係る計算機システムの論理構成の一例を示す図である。【００７１】
計算機システム１は、該複数のＮｏｄｅ１００内の記憶ドライブ１６０の領域を束ねて、１以上の容量プール２１０（以下単にプールとも呼ぶ）を構成する。プール２１０は、記憶ドライブ１６０の全領域から、パリティブロックが格納されている領域を除いた、データブロックで構成される。【００７２】
前述したように、各Ｎｏｄｅ１００内の記憶ドライブ１６０は、例えば、フラッシュメモリドライブ、ＳＡＳドライブ、ＳＡＴＡドライブなど、性能や特性が異なる複数種類の記憶デバイスで構成される場合がある。プール２１０内に性能や特性の異なる記憶ドライブ１６０が混在した場合、性能の低い記憶ドライブ１６０がボトルネックとなってしまう。【００７３】
そのため、プール２１０は、単一の性能や特性を有する記憶ドライブ１６０で構成されることが望ましい。例えば、各Ｎｏｄｅ１００内に性能や特性の異なる記憶ドライブ１６０が存在する場合は、その性能や特性に応じて複数のプール２１０を構成すればよい。或いは、プール２１０内を、論理的なパーティション（またはＴｉｅｒ）で区切り、後述するページ２１３を、単一のＴｉｅｒ内に存在するデータブロックで構成するようにしてもよい。【００７４】
各Ｎｏｄｅ１００は、内部の物理的な記憶領域を所定のサイズに切り分けて、Ｐｏｏｌ  Ｖｏｌｕｍｅ２１１（ＰｏｏｌＶｏｌとも呼ぶ）を生成する。Ｐｏｏｌ  Ｖｏｌｕｍｅ２１１は、記憶ドライブ１６０の性能を最大限に発揮するため、単一の性能や特性を有する記憶ドライブ１６０で構成されることが望ましい。【００７５】
各Ｎｏｄｅ１００は、Ｐｏｏｌ  Ｖｏｌｕｍｅ２１１を適切なプール２１０に割り当てることにより、プール２１０を構成する。言い換えれば、プール２１０は、複数のＰｏｏｌ  Ｖｏｌｕｍｅ２１１から構成されていると考えることもできる。同一のＮｏｄｅ１００内のＰｏｏｌ  Ｖｏｌｕｍｅ２１１は、必ずしも同一のプール２１０に割り当てられる必要はなく、複数のプール２１０に分けて割り当てても良い。図６の例では、Ｎｏｄｅ＃３の４つのＰｏｏｌ  Ｖｏｌｕｍｅ２１１は、プール＃０とプール＃１にそれぞれ２つずつ割り当てられている。【００７６】
プール２１０内には複数の仮想ボリューム（ＶＶＯＬ：Ｖｉｒｔｕａｌ  ＶＯＬｕｍｅ）２１２が生成される。ＶＶＯＬ２１２は、仮想的な記憶デバイスであり、ホスト１０から参照されることができる。計算機システム１の管理者からの指示に応じて、管理サーバ２０は、Ｎｏｄｅ１００の管理Ｉ／Ｆ１２０を介して、所定のサイズのＶＶＯＬ２１２を生成させる。【００７７】
生成させるサイズは、実際の記憶ドライブ１６０の総使用可能容量に依存しない。各Ｎｏｄｅ１００は、ホスト１０からのＩ／Ｏ要求（ホストＩ／Ｏ）により示されたＶＶＯＬ２１２内の記憶領域（ＶＶＯＬページ２１３）に対して、プール２１０内の記憶領域（ＰｏｏｌＶｏｌページ２１４）をＶＶＯＬ２１２へ動的に割り当てる。ＶＶＯＬ２１２の記憶領域は、ＶＶＯＬページ２１３で管理することができる。【００７８】
ＶＶＯＬページ２１３を異なるＰｏｏｌ  Ｖｏｌｕｍｅ２１１に所属するストライプブロック２０２で構成した場合、同一のＶＶＯＬページ２１３に対するＩ／Ｏが、複数のＮｏｄｅ１００に分散されてしまい、Ｎｏｄｅ１００の間転送によるレイテンシの増加が問題となる。このため、ＶＶＯＬページ２１３は本実施例１のように同一のＰｏｏｌ  Ｖｏｌｕｍｅ２１１内のストライプブロック２０２から構成されることが望ましい。【００７９】
ＰｏｏｌＶｏｌページ２１４は、容量プール２１０内の１以上のデータブロックから構成される。ＰｏｏｌＶｏｌページ２１４を構成するデータブロック数は、計算機システム内で一意に定められるが、ＲＡＩＤグループの構成には依存しないため、ＲＡＩＤグループの構成を変更した場合も、ＰｏｏｌＶｏｌページ２１４とデータブロック間の割当を変更する必要はない。【００８０】
プール２１０内に複数のＴｉｅｒが存在する場合、Ｎｏｄｅ１００は、ＶＶＯＬページ２１３毎にアクセス頻度を記録し、アクセス頻度の高いＶＶＯＬページ２１３に対して、例えばフラッシュメモリドライブのような高性能な記憶ドライブ１６０内で構成されるＰｏｏｌＶｏｌページ２１４を割り当てるようにしてもよい。Ｎｏｄｅ１００は、継続的にＶＶＯＬページ２１３の負荷を監視して、周期的にＶＶＯＬページ２１３の割り当てを変更してもよい。【００８１】
図７は、ストライプ管理テーブル１００１の一例を示す図である。ストライプ管理テーブル１００１は、計算機システム１で共通の情報であり、ストライプ２０３を構成する、各Ｎｏｄｅ１００内のストライプブロックの組み合わせを示す情報である。なお、計算機システム１で共通の情報は、例えば、他のＮｏｄｅ１００及び管理サーバ２０から参照可能である。【００８２】
ストライプ管理テーブル１００１は、ストライプ２０３の識別子を格納するＳｔｒｉｐｅ＃２０００と、計算機システム１を構成する各Ｎｏｄｅ１００の識別子毎のストライプ２０３の格納位置を保持するＮｏｄｅ＃２００１と、ストライプ２０３に含まれるパリティブロックの格納位置のＮｏｄｅ１００の識別子を格納するＰａｒｉｔｙ  Ｎｏｄｅ＃２００２と、次回に処理するフラグを格納するＮＥＸＴ２００３のフィールドを一つのエントリに含む。図示では、Ｎｏｄｅ１００が「＃０」〜「＃４」の５つで構成される例を示す。【００８３】
Ｓｔｒｉｐｅ＃２０００はストライプ２０３の識別子であり、各Ｎｏｄｅ＃２００１は、各Ｓｔｒｉｐｅ＃２０００に対応するＮｏｄｅ内のストライプブロック位置（ＬＢＡ＃：Ｌｏｇｉｃａｌ  Ｂｌｏｃｋ  Ａｄｄｒｅｓｓ）を示し、Ｐａｒｉｔｙ  Ｎｏｄｅ＃２００２はパリティブロックの格納されているＮｏｄｅ１００を示す。【００８４】
本テーブルにより、Ｎｏｄｅ１００は、各ストライプ２０３を構成するＮｏｄｅ＃２００１、及びＮｏｄｅ１００内のストライプブロック位置と、パリティブロックが格納されているＮｏｄｅ１００を参照することができる。【００８５】
例えば、図７の例では、Ｓｔｒｉｐｅ＃２０００＝「０」のストライプ２０３は、（Ｎｏｄｅ＃、ＬＢＡ＃）＝（０、０ｘ００）、（１、０ｘ００）、（２、０ｘ００）、（３、０ｘ０１）、（４、０ｘ００）の４つストライプブロック２０２から構成されており、Ｎｏｄｅ＃４のストライプブロック２０２がパリティブロックである。【００８６】
図７は、ストライプあたりのパリティブロック数が１、すなわちＲＡＩＤ５の場合のストライプ管理テーブルの例であるが、ストライプあたりのパリティブロック数が２、すなわちＲＡＩＤ６の場合は、Ｐａｒｉｔｙ  Ｎｏｄｅ＃２００２に、Ｑパリティブロック分のフィールドが追加される。【００８７】
また、構成によっては、ストライプ２０３が、計算機システム１内の全Ｎｏｄｅ１００に跨っていない場合も考えられる。この場合は、各Ｓｔｒｉｐｅ＃２０００を構成するストライプブロック２０２が格納されているＮｏｄｅ＃２００１にのみＮｏｄｅ１００内のストライプブロック位置（ＬＢＡ＃）が格納され、それ以外のＮｏｄｅ＃２００１には所定の無効値が格納される。【００８８】
ＮＥＸＴ２００３には、次回の処理でストライプ更新処理の対象となるフラグが格納され、次回に処理するストライプには「１」が設定される。【００８９】
なお、後述するように、Ｎｏｄｅ１００を増設する際のストライプ２０３の再構成では、ストライプ管理テーブル１００１の更新（ストライプ構成の更新）が実施される。ストライプ構成の更新時には、当該ストライプ管理テーブル１００１に加え、更新中ストライプ管理テーブル１００９を用いて処理をする。更新中ストライプ管理テーブル１００９のフィールドは、図７のストライプ管理テーブル１００１と同様である。更新中ストライプ管理テーブル１００９は、ストライプ構成の更新処理中に、更新後のストライプ構成を示す情報が適宜格納されていく。【００９０】
また、ストライプ構成の更新処理は、後述するように、ＲＡＩＤグループに新たなＮｏｄｅ１００を追加する際に実行される処理で、パリティブロックを格納するＮｏｄｅ１００を分散させる処理である。【００９１】
図８は、Ｎｏｄｅ管理テーブル１００２の一例を示す図である。Ｎｏｄｅ管理テーブル１００２は、計算機システム１で共通の情報であり、各Ｎｏｄｅ１００の状態を管理する情報である。なお、計算機システム１で共通の情報は、例えば、他のＮｏｄｅ１００及び管理サーバ２０から参照可能である。【００９２】
Ｎｏｄｅ管理テーブル１００２は、Ｎｏｄｅ１００の識別子を格納するＮｏｄｅ＃２０１０と、各Ｎｏｄｅ１００の状態を格納するＳｔａｔｕｓ２０１１のフィールドを含む。Ｎｏｄｅ＃２０１０はＮｏｄｅの識別子であり、Ｓｔａｔｕｓ２０１１には、正常（Ｎｏｒｍａｌ）、または障害（Ｆａｉｌｅｄ）など、対応するＮｏｄｅ１００の状態が格納される。【００９３】
図９は、ドライブ管理テーブル１００３の一例を示す図である。ドライブ管理テーブル１００３は、Ｎｏｄｅ１００ごとに管理される情報であり、Ｎｏｄｅ１００内のドライブ情報を管理する情報である。なお、計算機システム１で共通の情報は、例えば、他のＮｏｄｅ１００及び管理サーバ２０から参照可能である。【００９４】
ドライブ管理テーブル１００３は、Ｐｏｏｌ  Ｖｏｌｕｍｅ＃２０２０と、Ｔｙｐｅ２０２１と、Ｄｒｉｖｅ＃２０２２と、Ｓｉｚｅ２０２３と、Ｓｔａｔｕｓ２０２４のフィールドを一つのエントリに含む。【００９５】
Ｐｏｏｌ  Ｖｏｌｕｍｅ＃２０２０にはＰｏｏｌ  Ｖｏｌｕｍｅ２１１の識別子が格納される。Ｔｙｐｅ２０２１にはＳＳＤや、ＮＬ（Ｎｅａｒ  Ｌｉｎｅ）−ＳＡＳなどの記憶ドライブ１６０の種別が格納される。【００９６】
Ｄｒｉｖｅ＃２０２２には、各Ｎｏｄｅ１００内で一意に定まる記憶ドライブ１６０の識別子が格納される。Ｓｉｚｅ２０２３には各記憶ドライブ１６０の容量（例えばサブブロック２００単位）が格納される。Ｓｔａｔｕｓ２０２４には各記憶ドライブ１６０の状態が格納される。【００９７】
ドライブ管理テーブル１００３により、Ｎｏｄｅ１００は、Ｎｏｄｅ１００内の記憶ドライブ１６０の数量や、種別や、容量および、状態を取得することができる。【００９８】
また、Ｓｔａｔｕｓ２０２４には、「Ｎｏｒｍａｌ（正常）」、「Ｆａｉｌｅｄ（障害）」などのドライブ状態が格納されるが、これ以外にも、予防保守を目的として、エラー回数が閾値を超過した記憶ドライブ１６０に対して、「Ｗａｒｎｉｎｇ（警告）」などの状態を格納しても良い。【００９９】
図１０は、Ｐｏｏｌ  Ｖｏｌｕｍｅ管理テーブル１００４の一例を示す図である。【０１００】
Ｐｏｏｌ  Ｖｏｌｕｍｅ管理テーブル１００４は、計算機システム１で共通の情報であり、各Ｐｏｏｌ  Ｖｏｌｕｍｅ２１１の容量、及びＰｏｏｌ  Ｖｏｌｕｍｅ２１１の存在するＮｏｄｅ１００を計算機システム１が管理するために用いられる。なお、計算機システム１で共通の情報は、例えば、他のＮｏｄｅ１００及び管理サーバ２０から参照可能である。【０１０１】
Ｐｏｏｌ  Ｖｏｌｕｍｅ管理テーブル１００４は、Ｐｏｏｌ  Ｖｏｌｕｍｅ２１１の識別子を格納するＰｏｏｌ  Ｖｏｌｕｍｅ＃２０３０と、Ｐｏｏｌ  Ｖｏｌｕｍｅ２１１の種別を格納するＴｙｐｅ２０３１と、Ｐｏｏｌ  Ｖｏｌｕｍｅ２１１の容量を格納するＳｉｚｅ２０３２と、Ｐｏｏｌ  Ｖｏｌｕｍｅ２１１が割り当てられたＮｏｄｅ１００の識別子を格納するＮｏｄｅ＃２０３３のフィールドを一つのエントリに含む。【０１０２】
Ｐｏｏｌ  Ｖｏｌｕｍｅ管理テーブル１００４を参照することにより、計算機システム１は、各Ｐｏｏｌ  Ｖｏｌｕｍｅ２１１の容量と、種別、及びそのＮｏｄｅ１００の識別子を取得することができ、Ｐｏｏｌ２１０にどのＰｏｏｌ  Ｖｏｌｕｍｅ２１１を追加するかを決定する場合などに使用される。【０１０３】
図１１は、Ｐｏｏｌ管理テーブル１００４の一例を示す図である。【０１０４】
Ｐｏｏｌ管理テーブル１００５は、計算機システム１で共通の情報であり、各Ｐｏｏｌ２１０を計算機システム１が管理するために用いられる。なお、計算機システム１で共通の情報は、例えば、他のＮｏｄｅ１００及び管理サーバ２０から参照可能である。【０１０５】
Ｐｏｏｌ管理テーブル１００５は、Ｐｏｏｌ＃２０４０と、Ｓｉｚｅ２０４１と、Ｕｎｕｓｅｄ２０４２と、Ｐｏｏｌ  Ｖｏｌｕｍｅ＃２０４３のフィールドを一つのエントリに含む。【０１０６】
Ｐｏｏｌ＃２０４０には、プール２１０の識別子が格納される。Ｓｉｚｅ２０４１にはプール２１０全体の容量（ブロック数）が格納される。Ｕｎｕｓｅｄ２０４２には、Ｓｉｚｅ２０４１のうち、使用可能な容量（ブロック数）が格納される。また、Ｐｏｏｌ  Ｖｏｌｕｍｅ＃２０４３には、当該Ｐｏｏｌ２１０に割り当てられている全Ｐｏｏｌ  Ｖｏｌｕｍｅ２１１の識別子が格納される。Ｐｏｏｌ管理テーブル１００４を参照することにより、計算機システム１は、各Ｐｏｏｌ２１０の使用状況を取得することができる。【０１０７】
図１２は、ＶＶＯＬ管理テーブル１００６の一例を示す図である。ＶＶＯＬ管理テーブル１００６は、計算機システム１で共通の情報であり、ＶＶＯＬページ２１３と、ＰｏｏｌＶｏｌページ２１４との対応関係を示す情報である。なお、計算機システム１で共通の情報は、例えば、他のＮｏｄｅ１００及び管理サーバ２０から参照可能である。【０１０８】
ＶＶＯＬ管理テーブル１００６は、ＶＶＯＬ＃２０５０と、ＶＶＯＬページ＃２０５２と、ＰｏｏｌＶｏｌ＃２０５３と、ＰｏｏｌＶｏｌページ＃２０５４のフィールドを一つのエントリに含む。【０１０９】
ＶＶＯＬ＃２０５０には、ＶＶＯＬ２１２の識別子が格納される。Ｓｉｚｅ２０５１には、当該ＶＶＯＬ２１２の容量（ブロック数）が格納される。ＶＶＯＬページ＃２０５２には、当該ＶＶＯＬに含まれるＶＶＯＬページ２１３の識別子が格納される。【０１１０】
ＰｏｏｌＶｏｌ＃２０５２には、当該ＶＶＯＬ２１２に割り当てられたＰｏｏｌＶｏｌｕｍｅ２１１の識別子が格納される。Ｐｏｏｌ  Ｖｏｌページ＃２０５４には、当該ＶＶＯＬページ２１３に割り当てられたＰｏｏｌＶｏｌページ２１４の識別子が格納される。【０１１１】
未使用のＶＶＯＬページ＃２０５２に対応するＰｏｏｌＶｏｌ＃２０５３及びＰｏｏｌＶｏｌページ＃２０５４には、「未割当」に相当する値が格納される。ＶＶＯＬ管理テーブル１００６を参照することにより、計算機システム１は、ＶＶＯＬ２１２の使用状況や、割当先の情報を取得することができる。【０１１２】
図１３Ａは、パリティＮｏｄｅテーブル１００７の一例を示す図である。【０１１３】
パリティＮｏｄｅテーブル１００７は、計算機システム１で共通の情報であり、後述するストライプ構成の更新処理にて、パリティブロックが格納されるＮｏｄｅ１００を分散するために使用される情報である。なお、計算機システム１で共通の情報は、例えば、他のＮｏｄｅ１００及び管理サーバ２０から参照可能である。【０１１４】
パリティＮｏｄｅテーブル１００７は、サイクル内インデックス（図中Ｉｎ−Ｃｙｃｌｅ  Ｉｎｄｅｘ）＃２０６０と、Ｐａｒｉｔｙ  Ｎｏｄｅ＃２０６１のフィールドを一つのエントリに含む。【０１１５】
後述するストライプ構成の更新処理は、Ｎ＋２個のストライプ２０３ごとに周期的な処理であり、サイクル内インデックス＃２０６０には、０からＮ＋１まで周期内のオフセット値が周期内のインデックスとして格納される。なお、Ｎは、新たなＮｏｄｅ１００を追加する前のデータブロックを含むＮｏｄｅ１００の数を示す。換言すれば、Ｎは、Ｎｏｄｅ１００を拡張する前のデータブロック数となる。【０１１６】
Ｐａｒｉｔｙ  Ｎｏｄｅ＃２０６１には、当該オフセット値に対応するストライプ２０３において、パリティブロックが格納されているＮｏｄｅ１００を表す。【０１１７】
本実施例１では、図１４で示すように、４つのＮｏｄｅ１００で３Ｄ＋１ＰのＲＡＩＤグループに、１つのＮｏｄｅ１００を追加する例を示す。【０１１８】
４つのＮｏｄｅ１００に、１つのＮｏｄｅ１００を追加する場合、５つのＮｏｄｅ１００にパリティブロックを分散させる処理を後述するように実施する。本実施例１の場合、ストライプ構成の更新処理を５回繰り返すことで、新たに追加するＮｏｄｅ１００にもパリティブロックを分散させて、同一のＮｏｄｅ１００に重複することなく、各Ｎｏｄｅ１００にパリティブロックを分散させる。すなわち、本実施例１の場合、５回の処理が１つの周期となる。【０１１９】
パリティＮｏｄｅテーブル１００７の使用については、後述のストライプ構成の更新処理を説明する際に詳細を述べる。【０１２０】
図１３Ｂは、未割当ブロック管理テーブルの一例を示す図である。未割当ブロック管理テーブル１００８は、計算機システム１で共通の情報であり、後述するストライプ構成の更新処理にて、更新後のパリティブロックを格納する領域を取得するために使用される情報である。なお、計算機システム１で共通の情報は、例えば、他のＮｏｄｅ１００及び管理サーバ２０から参照可能である。【０１２１】
未割当ブロック管理テーブル１００８は、Ｎｏｄｅ＃２０７０と、ＬＢＡ＃２０７１のフィールドを一つのエントリに含む。Ｎｏｄｅ＃２０７０にはＮｏｄｅ１００の識別子が格納される。ＬＢＡ＃２０７１には未割当となったブロックのアドレスが格納される。【０１２２】
後述するストライプ構成の更新処理では、更新前のストライプ構成で一時的に未割当となるブロックが存在する。当該ブロックを識別するための情報が、Ｎｏｄｅ＃２０７０と、ＬＢＡ＃２０７１である。【０１２３】
未割当ブロック管理テーブル１００８の使用については、後述のストライプ構成の更新処理を説明する際に詳細を述べる。【０１２４】
図１４は、本実施例１に係る、Ｎｏｄｅ１００の増設時に実行されるストライプ構成の更新処理の概要を示す図である。本実施例１では、Ｎｏｄｅ１００−１〜１００−４（＃０〜
＃３）で構成された３Ｄ＋１ＰのＲＡＩＤグループに、新たなＮｏｄｅ１００−５（＃４）を追加する例を示す。なお、以下の説明では、Ｎｏｄｅ１００−１〜１００−５をＮｏｄｅ＃０〜Ｎｏｄｅ＃４として説明する。また、新たに追加するＮｏｄｅ＃４を増設Ｎｏｄｅとする。【０１２５】
（１）は増設直後のＮｏｄｅ１００の構成を示す。具体的には、Ｎｏｄｅ＃０〜＃３の４つのＮｏｄｅで３Ｄ＋１ＰのＲＡＩＤグループを構成していた状態から、１Ｎｏｄｅ（Ｎｏｄｅ＃４）を追加した直後の状態である。図中で、"Ａｘ"、"Ｂｘ"などはデータブロックを示し、"Ｐｘ"はパリティブロックを示す。ただし、ｘ＝０〜ｎ。【０１２６】
また、図中太線で接続されたストライプブロック２０２は、１つのストライプ２０３を構成するストライプブロック２０２であることを示す。図１４の例では、Ａ０、Ｂ０、Ｃ０、Ｐ０がストライプ２０３−０を構成している。【０１２７】
なお前提として、増設したＮｏｄｅ（Ｎｏｄｅ＃４）のストライプブロック２０２には、すべてゼロ（パリティの値に影響しない所定のデータ）が格納されているか、或いは内部的にゼロが格納されているとみなして処理を行う。【０１２８】
以下では便宜上、Ｎｏｄｅ＃０のストライプブロック＃ｘを含むストライプ２０３のストライプ＃（番号）を、ストライプ＃ｘと定義する。ただし、ｘ＝０〜ｎ。すなわち、Ａ０を含むストライプをストライプ＃０とし、Ａ１を含むストライプ２０３をストライプ＃１とする。【０１２９】
（２）はストライプ＃０を再構成する例を示す。計算機システム１は、まずストライプ＃０のパリティブロック（Ｐ０）と、当該パリティブロックを含むＮｏｄｅ（Ｎｏｄｅ＃３）のうち所定のデータブロック（Ｄ１）から、中間パリティ（Ｐｉ）を演算して生成する。【０１３０】
計算機システム１は、当該中間パリティ（Ｐｉ）を、増設Ｎｏｄｅ（Ｎｏｄｅ＃４）内の所定のブロックに新パリティ（Ｐ'０）として格納する。本実施例１において、中間パリティ（Ｐｉ）はＰ０  ＸＯＲ  Ｄ１で算出される。"ＸＯＲ"は、排他的論理和演算を行う演算子である。以下では、簡略化のためＸＯＲ演算子を図中"＋"の記号を用いて記述する。【０１３１】
上記処理により、ストライプ＃０（２０３−０'）を構成するストライプブロック２０２は、Ａ０、Ｂ０、Ｃ０、Ｄ１、Ｐ'０に更新される。なお、Ｐ０＝Ａ０＋Ｂ０＋Ｃ０、及びＰ'０＝Ｐｉ＝Ｐ０＋Ｄ１であるから、Ｐ'０＝Ａ０＋Ｂ０＋Ｃ０＋Ｄ１となり、Ｐ'０は、ストライプ＃０のパリティとしての要件を満たしている。【０１３２】
また、上記ストライプ＃０の再構成によって、ストライプ＃０から除外（無効化）されたパリティブロック（Ｐ０）は、未割当ブロック管理テーブル１００８に当該ブロックの情報（Ｎｏｄｅ１００の識別子とブロックの位置）が格納される。ストライプ＃０から除外されたパリティブロック（Ｐ０）は、未割り当てのストライプブロック２０２として管理される。【０１３３】
また、上記処理では、中間パリティＰｉのみを他のＮｏｄｅ＃４に転送すればよいので、Ｎｏｄｅ間のデータの移動を低減して処理の遅延を抑制することができる。【０１３４】
また、中間パリティＰｉは、ストライプ＃０に所属していたパリティブロック（Ｐ０）と、当該パリティブロックと同一のＮｏｄｅ＃３で、ストライプ＃０に新たに追加されたデータブロック（Ｄ１）とで排他的論理和を演算する。したがって、同一のＮｏｄｅ内のストライプブロック２０２からパリティの演算を行えば良いので、Ｎｏｄｅ間のアクセスを不要にして、演算処理を高速化できる。【０１３５】
（３）はストライプ＃１（２０３−１'）を再構成する例を示す。再構成処理を行うストライプ＃１の順序は、前回のストライプの処理における中間パリティの生成時に、どのストライプ＃のデータブロックを用いたかによって一意に決定される。この決定の詳細は後述する。【０１３６】
計算機システム１は、まずストライプ＃１のパリティブロック（Ｐ１）と、当該パリティブロックを含むＮｏｄｅ（Ｎｏｄｅ＃２）のうち所定のデータブロック（Ｃ２）から、排他的論理和によって中間パリティ（Ｐｉ）を生成する。【０１３７】
次に、計算機システム１は、生成した当該中間パリティ（Ｐｉ）を、前回のストライプの処理（インデックス＃＝０）において、無効化されたパリティブロック（Ｐ０）が格納されているＮｏｄｅ（Ｎｏｄｅ＃３）に転送する。なお、計算機システム１は、図１３Ｂに示した未割当ブロック管理テーブル１００８を参照することで、無効化されたパリティブロック（Ｐ０）の位置（Ｎｏｄｅ、ＬＢＡ）を取得することができる。【０１３８】
次に、中間パリティ（Ｐｉ）を受信したＮｏｄｅ＃３では、ストライプ＃１に対応するデータブロック（Ｄ１）と、当該中間パリティ（Ｐｉ）の排他的論理和によって、新たなパリティ（Ｐ'１）を生成し、無効化されたパリティブロック（Ｐ０）の位置に格納する。【０１３９】
本実施例１において、新たなパリティ（Ｐ'１）は、Ｐｉ＋Ｄ１で算出される。その後、増設Ｎｏｄｅ＃４内の所定のデータブロック（Ｅ１）を更新後のストライプ＃１のデータブロックとして定義する。なお、増設Ｎｏｄｅ＃４のデータブロックの値は全て０であるので、新たなパリティ（Ｐ'１）の値は変わらない。【０１４０】
上記処理により、ストライプ＃１を構成するストライプブロック２０２は、Ａ１、Ｂ１、Ｃ２、Ｐ'１、Ｅ１に更新される。なお、Ｐ１＝Ａ１＋Ｂ１＋Ｄ１、Ｐｉ＝Ｐ１＋Ｃ２、及びＰ'１＝Ｐｉ＋Ｄ１であるから、Ｐ'１＝Ａ１＋Ｂ１＋Ｃ２となり、かつＥ１＝０であるから、Ｐ'１＝Ａ１＋Ｂ１＋Ｃ２＋Ｅ１となり、Ｐ'１は、ストライプ＃１のパリティとしての要件を満たしている。【０１４１】
計算機システム１は、以下同様の処理を繰り返して、図１４の（４）のような増設後のストライプ構成に更新する。本処理は周期的な処理であり、ストライプ＃５ｋ〜＃５ｋ＋４（ｋは０以上の整数）の更新処理、即ちストライプブロック２０２の組み合わせパターンは、上記ストライプ＃０〜＃４と同様のものとなる。【０１４２】
なお、ストライプ更新処理は、周期内の位置によって処理の種類が異なる。このため、図１４の（４）には、後述するストライプ更新処理の種類を「処理の種類」として表示した。なお、周期の終端及び周期終端の１つ前のストライプ更新処理に関しては、上記記述と一部異なる部分があるが、詳細については後述する。【０１４３】
以下、計算機システム１及び、各Ｎｏｄｅ１００の処理の詳細について説明する。【０１４４】
図１５は、Ｎｏｄｅ増設処理の一例を示すフローチャートである。【０１４５】
Ｎｏｄｅ増設処理プログラム１１０１は、計算機システム１にＮｏｄｅ１００を増設する場合のストライプ構成の更新処理を行う。【０１４６】
管理者は、計算機システム１に対して増設用のＮｏｄｅ１００を追加した後、Ｎｏｄｅ増設（またはストライプ２０３の拡張）の指示を管理サーバ２０へ入力する。管理サーバ２０は、増設するＲＡＩＤグループ（またはＮｏｄｅ１００）と増設Ｎｏｄｅを受け付けて、処理対象のＮｏｄｅ１００に増設指令を送信する。【０１４７】
本実施例１では、図１４及び図７で示すように、Ｎｏｄｅ＃０〜＃３のＲＡＩＤグループ（３Ｄ＋１Ｐ）にＮｏｄｅ＃４を追加する例を示すが、これに限定されるものではない。例えば、計算機システム１内に複数のＲＡＩＤグループが設定されている場合には、ＲＡＩＤグループとＮｏｄｅ１００の対応関係を示すテーブル（図示省略）を管理サーバ２０が参照して、処理対象のＮｏｄｅ１００を特定すれば良い。【０１４８】
各Ｎｏｄｅ１００は、管理サーバ２０からの増設指示を受信した契機で、Ｎｏｄｅ増設処理を実行する。また、Ｎｏｄｅ増設を検出した契機で、自動的に各Ｎｏｄｅ１００が当該Ｎｏｄｅ増設処理プログラム１１０１を実行しても良い。【０１４９】
あるいは、処理対象のＮｏｄｅ１００のうちいずれかひとつが、マスターとなってＮｏｄｅ増設処理プログラム１１０１を実行し、他のＮｏｄｅ１００に通知するようにしても良い。あるいは、管理サーバ２０がＮｏｄｅ増設処理プログラム１１０１を実行して処理対象のＮｏｄｅ１００に通知しても良い。【０１５０】
まず、Ｎｏｄｅ増設処理プログラム１１０１は、増設処理の対象となるＮｏｄｅ１００の中から、１つのＮｏｄｅ１００（増設用Ｎｏｄｅ１００（＃４））を増設対象Ｎｏｄｅとして選択する（ステップ３１０１）。【０１５１】
例えば、Ｎｏｄｅ増設処理プログラム１１０１は、増設処理の対象Ｎｏｄｅのうち、Ｎｏｄｅ増設処理が未実施のＮｏｄｅのうち、計算機システム１内の物理的なＮｏｄｅ＃が若い順に、対象Ｎｏｄｅを選んでもよい。【０１５２】
次に、Ｎｏｄｅ増設処理プログラム１１０１は、ストライプ構成の更新処理を実施する（ステップ３００２）。ストライプ構成の更新処理については後述する。【０１５３】
次に、Ｎｏｄｅ増設処理プログラム１１０１は、計算機システム１に対して追加した全増設Ｎｏｄｅに対してＮｏｄｅ増設処理が完了しているかを判定する（ステップ３００３）。全増設Ｎｏｄｅに対してＮｏｄｅ増設処理が完了していない場合（ステップ３００３でＮｏ）、Ｎｏｄｅ増設処理プログラム１１０１は、ステップ３００１に戻り、次の対象Ｎｏｄｅに対して同様の処理を実施する。【０１５４】
一方、全増設Ｎｏｄｅに対してＮｏｄｅ増設処理が完了している場合（ステップ３００３でＹｅｓ）は、Ｎｏｄｅ増設処理プログラム１１０１が処理を終了する。【０１５５】
図１６は、ストライプ構成の更新処理の一例を示すフローチャートである。この処理は、図１５のステップ３００２の処理で、各Ｎｏｄｅ１００が増設Ｎｏｄｅ１００を受け付けて、ストライプ更新処理プログラム１１０２を実行する。【０１５６】
ストライプ更新処理プログラム１１０２は、図１５のＮｏｄｅ増設処理のステップ３００２において、Ｎｏｄｅ１００を増設した後のストライプパターンを生成し、増設後のストライプパターンに対応するパリティブロックの生成を行う。これらストライプパターンの生成とパリティブロックの生成が、ストライプ構成の更新処理に含まれる。【０１５７】
まず、ストライプ更新処理プログラム１１０２は、ストライプ管理テーブル１００１を参照し、計算機システム１内のストライプ数（Ｓ）を算出する（ステップ３１０１）。【０１５８】
次に、ストライプ更新処理プログラム１１０２は、ストライプイテレータ（ｉ）をゼロに設定する（ステップ３１０２）。ストライプイテレータｉは、現在処理中のストライプ＃（番号）を意味し、０〜Ｓ−１までの値が設定される。【０１５９】
次に、ストライプ更新処理プログラム１１０２は、ストライプ数（Ｓ）とストライプイテレータ（ｉ）の差分Ｓ−ｉ、即ち未更新のストライプ数が、拡張前のデータブロック数（ｎ）＋パリティブロック数＋１以上か否かの判定を行う（ステップ３１０３）。なお、本実施例１ではＲＡＩＤ５のグループを採用するため、パリティブロック数は１である。このため、ストライプ更新処理の周期は、ｎ＋２となる。また、本実施例１では、図１４で示したように、拡張前のデータブロック数（ｎ）＝３の例を示す。【０１６０】
未更新のストライプ数がｎ＋２以上の場合（ステップ３１０３でＹｅｓ）、ストライプ更新処理プログラム１１０２は、ストライプ更新処理（周期）を実施する（ステップ３１０４）。ストライプ更新処理（周期）については後述する。なお、更新対象のストライプ２０３に含まれるＮｏｄｅ１００間では、ステップ３１０４の開始時等に、ストライプイテレータ（ｉ）の同期をとるようにしてもよい。【０１６１】
ストライプ更新処理（周期）を実施した後、ストライプ更新処理プログラム１１０２は、ストライプイテレータ（ｉ）をインクリメントし、再度ステップ３１０３の判定を実施する。【０１６２】
一方、未更新のストライプ数がｎ＋２未満である場合（ステップ３１０３でＮｏ）、ストライプ更新処理プログラム１１０２は、未更新のストライプ２０３が存在するか、即ちストライプイテレータ（ｉ）がＳ未満であるかの判定を行う（ステップ３１０６）。【０１６３】
ステップ３１０３の判定では、未更新のストライプ数（Ｓ−ｉ）が、ストライプ更新処理の周期（ｎ＋２）未満であるか否かについて判定が実施される。そして、未更新のストライプ数が周期未満の場合には、ステップ３１０６で、未更新のストライプ数が周期に満たない端数を含むか否かについて判定が実施される。【０１６４】
未更新のストライプが存在する場合（ステップ３１０６でＹｅｓ）、ストライプ更新処理プログラム１１０２は、ストライプ更新処理（端数）を実施する（ステップ３１０７）。ストライプ更新処理（端数）については後述する。【０１６５】
ストライプ更新処理（端数）を実施した後、ストライプ更新処理プログラム１１０２は、ストライプイテレータ（ｉ）をインクリメントし、再度ステップ３１０６の判定を実施する。【０１６６】
未更新のストライプ２０３が存在しない場合（ステップ３１０６でＮｏ）、ストライプ更新処理プログラム１１０２は処理を終了し、図１５の処理に復帰する。【０１６７】
上記処理によって、未更新のストライプ数（Ｓ−ｉ）が、ストライプ更新処理の周期（ｎ＋２）以上であればステップ３１０４のストライプ更新処理（周期）が実行され、未更新のストライプ数が周期未満になると、ステップ３１０７のストライプ更新処理（端数）に切り替えられる。【０１６８】
図１７は、ストライプ更新処理（周期）の一例を示すフローチャートである。【０１６９】
ストライプ更新処理（周期）は、ストライプ更新処理プログラム１１０２の一部として実施され、図１６に示したストライプ更新処理のステップ３１０４において、各ストライプ２０３のストライプパターンを生成する。当該ストライプパターンは、Ｎｏｄｅ１００間のパリティブロックの配置を平準化するため、周期的なパターンを生成する。【０１７０】
まず、ストライプ更新処理プログラム１１０２は、ストライプイテレータ（ｉ）を参照し、ｉ  ｍｏｄ  （ｎ＋２）の値を算出する（ステップ３２０１）。ｎは、拡張前のストライプのデータブロック数を表す。なお、「ｍｏｄ」は、ｉをｎ＋２で除した余りを算出する関数を示す。【０１７１】
算出結果が０であった場合、ストライプ更新処理プログラム１１０２は、ストライプ更新処理（周期先頭）を実施する（ステップ３２０２）。ストライプ更新処理（周期中盤）については後述する。【０１７２】
算出結果が１以上ｎ未満であった場合、ストライプ更新処理（周期）３１０４は、ストライプ更新処理（周期中盤）を実施する（ステップ３２０３）。ストライプ更新処理（周期中盤）については後述する。【０１７３】
算出結果がｎであった場合、ストライプ更新処理プログラム１１０２は、ストライプ更新処理（周期終端前）を実施する（ステップ３２０４）。ストライプ更新処理（周期終端前）については後述する。【０１７４】
算出結果がｎ＋１であった場合、ストライプ更新処理プログラム１１０２は、ストライプ更新処理（周期終端）を実施する（ステップ３２０５）。ストライプ更新処理（周期終端）については後述する。【０１７５】
周期については、図１４で示したように、４つのＮｏｄｅ＃０〜＃３の構成（ｎ＝３）に、１つのＮｏｄｅ＃４を追加する場合、まず、ストライプ更新処理プログラム１１０２は、周期の先頭のストライプ＃０（サイクル内インデックス＃２０６０＝０）についてストライプ更新処理を実行する。【０１７６】
次に、ストライプ更新処理プログラム１１０２は、ストライプイテレータ（ｉ）をインクリメントしてｉ＝１で、ステップ３２０１の余りが１となることからステップ３２０３の周期の中盤のストライプ更新処理を実施する。ステップ３２０３では、ストライプ＃１についてストライプ２０３のストライプブロック２０２を更新する。【０１７７】
次に、ストライプ更新処理プログラム１１０２は、ストライプイテレータ（ｉ）をインクリメントしてｉ＝２で、ステップ３２０１の余りが２となることからステップ３２０３の周期の中盤のストライプ更新処理を実施する。ステップ３２０３では、ストライプ＃２についてストライプ２０３のストライプブロック２０２を更新する。【０１７８】
次に、ストライプ更新処理プログラム１１０２は、ストライプイテレータ（ｉ）をインクリメントしてｉ＝３で、ステップ３２０１の余りが３＝ｎとなることからステップ３２０４の周期の終端前のストライプ更新処理を実施する。ステップ３２０４では、ストライプ＃３についてストライプ２０３のストライプブロック２０２を更新する。【０１７９】
次に、ストライプ更新処理プログラム１１０２は、ストライプイテレータ（ｉ）をインクリメントしてｉ＝４で、ステップ３２０１の余りが４＝ｎ＋１となることからステップ３２０５の周期の終端のストライプ更新処理を実施する。ステップ３２０５では、ストライプ＃４についてストライプ２０３のストライプブロック２０２を更新する。【０１８０】
以上のように、ＲＡＩＤグループにＮｏｄｅ＃４を追加してストライプ２０３を拡張する際には、Ｎｏｄｅ＃０〜＃４にパリティブロックを分散させるストライプ２０３の更新処理をひとつの周期として、繰り返して実行する。【０１８１】
これにより、図５Ｂで示したストライプ２０３−０〜２０３−９にＮｏｄｅ１００を追加する場合には、上述のように、周期先頭のストライプ更新処理（３２０２）から、周期中盤のストライプ更新処理（３２０３）を繰り返してから、周期終端前のストライプ更新処理（３２０４）と周期終端のストライプ更新処理（３２０５）が繰り返して実行される。【０１８２】
図１８は、ストライプ更新処理（周期先頭）を示す。ストライプ更新処理（周期先頭）は、ストライプ更新処理プログラム１１０２の一部として実施され、各ストライプ２０３のうちストライプ更新処理の周期の先頭に対応するストライプ２０３についてストライプの更新処理を行う。図１４においてはストライプ＃０が周期の先頭となる。【０１８３】
まず、ストライプ更新処理プログラム１１０２は、次処理ストライプ（Ｓｎ：「Ｓ」は"Ｓｔｒｉｐｅ"、「ｎ」は"ｎｅｘｔ"を表す）を取得する（ステップ３３０１）。次処理ストライプ（Ｓｎ）は、次にストライプ構成の更新処理を行うストライプ２０３を表す。【０１８４】
なお、ストライプ更新処理プログラム１１０２は、初回の処理であればストライプ管理テーブル１００１を参照して先頭のＳｔｒｉｐｅ＃２０００を次処理ストライプ（Ｓｎ）とする。【０１８５】
また、ストライプ更新処理プログラム１１０２は、１周期が完了した後の処理であれば、ストライプ管理テーブル１００１を参照して前回のストライプ更新処理の次のＳｔｒｉｐｅ＃２０００を次処理ストライプ（Ｓｎ）とする。また、サイクル内インデックス＃２０６０を「０」にリセットしてから処理を開始する。【０１８６】
ストライプ更新処理（周期先頭）３２０２では、ストライプ管理テーブル１００１または更新中ストライプ管理テーブル１００９を参照し、未更新のストライプ２０３の中から所定のストライプ２０３を選択してよいが、処理を簡潔にするために、未処理のストライプ２０３の中で、ストライプ＃２０００が最も小さいものを選択することが望ましい。【０１８７】
次に、ストライプ更新処理プログラム１１０２は、次処理ストライプ（Ｓｎ）内でパリティブロック（Ｐｏ：「Ｐ」は"Ｐａｒｉｔｙ"、「ｏ」は"ｏｌｄ"を表す）が格納されているＮｏｄｅ（Ｎｐ：「Ｎ」は"Ｎｏｄｅ"を表す）の識別子（＃０〜＃ｎ）を取得する。なお、以下ではパリティブロック（Ｐｏ）を含むＮｏｄｅ１００をパリティノード（Ｎｐ）とする。【０１８８】
ストライプ更新処理プログラム１１０２は、パリティＮｏｄｅテーブル１００７のサイクル内インデックス＃２０６０に周期の先頭を示す「０」を設定し、パリティノード２０６１には取得したパリティノード（Ｎｐ）の識別子を登録する（ステップ３３０２）。【０１８９】
当該パリティＮｏｄｅテーブル１００７は、後述のストライプ更新処理（周期中盤）３２０３で、中間パリティ生成ブロックの選択時に参照される。【０１９０】
なお、ステップ３３０３以降の処理は、パリティノード（Ｎｐ）と、パリティノード（Ｎｐ）から中間パリティを受信した増設Ｎｏｄｅ１００で実行される。パリティノード（Ｎｐ）と増設Ｎｏｄｅ１００以外のＮｏｄｅ１００は、パリティノード（Ｎｐ）からの処理の完了通知を受信するまで待機する。【０１９１】
次に、パリティノード（Ｎｐ）のストライプ更新処理プログラム１１０２は、パリティノード（Ｎｐ）内の所定のストライプブロック（Ｂｄ：「Ｂ」は"Ｂｌｏｃｋ"、「ｄ」は"ｄａｔａ"を表す）２０２を選択する（ステップ３３０３）。【０１９２】
当該ストライプブロック（Ｂｄ）は、パリティノードＮｐ内の所定のストライプブロックを選択してよいが、処理を簡潔にするために、パリティノード（Ｎｐ）内のストライプブロック２０２の中で、未更新かつＬＢＡが最も小さいもの等を選択することが望ましい。【０１９３】
次に、ストライプ更新処理プログラム１１０２は、上記選択されたストライプブロック（Ｂｄ）が、（１）新ストライプ構成で未割当であり、かつ（２）パリティブロックではなく、データブロックであるか否かを判定する（ステップ３３０４）。【０１９４】
上記いずれかの条件を満たさない場合（ステップ３３０４でＮｏ）、パリティノード（Ｎｐ）のストライプ更新処理プログラム１１０２は、ステップ３３０３に戻り、異なるストライプブロック（Ｂｄ）を再度選択する。【０１９５】
上記全ての条件を満たす場合（ステップ３３０４でＹｅｓ）、ストライプ更新処理プログラム１１０２は、増設前のストライプ管理テーブル１００１上で、上記選択されたストライプブロック（Ｂｄ）に対応するストライプ２０３を、次処理ストライプとして図７のストライプ管理テーブル１００１のＮＥＸＴ２００３にフラグを登録する（ステップ３３０５）。【０１９６】
次に、ストライプ更新処理プログラム１１０２は、パリティノード（Ｎｐ）上で、パリティブロック（Ｐｏ）とストライプブロック（Ｂｄ）から中間パリティ（Ｐｉ：「ｉ」は"ｉｎｔｅｒｍｅｄｉａｔｅ"を表す）を生成し、増設Ｎｏｄｅ（Ｎａ：「ａ」は"ａｄｄｉｔｉｏｎａｌ"を表す）に転送する（ステップ３３０６）。ここで、中間パリティ（Ｐｉ）は、Ｐｏ  ＸＯＲ  Ｂｄで算出される。【０１９７】
次に、増設Ｎｏｄｅ（Ｎａ）ではストライプ更新処理プログラム１１０２が、パリティノード（Ｎｐ）から中間パリティ（Ｐｉ）を受信する。増設Ｎｏｄｅ（Ｎａ）のストライプ更新処理プログラム１１０２は、増設Ｎｏｄｅ（Ｎａ）内で所定のストライプブロック（Ｂａ）を選択し、中間パリティ（Ｐｉ）を格納する（ステップ３３０７）。【０１９８】
当該ストライプ更新処理（周期先頭）においては、中間パリティ（Ｐｉ）がそのままパリティブロックとなる。当該ストライプブロック（Ｂａ）は、増設Ｎｏｄｅ（Ｎａ）内の所定のストライプブロックを選択してよいが、処理を簡潔にするために、増設Ｎｏｄｅ（Ｎａ）内のストライプブロックの中で、ＬＢＡが最も小さいもの等を選択することが望ましい。【０１９９】
次に、パリティノード（Ｎｐ）のストライプ更新処理プログラム１１０２は、増設前のストライプ管理テーブル１００１上の次処理ストライプＳｎのうち、パリティノード（Ｎｐ）と、増設Ｎｏｄｅ（Ｎａ）以外のＮｏｄｅ１００に格納されているｎ個のデータブロックと、ストライプブロック（Ｂｄ）と、ストライプブロックＢａ（パリティ）の計ｎ＋１個のストライプブロックを、新ストライプ構成のストライプブロックとして、更新中ストライプ管理テーブル１００９に格納し、ストライプ構成を更新する（ステップ３３０８）。【０２００】
次に、ストライプ更新処理プログラム１１０２は、上記ステップ３３０２で選択したパリティブロック（Ｐｏ）を、未割当ブロック（Ｂｎ：「ｎ」は"ｎｏｎ−ａｌｌｏｃａｔｅｄ"を表す）として、未割当ブロック管理テーブル１００８に登録して、周期先頭のストライプ更新処理を終了する。【０２０１】
周期の先頭のストライプ２０３の処理が完了したので、パリティノード（Ｎｐ）のストライプ更新処理プログラム１１０２は、ストライプ２０３内の他のＮｏｄｅ１００に処理の完了を通知してサイクル内インデックス＃２０６０の値をインクリメントする。また、パリティノード（Ｎｐ）のストライプ更新処理プログラム１１０２は、ストライプ管理テーブル１００１とパリティＮｏｄｅテーブル１００７と、未割当ブロック管理テーブル１００８、更新中ストライプ管理テーブル１００９の各テーブルの差分を他のＮｏｄｅ１００に送信して同期させる。【０２０２】
以上のように、ストライプ更新処理（周期先頭）では、図１４の（２）のように処理対象のストライプＳｎ（＝＃０）のパリティノード（Ｎｐ）＝３のパリティブロック（Ｐｏ＝Ｐ０）とストライプブロック（Ｂｄ＝Ｄ１）から中間パリティ（Ｐｉ）を演算され、増設Ｎｏｄｅ（Ｎａ）＝＃４に転送される。【０２０３】
中間パリティ（Ｐｉ）を受信した増設ノード（Ｎａ）では、未処理のストライプブロック（Ｂａ）のうち所定の条件（例えば、ＬＢＡが最小）を満たすストライプブロックに中間パリティ（Ｐｉ）を書き込んで、そのままパリティブロックとする。【０２０４】
上記処理によって、図１４のストライプ＃０は、Ａ０、Ｂ０、Ｃ０、Ｄ１、Ｐ'０として更新されて更新中ストライプ管理テーブル１００９に登録される。データの移動は、ノード＃３で生成された中間パリティ（Ｐｉ）がノード＃４のパリティブロックＰ'０に転送されるだけである。そのたのストライプブロック＝Ａ０、Ｂ０、Ｃ０、Ｄ１は、移動することなく従前の位置に保持される。【０２０５】
図１９は、ストライプ更新処理（周期中盤）の一例を示すフローチャートである。【０２０６】
なお以降、当該図１９のストライプ更新処理（周期中盤）及び、図２０のストライプ更新処理（周期終端前）、図２１のストライプ更新処理（周期終端）は、図１８のストライプ更新処理（周期先頭）と処理が一部重複するため、差異がある部分のみ説明する。【０２０７】
ストライプ更新処理（周期中盤）は、図１７のステップ３２０３において、ストライプ更新処理プログラム１１０２の一部として実施され、各ストライプ周期の先頭、終端前、及び終端に対応するストライプ以外のストライプ構成の更新を行う。なお、図１４においてはストライプ＃１、＃２が周期の中盤となる。【０２０８】
まず、ストライプ更新処理プログラム１１０２は、次処理ストライプ（Ｓｎ）を取得する（ステップ３４０１）。ストライプ更新処理（周期中盤）では、次処理ストライプとしストライプ管理テーブル１００１に登録されているストライプ２０３を選択する。【０２０９】
ストライプ更新処理プログラム１１０２は、ストライプ管理テーブル１００１を参照し、ＮＥＸＴ２００３に「１」が設定されているエントリのストライプ＃２０００を次処理ストライプ（Ｓｎ）として選択する。【０２１０】
ストライプ更新処理プログラム１１０２は、次処理ストライプ（Ｓｎ）の選択が完了すると、当該エントリのＮＥＸＴ２００３を「０」にリセットする。【０２１１】
次の、ステップ３４０２、及びステップ３４０３は、それぞれ図１８のストライプ更新処理（周期先頭）におけるステップ３３０２、及びステップ３３０３と同様である。すなわち、ストライプ更新処理プログラム１１０２は、パリティブロック（Ｐｏ）、パリティノード（Ｎｐ）、ストライプブロック（Ｂｄ）を取得してパリティＮｏｄｅテーブル１００７を更新する。【０２１２】
なお、ステップ３４０３以降の処理は、パリティノード（Ｎｐ）と、パリティノード（Ｎｐ）から中間パリティを受信したノード（Ｎｎ）で実行される。パリティノード（Ｎｐ）とノード（Ｎｎ）以外のＮｏｄｅ１００は、パリティノード（Ｎｐ）からの処理の完了通知を受信するまで待機する。【０２１３】
次に、ストライプ更新処理プログラム１１０２は、上記選択されたストライプブロック（Ｂｄ）が、（１）新ストライプ構成で未割当であり、かつ（２）パリティブロックではなく、データブロックであり、かつ（３）増設前のストライプ管理テーブル１００１上で、ストライプブロック（Ｂｄ）が所属するストライプ２０３で、パリティブロックが格納されているＮｏｄｅ１００が、パリティＮｏｄｅテーブル１００７に存在しないかを判定する（ステップ３４０４）。【０２１４】
上記（３）の判定処理は、各ストライプ２０３のパリティブロックを、周期内の各Ｎｏｄｅ間で均等に分散させるために実施される。すなわち、（３）の判定処理は、図１４の（３）に相当し、ストライプ更新処理プログラム１１０２は、パリティブロック（Ｐｏ＝Ｐ１）を選択し、パリティノード（Ｎｐ＝＃２）を選択し、ストライプブロック（Ｂｄ＝Ｃ２）を選択する。そして、ストライプ更新処理プログラム１１０２は、ストライプブロック（Ｂｄ＝Ｃ２）が所属するストライプ＃２が、パリティＮｏｄｅテーブル１００７に存在するか否かを判定する。【０２１５】
図１４の（３）の例では、現在処理しているのはストライプ＃１であり、ストライプ＃２は未処理である。従って、パリティＮｏｄｅテーブル１００７にはストライプ＃２がパリティノード＃２０６１として登録されていないので、ステップ３４０５へ進むことになる。【０２１６】
上記いずれかの条件を満たさない場合（ステップ３４０４でＮｏ）、ストライプ更新処理プログラム１１０２は、ステップ３４０３に戻り、異なるストライプブロック（Ｂｄ）を再度選択する。【０２１７】
上記全ての条件を満たす場合（ステップ３４０４でＹｅｓ）、ストライプ更新処理プログラム１１０２は、ステップ３４０５を実行する。ステップ３４０５は、図１８のストライプ更新処理（周期先頭）におけるステップ３３０５と同様である。すなわち、ストライプ更新処理プログラム１１０２は、ストライプ管理テーブル１００１の該当エントリのＮＥＸＴ２００３を「１」設定する。【０２１８】
次に、ストライプ更新処理プログラム１１０２は、パリティノード（Ｎｐ）で、パリティブロック（Ｐｏ）とストライプブロック（Ｂｄ）の排他的論理和から中間パリティ（Ｐｉ）を生成する。そして、ストライプ更新処理プログラム１１０２は、未割当ブロック（Ｂｎ）の存在するＮｏｄｅ（Ｎｎ）に中間パリティ（Ｐｉ）を転送する（ステップ３４０６）。【０２１９】
なお、パリティノード（Ｎｐ）のストライプ更新処理プログラム１１０２は、未割当ブロック管理テーブル１００８から、Ｎｏｄｅ＃２０７０の値を転送先Ｎｏｄｅ（Ｎｎ）とし、ＬＢＡ＃２０７１を未割当ブロック（Ｂｎ）として中間パリティ（Ｐｉ）を転送する。パリティノード（Ｎｐ）のストライプ更新処理プログラム１１０２は、未割当ブロック管理テーブル１００８で読み込んだエントリをクリアする。【０２２０】
この処理は図１４の（３）で示したように、パリティノード（Ｎｐ＝＃２）でパリティブロック（Ｐｏ＝Ｐ１）と、ストライプブロック（Ｂｄ＝Ｃ２）の排他的論理和によって中間パリティ（Ｐｉ）が生成される。そして、未割当ブロック管理テーブル１００８に登録されている転送先Ｎｏｄｅ（Ｎｎ＝＃３）の未割当ブロック（Ｂｎ＝Ｐ０）に中間パリティ（Ｐｉ）を転送する。【０２２１】
次に、転送先Ｎｏｄｅ（Ｎｎ）のストライプ更新処理プログラム１１０２は、受信した中間パリティ（Ｐｉ）と、増設前のストライプ管理テーブル１００１上で次処理ストライプ（Ｓｎ）に対応する転送先Ｎｏｄｅ（Ｎｎ）内のデータブロック（Ｂｏ）から新パリティ（Ｐｎ：「ｎ」は"ｎｅｗ"を表す）を生成する。【０２２２】
そして、転送先Ｎｏｄｅ（Ｎｎ）のストライプ更新処理プログラム１１０２は、未割当ブロック（Ｂｎ）の領域に新パリティ（Ｐｎ）を格納する（ステップ３４０７）。ここで、新パリティ（Ｐｎ）は、Ｂｏ  ＸＯＲ  Ｐｉで算出される。【０２２３】
この処理は図１４の（３）で示したように、転送先Ｎｏｄｅ（Ｎｎ＝＃３）で、次処理ストライプ（Ｓｎ＝＃１）に対応するデータブロック（Ｂｏ＝Ｄ１）となる。ストライプ更新処理プログラム１１０２は、中間パリティ（Ｐｉ）とデータブロック（Ｄ１）の排他的論理和から新パリティ（Ｐｎ）を生成する。【０２２４】
次に、ストライプ更新処理プログラム１１０２は、増設ノード（Ｎａ）に指令して、増設ノード（Ｎａ）内の所定の未割当ストライプブロック（Ｂａ）を選択させる（ステップ３４０８）。【０２２５】
当該ストライプブロック（Ｂａ）は、増設ノードＮａ内のストライプブロック２０２を選択すればよいが、処理を簡潔にするために、増設ノードＮａ内のストライプブロック２０２の中で、未割り当て、かつ、ＬＢＡが最も小さいもの等を選択することが望ましい。【０２２６】
次に、パリティノード（Ｎａ）のストライプ更新処理プログラム１１０２は、増設前のストライプ管理テーブル１００１上の次処理ストライプＳｎのうち、パリティノード（Ｎｐ）と、増設ノード（Ｎａ）と、転送先ノード（Ｎｎ）以外のＮｏｄｅ１００に格納されているｎ−１個のデータブロックと、ストライプブロック（Ｂｄ）と、ストライプブロック（Ｂａ）と、未割当ブロック（Ｂｎ）（パリティ）の計ｎ＋１個のストライプブロックを、更新後のストライプＳｎのストライプブロックとして、更新中ストライプ管理テーブル１００９を更新する（ステップ３４０９）。【０２２７】
この処理は図１４の（３）で示したように、次処理ストライプ（Ｓｎ＝＃１）に対応するストライプブロック２０２は、Ａ１、Ｂ１、Ｃ２、Ｐ'１、Ｅ１として更新される。【０２２８】
次に、ストライプ更新処理プログラム１１０２は、ステップ３４１０の処理を実行し、処理を終了する。ステップ３４１０は、図１８のストライプ更新処理（周期先頭）におけるステップ３３０９と同様である。【０２２９】
周期の中盤のストライプ２０３の処理が完了したので、パリティノード（Ｎｐ）のストライプ更新処理プログラム１１０２は、ストライプ２０３内の他のＮｏｄｅ１００に処理の完了を通知してサイクル内インデックス＃２０６０の値をインクリメントする。また、パリティノード（Ｎｐ）のストライプ更新処理プログラム１１０２は、ストライプ管理テーブル１００１とパリティＮｏｄｅテーブル１００７と、未割当ブロック管理テーブル１００８、更新中ストライプ管理テーブル１００９の各テーブルの差分を他のＮｏｄｅ１００に送信して同期させる。【０２３０】
以上のように、ストライプ更新処理（周期中盤）では、図１４の（３）のように処理対象のストライプＳｎ（＝＃１）のパリティノード（Ｎｐ）＝２のパリティブロック（Ｐｏ＝Ｐ１）とストライプブロック（Ｂｄ＝Ｃ２）から中間パリティ（Ｐｉ）が演算され、転送先ノード（Ｎｎ＝＃３）に転送される。【０２３１】
中間パリティ（Ｐｉ）を受信した転送先ノード（Ｎｎ＝＃３）では、処理対象のストライプ＃１のデータブロック（Ｂｏ＝Ｄ１）と、中間パリティ（Ｐｉ）から新たなパリティ（Ｐｎ）を生成する。【０２３２】
そして、転送先ノード（Ｎｎ＝＃３）では、新たなパリティ（Ｐｎ）を未割り当てのストライプブロック（Ｂａ）に書き込んで、増設ノード（Ｎａ）で未割り当てのストライプブロック（Ｂａ）を当該ストライプ＃１についかする。【０２３３】
上記処理によって、図１４に示す周期中盤のストライプ＃１は、ストライプブロック＝Ａ１、Ｂ１、Ｃ２、Ｐ'１、Ｅ１として更新されて、更新中ストライプ管理テーブル１００９に登録される。データの移動は、ノード＃２で生成された中間パリティ（Ｐｉ）がノード＃３のパリティブロックＰ'１に転送されるだけである。その他のストライプブロック＝Ａ１、Ｂ１、Ｃ２は、移動することなく従前の位置に保持される。【０２３４】
また、周期中盤の図１４のストライプ＃２も同様に処理されて、ストライプブロック＝Ａ２、Ｂ３、Ｐ'２、Ｄ２、Ｅ２として更新されて、更新中ストライプ管理テーブル１００９に登録される。【０２３５】
データの移動は、ノード＃１で生成された中間パリティ（Ｐｉ）がノード＃２のパリティブロックＰ'２に転送されるだけである。その他のストライプブロック＝Ａ２、Ｂ３、Ｐ'２、Ｄ２、Ｅ２は、移動することなく従前の位置に保持される。【０２３６】
図２０は、ストライプ更新処理（周期終端前）の一例を示すフローチャートである。ストライプ更新処理（周期終端前）は、図１７のステップ３２０４において、ストライプ更新処理プログラム１１０２の一部として実施され、各ストライプ周期の終端の一つ前のストライプで構成の更新を行う。【０２３７】
ストライプ更新処理（周期終端前）においては、ステップ３５０１、３５０３、３５０４はストライプ更新処理（周期先頭）のステップ３３０１、３３０３、３３０４と同様であり、ステップ３５０２とステップ３５０４以外は、ストライプ更新処理（周期中盤）と同様である。【０２３８】
ステップ３５０２では、ストライプ更新処理プログラム１１０２は、次処理ストライプ（Ｓｎ）内のパリティブロック（Ｐｏ）が格納されているパリティノード（Ｎｐ）を取得する。【０２３９】
上記ストライプ更新処理（周期先頭）、及びストライプ更新処理（周期中盤）では、ストライプ更新処理プログラム１１０２が、次処理ストライプ（Ｓｎ）を適切に選択するため、当該取得したパリティノード（Ｎｐ）をパリティＮｏｄｅテーブル１００７に登録したが、ストライプ更新処理（終端前）では、次処理ストライプ（Ｓｎ）が一意に定まるため、パリティＮｏｄｅテーブル１００７への登録は不要である。【０２４０】
なお、次処理ストライプ（Ｓｎ）は、図１９のストライプ更新処理（周期中盤）で処理したストライプ２０３の次のストライプを処理対象として、ストライプ更新処理プログラム１１０２は、ストライプ管理テーブル１００１から選択してもよい。【０２４１】
なお、ステップ３５０３以降の処理は、パリティノード（Ｎｐ）と、パリティノード（Ｎｐ）から中間パリティを受信したノード（Ｎｎ）で実行される。パリティノード（Ｎｐ）とノード（Ｎｎ）以外のＮｏｄｅ１００は、パリティノード（Ｎｐ）からの処理の完了通知を受信するまで待機する。【０２４２】
ステップ３５０５〜３５１０は、上記図１９に示したストライプ更新処理（周期先頭）のステップ３４０５〜３４１０と様である。【０２４３】
上記処理によって、周期終端前の図１４のストライプ＃３は、ストライプブロック＝Ｐ'４、Ｂ４、Ｃ４、Ｄ４、Ｅ４として更新されて、更新中ストライプ管理テーブル１００９に登録される。【０２４４】
周期の終端のひとつ前のストライプ２０３の処理が完了したので、パリティノード（Ｎｐ）のストライプ更新処理プログラム１１０２は、ストライプ２０３内の他のＮｏｄｅ１００に処理の完了を通知してサイクル内インデックス＃２０６０の値をインクリメントする。また、パリティノード（Ｎｐ）のストライプ更新処理プログラム１１０２は、ストライプ管理テーブル１００１とパリティＮｏｄｅテーブル１００７と、未割当ブロック管理テーブル１００８、更新中ストライプ管理テーブル１００９の各テーブルの差分を他のＮｏｄｅ１００に送信して同期させる。【０２４５】
データの移動は、ノード＃０で生成された中間パリティ（Ｐｉ）がノード＃１のパリティブロックＰ'３に転送されるだけである。その他のストライプブロック＝Ａ４、Ｃ３、Ｄ３、Ｅ３は、移動することなく従前の位置に保持される。【０２４６】
図２１は、ストライプ更新処理（周期終端）の一例を示すフローチャートである。【０２４７】
ストライプ更新処理（周期終端）は、図１７のステップ３２０５において、ストライプ更新処理プログラム１１０２の一部として実施され、各ストライプ周期の終端のストライプ構成の更新を行う。【０２４８】
まず、ストライプ更新処理プログラム１１０２は、ステップ３６０１の処理を実行する。ステップ３６０１では、図２０のストライプ更新処理（周期終端前）で処理したストライプ２０３の次のストライプを処理対象としてストライプ管理テーブル１００１から選択する。【０２４９】
次に、ストライプ更新処理プログラム１１０２は、次処理ストライプ（Ｓｎ）内のパリティブロック（Ｐｏ）をデータブロック（Ｂｃ：「ｃ」は"ｃｈａｎｇｅｄ"を表す）に変更する（ストライプ３６０２）。この処理は、増設されたＮｏｄｅ＃４を含めてパリティブロック（Ｐｏ）を各Ｎｏｄｅ１００に分散して格納しようとした場合に、周期内で少なくとも１ストライプのパリティブロック（Ｐｏ）を増設Ｎｏｄｅに格納し（ストライプ更新処理（周期先頭）で実施済み）、かつ周期内で少なくとも１ストライプのパリティブロックをデータブロックに変更する必要があるためである。【０２５０】
なお、ステップ３６０２以降の処理は、パリティノード（Ｎｐ）と、パリティノード（Ｎｐ）から中間パリティを受信した転送先ノード（Ｎｎ）で実行される。パリティノード（Ｎｐ）と転送先ノード（Ｎｎ）以外のＮｏｄｅ１００は、パリティノード（Ｎｐ）からの処理の完了通知を受信するまで待機する。【０２５１】
次に、ストライプ更新処理プログラム１１０２は、当該データブロック（Ｂｃ）を、未割当ブロックの存在する転送先Ｎｏｄｅ（Ｎｎ）に転送する（ステップ３６０３）。【０２５２】
次に、ストライプ更新処理プログラム１１０２は、転送先ノード（Ｎｎ）上で、当該データブロック（Ｂｃ）と、増設前のストライプ管理テーブル１００１上で次処理ストライプ（Ｓｎ）に対応する転送先ノード（Ｎｎ）内のデータブロック（Ｂｏ）から、新パリティ（Ｐｎ：「ｎ」は"ｎｅｗ"を表す）を生成する。ストライプ更新処理プログラム１１０２は、生成した新パリティ（Ｐｎ）を、未割当ブロック（Ｂｎ）が格納されていた領域に格納する（ステップ３６０４）。ここで、新パリティ（Ｐｎ）は、Ｂｏ  ＸＯＲ  Ｂｃで算出される。【０２５３】
次の、ステップ３６０５は、図１９のストライプ更新処理（周期中盤）におけるステップ３４０８と同様である。すなわち、ストライプ更新処理プログラム１１０２は、増設ノード（Ｎａ）に指令して、増設ノード（Ｎａ）内の所定の未割当ストライプブロック（Ｂａ）を選択させる。増設ノード（Ｎａ）は、選択したストライプブロック２０２の位置（ＬＢＡ）を応答する。【０２５４】
次に、ストライプ更新処理プログラム１１０２は、増設前のストライプ管理テーブル１００１上の次処理ストライプ（Ｓｎ）のうち、パリティノード（Ｎｐ）、増設ノード（Ｎａ）、転送先ノード（Ｎｎ）以外のＮｏｄｅに格納されているｎ−１個のデータブロック、Ｂｃ、Ｂａ、Ｂｎ（パリティ）の計ｎ＋１個のストライプブロックを、新ストライプ上の次処理ストライプ（Ｓｎ）のストライプブロック２０２として選択し、更新中ストライプ管理テーブル１００９を更新する（ステップ３６０６）。【０２５５】
次に、ストライプ更新処理プログラム１１０２は、パリティＮｏｄｅテーブル１００７と、ストライプ管理テーブル１００１のＮＥＸＴ２００３の次処理ストライプをクリアし、処理を終了する（ステップ３６０７）。【０２５６】
周期の終端のストライプ２０３の処理が完了したので、パリティノード（Ｎｐ）のストライプ更新処理プログラム１１０２は、ストライプ２０３内の他のＮｏｄｅ１００に処理の完了を通知してサイクル内インデックス＃２０６０の値をインクリメントする。また、パリティノード（Ｎｐ）のストライプ更新処理プログラム１１０２は、ストライプ管理テーブル１００１とパリティＮｏｄｅテーブル１００７と、未割当ブロック管理テーブル１００８、更新中ストライプ管理テーブル１００９の各テーブルの差分を他のＮｏｄｅ１００に送信して同期させる。【０２５７】
上記処理によって、図１４の例では（３）で示すように、周期の終端の次処理ストライプとしてストライプ＃４が選択され、パリティブロック（Ｐｏ）としてノード＃３のパリティブロックＰ４が選択される。このパリティブロックＰ４は、データブロックＤ４に書き換えられる。なお、本実施例１では、書き換えるデータブロックＤ４の値は所定値である「０」とする。【０２５８】
次に、データブロックＤ４の値は、未割り当てブロック（Ｂｎ＝Ｐ３）を有するノード＃０に転送される。そして、旧ストライプ構成（＝ストライプ＃４）のデータブロックＢ４、Ｃ４と、転送されたデータブロックＤ４の値の排他的論理和から新たなパリティ（Ｐｎ）が生成され、ノード＃０の未割り当てブロック（Ｂｎ＝Ｐ'４）に格納される。【０２５９】
増設ノード（Ｎａ）内の未割り当てのストライプブロック（Ｂａ＝Ｅ４）が選択される。そして、旧ストライプ構成の次処理ストライプ＃４で、ｎ−１個（２個）のデータブロックＢ４、Ｃ４と、書き換えられたデータブロックＤ４と、増設ノード（Ｎａ）のデータブロックＥ４と、転送先ノード（Ｎｎ）の新パリティ（Ｐｎ）が、新たなストライプ＃４のストライプブロック２０２として、更新中ストライプ管理テーブル１００９に格納される。【０２６０】
図２２は、ストライプ更新処理（端数）の一例を示すフローチャートである。この処理は、図１６のステップ３１０７で実行される。ストライプ更新処理（端数）は、ストライプ更新処理プログラム１１０２の一部として実施され、計算機システム１内で処理対象のストライプのうち、ストライプ構成の更新周期数（ｎ＋２）に満たない端数のストライプ２０３の更新を行う。【０２６１】
ストライプ更新処理（端数）は、端数となるストライプ数が１かそれ以外かで処理が異なる。そのため、まずストライプ更新処理プログラム１１０２は、端数となるストライプ数を算出する（ステップ３７０１）。具体的には、Ｓ  ｍｏｄ  （ｎ＋２）が１であるか否かを判定すればよい。【０２６２】
端数となるストライプ数が１である場合（ステップ３７０１でＹｅｓ）、ストライプ更新処理プログラム１１０２は、ストライプ更新処理（端数１）を実施する（ステップ３７０２）。ストライプ更新処理（端数１）については後述する。【０２６３】
端数となるストライプ数が２以上である場合（ステップ３７０１でＮｏ）、ストライプ更新処理プログラム１１０２は、ストライプ更新処理（端数２以上）を実施する（ステップ３７０３）。ストライプ更新処理（端数２以上）については後述する。【０２６４】
図２３は、ストライプ更新処理（端数１）の一例を示すフローチャートである。この処理は、図２２のステップ３７０２で実行される。ストライプ更新処理（端数）は、ストライプ更新処理プログラム１１０２の一部として実施され、計算機システム１内で処理対象のストライプ２０３のうち、ストライプ構成の更新周期数に満たない端数のストライプの数が１の場合に、当該端数ストライプ構成の更新（端数１）を行う。【０２６５】
まず、ストライプ更新処理プログラム１１０２は、増設Ｎｏｄｅ（Ｎａ）上の、未割当ストライプブロック（Ｂａ）を選択する（ステップ３８０１）。ストライプ更新処理（端数１）では、未更新のストライプ数が１つであるので、当該未割当ストライプブロック（Ｂａ）は、一意に定まる。【０２６６】
次に、ストライプ更新処理プログラム１１０２は、増設前のストライプ管理テーブル１００１上の次処理ストライプ（Ｓｎ）に対応する計ｎ＋１個のデータブロックおよびパリティブロック（Ｐｏ）と、未割当ストライプブロック（Ｂａ）の計ｎ＋２個のストライプブロックを、新ストライプ構成の次処理ストライプ（Ｓｎ）のストライプブロック２０２として、更新中ストライプ管理テーブル１００９を更新し（ステップ３８０２）、処理を終了する。【０２６７】
なお、未割当ストライプブロック（Ｂａ）には所定値のゼロが格納されているため、増設前のストライプ管理テーブル１００１上のパリティブロック（Ｐｏ）は、更新後も同じ値を使用可能である。【０２６８】
図２４は、ストライプ更新処理（端数２以上）の一例を示すフローチャートである。この処理は、図２３のステップ３７０３で実行される。ストライプ更新処理（端数２以上）は、ストライプ更新処理プログラム１１０２の一部として実施され、計算機システム１内で処理対象のストライプ２０３のうち、ストライプ構成の更新周期数（ｎ＋２）に満たない端数のストライプの数が２以上の場合に、当該端数ストライプ構成の更新を行う。【０２６９】
以下では、端数となるストライプの数をｋ（＝Ｓ  ｍｏｄ  （ｎ＋２））とする。すなわち、２≦ｋ＜ｎ＋２である。【０２７０】
まず、ストライプ更新処理プログラム１１０２は、ストライプイテレータ（ｉ）を参照し、ｉ  ｍｏｄ  （ｎ＋２）の値を算出する（ステップ３９０１）。【０２７１】
算出結果が０であった場合、ストライプ更新処理プログラム１１０２は、図１８に示したストライプ更新処理（周期先頭）を実施する（ステップ３９０２）。【０２７２】
算出結果が１以上かつｋ−２未満であった場合、図１９に示したストライプ更新処理プログラム１１０２は、ストライプ更新処理（周期中盤）を実施する（ステップ３９０３）。【０２７３】
算出結果がｋ−１であった場合、ストライプ更新処理プログラム１１０２は、図２０に示したストライプ更新処理（周期終端前）を実施する（ステップ３９０４）。【０２７４】
算出結果がｋであった場合、ストライプ更新処理プログラム１１０２は、図２１に示したストライプ更新処理（周期終端）を実施する（ステップ３９０５）。【０２７５】
上記処理によって、ストライプ構成の更新周期数（ｎ＋２）に満たない端数のストライプ２０３についてストライプ構成の更新が行われる。【０２７６】
図２５は、本実施例１に係る、Ｎｏｄｅ障害時のリビルド処理の一例を示すフローチャートである。【０２７７】
リビルド処理プログラム１１０３は、計算機システム１が、いずれかのＮｏｄｅ１００の障害を検出した場合に自動的に実行される。或いはＮｏｄｅ１００のいずれかに障害が発生した後、管理サーバ２０の指示によって実行される。本実施例１では、スペアのＮｏｄｅ１００（以下では、スペアＮｏｄｅとする）に対してデータを復旧する例を示す。【０２７８】
まず、リビルド処理プログラム１１０３は、障害が発生したＮｏｄｅ１００の識別子を障害Ｎｏｄｅ＃として取得する（ステップ４００１）。次に、リビルド処理プログラム１１０３は、リビルド対象のストライプ番号をＳｔｒｉｐｅ＃として取得する（ステップ４００２）。リビルド対象のストライプ＃は、リビルド処理未実施のストライプ２０３のうち、Ｓｔｒｉｐｅ＃の最も小さいものを選択する。【０２７９】
次に、リビルド処理プログラム１１０３は、ストライプ管理テーブル１００１を参照し、当該Ｓｔｒｉｐｅ＃に対応する、各Ｎｏｄｅ内のストライプブロックのＬＢＡを取得する（ステップ４００３）。【０２８０】
次に、リビルド処理プログラム１１０３は、ステップ４００３にてＬＢＡにより特定された複数のデータ（データブロック及びパリティブロック）を、各Ｎｏｄｅ１００からスペアＮｏｄｅに転送し、ロストしたデータを復旧する（ステップ４００４）。【０２８１】
次に、リビルド処理プログラム１１０３は、当該復旧したデータをスペアＮｏｄｅ内の所定の領域に格納し、ストライプ管理テーブル１００１を更新する（ステップ４００５）。【０２８２】
次に、リビルド処理プログラム１１０３は、コピーポインタ１０１０を更新する（ステップ４００６）。当該コピーポインタ１０１０は、例えばホスト１０から発行されたＲｅａｄ要求に対して、対象のデータをスペアＮｏｄｅから取得するか、またはコレクションリードにより取得するか否かを判定するのに使用される変数である。【０２８３】
具体的には、当該コピーポインタ１０１０よりもＳｔｒｉｐｅ＃が小さいストライプ２０３内のデータに対してＲｅａｄ要求が発行された場合、当該Ｓｔｒｉｐｅ＃に対応するストライプブロックは全て復旧済みであるから、ストライプ管理テーブル１００１に従ってＲｅａｄ対象データを取得し、要求元に応答すればよい。【０２８４】
一方、当該コピーポインタ１０１０よりもＳｔｒｉｐｅ＃が大きいストライプ内のデータであり、かつ対応するＮｏｄｅ１００がＮｏｄｅ管理テーブル１００２上で障害状態にある場合は、ストライプ管理テーブル１００１に従って、当該対象データ以外の、復旧に必要となる一定数のストライプブロックを取得し、復旧処理を行った後、要求元に応答すればよい。【０２８５】
次に、リビルド処理プログラム１１０３は、復旧対象のストライプ２０３のリビルド処理が完了したか否かを判定する（ステップ４００７）。復旧対象のストライプ２０３のリビルド処理が完了していない場合（ステップ４００７でＮｏ）は、ステップ４００２に戻って、リビルド対象のＳｔｒｉｐｅ＃を再選択する。復旧対象のストライプ２０３のリビルド処理が完了した場合（ステップ４００７でＹｅｓ）は、処理を終了する。【０２８６】
以上のように、本実施例１によれば、増設Ｎｏｄｅ１００を追加してストライプ２０３を拡張する場合に、ストライプ更新処理プログラム１１０２が、１つのストライプ２０３について少なくともひとつのストライプブロック２０２を他のＮｏｄｅ１００へ移動することで、ストライプ構成を更新することができる。【０２８７】
すなわち、本実施例１では、ストライプ更新処理プログラム１１０２が、ひとつのＮｏｄｅ１００内で中間パリティを生成して、当該中間パリティのパリティブロックを他のＮｏｄｅ１００に転送し、中間パリティを受信したＮｏｄｅ１００では中間パリティとＮｏｄｅ１００内の既存のデータで新パリティを生成する。【０２８８】
したがって、本実施例１では、Ｎｏｄｅ１００を増設して、ストライプ構成を拡張する際には、Ｎｏｄｅ１００間のデータ移動量を全容量の１／Ｎ（Ｎはシステム内のＮｏｄｅ数）に削減することが可能となる。これにより、Ｎｏｄｅ１００間のネットワーク帯域の狭いＳｃａｌｅ−ｏｕｔ構成においても、高速に容量効率を改善することができる。【０２８９】
また、ストライプ２０３内の全てのデータブロックについて移動させる必要は無いので、パリティの演算負荷を低減することが可能となる。
【実施例２】
【０２９０】
図２６は、実施例２を示し、管理サーバ２０の一例を示すブロック図である。前記実施例１では、Ｎｏｄｅ１００が主体となってストライプ更新処理プログラム１１０２を実施する例を示したが、本実施例２では、管理サーバ２０が主体となってストライプ更新処理プログラム１１０２を実施する例を示す。【０２９１】
管理サーバ２０は、演算処理を行うＣＰＵ２１と、プログラムやデータを格納するメモリ２２と、ネットワーク３０を介して各Ｎｏｄｅ１００に接続される管理Ｉ／Ｆ２３とを含む。【０２９２】
メモリ２２には、各種プログラムを格納する制御プログラム格納領域２２２と、各種情報を格納する制御情報格納領域２２１が設定される。【０２９３】
制御プログラム格納領域２２２は、前記実施例１と同様の、Ｎｏｄｅ増設処理プログラム１１０１と、ストライプ更新処理プログラム１１０２と、リビルド処理プログラム１１０３とを格納する。なお、前記実施例１に示したＩ／Ｏ処理プログラム１１０４は、各Ｎｏｄｅ１００で実行される。【０２９４】
制御情報格納領域２２１は、前記実施例１と同様の、ストライプ管理テーブル１００１と、Ｎｏｄｅ管理テーブル１００２と、ドライブ管理テーブル１００３と、Ｐｏｏｌ  Ｖｏｌｕｍｅ管理テーブル１００４と、Ｐｏｏｌ管理テーブル１００５と、ＶＶＯＬ管理テーブル１００６と、パリティＮｏｄｅテーブル１００７と、更新中ストライプ管理テーブル１００９と、未割当ブロック管理テーブル１００８と、コピーポインタ１０１０とを格納する。【０２９５】
なお、パリティＮｏｄｅテーブル１００７と、未割当ブロック管理テーブル１００８と、コピーポインタ１０１０は、各Ｎｏｄｅ１００毎に設定される。【０２９６】
管理サーバ２０は、Ｎｏｄｅ増設処理プログラム１１０１及びストライプ更新処理プログラム１１０２を実行して、Ｎｏｄｅ１００の増設時にはストライプ構成の更新を各Ｎｏｄｅ１００に指令する。処理の内容は、前記実施例１と同様であるので、説明は省略する。【０２９７】
本実施例２においても、ストライプ構成を拡張する際のＮｏｄｅ１００間のデータ移動量を全容量の１／Ｎ（Ｎはシステム内のＮｏｄｅ数）に削減することが可能となる。【０２９８】
＜まとめ＞
上記実施例１、２では、複数のＮｏｄｅ１００でＲＡＩＤグループを構成した場合を示したが、複数の記憶ドライブ１６０でＲＡＩＤグループを構成したストレージ装置に本実施例を適用しても良い。この場合、増設用の記憶ドライブ１６０を追加した際に、ストライプ構成の構成を上記実施例１、２と同様に行うことができる。【０２９９】
すなわち、ノードが記憶領域を提供する計算機や記憶ドライブのいずれで構成されても、本発明を適用することが可能となる。ノードが記憶領域を提供する計算機の場合は上記実施例１、２のように、各Ｎｏｄｅ１００や管理サーバ２０でストライプ更新処理を実施すれば良い。また、ノードが記憶領域を提供する記憶ドライブの場合には、ノードを制御するプロセッサが、複数の記憶ドライブで構成されたストライプの更新処理を実施すればよい。【０３００】
なお、本発明は上記した各実施例に限定されるものではなく、様々な変形例が含まれる。例えば、上記した実施例は本発明を分かりやすく説明するために詳細に記載したものであり、必ずしも説明した全ての構成を備えるものに限定されるものではない。また、ある実施例の構成の一部を他の実施例の構成に置き換えることが可能であり、また、ある実施例の構成に他の実施例の構成を加えることも可能である。また、各実施例の構成の一部について、他の構成の追加、削除、又は置換のいずれもが、単独で、又は組み合わせても適用可能である。【０３０１】
また、上記の各構成、機能、処理部、及び処理手段等は、それらの一部又は全部を、例えば集積回路で設計する等によりハードウェアで実現してもよい。また、上記の各構成、及び機能等は、プロセッサがそれぞれの機能を実現するプログラムを解釈し、実行することによりソフトウェアで実現してもよい。各機能を実現するプログラム、テーブル、ファイル等の情報は、メモリや、ハードディスク、ＳＳＤ等の記録装置、または、ＩＣカード、ＳＤカード、ＤＶＤ等の記録媒体に置くことができる。【０３０２】
また、制御線や情報線は説明上必要と考えられるものを示しており、製品上必ずしも全ての制御線や情報線を示しているとは限らない。実際には殆ど全ての構成が相互に接続されていると考えてもよい。
【図１】
2018229944.tif 000003
【図２】
2018229944.tif 000004
【図３】
2018229944.tif 000005
【図４】
2018229944.tif 000006
【図５Ａ】
2018229944.tif 000007
【図５Ｂ】
2018229944.tif 000008
【図６】
2018229944.tif 000009
【図７】
2018229944.tif 000010
【図８】
2018229944.tif 000011
【図９】
2018229944.tif 000012
【図１０】
2018229944.tif 000013
【図１１】
2018229944.tif 000014
【図１２】
2018229944.tif 000015
【図１３Ａ】
2018229944.tif 000016
【図１３Ｂ】
2018229944.tif 000017
【図１４】
2018229944.tif 000018
【図１５】
2018229944.tif 000019
【図１６】
2018229944.tif 000020
【図１７】
2018229944.tif 000021
【図１８】
2018229944.tif 000022
【図１９】
2018229944.tif 000023
【図２０】
2018229944.tif 000024
【図２１】
2018229944.tif 000025
【図２２】
2018229944.tif 000026
【図２３】
2018229944.tif 000027
【図２４】
2018229944.tif 000028
【図２５】
2018229944.tif 000029
【図２６】
2018229944.tif 000030
【手続補正書】
【提出日】平成31年2月19日(2019.2.19)
【手続補正１】
【補正対象書類名】明細書
【補正対象項目名】００２５
【補正方法】変更
【補正の内容】
【００２５】
計算機システム１は、１以上のホスト計算機（以下、ホストという）１０と、管理サーバ２０と、複数のＮｏｄｅ１００−１〜１００ｎとを含む。ホスト１０と、管理サーバ２０と、Ｎｏｄｅ１００−１〜１００ｎとは、ネットワーク３０を介して接続されている。なお、Ｎｏｄｅ１００の個々を特定しない場合には、「−」以降を省略した符号「１００」を用いる。他の構成要素の符号についても同様である。
【手続補正２】
【補正対象書類名】明細書
【補正対象項目名】００２６
【補正方法】変更
【補正の内容】
【００２６】
ネットワーク３０は、ローカルエリアネットワーク（ＬＡＮ：Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）であっても良く、ワイドエリアネットワーク（ＷＡＮ：Ｗｉｄｅ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）であってもよい。また、ホスト１０とＮｏｄｅ１００が一つの計算機であってもよい。また、ホスト１０とＮｏｄｅ１００−１〜１００ｎのそれぞれが仮想マシンであってもよい。
【手続補正３】
【補正対象書類名】明細書
【補正対象項目名】００３１
【補正方法】変更
【補正の内容】
【００３１】
ポート１１０は、ホスト１０とのインタフェースの一例である。ポート１１０は、Ｎｏｄｅ１００を、ネットワーク３０等を介して、他のＮｏｄｅ１００等の種々の装置と接続する。
【手続補正４】
【補正対象書類名】明細書
【補正対象項目名】００３２
【補正方法】変更
【補正の内容】
【００３２】
管理Ｉ／Ｆ１２０は、Ｎｏｄｅ１００を、管理サーバ２０と接続するためのインタフェースである。ポート１１０と、管理Ｉ／Ｆ１２０は、同一のものであっても良い。
【手続補正５】
【補正対象書類名】明細書
【補正対象項目名】０１０３
【補正方法】変更
【補正の内容】
【０１０３】
図１１は、Ｐｏｏｌ管理テーブル１００５の一例を示す図である。
【手続補正６】
【補正対象書類名】明細書
【補正対象項目名】０１８８
【補正方法】変更
【補正の内容】
【０１８８】
ストライプ更新処理プログラム１１０２は、パリティＮｏｄｅテーブル１００７のサイクル内インデックス＃２０６０に周期の先頭を示す「０」を設定し、パリティノード＃２０６１には取得したパリティノード（Ｎｐ）の識別子を登録する（ステップ３３０２）。
【手続補正７】
【補正対象書類名】明細書
【補正対象項目名】０１９９
【補正方法】変更
【補正の内容】
【０１９９】
次に、パリティノード（Ｎｐ）のストライプ更新処理プログラム１１０２は、増設前のストライプ管理テーブル１００１上の次処理ストライプＳｎのうち、パリティノード（Ｎｐ）と、増設Ｎｏｄｅ（Ｎａ）以外のＮｏｄｅ１００に格納されているｎ個のデータブロックと、ストライプブロック（Ｂｄ）と、ストライプブロックＢａ（パリティ）の計ｎ＋２個のストライプブロックを、新ストライプ構成のストライプブロックとして、更新中ストライプ管理テーブル１００９に格納し、ストライプ構成を更新する（ステップ３３０８）。
【手続補正８】
【補正対象書類名】明細書
【補正対象項目名】０２０１
【補正方法】変更
【補正の内容】
【０２０１】
周期の先頭のストライプ２０３の処理が完了したので、パリティノード（Ｎｐ）のストライプ更新処理プログラム１１０２は、ストライプ２０３を格納する他のＮｏｄｅ１００に処理の完了を通知してサイクル内インデックス＃２０６０の値をインクリメントする。また、パリティノード（Ｎｐ）のストライプ更新処理プログラム１１０２は、ストライプ管理テーブル１００１とパリティＮｏｄｅテーブル１００７と、未割当ブロック管理テーブル１００８、更新中ストライプ管理テーブル１００９の各テーブルの差分を他のＮｏｄｅ１００に送信して同期させる。
【手続補正９】
【補正対象書類名】明細書
【補正対象項目名】０２０２
【補正方法】変更
【補正の内容】
【０２０２】
以上のように、ストライプ更新処理（周期先頭）では、図１４の（２）のように処理対象のストライプＳｎ（＝＃０）のパリティノード（Ｎｐ）＝＃３のパリティブロック（Ｐｏ＝Ｐ０）とストライプブロック（Ｂｄ＝Ｄ１）から中間パリティ（Ｐｉ）を演算され、増設Ｎｏｄｅ（Ｎａ）＝＃４に転送される。
【手続補正１０】
【補正対象書類名】明細書
【補正対象項目名】０２２６
【補正方法】変更
【補正の内容】
【０２２６】
次に、パリティノード（Ｎａ）のストライプ更新処理プログラム１１０２は、増設前のストライプ管理テーブル１００１上の次処理ストライプＳｎのうち、パリティノード（Ｎｐ）と、増設ノード（Ｎａ）と、転送先ノード（Ｎｎ）以外のＮｏｄｅ１００に格納されているｎ−１個のデータブロックと、ストライプブロック（Ｂｄ）と、ストライプブロック（Ｂａ）と、未割当ブロック（Ｂｎ）（パリティ）の計ｎ＋２個のストライプブロックを、更新後のストライプＳｎのストライプブロックとして、更新中ストライプ管理テーブル１００９を更新する（ステップ３４０９）。
【手続補正１１】
【補正対象書類名】明細書
【補正対象項目名】０２２９
【補正方法】変更
【補正の内容】
【０２２９】
周期の中盤のストライプ２０３の処理が完了したので、パリティノード（Ｎｐ）のストライプ更新処理プログラム１１０２は、ストライプ２０３を格納する他のＮｏｄｅ１００に処理の完了を通知してサイクル内インデックス＃２０６０の値をインクリメントする。また、パリティノード（Ｎｐ）のストライプ更新処理プログラム１１０２は、ストライプ管理テーブル１００１とパリティＮｏｄｅテーブル１００７と、未割当ブロック管理テーブル１００８、更新中ストライプ管理テーブル１００９の各テーブルの差分を他のＮｏｄｅ１００に送信して同期させる。
【手続補正１２】
【補正対象書類名】明細書
【補正対象項目名】０２４２
【補正方法】変更
【補正の内容】
【０２４２】
ステップ３５０５〜３５１０は、上記図１９に示したストライプ更新処理（周期先頭）のステップ３４０５〜３４１０と同様である。
【手続補正１３】
【補正対象書類名】明細書
【補正対象項目名】０２４４
【補正方法】変更
【補正の内容】
【０２４４】
周期の終端のひとつ前のストライプ２０３の処理が完了したので、パリティノード（Ｎｐ）のストライプ更新処理プログラム１１０２は、ストライプ２０３を格納する他のＮｏｄｅ１００に処理の完了を通知してサイクル内インデックス＃２０６０の値をインクリメントする。また、パリティノード（Ｎｐ）のストライプ更新処理プログラム１１０２は、ストライプ管理テーブル１００１とパリティＮｏｄｅテーブル１００７と、未割当ブロック管理テーブル１００８、更新中ストライプ管理テーブル１００９の各テーブルの差分を他のＮｏｄｅ１００に送信して同期させる。
【手続補正１４】
【補正対象書類名】明細書
【補正対象項目名】０２５４
【補正方法】変更
【補正の内容】
【０２５４】
次に、ストライプ更新処理プログラム１１０２は、増設前のストライプ管理テーブル１００１上の次処理ストライプ（Ｓｎ）のうち、パリティノード（Ｎｐ）、増設ノード（Ｎａ）、転送先ノード（Ｎｎ）以外のＮｏｄｅに格納されているｎ−１個のデータブロック、Ｂｃ、Ｂａ、Ｂｎ（パリティ）の計ｎ＋２個のストライプブロックを、新ストライプ上の次処理ストライプ（Ｓｎ）のストライプブロック２０２として選択し、更新中ストライプ管理テーブル１００９を更新する（ステップ３６０６）。
【手続補正１５】
【補正対象書類名】明細書
【補正対象項目名】０２７２
【補正方法】変更
【補正の内容】
【０２７２】
算出結果が１以上かつｋ−２未満であった場合、ストライプ更新処理プログラム１１０２は、図１９に示したストライプ更新処理（周期中盤）を実施する（ステップ３９０３）。
【国際調査報告】
2018229944.tif 000031
2018229944.tif 000032
2018229944.tif 000033
2018229944.tif 000034