(57)【要約】【課題】分散ストレージシステムにおいて、アクセス要求を受けた場合におけるストレージ装置間のネットワークの負荷を低減し、応答性を向上できるようにする。【解決手段】分散ストレージシステム１において、記憶デバイス１１３は、データ領域と、キャッシュ領域とを含み、ノードは、ＬＵのデータがデータ領域に格納されていない未格納状態で他のノードからＬＵの担当の移譲を受けた場合、オーナーノードとなり、オーナーノードのプロセッサ１１０を、担当するＬＵに対するリード要求を受け付け、対象領域のデータがオーナーノードのデータ領域とキャッシュ領域とに格納されていない場合に、対象領域のデータを、他のノードの記憶デバイスのデータに基づいて取得し、要求元に送信するとともに、キャッシュ領域に格納するように構成する。【選択図】図１
2020154626.tif 000002
【特許請求の範囲】
【請求項１】
ストレージ装置を複数備え、複数の記憶デバイスに分散してデータを管理する分散ストレージシステムであって、
前記ストレージ装置は、プロセッサ部を備え、
前記記憶デバイスは、データを格納するために用いられるデータ領域と、データをキャッシュするために用いられるキャッシュ領域とを含み、
前記分散ストレージシステムにおいては、データを管理する論理ユニット毎に前記論理ユニットに対するアクセスを担当するストレージ装置である担当ストレージ装置が設定されており、
前記ストレージ装置は、論理ユニットのデータが自身がアクセス可能な前記記憶デバイスのデータ領域に格納されていない状態である未格納状態で、他のストレージ装置から前記論理ユニットの担当の移譲を受けた場合、前記担当ストレージ装置となり、
前記担当ストレージ装置のプロセッサ部は、
自身が担当する論理ユニットに対するリード要求を受け付け、
前記未格納状態の前記論理ユニットの前記リード要求の対象とする対象領域のデータを、他のストレージ装置の前記記憶デバイスのデータに基づいて取得し、
前記取得した前記論理ユニットの前記対象領域のデータを前記リード要求の要求元に送信するとともに、前記取得した前記論理ユニットの前記対象領域のデータを自身がアクセス可能な前記記憶デバイスの前記キャッシュ領域に格納する
分散ストレージシステム。
【請求項２】
前記論理ユニットのデータは、ＥＣ（Ｅｒａｓｕｒｅ  Ｃｏｄｉｎｇ）を構成する複数のストレージ装置により冗長化して管理されており、
前記担当ストレージ装置は、前記ＥＣを構成するストレージ装置に障害が発生したために、障害が発生したストレージ装置である障害ストレージ装置が担当していた論理ユニットを新たに担当するように設定されたストレージ装置であり、
前記担当ストレージ装置の前記プロセッサ部は、
新たに担当する論理ユニットに対するリード要求を受け付け、
前記リード要求の対象となる前記論理ユニットの対象領域のデータが前記障害ストレージ装置の前記記憶デバイスのデータ領域に格納されていたものであって、前記担当ストレージ装置がアクセス可能な前記記憶デバイスの前記データ領域及び前記キャッシュ領域に格納されていない場合に、前記ＥＣを構成する障害ストレージ装置以外の複数のストレージ装置から対象領域のデータを復元するためのデータを取得し、
取得した前記データに基づいて、前記対象領域のデータを復元し、
前記復元したデータをリード要求の要求元に送信するとともに、復元した前記対象領域のデータを前記記憶デバイスのキャッシュ領域に格納する
請求項１に記載の分散ストレージシステム。
【請求項３】
前記担当ストレージ装置の前記プロセッサ部は、
新たに担当する論理ユニットに対するライト要求を受け付け、
前記ライト要求に対応する対象領域にライトするデータを前記キャッシュ領域に格納する
請求項２に記載の分散ストレージシステム。
【請求項４】
前記障害ストレージ装置をリプレースするためのストレージ装置であるリプレースストレージ装置が備えられた後において、
前記リプレースストレージ装置の前記プロセッサ部は、
前記ＥＣを構成する障害ストレージ装置以外の複数のストレージ装置から前記論理ユニットの一部の領域のデータを復元するためのデータを取得し、
前記データに基づいて、前記論理ユニットの一部の領域のデータを復元して、前記記憶デバイスのキャッシュ領域に格納し、
前記ＥＣを構成する障害ストレージ装置以外の複数のストレージ装置から前記論理ユニットの領域のデータを復元するためのデータを取得し、
前記データに基づいて、前記論理ユニットの全ての領域のデータを復元して、前記記憶デバイスのデータ領域に格納し、
前記論理ユニットに対応するキャッシュ領域のデータを破棄する
請求項２に記載の分散ストレージステム。
【請求項５】
前記担当ストレージ装置の前記プロセッサ部は、
前記ＥＣを構成する障害ストレージ装置以外の複数のストレージ装置から前記論理ユニットの全ての領域のデータを復元するために必要なパリティ及びデータを取得し、
前記パリティ及び前記データに基づいて、前記論理ユニットの全ての領域のデータを復元して、前記記憶デバイスのデータ領域に格納し、
前記論理ユニットに対応するキャッシュ領域のデータを破棄する
請求項２に記載の分散ストレージステム。
【請求項６】
移譲元のストレージ装置から論理ユニットの担当が移譲された移譲先のストレージ装置のプロセッサ部は、
移譲対象の前記論理ユニットについて、前記移譲元のストレージ装置から前記移譲先のストレージ装置がアクセス可能な記憶デバイスへの論理ユニットのデータのマイグレート中において、マイグレートしている前記論理ユニットを対象とし、前記論理ユニットのマイグレートが完了していない領域に対するリード要求を受け取ると、前記リード要求の対象領域のデータが前記記憶デバイスのキャッシュ領域に格納されていない場合には、前記移譲元のストレージ装置から前記対象領域のデータを読み出して、前記読み出したデータを前記リード要求の要求元に送信するとともに、前記読み出したデータを前記移譲先のストレージ装置の記憶デバイスのキャッシュ領域に格納する
請求項１に記載の分散ストレージシステム。
【請求項７】
移譲元のストレージ装置から論理ユニットの担当が移譲された移譲先のストレージ装置のプロセッサ部は、
移譲対象の前記論理ユニットについて、前記移譲元のストレージ装置から前記移譲先のストレージ装置の記憶デバイスへの論理ユニットのデータのマイグレート中において、マイグレートしている前記論理ユニットを対象とし、前記論理ユニットのマイグレートが完了していない領域に対するライト要求を受け取ると、前記ライト要求のライト対象のデータを前記移譲先のストレージ装置のデータ領域に格納させるとともに、前記ライト対象のデータを前記移譲先のストレージ装置の記憶デバイスのキャッシュ領域に格納する
請求項１に記載の分散ストレージシステム。
【請求項８】
論理ユニットの担当を移譲する移譲元のストレージ装置のプロセッサ部は、
前記論理ユニットの担当を移譲する移譲先のストレージ装置を選択し、
前記移譲先のストレージ装置に対して、移譲対象の前記論理ユニットにおけるアクセス頻度の高い一部の領域のデータを、前記移譲先のストレージ装置に送信し、
前記移譲先のストレージ装置のプロセッサ部は、
前記移譲元のストレージ装置から送信された移譲対象の論理ユニットにおけるアクセス頻度の高い一部の領域のデータを、前記移譲先のストレージ装置の前記記憶デバイスのキャッシュ領域に格納する
請求項１に記載の分散ストレージシステム。
【請求項９】
前記ストレージ装置のプロセッサ部は、
記憶デバイスにおける容量使用率が所定値以上の場合に、自ストレージ装置が担当する論理ユニットの一部のデータ領域のデータを他のストレージ装置の記憶デバイスのデータ領域に移動させる
請求項１に記載の分散ストレージシステム。
【請求項１０】
前記ストレージ装置のプロセッサ部は、
自ストレージ装置の記憶デバイスにおける容量使用率が所定値未満の場合に、自ストレージ装置が担当する論理ユニットであって、前記他のストレージ装置の記憶デバイスのデータ領域に移動させたデータを、前記自ストレージ装置の前記記憶デバイスの前記データ領域に移動させ、
前記自ストレージ装置の前記記憶デバイスの前記キャッシュ領域における、移動させた前記論理ユニットのデータに対応するデータを破棄する
請求項９に記載の分散ストレージシステム。
【請求項１１】
前記ストレージ装置のプロセッサ部は、
前記キャッシュ領域に前記論理ユニットのデータを格納する際に、前記論理ユニットについてのキャッシュヒット率に基づいて、既存のキャッシュ領域のデータと入れ替えるか、新たなキャッシュ領域を確保するかを選択し、
選択した結果に対応するキャッシュ領域に前記論理ユニットのデータを格納する
請求項１に記載の分散ストレージシステム。
【請求項１２】
前記ストレージ装置のプロセッサ部は、
前記キャッシュ領域に前記論理ユニットのデータを格納する際に、前記記憶デバイスに前記キャッシュ領域として割り当てられる空き領域が存在しない場合に、前記記憶デバイスの前記データ領域のデータを、他の前記ストレージ装置の記憶デバイスのデータ領域に移動させて空き領域を生成し、前記空き領域を前記キャッシュ領域に割り当てる
請求項１に記載の分散ストレージシステム。
【請求項１３】
ストレージ装置を複数備え、複数の記憶デバイスに分散してデータを管理する分散ストレージシステムにおけるデータ管理方法であって、
前記記憶デバイスは、データを格納するために用いられるデータ領域と、データをキャッシュするために用いられるキャッシュ領域とを含み、
前記分散ストレージシステムにおいては、データを管理する論理ユニット毎に前記論理ユニットに対するアクセスを担当するストレージ装置である担当ストレージ装置が設定されており、
前記ストレージ装置は、論理ユニットのデータが自身がアクセス可能な前記記憶デバイスのデータ領域に格納されていない状態である未格納状態で、他のストレージ装置から前記論理ユニットの担当の移譲を受けた場合、前記担当ストレージ装置となり、
前記担当ストレージ装置は、
自身が担当する論理ユニットに対するリード要求を受け付け、
前記未格納状態の前記論理ユニットの前記リード要求の対象とする対象領域のデータを、他のストレージ装置の前記記憶デバイスのデータに基づいて取得し、
前記取得した前記論理ユニットの前記対象領域のデータを前記リード要求の要求元に送信するとともに、前記取得した前記論理ユニットの前記対象領域のデータを自身がアクセス可能な前記記憶デバイスの前記キャッシュ領域に格納する
データ管理方法。
【請求項１４】
ストレージ装置を複数備え、複数の記憶デバイスに分散してデータを管理する分散ストレージシステムにおける、所定の論理ユニットに対するアクセスを担当する担当ストレージ装置を構成するコンピュータに実行させるためのデータ管理プログラムであって、
前記記憶デバイスは、データを格納するために用いられるデータ領域と、データをキャッシュするために用いられるキャッシュ領域とを含み、
前記ストレージ装置は、前記論理ユニットのデータが前記記憶デバイスのデータ領域に格納されていない状態である未格納状態で、他のストレージ装置から前記論理ユニットの担当の移譲を受けた場合、前記担当ストレージ装置となり、
前記データ管理プログラムは、
前記コンピュータに、
自身が担当する論理ユニットに対するリード要求を受け付け、
前記未格納状態の前記論理ユニットの前記リード要求の対象とする対象領域のデータを、他のストレージ装置の前記記憶デバイスのデータに基づいて取得し、
前記取得した前記論理ユニットの前記対象領域のデータを前記リード要求の要求元に送信するとともに、前記取得した前記論理ユニットの前記対象領域のデータを自身がアクセス可能な前記記憶デバイスの前記キャッシュ領域に格納する
処理を実行させるデータ管理プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、分散ストレージシステムにおいてデータを管理する技術に関する。
【背景技術】
【０００２】
複数台の汎用サーバで構成される分散ストレージシステムが知られている。分散ストレージシステムでは、ＴＣＰ／ＩＰ等の汎用ネットワークを用いてサーバ間が接続されている。汎用ネットワークは、ＰＣＩ等の内部バスに比べて低帯域・高レイテンシであるため、サーバ間のデータ転送量が極力小さくなるように制御することが好ましい。
【０００３】
例えば、特許文献１には、分散Ｅｒａｓｕｒｅ  Ｃｏｄｉｎｇを適用した分散ストレージシステムについて、ホストからのデータ読み出し要求に対して、ホストから要求を受けたサーバ内のデバイスからデータを読み出せるようにデータ格納先を工夫し、データ読み出しに伴うサーバ間のデータ転送が少なくなるよう構成する技術が開示されている。
【０００４】
一方、ストレージ高速化技術の１つに、デバイスから読み出したデータを大容量キャッシュに格納し、同一データ参照時のデバイス・アクセスを不要化して高速化する技術がある。例えば、特許文献２には、ストレージに搭載されたデバイスにキャッシュデータを格納し、大容量キャッシュを実現する技術が開示されている。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】国際公開第２０１６／０５２６６５号
【特許文献２】特開平０９−２７４５４４号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
サーバ障害等を考慮すると、常に、ホストから要求を受けたサーバ内のデバイスからデータを読み出す制御を実現することが難しい。例えば、前述の分散Ｅｒａｓｕｒｅ  Ｃｏｄｉｎｇ技術によると、サーバ障害時に、データ復元に必要なデータを他サーバから読み出さなければならない。また、或るサーバのストレージ容量が不足する場合、一部のデータを他サーバに格納し、このサーバからデータを読み出さなければならない。これらのデータ転送によってネットワークがボトルネックにならないように、予め広帯域なネットワークを構築すると、システムが高コストとなってしまう。
【０００７】
また分散ストレージシステムでは、性能／容量負荷が特定サーバに集中してボトルネックになるリスクがある。これを解消するには、ボトルネックとなったサーバが保持するデータを、別サーバにマイグレーションする必要があり、ボトルネック解消に時間がかかる問題がある。
【０００８】
本発明は、上記事情に鑑みなされたものであり、その目的は、分散ストレージシステムにおいて、アクセス要求を受けた場合におけるストレージ装置間のネットワークの負荷を低減し、応答性を向上することのできる技術を提供することにある。
【課題を解決するための手段】
【０００９】
上記目的を達成するため、一観点に係る分散ストレージシステムは、ストレージ装置を複数備え、複数の記憶デバイスに分散してデータを管理する分散ストレージシステムであって、ストレージ装置は、プロセッサ部を備え、記憶デバイスは、データを格納するために用いられるデータ領域と、データをキャッシュするために用いられるキャッシュ領域とを含み、分散ストレージシステムにおいては、データを管理する論理ユニット毎に論理ユニットに対するアクセスを担当するストレージ装置である担当ストレージ装置が設定されており、ストレージ装置は、論理ユニットのデータが自身がアクセス可能な記憶デバイスのデータ領域に格納されていない状態である未格納状態で、他のストレージ装置から前記論理ユニットの担当の移譲を受けた場合、担当ストレージ装置となり、担当ストレージ装置のプロセッサ部は、自身が担当する論理ユニットに対するリード要求を受け付け、未格納状態の論理ユニットのリード要求の対象とする対象領域のデータを、他のストレージ装置の記憶デバイスのデータに基づいて取得し、取得した論理ユニットの対象領域のデータをリード要求の要求元に送信するとともに、取得した論理ユニットの対象領域のデータを自身がアクセス可能な記憶デバイスのキャッシュ領域に格納する。
【発明の効果】
【００１０】
本発明によれば、分散ストレージシステムにおいて、アクセス要求を受けた場合におけるストレージ装置間のネットワークの負荷を低減し、アクセスの応答性を向上することができる。
【図面の簡単な説明】
【００１１】
【図１】図１は、実施例１に係る分散ストレージシステムの全体構成図である。
【図２】図２は、実施例１に係るメモリの構成図である。
【図３】図３は、実施例１に係る分散ストレージシステムにおけるデータの論理構成図である。
【図４】図４は、実施例１に係るノードプールの構成図である。
【図５】図５は、実施例１に係るデータページ管理テーブルの構成図である。
【図６】図６は、実施例１に係るキャッシュ管理テーブルの構成図である。
【図７】図７は、実施例１に係る性能モニタ管理テーブルの構成図である。
【図８】図８は、実施例１に係るキャッシュデータ登録処理のフローチャートである。
【図９】図９は、実施例１に係るキャッシュページ確保処理のフローチャートである。
【図１０】図１０は、実施例１に係る分散Ｅｒａｓｕｒｅ  Ｃｏｄｉｎｇ方式の概要図である。
【図１１】図１１は、実施例１に係るノード情報管理テーブルの構成図である。
【図１２】図１２は、実施例１に係るノード障害処理のフローチャートである。
【図１３】図１３は、実施例１に係るＲｅａｄ処理のフローチャートである。
【図１４】図１４は、実施例１に係るデータ復元処理のフローチャートである。
【図１５】図１５は、実施例１に係るＷｒｉｔｅ処理のフローチャートである。
【図１６】図１６は、実施例１に係るデータ符号化処理のフローチャートである。
【図１７】図１７は、実施例１に係るリビルド処理のフローチャートである。
【図１８】図１８は、実施例２に係るデータ再配置処理のフローチャートである。
【図１９】図１９は、実施例２に係るＲｅａｄ処理のフローチャートである。
【図２０】図２０は、実施例２に係るＷｒｉｔｅ処理のフローチャートである。
【図２１】図２１は、実施例３に係るＬＵマイグレーション管理テーブルの構成図である。
【図２２】図２２は、実施例３に係るＬＵマイグレーション処理のフローチャートである。
【図２３】図２３は、実施例３に係るＲｅａｄ処理のフローチャートである。
【図２４】図２４は、実施例３に係るＷｒｉｔｅ処理のフローチャートである。
【図２５】図２５は、実施例４に係るキャッシュウォーミング処理のフローチャートである。
【発明を実施するための形態】
【００１２】
実施例について、図面を参照して説明する。なお、以下に説明する実施例は特許請求の範囲に係る発明を限定するものではなく、また実施例の中で説明されている諸要素及びその組み合わせの全てが発明の解決手段に必須であるとは限らない。
【００１３】
以下の説明では、「ＡＡＡテーブル」の表現にて情報を説明することがあるが、情報は、どのようなデータ構造で表現されていてもよい。すなわち、情報がデータ構造に依存しないことを示すために、「ＡＡＡテーブル」を「ＡＡＡ情報」と呼ぶことができる。
【００１４】
また、以下の説明では、「記憶部」は、１以上のメモリ又は記憶デバイスを含む。少なくとも１つのメモリは、揮発性メモリであってもよいし不揮発性メモリであってもよい。記憶部は、主に、プロセッサ部による処理の際に使用される。
【００１５】
また、以下の説明では、「プロセッサ部」は、１以上のプロセッサを含む。少なくとも１つのプロセッサは、典型的には、ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）のようなマイクロプロセッサである。１以上のプロセッサの各々は、シングルコアでもよいしマルチコアでもよい。プロセッサは、処理の一部または全部を行うハードウェア回路を含んでもよい。
【００１６】
また、以下の説明では、「プログラム」を動作の主体として処理を説明する場合があるが、プログラムは、プロセッサ（例えばＣＰＵ）によって実行されることで、定められた処理を、適宜に記憶資源（例えばメモリ）及び／又は通信インターフェース装置（例えばポート）を用いながら行うため、処理の主語がプロセッサとされてもよい。プログラムを主語として説明された処理は、プロセッサを含む装置が行う処理としてもよい。また、プロセッサが行う処理の一部又は全部を行うハードウェア回路を含んでもよい。コンピュータプログラムは、プログラムソースから装置にインストールされてもよい。プログラムソースは、例えば、プログラム配布サーバ、又は、計算機が読み取り可能な記憶メディアであっても良い。
【実施例１】
【００１７】
図１は、実施例１に係る分散ストレージシステムの全体構成図である。
【００１８】
分散ストレージシステム１は、複数台のホストサーバ（以下、ホストという）１０２と、複数台のストレージサーバ（ストレージ装置の一例、以下、ノードという）１０３と、管理サーバ１０４とを備える。各ホスト１０２と、各ノード１０３とは、ネットワーク１０５を介して接続されている。各ノード１０３は、ネットワーク１０６を介して接続されている。各ノード１０３と管理サーバ１０４とは、ネットワーク１０７を介して接続されている。ネットワーク１０５、１０６、１０７は、例えば、ＬＡＮ（Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）や、ＷＡＮ（Ｗｉｄｅ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）等であってもよく、これらのネットワーク１０５、１０６，１０７は、特定のトポロジや特定の通信プロトコルに依存しない。例えば、ネットワーク１０５、１０６，１０７を単一ネットワークとして構成してもよい。このような構成により、分散ストレージシステム１では、各ノード１０３に格納されているデータを各ホスト１０２から参照・更新でき、各ノード１０３間で互いにデータの送受信ができ、管理サーバ１０４から各ノード１０３を制御したり、モニタリングしたりすることができる。
【００１９】
ホスト１０２は、アプリケーションを実行し、ノード１０３に書き込み要求（ライト要求：アクセス要求の一例）を発行してノード１０３にデータを格納したり、ノード１０３に読み出し要求（リード要求：アクセス要求の一例）を発行してノード１０３からデータを読み出したりして、各種処理を実行する。
【００２０】
管理サーバ１０４は、各ノード１０３の管理処理を実行する。
【００２１】
ノード１０３は、各ホスト１０２により利用されるデータを記憶し、管理する処理を実行する。ノード１０３は、例えば、サーバ装置や、ＰＣ（Ｐｅｒｓｏｎａｌ  Ｃｏｍｐｕｔｅｒ）等の物理計算機により構成され、１個以上のプロセッサ１１０、１個以上のメモリ１１１、１個以上のネットワークＩ／Ｆ１１２、及び１個以上の記憶デバイス１１３を備える。
【００２２】
ネットワークＩ／Ｆ１１２は、例えば、Ｅｔｈｅｒｎｅｔ（登録商標）に対応するＮＩＣ（Ｎｅｔｗｏｒｋ  Ｉｎｔｅｒｆａｃｅ  Ｃａｒｄ）やＦｉｂｒｅ  Ｃｈａｎｎｅｌに対応するＨｏｓｔ  Ｂｕｓ  Ａｄａｐｔｅｒ（ＨＢＡ）などのネットワークインターフェースである。ネットワークＩ／Ｆ１１２は、ネットワーク１０５，１０６，１０７を介して他の装置（ホスト１０２、他のノード１０３、管理サーバ１０４）との通信を仲介する。
【００２３】
プロセッサ１１０は、メモリ１１１及び／又は記憶デバイス１１３に格納されているプログラムに従って各種処理を実行する。
【００２４】
メモリ１１１は、例えば、ＲＡＭであり、プロセッサ１１０で実行されるプログラムや、必要な情報を記憶する。メモリ１１１は、揮発メモリ又は不揮発メモリのいずれでもよい。
【００２５】
記憶デバイス１１３は、例えばＨＤＤ（Ｈａｒｄ  Ｄｉｓｋ  Ｄｒｅｉｖｅ）やＳＳＤ（Ｓｏｌｉｄ  Ｓｔａｔｅ  Ｄｒｉｖｅ）等であり、プロセッサ１１０で実行されるプログラムや、プロセッサ１１０に利用されるデータや、ホスト１０２で利用されるデータ等を記憶する。
【００２６】
なお、ノード１０３におけるプロセッサ１１０、メモリ１１１、ネットワークＩ／Ｆ１１２、記憶デバイス１１３を、サーバ仮想化技術を用いた仮想的なハードウェアとして構成してもよい。すなわち、ノード１０３をＶｉｒｔｕａｌ  Ｍａｃｈｉｎｅ（ＶＭ）で構成してもよい。
【００２７】
分散ストレージシステム１において、ホスト１０２とノード１０３とを同一の物理計算機上に配置するようにしてもよい。この場合には、例えば、同一の物理計算機において、ホスト１０２とノード１０３とをそれぞれＶＭ上で動作させるようにすればよい。
【００２８】
図２は、実施例１に係るメモリの構成図である。
【００２９】
メモリ１１１は、データページ管理テーブル４０１と、キャッシュ管理テーブル５０１と、性能モニタ管理テーブル６０１と、ノード情報管理テーブル９０１と、キャッシュデータ登録プログラム７００と、ノード障害処理プログラム１０００と、Ｒｅａｄプログラム１１００と、復号化プログラム１１０９と、Ｗｒｉｔｅプログラム１２００と、符号化プログラム１２０５と、リビルドプログラム１３００とを格納する。これらテーブルの詳細や、各プログラムを実行することにより実現される処理については後述する。
【００３０】
図３は、実施例１に係る分散ストレージシステムにおけるデータの論理構成図である。
【００３１】
各ノード１０３には、複数個のＬｏｇｉｃａｌ  Ｕｎｉｔ（ＬＵ：論理ユニット）２０１を定義することができる。ホスト１０２は、このＬＵ２０１に対してブロックＩ／Ｏ（ブロックを単位とするＩ／Ｏ）を行うことができる。ノード１０３は、ホスト１０２からのブロックＩ／Ｏを受領できる。各ＬＵ２０１は、いずれのノード１０３に接続されたホスト１０２からでも参照・更新することが可能である。
【００３２】
一般的に、複数のノード１０３からＬＵ２０１の参照・更新を行う場合、データの一貫性維持のため、ノード１０３間で何かしらの排他手続きが必要となる。本実施例では、ＬＵ２０１ごとにＩ／Ｏ処理を担当するノード（オーナーノード：担当ストレージ装置の一例）を事前に定義し、ホスト１０２からＩ／Ｏ要求を受領したノード１０３が、Ｉ／Ｏ要求に指定されているＩ／Ｏ対象のＬＵ２０１のオーナーノードへＩ／Ｏ処理要求を転送し、オーナーノードのみがＩ／Ｏ対象のＬＵのＩ／Ｏ処理を行うことでデータの一貫性を維持するようにしている。図３に示す例では、ＬＵ＃１〜＃２のオーナーノードはノード＃１であり、ＬＵ＃３〜＃４のオーナーノードはノード＃２である。ノード＃１とノード＃２とは両者ともＬＵ＃１〜＃４のブロックＩ／Ｏを受領可能である。
【００３３】
なお、分散ストレージシステム１におけるデータの排他手続きは、上記に限られず、例えば、ＬＵ２０１ごとにノード１０３間のロック機構を設け、Ｉ／Ｏを受領したノードがＩ／Ｏ対象のＬＵ２０１のロックを取得した上でＩ／Ｏ処理を行うようにしてもよい。また、本実施例では、ＬＵ２０１単位にオーナーノードを定義しているが、本発明はこれに限られず、各ＬＵ２０１の部分領域２２１ごとにオーナーノードを事前定義するようにしてもよい。
【００３４】
また、本実施例では、ブロックＩ／Ｏを処理可能な分散ストレージシステム１としているが、ファイルやオブジェクト等の非ブロックＩ／Ｏを処理可能な分散ストレージシステムとしてもよい。この場合、例えば、ファイルＩ／ＯやオブジェクトＩ／ＯをブロックＩ／Ｏに変換するプログラムを用意することで、本実施例と同等の効果を得ることができる。
【００３５】
各ノード１０３内の各記憶デバイス１１３は、一般的なＴｈｉｎ  Ｐｒｏｖｉｓｉｏｎｉｎｇ技術によって固定サイズの領域（以下、ページと呼ぶ）２２２に分割され、ノード１０３ごとにプール（以下、ノードプール呼ぶ）２０２として管理されている。Ｔｈｉｎ  Ｐｒｏｖｉｓｉｏｎｉｎｇ技術によると、ホスト１０２からの書き込み要求（ライト要求）に応じて、要求があった各ＬＵ２０１の部分領域２２１にページ２２２を動的に関連付け、関連付けたページ２２２にライト対象のデータを書き込む。
【００３６】
各ＬＵ２０１に関連付けるページ２２２は、基本的には、ＬＵ２０１のオーナーノード１０３のノードプール２０２から取得する。しかしながら、このノードプール２０２に空きページが存在しない場合など、必要に応じて、別のノード１０３のノードプール２０２のページ２２２が関連付けられることがある。言い換えると、各ＬＵ２０１に対して複数ノードプール２０２のページ２２２が関連付けられることがある。さらに、ＬＵ２０１に既に関連付けされたページ２２２について、別のノードプール２０２のページ２２２へと関連付けるページを変更することが可能である。具体的には、変更先のノードプール２０２から新規にページ２２２を取得し、このページ２２２に関連付け済みページのデータをコピーし、ＬＵに対して関連付け済みページをコピー先のページ２２２に変更することで容易に実現可能である。
【００３７】
図４は、実施例１に係るノードプールの構成図である。
【００３８】
ノードプール２０２が管理する領域は、永続的にデータを格納しておくためのデータ格納用のページ（データページ：データ領域の一部）３０１、キャッシュ格納用のページ（キャッシュページ：キャッシュ領域の一部）３０２、データ未格納の空きページ３０３の３種類に分類して管理される。ホスト１０２から書き込まれたデータの全ては、最終的にいずれかのデータページ３０１に格納される。一方で、Ｉ／Ｏ性能の向上を目的とし、一部のデータについては、キャッシュデータとしてキャッシュページ３０２に格納される。ノードプール２０２における、キャッシュページ３０２により構成されるキャッシュ領域と、データページ３０１により構成されるデータ領域との容量のバランスは、適宜変更することが可能である。キャッシュ領域とデータ領域との容量の変更方法については後述する。
【００３９】
図５は、実施例１に係るデータページ管理テーブルの構成図である。
【００４０】
データページ管理テーブル４０１は、ノード１０３ごとに保持されるテーブルであり、自身がオーナーノードとなる各ＬＵ（すなわち、自身が担当するＬＵ）の各部分領域２２１とデータページ３０１との関連付け情報を管理するテーブルである。データページ管理テーブル４０１は、各ＬＵの部分領域ごとに対応するエントリを格納する。データページ管理テーブル４０１のエントリは、ＬＵ番号（ＬＵ＃）４１１と、部分領域先頭アドレス４１２と、ノード番号（ノード＃）４１３と、デバイス番号（デバイス＃）４１４と、デバイス内先頭アドレス４１５とのフィールドを含む。
【００４１】
ＬＵ番号４１１には、エントリに対応するＬＵの番号が格納される。部分領域先頭アドレス４１２には、エントリに対応する部分領域の先頭アドレスが格納される。ノード番号４１３には、エントリに対応する部分領域に関連付けるデータページが格納されているノード１０３の番号が格納される。デバイス番号４１４には、エントリに対応する部分領域に関連付けるデータページが格納されている記憶デバイス１１３の番号が格納される。デバイス内先頭アドレス４１５には、エントリに対応する部分領域に関連付けるデータページが格納される記憶デバイス１１３内の先頭アドレスが格納される。なお、エントリに対応するＬＵの部分領域について、データページが関連付けられていない場合、すなわち、対応する部分領域にデータが格納されていない場合には、ノード番号４１３、デバイス番号４１４、及びデバイス内先頭アドレス４１５には、情報が格納されていない状態となっている。
【００４２】
図６は、実施例１に係るキャッシュ管理テーブルの構成図である。
【００４３】
キャッシュ管理テーブル５０１は、ノード１０３ごとに保持されるテーブルであり、自身がオーナーノードである各ＬＵの各部分領域と、キャッシュデータの格納先との関連付け情報を管理するテーブルである。本実施例においては、キャッシュデータは、キャッシュページ３０２よりも小さな固定サイズで管理される。すなわち、キャッシュページ３０２ごとに複数個のキャッシュデータが格納される。また、データページ３０１と異なり、キャッシュページ３０２は自身のノードプール２０２からのみ取得される。なお、本実施例においては、キャッシュデータを記憶デバイス１１３のみに格納するようにしているが、キャッシュデータの一部をメモリ１１１に格納してもよい。
【００４４】
キャッシュ管理テーブル５０１は、各ＬＵの部分領域ごとに対応するエントリを格納する。キャッシュ管理テーブル５０１のエントリは、ＬＵ番号５１１と、部分領域先頭アドレス５１２と、デバイス番号５１３と、デバイス内先頭アドレス５１４と、キャッシュページ内オフセット５１５と、最終アクセス時刻５１６とのフィールドを含む。
【００４５】
ＬＵ番号５１１には、エントリに対応するＬＵの番号が格納される。部分領域先頭アドレス５１２には、エントリに対応する部分領域の先頭アドレスが格納される。デバイス番号５１３には、エントリに対応する部分領域に関連付けるキャッシュページが格納されている記憶デバイス１１３の番号が格納される。デバイス内先頭アドレス５１４には、エントリに対応する部分領域に関連付けるキャッシュページの記憶デバイス１１３内の先頭アドレスが格納される。キャッシュページ内オフセット５１５には、エントリに対応する部分領域が格納されているキャッシュページ内のオフセットが格納されている。最終アクセス時刻５１６には、エントリに対応する部分領域に対する最終アクセス時刻の情報が格納される。図６の例では、最終アクセス時刻の情報としては、所定の時点からのタイムカウントとしているが、最終アクセス時刻の情報としては、年、月、日、時、分、秒等の情報としてもよい。ここで、キャッシュデータを管理する場合、新規のキャッシュデータを登録する時にリプレースするデータを決定するためのキャッシュリプレースアルゴリズムが必要である。本実施例では、このアルゴリズムにＬｅａｓｔ  Ｒｅｃｅｎｔ  Ｕｓｅ（ＬＲＵ）を用いることを想定し、エントリに最終アクセス時刻５１６のフィールドを備えるようにしている。なお、キャッシュリプレースアルゴリズムに代えて、他のアルゴリズムを利用してもよい。
【００４６】
図７は、実施例１に係る性能モニタ管理テーブルの構成図である。
【００４７】
性能モニタ管理テーブル６０１は、ノード１０３ごとに保持されるテーブルであり、自身がオーナーノードである各ＬＵの各部分領域ごとの、ホスト１０２からのＩ／Ｏ状況を管理するテーブルである。性能モニタ管理テーブル６０１は、各ＬＵの部分領域毎のエントリを格納する。性能モニタ部分テーブル６０１のエントリは、ＬＵ番号６１１と、部分領域先頭アドレス６１２と、ＩＯＰＳ６１３と、キャッシュヒット率６１４とのフィールドを含む。
【００４８】
ＬＵ番号６１１には、エントリに対応するＬＵの番号が格納される。部分領域先頭アドレス６１２には、エントリに対応する部分領域の先頭アドレスが格納される。ＩＯＰＳ６１３には、エントリに対応する部分領域に対するＩＯＰＳ（Ｉ／Ｏ  ｐｅｒ  Ｓｅｃｏｎｄ）が格納される。キャッシュヒット率６１４には、エントリに対応する部分領域に対するキャッシュヒット率が格納される。ＩＯＰＳや、キャッシュヒット率の取得方法については公知であるので詳細な記載は省略する。本実施形態では、エントリにＩＯＰＳやキャッシュヒット率を格納するようにしているが、本発明はこれに限られず、エントリに対応する部分領域についてのＩ／Ｏ状況を示す情報であれば、他の情報を格納するようにしてもよい。
【００４９】
次に、キャッシュデータ登録処理について説明する。
【００５０】
図８は、実施例１に係るキャッシュデータ登録処理のフローチャートである。
【００５１】
キャッシュデータ登録処理は、ノード１０３のプロセッサ１１０がキャッシュデータ登録プログラム７００を実行することにより実現され、指定されたＬＵの部分領域のデータをキャッシュデータとして管理されるように登録する処理である。キャッシュデータ登録処理は、例えば、リード要求又はライト要求が対象とするデータをキャッシュデータとして登録する要求があった場合に、実行される。
【００５２】
キャッシュデータ登録プログラム７００（厳密には、キャッシュデータ登録プログラム７００を実行するプロセッサ１１０）は、指定されたＬＵの部分領域に既にキャッシュデータが登録されているか否かを判定する（Ｓ７０１）。ここで、ＬＵの部分領域にキャッシュデータが登録されているか否かについては、キャッシュ管理テーブル５０１を参照して、指定されたＬＵの部分領域に対応するエントリにおいて、デバイス番号５１３、デバイス内先頭アドレス５１４、及びキャッシュページ内オフセット５１５に値が設定されているか否かにより特定することができる。
【００５３】
この結果、指定されたＬＵの部分領域に既にキャッシュデータが登録されている場合（Ｓ７０１：Ｙｅｓ）には、キャッシュデータ登録プログラム７００は、登録されているキャッシュデータを、指定されているキャッシュ対象のデータ（キャッシュ対象データ）に書き換え（Ｓ７０２）、処理を終了する。
【００５４】
一方、指定されたＬＵの部分領域にキャッシュデータが登録されていない場合（Ｓ７０１：Ｎｏ）には、キャッシュデータ登録プログラム７００は、既存のキャッシュページにキャッシュ対象データが格納可能な空き領域が存在するか否かを判定する（Ｓ７０３）。ここで、例えば、キャッシュページの空き領域を管理するテーブルを予め用意しておき、このテーブルを参照して、キャッシュページに空き領域が存在するか否かを判定するようにしてもよい。
【００５５】
この結果、既存のキャッシュページにキャッシュ対象データが格納可能な空き領域が存在する場合（Ｓ７０３：Ｙｅｓ）には、キャッシュデータ登録プログラム７００は、キャッシュ対象データをこの空き領域に書き込み、キャッシュ管理テーブル５０１の指定されたＬＵの部分領域に対応するエントリのデバイス番号５１３、デバイス内先頭アドレス５１４、キャッシュページ内オフセット５１５、及び最終アクセス時刻５１６に対応する値を格納し（Ｓ７０４）、処理を終了する。
【００５６】
一方、既存のキャッシュページにキャッシュ対象データが格納可能な空き領域が存在しない場合（Ｓ７０３：Ｎｏ）には、キャッシュデータ登録プログラム７００は、キャッシュリプレースを行ってキャッシュページを確保するか、新たなキャッシュページを取得して確保するかのいずれを実行するかを決定する（Ｓ７０５）。ここで、キャッシュリプレースを行ってキャッシュページを確保するか、新たなキャッシュページを取得して確保するかのいずれを実行するかについては、性能モニタ管理テーブル６０１の指定されたＬＵのエントリのキャッシュヒット率６１４の値などに基づいて判断してもよい。この場合、キャッシュヒット率が所定の値より小さい場合、キャッシュデータを増やしてもキャッシュヒット率が向上する見込みが小さいと考えられるため、キャッシュページをリプレースしてキャッシュページを確保すると決定してもよい。一方で、キャッシュヒット率が所定の値より大きい場合、キャッシュデータを増やすことで、キャッシュヒット率が高まる可能性があるため、新たなキャッシュページを取得して確保すると決定してもよい。
【００５７】
キャッシュリプレースを行うことを選択したか否かを判定し（Ｓ７０６）、キャッシュリプレースを行うことを選択した場合（Ｓ７０６：Ｙｅｓ）には、キャッシュデータ登録プログラム７００は、キャッシュリプレースを実行する（Ｓ７０７）。具体的には、キャッシュデータ登録プログラム７００は、キャッシュ管理テーブル５０１上の最終アクセス時刻５１６の時刻が最古である部分領域についての関連付け情報（エントリのデバイス番号５１３、デバイス内先頭アドレス５１４、及びキャッシュページ内オフセット５１５）を解除し、この関連付け情報が示す領域（キャッシュページ）のデータを、キャッシュ対象データに書き換え、この関連付け情報を、キャッシュ管理テーブル５０１の指定されたＬＵの部分領域に対応するエントリに格納する。
【００５８】
一方、キャッシュリプレースを行うことを選択していない場合、すなわち、新たにキャッシュページを確保することを選択した場合（Ｓ７０６：Ｎｏ）には、キャッシュページ確保処理（図９参照）を実行することにより、新しいキャッシュページを確保し（Ｓ７０８）、このキャッシュページの空き領域にキャッシュ対象データを書き込み、キャッシュ管理テーブル５０１の指定されたＬＵの部分領域に対応するエントリに対応する関連付け情報を格納して（Ｓ７０９）、処理を終了する。
【００５９】
次に、キャッシュページ確保処理（図８のＳ７０８）について詳細に説明する。
【００６０】
図９は、実施例１に係るキャッシュページ確保処理のフローチャートである。
【００６１】
キャッシュページ確保処理では、キャッシュデータ登録プログラム７００は、自身（自身が属するノード１０３）のノードプール２０２に空きページが存在するか否かを判定し（Ｓ７１０）、空きページが存在する場合（Ｓ７１０：Ｙｅｓ）は、空きページをキャッシュページとして確保し（Ｓ７１１）、処理を戻す。
【００６２】
一方、空きページが存在しない場合（Ｓ７１０：Ｎｏ）には、キャッシュデータ登録プログラム７００は、データページをキャッシュページに変換する処理を実行する（Ｓ７１２〜Ｓ７１５）。具体的には、キャッシュデータ登録プログラム７００は、性能モニタ管理テーブル６０１を参照して、自ノード１０３のＩ／Ｏ頻度（ＩＯＰＳ）が低いページ（ページＡ）を選択し（Ｓ７１２）、ノードプール２０２に空きページが存在する他のノード１０３の１つを選択して、そのノード１０３のノードプール２０２の空きページからデータページ（ページＢ）を確保し（Ｓ７１３）、ページＡからデータを読み出して、確保したページＢにコピーする（Ｓ７１４）。次いで、キャッシュデータ登録プログラム７００は、ページＡをキャッシュページとして確保し（Ｓ７１５）、処理を戻す。
【００６３】
これにより、キャッシュ対象データを格納するキャッシュページを適切に確保することができる。例えば、ノード１０３に空きページがない場合には、データページのデータを他のノード１０３に移動させて、キャッシュページの容量を増加させることができる。このため、キャッシュによるアクセス性能の向上を図ることができる。
【００６４】
次に、分散ストレージシステム１における分散Ｅｒａｓｕｒｅ  Ｃｏｄｉｎｇ（以下、分散ＥＣ）方式について説明する。
【００６５】
図１０は、実施例１に係る分散Ｅｒａｓｕｒｅ  Ｃｏｄｉｎｇ方式の概要図である。
【００６６】
分散ＥＣとは、Ｅｒａｓｕｒｅ  Ｃｏｄｉｎｇ技術を使って複数ノード１０３間でデータを保護する技術である。分散ＥＣによると、別々のノード１０３に格納されているデータからパリティを作成し、作成されたパリティを、パリティ作成に使ったデータが格納されていないノード１０３に格納することで、ノード障害時のデータ喪失を防ぐことが可能となる。例えば、或るノード１０３に障害が発生して、このノード１０３に格納されたデータが参照不可となった場合、このデータに対応するパリティと、このパリティの作成に使ったデータとを各ノード１０３から読み出し、これらのパリティ及びデータから参照不可となったデータを復元することができる。例えば、図１０の例では、ノード＃１のデータＤ１、ノード＃２のデータＤ２、ノード＃３のデータＤ３から、パリティＰ１を生成し、このパリティＰ１をノード＃４に格納しておくと、例えば、ノード＃２に障害が発生し、ノード＃２からデータＤ２を読み出すことができない場合でも、ノード＃１からデータＤ１、ノード＃３からデータＤ３、ノード＃４からパリティＰ１を読み出し、データＤ１、データＤ３、及びパリティＰ１からデータＤ２を復元することができる。分散ＥＣには多種多様な方式が提案されているが、本実施例では、例えば、特許文献１で開示されている方式を用いてもよい。なお、分散ＥＣ方式は、これに限られず、例えばＲｅｅｄ−Ｓｏｌｏｍｏｎ符号等を使った分散ＥＣ方式を用いてもよい。
【００６７】
次に、ノード情報管理テーブル９０１について詳細に説明する。
【００６８】
図１１は、実施例１に係るノード情報管理テーブルの構成図である。
【００６９】
ノード情報管理テーブル９０１は、ノード１０３ごとに保持されるテーブルであり、分散ストレージシステム１を構成する各ノード１０３の管理情報を格納するテーブルである。ノード情報管理テーブル９０１は、各ノードに対応するエントリを格納する。ノード情報管理テーブル９０１のエントリは、ノード番号９１１と、生死状況９１２と、オーナーノードＬＵ番号９１３と、新オーナーノードＬＵ番号９１４と、ＥＣノード組合せ９１５とのフィールドを含む。
【００７０】
ノード番号９１１には、エントリに対応するノード１０３の番号が格納される。生死状況９１２には、エントリに対応するノード１０３の生死状況が格納される。生死情報としては、ノード１０３に障害が発生してデータの参照不可である状態であることを示す「Ｆａｉｌｕｒｅ」と、ノード１０３に障害が発生していないことを示す「Ａｃｔｉｖｅ」とがある。オーナーノードＬＵ番号９１３には、エントリに対応するノード１０３が担当する（エントリに対応するノード１０３がオーナーノードとなっている）ＬＵの番号（識別子）が格納される。新オーナーノードＬＵ番号９１４には、他のノードに発生した障害によって、エントリに対応するノード１０３が一時的に担当する（エントリに対応するノード１０３が新オーナーノードとなっている）ＬＵの番号が格納される。ＥＣノード組合せ９１５には、ＥＣを構成するノードの組合せ、すなわち、データを格納するノードと、パリティを格納するノードとの組合せが格納される。本実施例においては、各ノード１０３に格納されているノード情報管理テーブル９０１は、例えば、Ｐａｘｏｓ等のプロトコルを用いて同期して管理される。なお、ノード情報管理テーブル９０１は、一部のノード１０３のみに格納されていてもよく、ノード１０３以外の装置（例えば、管理サーバ１０４等）に配置されていてもよい。
【００７１】
次に、ノード障害処理について説明する。
【００７２】
図１２は、実施例１に係るノード障害処理のフローチャートである。
【００７３】
ノード障害処理は、複数のノード１０３の中のいずれかのノード（以下、代表ノードという）１０３において、プロセッサ１１０が、例えば、定期的にノード障害処理プログラム１０００を実行することにより実現される。
【００７４】
代表ノード１０３（詳細には、ノード障害処理プログラム１０００を実行するプロセッサ１１０）は、分散ストレージシステム１を構成する各ノード１０３の生死状況を確認する（Ｓ１００１）。例えば、分散ノード１０３は、各ノード１０３との間で通信を行い、各ノード１０３の生死状況を確認する。
【００７５】
代表ノード１０３は、障害が発生したノード（障害ノード）があるか否かを判定する（Ｓ１００２）。この結果、障害ノードがない場合（Ｓ１００２：Ｎｏ）には、代表ノード１０３は、処理を終了する。
【００７６】
一方、障害ノードがある場合（Ｓ１００２：Ｙｅｓ）には、代表ノード１０３は、各ノード１０３のノード情報管理テーブル９００における障害ノードに対応するエントリの生死状況９１２を「Ｆａｉｌｕｒｅ」に更新する（Ｓ１００３）。次いで、代表ノード１０３は、障害ノードがオーナーノードであった各ＬＵについて、新しいオーナーノード（新オーナーノード）を決定し、各ノードのノード情報管理テーブル９０１の新オーナーノードに対応するエントリの新オーナーノードＬＵ番号９１４を更新し（Ｓ１００４）、処理を終了する。
【００７７】
本実施例に係る分散ストレージシステム１は、上記したテーブルおよびプログラムを用い、ノード１０３に障害が発生して読み出し対象のデータを喪失している場合に、データを復元し、一度復元したデータをキャッシュデータとして保持することで、このデータに対して再度アクセスが発生した場合のノード間データ転送量を削減し、ネットワークがボトルネックになることによる一時的な性能低下を防止することができるようにする。この点について、以下に詳細に説明する。
【００７８】
次に、Ｒｅａｄ処理について説明する。
【００７９】
図１３は、実施例１に係るＲｅａｄ処理のフローチャートである。
【００８０】
Ｒｅａｄ処理は、ノード１０３のプロセッサ１１０がＲｅａｄプログラム１１００を実行することにより実現される。なお、図１３においては、便宜的に、複数のノード１０３においてＲｅａｄプログラム１１００を実行することにより実行される処理を含んだフローチャートとなっている。
【００８１】
まず、分散ストレージシステム１を構成するノード１０３の中で、ホスト１０２から読み出し要求（Ｒｅａｄ要求）が送信されたノード（以下、受信ノードという）が、ホスト１０２からのデータの読み出し要求を受領する（Ｓ１１０１）。ここで、読み出し要求には、例えば、読み出し対象のデータのＬＵと、読み出し対象の部分領域の先頭アドレス、読み出し対象のデータのデータ長等が含まれている。
【００８２】
次いで、受信ノードは、ノード情報管理テーブル９０１を参照し、読み出し要求の対象となるデータ（読み出し対象データ）を有するＬＵのオーナーノードと、そのオーナーノードの生死状況とを確認する（Ｓ１１０２）。この結果、オーナーノードが生存している場合（Ｓ１１０２：Ａｃｔｉｖｅ）、受信ノードは、オーナーノードに対して、読み出し対象データを読み出す要求（対象データ読み出し要求：ライト要求の一例）を送信する（Ｓ１１０３）。
【００８３】
この対象データ読み出し要求を受領したオーナーノードは、データページ管理テーブル４０１を参照し、対象データ読み出し要求に含まれているＬＵの部分領域に対応するノード番号、デバイス番号、デバイス内先頭アドレスを特定し、特定されたノード番号及びデバイス番号に対応する記憶デバイス１１３の特定されたデバイス内先頭アドレスから始まる領域のデータを読み出して受信ノードに応答する（Ｓ１１０４）。次いで、読み出し対象データを受信した受信ノードは、読み出し要求元のホスト１０２に対して読み出し対象データを応答（送信）し（Ｓ１１０５）、処理を終了する。
【００８４】
一方、ステップＳ１１０２において、オーナーノードが生存していない場合（Ｓ１１０２：Ｆａｉｌｕｒｅ）、受信ノードは、ノード情報管理テーブル９０１を参照し、読み出し対象データを含むＬＵの復元処理を担当するノード（新オーナーノード）にデータ復元要求（リード要求の一例）を送信する（Ｓ１１０６）。データ復元要求を受領した新オーナーノードは、自身のキャッシュ管理テーブル５０１を参照し、復元対象データが以前に復元済であってキャッシュデータとして保持されているか否かを判定する（Ｓ１１０７）。キャッシュデータとして保持されている場合（Ｓ１１０７：Ｙｅｓ）、新オーナーノードは、キャッシュ管理テーブル５０１から、キャッシュデータが保存されているデバイス番号と、デバイス内先頭アドレスと、キャッシュページ内オフセットを特定し、特定したデバイス番号に対応する記憶デバイス１１３の特定したデバイス内先頭アドレス及びオフセットに対応するアドレスから始まる領域にキャッシュされている復元対象データを読み出して、受信ノードに応答する（Ｓ１１０８）。この結果、受信ノードでは、送信した復元対象データを用いて、ステップＳ１１０５の処理を行う。
【００８５】
一方、ステップＳ１１０７において、キャッシュデータとして保持されていない場合（Ｓ１１０７：Ｎｏ）、新オーナーノードは、復元対象データを復元するデータ復元処理（Ｓ１１０９）を実行し、復元したデータを受信ノードに送信する。
【００８６】
上記したＲｅａｄ処理によると、復元対象データが以前に復元済であり、キャッシュデータとして保持されている場合には、復元対象データを復元するために必要な他のノードとの間のデータ転送を行うことなく、すなわち、ネットワーク１０６に負荷を掛けることなく、復元対象データを受信ノードに迅速に送信することができる。
【００８７】
次に、データ復元処理（図１３のＳ１１０９）について詳細に説明する。
【００８８】
図１４は、実施例１に係るデータ復元処理のフローチャートである。
【００８９】
データ復元処理は、ノード１０３のプロセッサ１１０が復号化プログラム１１０９を実行することにより実現される。
【００９０】
ノード１０３（本実施例では、新オーナーノード）は、ノード情報管理テーブル９０１を参照し、復元対象データの復元に必要なデータおよびパリティが格納されているノード番号を特定し、特定したノード番号の各ノード１０３に対してデータまたはパリティの読み出し要求を送信する（Ｓ１１１０）。読み出し要求を受領した各ノード１０３は、対応するデータまたはパリティを自身の記憶デバイス１１３から読み出して新オーナーノードに応答（送信）する（Ｓ１１１１）。新オーナーノードは、分散ＥＣ技術を用い、受領したデータおよびパリティから復元対象データを復元して受信ノードに応答する（Ｓ１１１２）。なお、このステップにおいては、復元対象データにおける、故障ノードに格納されていたデータ部分については、パリティ及び他のデータを用いてデータ部分を復元し、他のノードに格納されているデータ部分については、他のノードから取得したデータそのものとすることができる。次いで、新オーナーノードは、復元対象データをキャッシュデータとしてノードプール２０２に格納し、自身のキャッシュ管理テーブル５０１にキャッシュデータの情報を登録し（Ｓ１１１３）、処理を終了する。
【００９１】
データ復元処理によると、新オーナーノードは、復元により得られた復元対象データをキャッシュデータとして保持することとなるので、以降において、復元対象データが要求された場合に、復元対象データを復元するために必要な他のノードとの間のデータ転送を行うことなく、すなわち、ネットワーク１０６に負荷を掛けることなく、復元対象データを受信ノードに迅速に送信することができる。
【００９２】
次に、Ｗｒｉｔｅ処理について説明する。
【００９３】
図１５は、実施例１に係るＷｒｉｔｅ処理のフローチャートである。
【００９４】
Ｗｒｉｔｅ処理は、ノード１０３のプロセッサ１１０がＷｒｉｔｅプログラム１２００を実行することにより実現される。なお、図１５においては、便宜的に、複数のノード１０３においてＷｒｉｔｅプログラム１２００を実行することにより実行される処理を含んだフローチャートとなっている。
【００９５】
まず、分散ストレージシステム１を構成するノード１０３の中で、ホスト１０２から書き込み要求（Ｗｒｉｔｅ要求）及び書き込み対象データが送信されたノード（以下、受信ノードという）１０３が、ホスト１０２からのデータの書き込み要求及び書き込み対象データを受領する（Ｓ１２０１）。受信ノードは、ノード情報管理テーブル９０１を参照し、書き込み先のＬＵのオーナーノードと、そのオーナーノードの生死状況とを確認する（Ｓ１２０２）。
【００９６】
オーナーノードが生存している場合（Ｓ１２０２：Ａｃｔｉｖｅ）、受信ノードは、オーナーノードに書き込み要求と書き込み対象データとを送信する（Ｓ１２０３）。この書き込み要求を受領したオーナーノードは、書き込み要求の対象の領域にデータページが関連付けられているかを確認し、関連付けられていなければ自身のノードプール２０２からデータページを取得して、取得したデータページに対応する記憶デバイス１１３およびアドレスに対応する領域に書き込み対象データを書き込む（Ｓ１２０４）。
【００９７】
次に、オーナーノードは、書き込み対象データの冗長化を行うデータ符号化処理を実行する（Ｓ１２０５）。
【００９８】
次に、オーナーノードは受信ノードに書き込み完了を報告し（Ｓ１２０６）、オーナーノードから書き込み完了の報告を受けた受信ノードがホスト１０２に対して書き込み完了を報告し（Ｓ１２０７）、処理を終了する。なお、オーナーノードは、書き込み対象データを自身の記憶デバイス１１３に書き込んだ後に、書き込み完了を報告しているが、記憶デバイス１１３に書き込む前に不揮発メモリに記憶させる等していて、書き込み対象データについてのデータロストの心配がないのであれば、記憶デバイス１１３に書き込む前に書き込み完了を報告してもよい。
【００９９】
ステップＳ１２０２において、オーナーノードが生存していない場合（Ｓ１２０２：Ｆａｉｌｕｒｅ）、受信ノードは、新オーナーノードに書き込み要求と書き込み対象データとを送信する（Ｓ１２０８）。書き込み要求を受領した新オーナーノードは、自身の記憶デバイス１１３へ書き込みを行わずに、データ符号化処理（Ｓ１２０９：Ｓ１２０５と同様）を行う。次に、新オーナーノードは書き込み対象データをキャッシュデータとしてノードプール２０２に格納するとともに、キャッシュ管理テーブル５０１にキャッシュデータを登録する（Ｓ１２１１）。これにより、以降において、今回の書き込み対象データに対する読み出し要求を受信した場合には、ネットワーク１０６に負荷を掛けることなく、対象のデータを受信ノードに迅速に送信することができる。
【０１００】
次に、データ符号化処理（図１５のＳ１２０５、Ｓ１２０９）について詳細に説明する。
【０１０１】
図１６は、実施例１に係るデータ符号化処理のフローチャートである。
【０１０２】
データ符号化処理は、ノード１０３のプロセッサ１１０が符号化プログラム１２０５を実行することにより実現される。
【０１０３】
ノード１０３（本実施例では、オーナーノード又は新オーナーノード）は、書き込み対象データを一次符号化して一次符号化データを生成する（Ｓ１２１２）。一次符号化データは、更新前のデータと、更新後のデータとから生成されるデータであって、直前のパリティとに基づいて、２次符号化データ、すなわち、新パリティを生成することのできるデータである。
【０１０４】
次に、オーナーノードは、書き込み対象データと一次符号化データとをノード情報管理テーブル９０１の書き込み対象データのＬＵのオーナーノード（新オーナーノードがあれば新オーナーノード）に対応するエントリに記載されたパリティを格納するノード番号のノード１０３に送信する（Ｓ１２１３）。これらデータを受領したノード１０３は、他のノードから同様に転送されたデータまたは一次符号化データを用いて二次符号化を行い（Ｓ１２１４）、二次符号化データ（パリティ）を自身の記憶デバイス１１３に書き込んでオーナーノードに書き込み完了を報告し（Ｓ１２１５）、処理を終了する。
【０１０５】
次に、障害が発生していたノードに格納されていたＬＵのデータを復元するリビルド処理について説明する。
【０１０６】
図１７は、実施例１に係るリビルド処理のフローチャートである。
【０１０７】
リビルド処理は、ノード１０３のプロセッサ１１０がリビルドプログラム１３００を実行することにより実現される。リビルド処理は、例えば、ユーザによる手動での指示があった場合や、障害が発生したノード１０３のリプレースが完了したことを検出した場合等を契機として実行される。また、リビルド処理を、上述の契機において、分散ストレージシステム１を構成する全ノード１０３で実行させるようにしてもよい。
【０１０８】
リビルドプログラム１３００を実行するノード１０３は、自身が新オーナーノードであるＬＵがあるか否かを判定し（Ｓ１３０１）、自身が新オーナーノードであるＬＵがある場合（Ｓ１３０１：Ｙｅｓ）には、自身が新オーナーノードであるＬＵの中の１つを処理対象として選択し（Ｓ１３０２）、このＬＵを対象にデータ復元処理（Ｓ１１０９）を実行する。
【０１０９】
次いで、ノード１０３は、データ復元処理により復元したデータを自身の記憶デバイス１１３に格納し（Ｓ１３０３）、ＬＵに格納された全てのデータの復元が完了した場合、ノード１０３は、ノード情報管理テーブル９０１における復元が完了したＬＵに関するオーナーノードを自身に更新し（Ｓ１３０４）、処理をステップＳ１３０１に進める。
【０１１０】
一方、ステップＳ１３０１で、自身が新オーナーノードであるＬＵがない場合（Ｓ１３０１：Ｎｏ）には、ノードプール２０２における不要になった自身のキャッシュデータ（例えば、復元したＬＵのキャッシュデータ）を全て破棄し、破棄したデータを格納していたキャッシュページを空きページにし（Ｓ１３０５）、処理を終了する。
【０１１１】
このリビルド処理においては、処理中にＬＵに対する読み出し要求があった場合においては、新オーナーノードにキャッシュされているキャッシュデータから読み出すことができる。このため、リビルド処理を待たずにデータを利用することができる。
【０１１２】
なお、障害ノードを他のノード（リプレースノード）にリプレースした場合においては、リビルド処理を、次のように行ってもよい。すなわち、まず、リプレースノードを新オーナーノードに設定する。具体的には、ノード情報管理テーブル９０１において、障害ノードがオーナーノードであるＬＵについて、リプレースノードを新オーナーノードとする設定を行う。次に、リプレースノードのローカルプール２０２に、復元するＬＵの一部のデータをキャッシュする。ここで、キャッシュするデータとしては、直前の新オーナーノードがキャッシュしていたデータのみであってもよく、ＬＵの中のアクセス頻度が高いデータとしてもよい。その後、図１７と同様なリビルド処理を実行する。
【０１１３】
これにより、処理中のＬＵに対する読み出し要求に対してキャッシュデータを用いて対応できるとともに、リビルド処理後に、リプレースノードを、障害ノードと同様な状態、すなわち、障害ノードがオーナーノードであったＬＵに対するオーナーノードに設定することができる。
【０１１４】
以上説明したように、本実施形態に係る分散ストレージシステム１によると、いずれかのノード１０３に障害が発生した場合において、障害ノードに格納されていた同一データに対して複数回の読み出し要求を行った場合に、２回目以降のデータ読み出しをデータ復元なしで読み出すことが可能となり、Ｉ／Ｏ性能の向上が見込める。なお、本実施例においては、新オーナーノードに復元データをキャッシュする例を示したが、別のノード（例えば、受信ノード）に復元データをキャッシュするようにしてもよい。
【実施例２】
【０１１５】
次に、実施例２に係る分散ストレージシステムについて説明する。
【０１１６】
実施例２に係る分散ストレージシステムは、ノードプール２０２の空きページが不足して、別ノードのノードプール２０２に書き込みデータを格納せざるを得ない場合に、オーナーノードにこのデータのキャッシュデータを保持するようにすることで、Ｉ／Ｏ性能を向上させることができるシステムである。
【０１１７】
本実施例に係る分散ストレージシステムは、メモリ１１１にさらにデータ再配置プログラムを格納する。また、Ｒｅａｄプログラム及びＷｒｉｔｅプログラムについて、処理内容を変更している。
【０１１８】
図１８は、実施例２に係るデータ再配置処理のフローチャートである。
【０１１９】
データ再配置処理は、ノード１０３のプロセッサ１１０がデータ再配置プログラムを実行することにより実現される。データ再配置処理は、例えば、定期的に、各ノード１０３により実行される。
【０１２０】
ノード１０３は、自ノードのノードプール２０２の空きページ数を監視し、ノードプールの容量使用率が所定の閾値以上であるか否かを確認する（Ｓ１４０１）。この結果、容量使用率が閾値以上の場合（Ｓ１４０１：Ｙｅｓ）は、ノード１０３は、性能モニタ管理テーブル６０１を参照し、自ノードがオーナーノードであるＬＵの各部分領域から、アクセス頻度（ＩＯＰＳ）が最も小さい部分領域を選択し（Ｓ１４０２）、選択した部分領域を別ノード１０３のノードプール２０２のデータページに移動し（Ｓ１４０３）、処理を終了する。
【０１２１】
一方、容量使用率が閾値を下回る場合（Ｓ１４０１：Ｎｏ）、ノード１０３は、データページ管理テーブル４０１を参照し、自ノードがオーナーノードであるＬＵの部分領域の中に、他ノード１０３のノードプール２０２のデータページを参照している部分領域が存在するか否かを判定する（Ｓ１４０４）。この結果、他ノード１０３のノードプール２０２のデータページを参照している部分領域が存在する場合（Ｓ１４０４：Ｙｅｓ）、ノード１０３は、性能モニタ管理テーブル６０１を参照し、これら部分領域の中で、最もアクセス頻度が大きい部分領域を選択して（Ｓ１４０５）、選択した部分領域のデータページのデータを、自身（自身のノード１０３）のノードプール２０２のデータページに移動する（Ｓ１４０６）。その後、ノード１０３は、キャッシュ管理テーブル５０１を参照し、Ｓ１４０５で選択された部分領域に関するキャッシュデータをノードプール２０２から破棄し（Ｓ１４０７）、処理を終了する。
【０１２２】
一方、他ノードのノードプール２０２のデータページを参照している部分領域が存在しない場合（Ｓ１４０４：Ｎｏ）、ノード１０３は、処理を終了する。
【０１２３】
上記したデータ再配置処理によると、自ノードのノードプール２０２の容量に余裕があれば、オーナーノードであるＬＵの部分領域のデータを自ノードに格納するようにし、容量に余裕がなければ、他のノードに格納するようにすることができ、ノードプール２０２にキャッシュに利用できる容量を適切に確保することができる。
【０１２４】
次に、Ｒｅａｄ処理について説明する。
【０１２５】
図１９は、実施例２に係るＲｅａｄ処理のフローチャートである。
【０１２６】
Ｒｅａｄ処理は、ノード１０３のプロセッサ１１０がＲｅａｄプログラムを実行することにより実現される。なお、図１９においては、便宜的に、複数のノード１０３においてＲｅａｄプログラムを実行することにより実現される処理を含んだフローチャートとなっている。
【０１２７】
まず、分散ストレージシステム１を構成するノード１０３の中で、ホスト１０２から読み出し要求（Ｒｅａｄ要求）が送信されたノード（以下、受信ノードという）が、ホスト１０２からのデータの読み出し要求を受領する（Ｓ１５０１）。受信ノードは、ノード情報管理テーブル９０１を参照し、読み出し対象のデータ（本処理の説明において、対象データという）が含まれるＬＵのオーナーノードを特定し、オーナーノードに、読み出し要求を発行する（Ｓ１５０２）。
【０１２８】
読み出し要求を受け取ったオーナーノードは、データページ管理テーブル４０１を参照し、対象データが格納されているデータページが自ノード１０３のノードプール２０２のデータページであるか否かを判定する（Ｓ１５０３）。
【０１２９】
この結果、対象データが自ノード１０３のノードプール２０２のデータページである場合（Ｓ１５０３：Ｙｅｓ）、オーナーノードは、データページに対応するアドレスから対象データを読み出して受信ノードに応答する（Ｓ１５０４）。読み出した対象データを含む応答を受け取った受信ノードは、ホスト１０２に応答し（Ｓ１５０５）、処理を終了する。
【０１３０】
一方、対象データが自ノードのノードプール２０２のデータページでない場合（Ｓ１５０３：Ｎｏ）、オーナーノードは、キャッシュ管理テーブル６０１を参照し、対象データがキャッシュされているか否かを判定する（Ｓ１５０６）。
【０１３１】
この結果、キャッシュデータが存在する場合（Ｓ１５０６：Ｙｅｓ）、オーナーノードは、キャッシュデータを読み出して受信ノードに応答する（Ｓ１５０７）。
【０１３２】
一方、キャッシュデータが存在しない場合（Ｓ１５０６：Ｎｏ）、オーナーノードは、対象データを格納しているノード１０３に読み出し要求を発行する（Ｓ１５０８）。読み出し要求を受領したノード１０３は、対象データを読み出し、オーナーノードに応答する（Ｓ１５０９）。応答を受け取ったオーナーノードは、対象データを含む応答を受信ノードに行い、対象データをキャッシュデータとして自身に登録する（Ｓ１５１０）。このように、自身が担当するＬＵについてのデータが、他のノード１０３にある場合においては、読み出し要求があった場合に、キャッシュデータとして登録するようにするので、以降において、同じデータに対しては、他のノード１０３からの読み出しを行わずに済み、ネットワーク１０６に負荷を掛けることなく、対象のデータを受信ノードに迅速に送信することができる。
【０１３３】
次に、Ｗｒｉｔｅ処理について説明する。
【０１３４】
図２０は、実施例２に係るＷｒｉｔｅ処理のフローチャートである。
【０１３５】
Ｗｒｉｔｅ処理は、ノード１０３のプロセッサ１１０がＷｒｉｔｅプログラムを実行することにより実現される。なお、図２０においては、便宜的に、複数のノード１０３においてＷｒｉｔｅプログラムを実行することにより実行される処理を含むフローチャートとなっている。
【０１３６】
まず、分散ストレージシステム１を構成するノード１０３の中で、ホスト１０２から書き込み要求（Ｗｒｉｔｅ要求）及び書き込み対象データが送信されたノード（以下、受信ノードという）が、ホスト１０２からのデータの書き込み要求及び書き込み対象データ（本処理の説明において対象データという）を受領する（Ｓ１６０１）。受信ノードは、ノード情報管理テーブル９０１を参照し、書き込み要求の対象のＬＵについてのオーナーノードを特定し、オーナーノードに、書き込み要求及び対象データを発行（送信）する（Ｓ１６０２）。
【０１３７】
書き込み要求を受け取ったオーナーノードは、データページ管理テーブル４０１を参照し、書き込み対象の部分領域にデータページが割当済か否かを判定する（Ｓ１６０３）。この結果、書き込み対象の部分領域にデータページが割当済でない場合（Ｓ１６０３：Ｎｏ）には、オーナーノードは、この部分領域に対してデータページを割り当て（Ｓ１６０５）、割り当てられているデータページに対して、対象データを書き込み、受信ノードに完了報告の応答する（Ｓ１６０６）。
【０１３８】
一方、書き込み対象の部分領域にデータページが割当済である場合（Ｓ１６０３：Ｙｅｓ）、オーナーノードは、データページが自身のノードプール２０２のデータページであるか否かを確認する（Ｓ１６０４）。この結果、データページが自身のノードプール２０２のデータページである場合（Ｓ１６０４：Ｙｅｓ）、オーナーノードは処理をステップＳ１６０６に進める。
【０１３９】
一方、データページが自身のノードプール２０２のデータページでない場合（Ｓ１６０４：Ｎｏ）、オーナーノードは、データページのあるノード１０３に書き込み要求を発行する（Ｓ１６０８）。
【０１４０】
書き込み要求を受領したノードは、対応するデータページに対象データを書き込み、オーナーノードに完了報告の応答を行う（Ｓ１６０９）。完了報告を受け取った、オーナーノードは、受信ノードに完了報告の応答を行い、対象データを自身のノードプール２０２にキャッシュし、キャッシュ管理テーブル５０１に対象データのキャッシュに関する情報を登録する（Ｓ１６１０）。
【０１４１】
Ｓ１６０６又はＳ１６１０における完了報告の応答を受け取った受信ノードは、ホスト１０２に完了報告を行う（Ｓ１６０７）。
【実施例３】
【０１４２】
次に、実施例３に係る分散ストレージシステムについて説明する。
【０１４３】
実施例３に係る分散ストレージシステムでは、ノード１０３間でＬＵのマイグレーションを行う場合に、マイグレーション中に発生したこのＬＵのＩ／Ｏに係るデータをキャッシュすることで、Ｉ／Ｏ性能を向上させるようにする。ＬＵのマイグレーションでは、ＬＵのオーナーノードを変更することが可能であるが、ＬＵのマイグレーションを開始した後に、このＬＵのオーナーノードを新たなノード１０３に切り替えるので、ＬＵのマイグレーションが完了するまでのＩ／Ｏは、新たなノード１０３にＬＵの全領域のデータが揃っていないのでリードリモートになってしまう。これに対して、本実施例では、マイグレーションを行うＬＵのデータをキャッシュするようにしてので、アクセスの性能向上が見込める。例えば、複数のノード間１０３で負荷分散を行う場合に有効である。
【０１４４】
本実施例に係る分散ストレージシステムは、メモリ１１１にさらにＬＵマイグレーション管理テーブル１７００と、ＬＵマイグレーションプログラム１８００とを格納している。また、Ｒｅａｄプログラム及びＷｒｉｔｅプログラムについて、処理内容を変更している。
【０１４５】
次に、ＬＵマイグレーション管理テーブル１７０１について説明する。
【０１４６】
図２１は、実施例３に係るＬＵマイグレーション管理テーブルの構成図である。
【０１４７】
ＬＵマイグレーション管理テーブル１７０１は、実行中のＬＵマイグレーションに関する構成情報を管理するテーブルである。ＬＵマイグレーション管理テーブル１７０１は、ＬＵマイグレーションごとのエントリを格納する。ＬＵマイグレーション管理テーブル１７０１のエントリは、マイグレーション元ＬＵ１７１１と、マイグレーション先ＬＵ１７１２と、マイグレーション完了アドレス１７１３とのフィールドを含む。
【０１４８】
マイグレーション元ＬＵ１７１１には、エントリに対応するマイグレーションのマイグレーション元（移動元）のＬＵの番号が格納される。マイグレーション先ＬＵ１７１２には、エントリに対応するマイグレーションのマイグレーション先（移動先）のＬＵの番号が格納される。マイグレーション完了アドレス１７１３には、マイグレーションが完了している領域のアドレスが格納される。
【０１４９】
次に、ＬＵマイグレーション処理について説明する。
【０１５０】
図２２は、実施例３に係るＬＵマイグレーション処理のフローチャートである。
【０１５１】
ＬＵマイグレーション処理は、管理サーバ１０４による指示、又は、所定の契機により、実行される。ＬＵマイグレーションプログラムを実行するノード１０３は、ＬＵマイグレーションのマイグレーション元（移動元）のＬＵ（移動元ＬＵ）に関するデータページ管理テーブル４０１の格納情報をマイグレーション先（移動先）のノード（移動先ノード：移譲先ノード）にコピーし（Ｓ１８０１）、ノード情報管理テーブル９０１のマイグレーション元ＬＵのオーナーノードを移譲元ノードから移動先ノードに変更する（Ｓ１８０２）。
【０１５２】
次いで、ノード１０３は、ＬＵに関連付けられている、マイグレーション完了アドレス（マイグレーションポインタ）の次のアドレスのデータページを選択し（Ｓ１８０３）、移動元ノードのノードプール２０２の選択されたデータページのデータを、移動先ノードのノードプール２０２のデータページにコピーする（Ｓ１８０４）。次いで、ノード１０３は、マイグレーション完了アドレス１７１３を、コピーを行ったデータページのアドレスに更新する（Ｓ１８０５）。
【０１５３】
次いで、ノード１０３は、マイグレーション対象のＬＵの全てのデータページの移動が終わったか否かを判定し（Ｓ１８０６）、ＬＵの全てのデータページの移動が終わっていない場合（Ｓ１８０６：Ｎｏ）、処理をステップＳ１８０３に進める。
【０１５４】
一方、ＬＵの全てのデータページの移動が終わった場合（Ｓ１８０６：Ｙｅｓ）、移動先ノードは、移動先ノードのキャッシュ管理テーブル５０１を参照し、このＬＵに関するキャッシュデータをノードプール２０２から破棄し（Ｓ１８０７）、処理を終了する。
【０１５５】
次に、Ｒｅａｄ処理について説明する。
【０１５６】
図２３は、実施例３に係るＲｅａｄ処理のフローチャートである。
【０１５７】
Ｒｅａｄ処理は、ノード１０３のプロセッサ１１０がＲｅａｄプログラムを実行することにより実現される。なお、図２３においては、便宜的に、複数のノード１０３においてＲｅａｄプログラムを実行することにより実現される処理を含むフローチャートとなっている。
【０１５８】
まず、分散ストレージシステム１を構成するノード１０３の中で、ホスト１０２から読み出し要求（Ｒｅａｄ要求）が送信されたノード（以下、受信ノードという）が、ホスト１０２からのデータの読み出し要求を受領する（Ｓ１９０１）。受信ノードは、ノード情報管理テーブル９０１を参照し、読み出し対象のデータ（本処理の説明において、対象データという）が含まれるＬＵのオーナーノードを特定し、オーナーノードに、読み出し要求を発行する（Ｓ１９０２）。
【０１５９】
読み出し要求を受け取ったオーナーノードは、ＬＵマイグレーション管理テーブル１８００を参照し、対象データを含むＬＵがマイグレーション中か否か、及び対象データが、マイグレーションが未完了の領域のデータであるか否かを判定する（Ｓ１９０３）。
【０１６０】
この結果、対象データを含むＬＵがマイグレーション中ではない場合、又は、マイグレーション中ではあるが対象データが、マイグレーションが済んでいる領域のデータである場合（Ｓ１９０３：Ｎｏ）、オーナーノードは、データページに対応するアドレスから対象データを読み出して受信ノードに応答する（Ｓ１９０４）。読み出した対象データを含む応答を受け取った受信ノードは、ホスト１０２に応答し（Ｓ１９０５）、処理を終了する。
【０１６１】
一方、対象データを含むＬＵがマイグレーション中であって、且つ対象データが、マイグレーションが未完了の領域のデータである場合（Ｓ１９０３：Ｙｅｓ）、オーナーノードは、キャッシュ管理テーブル６０１を参照し、対象データがキャッシュされているか否かを判定する（Ｓ１９０６）。
【０１６２】
この結果、キャッシュデータが存在する場合（Ｓ１９０６：Ｙｅｓ）、オーナーノードは、キャッシュデータを読み出して受信ノードに応答する（Ｓ１９０７）。
【０１６３】
一方、キャッシュデータが存在しない場合（Ｓ１９０６：Ｎｏ）、オーナーノードは、移動元ノードに読み出し要求を発行する（Ｓ１９０８）。読み出し要求を受領した移動元ノード１０３は、対象データを読み出し、オーナーノードに応答する（Ｓ１９０９）。応答を受け取ったオーナーノードは、対象データを含む応答を受信ノードに行い、対象データをキャッシュデータとして自身に登録（ノードプール２０２へのキャッシュデータの格納及びキャッシュ管理テーブル５０１への登録）する（Ｓ１９１０）。
【０１６４】
このように、自身が担当するＬＵについてのデータについて、マイグレーションが完了していない場合においては、読み出し要求があった場合に、キャッシュデータとして登録するようにするので、以降において、同じデータに対しては、他のノード１０３からの読み出しを行わずに済み、ネットワーク１０６に負荷を掛けることなく、対象のデータを受信ノードに迅速に送信することができる。
【０１６５】
次に、Ｗｒｉｔｅ処理について説明する。
【０１６６】
図２４は、実施例３に係るＷｒｉｔｅ処理のフローチャートである。
【０１６７】
Ｗｒｉｔｅ処理は、ノード１０３のプロセッサ１１０がＷｒｉｔｅプログラムを実行することにより実現される。なお、図２４においては、便宜的に、複数のノード１０３においてＷｒｉｔｅプログラムを実行することにより実行される処理を含むフローチャートとなっている。
【０１６８】
まず、分散ストレージシステム１を構成するノードの中で、ホスト１０２から書き込み要求（Ｗｒｉｔｅ要求）及び書き込み対象データが送信されたノード（以下、受信ノードという）が、ホスト１０２からのデータの書き込み要求及び書き込み対象データ（本処理の説明において対象ノードという）を受領する（Ｓ２００１）。受信ノードは、ノード情報管理テーブル９０１を参照し、書き込み要求の対象のＬＵについてのオーナーノードを特定し、オーナーノードに、書き込み要求及び対象データを発行（送信）する（Ｓ２００２）。
【０１６９】
書き込み要求及び対象データを受け取ったオーナーノードは、ＬＵマイグレーション管理テーブル１７０１を参照し、対象データを格納するＬＵがマイグレーション中か否か、及び対象データが、マイグレーションが未完了の領域のデータであるか否かを判定する（Ｓ２００３）。
【０１７０】
この結果、対象データを格納するＬＵがマイグレーション中ではない場合、又は、マイグレーション中ではあるが対象データが、マイグレーションが済んでいる領域のデータである場合（Ｓ２００３：Ｎｏ）、オーナーノードは、自身のノードプール２０２のデータページに対応するアドレスの領域に、対象データを書き込んで、受信ノードに書き込み要求に対する応答を行う（Ｓ２００４）。書き込み要求に対する応答を受け取った受信ノードは、ホスト１０２に完了報告を行い（Ｓ２００５）、処理を終了する。
【０１７１】
一方、対象データを含むＬＵがマイグレーション中であって、且つ対象データが、マイグレーションが未完了の領域のデータである場合（Ｓ２００３：Ｙｅｓ）、オーナーノードは、移動元ノードに書き込み要求を発行する（Ｓ２００６）。書き込み要求を受領した移動元ノード１０３は、対象データの書き込みを行い、オーナーノードに応答する（Ｓ２００７）。応答を受け取ったオーナーノードは、完了報告を受信ノードに行い、対象データをキャッシュデータとして自身に登録（ノードプール２０２へのキャッシュデータの格納及びキャッシュ管理テーブル５０１への登録）する（Ｓ２００８）。
【０１７２】
このように、自身が担当するＬＵについてのデータについて、マイグレーションが完了していない場合においては、書き込み要求があった場合に、キャッシュデータとして登録するようにするので、以降において、同じデータに対する読み出し要求があった場合には、他のノード１０３からの読み出しを行わずに済み、ネットワーク１０６に負荷を掛けることなく、対象データを受信ノードに迅速に送信することができる。
【実施例４】
【０１７３】
実施例４に係る分散ストレージシステムは、実施例３に係る分散ストレージシステムを拡張したものである。本実施例では、或るノード１０３が所有するデータ群のうち、アクセス頻度が高いデータ群を、予め別のノード１０３へキャッシュデータとして格納しておくことで、特定のノード１０３の性能負荷が高くなってデータのマイグレーションが必要になった場合に、マイグレーション開始直後であったとしても、特定のデータにアクセスが集中した場合のノード１０３間のデータ転送量を削減し、ネットワークがボトルネックになることによる、一時的な性能低下を防止することができる。
【０１７４】
本実施例に係る分散ストレージシステムは、メモリ１１１にさらにキャッシュウォーミングプログラム２１００を格納している。
【０１７５】
図２５は、実施例４に係るキャッシュウォーミング処理のフローチャートである。
【０１７６】
キャッシュウォーミング処理は、ノード１０３のプロセッサ１１０がキャッシュウォーミングプログラム２１００を実行することにより実現される。なお、図２５においては、便宜的に、複数のノード１０３においてキャッシュウォーミングプログラム２１００を実行することにより実現される処理も含むフローチャートとなっている。キャッシュウォーミング処理は、例えば、定期的に各ノード１０３において実行される。
【０１７７】
まず、キャッシュウォーミングプログラム２１００を実行するノード１０３は、自身がオーナーノードであるＬＵの中から１つのＬＵ（対象ＬＵ）を選択し（Ｓ２１０１）、高負荷等でマイグレーションを実行する場合にこのＬＵのマイグレーション先とする候補ノードを選択する（Ｓ２１０２）。
【０１７８】
次に、ノード１０３は、対象ＬＵについて性能モニタ管理テーブル６０１を参照し、対象ＬＵにおけるアクセス頻度（ＩＯＰＳ）の上位Ｎ（Ｎは、任意の整数）個のデータページを選択する（Ｓ２１０３）。次に、ノード１０３は、候補ノードに、選択したデータページ群のデータを転送し、キャッシュデータとして登録するように要求する（Ｓ２１０４）。候補ノードは、受信したデータを自身にキャッシュデータとして登録する（Ｓ２１０５）。具体的には、候補ノードは、ノードプール２０２に受信したデータをキャッシュするとともに、このデータのキャッシュに関する情報をキャッシュ管理テーブル５０１に登録する。
【０１７９】
次いで、ノード１０３は、自身がオーナーノードである全てのＬＵを対象に処理が完了したか否かを判定し（Ｓ２１０６）、自身がオーナーノードである全てのＬＵを対象に処理が完了していない場合（Ｓ２１０６：Ｎｏ）には、処理をステップＳ２１０１に進める一方、自身がオーナーノードである全てのＬＵを対象に処理が完了した場合（Ｓ２１０６：Ｙｅｓ）には、処理を終了する。
【０１８０】
なお、本発明は、上述の実施例に限定されるものではなく、本発明の趣旨を逸脱しない範囲で、適宜変形して実施することが可能である。
【０１８１】
例えば、上記した複数の実施例の中の２以上の実施例を組み合わせてもよい。
【０１８２】
また、上記の各構成、機能等は、それらの一部又は全部を、例えば集積回路で設計する等によりハードウェアで実現してもよい。各機能を実現するプログラム、テーブル、ファイル等の情報は、不揮発性半導体メモリ、ＨＤＤ、ＳＳＤ等の記憶デバイス、または、ＩＣカード、ＳＤカード、ＤＶＤ等の計算機読み取り可能な非一時的データ記憶媒体に格納していてもよい。
【符号の説明】
【０１８３】
１…分散ストレージシステム、１０２…ホスト、１０３…ノード、１０４…管理サーバ、１０５，１０６，１０７…ネットワーク、１１０…プロセッサ、１１１…メモリ、１１２…ネットワークＩ／Ｆ、１１３…記憶デバイス
【図１】
2020154626.tif 000003
【図２】
2020154626.tif 000004
【図３】
2020154626.tif 000005
【図４】
2020154626.tif 000006
【図５】
2020154626.tif 000007
【図６】
2020154626.tif 000008
【図７】
2020154626.tif 000009
【図８】
2020154626.tif 000010
【図９】
2020154626.tif 000011
【図１０】
2020154626.tif 000012
【図１１】
2020154626.tif 000013
【図１２】
2020154626.tif 000014
【図１３】
2020154626.tif 000015
【図１４】
2020154626.tif 000016
【図１５】
2020154626.tif 000017
【図１６】
2020154626.tif 000018
【図１７】
2020154626.tif 000019
【図１８】
2020154626.tif 000020
【図１９】
2020154626.tif 000021
【図２０】
2020154626.tif 000022
【図２１】
2020154626.tif 000023
【図２２】
2020154626.tif 000024
【図２３】
2020154626.tif 000025
【図２４】
2020154626.tif 000026
【図２５】
2020154626.tif 000027