(57)【要約】【課題】複数のノードへのデータの配置を柔軟化することができる。【解決手段】制御部１ｂは、第１のキーと第１のデータとを取得したとき、第１のノード２に第１のキーと対応付けて第２のキーを示す第２のデータが格納され、第２のノード２ａに第２のキーと対応付けて第１のデータが格納されるよう制御する。また、制御部１ｂは、第１のキーを指定したアクセス要求を取得したとき、第１のキーと対応付けて格納されているデータが第２のデータであることを検出し、第２のデータが示す第２のキーに基づいて、第２のノード２ａに格納された第１のデータにアクセスする。【選択図】図１
2013045379.tif 000002
【特許請求の範囲】
【請求項１】
キーと対応付けてデータを格納する複数のノードを有しておりキーに応じてアクセス先のノードが判定されるシステムが実行するストレージ制御方法であって、
第１のキーと第１のデータとを取得したとき、前記第１のキーに応じた第１のノードに前記第１のキーと対応付けて第２のキーを示す第２のデータを格納し、第２のノードに前記第２のキーと対応付けて前記第１のデータを格納し、
前記第１のキーを指定したアクセス要求を取得したとき、前記第１のノードに前記第１のキーと対応付けて格納されているデータが前記第２のデータであることを検出し、前記第２のデータが示す前記第２のキーに基づいて、前記第２のノードに格納された前記第１のデータにアクセスする、
ストレージ制御方法。
【請求項２】
前記第１のキーと前記第１のデータとを取得したとき、前記第１のノードのデータ格納状況およびアクセス処理状況の少なくとも一方に基づいて、前記第１のデータを前記第１のノードに代えて前記第２のノードに格納することを決定する、請求項１記載のストレージ制御方法。
【請求項３】
前記第１のキーと前記第１のデータとを取得したとき、前記複数のノードのデータ格納状況およびアクセス処理状況の少なくとも一方に基づいて、前記複数のノードの中から前記第２のノードを選択する、請求項１または２記載のストレージ制御方法。
【請求項４】
前記第１のデータを前記第２のノードに格納することは、前記第１のノードによって行われるか、または、前記第１のデータの格納を要求するクライアント装置によって行われる、請求項１乃至３の何れか一項に記載のストレージ制御方法。
【請求項５】
前記第１のキーと対応付けられたデータが前記第２のデータであることの検出および前記第２のノードへのアクセスは、前記第１のノードによって行われるか、または、前記アクセス要求を送信するクライアント装置によって行われる、請求項１乃至４の何れか一項に記載のストレージ制御方法。
【請求項６】
キーと対応付けてデータを格納する複数のノードを有しておりキーに応じてアクセス先のノードが判定されるシステムに用いられる情報処理装置であって、
キーとノードとの対応関係を示す情報であって、少なくとも第１のキーに第１のノードが対応し第２のキーに第２のノードが対応することを示す情報を記憶する記憶部と、
前記第１のキーと第１のデータとを取得したとき、前記第１のノードに前記第１のキーと対応付けて前記第２のキーを示す第２のデータが格納され、前記第２のノードに前記第２のキーと対応付けて前記第１のデータが格納されるよう制御し、また、前記第１のキーを指定したアクセス要求を取得したとき、前記第１のキーと対応付けて格納されているデータが前記第２のデータであることを検出し、前記第２のデータが示す前記第２のキーに基づいて、前記第２のノードに格納された前記第１のデータにアクセスする制御部と、
を有する情報処理装置。
【請求項７】
キーと対応付けてデータを格納する複数のノードを有しておりキーに応じてアクセス先のノードが判定されるシステムの制御に用いるプログラムであって、コンピュータに、
第１のキーと第１のデータとを取得したとき、前記第１のキーに応じた第１のノードに前記第１のキーと対応付けて第２のキーを示す第２のデータが格納され、第２のノードに前記第２のキーと対応付けて前記第１のデータが格納されるよう制御し、
前記第１のキーを指定したアクセス要求を取得したとき、前記第１のキーと対応付けて格納されているデータが前記第２のデータであることを検出し、前記第２のデータが示す前記第２のキーに基づいて、前記第２のノードに格納された前記第１のデータにアクセスする、
処理を実行させるプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明はストレージ制御方法、情報処理装置およびプログラムに関する。
【背景技術】
【０００２】
現在、分散ストレージシステムが利用されている。分散ストレージシステムは、ネットワークで接続された複数のストレージノードを備える。複数のストレージノードにデータを分散配置することで、データアクセスの高速化を図れる。分散ストレージシステムには、ＫＶＳ（Key - Value Store）と呼ばれる手法を用いたものがある。ＫＶＳでは、データ（ｖａｌｕｅ）にキー（ｋｅｙ）を付与し、キーとデータのペアを何れかのストレージノードに保存する。保存したデータにアクセスする際は、キーを指定する。キーに応じて異なるストレージノードにデータを格納することで、データを分散配置する。
【０００３】
なお、データの格納、取出しには他の方法も利用されている。例えば、データの探索に適した構造にＢ木がある。Ｂ木では、ノードは、子ノードにポイントするポインタを保持する。ノードがサブトリーに包含されるサブノードへのポインタを保持するようにした提案もある。また、例えば、メモリ上の領域に値を格納しておき、当該領域を示すポインタを所定の関数に与えて、当該領域から値を取出すこともできる。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開平７−１９１８９１号公報
【特許文献２】国際公開第００／０７１０１号
【発明の概要】
【発明が解決しようとする課題】
【０００５】
キーに基づいてアクセス先のストレージノードが判定される分散ストレージシステムでは、キーとストレージノードとの対応関係を設定した後、ストレージノード間でデータ量や受付アクセス数に偏りが生じることがある。しかし、設定した対応関係に従ってデータの配置先ノードを選択している限り、偏りを解消することは困難となる。
【０００６】
一側面では、本発明は、データの配置を柔軟化することができるストレージ制御方法、情報処理装置およびプログラムを提供することを目的とする。
【課題を解決するための手段】
【０００７】
一実施態様では、キーと対応付けてデータを格納する複数のノードを有しておりキーに応じてアクセス先のノードが判定されるシステムが実行するストレージ制御方法が提供される。このストレージ制御方法では、第１のキーと第１のデータとを取得したとき、第１のキーに応じた第１のノードに第１のキーと対応付けて第２のキーを示す第２のデータを格納し、第２のノードに第２のキーと対応付けて第１のデータを格納する。第１のキーを指定したアクセス要求を取得したとき、第１のノードに第１のキーと対応付けて格納されているデータが第２のデータであることを検出し、第２のデータが示す第２のキーに基づいて、第２のノードに格納された第１のデータにアクセスする。
【０００８】
また、一実施態様では、キーと対応付けてデータを格納する複数のノードを有しておりキーに応じてアクセス先のノードが判定されるシステムに用いられる情報処理装置が提供される。この情報処理装置は、記憶部と制御部とを有する。記憶部は、キーとノードとの対応関係を示す情報であって、少なくとも第１のキーに第１のノードが対応し第２のキーに第２のノードが対応することを示す情報を記憶する。制御部は、第１のキーと第１のデータとを取得したとき、第１のノードに第１のキーと対応付けて第２のキーを示す第２のデータが格納され、第２のノードに第２のキーと対応付けて第１のデータが格納されるよう制御する。また、制御部は、第１のキーを指定したアクセス要求を取得したとき、第１のキーと対応付けて格納されているデータが第２のデータであることを検出し、第２のデータが示す第２のキーに基づいて、第２のノードに格納された第１のデータにアクセスする。
【０００９】
また、一実施態様では、コンピュータに実行させるプログラムであって、キーと対応付けてデータを格納する複数のノードを有しておりキーに応じてアクセス先のノードが判定されるシステムの制御に用いるプログラムが提供される。
【発明の効果】
【００１０】
一実施態様によれば、複数のノードへのデータの配置を柔軟化することができる。
【図面の簡単な説明】
【００１１】
【図１】第１の実施の形態の情報処理システムを示す図である。
【図２】第２の実施の形態の分散ストレージシステムを示す図である。
【図３】第２の実施の形態のストレージノードのハードウェア例を示す図である。
【図４】第２の実施の形態のソフトウェア例を示すブロック図である。
【図５】第２の実施の形態のハッシュ値の担当範囲の割当例を示す図である。
【図６】第２の実施の形態の担当管理テーブルの例を示す図である。
【図７】第２の実施の形態のポインタ管理テーブルの例を示す図である。
【図８】第２の実施の形態のデータストアの第１の例を示す図である。
【図９】第２の実施の形態のデータストアの第２の例を示す図である。
【図１０】第２の実施の形態のＷｒｉｔｅ処理を示すフローチャートである。
【図１１】第２の実施の形態の投入先ノード決定処理を示すフローチャートである。
【図１２】第２の実施の形態のポインタキー決定処理を示すフローチャートである。
【図１３】第２の実施の形態のＲｅａｄ処理を示すフローチャートである。
【図１４】第２の実施の形態のＤｅｌｅｔｅ処理を示すフローチャートである。
【図１５】第３の実施の形態のソフトウェア例を示すブロック図である。
【図１６】第３の実施の形態のＷｒｉｔｅ処理を示すフローチャートである。
【図１７】第３の実施の形態のＲｅａｄ処理を示すフローチャートである。
【図１８】第３の実施の形態のＤｅｌｅｔｅ処理を示すフローチャートである。
【発明を実施するための形態】
【００１２】
以下、本実施の形態を図面を参照して説明する。
［第１の実施の形態］
図１は、第１の実施の形態の情報処理システムを示す図である。第１の実施の形態の情報処理システムは、キー（ｋｅｙ）と対応付けてデータ（ｖａｌｕｅ）を格納する複数のノードを有しておりキーに応じてアクセス先のノードが判定されるシステムである。この情報処理システムは、情報処理装置１、第１のノード２および第２のノード２ａを含む。ノードとは、内蔵または外付けの記憶装置を備え、当該記憶装置にデータを保持できる情報処理装置である。情報処理装置１、第１のノード２および第２のノード２ａは、ネットワークで接続されている。
【００１３】
情報処理装置１は、ＣＰＵ（Central Processing Unit）などのプロセッサとＲＡＭ（Random Access Memory）などのメモリとを備えてもよく、メモリに記憶されたプログラムをプロセッサが実行するコンピュータであってもよい。情報処理装置１は、記憶部１ａ、および制御部１ｂを有する。
【００１４】
記憶部１ａは、キーとノードとの対応関係を示す情報を記憶する。この情報には、第１のキー（ｋｅｙ１）に第１のノード２が対応し第２のキー（ｋｅｙ２）に第２のノード２ａが対応することを示す情報が含まれる。記憶部１ａは、ＲＡＭやＨＤＤ（Hard Disk Drive）によって実装されてもよい。
【００１５】
制御部１ｂは、第１のキー（ｋｅｙ１）と第１のデータ（ｖａｌｕｅ１）とを取得する。すると、制御部１ｂは、第１のキー（ｋｅｙ１）と対応付けて第２のキー（ｋｅｙ２）を示す第２のデータ（ｖａｌｕｅ２）が第１のノード２に格納され、第２のキー（ｋｅｙ２）と対応付けて第１のデータ（ｖａｌｕｅ１）が第２のノード２ａに格納されるよう制御する。なお、第２のデータ（ｖａｌｕｅ２）は、第２のキー（ｋｅｙ２）自体でもよいし、第２のキー（ｋｅｙ２）自体でなくてもよい。例えば、第２のデータ（ｖａｌｕｅ２）は、第２のキー（ｋｅｙ２）中の所定のプレフィックスを省略したデータでもよい。
【００１６】
また、制御部１ｂは、第１のキー（ｋｅｙ１）を指定したアクセス要求を取得する。すると、制御部１ｂは、第１のキー（ｋｅｙ１）と対応付けて格納されているデータが第２のデータ（ｖａｌｕｅ２）であることを検出する。そして、制御部１ｂは、第２のデータ（ｖａｌｕｅ２）が示す第２のキー（ｋｅｙ２）に基づいて、第２のノード２ａに格納された第１のデータ（ｖａｌｕｅ１）にアクセスする。
【００１７】
例えば、制御部１ｂは、次のような方法により第２のデータを検出することが考えられる。第１の方法は、制御部１ｂが、第２のデータを格納するとき、第２のデータであることを示す所定の制御情報（例えば、フラグ）も、第１のキーに対応付けて第１のノード２に設定しておく方法である。この場合、第１のキーに対応する当該制御情報に基づいて、第１のキーに対応するデータが第２のデータであることを検出できる。第２の方法は、第２のデータを検出するための所定のルール（所定の文字列を含むなど）を予め定義しておく方法である。この場合、第１のキーに対応するデータが当該ルールに合致するか否かにより、第２のデータを検出できる。
【００１８】
情報処理装置１によれば、制御部１ｂにより、第１のキーと第１のデータとが取得されたとき、第１のノード２に第１のキーと対応付けて第２のキーを示す第２のデータが格納され、第２のノード２ａに第２のキーと対応付けて第１のデータが格納されるよう制御される。また、制御部１ｂにより、第１のキーを指定したアクセス要求が取得されたとき、第１のキーと対応付けて格納されているデータが第２のデータであることが検出され、第２のデータが示す第２のキーに基づいて、第２のノードに格納された第１のデータにアクセスされる。
【００１９】
これにより、複数のノードへのデータの配置を柔軟化することができる。具体的には、キーに基づいて配置先が決定されるＫＶＳにおいて、第１のキーによりデータの配置先が決定されても、当該データの代わりに第２のキーを当該配置先に配置することで、データの実体を別の装置に配置できる。例えば、第１のキーにより決定された配置先の空き容量が少ないときに、データの実体を他のノードに配置すれば、データ量の偏りを分散できる。第２のキーは、単にデータへのリンクを示す情報であるため、データの実体よりもデータサイズが小さい可能性が高いためである。また、例えば、第１のキーにより決定された配置先の負荷が大きい時に、データの実体を他のノードに配置すれば、負荷を分散することもできる。
【００２０】
なお、制御部１ｂの機能は、第１のノード２および第２のノード２ａが備えてもよい。その場合、例えば、第１のノード２が、自身への第１のデータ（ｖａｌｕｅ１）の書込み時に、（ｋｅｙ，ｖａｌｕｅ）のペア（ｋｅｙ１，ｖａｌｕｅ２）を自身に格納する。そして、第１のノード２が、（ｋｅｙ，ｖａｌｕｅ）のペア（ｋｅｙ２，ｖａｌｕｅ１）を第２のノード２ａに格納させる。更に、第１のキー（ｋｅｙ１）を指定したアクセス時には、第１のノード２が、第１のキー（ｋｅｙ１）に対し、第２のデータ（ｖａｌｕｅ２）を検出する。すると、第１のノード２が、第２のデータ（ｖａｌｕｅ２）で示される第２のキー（ｋｅｙ２）を指定して、第２のノード２ａに格納された第１のデータ（ｖａｌｕｅ１）にアクセスする。このようにしても、同様にデータの配置を柔軟化できる。
【００２１】
［第２の実施の形態］
図２は、第２の実施の形態の分散ストレージシステムを示す図である。第２の実施の形態の分散ストレージシステムは、ＫＶＳの手法によりデータを複数のストレージノードに分散配置する。第２の実施の形態の分散ストレージシステムは、ストレージノード１００，１００ａ，１００ｂ、ディスク装置２００，２００ａ，２００ｂおよびクライアント３００，３００ａを含む。
【００２２】
ネットワーク１０には、ストレージノード１００，１００ａ，１００ｂおよびクライアント３００が接続されている。ネットワーク１０はＬＡＮ（Local Area Network）でもよい。ネットワーク１０はインターネットなどの広域ネットワークでもよい。
【００２３】
ストレージノード１００には、ディスク装置２００が接続されている。ストレージノード１００ａには、ディスク装置２００ａが接続されている。ストレージノード１００ｂには、ディスク装置２００ｂが接続されている。ストレージノード１００，１００ａ，１００ｂとディスク装置２００，２００ａ，２００ｂとの間のインタフェースには、例えばＳＣＳＩ（Small Computer System Interface）やファイバチャネル（Fibre Channel）などを用いてもよい。ストレージノード１００，１００ａ，１００ｂは、それぞれディスク装置２００，２００ａ，２００ｂに対するデータの書込み（Ｗｒｉｔｅ）、データの読出し（Ｒｅａｄ）およびデータの削除（Ｄｅｌｅｔｅ）などを実行するサーバコンピュータである。
【００２４】
ディスク装置２００，２００ａ，２００ｂは、データを記憶する記憶装置である。ディスク装置２００，２００ａ，２００ｂは、ＨＤＤやＳＳＤ（Solid State Drive）などの記憶デバイスを備える。ディスク装置２００，２００ａ，２００ｂは、ストレージノード１００，１００ａ，１００ｂに内蔵されてもよい。
【００２５】
クライアント３００，３００ａは、分散ストレージシステムに格納されたデータにアクセスするクライアントコンピュータである。例えば、クライアント３００，３００ａは、ユーザが操作する端末装置である。クライアント３００，３００ａは、ストレージノード１００，１００ａ，１００ｂに対し、データのアクセス要求を行う。アクセス要求には、データの書込み要求（Ｗｒｉｔｅ要求）、データの読出し要求（Ｒｅａｄ要求）およびデータの削除要求（Ｄｅｌｅｔｅ要求）が含まれる。
【００２６】
ここで、ディスク装置２００，２００ａ，２００ｂは、キー（ｋｅｙ）とデータ（ｖａｌｕｅ）のペア（ｋｅｙ，ｖａｌｕｅ）を記憶する。ストレージノード１００，１００ａ，１００ｂは、キーを指定したデータのＷｒｉｔｅ要求があると、当該キーに対応するデータを書込む。ストレージノード１００，１００ａ，１００ｂは、キーを指定したデータのＲｅａｄ要求があると、当該キーに対応するデータを読み出す。ストレージノード１００，１００ａ，１００ｂは、キーを指定したデータのＤｅｌｅｔｅ要求があると、当該キーに対応するデータをキーとともに削除する。
【００２７】
ストレージノード１００，１００ａ，１００ｂは、何れのストレージノードがデータを保持するかを、キーから算出されるハッシュ値に基づいて判断する。キーに対するハッシュ値は、例えば、ＭＤ５（Message Digest algorithm 5）を用いて算出できる。ＳＨＡ（Secure Hash Algorithm）など他のハッシュ関数を用いてもよい。このように、キーに対するハッシュ値に基づいて担当のストレージノード（以下、担当ノードということがある）を判定する方法は、コンシステントハッシング（Consistent Hashing）と呼ばれることがある。
【００２８】
図３は、第２の実施の形態のストレージノードのハードウェア例を示す図である。ストレージノード１００は、ＣＰＵ１０１、ＲＡＭ１０２、ＨＤＤ１０３、ディスクＩ／Ｆ（InterFace）部１０４、画像信号処理部１０５、入力信号処理部１０６、ディスクドライブ１０７および通信部１０８を有する。各ユニットがストレージノード１００のバスに接続されている。ストレージノード１００ａ，１００ｂおよびクライアント３００，３００ａもストレージノード１００と同様のハードウェアを用いて実装できる。
【００２９】
ＣＰＵ１０１は、ストレージノード１００の情報処理を制御するプロセッサである。ＣＰＵ１０１は、ＨＤＤ１０３に記憶されているプログラムやデータの少なくとも一部を読出し、ＲＡＭ１０２に展開してプログラムを実行する。なお、ストレージノード１００は、複数のプロセッサを設けて、プログラムを分散して実行してもよい。
【００３０】
ＲＡＭ１０２は、ＣＰＵ１０１が実行するプログラムや処理に用いるデータを一時的に記憶する揮発性メモリである。なお、ストレージノード１００は、ＲＡＭ以外の種類のメモリを備えてもよく、複数個のメモリを備えていてもよい。
【００３１】
ＨＤＤ１０３は、ＯＳ（Operating System）プログラムやアプリケーションプログラムなどのプログラムおよびデータを記憶する不揮発性の記憶装置である。ＨＤＤ１０３は、ＣＰＵ１０１の命令に従って、内蔵の磁気ディスクに対してデータの読み書きを行う。なお、ストレージノード１００は、ＨＤＤ以外の種類の不揮発性の記憶装置（例えば、ＳＳＤなど）を備えてもよく、複数の記憶装置を備えていてもよい。
【００３２】
ディスクＩ／Ｆ部１０４は、ディスク装置２００と接続するためのインタフェースである。ディスクＩ／Ｆ部１０４は、例えば、ＳＣＳＩやファイバチャネルなどのインタフェースである。
【００３３】
画像信号処理部１０５は、ＣＰＵ１０１の命令に従って、ストレージノード１００に接続されたディスプレイ１１に画像を出力する。ディスプレイ１１としては、例えば、ＣＲＴ（Cathode Ray Tube）ディスプレイや液晶ディスプレイを用いることができる。
【００３４】
入力信号処理部１０６は、ストレージノード１００に接続された入力デバイス１２から入力信号を取得し、ＣＰＵ１０１に出力する。入力デバイス１２としては、例えば、マウスやタッチパネルなどのポインティングデバイス、キーボードなどを用いることができる。
【００３５】
ディスクドライブ１０７は、記録媒体１３に記録されたプログラムやデータを読み取る駆動装置である。記録媒体１３として、例えば、フレキシブルディスク（ＦＤ：Flexible Disk）やＨＤＤなどの磁気ディスク、ＣＤ（Compact Disc）やＤＶＤ（Digital Versatile Disc）などの光ディスク、光磁気ディスク（ＭＯ：Magneto-Optical disk）を使用できる。ディスクドライブ１０７は、例えば、ＣＰＵ１０１の命令に従って、記録媒体１３から読み取ったプログラムやデータをＲＡＭ１０２またはＨＤＤ１０３に格納する。
【００３６】
通信部１０８は、ネットワーク１０を介してストレージノード１００，１００ａ，１００ｂおよびクライアント３００，３００ａと通信を行う通信インタフェースである。通信部１０８は、有線通信インタフェースでもよいし、無線通信インタフェースでもよい。
【００３７】
図４は、第２の実施の形態のソフトウェア例を示すブロック図である。図４に示すユニットの一部または全部は、ストレージノード１００，１００ａ，１００ｂおよびクライアント３００，３００ａが実行するプログラムのモジュールであってもよい。図４に示すユニットの一部または全部は、ＦＰＧＡ（Field Programmable Gate Array）やＡＳＩＣ（Application Specific Integrated Circuit）などの電子回路であってもよい。ストレージノード１００ａ，１００ｂもストレージノード１００と同様のユニットを用いて実装できる。クライアント３００ａもクライアント３００と同様のユニットを用いて実装できる。
【００３８】
ストレージノード１００は、記憶部１１０、ネットワークＩ／Ｏ（Input / Output）部１２０、ディスクＩ／Ｏ部１３０、アクセス受付部１４０、ノード決定部１５０および他ノードアクセス部１６０を有する。
【００３９】
記憶部１１０は、担当管理テーブルおよびポインタ管理テーブルを記憶する。担当管理テーブルは、ハッシュ値に対する担当ノードを管理するための情報である。ポインタ管理テーブルは、ポインタキー（ｐｏｉｎｔｅｒ  ｋｅｙ）と、当該ポインタキーと対応付けたデータを投入したストレージノード（以下、投入先ノードということがある）を管理するための情報である。ポインタキーは、投入先ノードへのリンクを定義するための情報である。
【００４０】
ネットワークＩ／Ｏ部１２０は、クライアント３００，３００ａからアクセス要求を受信し、アクセス受付部１４０に出力する。ネットワークＩ／Ｏ部１２０は、他ノードアクセス部１６０から取得したストレージノード１００ａ，１００ｂへのアクセス要求をストレージノード１００ａ，１００ｂへ送信する。他ノードアクセス部１６０は、ストレージノード１００ａ，１００ｂから受信したデータを他ノードアクセス部１６０に出力する。ネットワークＩ／Ｏ部１２０は、アクセス受付部１４０および他ノードアクセス部１６０から取得したデータをクライアント３００，３００ａに送信する。
【００４１】
ディスクＩ／Ｏ部１３０は、ノード決定部１５０から取得したキーおよびデータのペアをディスク装置２００に書込む。ディスクＩ／Ｏ部１３０は、ノード決定部１５０から指定されたキーに応じたデータをディスク装置２００から読出し、ノード決定部１５０に出力する。
【００４２】
アクセス受付部１４０は、ネットワークＩ／Ｏ部１２０から取得したアクセス要求をノード決定部１５０に出力する。アクセス受付部１４０は、ノード決定部１５０から取得したデータを、ネットワークＩ／Ｏ部１２０を介して、アクセス要求元のクライアント３００，３００ａへ応答する。
【００４３】
ノード決定部１５０は、記憶部１１０に記憶された担当管理テーブルに基づいて、アクセス先の担当ノードを判断する。ノード決定部１５０は、自ノード（ストレージノード１００）が担当ノードであれば、キーに対するデータアクセス（書込み、読出し、削除など）をディスクＩ／Ｏ部１３０に指示する。ノード決定部１５０は、ディスクＩ／Ｏ部１３０によるアクセス結果（書込み完了や読出しデータなど）をアクセス受付部１４０に出力する。ノード決定部１５０は、他ノード（ストレージノード１００ａ，１００ｂ）が担当ノードであれば、他ノードへのアクセス要求を行うよう他ノードアクセス部１６０に指示する。
【００４４】
ここで、ノード決定部１５０は、Ｗｒｉｔｅ要求に対する担当ノードが自ノードの場合、自ノードの利用状況に応じて、データの実体を格納する投入先ノードを決定する。ノード決定部１５０は、自ノード以外を投入先ノードとして決定した場合、当該投入先ノードへリンクするためのポインタキーを生成し、ディスク装置２００にはキーと対応付けたポインタキーを格納する。そして、ノード決定部１５０は、ポインタキーと対応付けたデータの実体を記憶するよう、投入先ノードに依頼する。自ノードが投入先ノードであれば、指定されたキーに対応付けたデータをディスク装置２００に格納する。
【００４５】
また、ノード決定部１５０は、Ｒｅａｄ要求に対する担当ノードが自ノードで、読み出されたデータがポインタキーである場合、記憶部１１０に記憶されたポインタ管理テーブルに基づいて、投入先ノードを判断する。ノード決定部１５０は、他ノードアクセス部１６０により、ポインタキーに対するデータを投入先ノードから取得させ、要求元のクライアント３００，３００ａに応答させる。読出したデータがポインタキーでなければ、当該データを要求元のクライアント３００，３００ａに応答する。
【００４６】
更に、ノード決定部１５０は、Ｄｅｌｅｔｅ要求に対する担当ノードが自ノードで、指定されたキーに対するデータがポインタキーである場合、記憶部１１０に記憶されたポインタ管理テーブルに基づいて、投入先ノードを判断する。ノード決定部１５０は、他ノードアクセス部１６０により、ポインタキーに対するデータを投入先ノードに削除させる。読出したデータがポインタキーでなければ、指定されたキーに対応付けたデータをディスク装置２００から削除する。
【００４７】
他ノードアクセス部１６０は、ノード決定部１５０の指示により、他ノードへのアクセス要求を生成し、ネットワークＩ／Ｏ部１２０を介して、他ノードへ送信する。また、他ノードアクセス部１６０は、ネットワークＩ／Ｏ部１２０を介して、他ノードから受信したデータを、アクセス要求元のクライアント３００，３００ａへ応答する。
【００４８】
クライアント３００は、記憶部３１０、ネットワークＩ／Ｏ部３２０およびアクセス部３３０を有する。
記憶部３１０は、クライアント３００が扱うデータを記憶する。
【００４９】
ネットワークＩ／Ｏ部３２０は、アクセス部３３０から取得したアクセス要求をストレージノード１００，１００ａ，１００ｂの何れか（例えば、ストレージノード１００）に送信する。ネットワークＩ／Ｏ部３２０は、当該アクセス要求に対するストレージノード１００，１００ａ，１００ｂからの応答を受信し、アクセス部３３０に出力する。
【００５０】
アクセス部３３０は、所定のアプリケーションによるデータアクセスに応じて、アクセス要求を生成し、ネットワークＩ／Ｏ部３２０に出力する。アクセス要求には、上述したようにＷｒｉｔｅ要求、Ｒｅａｄ要求およびＤｅｌｅｔｅ要求が含まれる。アクセス部３３０は、各アクセス要求にアクセス対象のデータに対するキー（ｋｅｙ）を含める。キーは、例えば、アプリケーションにより指定される。アクセス部３３０にデータアクセスを行わせるアプリケーションは、図４では図示を省略している。当該アプリケーションは、クライアント３００上で、例えばクライアント３００が実行するプログラムにより実装されるものでもよいし、他の情報処理装置上に実装されるものでもよい。
【００５１】
なお、第２の実施の形態のストレージノード１００は、第１の実施の形態の情報処理装置１の一例である。ノード決定部１５０および他ノードアクセス部１６０は、制御部１ｂの一例である。
【００５２】
図５は、第２の実施の形態のハッシュ値の担当範囲の割当例を示す図である。第２の実施の形態の分散ストレージシステムでは、利用可能なハッシュ値の全範囲は“０〜９９”である。ただし、“９９”の次の値は“０”である。当該全範囲を３つに分割した範囲それぞれがストレージノード１００，１００ａ，１００ｂに割り当てられている。ここで、ラベル“Ａ”は、ストレージノード１００の識別情報である。ラベル“Ｂ”は、ストレージノード１００ａの識別情報である。ラベル“Ｃ”は、ストレージノード１００ｂの識別情報である。各ラベルの位置は、各担当範囲の開始位置である。
【００５３】
図５では、各ラベル位置に対応する値を含むハッシュ値範囲Ｒ１，Ｒ２，Ｒ３が示されている。ハッシュ値範囲Ｒ１は“１０〜３９”であり、ストレージノード１００の担当範囲である。ハッシュ値範囲Ｒ２は“４０〜８９”であり、ストレージノード１００ａの担当範囲である。ハッシュ値範囲Ｒ３は“９０〜９９”、“０〜９”であり、ストレージノード１００ｂの担当範囲である。ハッシュ値範囲Ｒ３は、“９９”および“０”を跨いだ領域である。
【００５４】
第２の実施の形態の分散ストレージシステムでは、担当範囲の一端の値を、ストレージノード１００，１００ａ，１００ｂに対して指定することで、ストレージノード１００，１００ａ，１００ｂの担当範囲を割り当てる。例えば、担当範囲の両端の値のうち小さい方（開始位置）を指定する場合、ストレージノード１００にハッシュ値“１０”を、ストレージノード１００ａにハッシュ値“４０”を指定する。これにより、ストレージノード１００の担当範囲が“１０〜３９”となる。ハッシュ値範囲Ｒ３のように、当該範囲が“０”を跨ぐ場合には、例外として、両端の値のうち大きい方が開始位置となる。この場合、例えば、ハッシュ値“９０”を指定することで、“０”を跨いだ範囲を指定できる。
【００５５】
なお、担当範囲の両端の値のうち大きい方（終了位置）を指定して、担当範囲を割り当ててもよい。例えば、ストレージノード１００にハッシュ値“３９”を、ストレージノード１００ａにハッシュ値“８９”を、ストレージノード１００ｂにハッシュ値“９”を指定する。すると、図５で示したハッシュ値範囲Ｒ１，Ｒ２，Ｒ３と同等の担当範囲を、ストレージノード１００，１００ａ，１００ｂに割り当てることができる。この場合も、“０”を跨ぐ範囲については、例外として、両端の値のうち小さい方が終了位置となる。よって、両端の値のうち小さい方を指定することで、“０”を跨いだ範囲を指定できる。
【００５６】
以下の説明では、ストレージノード１００，１００ａ，１００ｂに、担当範囲の開始位置を指定することで、当該担当範囲を割り当てるものとする。
図６は、第２の実施の形態の担当管理テーブルの例を示す図である。担当管理テーブル１１１は、記憶部１１０に格納される。担当管理テーブル１１１には、ｎｏｄｅおよび開始位置の項目が設けられている。
【００５７】
ｎｏｄｅの項目には、ストレージノードのラベルが登録される。開始位置の項目には、担当範囲の開始位置に対応する値が登録される。担当管理テーブル１１１は、図５の担当割当を定義したものである。
【００５８】
図７は、第２の実施の形態のポインタ管理テーブルの例を示す図である。ポインタ管理テーブル１１２は、記憶部１１０に格納される。ポインタ管理テーブル１１２には、ｐｉｎｔｅｒ  ｋｅｙおよびｎｏｄｅの項目が設けられている。
【００５９】
ｐｏｉｎｔｅｒ  ｋｅｙの項目には、ポインタキーが登録される。ｎｏｄｅの項目には、ストレージノードのラベルが登録される。例えば、ｐｉｎｔｅｒ  ｋｅｙが“ｐｏｉｎｔｅｒ０１”でｎｏｄｅが“Ｂ”であれば、当該“ｐｏｉｎｔｅｒ０１”はストレージノード１００ｂへのリンクである。
【００６０】
図８は、第２の実施の形態のデータストアの第１の例を示す図である。データストア２１０は、ディスク装置２００に格納される。データストア２１０では、データ（ｖａｌｕｅ）が、キー（ｋｅｙ）に対応付けて格納される。更に、データ（ｖａｌｕｅ）がポインタキーであるか否かを示すフラグ（ｆｌａｇ）が、キー（ｋｅｙ）に対応付けて格納される。フラグが“ｔｒｕｅ”であれば、データはポインタキーである。フラグが“ｆａｌｓｅ”であれば、データはポインタキーでない。
【００６１】
例えば、キー“ｋｅｙ０１”ではフラグが“ｔｒｕｅ”である。よって、キー“ｋｅｙ０１”に対するデータ“ｐｏｉｎｔｅｒ０１”はポインタキーである。また、例えば、キー“ｋｅｙ０２”ではフラグが“ｆａｌｓｅ”である。よって、キー“ｋｅｙ０２”に対するデータ“ｖａｌｕｅ０２”はポインタキーではない。ノード決定部１５０は、データの書込みを行う際に、キーに対するフラグの設定も行う。
【００６２】
図９は、第２の実施の形態のデータストアの第２の例を示す図である。データストア２１０ａは、ディスク装置２００ａに格納される。データストア２１０ａのデータ構造は、データストア２１０と同一である。例えば、データストア２１０ａでは、キー“ｐｏｉｎｔｅｒ０１”ではフラグが“ｆａｌｓｅ”である。よって、キー“ｐｏｉｎｔｅｒ０１”に対するデータ“ｖａｌｕｅ０１”はポインタキーではない。
【００６３】
図１０は、第２の実施の形態のＷｒｉｔｅ処理を示すフローチャートである。以下、図１０に示す処理をフローチャートに沿って説明する。
（ステップＳ１１）ネットワークＩ／Ｏ部１２０は、クライアント３００からＷｒｉｔｅ要求を受信する。ネットワークＩ／Ｏ部１２０は、アクセス受付部１４０を介して、当該Ｗｒｉｔｅ要求をノード決定部１５０に出力する。例えば、Ｗｒｉｔｅ要求には、キー“ｋｅｙ０１”およびデータ“ｖａｌｕｅ０１”が含まれる。
【００６４】
（ステップＳ１２）ノード決定部１５０は、Ｗｒｉｔｅ要求に含まれるキーに基づいてハッシュ値を計算する。
（ステップＳ１３）ノード決定部１５０は、記憶部１１０に記憶された担当管理テーブル１１１に基づいて、算出したハッシュ値の担当ノードが自ノードであるか否かを判定する。担当が自ノードでない場合、処理をステップＳ１４に進める。担当が自ノードである場合、処理をステップＳ１５に進める。
【００６５】
（ステップＳ１４）ノード決定部１５０は、ネットワークＩ／Ｏ部１２０を介して、担当ノードにＷｒｉｔｅ要求を転送する。当該Ｗｒｉｔｅ要求を受信した担当ノードは、自身に接続されたディスク装置にデータを書込み、クライアント３００に結果を応答する。そして、処理を終了する。
【００６６】
（ステップＳ１５）ノード決定部１５０は、データの実体を投入する投入先ノードを決定するか否かを判定する。決定する場合、処理をステップＳ１６に進める。決定しない場合、処理をステップＳ１８に進める。ノード決定部１５０は、投入先ノードを決定するか否かを、例えば、次の（１）（２）の何れか、または、両方の基準により判断できる。（１）ディスク装置２００の空き容量が所定値よりも小さい。（２）投入するデータのサイズが閾値よりも大きい。両方の基準を用いる場合、例えば、両方の条件が満たされたときに投入先ノードを決定する、あるいは、何れか一方の条件が満たされたときに投入先ノードを決定する、などと判断することが考えられる。なお、他の基準を用いてもよい。
【００６７】
（ステップＳ１６）ノード決定部１５０は、投入先ノードを決定する。手順の詳細は後述する。
（ステップＳ１７）ノード決定部１５０は、決定した投入先ノードが自ノードであるか否かを判定する。投入先が自ノードである場合、処理をステップＳ１８に進める。投入先が自ノードではない場合、処理をステップＳ１９に進める。
【００６８】
（ステップＳ１８）ノード決定部１５０は、ディスク装置２００へのデータ（ｖａｌｕｅ）の書込みをディスクＩ／Ｏ部１３０に指示する。同時に、データに対応するキー（ｋｅｙ）およびフラグ（ｆｌａｇ）の書込みを指示する。キー（ｋｅｙ）は、Ｗｒｉｔｅ要求で指定されたキーである。フラグ（ｆｌａｇ）は、“ｆａｌｓｅ”である。ディスクＩ／Ｏ部１３０は、（ｋｅｙ，ｖａｌｕｅ，ｆｌａｇ）の組をディスク装置２００に書込み、結果をノード決定部１５０に応答する。すると、ノード決定部１５０は、ネットワークＩ／Ｏ部１２０を介して、クライアント３００に書込み結果を応答する。この場合、例えば、データストア２１０に、（“ｋｅｙ０１”，“ｖａｌｕｅ０１”，“ｆａｌｓｅ”）の組が書込まれる。そして、処理を終了する。
【００６９】
（ステップＳ１９）ノード決定部１５０は、ポインタキー（ｐｏｉｎｔｅｒ  ｋｅｙ）を求める。手順の詳細は後述する。例えば、ポインタキー“ｐｏｉｎｔｅｒ０１”が求められる。
【００７０】
（ステップＳ２０）ノード決定部１５０は、ポインタキーとＷｒｉｔｅ対象のデータ（ｖａｌｕｅ）とのペアの書込みを投入先ノードに依頼するように、他ノードアクセス部１６０に指示する。他ノードアクセス部１６０は、ネットワークＩ／Ｏ部１２０を介して、投入先ノードに当該依頼を送信する。投入先ノードは、指定された（ｋｅｙ，ｖａｌｕｅ，ｆｌａｇ）の組を自身に接続されたディスク装置に格納する。ここで、ｆｌａｇの値は“ｆａｌｓｅ”である。例えば、投入先ノードがストレージノード１００ａである場合、データストア２１０ａに、（“ｐｏｉｎｔｅｒ０１”，“ｖａｌｕｅ０１”，“ｆａｌｓｅ”）の組が書込まれる。他ノードアクセス部１６０は、投入先ノードから書込み結果の応答を受信する。ノード決定部１５０は、書込み依頼したポインタキーと投入先ノードのラベルとを対応付けて、記憶部１１０に記憶されたポインタ管理テーブル１１２に記録する。
【００７１】
（ステップＳ２１）ノード決定部１５０は、ディスク装置２００へのポインタキーの書込みをディスクＩ／Ｏ部１３０に指示する。キー（ｋｅｙ）は、Ｗｒｉｔｅ要求で指定されたキーである。データ（ｖａｌｕｅ）は、ステップＳ１９で決定したポインタキーである。フラグ（ｆｌａｇ）は、“ｔｒｕｅ”である。ディスクＩ／Ｏ部１３０は、（ｋｅｙ，ｐｏｉｎｔｅｒ  ｋｅｙ，ｆｌａｇ）の組をディスク装置２００に書込み、結果をノード決定部１５０に応答する。この場合、例えば、データストア２１０に、（“ｋｅｙ０１”、“ｐｏｉｎｔｅｒ０１”，“ｔｒｕｅ”）の組が書込まれる。ノード決定部１５０は、ネットワークＩ／Ｏ部１２０を介して、クライアント３００に書込み結果を応答する。
【００７２】
このように、ストレージノード１００は、データの実体を他のノードに配置できる。その場合、ストレージノード１００には、データの実体の代わりに、他のノードへのリンクを示すポインタキーをディスク装置２００に格納する。そして、他のノードには、当該ポインタキーと対応付けたデータの実体を格納させる。データのアップデートの際は、ポインタキーによるリンクを辿ってデータの実体を更新する。
【００７３】
なお、ステップＳ１５では、データの投入先ノードを再決定するか否かの基準（１）（２）を例示したが、他の基準により判断してもよい。例えば、自ノードの負荷を示す指標（例えば、ＣＰＵ利用率やアクセス数など）が所定期間、連続して所定値よりも大きい場合に、投入先ノードを決定するようにしてもよい。
【００７４】
次に、ステップＳ１６の手順を説明する。
図１１は、第２の実施の形態の投入先ノード決定処理を示すフローチャートである。以下、図１１に示す処理をステップ番号に沿って説明する。
【００７５】
（ステップＳ３１）ノード決定部１５０は、ストレージノード１００，１００ａ，１００ｂそれぞれに接続されたディスク装置２００，２００ａ，２００ｂの使用状況を取得する。使用状況には、各ノードに接続されたディスク装置の使用済容量と空き容量とが含まれる。例えば、ノード決定部１５０は、ストレージノード１００，１００ａ，１００ｂから定期的に使用状況を取得して記憶部１１０に格納しておくことで、記憶部１１０から当該使用状況を取得できる。また、例えば、ノード決定部１５０は、当該ステップＳ３１において、ストレージノード１００，１００ａ，１００ｂから現在の使用状況を取得してもよい。
【００７６】
（ステップＳ３２）ノード決定部１５０は、空き容量が所定値以上で使用済容量が最小のノードを、投入先ノードとして選択する。
このように、ストレージノード１００は、ストレージノード１００，１００ａ，１００ｂのうちから容量に余裕のあるノードを投入先ノードとする。ただし、他の基準により投入先ノードを決定してもよい。当該基準は、運用方針に応じて選択できる。例えば以下の（Ａ）（Ｂ）の各目的に応じて、（Ａ１）〜（Ａ３）、（Ｂ１）〜（Ｂ３）の何れか、または、複数の基準により投入先ノードを選択することが考えられる。
【００７７】
（Ａ）ディスク装置２００，２００ａ，２００ｂのデータ量を分散したい場合
（Ａ１）空き容量が一定以上あり、使用済容量が最小のノードを選択する。
（Ａ２）空き容量が最大のノードを選択する。
【００７８】
（Ａ３）ディスク装置の全容量に対する使用割合が最小のノードを選択する。
（Ｂ）負荷を分散したい場合
（Ｂ１）ディスク装置のｂｕｓｙ率が最小のノードを選択する。
【００７９】
（Ｂ２）Ｉ／Ｏ数が最小のノードを選択する。
（Ｂ３）ネットワーク使用率が最小のノードを選択する。
何れの選択方法を採用するかは、例えば、分散ストレージシステムの管理者によって各ストレージノードに予め設定される。
【００８０】
複数の基準を用いる場合には、複数の基準が選択される。例えば、（Ａ１）と（Ａ２）を組み合わせる場合、（Ａ１）の「使用済容量が最小」という条件に幅をもたせて複数のノードを選択可能とする（例えば、使用済容量が小さいノードを３つ選択するなど）。そして、選択した複数のノードの中から（Ａ２）の「空き容量が最大」のノードを選択することが考えられる。
【００８１】
また、例えば、（Ａ３）と（Ｂ１）を組み合わせる場合、（Ａ３）の「ディスク装置の使用割合が最小」という条件に幅をもたせて複数のノードを選択可能とする（例えば、使用割合が小さいノードを５つ選択するなど）。そして、選択した複数のノードの中から（Ｂ１）の「ｂｕｓｙ率最小」のノードを選択することが考えられる。
【００８２】
ノード決定部１５０は、各基準に応じた判断が行えるように、ストレージノード１００，１００ａ，１００ｂから、基準に応じた情報（ディスク装置の空き容量やｂｕｓｙ率など）を含む使用状況を取得する。
【００８３】
次に、図１０のステップＳ１９の手順を説明する。
図１２は、第２の実施の形態のポインタキー決定処理を示すフローチャートである。以下、図１２に示す処理をステップ番号に沿って説明する。
【００８４】
（ステップＳ４１）ノード決定部１５０は、乱数を発生させる。ノード決定部１５０は、所定の疑似乱数生成アルゴリズムにより、乱数を生成できる。ここで発生させた乱数は、ポインタキー候補である。
【００８５】
（ステップＳ４２）ノード決定部１５０は、投入先ノードで既にポインタキー候補がポインタキーとして使用済であるか否かを判定する。使用済の場合、処理をステップＳ４１に進める。未使用の場合、処理をステップＳ４３に進める。例えば、ノード決定部１５０は、ポインタキー候補と同一のポインタキーと対応付けたデータを、データストアに格納済であるかを投入先ノードに問い合わせることで、当該判定を行える。格納済であれば、当該ポインタキー候補は使用済である。未格納であれば、当該ポインタキー候補は未使用である。
【００８６】
（ステップＳ４３）ノード決定部１５０は、ステップＳ４１で生成した乱数をポインタキーに決定する。
このようにして、ストレージノード１００は、１つの投入先ノードに対して重複しないようにポインタキーを決定する。
【００８７】
ここで、ポインタキーとして、通常のキーから算出されるハッシュ値と衝突しないものを選ぶことが望ましい。例えば、当該ハッシュ値の数値列とは異なる桁数で乱数を発生させてポインタキーを決定することが好ましい。
【００８８】
図１３は、第２の実施の形態のＲｅａｄ処理を示すフローチャートである。以下、図１３に示す処理をステップ番号に沿って説明する。
（ステップＳ５１）ネットワークＩ／Ｏ部１２０は、クライアント３００からＲｅａｄ要求を受信する。ネットワークＩ／Ｏ部１２０は、アクセス受付部１４０を介して、当該Ｒｅａｄ要求をノード決定部１５０に出力する。例えば、Ｒｅａｄ要求には、キー“ｋｅｙ０１”が含まれる。
【００８９】
（ステップＳ５２）ノード決定部１５０は、Ｒｅａｄ要求に含まれるキーに基づいてハッシュ値を計算する。
（ステップＳ５３）ノード決定部１５０は、記憶部１１０に記憶された担当管理テーブル１１１に基づいて、算出したハッシュ値の担当ノードが自ノードであるか否かを判定する。担当が自ノードでない場合、処理をステップＳ５４に進める。担当が自ノードである場合、処理をステップＳ５５に進める。
【００９０】
（ステップＳ５４）ノード決定部１５０は、ネットワークＩ／Ｏ部１２０を介して、担当ノードにＲｅａｄ要求を転送する。当該Ｒｅａｄ要求を受信した担当ノードは、自身に接続されたディスク装置からデータを読出し、クライアント３００に読出したデータを応答する。そして、処理を終了する。
【００９１】
（ステップＳ５５）ノード決定部１５０は、Ｒｅａｄ要求に含まれるキー（ｋｅｙ）に対応するデータ（ｖａｌｕｅ）をディスク装置２００のデータストア２１０から取得する。例えば、キー“ｋｅｙ０１”に対してデータ“ｐｏｉｎｔｅｒ０１”を取得する。
【００９２】
（ステップＳ５６）ノード決定部１５０は、データ（ｖａｌｕｅ）がポインタキーであるか否かを判定する。データがポインタキーでない場合、処理をステップＳ５７に進める。データがポインタキーである場合、処理をステップＳ５８に進める。データがポインタキーであるか否かは、キー（ｋｅｙ）に対応するフラグ（ｆｌａｇ）に基づいて判定できる。フラグが“ｔｒｕｅ”であれば、ポインタキーである。フラグが“ｆａｌｓｅ”であれば、ポインタキーでない。
【００９３】
（ステップＳ５７）ノード決定部１５０は、ステップＳ５５で取得したデータをクライアント３００に応答する。そして、処理を終了する。
（ステップＳ５８）ノード決定部１５０は、記憶部１１０に記憶されたポインタ管理テーブル１１２を参照し、ステップＳ５５でデータ（ｖａｌｕｅ）として取得したポインタキーに基づいて、投入先ノードを特定する。例えば、ポインタキー“ｐｏｉｎｔｅｒ０１”であれば、投入先ノードはストレージノード１００ａ（ラベル“Ｂ”）である。
【００９４】
（ステップＳ５９）ノード決定部１５０は、ポインタキーをキーとして指定して、投入先ノードからデータ（ｖａｌｕｅ）を取得するよう他ノードアクセス部１６０に依頼する。他ノードアクセス部１６０は、当該依頼に応じたＲｅａｄ要求を生成し、ネットワークＩ／Ｏ部１２０を介して投入先ノードに送信し、投入先ノードからポインタキーと対応付けられたデータを取得する。例えば、他ノードアクセス部１６０は、ポインタキー“ｐｏｉｎｔｅｒ０１”に対してデータ“ｖａｌｕｅ０１”をストレージノード１００ａから取得する。
【００９５】
（ステップＳ６０）他ノードアクセス部１６０は、ネットワークＩ／Ｏ部１２０を介して、投入先ノードから取得したデータをクライアント３００に応答する。
このように、ストレージノード１００は、Ｒｅａｄ要求に含まれるキーに対し、データストア２１０からポインタキーを取得した場合、ポインタキーに基づいて投入先ノードを特定する。そして、当該ポインタキーに対応付けたデータを投入先ノードから取得し、クライアント３００に応答する。
【００９６】
図１４は、第２の実施の形態のＤｅｌｅｔｅ処理を示すフローチャートである。以下、図１４に示す処理をステップ番号に沿って説明する。
（ステップＳ６１）ネットワークＩ／Ｏ部１２０は、クライアント３００からＤｅｌｅｔｅ要求を受信する。ネットワークＩ／Ｏ部１２０は、アクセス受付部１４０を介して、当該Ｄｅｌｅｔｅ要求をノード決定部１５０に出力する。例えば、Ｄｅｌｅｔｅ要求には、キー“ｋｅｙ０１”が含まれる。
【００９７】
（ステップＳ６２）ノード決定部１５０は、Ｄｅｌｅｔｅ要求に含まれるキーに基づいてハッシュ値を算出する。
（ステップＳ６３）ノード決定部１５０は、記憶部１１０に記憶された担当管理テーブル１１１に基づいて、算出したハッシュ値の担当ノードが自ノードであるか否かを判定する。担当が自ノードでない場合、処理をステップＳ６４に進める。担当が自ノードである場合、処理をステップＳ６５に進める。
【００９８】
（ステップＳ６４）ノード決定部１５０は、ネットワークＩ／Ｏ部１２０を介して、担当ノードにＤｅｌｅｔｅ要求を転送する。当該Ｄｅｌｅｔｅ要求を受信した担当ノードは、自身に接続されたディスク装置からキーとデータとのペアを削除し、削除結果をクライアント３００に応答する。そして、処理を終了する。
【００９９】
（ステップＳ６５）ノード決定部１５０は、Ｄｅｌｅｔｅ要求に含まれるキー（ｋｅｙ）に対応するデータ（ｖａｌｕｅ）をディスク装置２００のデータストア２１０から取得する。例えば、キー“ｋｅｙ０１”に対してデータ“ｐｏｉｎｔｅｒ０１”を取得する。
【０１００】
（ステップＳ６６）ノード決定部１５０は、データ（ｖａｌｕｅ）がポインタキーであるか否かを判定する。データがポインタキーでない場合、処理をステップＳ６７に進める。データがポインタキーである場合、処理をステップＳ６８に進める。データがポインタキーであるか否かは、図１３のステップＳ５６と同様にして判断できる。
【０１０１】
（ステップＳ６７）ノード決定部１５０は、ステップＳ６５で取得したデータの削除を、ディスクＩ／Ｏ部１３０に指示する。ディスクＩ／Ｏ部１３０は、データストア２１０から、当該（ｋｅｙ，ｖａｌｕｅ，ｆｌａｇ）の組を削除する。ノード決定部１５０は、ディスクＩ／Ｏ部１３０による削除結果をクライアント３００に応答する。そして、処理を終了する。
【０１０２】
（ステップＳ６８）ノード決定部１５０は、記憶部１１０に記憶されたポインタ管理テーブル１１２を参照し、ステップＳ６５でデータ（ｖａｌｕｅ）として取得したポインタキーに基づいて、投入先ノードを特定する。例えば、ポインタキー“ｐｏｉｎｔｅｒ０１”であれば、投入先ノードはストレージノード１００ａ（ラベル“Ｂ”）である。
【０１０３】
（ステップＳ６９）ノード決定部１５０は、ポインタキーをキーとして指定して、投入先ノードにデータ（ｖａｌｕｅ）の削除要求をするように他ノードアクセス部１６０に依頼する。他ノードアクセス部１６０は、当該依頼に応じたＤｅｌｅｔｅ要求を生成し、ネットワークＩ／Ｏ部１２０を介して投入先ノードに送信して、投入先ノードにポインタキーと対応付けられたデータを削除させる。例えば、他ノードアクセス部１６０は、キー“ｐｏｉｎｔｅｒ０１”を指定したＤｅｌｅｔｅ要求をストレージノード１００ａに送信する。すると、ストレージノード１００ａのデータストア２１０ａから（ｋｅｙ，ｖａｌｕｅ，ｆｌａｇ）の組（“ｐｏｉｎｔｅｒ０１”，“ｖａｌｕｅ０１”，“ｆａｌｓｅ”）が削除される。他ノードアクセス部１６０は、投入先ノードから削除結果を受信する。
【０１０４】
（ステップＳ７０）ノード決定部１５０は、ステップＳ６５で取得したポインタキーのレコードをポインタ管理テーブル１１２から削除する。ノード決定部１５０は、当該ポインタキーの削除を、ディスクＩ／Ｏ部１３０に指示する。ディスクＩ／Ｏ部１３０は、データストア２１０から、当該（ｋｅｙ，ｖａｌｕｅ，ｆｌａｇ）の組を削除する。例えば、データストア２１０から（“ｋｅｙ０１”，“ｐｏｉｎｔｅｒ０１”，“ｔｒｕｅ”）の組が削除される。
【０１０５】
このようにして、ストレージノード１００は、Ｄｅｌｅｔｅ要求に含まれるキーに対し、データストア２１０からポインタキーを取得した場合、ポインタキーに基づいて投入先ノードを特定する。そして、当該ポインタキーに対応付けたデータを投入先ノードに削除させ、ストレージノード１００自身が保持するポインタキーも削除する。
【０１０６】
以上のように第２の実施の形態のストレージノード１００，１００ａ，１００ｂは、キーから算出されるハッシュ値により担当ノードが決定される場合でも、データの代わりに、キーと対応付けたポインタキーを担当ノードに格納する。そして、ポインタキーと対応付けたデータの実体を他のノードに配置する。これにより、データ配置の制限を緩和できる。
【０１０７】
例えば、ポインタキーは単にリンクを示す情報であるため、データの実体よりもデータサイズが小さい可能性が高い。このため、担当ノードの空き容量が少ないときにデータの実体を他のノードに配置すれば、データ量の偏りを分散できる。また、例えば、担当ノードの負荷が大きい時に、データの実体を他のノードに配置すれば、負荷を分散することもできる。
【０１０８】
更に、データの実体を投入する他のノード（投入先ノード）の選択方法として、運用に応じた基準を選択できる。例えば、データ量を分散したい場合や、負荷を分散したい場合など、目的ごとに種々の基準が考えられる。これにより、ストレージノード１００，１００ａ，１００ｂにおけるデータ量の分散や負荷の分散を一層容易に行える。
【０１０９】
なお、データ（ｖａｌｕｅ）の設定内容がポインタキーであるかを判断する方法としてフラグを用いたが別の方法を用いてもよい。例えば、ポインタキーが予め所定の文字列を含むことを定義しておけば、当該文字列を含むか否かに応じて、データ（ｖａｌｕｅ）がポインタキーであるか否かを判断できる。
【０１１０】
［第３の実施の形態］
以下、第３の実施の形態を説明する。前述の第２の実施の形態との相違点を主に説明し、同様の事項は説明を省略する。
【０１１１】
第２の実施の形態では、担当ノードや投入先ノードの判断をストレージノード１００，１００ａ，１００ｂが実行するものとした。一方、クライアント３００，３００ａが当該判断を行ってもよい。そこで、第３の実施の形態では、クライアント３００，３００ａが当該判断を行う場合を例示する。
【０１１２】
ここで、第３の実施の形態の分散ストレージシステムの構成は、図２で説明した第２の実施の形態の分散ストレージシステムの構成と同様である。また、第３の実施の形態のストレージノードおよびクライアントのハードウェア例は、図３で説明した第２の実施の形態のストレージノード１００のハードウェア例と同様である。第３の実施の形態では、特に断らない限り、第２の実施の形態で用いた符号・名称と同一の符号・名称により、同一の構成を指し示すものとする。ただし、第３の実施の形態では、各装置のソフトウェア例が第２の実施の形態とは異なる。
【０１１３】
図１５は、第３の実施の形態のソフトウェア例を示すブロック図である。図１５に示すユニットの一部または全部は、ストレージノード１００，１００ａ，１００ｂおよびクライアント３００，３００ａが実行するプログラムのモジュールであってもよい。図１５に示すユニットの一部または全部は、ＦＰＧＡやＡＳＩＣなどの電子回路であってもよい。ストレージノード１００ａ，１００ｂもストレージノード１００と同様のユニットを用いて実装できる。クライアント３００ａもクライアント３００と同様のユニットを用いて実装できる。
【０１１４】
ストレージノード１００は、記憶部１１０ａ、ネットワークＩ／Ｏ部１２０ａ、ディスクＩ／Ｏ部１３０ａおよびアクセス受付部１４０ａを有する。
記憶部１１０ａは、担当管理テーブル１１１を記憶する。
【０１１５】
ネットワークＩ／Ｏ部１２０ａは、クライアント３００，３００ａから受信したデータをアクセス受付部１４０ａに出力する。ネットワークＩ／Ｏ部１２０ａは、アクセス受付部１４０ａから取得したデータをクライアント３００，３００ａに送信する。クライアント３００，３００ａとの通信を中継する。
【０１１６】
ディスクＩ／Ｏ部１３０ａは、アクセス受付部１４０ａから取得したデータをディスク装置２００へ書込む。ディスクＩ／Ｏ部１３０ａは、アクセス受付部１４０ａからの指示に応じて、ディスク装置２００からデータを読出し、アクセス受付部１４０ａに出力する。
【０１１７】
アクセス受付部１４０ａは、クライアント３００，３００ａによるデータアクセスを受け付け、アクセス内容に応じて、ディスク装置２００に対するデータの書込み、読出し、削除などを実行する。また、アクセス受付部１４０ａは、クライアント３００，３００ａからの担当ノードの問い合わせに応じて、記憶部１１０ａに記憶された担当管理テーブル１１１を参照し、担当ノードを応答する。
【０１１８】
クライアント３００は、記憶部３１０ａ、ネットワークＩ／Ｏ部３２０ａおよびアクセス部３３０ａを有する。
記憶部３１０ａは、ポインタ管理テーブルを記憶する。ポインタ管理テーブルの例は、図７で説明した第２の実施の形態のポインタ管理テーブル１１２と同様である。
【０１１９】
ネットワークＩ／Ｏ部３２０ａは、アクセス部３３０ａから取得したアクセス要求をストレージノード１００，１００ａ，１００ｂの何れか（例えば、ストレージノード１００）に送信する。ネットワークＩ／Ｏ部３２０ａは、当該アクセス要求に対するストレージノード１００，１００ａ，１００ｂからの応答を受信し、アクセス部３３０ａに出力する。
【０１２０】
アクセス部３３０ａは、所定のアプリケーションによるデータアクセスに応じて、アクセス要求を生成し、ネットワークＩ／Ｏ部３２０ａに出力する。当該アクセス要求には、Ｗｒｉｔｅ要求、Ｒｅａｄ要求およびＤｅｌｅｔｅ要求が含まれる。アクセス部３３０ａは、各アクセス要求にアクセス対象のデータに対するキー（ｋｅｙ）を含める。キーは、例えば、アプリケーションにより指定される。アクセス部３３０ａにデータアクセスを行わせるアプリケーションは、図１５では図示を省略している。当該アプリケーションは、クライアント３００上で、例えばクライアント３００が実行するプログラムにより実装されるものでもよいし、他の情報処理装置上に実装されるものでもよい。
【０１２１】
ここで、アクセス部３３０ａは、ストレージノード１００，１００ａ，１００ｂの何れかに担当ノードを問い合わせて、キーから算出されるハッシュ値を担当する担当ノードを判断できる。アクセス部３３０ａは、データのＷｒｉｔｅ時には、担当ノードの利用状況に応じて、データの実体を格納する投入先ノードを決定する。アクセス部３３０ａは、担当ノード以外のノードを投入先ノードとして決定した場合、当該投入先ノードへリンクするためのポインタキーを生成し、担当ノードには、キーと対応付けたポインタキーを格納する。そして、アクセス部３３０ａは、ポインタキーと対応付けたデータの実体を投入先ノードに格納する。担当ノードを投入先ノードとする場合は、当該担当ノードに指定されたキーと対応付けたデータを格納する。
【０１２２】
また、アクセス部３３０ａは、データのＲｅａｄ時には、指定されたキーに対して担当ノードから読出したデータがポインタキーである場合、記憶部３１０ａに記憶されたポインタ管理テーブルに基づいて、投入先ノードを判断する。アクセス部３３０ａは、ポインタキーに対するデータを投入先ノードから取得して、要求元のアプリケーションに出力する。担当ノードから読出したデータがポインタキーである場合、要求元のアプリケーションに当該データを出力する。
【０１２３】
更に、アクセス部３３０ａは、データのＤｅｌｅｔｅ時には、指定されたキーに対して担当ノードに格納されたデータがポインタキーである場合、記憶部３１０ａに記憶されたポインタ管理テーブルに基づいて、投入先ノードを判断する。アクセス部３３０ａは、ポインタキーに対するデータを投入先ノードに削除させる。指定されたキーに対して担当ノードに格納されたデータがポインタキーでない場合、担当ノードに当該データを削除させる。
【０１２４】
なお、第３の実施の形態のクライアント３００は、第１の実施の形態の情報処理装置１の一例である。アクセス部３３０ａは、制御部１ｂの一例である。
図１６は、第３の実施の形態のＷｒｉｔｅ処理を示すフローチャートである。以下、図１６に示す処理をステップ番号に沿って説明する。
【０１２５】
（ステップＳ７１）アクセス部３３０ａは、所定のアプリケーションによるデータのＷｒｉｔｅ依頼を受け付ける。Ｗｒｉｔｅ依頼には、キーとデータとが含まれる。例えば、Ｗｒｉｔｅ依頼には、キー“ｋｅｙ０１”およびデータ“ｖａｌｕｅ０１”が含まれる。
【０１２６】
（ステップＳ７２）アクセス部３３０ａは、Ｗｒｉｔｅ依頼に含まれるキーに基づいてハッシュ値を計算する。アクセス部３３０ａは、当該ハッシュ値を担当する担当ノードをストレージノード１００に問い合わせる。
【０１２７】
（ステップＳ７３）アクセス部３３０ａは、データの実体を投入する投入先ノードを決定するか否かを判定する。決定する場合、処理をステップＳ７４に進める。決定しない場合、処理をステップＳ７６に進める。アクセス部３３０ａは、投入先ノードを決定するか否かを、例えば、次の（１）（２）の何れかの基準により判断できる。（１）ディスク装置２００の空き容量が所定値よりも小さい。（２）投入するデータのサイズが閾値よりも大きい。ただし、他の基準を用いてもよい。このような基準を判断するために、アクセス部３３０ａは、例えば定期的にストレージノード１００，１００ａ，１００ｂから利用状況（空き容量など）を取得しておく。あるいは、ステップＳ７３を実行する際に、担当ノードから利用状況を取得してもよい。
【０１２８】
（ステップＳ７４）アクセス部３３０ａは、所定の基準に基づいて、投入先ノードを決定する。その手順は、図１１で説明した第２の実施の形態の投入先ノード決定処理の手順と同様である。ただし、ノード決定部１５０が実行する処理をアクセス部３３０ａが実行する。
【０１２９】
（ステップＳ７５）アクセス部３３０ａは、ステップＳ７２で取得した担当ノードと、ステップＳ７４で決定した投入先ノードとが同一であるか否かを判定する。同一である場合、処理をステップＳ７６に進める。同一でない場合、処理をステップＳ７７に進める。
【０１３０】
（ステップＳ７６）アクセス部３３０ａは、指定されたキーと対応付けたデータの書込みを要求するＷｒｉｔｅ要求を生成して、担当ノードに送信する。担当ノードは、Ｗｒｉｔｅ要求に応じて、自身に接続されたディスク装置に（ｋｅｙ，ｖａｌｕｅ，ｆｌａｇ）の組を書込む。キー（ｋｅｙ）は、アプリケーションにより指定されたキーである。フラグ（ｆｌａｇ）は“ｆａｌｓｅ”である。例えば、担当ノードがストレージノード１００であれば、データストア２１０に（“ｋｅｙ０１”，“ｖａｌｕｅ０１”，“ｆａｌｓｅ”）が書込まれる。アクセス部３３０ａは、担当ノードから書込み完了の応答を受け付けると、依頼元のアプリケーションに対して書込み完了を通知する。そして、処理を終了する。
【０１３１】
（ステップＳ７７）アクセス部３３０ａは、ポインタキー（ｐｏｉｎｔｅｒ  ｋｅｙ）を求める。その手順は、図１２で説明した第２の実施の形態のポインタキー決定処理の手順と同様である。ただし、ノード決定部１５０が実行する処理をアクセス部３３０ａが実行する。例えば、ポインタキー“ｐｏｉｎｔｅｒ０１”が求められる。
【０１３２】
（ステップＳ７８）アクセス部３３０ａは、ポインタキーとＷｒｉｔｅ対象のデータ（ｖａｌｕｅ）とのペアの書込みを投入先ノードに格納させる。例えば、キー（ｋｅｙ）としてポインタキーを指定してデータ（ｖａｌｕｅ）の書込みを要求するＷｒｉｔｅ要求を生成して、投入先ノードに送信する。投入先ノードは、指定された（ｋｅｙ，ｖａｌｕｅ，ｆｌａｇ）の組を自身に接続されたディスク装置に格納する。ここで、フラグ（ｆｌａｇ）は、“ｆａｌｓｅ”である。例えば、投入先ノードがストレージノード１００ａである場合、データストア２１０ａに、（“ｐｏｉｎｔｅｒ０１”，“ｖａｌｕｅ０１”，“ｆａｌｓｅ”）の組が書込まれる。アクセス部３３０ａは、投入先ノードから書込み結果の応答を受信する。アクセス部３３０ａは、書込み依頼したポインタキーと投入先ノードのラベルとを対応付けて、記憶部３１０ａに記憶されたポインタ管理テーブルに記録する。
【０１３３】
（ステップＳ７９）アクセス部３３０ａは、キーとポインタキーとのペアの書込みを担当ノードに依頼する。例えば、キー（ｋｅｙ）として、アプリケーションから指定されたキーを指定し、データ（ｖａｌｕｅ）としてポインタキーを指定してＷｒｉｔｅ要求を生成して、担当ノードに送信する。担当ノードは、指定された（ｋｅｙ，ｖａｌｕｅ，ｆｌａｇ）の組を自身に接続されたディスク装置に格納する。ここで、フラグ（ｆｌａｇ）は、“ｔｒｕｅ”である。例えば、担当ノードがストレージノード１００である場合、データストア２１０に、（“ｋｅｙ０１”，“ｐｏｉｎｔｅｒ０１”、“ｖａｌｕｅ０１”）の組が書込まれる。アクセス部３３０ａは、担当ノードから書込み結果の応答を受信する。すると、アクセス部３３０ａは、依頼元のアプリケーションに書込み完了を通知する。
【０１３４】
このように、クライアント３００は、データの実体を担当ノード以外の投入先ノードに配置できる。その場合、クライアント３００は、データの実体の代わりに、他のノードへのリンクを示すポインタキーを担当ノードに格納させる。そして、投入先ノードには、当該ポインタキーと対応付けたデータの実体を格納させる。
【０１３５】
なお、ステップＳ７３では、データの投入先ノードを再決定するか否かの基準（１）（２）を例示したが、他の基準により判断してもよい。例えば、担当ノードの負荷を示す指標（例えば、ＣＰＵ利用率やアクセス数など）が所定期間、連続して所定値よりも大きい場合に、投入先ノードを決定するようにしてもよい。
【０１３６】
図１７は、第３の実施の形態のＲｅａｄ処理を示すフローチャートである。以下、図１７に示す処理をステップ番号に沿って説明する。
（ステップＳ８１）アクセス部３３０ａは、所定のアプリケーションによるデータのＲｅａｄ依頼を受け付ける。Ｒｅａｄ依頼には、キーが含まれる。例えば、Ｒｅａｄ依頼には、キー“ｋｅｙ０１”が含まれる。
【０１３７】
（ステップＳ８２）アクセス部３３０ａは、Ｒｅａｄ依頼に含まれるキーに基づいてハッシュ値を計算する。アクセス部３３０ａは、当該ハッシュ値を担当する担当ノードをストレージノード１００に問い合わせる。
【０１３８】
（ステップＳ８３）アクセス部３３０ａは、Ｒｅａｄ依頼に含まれるキー（ｋｅｙ）に対するデータ（ｖａｌｕｅ）およびフラグ（ｆｌａｇ）を担当ノードから取得する。例えば、担当ノードがストレージノード１００である場合に、キー“ｋｅｙ０１”に対するデータ“ｐｏｉｎｔｅｒ０１”およびフラグ“ｔｒｕｅ”を取得する。
【０１３９】
（ステップＳ８４）アクセス部３３０ａは、データ（ｖａｌｕｅ）がポインタキーであるか否かを判定する。データがポインタキーでない場合、処理をステップＳ８５に進める。データがポインタキーである場合、処理をステップＳ８６に進める。データがポインタキーであるか否かは、ステップＳ８３で取得したフラグ（ｆｌａｇ）に基づいて判定できる。フラグが“ｔｒｕｅ”であれば、ポインタキーである。フラグが“ｆａｌｓｅ”であれば、ポインタキーでない。例えば、ステップＳ８３で取得したフラグは“ｔｒｕｅ”なので、データ“ｐｏｉｎｔｅｒ０１”はポインタキーである。
【０１４０】
（ステップＳ８５）アクセス部３３０ａは、ステップＳ８３で取得したデータを依頼元のアプリケーションに応答する。そして、処理を終了する。
（ステップＳ８６）アクセス部３３０ａは、記憶部３１０ａに記憶されたポインタ管理テーブルを参照し、ステップＳ８３でデータ（ｖａｌｕｅ）として取得したポインタキーに基づいて、投入先ノードを特定する。例えば、ポインタキー“ｐｏｉｎｔｅｒ０１”に対する投入先ノードとして、ストレージノード１００ａ（ラベル“Ｂ”）を特定する。
【０１４１】
（ステップＳ８７）アクセス部３３０ａは、ポインタキーをキーとして指定して、投入先ノードからデータ（ｖａｌｕｅ）を取得する。例えば、投入先ノードがストレージノード１００ａである場合に、キー”ｐｏｉｎｔｅｒ０１”に対するデータ“ｖａｌｕｅ０１”を取得する。
【０１４２】
（ステップＳ８８）アクセス部３３０ａは、投入先ノードから取得したデータを依頼元のアプリケーションに応答する。
このように、クライアント３００は、Ｒｅａｄ依頼に含まれるキーに対し、担当ノードからポインタキーを取得した場合、ポインタキーに基づいて投入先ノードを特定する。そして、当該ポインタキーに対応付けたデータを投入先ノードから取得し、依頼元のアプリケーションに応答する。
【０１４３】
図１８は、第３の実施の形態のＤｅｌｅｔｅ処理を示すフローチャートである。以下、図１８に示す処理をステップ番号に沿って説明する。
（ステップＳ９１）アクセス部３３０ａは、所定のアプリケーションによるデータのＤｅｌｅｔｅ依頼を受け付ける。Ｄｅｌｅｔｅ依頼には、キーが含まれる。例えば、Ｄｅｌｅｔｅ依頼には、キー“ｋｅｙ０１”が含まれる。
【０１４４】
（ステップＳ９２）アクセス部３３０ａは、Ｄｅｌｅｔｅ依頼に含まれるキーに基づいてハッシュ値を計算する。アクセス部３３０ａは、当該ハッシュ値を担当する担当ノードをストレージノード１００に問い合わせる。
【０１４５】
（ステップＳ９３）アクセス部３３０ａは、Ｄｅｌｅｔｅ依頼に含まれるキー（ｋｅｙ）に対するデータ（ｖａｌｕｅ）およびフラグ（ｆｌａｇ）を担当ノードから取得する。例えば、担当ノードがストレージノード１００である場合に、キー“ｋｅｙ０１”に対するデータ“ｐｏｉｎｔｅｒ０１”およびフラグ“ｔｒｕｅ”を取得する。
【０１４６】
（ステップＳ９４）アクセス部３３０ａは、データ（ｖａｌｕｅ）がポインタキーであるか否かを判定する。データがポインタキーでない場合、処理をステップＳ９５に進める。データがポインタキーである場合、処理をステップＳ９６に進める。データがポインタキーであるか否かは、ステップＳ９３で取得したフラグ（ｆｌａｇ）に基づいて判定できる。フラグが“ｔｒｕｅ”であれば、ポインタキーである。フラグが“ｆａｌｓｅ”であれば、ポインタキーでない。例えば、ステップＳ９３で取得したフラグは“ｔｒｕｅ”なので、データ“ｐｏｉｎｔｅｒ０１”はポインタキーである。
【０１４７】
（ステップＳ９５）アクセス部３３０ａは、指定されたキーと対応付けたデータの削除を要求するＤｅｌｅｔｅ要求を生成して、担当ノードに送信する。担当ノードは、Ｄｅｌｅｔｅ要求に応じて、自身に接続されたディスク装置から（ｋｅｙ，ｖａｌｕｅ，ｆｌａｇ）の組を削除する。キー（ｋｅｙ）は、アプリケーションにより指定されたキーである。アクセス部３３０ａは、担当ノードから削除完了の応答を受け付けると、依頼元のアプリケーションに対して削除完了を通知する。そして、処理を終了する。
【０１４８】
（ステップＳ９６）アクセス部３３０ａは、記憶部３１０ａに記憶されたポインタ管理テーブルを参照し、ステップＳ９３でデータ（ｖａｌｕｅ）として取得したポインタキーに基づいて、投入先ノードを特定する。例えば、ポインタキー“ｐｏｉｎｔｅｒ０１”に対する投入先ノードとして、ストレージノード１００ａ（ラベル“Ｂ”）を特定する。
【０１４９】
（ステップＳ９７）アクセス部３３０ａは、ポインタキーに対応付けたデータの削除を投入先ノードに依頼する。例えば、キー（ｋｅｙ）としてポインタキーを指定して、データ（ｖａｌｕｅ）の削除を依頼するＤｅｌｅｔｅ要求を生成して、投入先ノードに送信する。投入先ノードは、指定された（ｋｅｙ，ｖａｌｕｅ，ｆｌａｇ）の組を自身に接続されたディスク装置から削除する。例えば、投入先ノードがストレージノード１００ａである場合、データストア２１０ａから（“ｐｏｉｎｔｅｒ０１”，“ｖａｌｕｅ０１”，“ｆａｌｓｅ”）の組が削除される。アクセス部３３０ａは、投入先ノードから削除結果の応答を受信する。
【０１５０】
（ステップＳ９８）アクセス部３３０ａは、ステップＳ９３で取得したポインタキーのレコードを記憶部３１０ａに記憶されたポインタ管理テーブル１１２から削除する。アクセス部３３０ａは、ポインタキーの削除を担当ノードに依頼する。例えば、アプリケーションから指定されたキーを指定して、データ（ｖａｌｕｅ）として格納されたポインタキーの削除を依頼するＤｅｌｅｔｅ要求を生成して、担当ノードに送信する。担当ノードは、指定された（ｋｅｙ，ｖａｌｕｅ，ｆｌａｇ）の組を自身に接続されたディスク装置から削除する。例えば、担当ノードがストレージノード１００である場合、データストア２１０から（“ｋｅｙ０１”，“ｐｏｉｎｔｅｒ０１”，“ｔｒｕｅ”）の組が削除される。アクセス部３３０ａは、担当ノードから削除完了の応答を受け付けると、依頼元のアプリケーションに対して削除完了を通知する。
【０１５１】
以上のように第３の実施の形態のクライアント３００，３００ａは、キーから算出されるハッシュ値により担当ノードが決定される場合でも、データの代わりに、キーと対応付けたポインタキーを担当ノードに格納する。そして、ポインタキーと対応付けたデータの実体を他のノードに配置する。これにより、データ配置の制限を緩和できる。
【０１５２】
例えば、ポインタキーは単にリンクを示す情報であるため、データの実体よりもデータサイズが小さい可能性が高い。このため、担当ノードの空き容量が少ないときにデータの実体を他のノードに配置すれば、データ量の偏りを分散できる。また、例えば、担当ノードの負荷が大きい時に、データの実体を他のノードに配置すれば、負荷を分散することもできる。
【０１５３】
更に、データの実体を投入する他のノード（投入先ノード）の選択方法として、運用に応じた基準を選択できる。例えば、第２の実施の形態で説明したように、データ量を分散したい場合や、負荷を分散したい場合など、目的ごとに種々の基準が考えられる。これにより、ストレージノード１００，１００ａ，１００ｂにおけるデータ量の分散や負荷の分散を一層容易に行える。
【０１５４】
なお、データ（ｖａｌｕｅ）の設定内容がポインタキーであるかを判断する方法としてフラグを用いたが別の方法を用いてもよい。例えば、ポインタキーが予め所定の文字列を含むことを定義しておけば、当該文字列を含むか否かに応じて、データ（ｖａｌｕｅ）がポインタキーであるか否かを判断できる。
【０１５５】
更に、第２，第３の実施の形態では、１つのストレージノードにデータを格納する例を示したが、複数のストレージノードに同一のデータを格納する場合にも同じ方法を利用できる。
【符号の説明】
【０１５６】
１  情報処理装置
１ａ  記憶部
１ｂ  制御部
２  第１のノード
２ａ  第２のノード
【図１】
2013045379.tif 000003
【図２】
2013045379.tif 000004
【図３】
2013045379.tif 000005
【図４】
2013045379.tif 000006
【図５】
2013045379.tif 000007
【図６】
2013045379.tif 000008
【図７】
2013045379.tif 000009
【図８】
2013045379.tif 000010
【図９】
2013045379.tif 000011
【図１０】
2013045379.tif 000012
【図１１】
2013045379.tif 000013
【図１２】
2013045379.tif 000014
【図１３】
2013045379.tif 000015
【図１４】
2013045379.tif 000016
【図１５】
2013045379.tif 000017
【図１６】
2013045379.tif 000018
【図１７】
2013045379.tif 000019
【図１８】
2013045379.tif 000020