(57)【要約】【課題】ストレージシステムにおいて、異なるキーによるアクセスを効率的に実現する。【解決手段】複数のデータノード３００の各々のデータ記憶部３４０は、データセットの異なるデータ要素の値をキーとする、メインテーブル、サブテーブルの当該データノード３００に割り当てられた部分を記憶する。データ取得部３３０は、異なるデータ要素の内の一方のデータ要素の値が入力された場合に、一方のデータ要素に係るテーブルの割り当てられた部分から、当該一方のデータ要素の値をキーとして、当該一方のデータ要素の値を含むデータセットを取得する。また、データ取得部３３０は、他方のデータ要素に係るテーブルの割り当てられた部分から、当該一方のデータ要素の値に対応する当該他方のデータ要素の値をキーとして、当該一方のデータ要素の値を含むデータセットを取得する。【選択図】図１
2015179410.tif 000002
【特許請求の範囲】
【請求項１】
複数のデータノードを備えたストレージシステムであって、
前記複数のデータノードの各々は、
データセットの複数のデータ要素の内の異なる第１、及び、第２のデータ要素の値をキーとして、それぞれ、複数のデータセットを格納する、第１、及び、第２のテーブルの各々の、当該データノードに割り当てられた部分を記憶する、データ記憶手段と、
前記第１、及び、第２のデータ要素の内の一方のデータ要素の値が入力された場合に、一方のデータ要素に係るテーブルの当該データノードに割り当てられた部分から、当該一方のデータ要素の値をキーとして、当該一方のデータ要素の値を含むデータセットを取得、または、他方のデータ要素に係るテーブルの当該データノードに割り当てられた部分から、当該一方のデータ要素の値に対応する当該他方のデータ要素の値をキーとして、当該一方のデータ要素の値を含むデータセットを取得し、出力する、データ取得手段と、
を含む、ストレージシステム。
【請求項２】
前記複数のデータノードの各々の前記データ取得手段は、前記他方のデータ要素に係るテーブルの当該データノードに割り当てられた部分から、前記一方のデータ要素の値を含むデータセットの当該他方のデータ要素の値をキーとして、当該一方のデータ要素の値を含むデータセットを取得する、
請求項１に記載のストレージシステム。
【請求項３】
前記複数のデータノードの各々のデータ記憶手段は、さらに、前記第１のデータ要素の値をキーとして前記複数のデータセットを格納するテーブルであって、各データセットが、前記第１のテーブルで割り当てられたデータノードとは異なるデータノードに割り当てられる第３のテーブルの、当該データノードに割り当てられた部分を記憶し、
一のデータセットが、前記第１のテーブルと前記第２のテーブルとで異なるデータノードに割り当てられている場合、当該データセットは、前記第３のテーブルから削除される、
請求項１に記載のストレージシステム。
【請求項４】
前記第１のテーブル、及び、前記第２のテーブルのデータセットは、それぞれ、前記第１のテーブル、及び、前記第２のテーブルにおいて、前記第１のデータ要素の値、及び、前記第２のデータ要素の値の順番で並べられ、
前記複数のデータノードの各々の前記データ記憶手段は、前記第１のテーブル、及び、前記第２のテーブルの当該データノードに割り当てられた部分のデータセットを、それぞれ、前記第１のテーブルにおける前記第１のデータ要素の値の順番、及び、前記第２のテーブルにおける前記第２のデータ要素の値の順番で記憶する、
請求項１乃至３のいずれかに記載のストレージシステム。
【請求項５】
前記第１のテーブルにおいて前記複数のデータノードの各々に割り当てられた部分の１以上のデータセットは、さらに、１以上のブロックに分割され、前記第２のテーブルは、当該ブロックの単位で、前記複数のデータノードに割り当てられる、
請求項１乃至３のいずれかに記載のストレージシステム。
【請求項６】
前記第１のテーブルのデータセットは、前記第１のテーブルにおいて、前記第１のデータ要素の値の順番で並べられ、前記第２のテーブルのデータセットは、前記ブロックにおいて、前記第２のデータ要素の値の順番で並べられ、
前記複数のデータノードの各々の前記データ記憶手段は、前記第１のテーブルの当該データノードに割り当てられた部分のデータセットを、前記第１のテーブルにおける前記第１のデータ要素の値の順番で記憶し、前記第２のテーブルの当該データノードに割り当てられた部分のブロックのデータセットを、当該ブロックにおける前記第２のデータ要素の値の順番で記憶する、
請求項５に記載のストレージシステム。
【請求項７】
さらに、前記第２のデータ要素の値の範囲が入力された場合に、１以上の前記データノードに記憶されている、当該範囲の値を含むデータセットを格納する複数のブロックの各々から、データセットを順番に取得し、前記第２のデータ要素の値の順番に並べ換え、順番に出力する、ソーティング手段を含む、
請求項５または６に記載のストレージシステム。
【請求項８】
さらに、前記一方のデータ要素の値が入力された場合に、前記第１、または、第２のテーブルにおいて、当該一方のデータ要素の値を含むデータセットが割り当てられているデータノードの識別子を出力する、制御ノードを備える、
請求項１乃至７のいずれかに記載のストレージシステム。
【請求項９】
複数のデータノードを含むストレージシステムのストレージ方法であって、
前記複数のデータノードの各々において、
データセットの複数のデータ要素の内の異なる第１、及び、第２のデータ要素の値をキーとして、それぞれ、複数のデータセットを格納する、第１、及び、第２のテーブルの各々の、当該データノードに割り当てられた部分を記憶し、
前記第１、及び、第２のデータ要素の内の一方のデータ要素の値が入力された場合に、一方のデータ要素に係るテーブルの当該データノードに割り当てられた部分から、当該一方のデータ要素の値をキーとして、当該一方のデータ要素の値を含むデータセットを取得、または、他方のデータ要素に係るテーブルの当該データノードに割り当てられた部分から、当該一方のデータ要素の値に対応する当該他方のデータ要素の値をキーとして、当該一方のデータ要素の値を含むデータセットを取得し、出力する、
ストレージ方法。
【請求項１０】
複数のデータノードを含むストレージシステムのプログラムであって、
前記複数のデータノードのコンピュータの各々に、
データセットの複数のデータ要素の内の異なる第１、及び、第２のデータ要素の値をキーとして、それぞれ、複数のデータセットを格納する、第１、及び、第２のテーブルの各々の、当該データノードに割り当てられた部分を記憶し、
前記第１、及び、第２のデータ要素の内の一方のデータ要素の値が入力された場合に、一方のデータ要素に係るテーブルの当該データノードに割り当てられた部分から、当該一方のデータ要素の値をキーとして、当該一方のデータ要素の値を含むデータセットを取得、または、他方のデータ要素に係るテーブルの当該データノードに割り当てられた部分から、当該一方のデータ要素の値に対応する当該他方のデータ要素の値をキーとして、当該一方のデータ要素の値を含むデータセットを取得し、出力する、
処理を行わせるプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ストレージシステム、ストレージ方法、及び、プログラムに関し、特に、複数のデータセットを分散して記憶する、ストレージシステム、ストレージ方法、及び、プログラムに関する。
【背景技術】
【０００２】
コンピュータのハードウェア、ソフトウェア、及び、ネットワークの高性能化に伴い、複数のコンピュータをネットワークで接続して、分散処理を行うことにより、高い処理性能を得る技術が開発されている。
【０００３】
特に、近年では、分散処理技術の発展に伴い、大量データの高速分析が可能な分散並列処理基盤が提供され、大量データに対する傾向や知見の導出に適用されている。例えば、分散並列処理基盤としてよく知られているＨａｄｏｏｐは、顧客情報や行動履歴のマイニング、大量ログ情報からの傾向分析などに適用されている。Ｈａｄｏｏｐでは、大量データに対応する分散ファイルシステムとして、ＨＤＦＳ(Hadoop Distributed File System)が用いられている。また、ＨＤＦＳ上で構築される、スケーラブルで高パフォーマンスな分散ストレージとして、非特許文献１に記載されているＨＢａｓｅが知られている。
【０００４】
ＨＢａｓｅは、ＫＶＳ（Key-Value Store）形式の分散ストレージであり、テーブル状のデータ構造において、ＲｏｗＫｅｙと呼ぼれるＫｅｙにより、当該ＲｏｗＫｅｙに対応づけられたデータセットのＶａｌｕｅを一意に取得できる。また、ＨＢａｓｅの場合、ＲｏｗＫｅｙのあるまとまりでデータセットが複数のファイルに分割されて、複数ノードに保存される。また、ＨＢａｓｅでは、データセットがＲｏｗＫｅｙの値の辞書順（例えば、自然順序）でソートされ、保存されている。このため、Ｋｅｙによる範囲検索が高速に行われる。
【０００５】
また、このような分散ストレージでは、高可用性を実現するために、一般的に、データセットのコピー（レプリカ）が、複数ノードに保存される。これにより、一つのノードで障害が発生した場合でも、レプリカがあるノードが処理を引き継ぐことにより、耐障害性が高められる。
【先行技術文献】
【非特許文献】
【０００６】
【非特許文献１】"Apache Hbase"、The Apache Software Foundation、［online］、［平成26年3月5日検索］、インターネット〈URL：http://hbase.apache.org/〉
【発明の概要】
【発明が解決しようとする課題】
【０００７】
しかしながら、上述の非特許文献に記載されているような、ＫＶＳ形式の分散ストレージでは、データセットを取得するために、上述のＲｏｗＫｅｙ等、特定のＫｅｙを指定する必要がある。このため、Ｖａｌｕｅに含まれるデータ要素を指定して、データセットを取得することができない。
【０００８】
Ｖａｌｕｅに含まれるデータ要素を指定してデータセットを取得するためには、例えば、当該データ要素をＫｅｙとして、新たなテーブル状のデータ構造を構築する必要がある。この場合、レプリカも含めて、同じデータ構造を２重に持つことになり、効率が悪い。
【０００９】
本発明の目的は、上述の課題を解決し、ストレージシステムにおいて、異なるＫｅｙによるアクセスを効率的に実現する、ストレージシステム、ストレージ方法、及び、プログラムを提供することである。
【課題を解決するための手段】
【００１０】
本発明のストレージシステムは、複数のデータノードを備えたストレージシステムであって、前記複数のデータノードの各々は、データセットの複数のデータ要素の内の異なる第１、及び、第２のデータ要素の値をキーとして、それぞれ、複数のデータセットを格納する、第１、及び、第２のテーブルの各々の、当該データノードに割り当てられた部分を記憶する、データ記憶手段と、前記第１、及び、第２のデータ要素の内の一方のデータ要素の値が入力された場合に、一方のデータ要素に係るテーブルの当該データノードに割り当てられた部分から、当該一方のデータ要素の値をキーとして、当該一方のデータ要素の値を含むデータセットを取得、または、他方のデータ要素に係るテーブルの当該データノードに割り当てられた部分から、当該一方のデータ要素の値に対応する当該他方のデータ要素の値をキーとして、当該一方のデータ要素の値を含むデータセットを取得し、出力する、データ取得手段と、を含む。
【００１１】
本発明のストレージ方法は、複数のデータノードを含むストレージシステムのストレージ方法であって、前記複数のデータノードの各々において、データセットの複数のデータ要素の内の異なる第１、及び、第２のデータ要素の値をキーとして、それぞれ、複数のデータセットを格納する、第１、及び、第２のテーブルの各々の、当該データノードに割り当てられた部分を記憶し、前記第１、及び、第２のデータ要素の内の一方のデータ要素の値が入力された場合に、一方のデータ要素に係るテーブルの当該データノードに割り当てられた部分から、当該一方のデータ要素の値をキーとして、当該一方のデータ要素の値を含むデータセットを取得、または、他方のデータ要素に係るテーブルの当該データノードに割り当てられた部分から、当該一方のデータ要素の値に対応する当該他方のデータ要素の値をキーとして、当該一方のデータ要素の値を含むデータセットを取得し、出力する。
【００１２】
本発明のプログラムは、複数のデータノードを含むストレージシステムのプログラムであって、前記複数のデータノードのコンピュータの各々に、データセットの複数のデータ要素の内の異なる第１、及び、第２のデータ要素の値をキーとして、それぞれ、複数のデータセットを格納する、第１、及び、第２のテーブルの各々の、当該データノードに割り当てられた部分を記憶し、前記第１、及び、第２のデータ要素の内の一方のデータ要素の値が入力された場合に、一方のデータ要素に係るテーブルの当該データノードに割り当てられた部分から、当該一方のデータ要素の値をキーとして、当該一方のデータ要素の値を含むデータセットを取得、または、他方のデータ要素に係るテーブルの当該データノードに割り当てられた部分から、当該一方のデータ要素の値に対応する当該他方のデータ要素の値をキーとして、当該一方のデータ要素の値を含むデータセットを取得し、出力する、処理を行わせる。
【発明の効果】
【００１３】
本発明の効果は、ストレージシステムにおいて、異なるＫｅｙによるアクセスを効率的に実現できることである。
【図面の簡単な説明】
【００１４】
【図１】本発明の第１の実施の形態の特徴的な構成を示すブロック図である。
【図２】本発明の第１の実施の形態の構成を示すブロック図である。
【図３】本発明の第１の実施の形態における、サブテーブル生成処理を示すフローチャートである。
【図４】本発明の第１の実施の形態における、データ読み出し処理を示すフローチャートである。
【図５】本発明の第１の実施の形態における、テーブルの例を示す図である。
【図６】本発明の第１の実施の形態における、Ｋｅｙ情報２２１、２２２の例を示す図である。
【図７】本発明の第１の実施の形態における、テーブルの他の例を示す図である。
【図８】本発明の第１の実施の形態における、Ｋｅｙ情報２２１、２２２の他の例を示す図である。
【図９】本発明の第１の実施の形態における、テーブルの他の例を示す図である。
【図１０】本発明の第１の実施の形態における、Ｋｅｙ情報２２１、２２２の他の例を示す図である。
【図１１】本発明の第２の実施の形態における、テーブルの例を示す図である。
【図１２】本発明の第２の実施の形態における、Ｋｅｙ情報２２１、２２２の例を示す図である。
【図１３】本発明の第２の実施の形態における、テーブルの他の例を示す図である。
【図１４】本発明の第２の実施の形態における、Ｋｅｙ情報２２１、２２２の他の例を示す図である。
【図１５】本発明の第２の実施の形態における、テーブルの他の例を示す図である。
【図１６】本発明の第２の実施の形態における、Ｋｅｙ情報２２１、２２２の他の例を示す図である。
【図１７】本発明の第３の実施の形態の構成を示すブロック図である。
【図１８】本発明の第３の実施の形態における、データ読み出し処理を示すフローチャートである。
【図１９】本発明の第３の実施の形態における、テーブルの例を示す図である。
【図２０】本発明の第３の実施の形態における、Ｋｅｙ情報２２１、２２２の例を示す図である。
【図２１】本発明の第３の実施の形態における、テーブルの例を示す図である。
【図２２】本発明の第３の実施の形態における、Ｋｅｙ情報２２１、２２２の例を示す図である。
【図２３】本発明の第３の実施の形態における、ソーティングバッファの例を示す図である。
【発明を実施するための形態】
【００１５】
（第１の実施の形態）
本発明の第１の実施の形態について説明する。
【００１６】
はじめに、本発明の第１の実施の形態の構成について説明する。図２は、本発明の第１の実施の形態の構成を示すブロック図である。
【００１７】
図２を参照すると、ストレージシステム１００は、制御ノード２００、及び、複数のデータノード３００を含む。ストレージシステム１００は、ネットワーク等により、クライアント装置５００と接続される。
【００１８】
なお、以下の説明において、引用番号に続く「」内の符号は、識別子を示す。例えば、データノード３００「Ｎ１」は、識別子「Ｎ１」のデータノード３００を示す。図２の例では、ストレージシステム１００は、データノード３００「Ｎ１」、「Ｎ２」、「Ｎ３」、…を含む。
【００１９】
本発明の第１の実施の形態では、ストレージシステム１００に記憶されるデータセットは、複数のデータ要素を含む。ストレージシステム１００では、複数のデータセットを格納するテーブルが生成される。テーブルでは、データセットの複数のデータ要素の内、一つのデータ要素がＫｅｙとして用いられる。ストレージシステム１００には、クライアント装置５００からＫｅｙの値が入力され、当該Ｋｅｙの値を含むデータセットが、テーブルから取得、出力される。
【００２０】
本発明の第１の実施の形態では、テーブルとして、複数のデータ要素の内の第１の要素をＫｅｙとして用いる、メインテーブル（第１のテーブル）が予め生成される。メインテーブルでは、データセットがメインテーブルのＫｅｙの値でソーティングされる（Ｋｅｙの値の順番で並べられる）。そして、メインテーブルは、各々が１以上のデータセットを含む複数の部分に分割され、それぞれ、複数のデータノード３００に割り当てられる。
【００２１】
また、第１の要素をＫｅｙとして用いるテーブルであって、メインテーブルの各データセットを、Ｋｅｙ単位で、メインテーブルとは異なるデータノード３００に格納した、メインレプリカテーブル（第３のテーブル）も予め生成される。
【００２２】
図５は、本発明の第１の実施の形態における、テーブルの例を示す図である。図５の例では、データセットが、データ要素として、ＩＤ（Identifier）、名前、及び、住所を含む。メインテーブル、及び、メインレプリカテーブルは、ＩＤをＫｅｙとして用いるテーブルである。メインテーブルは、３つの部分に分割され、データノード３００「Ｎ１」、「Ｎ２」、及び、「Ｎ３」に格納されている。そして、例えば、Ｋｅｙ：ＩＤ「１」に対するデータセットが、＜Ｋｅｙ：ＩＤ「１」、Ｖａｌｕｅ：名前「ＡＣ」、住所「東京」＞の形式で、データノード３００「Ｎ１」に格納されている。また、メインレプリカテーブルでは、Ｋｅｙ：ＩＤ「１」に対するデータセットが、データノード３００「Ｎ２」に格納されている。
【００２３】
さらに、第１の要素とは異なる第２の要素をＫｅｙとして用いる、サブテーブル（第２のテーブル）が生成される。サブテーブルでも、メインテーブルと同様に、データセットがサブテーブルのＫｅｙの値でソーティングされる。そして、サブテーブルも、各々が１以上のデータセットを含む複数の部分に分割され、それぞれ、複数のデータノード３００に割り当てられる。
【００２４】
図７、図９は、本発明の第１の実施の形態における、テーブルの他の例を示す図である。図７、図９の例では、図５のメインテーブル、及び、メインレプリカテーブルに加えて、名前をＫｅｙとして用いるサブテーブルが追加されている。サブテーブルも、３つの部分に分割され、データノード３００「Ｎ１」、「Ｎ２」、及び、「Ｎ３」に格納されている。そして、例えば、サブテーブルでは、Ｋｅｙ：名前「ＡＣ」に対するデータセットが、＜Ｋｅｙ：名前「ＡＣ」、Ｖａｌｕｅ：ＩＤ「１」、住所「東京」＞の形式で、データノード３００「Ｎ１」に格納されている。
【００２５】
なお、本発明の実施の形態では、あるテーブルであるデータノード３００に格納されているデータセットと同じデータセットが他のテーブルで他のデータノード３００に格納されている場合、一方のデータセットを他方のデータセットのレプリカと呼ぶ。
【００２６】
例えば、図７において、メインレプリカテーブルでデータノード３００「Ｎ２」に格納されているＫｅｙ：ＩＤ「１」のデータセットは、メインテーブルでデータノード３００「Ｎ１」に格納されているＫｅｙ：ＩＤ「１」のデータセットのレプリカである。また、図７において、サブテーブルでデータノード３００「Ｎ１」に格納されているＫｅｙ：名前「ＡＡ」のデータセットは、メインテーブルでデータノード３００「Ｎ３」に格納されているＫｅｙ：ＩＤ「３０１」のデータセットのレプリカである。
【００２７】
あるデータノード３００に障害が発生した場合は、当該データノード３００が格納するデータセットのレプリカを格納するデータノード３００から、当該データセットのレプリカを取得することができる。
【００２８】
制御ノード２００は、制御部２１０、及び、Ｋｅｙ情報記憶部２２０を含む。
【００２９】
制御部２１０は、各データノード３００に対して、サブテーブルにおける、当該データノード３００に割り当てられた部分の生成を指示する。また、制御部２１０は、死活監視等により、各データノード３００の状態を監視する。
【００３０】
Ｋｅｙ情報記憶部２２０は、Ｋｅｙ情報２２１、２２２を記憶する。Ｋｅｙ情報２２１、２２２は、それぞれ、メインテーブル、サブテーブルのＫｅｙの各値を含むデータセットが格納されるデータノード３００を示す。
【００３１】
図６、図８、及び、図１０は、本発明の第１の実施の形態における、Ｋｅｙ情報２２１、２２２の例を示す図である。図６のＫｅｙ情報２２１は、図５のテーブルに対応する。図８、図１０のＫｅｙ情報２２１、２２２は、それぞれ、図７、図９のテーブルに対応する。
【００３２】
Ｋｅｙ情報２２１における、「メイン」、「メインレプリカ」、「サブ」欄は、それぞれ、メインテーブル、メインレプリカテーブル、サブテーブルで、「Ｋｅｙ：ＩＤ」欄のＫｅｙの値のデータセットを格納しているデータノード３００の識別子を示す。
【００３３】
Ｋｅｙ情報２２２における、「サブ」、「メイン」、「メインレプリカ」欄は、それぞれ、サブテーブル、メインテーブル、メインレプリカテーブルで、「Ｋｅｙ：名前」欄のＫｅｙの値のデータセットを格納しているデータノード３００の識別子を示す。「Ｋｅｙ：ＩＤ」欄は、「Ｋｅｙ：名前」欄のＫｅｙの値のデータセットに含まれるＩＤの値（サブテーブルのＫｅｙの値に対するメインテーブルのＫｅｙの値のマッピング）を示す。
【００３４】
複数のデータノード３００の各々は、テーブル生成部３１０、Ｋｅｙ情報記憶部３２０、データ取得部３３０、及び、データ記憶部３４０を含む。
【００３５】
テーブル生成部３１０は、制御ノード２００からの指示に従って、サブテーブルにおける当該データノード３００に割り当てられた部分を、データ記憶部３４０に生成する。テーブル生成部３１０は、サブテーブルにおいて割り当てられた部分の各データセットを、サブテーブルにおいてソーティングされた順番で、データ記憶部３４０に格納する。
【００３６】
Ｋｅｙ情報記憶部３２０は、制御ノード２００と同じ、Ｋｅｙ情報２２１、２２２を記憶する。Ｋｅｙ情報記憶部３２０のＫｅｙ情報２２１、２２２は、制御部２１０によって、Ｋｅｙ情報記憶部２２０と同期される。
【００３７】
データ取得部３３０は、クライアント装置５００からのデータ取得要求に応じて、各テーブルにおける、当該データノード３００に割り当てられた部分から、Ｋｅｙの値を含むデータセットを取得し、クライアント装置５００へ返却する。
【００３８】
データ記憶部３４０は、各テーブルにおける、当該データノード３００に割り当てられた部分を記憶する。データ記憶部３４０は、非特許文献１に記載されているような、ＨＢａｓｅに従った分散ストレージにおける、ストレージデバイスでもよい。データ記憶部３４０は、記憶媒体として、ＨＤＤ（Hard Disk Drive）を用いてもよいし、ＳＳＤ（Solid state drive）や、フラッシュメモリ、ＲＡＭ（Random Access Memory）を用いていてもよい。
【００３９】
クライアント装置５００は、アプリケーション５１０、及び、ライブラリ５２０を含む。
【００４０】
アプリケーション５１０は、ライブラリ５２０を用いて、ストレージシステム１００にアクセスする。
【００４１】
ライブラリ５２０は、ストレージシステム１００にアクセスし、データセットの読み出し、及び、書き込みを行う。
【００４２】
なお、制御ノード２００、データノード３００、及び、クライアント装置５００は、それぞれ、ＣＰＵ（Central Processing Unit）とプログラムを記憶した記憶媒体を含み、プログラムに基づく制御によって動作するコンピュータであってもよい。
【００４３】
この場合、制御ノード２００のＣＰＵは、制御部２１０の機能を実現するためのコンピュータプログラムを実行する。また、データノード３００のＣＰＵは、テーブル生成部３１０、及び、データ取得部３３０の機能を実現するためのコンピュータプログラムを実行する。クライアント装置５００のＣＰＵは、アプリケーション５１０、及び、ライブラリ５２０の機能を実現するためのコンピュータプログラムを実行する。また、制御ノード２００の記憶媒体は、Ｋｅｙ情報記憶部２２０の情報を記憶する。データノード３００の記憶媒体は、Ｋｅｙ情報記憶部３２０、及び、データ記憶部３４０の情報を記憶する。
【００４４】
次に、本発明の第１の実施の形態の動作について説明する。
【００４５】
＜サブテーブル生成処理＞
はじめに、本発明の第１の実施の形態における、サブテーブル生成処理について説明する。
【００４６】
ここでは、各データノード３００のデータ記憶部３４０に、図５のように、ＩＤをＫｅｙとしたメインテーブル、及び、メインレプリカテーブルが記憶されていると仮定する。また、これらのテーブルに対して、図６のようなＫｅｙ情報２２１が、Ｋｅｙ情報記憶部２２０に記憶されていると仮定する。
【００４７】
図３は、本発明の第１の実施の形態における、サブテーブル生成処理を示すフローチャートである。
【００４８】
クライアント装置５００のアプリケーション５１０は、ライブラリ５２０を通して、サブテーブルの生成を、ストレージシステム１００の制御ノード２００に指示する（ステップＡ１０１）。
【００４９】
例えば、アプリケーション５１０は、名前をＫｅｙとしたサブテーブルの生成を指示する。
【００５０】
制御ノード２００の制御部２１０は、Ｋｅｙ情報２２２において、サブテーブルのＫｅｙの値、及び、当該値に対するメインテーブルのＫｅｙの値の対応関係（マッピング）を設定する（ステップＢ１０１）。ここで、制御部２１０は、Ｋｅｙ情報２２１から、メインテーブルのＫｅｙの各値を取得し、当該Ｋｅｙの値が格納されているデータノード３００から、当該Ｋｅｙの値に対するデータセットを取得する。そして、制御部２１０は、取得したデータセットから、サブテーブルのＫｅｙの値を抽出する。制御部２１０は、抽出したサブテーブルのＫｅｙの値でソートしながら、サブテーブルのＫｅｙの各値に対して、メインテーブルのＫｅｙの値を設定する。
【００５１】
例えば、制御部２１０は、図６のＫｅｙ情報２２１をもとに、図８のＫｅｙ情報２２２のように、Ｋｅｙ：名前の各値に対するＫｅｙ：ＩＤの値のマッピングを設定する。
【００５２】
制御部２１０は、Ｋｅｙ情報２２２において、サブテーブルのＫｅｙの各値をデータノード３００に割り当てる（ステップＢ１０２）。ここで、制御部２１０は、Ｋｅｙ情報２２２における、先頭のＫｙｅの値から順番に、データノード３００ごとに予め決められた数のＫｅｙの値を、各データノード３００に割り当てる。
【００５３】
例えば、制御部２１０は、図８のＫｅｙ情報２２２で、Ｋｅｙ：名前「ＡＡ」〜「ＡＣ」をデータノード３００「Ｎ１」、Ｋｅｙ：名前「ＢＢ」、「ＣＣ」をデータノード３００「Ｎ２」、Ｋｅｙ：名前「ＤＤ」〜「ＺＺ」をデータノード３００「Ｎ３」に割り当てる。制御部２１０は、割り当て結果を、図８のように、Ｋｅｙ情報２２２に設定する。
【００５４】
制御部２１０は、Ｋｅｙ情報２２２において、サブテーブルのＫｅｙの各値について、当該値を含むデータセットをメインテーブルやメインレプリカテーブルで格納しているデータノード３００を設定する（ステップＢ１０３）。ここで、制御部２１０は、Ｋｅｙ情報２２２から、サブテーブルのＫｅｙの各値に対するメインテーブルのＫｅｙの値を抽出する。そして、制御部２１０は、Ｋｅｙ情報２２１から、当該メインテーブルのＫｅｙの値をメインテーブルやメインレプリカテーブルで格納しているデータノード３００の識別子を抽出する。
【００５５】
例えば、制御部２１０は、図６のＫｅｙ情報２２１をもとに、図８のＫｅｙ情報２２２のように、メインテーブルやメインレプリカテーブルで、Ｋｅｙ：名前の各値を格納しているデータノード３００の識別子を設定する。
【００５６】
制御部２１０は、各データノード３００に対して、サブテーブルの内の当該データノード３００に割り当てられたＫｅｙに対する部分の生成を指示する（ステップＢ１０４）。
【００５７】
各データノード３００のテーブル生成部３１０は、サブテーブルの内の割り当てられたＫｅｙに対する部分を、データ記憶部３４０に生成する（ステップＣ１０１）。ここで、各データノード３００のテーブル生成部３１０は、Ｋｅｙ情報２２２における、割り当てられたサブテーブルのＫｅｙの値を順番に抽出する。そして、テーブル生成部３１０は、当該Ｋｅｙの値に対するデータセットを、自データノード３００、または、他データノード３００のメインテーブルやメインレプリカテーブルから取得し、データ記憶部３４０におけるサブテーブルに、順番に格納する。
【００５８】
例えば、データノード３００「Ｎ１」のテーブル生成部３１０は、図８のＫｅｙ情報２２２における、Ｋｅｙ：名前「ＡＡ」に対するデータセットを、データノード３００「Ｎ２」のメインレプリカテーブルから取得する。テーブル生成部３１０は、メインレプリカテーブルから取得したデータセット＜Ｋｅｙ：ＩＤ「３０１」、Ｖａｌｕｅ：名前「ＡＡ」、住所「富山」＞を、＜Ｋｅｙ：名前「ＡＡ」、Ｖａｌｕｅ：ＩＤ「３０１」、住所「富山」＞に変換する。テーブル生成部３１０は、変換したデータセットを、図７のようにデータ記憶部３４０におけるサブテーブルに格納する。同様に、テーブル生成部３１０は、Ｋｅｙ：名前「ＡＢ」に対するデータセットを、データ記憶部３４０において、Ｋｅｙ：名前「ＡＡ」のデータセットの次に格納する。さらに、テーブル生成部３１０は、Ｋｅｙ：名前「ＡＣ」に対するデータセットを、データ記憶部３４０において、Ｋｅｙ：名前「ＡＢ」のデータセットの次に格納する。データノード３００「Ｎ２」、「Ｎ３」も同様に、サブテーブルにおける割り当てられた部分を、データ記憶部３４０に格納する。この結果、データノード３００「Ｎ１」、「Ｎ２」、「Ｎ３」には、図７のように、サブテーブルが生成、格納される。
【００５９】
制御部２１０は、Ｋｅｙ情報２２１において、メインテーブルのＫｅｙの各値について、当該値を含むデータセットをサブテーブルで格納しているデータノード３００を設定する（ステップＢ１０５）。ここで、制御部２１０は、Ｋｅｙ情報２２２から、メインテーブルのＫｅｙの各値に対するサブテーブルのＫｅｙの値を抽出する。そして、制御部２１０は、Ｋｅｙ情報２２２から、当該サブテーブルのＫｅｙの値をサブテーブルで格納しているデータノード３００の識別子を抽出する。
【００６０】
例えば、制御部２１０は、図８のＫｅｙ情報２２２をもとに、図８のＫｅｙ情報２２１のように、サブテーブルで、Ｋｅｙ：ＩＤの各値を格納しているデータノード３００の識別子を設定する。
【００６１】
制御部２１０は、Ｋｅｙ情報２２１、２２２において、メインレプリカテーブルにおける冗長なデータセットに係るデータノード３００の割り当てを削除する（ステップＢ１０６）。ここで、冗長なデータセットとは、メインレプリカテーブルに格納されるデータセットの内で、メインテーブルとサブテーブルとで異なるデータノード３００に格納されているデータセットである。この場合、サブテーブルにおける当該データセットは、メインテーブルにおけるデータセットのレプリカとして用いることができる。したがって、メインレプリカテーブルのデータセットは削除できる。
【００６２】
例えば、図８のＫｅｙ情報２２１において、Ｋｅｙ：ＩＤ「２」（Ｋｅｙ：名前「ＺＺ」）に対するデータセットは、メインテーブルではデータノード３００「Ｎ１」、サブテーブルではデータノード３００「Ｎ３」に格納されている。したがって、メインレプリカテーブルで、データノード３００「Ｎ３」が格納しているＫｅｙ：ＩＤ「２」のデータセットは冗長である。
【００６３】
制御部２１０は、図１０のように、Ｋｅｙ情報２２１、２２２から、メインレプリカテーブルにおける、冗長なデータセットに係るデータノード３００の割り当てを削除する。
【００６４】
制御部２１０は、各データノード３００に対して、メインレプリカテーブルからの冗長なデータセットの削除を指示する（ステップＢ１０７）。
【００６５】
各データノード３００のテーブル生成部３１０は、ステップＢ１０６で更新されたＫｅｙ情報２２１、２２２に従って、メインレプリカテーブルにおける割り当てられた部分から、冗長なデータセットを削除する（ステップＣ１０２）。
【００６６】
例えば、各データノード３００のテーブル生成部３１０は、図９のように、メインレプリカテーブルから冗長なデータセットを削除する。
【００６７】
＜データ読み出し処理＞
次に、本発明の第１の実施の形態における、データ読み出し処理について説明する。
【００６８】
ここでは、クライアント装置５００のアプリケーション５１０が、ストレージシステム１００に対して、Ｋｅｙの特定の範囲の値に対するデータセットの取得（範囲検索）を行う場合を例に、動作を説明する。
【００６９】
図４は、本発明の第１の実施の形態における、データ読み出し処理を示すフローチャートである。
【００７０】
クライアント装置５００のアプリケーション５１０は、ライブラリ５２０に、検索対象テーブル（メインテーブル／サブテーブル）（以下、対象テーブル）と検索対象のＫｅｙ（以下、対象Ｋｅｙ）の値を指定して、範囲検索を指示する（ステップＡ２０１）。ライブラリ５２０は、制御ノード２００に、対象テーブルと対象Ｋｅｙの値を指定して、データノード問い合わせを送信する（ステップＡ２０２）。
【００７１】
例えば、アプリケーション５１０が、メインテーブルにおけるＫｅｙ：ＩＤ「１」〜「１０２」の範囲検索を指示した場合、ライブラリ５２０は、対象テーブル：メインテーブル、対象Ｋｅｙ：ＩＤ「１」〜「１０２」としてデータノード問い合わせを送信する。
【００７２】
制御ノード２００の制御部２１０は、対象Ｋｅｙに係るＫｅｙ情報２２１、２２２を参照し、対象テーブルにおいて、対象Ｋｅｙの値に対するデータセットを格納するデータノード３００の識別子を抽出する（ステップＢ２０１）。
【００７３】
例えば、制御部２１０は、図１０のＫｅｙ情報２２１を参照し、メインテーブルにおいて、Ｋｅｙ：ＩＤ「１」〜「１０２」に対するデータセットを格納するデータノード３００の識別子「Ｎ１」を抽出する。
【００７４】
制御部２１０は、抽出したデータノード３００が正常かどうかを判断する（ステップＢ２０２）。
【００７５】
ステップＢ２０２で、データノード３００が正常な場合（ステップＢ２０２／Ｙ）、制御部２１０は、抽出したデータノード３００の識別子をクライアント装置５００へ返却する（ステップＢ２０４）。
【００７６】
例えば、データノード３００「Ｎ１」が正常な場合、制御部２１０は、Ｋｅｙ：ＩＤ「１」〜「１０２」に対して、データノード３００の識別子「Ｎ１」を返却する。
【００７７】
クライアント装置５００のライブラリ５２０は、受信した識別子のデータノード３００へ、対象テーブル（メインテーブル／サブテーブル）と対象Ｋｅｙの値を指定して、データ取得要求を送信する（ステップＡ２０３）。
【００７８】
例えば、ライブラリ５２０は、データノード３００「Ｎ１」に、対象テーブル：メインテーブル、対象Ｋｅｙ：ＩＤ「１」〜「１０２」として、データ取得要求を送信する。
【００７９】
データノード３００のデータ取得部３３０は、対象Ｋｅｙに係るＫｅｙ情報２２１、２２２を参照し、自データノード３００が、対象テーブルにおいて、対象Ｋｅｙの値に対するデータセットを格納しているかを判定する（ステップＣ２０１）。
【００８０】
ステップＣ２０１で、対象テーブルにおいて、対象Ｋｅｙの値に対するデータセットを格納している場合（ステップＣ２０１／Ｙ）、データ取得部３３０は、対象Ｋｅｙの値に対するデータセットを取得する（ステップＣ２０２）。ここで、データ取得部３３０は、データ記憶部３４０に格納された対象テーブルから、データセットを取得する。
【００８１】
例えば、図１０のＫｅｙ情報２２１を参照すると、データノード３００「Ｎ１」は、メインテーブルで、Ｋｅｙ：ＩＤ「１」〜「１０２」に対するデータセットを格納している。データノード３００「Ｎ１」のデータ取得部３３０は、図９におけるメインテーブルから、Ｋｅｙ：ＩＤ「１」に対するデータセット＜Ｋｅｙ：ＩＤ「１」、Ｖａｌｕｅ：名前「ＡＣ」、住所「東京」＞を取得する。同様に、データ取得部３３０は、Ｋｅｙ：ＩＤ「２」〜「１０２」に対するデータセットを取得する。
【００８２】
データ取得部３３０は、取得したデータセットを、クライアント装置５００へ返却する（ステップＣ２０９）。
【００８３】
例えば、データ取得部３３０は、Ｋｅｙ：ＩＤ「１」〜「１０２」に対するデータセットを、クライアント装置５００へ返却する。
【００８４】
ライブラリ５２０は、取得したデータセットをアプリケーション５１０に転送する（ステップＡ２０４）。
【００８５】
例えば、ライブラリ５２０は、データノード３００「Ｎ１」から取得したＫｅｙ：ＩＤ「２」〜「１０２」に対するデータセットを、アプリケーション５１０に転送する。
【００８６】
なお、ライブラリ５２０は、範囲検索に対して、複数の異なるデータノード３００からデータセットを取得した場合、これらをまとめて、アプリケーション５１０に転送してもよい。
【００８７】
また、他の例として、アプリケーション５１０が、サブテーブルにおけるＫｅｙ：名前「ＡＡ」〜「ＡＣ」の範囲検索を指示したと仮定する。この場合、ライブラリ５２０は、対象テーブル：サブテーブル、対象Ｋｅｙ：名前「ＡＡ」〜「ＡＣ」として、データノード問い合わせを、制御ノード２００へ送信する。
【００８８】
制御部２１０は、図１０のＫｅｙ情報２２２を参照し、サブテーブルにおいて、Ｋｅｙ：名前「ＡＡ」〜「ＡＣ」に対するデータセットを格納するデータノード３００の識別子「Ｎ１」を抽出する。
【００８９】
データノード３００「Ｎ１」が正常であった場合、制御部２１０は、Ｋｅｙ：名前「ＡＡ」〜「ＡＣ」に対して、データノード３００の識別子「Ｎ１」を、クライアント装置５００へ返却する。
【００９０】
ライブラリ５２０は、データノード３００「Ｎ１」に、対象テーブル：サブテーブル、対象Ｋｅｙ：名前「ＡＡ」〜「ＡＣ」として、データ取得要求を送信する。
【００９１】
データノード３００「Ｎ１」のデータ取得部３３０は、図９におけるサブテーブルから、Ｋｅｙ：名前「ＡＡ」に対するデータセット＜Ｋｅｙ：名前「ＡＡ」、Ｖａｌｕｅ：ＩＤ「３０１」、「富山」を取得する。同様に、データ取得部３３０は、Ｋｅｙ名前「ＡＢ」、「ＡＣ」に対するデータセットを取得する。
【００９２】
データ取得部３３０は、Ｋｅｙ：名前「ＡＡ」〜「ＡＣ」に対するデータセットを、クライアント装置５００へ返却する。
【００９３】
一方、ステップＢ２０２で、障害が発生している場合（ステップＢ２０２／Ｎ）、制御部２１０は、対象Ｋｅｙに係るＫｅｙ情報２２１、２２２を参照し、対象Ｋｅｙの値に対するレプリカを格納するデータノード３００の識別子を抽出する（ステップＢ２０３）。
【００９４】
例えば、上述の対象テーブル：メインテーブル、対象Ｋｅｙ：ＩＤ「１」〜「１０２」の範囲検索時に、データノード３００「Ｎ１」に障害が発生していたと仮定する。この場合、制御部２１０は、図１０のＫｅｙ情報２２１を参照し、メインレプリカテーブルかサブテーブルで、Ｋｅｙ：ＩＤ「１」、「１０２」に対するデータセット（レプリカ）を格納するデータノード３００の識別子「Ｎ２」を抽出する。同様に、制御部２１０は、サブテーブルで、Ｋｅｙ：ＩＤ「２」、「３」に対するデータセットを格納するデータノード３００の識別子「Ｎ３」を抽出する。
【００９５】
制御部２１０は、Ｋｅｙ：ＩＤ「１」、「１０２」に対してデータノード３００の識別子「Ｎ２」、Ｋｅｙ：ＩＤ「２」、「３」に対してデータノード３００の識別子「Ｎ３」を返却する。
【００９６】
ライブラリ５２０は、データノード３００「Ｎ２」に、対象テーブル：メインテーブル、対象Ｋｅｙ：ＩＤ「１」、「１０２」を指定して、データ取得要求を送信する。また、ライブラリ５２０は、同時に、データノード３００「Ｎ３」に、対象テーブル：メインテーブル、対象Ｋｅｙ：ＩＤ「２」、「３」を指定して、データ取得要求を送信する。
【００９７】
ステップＣ２０１で、対象テーブルにおいて、対象Ｋｅｙの値に対するデータセットを格納していない場合（ステップＣ２０１／Ｎ）、データ取得部３３０は、対象Ｋｅｙの値に対するレプリカを格納している他のテーブルを特定する（ステップＣ２０３）。ここで、データ取得部３３０は、対象Ｋｅｙに係るＫｅｙ情報２２１、２２２を参照し、自データノード３００において、対象Ｋｅｙの値に対するデータセットのレプリカを格納しているテーブルを特定する
例えば、図１０のＫｅｙ情報２２１を参照すると、データノード３００「Ｎ２」は、メインテーブルで、Ｋｅｙ：ＩＤ「１」、「１０２」に対するデータセットを格納していない。データノード３００「Ｎ２」のデータ取得部３３０は、図１０のＫｅｙ情報２２１を参照し、Ｋｅｙ：ＩＤ「１」、「１０２」に対するデータセットのレプリカを格納しているテーブルとして、それぞれ、メインレプリカテーブル、サブテーブルを特定する。
【００９８】
対象Ｋｅｙと特定されたテーブルのＫｅｙが同じ場合（ステップＣ２０４／Ｙ）、データ取得部３３０は、対象Ｋｅｙの値を用いて、特定されたテーブルから、データセットを取得する（ステップＣ２０５）。
【００９９】
例えば、データノード３００「Ｎ２」のデータ取得部３３０は、図９におけるメインレプリカテーブルから、Ｋｅｙ：ＩＤ「１」に対するデータセット＜Ｋｅｙ：ＩＤ「１」、Ｖａｌｕｅ：名前「ＡＣ」、住所「東京」＞を取得する。
【０１００】
一方、対象Ｋｅｙと特定されたテーブルのＫｅｙが異なる場合（ステップＣ２０４／Ｎ）、データ取得部３３０は、Ｋｅｙ情報２２２を参照して、対象Ｋｅｙの値に対する特定されたテーブルのＫｅｙの値を特定する（ステップＣ２０６）。そして、データ取得部３３０は、特定したＫｅｙの値を用いて、特定されたテーブルからデータセットを取得する（ステップＣ２０７）。さらに、データ取得部３３０は、取得したデータセットを、対象Ｋｅｙに対するデータセットの形式に変換する（ステップＣ２０８）。
【０１０１】
例えば、データノード３００「Ｎ２」のデータ取得部３３０は、図１０のＫｅｙ情報２２２を参照し、対象Ｋｅｙ：ＩＤ「１０２」に対するＫｅｙ：名前「ＢＢ」を特定する。データ取得部３３０は、図９におけるサブテーブルから、Ｋｅｙ：名前「ＢＢ」に対するデータセット＜Ｋｅｙ：名前「ＢＢ」、Ｖａｌｕｅ：ＩＤ「１０２」、住所「沖縄」＞を取得する。データ取得部３３０は、当該データセットを、データセット＜Ｋｅｙ：ＩＤ「１０２」、Ｖａｌｕｅ：名前「ＢＢ」、住所「沖縄」＞へ変換する。データ取得部３３０は、Ｋｅｙ：ＩＤ「１」、「１０２」に対するデータセットを、クライアント装置５００へ返却する。
【０１０２】
同様に、データノード３００「Ｎ３」のデータ取得部３３０も、サブテーブルを用いて、データセット＜Ｋｅｙ：ＩＤ「２」、Ｖａｌｕｅ：名前「ＺＺ」、住所「ロシア」＞、＜Ｋｅｙ：ＩＤ「３」、Ｖａｌｕｅ：名前「ＵＵ」、住所「アメリカ」＞を取得する。データ取得部３３０は、Ｋｅｙ：ＩＤ「２」、「３」に対するデータセットを、クライアント装置５００へ返却する。
【０１０３】
以上により、本発明の第１の実施の形態の動作が完了する。
【０１０４】
なお、上述の例では、メインテーブルに格納されているデータセットのレプリカを、メインレプリカテーブル、または、サブテーブルから取得する場合を説明した。同様の方法で、サブテーブルに格納されているデータセットのレプリカも、メインテーブル、または、メインレプリカテーブルから取得できる。
【０１０５】
また、上述の例では、図９のように、データノード３００「Ｎ１」において、メインテーブルのＫｅｙ：ＩＤ「１」とサブテーブルのＫｅｙ：名前「ＡＣ」に対するデータセットが同じである。このように、同じデータノード３００のメインテーブルとサブテーブルに同じデータセットが存在する場合、サブテーブルにおいて、メインテーブルのデータセットへの参照関係を設定してもよい。この場合、メインテーブルからデータセットが取得され、サブテーブルのデータセットに変換される。
【０１０６】
次に、本発明の第１の実施の形態の特徴的な構成を説明する。図１は、本明の第１の実施の形態の特徴的な構成を示すブロック図である。
【０１０７】
図１を参照すると、ストレージシステム１００は、複数のデータノード３００を含む。複数のデータノード３００の各々は、データ記憶部３４０、及び、データ取得部３３０を記憶する。
【０１０８】
データ記憶部３４０は、データセットの複数のデータ要素の内の異なる第１、及び、第２のデータ要素の値をキーとして、それぞれ、複数のデータセットを格納する、第１、及び、第２のテーブルの各々の、当該データノード３００に割り当てられた部分を記憶する。
【０１０９】
データ取得部３３０は、第１、及び、第２のデータ要素の内の一方のデータ要素の値が入力された場合に、次のようにデータセットを取得し、出力する。すなわち、データ取得部３３０は、一方のデータ要素に係るテーブルの当該データノード３００に割り当てられた部分から、当該一方のデータ要素の値をキーとして、当該一方のデータ要素の値を含むデータセットを取得する。また、データ取得部３３０は、他方のデータ要素に係るテーブルの当該データノード３００に割り当てられた部分から、当該一方のデータ要素の値に対応する当該他方のデータ要素の値をキーとして、当該一方のデータ要素の値を含むデータセットを取得する。
【０１１０】
次に、本発明の第１の実施の形態の効果を説明する。
【０１１１】
本発明の第１の実施の形態によれば、ストレージシステムにおいて、異なるＫｅｙによるアクセスを効率的に実現できる。その理由は、以下の通りである。複数のデータノード３００の各々のデータ記憶部３４０は、データセットの異なるデータ要素の値をキーとする、メインテーブル、サブテーブルの当該データノード３００に割り当てられた部分を記憶する。データ取得部３３０は、異なるデータ要素の内の一方のデータ要素の値が入力された場合に、一方のデータ要素に係るテーブルの割り当てられた部分から、当該一方のデータ要素の値をキーとして、当該一方のデータ要素の値を含むデータセットを取得する。また、データ取得部３３０は、他方のデータ要素に係るテーブルの割り当てられた部分から、当該一方のデータ要素の値に対応する当該他方のデータ要素の値をキーとして、当該一方のデータ要素の値を含むデータセットを取得する。
【０１１２】
これにより、例えば、サブテーブルにおいて、メインテーブルに格納されているデータセットのレプリカが、メインテーブルとは異なるデータノード３００に格納されていれば、メインレプリカテーブルから、当該データセットを削除できる。すなわち、同じデータ構造を２重に持つことなく、データセットのレプリカを提供しながら、メインテーブルのＫｅｙとは異なるＫｅｙで、ストレージシステム１００にアクセスできる。
【０１１３】
また、非特許文献に記載されているような分散ストレージにおいて、Ｋｅｙ以外の、Ｖａｌｕｅに含まれるデータ要素を指定して、データセットを取得するためには、例えば、当該データ要素とＫｅｙとを対応づけたインデックステーブル用いる方法があった。しかしながら、インデックステーブルを用いた分散ストレージへのアクセスは、範囲検索において、Ｋｅｙの値が連続しないため、ランダムアクセスとなり、アクセス速度が低下する問題があった。
【０１１４】
本発明の第１の実施の形態によれば、ストレージシステムにおいて、異なるＫｅｙによるアクセスを高速に実現できる。その理由は、サブテーブルで、データセットがサブテーブルのＫｅｙの値でソーティングされ、各データノード３００のデータ記憶部３４０が、サブテーブルの割り当てられた部分のデータセットを、ソーティングされた順番で格納するためである。これにより、範囲検索において、データ記憶部３４０対するアクセスが連続アクセスとなり、特に、データ記憶部３４０が、記憶媒体としてＨＤＤを用いている場合、ランダムアクセスの場合に比べて、アクセス速度が向上する。
【０１１５】
（第２の実施の形態）
次に、本発明の第２の実施の形態について説明する。
【０１１６】
本発明の第２の実施の形態においては、１以上のデータセットを含むブロック単位で、各データノード３００へのデータセットの割り当てが行われる点において、本発明の第１の実施の形態と異なる。
【０１１７】
はじめに、本発明の第２の実施の形態の構成について説明する。本発明の第２の実施の形態の構成を示すブロック図は、本発明の第１の実施の形態（図２）と同様となる。
【０１１８】
本発明の第２の実施の形態では、メインテーブルの各データノード３００に割り当てられた部分は、各々が１以上のデータセットを含む１以上のブロックに分割される。各ブロックに含まれるデータセットの数は、各データノード３００で定義された所定の値でもよいし、ストレージシステム１００で定義された所定の値でもよい。また、各ブロックに含まれるデータセットの数は、ブロックごとに異なっていてもよい。
【０１１９】
また、メインレプリカテーブルでは、メインテーブルにおける各ブロックが、メインテーブルとは異なるデータノード３００に割り当てられる。
【０１２０】
図１１は、本発明の第２の実施の形態における、テーブルの例を示す図である。
【０１２１】
図１１の例では、メインテーブルにおいて、データノード３００「Ｎ１」に格納されているＫｅｙ：ＩＤ「１」、「２」、「３」、「１０２」のデータセットにより、ブロック「Ｂ１」が構成されている。同様に、データノード３００「Ｎ２」、「Ｎ３」に格納されているデータセットにより、それぞれ、ブロック「Ｂ２」、「Ｂ３」が構成されている。また、メインレプリカテーブルにおいて、ブロック「Ｂ３」、「Ｂ１」、「Ｂ２」が、それぞれ、データノード３００「Ｎ１」、「Ｎ２」、「Ｎ３」に格納されている。
【０１２２】
また、サブテーブルでは、メインテーブルにおける各ブロックが、メインレプリカテーブルと同じデータノード３００に割り当てられる。また、サブテーブルでは、各ブロック内のデータセットが、サブテーブルのＫｅｙの値でソーティングされる。
【０１２３】
図１３、図１５は、本発明の第２の実施の形態における、テーブルの他の例を示す図である。
【０１２４】
図１３、図１５の例では、サブテーブルでも、ブロック「Ｂ３」、「Ｂ１」、「Ｂ２」が、それぞれ、データノード３００「Ｎ１」、「Ｎ２」、「Ｎ３」に格納されている。
【０１２５】
図１２、図１４、及び、図１６は、本発明の第２の実施の形態における、Ｋｅｙ情報２２１、２２２の例を示す図である。図１２のＫｅｙ情報２２１は、図１１のテーブルに対応する。図１４、図１６のＫｅｙ情報２２１、２２２は、それぞれ、図１３、図１５のテーブルに対応する。
【０１２６】
本発明の第２の実施の形態における、Ｋｅｙ情報２２１、２２２の「メイン」、「メインレプリカ」、「サブ」欄には、データノード３００の識別子に加えて、ブロックの識別子が付与される。
【０１２７】
データノード３００のテーブル生成部３１０は、サブテーブルにおいて割り当てられた部分の各ブロックの各データセットを、各ブロックにおいてソーティングされた順番で、データ記憶部３４０に格納する。
【０１２８】
次に、本発明の第２の実施の形態の動作について説明する。
【０１２９】
＜サブテーブル生成処理＞
はじめに、本発明の第２の実施の形態における、サブテーブル生成処理について説明する。
【０１３０】
ここでは、各データノード３００のデータ記憶部３４０に、図１１のように、ＩＤをＫｅｙとしたメインテーブル、及び、メインレプリカテーブルが記憶されていると仮定する。また、これらのテーブルに対して、図１２のようなＫｅｙ情報２２１が、Ｋｅｙ情報記憶部２２０に記憶されていると仮定する。
【０１３１】
本発明の第２の実施の形態では、第１の実施の形態のサブテーブル生成処理（図３）のステップＢ１０２で、メインレプリカテーブルとサブテーブルで同じブロックが同じデータノード３００に格納されるように、サブテーブルのＫｅｙの値が割り当てられる。
【０１３２】
例えば、制御部２１０は、図１４のＫｅｙ情報２２２において、ブロック「Ｂ３」に含まれるＫｅｙ：名前「ＡＡ」、「ＣＣ」をデータノード３００「Ｎ１」に割り当てる。また、制御部２１０は、ブロック「Ｂ１」に含まれる、Ｋｅｙ：名前「ＡＣ」、「ＢＢ」、「ＵＵ」、「ＺＺ」をデータノード３００「Ｎ２」に、ブロック「Ｂ２」に含まれる、Ｋｅｙ：名前「ＡＢ」、「ＡＤ」、「ＤＤ」をデータノード３００「Ｎ３」に割り当てる。
【０１３３】
データノード３００「Ｎ１」のテーブル生成部３１０は、図１４のＫｅｙ情報２２２における、Ｋｅｙ：名前「ＡＡ」に対するデータセットを、図１３のようにデータ記憶部３４０におけるサブテーブルに格納する。同様に、テーブル生成部３１０は、Ｋｅｙ：名前「ＣＣ」に対するデータセットを、データ記憶部３４０において、Ｋｅｙ：名前「ＡＡ」のデータセットの次に格納する。データノード３００「Ｎ２」、「Ｎ３」も同様に、サブテーブルにおける割り当てられた部分を、データ記憶部３４０に格納する。この結果、データノード３００「Ｎ１」、「Ｎ２」、「Ｎ３」には、図１３のように、サブテーブルが生成、格納される。
【０１３４】
さらに、制御部２１０は、図１６のように、Ｋｅｙ情報２２１、２２２から、メインレプリカテーブルにおける、冗長なデータセットに係るデータノード３００の割り当てを削除する。
【０１３５】
データノード３００「Ｎ１」、「Ｎ２」、「Ｎ３」は、図１６のＫｅｙ情報２２１をもとに、図１５のように、メインレプリカテーブルから冗長なデータセットを削除する。
【０１３６】
＜データ読み出し処理＞
次に、本発明の第２の実施の形態における、データ読み出し処理について説明する。
【０１３７】
本発明の第２の実施の形態におけるデータ読み出し処理は、本発明の第１の実施の形態（図４）と同様となる。
【０１３８】
例えば、アプリケーション５１０が、サブテーブルにおけるＫｅｙ：名前「ＡＡ」〜「ＡＤ」の範囲検索を指示したと仮定する。この場合、ライブラリ５２０は、対象テーブル：サブテーブル、対象Ｋｅｙ：名前「ＡＡ」〜「ＡＤ」として、データノード問い合わせを、制御ノード２００へ送信する。
【０１３９】
制御部２１０は、図１６のＫｅｙ情報２２２を参照し、サブテーブルにおいて、Ｋｅｙ：名前「ＡＡ」を格納するデータノード３００の識別子「Ｎ１」を抽出する。また、制御部２１０は、サブテーブルにおいて、Ｋｅｙ：名前「ＡＢ」、「ＡＤ」を格納するデータノード３００の識別子「Ｎ３」、Ｋｅｙ：名前「ＡＣ」を格納するデータノード３００の識別子「Ｎ２」を抽出する。
【０１４０】
制御部２１０は、Ｋｅｙ：名前「ＡＡ」に対してデータノード３００「Ｎ１」、Ｋｅｙ：名前「ＡＢ」、「ＡＤ」に対してデータノード３００「Ｎ３」、Ｋｅｙ：名前「ＡＣ」に対してデータノード３００「Ｎ２」を、クライアント装置５００へ返却する。
【０１４１】
ライブラリ５２０は、データノード３００「Ｎ１」に、対象テーブル：サブテーブル、対象Ｋｅｙ：名前「ＡＡ」として、データ取得要求を送信する。また、ライブラリ５２０は、同時に、データノード３００「Ｎ３」に、対象テーブル：サブテーブル、対象Ｋｅｙ：名前「ＡＢ」、「ＡＤ」として、データ取得要求を送信する。さらに、ライブラリ５２０は、同時に、データノード３００「Ｎ２」に、対象テーブル：サブテーブル、対象Ｋｅｙ：名前「ＡＣ」として、データ取得要求を送信する。
【０１４２】
データノード３００「Ｎ１」のデータ取得部３３０は、図１５におけるサブテーブルから、Ｋｅｙ：名前「ＡＡ」に対するデータセット＜Ｋｅｙ：名前「ＡＡ」、Ｖａｌｕｅ：ＩＤ「３０１」、「富山」を取得し、クライアント装置５００へ返却する。同様に、データノード３００「Ｎ３」のデータ取得部３３０は、サブテーブルから、Ｋｅｙ：名前「ＡＢ」、「ＡＤ」に対するデータセットを取得し、クライアント装置５００へ返却する。データノード３００「Ｎ２」のデータ取得部３３０は、サブテーブルから、Ｋｅｙ：名前「ＡＣ」に対するデータセットを取得し、クライアント装置５００へ返却する。
【０１４３】
クライアント装置５００のライブラリ５２０は、データノード３００「Ｎ１」、「Ｎ２」、「Ｎ３」から取得したＫｅｙ：名前「ＡＡ」〜「ＡＤ」に対するデータセットを、まとめて、アプリケーション５１０に転送する。
【０１４４】
以上により、本発明の第２の実施の形態の動作が完了する。
【０１４５】
次に、本発明の第２の実施の形態の効果を説明する。
【０１４６】
本発明の第２の実施の形態によれば、ブロック単位でデータセットが管理される場合でも、異なるＫｅｙによるアクセスを効率的、かつ、高速に実行できる。その理由は、ライブラリ５２０が、複数のブロックへの同時アクセスを行い、さらに、データ記憶部３４０が、各ブロック内のデータセットを、サブテーブルのＫｅｙの値でソーティングされた順番で格納するためである。これにより、範囲検索において、複数のブロックに対する処理が並行して行われ、さらに、データ記憶部３４０対するアクセスが連続アクセスとなり、アクセス速度がより向上する。
【０１４７】
（第３の実施の形態）
次に、本発明の第３の実施の形態について説明する。
【０１４８】
本発明の第３の実施の形態においては、ソーティングバッファを用いて、ストレージシステム１００から読み出したデータセットのソートを行う点において、本発明の第２の実施の形態と異なる。
【０１４９】
はじめに、本発明の第３の実施の形態の構成について説明する。
【０１５０】
図１７は、本発明の第３の実施の形態の構成を示すブロック図である。図１７を参照すると、本発明の第３の実施の形態におけるクライアント装置５００は、さらに、ソーティング部５３０を含む。
【０１５１】
ソーティング部５３０は、ソーティングバッファを用いてデータセットのソーティング処理を行う。ソーティング部５３０は、サブテーブルの全Ｋｅｙ、あるいは、特定の範囲のＫｅｙに対するデータセットの取得（範囲検索）を行う場合に、データノード３００から取得したデータセットをサブテーブルのＫｅｙの値でソーティングする。
【０１５２】
なお、ストレージシステム１００が、クライアント装置５００の代わりに、ソーティング部５３０を含んでいてもよい。
【０１５３】
また、本発明の第３の実施の形態では、サブテーブルにおいて、先頭のデータセットのＫｅｙの値でソーティングされたブロックが、データノード３００の識別子の順番に、データノード３００に割り当てられる。ここで、先頭のデータセットとは、各ブロック内のデータセットをサブテーブルのＫｅｙでソーティングしたときの先頭のデータセットである。
【０１５４】
図１９、図２１は、本発明の第３の実施の形態における、テーブルの例を示す図である。図１９、図２１の例では、サブテーブルにおいて、先頭のデータセットのＫｅｙが名前「ＡＡ」である、ブロック「Ｂ３」が、データノード３００「Ｎ１」に格納されている。また、先頭のデータセットのＫｅｙが名前「ＡＢ」である、ブロック「Ｂ２」が、データノード３００「Ｎ２」に、先頭のデータセットのＫｅｙが名前「ＡＣ」である、ブロック「Ｂ１」が、データノード３００「Ｎ３」に格納されている。
【０１５５】
図２０、図２２は、本発明の第３の実施の形態における、Ｋｅｙ情報２２１、２２２の例を示す図である。図２０、図２２のＫｅｙ情報２２１、２２２は、それぞれ、図１９、図２１のテーブルに対応する。
【０１５６】
次に、本発明の第３の実施の形態の動作について説明する。
【０１５７】
＜サブテーブル生成処理＞
はじめに、本発明の第３の実施の形態における、サブテーブル生成処理について説明する。
【０１５８】
ここでは、本発明の第２の実施の形態と同様に、各データノード３００のデータ記憶部３４０に、図１１のように、ＩＤをＫｅｙとしたメインテーブル、及び、メインレプリカテーブルが記憶されていると仮定する。また、これらのテーブルに対して、図１２のようなＫｅｙ情報２２１が、Ｋｅｙ情報記憶部２２０に記憶されていると仮定する。
【０１５９】
本発明の第３の実施の形態では、第２の実施の形態のサブテーブル生成処理（図３）のステップＢ１０２で、先頭のデータセットのＫｅｙの値でソーティングされたブロックが、データノード３００の識別子の順番に、データノード３００に割り当てられる。
【０１６０】
例えば、図１１のブロック「Ｂ１」、「Ｂ２」、「Ｂ３」において、先頭のデータセットのＫｅｙ：名前は、それぞれ、「ＡＣ」、「ＡＢ」、「ＡＡ」である。したがって、制御部２１０は、図２０のＫｅｙ情報２２２において、ブロック「Ｂ３」、「Ｂ２」、「Ｂ１」のデータセットを、それぞれ、データノード３００「Ｎ１」、「Ｎ２」、「Ｎ３」に割り当てる。すなわち、制御部２１０は、ブロック「Ｂ３」に含まれるＫｅｙ：名前「ＡＡ」、「ＣＣ」をデータノード３００「Ｎ１」に割り当てる。また、制御部２１０は、ブロック「Ｂ２」に含まれる、Ｋｅｙ：名前「ＡＢ」、「ＡＤ」、「ＤＤ」をデータノード３００「Ｎ２」に割り当てる。制御部２１０は、ブロック「Ｂ１」に含まれる、Ｋｅｙ：名前「ＡＣ」、「ＢＢ」、「ＵＵ」、「ＺＺ」をデータノード３００「Ｎ３」に割り当てる。
【０１６１】
データノード３００「Ｎ１」、「Ｎ２」、「Ｎ３」は、図２０のＫｅｙ情報２２２をもとに、図１９のようにサブテーブルを生成する。
【０１６２】
さらに、制御部２１０は、図２２のように、Ｋｅｙ情報２２１、２２２から、メインレプリカテーブルにおける、冗長なデータセットに係るデータノード３００の割り当てを削除する。
【０１６３】
データノード３００「Ｎ１」、「Ｎ２」、「Ｎ３」は、図２２のＫｅｙ情報２２１をもとに、図２１のように、メインレプリカテーブルから冗長なデータセットを削除する。
【０１６４】
＜データ読み出し処理＞
次に、本発明の第３の実施の形態における、データ読み出し処理について説明する。
【０１６５】
ここでは、クライアント装置５００のアプリケーション５１０が、ストレージシステム１００に対して、サブテーブルのＫｅｙの全ての値に対するデータセットの取得を行う場合を例に、動作を説明する。
【０１６６】
図１８は、本発明の第３の実施の形態における、データ読み出し処理を示すフローチャートである。
【０１６７】
はじめに、クライアント装置５００において、ライブラリ５２０がデータノード問い合わせを送信するまでの処理（ステップＡ３０１、Ａ３０２）は、本発明の第１、２の実施の形態（図４、ステップＡ２０１、Ａ２０２）と同様となる。
【０１６８】
例えば、ライブラリ５２０は、対象テーブル：サブテーブル、対象Ｋｅｙ：名前「Ａｌｌ」を指定して、データノード問い合わせを、制御ノード２００へ送信する。
【０１６９】
制御部２１０は、図２２のＫｅｙ情報２２２を参照し、各ブロックの先頭のＫｅｙの値と当該ブロックのデータセットを格納するデータノード３００の識別子を抽出し、クライアント装置５００へ返却する。
【０１７０】
例えば、制御部２１０は、Ｋｅｙ：名前「ＡＡ」に対してデータノード３００「Ｎ１」、Ｋｅｙ：名前「ＡＢ」に対してデータノード３００「Ｎ２」、Ｋｅｙ：名前「ＡＣ」に対してデータノード３００「Ｎ３」を、クライアント装置５００へ返却する。
【０１７１】
クライアント装置５００のソーティング部５３０は、ブロック数のサイズのソーティングバッファを準備する（Ａ３０３）。
【０１７２】
図２３は、本発明の第３の実施の形態における、ソーティングバッファの例を示す図である。
【０１７３】
例えば、制御部２１０は、図２３のように、サイズ「３」のソーティングバッファを準備する。
【０１７４】
ソーティング部５３０は、各ブロックのデータセットを格納するデータノード３００へ、サブテーブルと当該ブロックの先頭のＫｅｙの値を指定して、当該ブロックの先頭のデータセットを要求する（Ａ３０４）。
【０１７５】
例えば、ソーティング部５３０は、データノード３００「Ｎ１」、「Ｎ２」、「Ｎ３」に、それぞれ、先頭Ｋｅｙ：名前「ＡＡ」、「ＡＢ」、「ＡＣ」として、データ取得要求を送信する。
【０１７６】
各データノード３００のデータ取得部３３０は、サブテーブルから、先頭のＫｅｙの値に対するデータセットを取得し、クライアント装置５００へ返却する。
【０１７７】
例えば、データノード３００「Ｎ１」、「Ｎ２」、「Ｎ３」のデータ取得部３３０は、図２１のサブテーブルから、それぞれ、Ｋｅｙ：名前「ＡＡ」、「ＡＢ」、「ＡＣ」に対するデータセットを取得し、クライアント装置５００へ返却する。
【０１７８】
ソーティング部５３０は、各データノード３００から取得したデータセットを、データノード３００の識別子の順番にソーティングバッファに挿入する（Ａ３０５）。
【０１７９】
例えば、ソーティング部５３０は、図２３の状態（ａ）のように、データノード３００の識別子の順番で、取得したデータセットを挿入する。
【０１８０】
この時点で、ソーティングバッファの先頭のデータセット（Ｋｅｙ：名前「ＡＡ」）は、範囲検索における先頭のデータセットである。また、ソーティングバッファ内では、データセットがサブテーブルのＫｅｙの値でソーティングされている。
【０１８１】
ソーティング部５３０は、ソーティングバッファの先頭のデータセットの取得元のデータノード３００へ、当該データセットが含まれていたブロックにおける次のデータセットを要求する（Ａ３０６）。
【０１８２】
例えば、ソーティング部５３０は、先頭のデータセット（Ｋｅｙ：名前「ＡＡ」）の取得元である、データノード３００「Ｎ１」に、次のデータセットを要求する。
【０１８３】
データノード３００のデータ取得部３３０は、次のデータセットがあれば、当該データセットをクライアント装置５００へ返却する。
【０１８４】
例えば、データノード３００「Ｎ１」のデータ取得部３３０は、図２１のサブテーブルから、次のＫｅｙ：名前「ＣＣ」に対するデータセットを取得し、クライアント装置５００へ返却する。
【０１８５】
ソーティング部５３０は、ソーティングバッファの先頭のデータセットを、ライブラリ５２０を介して、アプリケーション５１０へ転送するとともに、データノード３００から取得したデータセットを、ソーティングバッファに挿入する。ここで、ソーティング部５３０は、データセットを、Ｋｅｙの値でソーティングして挿入する（Ａ３０７）。
【０１８６】
例えば、ソーティング部５３０は、アプリケーション５１０に、Ｋｅｙ：名前「ＡＡ」に対するデータセットを転送するとともに、図２３の状態（ｂ）のように、Ｋｅｙ：名前「ＣＣ」に対するデータセットを、ソーティングバッファに挿入する。
【０１８７】
ソーティング部５３０は、ステップＡ３０６、Ａ３０７の処理を、ソーティングバッファが空になるまで繰り返す（Ａ３０８）。
【０１８８】
例えば、ソーティング部５３０は、先頭のデータセット（Ｋｅｙ：名前「ＡＢ」）の取得元である、データノード３００「Ｎ２」に、次のデータセットを要求する。
【０１８９】
データノード３００「Ｎ２」のデータ取得部３３０は、図２１のサブテーブルから、次のＫｅｙ：名前「ＡＤ」に対するデータセットを取得し、クライアント装置５００へ返却する。
【０１９０】
ソーティング部５３０は、ライブラリ５２０を介して、アプリケーション５１０に、Ｋｅｙ：名前「ＡＢ」に対するデータセットを転送するとともに、図２３の状態（ｃ）のように、Ｋｅｙ：名前「ＡＤ」に対するデータセットを設定する。
【０１９１】
以上により、本発明の第３の実施の形態の動作が完了する。
【０１９２】
なお、上述の例では、サブテーブルのＫｅｙの全ての値に対するデータセットの取得を行う場合を説明した。特定の範囲の値に対するデータセットの取得を行う場合、上述のステップＡ３０５で、ライブラリ５２０は、各データノード３００から取得したデータセットを、Ｋｅｙの値でソーティングして、ソーティングバッファに挿入する。
【０１９３】
また、サブテーブルにおいて、データノード３００に割り当てられたブロックが複数ある場合、データノード３００は、複数のブロックをまとめて、ラージブロックを生成してもよい。ラージブロック内のデータセットをＫｅｙの値でソートすることにより、Ｋｅｙの値の連続性をさらに向上させることができる。
【０１９４】
次に、本発明の第３の実施の形態の効果を説明する。
【０１９５】
本発明の第３の実施の形態によれば、範囲検索において、Ｋｅｙの値でソートされたデータセットを、負荷を上げることなく取得できる。その理由は、ソーティング部５３０が、各ブロックからデータセットを順番に取得し、ブロック数の長さのソーティングバッファにおいて、Ｋｅｙの値の順番に並べ換え、順番に出力するためである。
【０１９６】
また、本発明の第３の実施の形態によれば、Ｋｅｙの全ての値を指定した検索において、Ｋｅｙの値でソートされたデータセットを高速に取得できる。その理由は、サブテーブルにおいて、先頭のデータセットのＫｅｙの値でソーティングされたブロックが、データノード３００の識別子の順番に、データノード３００に割り当てられるためである。これにより、ソーティング部５３０が、各ブロックの先頭のデータセットをデータノード３００の識別子の順番にソーティングバッファに挿入するだけで、ソートされたデータセットのリストが得られる。
【０１９７】
以上、実施形態を参照して本願発明を説明したが、本願発明は上記実施形態に限定されるものではない。本願発明の構成や詳細には、本願発明のスコープ内で当業者が理解し得る様々な変更をすることができる。
【符号の説明】
【０１９８】
１００    ストレージシステム
２００    制御ノード
２１０    制御部
２２０    Ｋｅｙ情報記憶部
２２１    Ｋｅｙ情報
２２２    Ｋｅｙ情報
３００    データノード
３１０    テーブル生成部
３２０    Ｋｅｙ情報記憶部
３３０    データ取得部
３４０    データ記憶部
５００    クライアント装置
５１０    アプリケーション
５２０    ライブラリ
５３０    ソーティング部
【図１】
2015179410.tif 000003
【図２】
2015179410.tif 000004
【図３】
2015179410.tif 000005
【図４】
2015179410.tif 000006
【図５】
2015179410.tif 000007
【図６】
2015179410.tif 000008
【図７】
2015179410.tif 000009
【図８】
2015179410.tif 000010
【図９】
2015179410.tif 000011
【図１０】
2015179410.tif 000012
【図１１】
2015179410.tif 000013
【図１２】
2015179410.tif 000014
【図１３】
2015179410.tif 000015
【図１４】
2015179410.tif 000016
【図１５】
2015179410.tif 000017
【図１６】
2015179410.tif 000018
【図１７】
2015179410.tif 000019
【図１８】
2015179410.tif 000020
【図１９】
2015179410.tif 000021
【図２０】
2015179410.tif 000022
【図２１】
2015179410.tif 000023
【図２２】
2015179410.tif 000024
【図２３】
2015179410.tif 000025