(57)【特許請求の範囲】
【請求項１】
複数のストレージと該ストレージと組み合わされたプロセッサとメモリを含めて構成された物理ノードの複数が接続されたネットワーク上に構成される範囲検索可能なクラウドストレージにおいて上記物理ノードの負荷分散を図る方法であって、
上記範囲検索可能なクラウドストレージを、上記ストレージによる共通の容量値の仮想ストレージと該仮想ストレージが係属するプロセッサによる仮想プロセッサとメモリが構成要素となる仮想ノードの複数が接続されたオーバレイネットワーク上に形成し、
データ蓄積においては、上記範囲検索可能なクラウドストレージにキーバリュー（key-value）型データを蓄積し、
検索においては、上記仮想ノードを所定のキーバリューについて検索し、
各仮想ノードのデータ蓄積量に負荷分散のための下限と該下限の所定倍で仮想ノードの容量となる上限とを設け、
（１）第１仮想ノードに新たなデータを追加しようとする場合に、追加によるデータ量が上記上限以上の場合は、前記追加によるデータ量について、上記検索可能なクラウドストレージから選択した空仮想ノードを第２仮想ノードとして、第１仮想ノードから第２仮想ノードに上記上限の半分の分量のデータを振り分けると共に、この振り分けによる新たな順に上記オーバレイネットワーク上の仮想ノードの並びを更新することを特徴とする、範囲検索可能なクラウドストレージにおける負荷分散方法。
【請求項２】
上記クラウドストレージを構成する物理ノードから選択された第１物理ノードと第２物理ノードについて、
上記物理ノードの空でない仮想ノード数の全体の仮想ノード数に対する比をμとし、所定の閾値パラメータλ（∈（０、１））を用いて、
（１）第１物理ノードに属する仮想ノードにおける空でないノード数の第１物理ノードに属する仮想ノード数の比μ1と、第２物理ノードに属する上記仮想ノード数に対する空でない仮想ノード数の比μ2について、μ1（１＋λ）が上記μより大きく、μ2（１−λ）が上記μより小さいときに、
（２）第１物理ノードに属する空でない仮想ノードから第２物理ノードに属する空の仮想ノードへの、保持データに関するスワップを行い、
（３）上記オーバレイネットワーク上のノードの並びを更新することを特徴とする請求項１に記載の範囲検索可能なクラウドストレージにおける負荷分散方法。
【請求項３】
上記範囲検索可能なクラウドストレージにおける上記のキーバリューについての検索は、コード＃アルゴリズムに従った検索であることを特徴とする請求項１あるいは２に記載の範囲検索可能なクラウドストレージにおける負荷分散方法。
【請求項４】
上記オーバレイネットワークにおいて空仮想ノードの全体が上記オーバレイネットワークの並びの連続した一画を占める空仮想ノードプールを構成し、
上記空の仮想ノードは、該空仮想ノードプールから選択するものであることを特徴とする請求項１から３のいずれか１つに記載の範囲検索可能なクラウドストレージにおける負荷分散方法。
【請求項５】
上記各物理ノードにおけるストレージは、ストレージを分割したものであり、その分割は、同じサイズの領域の数が最多となる分割であることを特徴とする請求項１から４のいずれか１つに記載の範囲検索可能なクラウドストレージにおける負荷分散方法。
【請求項６】
上記所定倍は、２倍を超え２．０８倍以下であることを特徴とする請求項１から５のいずれか１つに記載の範囲検索可能なクラウドストレージにおける負荷分散方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、クラウド上に分散して蓄積されたキーバリュー（key-value）型データについて、ストレージ資源の利用率を高めることができる、範囲検索可能なクラウドストレージにおける負荷分散方法に関する。
【背景技術】
【０００２】
近年、ビッグデータ処理向けのクラウドストレージが急速に発展している。中でも、特にソーシャルネットワークとＩоＴなどにおける時空間データを効率的に処理するための範囲検索可能なクラウドストレージが注目されつつある。しかし、範囲検索を可能にするために、データのローカリティ（局所参照性）を保つことが必要であり、物理ノード間の低コストかつ高効率の負荷分散はきわめて困難な課題である。
【０００３】
従来技術では、隣接ノードのリモートマイグレーションといった手法が多く用いられている。隣接ノードのリモートマイグレーションとは、負荷が軽いノードが自分の負荷を、担当範囲が隣接するノードに移動し、自分が空きノードになった後、元の位置を離れ、リモートの負荷が重いノードの隣にマイグレーションし、その重いノードの負荷を担当するという仕組みである。
従来技術の問題点としては、オーバヘッドが非常に大きいことと処理速度が遅いことである。
【０００４】
この従来技術の一例を図５に示す。図５は、ＡからＦの各ノードの負荷とその担当範囲とを示す。ノード間で作業負荷を再バランスさせる基本的なメカニズムとして、従来の大概のものでは上記リモートマイグレーション用のリオーダー（Reorder）操作を用いている。これは、仮に第２ノードが過少負荷であり、他の過剰負荷ノードを救済するものとする。この場合は、まず、第２ノードのすべての作業負荷を隣の方へ移動する。その第２ノードは空ノードになるので、一旦システムから離れ、また過剰負荷ノードの隣へ再加入する。その過剰負荷ノードはその負荷を隣にできた空ノードに移す。この場合の移動コストは、図５のαとβを加えたものである。この操作によっては、移動されるデータ量が多いが、バランシング効果は限られている。
【０００５】
本発明では、検索アルゴリズムにコード＃（ＣＨＯＲＤ＃）アルゴリズムを用いて仮想ノードの管理を行うが、このアルゴリズムの、よく知られたコード（ＣＨＯＲＤ）アルゴリズムと比べての類似点と相異点は、概略下記の通りである。
つまりコードでは複数のノードが論理的な配置でリング状に並べられ、各ノードに検索項目となるキーがハッシュ関数によって分散されて関連付けられる。検索は、上記キーによるキー空間で行う。このため、各ノードはキーとアドレスに関するフィンガーテーブルを備え、それには、上記リングを半周、４分の１周と順次半分の行程とするノードのアドレスが書かれている。
これに対してコード＃では、複数のノードが論理的な配置でリング状に並べられる点ではそれに類似しているが、一次元に並べられるデータに関する項目が、各ノードが所定の範囲を受け持ち、かつ前記データの順で並ぶ構成である。検索は、上記ノードによるノード空間で行う。各ノードは上記と同様なフィンガーテーブルを備えるがノードとアドレスに関するものである。
【０００６】
上記の様にコードの場合はハッシュ関数を用いるので、ノード毎のキー数の分布は平均化される。しかし、ノード位置とキー順の関連がばらばらになっており、範囲検索は容易ではない。これに対してコード＃の場合はハッシュ関数を用いないので、ノード位置とキー順の関連を簡単な対応づけで済ませることができる。しかし、ノード毎のキー数の分布には偏りが生じる。
【先行技術文献】
【非特許文献】
【０００７】
【非特許文献１】H. C. Hsiao, H. Y. Chung, H. Shen, and Y. C. Chao, “Load Rebalancingfor Distributed File Systems in Clouds,” IEEE Transactions on Paralleland Distributed Systems, vol. 24, no. 5, pp. 951-962, May. 2013.
【発明の概要】
【発明が解決しようとする課題】
【０００８】
本発明の目的は、クラウド上に分散して蓄積されたキーバリュー（key-value）型データについて、ストレージ資源の利用率を高めることができるようにすることである。
【課題を解決するための手段】
【０００９】
このため、本発明では、範囲検索可能なクラウドストレージにおいて範囲検索を行うが、そのクラウドストレージ上の仮想ノードの基盤となる物理ノードに割り当てられたデータが量的に偏在することが無い様にするために、負荷分散を行う。
【００１０】
まず、本発明の、範囲検索可能なクラウドストレージにおける負荷分散方法で用いるクラウドストレージは、複数のストレージと該ストレージと組み合わされたプロセッサとメモリを含めて構成された物理ノードの複数が接続されたネットワーク上に構成されるもので、
上記範囲検索可能なクラウドストレージを、上記ストレージによる共通の容量値の仮想ストレージと該仮想ストレージが係属するプロセッサによる仮想プロセッサとが構成要素となる仮想ノードの複数が接続されたオーバレイネットワーク上に形成し、
データ蓄積においては、上記範囲検索可能なクラウドストレージにキーバリュー（key-value）型データを蓄積し、
検索においては、上記仮想ノードを所定のキーバリューについて検索する。
さらに、物理ノードの負荷分散のために、各仮想ノードのデータ蓄積量に、下限と該下限の所定倍の上限とを設けている。
このような範囲検索可能なクラウドストレージで各仮想ノードのデータ蓄積量の調整を行って物理ノードの負荷分散を図るには以下の様にする。
（１）第１仮想ノードに新たなデータを追加しようとする場合で、追加によるデータ量が上記上限以上になる見込みの場合は、前記追加によるデータ量について、上記検索可能なクラウドストレージから選択した空仮想ノードを第２仮想ノードとして、第１仮想ノードから第２仮想ノードに上記上限の半分の分量のデータを振り分けると共に、この振り分けによる新たな順に上記オーバレイネットワーク上の仮想ノードの並びを更新し、
（２）上記キーバリュー型データの並びで隣接する第１仮想ノードのデータ量と第２仮想ノードのデータ量との和が上記上限未満の場合に、第１仮想ノードあるいは第２仮想ノードの一方に両方のデータを寄せ集めて他方の仮想ノードを空仮想ノードとすると共に、上記オーバレイネットワーク上の仮想ノードの並びを更新し、
（３）上記キーバリュー型データの並びで隣接する第１仮想ノードの仮想ストレージと第２仮想ノードの各々のデータ量の和が、上記上限以上で、且つ、その一方の仮想ノードのデータ量が上記下限未満の場合に、その他方の仮想ノードから該一方の仮想ノードへデータを移動して、それら双方のデータ量が上記下限を超える様に再配分し、上記オーバレイネットワーク上の仮想ノードの並びを更新する。
【００１１】
また、本発明は、上記クラウドストレージを構成する物理ノードから選択された第１物理ノードと第２物理ノードについて、
上記物理ノードの空でない仮想ノード数の全体の仮想ノード数に対する比をμとし、所定の閾値パラメータλ（∈（０、１））を用いて、
（１）第１物理ノードに属する仮想ノードにおける空でないノード数の第１物理ノードに属する仮想ノード数の比μ1と、第２物理ノードに属する上記仮想ノード数に対する空でない仮想ノード数の比μ2について、μ1（１＋λ）が上記μより大きく、μ2（１−λ）が上記μより小さいときに、
（２）第１物理ノードに属する空でない仮想ノードから第２物理ノードに属する空の仮想ノードへの、保持データに関するスワップを行い、
（３）上記オーバレイネットワーク上のノードの並びを更新する、
ことを特徴とする。
【００１２】
上記範囲検索可能なクラウドストレージにおける上記のキーバリューについての検索は、コード＃アルゴリズムに従った検索であることを特徴とする。
【００１３】
上記オーバレイネットワークにおいて空仮想ノードの全体が上記オーバレイネットワークの並びの連続した一画を占める空仮想ノードプールを構成し、
上記空の仮想ノードは、該空仮想ノードプールから選択するものであることを特徴とする。
【００１４】
また、上記各物理ノードにおけるストレージは、ストレージを分割したものであり、その分割は、同じサイズの領域が最多となる分割であるとしてもよい。
【００１５】
上記所定倍とは、２倍を超え２．０８倍以下であることが望ましい。
【００１６】
また、上記オーバレイネットワークには、Ｐ２Ｐ（peer to peer）を用いることができる。
【発明の効果】
【００１７】
例えば各種測定データを本発明が対象とする範囲検索可能なクラウドストレージに保存することで、データの蓄積が進むに従って各物理ノードの負荷が増加するが、この増加は一様でない場合が多いので、本発明の負荷分散方法を用いて各物理ノードの負荷を分散することができ、ストレージ資源の利用率を高めることができるようになる。また、検索に際しては、例えばＣＨＯＲＤ＃を用いることができるので、検索は効率的に行うことができる。
【図面の簡単な説明】
【００１８】
【図１】本発明の一例として提案するオーバレイを基にしたストレージシステム構成を示す図である。
【図２】スワップ前とスワップ後の物理ノードと仮想ノードの模式図である。
【図３】（ａ）はスプリット、（ｂ）はマージ、（ｃ）は再分配の各操作を説明する図である。
【図４】負荷分散操作の例を示す図である。
【図５】ノード間で作業負荷を再バランスさせる基本的なメカニズムとして、リオーダー（Reorder）操作を用いる従来技術の例を示す図である。
【図６】シミュレーションにおける初期負荷分布の偏り方の３つのパターン（Ａ、Ｂ、Ｃ）を表す図である。
【図７】（ａ）、（ｂ）、（ｃ）は、上記各負荷に対する負荷分散効果の比較を示す。
【図８】（ａ）、（ｂ）、（ｃ）は、上記各負荷に対するデータ移動コストの比較を表す。
【図９】ダイナミックなシナリオで、各試行においてどのようにデータを削除したかを示す図である。
【図１０】ダイナミックなシナリオで、（ａ）は蓄積されたデータ移動コストの比較を示す図、（ｂ）は蓄積されたメッセージ発信コストの比較を示す図、（ｃ）は負荷分散速度の比較を示す図である。
【図１１】ダイナミックなシナリオで、データ挿入についてのシミュレーション結果を示す図で、（ａ）は蓄積されたデータ移動コストの比較を示す図、（ｂ）は蓄積されたメッセージ発信コストの比較を示す図、（ｃ）は負荷分散速度の比較を示す。
【図１２】不均質な環境でのシミュレーション結果を示す図で、（ａ）に負荷分散効果を示し、（ｂ）に、それに対応するデータ移動コストを示す。
【図１３】仮想ノードの総数ｍを求める具体例を示す図である。
【発明を実施するための形態】
【００１９】
本発明の範囲検索可能なクラウドストレージにおける負荷分散方法を適用する例には、オーバレイを基にした記憶システムアーキテクチャを持ったクラウドストレージがある。
ここで、Ｎ個の記憶ノードからなる一組の大規模な分散クラウドストレージを考える。Ｎまでの基数をｎとする。各々の物理ノードを複数の仮想ノードに区切り、すべての仮想ノードのセットをＶとする（Ｖの仮想ノード数はｍ）。物理ノードｐiの容量をｃiとし、仮想ノードｖjの負荷をｌjとする。物理ノードの容量は任意でありえるが、仮想ノードの容量は決められた値である。
【００２０】
分散した状態で範囲検索を行えるようにするために、すべての仮想ノードでＣｈｏｒｄ＃オーバレイを構成する。本明細書では、「オーバレイノード」と「仮想ノード」は、交換可能である。Ｃｈｏｒｄ＃は、範囲検索可能な分散データ構造である。Ｃｈｏｒｄ＃ネットワークでは、すべてのオーバレイノードは２つのリンクで連なることによるリングで接続されており、リングにおけるオーバレイノードの各位置はそのノードが担当する範囲によって決められている。
データ検索を速めるために、各々のオーバレイノードは、複数のレベル（スキップリストにおけるレベル）で短絡路を提供するフィンガーテーブル（finger table）を持っている。一般に、そのフィンガーテーブルで第ｉフィンガーを計算するために、オーバレイノードは、第（ｉ−１）フィンガーのリモートノードに、さらにその第（ｉ−１）フィンガーがどれを参照しているかを尋ねる。つまり、次式の様にレベルｉのフィンガーは、次に低いレベルｉ−１のフィンガーポインターに設定されている。初期値として、フィンガーは直接的な後続点を指す。
【００２１】
【数１】
0006566822.tif 000002
【００２２】
Ｃｈｏｒｄ＃を使うために、データ項のキー空間を連続的に連なるように分割して、各々の分割を仮想ノードに割り当てる。また、ここでは、仮想ノードは、そのキーとして、その分割の下境界を採用し、分割全体で、その担当範囲の下境界を採用する。また、データ項目を保存するために、すべての仮想ノードを使うわけではない。つまり、一部の仮想ノードを空にしておく。具体的には、仮想ノードのセットＶを、サブセットＶEとＶNEに分けるが、サブセットＶEは、すべて空の仮想ノードを含み、サブセットＶNEはすべての空でない仮想ノードを含む。
【００２３】
さらに、空の仮想ノードには、空でない仮想ノードから区別をするために、空でない仮想ノードには決して使われないキーと範囲を割り当てる。例えば、（−１、０）間の実数はデータ項目のキーとしてまた空で無い仮想ノードとしては、決して使われないと仮定する。
図１に、本発明の一例として提案するオーバレイを基にしたストレージシステム構成を示す。この例の場合は、すべての空の仮想ノードが隣接する領域に配置されるようになる。この領域を空仮想ノードプール（ＥＶＮＰ：empty virtual nodes pool）と呼ぶ。
図１では、仮想ノードが属する物理ノードを区別できるようにするために、描画線幅を変えている。同じ線幅の仮想ノードは、同じ物理ノードに保存される。各々の物理ノードには、空でない仮想ノード（円）と空の仮想ノード（星形多角形）とからなる複数がある。
【００２４】
本発明の目的を実現するための方法の１つは、データ項目を仮想ノードに割り当てるための負荷分散アルゴリズムを設計することで、任意の物理ノードＰｉ（ｉは、１から物理ノードの数Ｎまで）について、その容量ｃiに比例したデータ項目の全体の負荷を管理するようにするものである。形式的には、物理ノードＰｉに属する仮想ノードのサブセットＶi（∈Ｖ、Ｖはすべての仮想ノードのセット）は、以下の数２が最小化されるように、仮想ノードごとに実際の負荷を調整する。ここで、仮想ノードｖjの負荷をｌjとする。物理ノードの容量は任意でありえるが、仮想ノードの容量は所定の一定値である。ここで、Σは、その添え字のすべての要素についての和を表すものとする。
【００２５】
【数２】
0006566822.tif 000003
【００２６】
上記数式の第２項は、物理ノードＰiの期待される負荷とみなすことができる。過剰負荷の物理ノードと過少負荷の物理ノードの間で負荷のバランスをとる基本的な考え方は、過少負荷の物理ノードの空の仮想ノードに過剰負荷の物理ノードの空でない仮想ノードからデータを移動するスワップ（Ｓｗａｐ）を行う。
【００２７】
しかし、仮想ノードの負荷が任意であるならば、システムは非常に非効率になる場合がある。ほんの少しのデータ項目だけを保存している多くの仮想ノードがあるとすると、過剰負荷の物理ノードから過少負荷の物理ノードへのデータの移動は、それらのほんの少しのデータ項目ごとを移動する多数回のスワップ操作が必要になることが分かる。
これに加えて、空でない仮想ノードにほんの少しのデータ項目だけを保存することで、オーバレイネットワークは非効率な利用となり物理資源を浪費することになる。
【００２８】
これらの理由から、本発明では、仮想ノードの負荷に許容範囲を設定して、常に負荷を適度な状態に保つことを行う。具体的には、ここでは上記許容範囲の下限ｌbと上限ｕbを導入する。そこで、ｕb＝２×ｌb ＋ εとするが、ε（＞０）は、小さい実数である。
常に仮想ノードｖiの負荷は、ｌb≦ｌi＜ｕbを満たさなければいけない。さもなければ、後述の負荷を調整する操作が発動される。
仮想ノードの負荷の範囲が与えられれば、以下の様に実用的に便利な数３の近似を得ることができる。絶対値記号は、集合については仮想ノード数を表し、数値については絶対値を表す。
【００２９】
【数３】
0006566822.tif 000004
【００３０】
｜ＶNE｜／｜Ｖ｜をμとすると、μは、Ｃｈｏｒｄ＃オーバレイネットワークでの、すべての空でない仮想ノード数とすべての仮想ノード数の比を示す。また、任意の物理ノードＰiについては、それの空でない仮想ノード数のすべての仮想ノード数に対する比をμiとする。
ここで、閾値パラメータλ∈（０、１）を導入する。もし、μiがμ（１＋λ）より大きいならば、それは過剰負荷と解釈し、また、μiがμ（１−λ）より小さいならば、それは過少負荷と解釈する。
過少負荷の物理ノードは、何もする必要がないが、過剰負荷の物理ノードからの要請を待つことになる。
【００３１】
物理ノードが過少負荷、通常負荷あるいは過剰負荷のどの状態にあるのかについては、μiとμを比較することによって行うことができる。μを推定する前に、ここでは、仮想ノードの総数ｍを計算するための方法を最初に導入する。これはμを推定するために必要である。この際、Ｃｈｏｒｄ＃の特徴を用いることによって、ｍを計算する。
【００３２】
任意の物理ノードが仮想ノードのｖjを含むと仮定する。また、ｖjは左隣にレベル−０のオーバレイノードｖkがあるとする。上記物理ノードは、ｖjをして右隣ノードにｖk．ｋｅｙの問合わせを送らせる。この問合わせは通常の問合わせとして取り扱われ、中間のオーバレイノードはＣｈｏｒｄ＃プロトコルに従って正確にそれを転送する。この問合わせと通常の問合わせの唯一の違いは、問い合わせメッセージにあり、どのオーバレイレベルに各中間ノードがその問い合わせを転送するかを記録したセグメントが埋め込まれているということである。そのセグメントにおけるそのセットを、ＬＳと記す。その問い合わせがｖkに転送された後に、ｖkは単にｖjにそれを転送する。その問合わせを受け取った後に、次の方程式に従って、ｖjはｍを次のように計算する：
【００３３】
【数４】
0006566822.tif 000005
【００３４】
図１３に例を示す。仮想ノード74がｍを計算する場合を仮定する。仮想ノード74は、キー79についての問い合わせを送るが、このキーはレベル0で左隣のオーバレイノードのキーである。その問合わせは、そのレベル３で隣の-0.5ノードに転送される。-0.5ノードはそのレベル２で隣のノード92に問合わせを転送し、そして、ノード92はそのレベル1で隣のノード85に問合わせを転送する。ノード79はレベル0でノード８５の右隣りであるので、問合わせはレベル0に転送される。この例では、LS = 3、2、1、0であり、ｍ＝２3＋２2＋２1＋２0＋１で１６である。
【００３５】
ｍが分かると、物理ノードは、サンプリングを基にした方法で、独立してμを推定することができる。（１）具体的には、物理ノードはランダムにその中の仮想ノードを選んで、それを所定のＴＴＬ（Time To Live:生存時間）（少なくともO（log m））をつけてサンプル−要請メッセージを送出させる。（２）パケットを受けた全ノードは、フィンガーテーブルからランダムに隣のリンクを選び、パケットを転送して、ＴＴＬを減らす。（３）経路に沿ったあらゆるオーバレイノードはランダムに隣のリンクを選んで、それを転送し、ＴＴＬを減らす。（４）ＴＴＬが無くなったノードは、サンプルを返送する。
この方法で、メッセージを送る物理ノードは、一様分布に従った仮想ノードのサンプリングを得ることができる。
【００３６】
この理由は以下の通りである。
Ｃｈｏｒｄ＃のようなトポロジーは、エキスパンダであるので、Ｃｈｏｒｄ＃におけるＴＴＬはＯ（log m）のランダムウォークについて一様分布に収束する。
サンプリングが一様分布に従っていれば、μを推定することは、基本的な母集団比率評価問題になることがよく知られている。仮想ノードのサンプリングのセットをＳ（｜S｜=s）とし、次の様にブール変数ａiを導入する。
【００３７】
【数５】
0006566822.tif 000006
μの評価値をμ＾（＾はμの上）とすると、
【００３８】
【数６】
0006566822.tif 000007
であり、その期待値は、次のようになる。
【００３９】
【数７】
0006566822.tif 000008
また、これから、μ＾がμの偏りの無い評価であることは明らかである。
【００４０】
物理ノードＰiが過剰負荷にあることが見出された時に、スワッププロセスを開始する。図２に、スワップ前とスワップ後のシステムを示す。
具体的には、
（Ａ）まず、空でない仮想ノードｖjをランダムに選ぶ。
（Ｂ）そして、（−１、０）にある乱数Ｋを発生させ、そして、仮想ノードｖjからＣｈｏｒｄ＃オーバレイネットワークにＫを検索させる。Ｃｈｏｒｄ＃の検索アルゴリズムによると、キーＫの空の仮想ノードがあれば、そのノードはｖjへ返答する。キーＫの空の仮想ノードが存在しない場合は、キーＫに最も近いキーの空の仮想ノードがｖjへ返答する。
（Ｃ）返答する空の仮想ノードがｖkであるとする。もし、ｖkが通常負荷（過少でも過剰でもない負荷）または過少負荷の物理ノードにある場合は、仮想ノードｖjは仮想ノードｖkへすべてのデータ項目を渡す。そうでない場合は、仮想ノードｖjは新しいＫ∈（−１、０）を発生させ、再びＫの検索を行う。
（Ｄ）このプロセスを、仮想ノードｖjが通常負荷または過少負荷の物理ノードから空の仮想ノードを見つけるまで繰り返す。
（Ｅ）データ伝送に加えて、仮想ノードｖjと仮想ノードｖkが、そのキー、担当範囲、隣接ノードの情報を交換する。
（Ｆ）スワップ操作の最後に交換された情報をもったオーバレイネットワークでの位置を交換する。
【００４１】
次に、空でない仮想ノードの負荷の調節について、説明する。
負荷分散の枠組みを理解するための要点は、空でない仮想ノードの負荷を［ｌｂ、ｕｂ）の範囲に保つことである。この目的のため、３つの操作を導入する：スプリット（split）、マージ（Merge）、及び再分配（Redistribute）である。
スプリット操作は、仮想ノードｖjについてデータ入力によって負荷ｌjが上限ｕbに達するときにトリガーされる。スプリット操作を行うためには、仮想ノードｖjは、最初に、空の仮想ノードを見つけなければならない。
ｖjと同じ物理ノードに空の仮想ノードｖkがあるならば、ｖjはスプリット要請をｖkに送信する。さもなければ、ｖjは（−１、０）内の乱数（Ｋとする）を発生させる。Ｃｈｏｒｄ＃オーバレイネットワークでＫの検索を行う。
キーＫによる空の仮想ノードが存在するかどうかにかかわらず、空の仮想ノードのどれかがｖjへ返答する。返答した仮想ノードがｖkであるとすると、ｖjはその負荷の半分（すなわちｌｂ＋ε／２）をｖkに割り振る。
実際には、ｖjはより大きなキーのデータ項目かより小さなキーのデータ項目をｖkに動かすことができるが、汎用性を失わずに、ここでは、ｖjはより大きなキーのデータ項目をｖkに動かすものとすることができる。
データ項目伝送に加えて、ｖjは右隣のノード情報もｖkに送って、Ｃｈｏｒｄ＃オーバレイのスキップリストにおけるレベル０で、その右隣はｖkであるようにする。
【００４２】
するとｖkが空でない仮想ノードになるので、それはオーバレイネットワークでの元の位置から離れて、キーにはデータ項目のキーの下限を使って、ｖjの右隣で再びオーバレイネットワークに参加する。
【００４３】
他の操作のマージ及び再分配は、ｌjがデータ削除により上記ｌb未満なったとき、トリガーされる。マージ及び再分配がトリガーされるかどうかは、ｖjの２つのレベル０のオーバレイネットワーク上の隣のノードに依存する。
（イ）どちらかの隣のノード、例えばｖkが、ｌj＋ｌk＜ｕbなる条件を満たすとき、マージ操作がトリガーされ、ｖjはｖkからのすべてのデータ項目を吸収する。この結果を受けて、ｖjは通常のものになり、そして、ｖkは空になる。まず、ｖkはオーバレイネットワークから離れ、区間（−１、０）間のランダムなキーを発生し、再びオーバレイネットワークに加わる。そのオーバレイネットワーク上の新しい位置は、上記ＥＶＮＰである。
（ロ）他方、レベル０のオーバレイネットワークのｖjの両隣りの仮想ノードが、ｕb−ｌj以上のデータ項目数を持っているとき、ｖjは、ｌb−ｌj個のデータ項目をどちらかの隣のノードにそれが下限ｌbになるまで受け渡すことを要請することができる。これは、再分配と呼ばれる。再分配の後に、両方の２つの仮想ノードは、通常負荷の仮想ノードになる。
スプリット、マージ、及び再分配で、あらゆる空でない仮想ノードの負荷はｌbとｕbとの間に留めることができる。これらすべての３つの操作は、ローカルな共同作業でありグローバル情報なしで行われる。
【実施例１】
【００４４】
まず、本実施例におけるオーバレイネットワーク例は以下の様に構成されたものである。各々の物理ノードは、複数の同一の容量の仮想ノードを設定できるようにパーティション分割が行われており、また、各々の仮想ノードには、それぞれの担当範囲が割り当てられている。その担当範囲に基づいて、範囲検索可能なＰ２Ｐネットワークがこれらの仮想ノードで構成される。具体的には、各仮想ノードが隣のノードに繋がっているようにする。また、各々の仮想ノードにも検索を速めるためになんらかの長いリンクを設ける。データ項目を保存するために、すべての仮想ノードを使うというわけではない。データの格納には一部の仮想ノードを使い、他の仮想ノードは空仮想ノードにしておく。空でない仮想ノードには、データ項目として使われていない範囲のキーを割り当てる。例えば、データ項目が常にプラスであるとき、区間（−1、0）間の値を空の仮想ノードに割り当てる。
【００４５】
各々の物理ノードには、複数の空でない仮想ノードと空の仮想ノードがあるとする。このとき、次のようにすると過剰負荷の物理ノードと過小負荷の物理ノード間での負荷の均衡の再調整を行うことができる。
例えば、過剰負荷の物理ノードには空でない仮想ノードがあり、そして、過少負荷の物理ノードには空の仮想ノードがあるとする。この場合、空でない仮想ノードからすべてのその負荷を空の仮想ノードの方へ移す。そして、オーバレイネットワーク上でそれらの位置関係を交換する。この操作はスワップ（Swap）に当たる。
【００４６】
局所的な負荷調整については、スプリット（Split）、マージ（Merge）、及び再分配（Redistribute）の３操作で行う。この際、空でない仮想ノードにデータ項目の上限ｕbと下限ｌbを導入する。また、ｕbはｌbの２倍強、例えば２．０８、とする。これらｕbとｌbは、負荷調整のトリガーとなる指標である。
【００４７】
スプリットは、図３（a）に示すように、データ挿入でデータ項目がｕb達するときには、例えば、その仮想ノードを２つにスプリット（分裂）させる。具体的には、同じ物理ノード内で空の仮想ノード見出し、データの半分をその方へ移す。これで、空の仮想ノードは空でなくなる。そして、オーバレイネットワーク上で位置を変える。同じ物理ノード内で空の仮想ノードが見つからない場合は、上記の様に、負の乱数Ｋをキーに持つ仮想ノードを検索し、その検索に応答した仮想ノードに、上記の様に、データの半分を移す。
マージは、図３（ｂ）に示すように、オーバレイネットワークの隣接する２つの仮想ノードのデータ項目の和がｕbより少ない場合は、1つの仮想ノードが他の仮想ノードのデータ項目を吸収する。そして、空になった仮想ノードはその位置を去り、空仮想ノードプールに再加入する。
また、再分配は、図３（ｃ）に示すように、隣接する２つのノードの個々のデータ項目は両方ともｕbより少ないが、そのデータ項目の和がｕbより大きい場合は、データ項目の多い方から少ない方へデータ項目を移す。
これら３つの操作で、どの仮想ノードにおいても、ｌbとｕbの間にデータ項目を留めることが出来る。
【００４８】
図４は負荷均等化操作の例を示す図である。この例では、過剰負荷ノードから過小負荷ノードへ負荷移動を行う。
【００４９】
図２は、本実施例の場合にも当たり、スワップ操作をオーバレイネットワークの観点からみた図である。この図２において、物理ノードＡは過剰負荷であり、物理ノードＢは過少負荷であるとする。物理ノードＡにある仮想ノード１１から物理ノードＢにある空の仮想ノードの１つにデータを移動する。データ移動後に、隣接ノード情報、探索キーおよびオーバレイネットワークにおける位置を上記ノード間で交換する。
【実施例２】
【００５０】
本発明のパフォーマンスを評価するために、Java（登録商標）でシミュレータを開発した。また、本発明の方法に加えて、比較のために、（Ａ）一様な環境や（Ｂ）不均質な環境で定評のあるLoReC（LOad REbalancing for distributed file systems in Clouds、非特許文献１）を実装した。
上記シミュレータによる計算機シミュレーションで、負荷分散効果、データ移動コスト、メッセージ発信コストと負荷分散速度を評価した。
【００５１】
（Ａ）  一様な環境でのシミュレーション
結果における最初のセット、一様な環境から得られたものである。
一様な環境では、容量が１０００で同一で、１０００台の物理ノードを使用した。各々の物理ノードは、２０の仮想ノードを包含している。シミュレーションは次の２種類のシナリオで行った。
（イ）静的シナリオでは、偏った初期負荷分布の３つのパターンを仮定して、それぞれ負荷分散操作を行った。
負荷分散操作の間、データ挿入と削除は、起きていない。
静的シナリオで、スプリット、マージ、及び再分配はほとんど起こらず、スワップに集中することができた。
（ロ）ダイナミックなシナリオでは、その負荷の削減（同様に増加）を続けた。データ撹拌の間、すべての負荷分散操作がトリガーされ、実際の環境に近い状態での評価をすることができた。
【００５２】
図６は、初期負荷分布の偏り方の３つのパターンを表す。負荷に対するＣＤＦ（Cumulative Distribution Function：累積分布関数）を表す。物理ノードで最も小さな負荷は２００で、最大の負荷は８００である。負荷Ｂでは、大部分のノードは軽負荷となっており、ごく一部のノードだけに多大な負荷がかかっている。負荷Ｃでは、大部分のノードは多大な負荷が掛かった状態となっており、ごく一部だけが軽負荷となっている。負荷Ａの位置は、負荷Ｂと負荷Ｃの間である。図７（ａ）、７（ｂ）と７（ｃ）が各負荷に対する負荷分散効果の比較を示す。
本発明の方法では、少数の過少負荷されたノードが存在する間、ほとんど過剰負荷のノードが存在しない。
これは、従来の方法（ＬｏＲｅＣ）では過剰負荷のノードと過小負荷のノードがいくつか残ることに対して、本発明の優れた点である。この違いの主因は、再配列（REORDER）の使い方の違いにある。従来の方法の様に、REORDERで、軽負荷のノードが、過剰負荷のノードを救済する場合、その前にすべてのそのデータ項目を隣のノードの方へ動かさなければならない。しかし、軽負荷のノードからデータ項目を受け取った後に、隣の軽負荷のノードが助けられるべき過剰負荷のノードより多大負荷になるならば、REORDER操作は意味がない。しかも、この場合、更なる負荷分散は行われない。
【００５３】
図８（ａ）はデータ移動コストの比較を表す。図８（ｂ）はメッセージ発信コストの比較を表す。そして、図８（ｃ）は負荷分散速度の比較を表す。本発明の方法やＬｏＲｅＣが定期的に行われると想定している。したがって、これらの速度を負荷分散操作の回数で比較する。負荷分散操作がより少ない回数の方が、より速いと思われる。これらの図から、本発明の方法の方が、重要なデータ移動コストとメッセージ発信コストを節約することができて、ＬｏＲｅＣより速く終わることができることが分かる。
【００５４】
静的シナリオに加えて、データ撹拌したシミュレーションも行った。ロードバランスされた範囲検索可能システムに６００のデータ項目があると仮定した。それから、偏った方法ですべてのノードからデータ項目を削除したが、より多くのデータ項目がより少ないノードから削除された、また、より少ないデータ項目がより多くのノードから削除された。各試行におけるデータの削除は、図９に示す関数に従っている。図１０（ａ）は蓄積されたデータ移動コストの比較を示し、図１０（ｂ）は蓄積されたメッセージ発信コストの比較を示す。そして、図１０（ｃ）は負荷分散速度の比較を表す。
【００５５】
静的シナリオのように、速度を負荷分散操作数で比較した。ＬｏＲｅＣでは、「REORDER」の数を数え、本発明の方法については、スワップの数を数えた。スプリット、マージ、及び再分配については数えていない。これらは負荷変動でトリガーされるからである。
さらに、上記３つの操作の処理時間は、スワップの期間より非常に短いと思われる。静的シナリオでの結果と同様に、本発明の方法は、データ削除に対して、ＬｏＲｅＣに比べて著しい改善を示す。
同様に、データ挿入についてのシミュレーションを行った。各々のノードに２００のデータ項目があってロードバランスを図った範囲検索可能システムの設定とした。それから、偏った方法でデータ項目をすべてのノードに挿入した。試行ごとのデータ挿入は、図９に従った方法である。図１１（ａ）、（ｂ）と（ｃ）にデータ削除の場合と同様の結果を示す。
【００５６】
（Ｂ）  不均質な環境でのシミュレーション
本発明の方法が仮想ノードに基づいて、それは本質的に不均一な環境をサポートしており、一様な環境での働きとほとんど違いを示さない。このため、記述を簡略化するために、その一部の結果だけを以下に示す。
シミュレーションにおいて、物理ノードの容量がジップ（Zipf）分布であると仮定した。その容量の最大と最小は、それぞれ５０００と５００である。容量に対する負荷の比率は、［０．２、０．８］間のもう一つのジップ分布に従うとした。図１２（a）に負荷分散効果を示し、図１２（ｂ）に、それに対応するデータ移動コストを示す。
これらの図から、データ移動コストについては、本発明によってＬｏＲｅＣと同様な負荷分散効果を得るには、ＬｏＲｅＣによるデータ移動コストのわずか１％でよいことが分かる。
【産業上の利用可能性】
【００５７】
本発明の具体的な例としては次の例を挙げることが出来る。まず、データの蓄積に際しては、インターネットに接続され分散した場所に配置された各種センサー、例えば各家庭に設置されたＩｏＴデバイスのセンサーや車両からモバイルネットワークや間歇的に接続されるネットワークを介して接続されたセンサーから、測定データを本発明が対象とする範囲検索可能なクラウドストレージに保存する。データの蓄積が進むに従って、各物理ノードの負荷が増加するが、この増加は一様でない場合が多いので、本発明の負荷分散方法を用いて、各物理ノードの負荷を分散する。これにより、ストレージ資源の利用率を高めることができるようになる。また、検索に際しては、例えばＣＨＯＲＤ＃を用いて検索することができるので、検索は効率的に行うことができる。
従って、本発明は、範囲検索可能なクラウドストレージにデータを蓄積することができるシステムがあれば、どのようなシステムとも組み合わせて用いることが容易にできることが明らかである。
【図１】
0006566822.tif 000009
【図２】
0006566822.tif 000010
【図３】
0006566822.tif 000011
【図４】
0006566822.tif 000012
【図５】
0006566822.tif 000013
【図６】
0006566822.tif 000014
【図７】
0006566822.tif 000015
【図８】
0006566822.tif 000016
【図９】
0006566822.tif 000017
【図１０】
0006566822.tif 000018
【図１１】
0006566822.tif 000019
【図１２】
0006566822.tif 000020
【図１３】
0006566822.tif 000021