"データとそのデータに対応するキーのセットを格納する複数のストレージサーバと、前記ストレージサーバにデータを書き込むストレージライタと、一意のインデックスとそれに対応する一以上の前記キーのリストの組を有するファイルシステム生成部と、を含み、前記キーが前記複数のストレージサーバのいずれに格納されているかを、表もしくはアルゴリズムによって示すストレージシステムであって、前記ストレージライタは、前記インデックスによって特定される書込対象のデータのハッシュ値をハッシュ関数により計算し、計算したハッシュ値をキーとし、前記表もしくはアルゴリズムによって特定された書込先のストレージサーバに書込対象のデータに対応するキーがまだ書き込まれていない場合、書込対象のデータとキーとのセットを書き込み、書込先のストレージサーバに書込対象のデータに対応するキーが書き込まれている場合、書込対象のデータとキーとのセットの書き込みをスキップすることを特徴とする、ストレージシステム。前記ストレージサーバからデータを読み込むストレージリーダをさらに有し、前記ストレージリーダは、前記インデックスによって特定される読込対象のキーのリストを取得し、前記表もしくはアルゴリズから特定された読込先のストレージサーバから、キーに対応する読込対象のデータを読み込むと共に、読込対象のデータとキーとのセットをキャッシュメモリにキャッシュし、以降の読込対象のデータに対応するキーが前記キャッシュメモリにキャッシュされている場合、該キーに対応する読込対象のデータを前記キャッシュメモリから読み込むことを特徴とする、請求項1に記載のストレージシステム。前記ストレージサーバに書き込むデータのデータ長は、予め決められており、前記ストレージライタは、前記インデックスによって特定された書込対象のデータを予め決められたデータ長に分割し、分割した各分割データについて、該分割データとキーとのセットを書込先のストレージサーバに書き込み、前記インデックスに対応するリストとして、分割したデータに対応するキーのリストを格納し、前記ストレージリーダは、前記インデックスによって特定された読込対象のデータを予め決められたデータ長に分割し、分割した各分割データについて、読込先のストレージサーバから各分割データを読み込み、読み込んだ各分割データを結合して読込対象のデータを得る、請求項2に記載のストレージシステム。前記複数のストレージサーバを監視する監視部をさらに有し、前記監視部は、前記ストレージサーバに格納されているデータのレプリカの数を確認する機能と、そのレプリカの数が指定された値に満たない場合、前記ストレージサーバにレプリカを作ることを指示する機能と、前記複数のストレージサーバに対して、定期的に、該ストレージサーバに書き込まれているデータとキーとのセットの対応を確認する機能と、を有し、偽のセットが書き込まれているストレージサーバに対し、他のストレージサーバが、偽のセットを削除して、真のセットを新たに書き込む、請求項1から3のいずれか1項に記載のストレージシステム。データとそのデータに対応するキーのセットを格納する複数のストレージサーバと、前記ストレージサーバにデータを書き込むストレージライタと、一意のインデックスとそれに対応する一以上の前記キーのリストの組を有するファイルシステム生成部と、を含み、前記キーが前記複数のストレージサーバのいずれに格納されているかを、表もしくはアルゴリズムによって示すストレージシステムが行うストレージ制御方法であって、前記ストレージライタが、前記インデックスによって特定される書込対象のデータのハッシュ値をハッシュ関数により計算し、計算したハッシュ値をキーとするステップと、前記ストレージライタが、前記表もしくはアルゴリズムによって特定された書込先のストレージサーバに書込対象のデータに対応するキーがまだ書き込まれていない場合、書込対象のデータとキーとのセットを書き込み、書込先のストレージサーバに書込対象のデータに対応するキーが書き込まれている場合、書込対象のデータとキーとのセットの書き込みをスキップするステップと、を有することを特徴とする、ストレージ制御方法。データとそのデータに対応するキーのセットを格納する複数のストレージサーバと、前記ストレージサーバにデータを書き込むストレージライタと、一意のインデックスとそれに対応する一以上の前記キーのリストの組を有するファイルシステム生成部と、を含み、前記キーが前記複数のストレージサーバのいずれに格納されているかを、表もしくはアルゴリズムによって示すストレージシステムにおいて、前記ストレージライタに、前記インデックスによって特定される書込対象のデータのハッシュ値をハッシュ関数により計算し、計算したハッシュ値をキーとする手順と、前記表もしくはアルゴリズムによって特定された書込先のストレージサーバに書込対象のデータに対応するキーがまだ書き込まれていない場合、書込対象のデータとキーとのセットを書き込み、書込先のストレージサーバに書込対象のデータに対応するキーが書き込まれている場合、書込対象のデータとキーとのセットの書き込みをスキップする手順と、を実行させるためのプログラム。しかしながら、上述した並列KVSとレプリケーションには、それぞれ以下に示すような課題がある。a並列KVSの課題並列KVSでは、各ストレージサーバは、他のストレージサーバがどのようなvalueを保存しているかを知る必要がない。そのため、いくらでもストレージサーバを追加することができるが、各ストレージサーバは、他のストレージサーバが保存しているvalueを知る術を持たないため、まったく同じデータを複数のストレージサーバが保存してしまうことがあり、記憶領域が効率的に利用されていないという課題がある。例えば、ある人がLinuxのインストールディスクをあるストレージサーバに保存したとする。その状態で、別の人が同じインストールディスクを同じストレージシステムに保存しようとする場合、通常のストレージシステムでは、これらのインストールディスクを全く異なるデータである認識して、異なるストレージサーバに二重に保存してしまうことがある。bレプリケーションの課題レプリカを生成する場合、マスターとなるデータが必要となる。そのデータを更新する場合、データとレプリカとの一貫性を確保するために、そのデータと全てのレプリカとの同期を完了させる必要がある。そのため、データを更新する場合は、そのデータに対応するkeyをロックし、同期が完了するまで、そのデータの書き込み読み込みをできないようにしている。しかし、データを更新する度にkeyをロックし、同期が完了するまで、そのデータの書き込み読み込みを待っていると、速度パフォーマンスが低下するという課題がある。そこで、本発明の目的は、上述した課題を解決することができるストレージシステム、ストレージ制御方法、プログラムを提供することにある。本発明のストレージシステムは、データとそのデータに対応するキーのセットを格納する複数のストレージサーバと、前記ストレージサーバにデータを書き込むストレージライタと、一意のインデックスとそれに対応する一以上の前記キーのリストの組を有するファイルシステム生成部と、を含み、前記キーが前記複数のストレージサーバのいずれに格納されているかを、表もしくはアルゴリズムによって示すストレージシステムであって、前記ストレージライタは、前記インデックスによって特定される書込対象のデータのハッシュ値をハッシュ関数により計算し、計算したハッシュ値をキーとし、前記表もしくはアルゴリズムによって特定された書込先のストレージサーバに書込対象のデータに対応するキーがまだ書き込まれていない場合、書込対象のデータとキーとのセットを書き込み、書込先のストレージサーバに書込対象のデータに対応するキーが書き込まれている場合、書込対象のデータとキーとのセットの書き込みをスキップすることを特徴とする。本発明のストレージ制御方法は、データとそのデータに対応するキーのセットを格納する複数のストレージサーバと、前記ストレージサーバにデータを書き込むストレージライタと、一意のインデックスとそれに対応する一以上の前記キーのリストの組を有するファイルシステム生成部と、を含み、前記キーが前記複数のストレージサーバのいずれに格納されているかを、表もしくはアルゴリズムによって示すストレージシステムが行うストレージ制御方法であって、前記ストレージライタが、前記インデックスによって特定される書込対象のデータのハッシュ値をハッシュ関数により計算し、計算したハッシュ値をキーとするステップと、前記ストレージライタが、前記表もしくはアルゴリズムによって特定された書込先のストレージサーバに書込対象のデータに対応するキーがまだ書き込まれていない場合、書込対象のデータとキーとのセットを書き込み、書込先のストレージサーバに書込対象のデータに対応するキーが書き込まれている場合、書込対象のデータとキーとのセットの書き込みをスキップするステップと、を有することを特徴とする。本発明のプログラムは、データとそのデータに対応するキーのセットを格納する複数のストレージサーバと、前記ストレージサーバにデータを書き込むストレージライタと、一意のインデックスとそれに対応する一以上の前記キーのリストの組を有するファイルシステム生成部と、を含み、前記キーが前記複数のストレージサーバのいずれに格納されているかを、表もしくはアルゴリズムによって示すストレージシステムにおいて、前記ストレージライタに、前記インデックスによって特定される書込対象のデータのハッシュ値をハッシュ関数により計算し、計算したハッシュ値をキーとする手順と、前記表もしくはアルゴリズムによって特定された書込先のストレージサーバに書込対象のデータに対応するキーがまだ書き込まれていない場合、書込対象のデータとキーとのセットを書き込み、書込先のストレージサーバに書込対象のデータに対応するキーが書き込まれている場合、書込対象のデータとキーとのセットの書き込みをスキップする手順と、を実行させる。本発明によれば、ストレージシステムにおいて、記憶領域を効率的に利用することができると共に、速度パフォーマンスの向上を図ることができるという効果が得られる。以下に、本発明を実施するための形態について図面を参照して説明する。1本実施形態の構成1-1ストレージシステム図1に示すように、本実施形態のストレージシステムは、ストレージファーム10と、ストレージライタ20と、ストレージリーダ30と、監視部40と、ファイルシステム生成部50と、を有している。また、ストレージファーム10は、複数のストレージサーバ11から構成されている。なお、ストレージライタ20、ストレージリーダ30、監視部40、およびファイルシステム生成部50の数は、図1に示した数に限定されない。また、ストレージサーバ11の数も、図1に示した数に限定されず、複数であれば良い。1-2ストレージファーム10各ストレージサーバ11は、keyvalueのセットを保存するものであり、各ストレージサーバ11は、ストレージリーダ30およびストレージライタ20からアクセスされ、また、監視部40から監視される。ストレージサーバ11は、例えば、以下の機能を備える。すなわち、ストレージサーバ11は、外部からkeyvalueのセットが与えられると、そのセットを保存する機能を備える。また、ストレージサーバ11は、外部からkeyが与えられると、そのkeyに対応するvalueを返す機能を備える。また、ストレージサーバ11は、外部からkeyが与えられると、そのkeyを保存しているか否かの情報を返す機能を備える。また、ストレージサーバ11は、外部からの指示を受けて、keyHashvalueであるか否かを確認し、その真偽の情報を返す機能を備える。なお、hashは、暗号学的に安全衝突困難性を有するなハッシュ関数である例えば、SHA256など。また、ハッシュ関数により計算された値はハッシュ値と称される。また、ストレージサーバ11は、外部から指示されたkeyvalueのセットを削除する機能を備える。1-3ストレージライタ20ストレージライタ20は、ファイルシステム生成部50から書き込み指示を受けて、ストレージファーム10にkeyvalueのセットを書き込むものであり、例えば、以下の機能を備える。すなわち、ストレージライタ20は、ファイルシステム生成部50から書き込み指示を受けた書込対象のデータbit列を、予め決められたbit長のvalueiに分割し、keyiHashvalueiを計算する機能を備える。また、ストレージライタ20は、keyiとストレージサーバ11とを対応付ける表またはアルゴリズムを有しており、ストレージファーム10内のストレージサーバ11の中から、上述した表またはアルゴリズムを用いて、keyivalueiのセットの書込先のストレージサーバ11を特定し、特定したストレージサーバ11にkeyivalueiのセットを書き込む機能を備える。また、ストレージライタ20は、keyivalueiのセットを書き込む前に、書込先のストレージサーバ11に対し、keyiが書き込まれているか否かを確認し、keyiが書き込まれている場合は、keyivalueiのセットの書き込みをスキップする機能を備える。また、ストレージライタ20は、keyiのリストを生成し、ファイルシステム生成部50に返す機能を備える。1-4ストレージリーダ30ストレージリーダ30は、ファイルシステム生成部50から読み込み指示を受けて、ストレージファーム10からvalueを読み込み、ファイルシステム生成部50に返すものであり、例えば、以下の機能を備える。すなわち、ストレージリーダ30は、keyとストレージサーバ11とを対応付ける表またはアルゴリズムを有しており、ストレージファーム10内のストレージサーバ11の中から、上述した表またはアルゴリズムを用いて、ファイルシステム生成部50から読み込み指示を受けたkeyリストの各keyに対応するvalueを読み込む読込先のストレージサーバ11を特定する機能を備える。また、ストレージリーダ30は、keyの列に対応するvalueの列をそれぞれkey毎に読込先のストレージサーバ11から読み込み、valueの列を結合してファイルシステム生成部50に返す機能を備える。また、ストレージリーダ30は、ストレージファーム10から読み込んだvalueを、keyとセットで不図示のキャッシュメモリにキャッシュしておく機能を備える。1-5監視部40監視部40は、ストレージファーム10内の個々のストレージサーバ11を監視するものであり、例えば、以下の機能を備える。すなわち、監視部40は、ストレージファーム10内の個々のストレージサーバ11が動作しているか否かを監視する機能を備える。また、監視部40は、ストレージサーバ11に書き込まれているデータのレプリカの数を確認する機能を備える。また、監視部40は、上記で確認したレプリカの数が指定された数に満たない場合、そのストレージサーバ11に対し、レプリカの作成と、他のストレージサーバ11へのレプリカの書き込みとを指示する機能を備える。また、監視部40は、元のデータが書き込まれているストレージサーバ11と、そのデータのレプリカが書き込まれているストレージサーバ11とに対し、定期的に、そのストレージサーバ11に書き込まれているkeyvalueのについて、keyHashvalueであるか否かの真偽を問い合わせる機能を備える。もし、偽のセットが書き込まれているストレージサーバ11がある場合、そのストレージサーバ11に対し、他のストレージサーバ11が、偽のセットを削除して、真のセットを新たに書き込むことになる。1-6ファイルシステム生成部50ファイルシステム生成部50は、通常のファイルシステムが備える機能に加えて、以下の機能を備える。すなわち、ファイルシステム生成部50は、自己のファイルシステム内で一意のインデックスと、keyリストと、を対応付けて管理する機能を備える。また、ファイルシステム生成部50は、書込対象のデータをストレージライタ20に送信し、そのデータに対応するkeyリストを受け取る機能を備える。また、ファイルシステム生成部50は、インデックスに対応するkeyのkeyリストをストレージリーダ30に送信し、そのkeyに対応したvalueを結合した読込対象のデータを受け取る機能を備える。2本実施形態の動作2-1データ書き込み時の動作まず、データ書き込み時の動作について、図2を参照して説明する。図2に示すように、まず、ステップS11において、ファイルシステム生成部50は、アプリケーションからデータの書き込み指示を受ける。その際、インデックスとデータbit列が指定される。次に、ステップS12において、ファイルシステム生成部50は、データbit列をストレージライタ20に送信する。次に、ステップS13において、ストレージライタ20は、データを予め決められたbit長例えば、256KBごとに分割する。分割したデータチャンクと呼ぶをvalueii1Nとする。次に、ステップS14において、ストレージライタ20は、keyiHashvalueiをそれぞれ計算する。次に、ステップS15において、ストレージライタ20は、上述した表またはアルゴリズムを用いて、keyiと対応付けられるストレージサーバ11を、keyivalueiの書込先のストレージサーバ11と特定し、特定したストレージサーバ11にkeyivalueiのセットを書き込む。この時、ストレージライタ20は、keyivalueiのセットを書き込む前に、書込先のストレージサーバ11に対し、keyiが書き込まれているか否かを確認し、keyiが書き込まれていれば、keyivalueiのセットの書き込みを行わない。次に、ステップS16において、ストレージライタ20は、keyiのリストを生成し、ファイルシステム生成部50に返す。その後、ステップS17において、ファイルシステム生成部50は、インデックスとkeyiのリストとを対応付けて保存する。なお、ステップS14,S15の処理は、ステップ内で並列実行が可能であり、また、ステップS16の処理は、ステップS14,S15の処理と並列実行が可能である。また、ステップS13の分割方法は、任意であり、後述する図3のステップS24の結合方法と対応さえしていればよい。2-2データ読み込み時の動作続いて、データ読み込み時の動作について、図3を参照して説明する。図3に示すように、まず、ステップS21において、ファイルシステム生成部50は、アプリケーションからデータの読み込み指示を受ける。その際、データは、インデックスで指定される。次に、ステップS22において、ファイルシステム生成部50は、アプリケーションが指定したインデックスに対応付けられたkeyiのリストを、ストレージリーダ30に送信する。次に、ステップS23において、ストレージリーダ30は、上述した表またはアルゴリズムを用いて、keyiのリストの各keyiと対応付けられるストレージサーバ11を読込先のストレージサーバ11と特定する。そして、ストレージリーダ30は、特定したストレージサーバ11から、keyiに対応するチャンクvalueiを読み込む。このとき、ストレージリーダ30は、keyiがキャッシュメモリにキャッシュされていれば、キャッシュメモリからチャンクvalueiを読み込む。また、ストレージリーダ30は、読込先のストレージサーバ11から読み込んだチャンクvalueiを、keyiとセットでキャッシュメモリにキャッシュしておく。次に、ステップS24において、ストレージリーダ30は、チャンクvalueiを結合し、元のデータを得る。次に、ステップS25において、ストレージリーダ30は、チャンクvalueiを結合して得た元のデータをファイルシステム生成部50に送信する。その後、ステップS26において、ファイルシステム生成部50は、アプリケーションに対し、データを渡す。なお、ステップS23の処理は、ステップ内で並列実行が可能である。また、ステップS23~S26の処理は、それぞれのiごとに実施することで、レイテンシを下げることができる。3本実施形態の効果上述したように本実施形態によれば、ストレージライタ20は、データを書き込む際に、そのデータを分割した各valueiについて、keyiHashvalueiを計算し、keyivalueiのセットを書き込む。この時、ストレージライタ20は、書込先のストレージサーバ11にkeyiが書き込まれているか否かを確認し、keyiが書き込まれていれば、keyivalueiのセットの書き込みをスキップする。ここで、同じvalueiを書き込む場合、ハッシュ関数の性質から、それらvalueiに対しては、異なるkeyiが割り当てられることはなく正確には確率的に無視できるぐらい小さい、同じkeyiが割り当てられることになるため、keyivalueiのセットは、1つのストレージサーバ11にのみ書き込まれ、異なるストレージサーバ11に重複して書き込まれることはない。よって、ストレージサーバ11の記憶領域を効率的に利用することができる。例えば、互いに類似する2つのデータ多くの部分が同一しており、例えば最後の部分だけが少し異なるを書き込む場合、2つのデータの同一部分は、1つのストレージサーバ11にのみ書き込まれるため、各ストレージサーバ11の記憶領域を共有することができる。また、本実施形態によれば、ストレージファーム10内においては、ハッシュ関数の性質から、同じkeyiに対しては、異なるvalueiが割り当たることがないため、keyiに対応するvalueiが書き換わることがない。そのため、レプリカを作ったとしても、マスターとなるデータとレプリカとの同期は保たれることになる。よって、データを更新する場合に、データとレプリカとの一貫性を気にする必要がないため、keyをロックすることなく、データの書き込みを完了させることができ、速度パフォーマンスの向上を図ることができる。4他の実施形態4-1一般に、多くのストレージシステム例えば、HDFSHadoopDistributedFileSystemでは、データをチャンクに分けて分割して保存している。そこで、本発明のストレージシステムは、他のストレージシステムに保存していたデータを自システムに保存する場合、他のストレージシステムから転送されてきたチャンクについて、ステップS14の分割処理を行わず、そのままストレージファーム10内のストレージサーバ11に書き込む構成とすることができる。また、本発明のストレージシステムは、自システムに保存していたデータを、他のストレージシステムに保存する場合、自システムに保存していたチャンクについて、ステップS24の結合処理を行わず、そのまま他のストレージシステムに転送する構成とすることができる。この構成の場合も、上述した実施形態と同じ効果を得ることができる。また、この構成の場合は、データの転送を全て並列に行うことができるため、速度パフォーマンスのさらなる向上が図れる。4-2上述した実施形態においては、ストレージライタ20およびストレージリーダ30が、ストレージサーバ11からは独立して設置されていたが、例えば、図4に示すように、ストレージファーム10内のストレージサーバ11のそれぞれに、ストレージライタ20およびストレージリーダ30の機能を搭載する構成とすることもできる。なお、この構成の場合、各ストレージサーバ11は、図1に示したストレージサーバ11の機能を備えるサーバ部111と、図1に示したストレージライタ20の機能を備えるストレージライタ部112と、図1に示したストレージリーダ30の機能を備えるストレージリーダ部113と、を有する構成となる。また、この構成の場合、ファイルシステム生成部50は、ストレージファーム10内のどのストレージサーバ11にアクセスしても、ストレージファーム10を使用可能である。また、複数の利用者で本発明のストレージシステムを利用することを想定した場合、ストレージファーム10、ストレージライタ20、ストレージリーダ30、監視部40を複数の利用者で共有し、ファイルシステム生成部50のみを各利用者毎に用意する構成とすることが考えられる。この構成の場合、他の利用者のデータの変更が、他の利用者に影響を与えることはない。その理由は、影響があるのはファイルシステム生成部50にあるインデックスと対応したkeyリストだけのためである。なお、本発明のストレージサーバ11、ストレージライタ20、およびストレージリーダ30にて行われる方法は、コンピュータに実行させるためのプログラムに適用しても良い。また、そのプログラムを記憶媒体に格納することも可能であり、ネットワークを介して外部に提供することも可能である。"