オーバレイネットワークは、既存のリンクを用いて、その上位層における目的に応じて仮想的なリンクを形成し構成するネットワークである。すなわち、コンピュータネットワークの下位層のトポロジーとは関係なく構築された上位層のネットワークをオーバレイ・ネットワークと呼ぶ。例えば、IPネットワークのトポロジーとは無関係に構築されたP2P(Peer to Peer)ネットワークなどを指す。
オーバレイネットワークでは、中央サーバを必要とせず、容易に柔軟な耐故障性に優れたネットワークを構築できる。ノード(ピアともいう)は自由に参加・離脱を行い、ネットワークトポロジは動的に変化する。全てのノードに対等の権限が与えられ、ネットワークに接続されている全てのノードが持つデータにアクセスすることが可能となる。
オーバレイネットワークにおいて、各ノードが隣接するノードの情報(IPアドレス等)のみを持つ場合は、データを検索する方法として、隣接するノードに問合せ(クエリ)をリレーで渡していく方法が採られることになる。このような検索方法の場合、検索用のネットワークトポロジを維持する必要がないためアドホック性に優れ、複製を利用することで耐故障性も優れているが、検索に時間がかかるためスケーラビリティに欠ける。一方、各ノードがネットワーク上の全てのノードの情報を持っている場合は、検索時間はかからないがスケーラビリティとアドホック性の点で適切でない。このように、オーバレイネットワーク(P2Pネットワーク)では、要求されたデータを持つノードをどのように検索するかが重要と問題となる。
オーバレイネットワーク上の各ノードに経路情報として分散ハッシュテーブル(Distributed Hash Table:DHT)を持たせることにより、膨大なデータを高速(効率的)に検索する手法が用いられている。分散ハッシュテーブルでは、データはハッシュ空間上に配置され、各ノードがある値域を担当して値域内に存在するデータを保持、管理する。所定のノードがキーを通じてデータの検索を行う場合、キーをハッシュ関でハッシュ値に変換してハッシュ空間にマッピングを行い、目的のノードとデータを取得する。
分散ハッシュテーブルを用いた検索アルゴリズム(ルーティングアルゴリズム)として複数のものが考えられているが、その中にChordとKoordeが存在する。Chordは、環状のハッシュ空間上でフィンガーテーブル(Finger Table;自身のノードのIDの1,2,4,8,・・・先のIDのノードの情報が登録されたテーブル)にもとづいて二分検索に似た検索を行うことでホップ数log(N)の検索効率を実現したアルゴリズムである。また、Koordeは、Chordのフィンガーテーブルの代わりにde Bruijnグラフを利用してルーティングを行うアルゴリズムである。非特許文献1には、Koordeによるデータ検索方法が記載されている。以下、非特許文献1に記載された従来のデータ検索方法について説明する。
(1)第1の従来技術について:
図17は、第1の従来技術のデータ検索手順を示すフローチャートである。また、図18は、de Bruijnグラフを示す説明図である。第1の従来技術では、図17に示すフローチャートに記載した手順に従って、論理識別子Keyが与えられたデータを、図18に示すグラフ内のどのノードが管理するかを決定する。
図18はde Bruijnグラフと呼ばれる。de BruijnグラフDk(n)は、集合Zk={0,1,...,k−1}の要素からなるビット長nのビット列xが、全てのあるビット列を左ビットシフトして、最下位ビットにx0∈Zkを加えて得られる全てのビット列に対して弧を持つグラフである。図18に示す例では、k=2、n=4としている。
すなわち、de Bruijnグラフでは、nビットの論理識別子(ノードID)を持つノードが2n 個存在した場合、各々のノードmから(2m mod 2n ),(2m+1 mod 2n )のノードにリンクが張られる。例えば、3ビットの論理識別子がxyzのノード(ID=xyzのノード)からは、論理識別子がyz0のノード(ID=yz0のノード)と論理識別子がyz1のノード(ID=yz1のノード)に対して一方向のリンクが張られる。
Koordeでは、このようなde Bruijnグラフを一方向リンクを利用してルーティングを行う。例えば、3ビットの論理識別子がxyzのノードから3ビットの論理識別子がabcのノードにメッセージを転送するときは、論理識別子がxyz→yza→zab→abcのノードへ順にメッセージがルーティングされる。すなわち、終点の論理識別子と始点の論理識別子をつなげたxyzacbを順に左にシフトさせたノードにメッセージが転送される。
データの論理識別子を管理するノードを探す例として、論理識別子が13(2進数表示で1101)である図18に示すノード213が、論理識別子が9(2進数表示で1001)であるデータを格納するノードを検索する場合について説明する。
図17に示す処理において、ノード213が、論理識別子Keyの値「1001」を、キーシフトkshiftで探す。初期キーシフトの値は、データの論理識別子Keyの値と同一とする。すなわち、初期キーシフトの値を「1001」とする。まず、ノード213は、自身の論理識別子mが論理識別子Keyと同じであるか否か判定する(ステップS101)。ノード213の論理識別子の値は「1101」であり、これは論理識別子Keyの値「1001」と異なることから(ステップS101のNo)、ノード213は、キーシフトkshiftの先頭ビットbと、論理識別子空間N(ここでは、4ビットであるため16)とを用いて、2m+b mod Nで表わされる論理識別子を、ノードtとする(ステップS103)。具体的には、キーシフト「1001」の先頭ビット1と論理識別子空間16とを用いて、ノードtを2×13+1 mod 16=11(2進数表示で1011)とする。この演算は、上述したように、2進数表示ではmのビットを左ビットシフトさせ、最下位ビットに、キーの先頭ビットを与える処理と同等である。
次に、ノード213は、キーシフトkshiftの値「1001」を左ビットシフトさせ、キーシフトkshiftの値を「0010」とする(ステップS104)。次に、論理識別子が11(2進数表示で1011)であるノード211が、論理識別子Keyの値「1001」を、キーシフトkshiftの値「0010」で探す処理に移行する(ステップS105)。これは、図17に示す処理(ステップS101〜S105)がノード211に移されたことに相当し、ノード213にて実行したステップS105は、そのサブルーチンとして、ノード211にてステップS101〜S105の処理が実行されることとなる。
ノード211では、データの論理識別子Keyの値「1001」とノード211の自身の論理識別子「1011」が異なることから(ステップS101のNo)、キーシフト「0010」の先頭ビット0と論理識別子空間16とからノードtの値を「0110」とし(ステップS103)、キーシフトkshiftの値を「0100」とする(ステップS104)。そして、ノード211は、論理識別子「0110」を持つ新たなノード206に処理を移行させる(ステップS105)。これにより、ノード206が、論理識別子Keyの値「1001」を、キーシフトkshiftの値「0100」で探すこととなる。
ノード206では、データの論理識別子Keyの値「1001」とノード206の自身の論理識別子「0110」が異なるため(ステップS101のNo)、キーシフト「0100」の先頭ビット0と論理識別子空間16とからノードtの値を「1100」とし(ステップS103)、キーシフトkshiftの値を「1000」とする(ステップS104)。そして、ノード206は、論理識別子「1100」を持つ新たなノード212に処理を移行させる(ステップS105)。これにより、ノード212が、論理識別子Keyの値「1001」を、キーシフトkshiftの値「1000」で探すこととなる。
ノード212では、データの論理識別子Keyの値「1001」とノード212の自身の論理識別子「1100」が異なるため(ステップS101のNo)、キーシフト「1000」の先頭ビット1と論理識別子空間16とからノードtの値を「1001」とし(ステップS103)、キーシフトkshiftの値を「0000」とする(ステップS104)。そして、ノード212は、論理識別子「1001」を持つ新たなノード209に処理を移行させる(ステップS105)。これにより、ノード209が、論理識別子Keyの値「1001」を、キーシフトkshiftの値「0000」で探すこととなる。
ノード209では、データの論理識別子Keyの値「1001」とノード209の自身の論理識別子「1001」が同一であるため(ステップS101のYes)、ノード209は、自身が当該論理識別子を持つデータを管理するノードであると判断する。そして、ノード209は、サブルーチンとして呼び出したノード212のステップS105の結果として論理識別子「1001」のノードであることを示すメッセージをノード212に返す(ステップS106)。
ノード212のステップS106では、この結果をさらにサブルーチンとして呼び出したノード206に返し、ノード206のステップS106では、この結果をサブルーチンとして呼び出したノード211に返し、ノード211のステップS106では、この結果をサブルーチンとして呼び出したノード213に返す。このように、最終的に検索を実行したノード213に目的のノード209が返ることになる。
このような手順を取ることにより、図18のグラフに示すように、ノードが他のノードを指す数である次数(各ノードに隣接するノードの数、すなわち各ノードがリンクしているノードの数)が一定数(2つ)でありながら、全ノード数Nに対して、logNの転送回数(ホップ数)で、特定のデータのKeyを管理するノードを発見することができる。
(2)第2の従来技術について:
第1の従来技術はオーバレイネットワークに関係なく、de Bruijinグラフを用いた理論上のアルゴリズムについての説明であったが、実際には、Chordのハッシュ空間では各ノードは間隔を持って存在しているため(すなわち、論理識別子空間16(2の4乗)である場合に、論理識別子0〜15の全てにノードが存在するわけではないため)、全ての論理識別子を持つノードが定義されたde Bruijinグラフは適用できない。そこで、Koordeではde Bruijin上のIDをChordハッシュ空間上の仮想IDとし、一つのノードがある区間のIDを担当させている。このようにオーバレイネットワークにKoordeを実装した場合の構成についても、非特許文献1に記載されている。
図19は、第2の従来技術のシステム構成を示すブロック図である。また、図20は、第2の従来技術のデータ検索手順を示すフローチャートである。また、図21は、第2の従来技術におけるピア間でのメッセージの流れの具体例を示す説明図である。
図19に示すように、第2の従来術におけるデータ検索システムは、ネットワーク300上でのアドレスを有する複数のピア310,320,330から構成される。なお、ピア310,320,330は、それぞれ第1の従来技術におけるノードに相当する。これらのピア310,320,330はそれぞれ異なる論理識別子を有する。さらに、各ピア310,320,330は、ピア論理識別子格納部318と、ローカルデータ格納部311と、ルーティングテーブル312と、メッセージ転送手段313と、通信手段314と、左ビットシフト手段315と、先頭ビット取得手段316と、登録・検索実行手段317とを備えている。
ピア論理識別子格納部318には、オーバレイネットワークにおいてピア310を他のピアと識別する論理識別子が格納される。ローカルデータ格納部311には、オーバレイネットワーク内のピアで共有されるデータのうち、ピア310が管理するデータが格納される。
ルーティングテーブル312には、他ピアの論理識別子と、そのピアにアクセスするために必要なネットワーク300上でのアドレスとが格納されている(図21に示すテーブル500参照)。このアドレスとしては、例えばInternet Protocol(IP)アドレスが用いられてもよい。
ルーティングテーブルには、dノードとsノードが格納される。dノードは、各自のピアの論理識別子をmとした場合に、論理識別子2mの「predecessor」に対応するノード(ピア)である。ここで、論理識別子2mの「predecessor」とは、図21に示すリングの中で、論理識別子2mから見て反時計回りの方向に存在する最初のノード(ピア)である。このpredecessorは、論理識別子2mとの間のハッシュ空間を責任領域としてデータの管理を担当する。ただし、ここでの論理識別子2mは、厳密には論理識別子空間のサイズをNとした場合に、合同式modを用いて、2m mod Nと表される。図21に示す例では、ピア516の論理識別子が13(2進数表示で1101)であるため、dノードは論理識別子10(2進数表示で1010)のピア(ノード)515となる。
また、sノードは、各自のピアの論理識別子をmとした場合に、論理識別子mの「successor」に対応するノード(ピア)である。ここで、論理識別子mの「successor」とは、図21に示すリングの中で、論理識別子mから見て時計回りに存在する最初のノード(ピア)である。図21に示す例では、ピア516の論理識別子が13(2進数表示で1101)であるため、sノードは論理識別子15(2進数表示で1111)のピア(ノード)517となる。この例では、論理識別子サイズNが16であるが、これを超える場合には、合同式modを用いて、2m mod Nとして処理される。
左ビットシフト手段315は、Koordeのアルゴリズムにもとづく左ビットシフトの処理(mのビット列を1ビットだけ左にシフトさせ、最下位ビットにキーの先頭ビットを与える処理)を実行する。先頭ビット取得手段316は、キーシフトの先頭ビットを取得し、取得した先頭ビットと論理識別子空間とから仮想ノードiを算出する処理を実行する。
登録・検索実行手段317は、データの登録および検索の処理を実行する。メッセージ転送手段313は、データの登録要求および検索メッセージ(検索要求)の転送処理を実行する。通信手段314は、ネットワーク300を通じて他のピアとの間で検索メッセージ等を送受信する処理を実行する。
このような構成を有する従来のデータ検索システムは次のように動作する。
あるピアm(例えば図21に示す論理識別子1101のピア516)の登録・検索実行手段317は、データの登録・検索要求が外部(例えば外部ユーザインタフェース)から与えられると、ハッシュ関数などを用いて、このデータが格納される1つの論理識別子を算出する。この論理識別子を論理識別子keyとキーシフトkshiftとし、当該ピアの論理識別子に1を加えた値を仮想ノードiとする。例えば“Foo”というデータの登録先を探す場合において、このハッシュ値が0111(2進数表示)となったとする。これらの値を引数として、登録・検索実行手段317は、メッセージ転送手段313を呼び出す。
メッセージ転送手段313において、図20に示すフローチャートの各処理が実行される。上記の例では、まず、論理識別子keyの値「0111」、キーシフトkshiftの値「0111」、仮想ノード「1110」がメッセージ転送手段313に与えられる。
メッセージ転送手段313は、論理識別子keyがmより大きく、successor以下の範囲に含まれるか否かを判定する(ステップS401)。この範囲に含まれる場合は(ステップS401のYes)、successorが当該論理識別子keyを担当すると判別される。この場合は、検索要求に対する検索結果が検索元のピアに返される(ステップS402)。上記の範囲に含まれない場合は(ステップS401のNo)、メッセージ転送手段313は、仮想ノードiが上記の範囲(mより大きくsuccessor以下の範囲)に含まれるか否かを判定する(ステップS403)。
仮想ノードiが上記の範囲に含まれない場合は(ステップS403のNo)、メッセージ転送手段313は、当該ピアmにて処理が実行されたときの引数と同一の引数(論理識別子key、キーシフトkshift、仮想ノードi)で、当該ピアmのsuccessorを呼び出す(ステップS407)。これにより、successorが、論理識別子Keyを、キーシフトkshiftおよび仮想ノードiで探す処理(ステップS401〜S407)を実行する。
仮想ノードiが上記の範囲に含まれる場合は(ステップS403のYes)、ピアmの先頭ビット取得手段316は、キーシフトkshiftの先頭ビットbと、当該ピアの論理識別子mを用いて、2m+b mod Nの計算を行い、計算結果の論理識別子を仮想ノードiとする(ステップS404)。ここで、Nは論理識別子空間のサイズある。
次に、左ビットシフト手段315は、キーシフトkshiftを1ビットだけ左にシフトさせる(ステップS405)。このようにして得られた論理識別子keyとキーシフトkshift、仮想ノードiを引数として、ピアmのdノードであるピアを呼び出す(ステップS406)。これにより、dノードであるピアが、論理識別子Keyを、キーシフトkshiftおよび仮想ノードiで探す処理(ステップS401〜S407)を実行する。
上記の例では、図21に示すように、最初の論理識別子が「1101」であるピア516にて、論理識別子keyの値「0111」、キーシフトkshiftの値「0111」、過疎ノードi「1110」でメッセージ転送手段313が呼び出される(図21の521)。この場合、仮想ノードiが範囲(1101,1111]に存在するので(ステップS403のYes)、仮想ノードiが「1100」と算出され(ステップS404)、キーシフトkshiftが「1110」に変換されて(ステップS405)、dノードであるピア515にメッセージが転送される(ステップS406;図21の522)。
ピア515においても、仮想ノードi「1100」が、範囲(1010,1101]に存在するため(ステップS403のYes)、仮想ノードiが「1001」と算出され(ステップS404)、キーシフトkshiftが「1100」に変換されて(ステップS405)、dノードであるノード512にメッセージが転送される(ステップS406;図21の523)。
ピア512では、論理識別子keyの値「0111」が範囲(1010,1101]に存在せず(ステップS401のNo)、仮想ノードi「1001」も範囲(1010,1101]に存在しないため(ステップS403のNo)、ピア512のsuccessorであるピア513にメッセージが転送される(ステップS407)。このピア513では、論理識別子keyの値「0111」が範囲(0110,1001]に存在するため(ステップS401のYes)、そのsuccessorが論理識別子keyの値「0111」を管理していると判定する。そして、ピア513のメッセージ転送手段313は、検索結果を検索元のピア516に返す(ステップS402)。
このようにして、この第2の従来技術では、ノード数が図18に示したように論理識別子空間のサイズ分存在しない場合でも、定数次数と対数ホップ数を実現している。なお、定数次数とは全てのピアが他ピアのアドレスを認識する数は、ピアの総数によらず一定であることであり、対数ホップ数とは、あるピアからメッセージを転送して、あて先に到達するまでのホップ数が、ピアの総数nとしたときにO(log(n))であることを指す。
以下、本発明の実施の一形態を図面を参照して説明する。
実施の形態1.
図1は、この実施の形態1におけるデータ検索システムの構成を示すブロック図である。図1に示すように、実施の形態1におけるデータ検索システムは、ネットワーク100上でのアドレスを有する複数のノード110,120,130から構成される。図1には、ネットワーク100に接続されているノードはノード110,120,130だけであるが、ほかにも複数のノードがネットワーク100に接続されている。各ノードは、例えばサーバやパーソナルコンピュータなどの計算機(端末)で実現されている。
図1に示すように、ノード110は、通信インタフェース(通信IF)111と、ユーザインタフェース(ユーザIF)112と、ハードディスク(HD)113と、メモリ114と、CPU115とを備えている。なお、ノード110以外のノード120,130も、ノード110と同一の構成を備えている。また、通信IF111やユーザIF112などの各部の構成はバスで接続されている。
図1に示す構成において、通信IF111は、ネットワーク100と接続され、データの送受信を制御するインタフェースである。ユーザIF112は、ユーザに対する情報の表示や、ユーザのデータ入力を受け付けるインタフェースである。図1に示すように、ユーザIF112は、ユーザが入力操作可能な入力部116と接続され、入力部116からのデータ入力を受け付ける。なお、図1に示す例では、ノード110と入力部116とを別構成としているが、入力部116がノード110の構成として設けられていてもよい。
HD113は、制御プログラム(データ検索用プログラム)や各種データを格納する記憶媒体(外部記憶装置)である。なお、図1に示す例では、記憶媒体としてHD113を示しているが、光磁気ディスクなどの記憶媒体であってもよい。メモリ114は、CPU115が直接アクセスする制御プログラムやデータを記憶する記憶装置(主記憶装置)である。CPU115は、制御プログラムに従って各々の処理を実行する中央処理装置である。
次に、この実施の形態1におけるデータ検索システムの動作について説明する。
なお、この実施の形態1において、論理識別子範囲は、範囲検索対象の論理識別子の範囲である。そして、最大論理識別子とは、当該論理識別子範囲の上限値に相当する。また、最小論理識別子とは、当該論理識別子範囲の下限値に相当する。また、シフト後論理識別子範囲は、左ビットシフトされた後の論理識別子範囲である。そして、シフト後最大論理識別子は、最大論理識別子をビットシフトして得られる値である。また、シフト後最小論理識別子は、最小論理識別子をビットシフトして得られる値である。
図2は、この実施の形態1のデータ検索手順を示すフローチャートである。なお、図2に示すデータ検索手順は、ノードmにおいて、論理識別子範囲idRangesを探す手順が非同期処理であるとした場合の処理手順である。
ユーザは、論理識別子範囲idRangesで指定される範囲のデータを取得する場合、入力部116を介して論理識別子範囲idRangesを指定した検索要求をノードm(論理識別子mのノード)に入力する。そして、検索要求に応じて、ノードmにおいて図2に示すデータ検索処理が実行される。
図2に示すデータ検索手順が実行されると、まず、ノードmのCPU115は、論理識別子範囲idRangesに含まれる論理識別子が当該ノードmの論理識別子のみが含まれるか否かを判定する(ステップS701)。この判定は、論理識別子範囲に含まれる最大論理識別子と最小論理識別子を用いて判定される。判定結果として、ノードmの論理識別子のみであると判定された場合は(ステップS701のYes)、ノードmのCPU115は、自身が検索要求された論理識別子範囲のデータを持つノードであると判断する。そして、ノードmのCPU115は、検索要求に応じて図2に示す処理を初期に実行したノードに、ノードmを検索結果として返す(ステップS702)。
なお、ここでは、図2に示す処理を初期に実行したノードが自身であるため、図2に示す処理を初期に実行したノードへのポインタ情報を省略しているが、図2に示すデータ検索処理の実行に当たっては、そのポインタ情報が引き継がれるものととし、ステップS702ではそのポインタ情報を用いて、初期のノードに対して検索結果が返される。
ステップS701の判定結果にて、mの論理識別子のみではないと判定された場合には(ステップS701のNo)、ノードmのCPU115は、論理識別子範囲idRangesに対して、図3のフローチャートで示される左ビットシフト範囲分割処理の手順を実行し、分割後の論理識別子範囲Range0と論理識別子範囲Range1を取得する(ステップS703)。
ステップS703で取得された論理識別子範囲Range0がNullでない場合には(ステップS704のNo)、ノードmのCPU115は、ノードmの0側次ノードを取り出し、このノードにて、論理識別子範囲Range0を探す処理を非同期に実行する(ステップS705)。このステップS705の処理は、図2に示すデータ検索処理の手順と同一であり、再帰的に実行される。
ステップS705の処理を非同期実行後、あるいはステップS704にて論理識別子範囲Range0がNullであるとされた場合には(ステップS704のYes)、ノードmのCPU115は、論理識別子範囲Range1がNullであるか否かを判定する(ステップS706)。ここで、論理識別子範囲Range1がNullであると判定しなかった場合には(ステップS706のNo)、ノードmのCPU115は、ノードmの1側次ノードを取り出し、このノードにて、論理識別子範囲Range1を探す処理を非同期に実行する(ステップS707)。このステップS707の処理も、図2に示すデータ検索処理の手順と同一であり、再帰的に実行される。
ステップS707の処理を非同期実行後、あるいはステップS706にて論理識別子範囲Range1がNullであると判定された場合には(ステップS706のYes)、図2に示す処理が終了する。このような手順により、論理識別子範囲idRangesは逐次分割され、目的とするノードに到達すると、その結果が初期に実行したノードに返される。
図3は、左ビットシフト範囲分割処理の手順を示すフローチャートである。図3に示す左ビットシフト範囲分割処理において、ノードmのCPU115は、論理識別子範囲idRangesが与えられると、論理識別子範囲idRangesに含まれる、ビットシフト対象の最大論理識別子とビットシフト対象の最小論理識別子とを取り出し(ステップS601)、これらの先頭ビットが同一か否か判定する(ステップS602)。
同一である場合に(ステップS602のYes)、その先頭ビットが1である場合には(ステップS606のYes)、ステップS607の処理を実行して、処理を終了する。先頭ビットが0である場合には(ステップS606のNo)、ステップS608の処理を実行して、処理を終了する。
先頭ビットが1である場合のステップS607の処理では、CPU115は、論理識別子範囲idRanges内の論理識別子を全て左ビットシフトして、新たな論理識別子範囲Range1に与え、他の新たな論理識別子範囲Range0にはNullに与える。
先頭ビットが0である場合のステップS608の処理では、CPU115は、論理識別子範囲idRanges内の論理識別子を全て左ビットシフトして、新たな論理識別子範囲Range0に与え、他の新たな論理識別子範囲Range1にはNullを与える。
なお、Nullが与えられた論理識別子範囲は実質存在しないことと同一であるため、ステップS602において先頭ビットが同一であると判定された場合は(ステップS602のYes)、与えられた論理識別子範囲idRangesは分割されないと解釈してよい。
ステップS602において先頭ビットが同一でないと判定された場合には(ステップS602のNo)、CPU115は、論理識別子範囲idRangesに含まれるビットシフト対象の論理識別子範囲の先頭ビットが同一であるような複数集合(複数の論理識別子範囲)に分割し、これを返す。
すなわち、図3に示すように、CPU115は、1側最小論理識別子と0側最大論理識別子を生成する(ステップS603)。ここで、1側最小論理識別子とは、先頭ビットが1でそれ以降のビットが0である論理識別子である。また、0側最大論理識別子とは、先頭ビットが0でそれ以降のビットが1である論理識別子である。
次に、CPU115は、新たな論理識別子範囲Range1に1側最小論理識別子以上の論理識別子範囲idRangesを入力し、別の新たな論理識別子範囲Range0に0側最大論理識別子以下の論理識別子範囲idRangesを入力する(ステップS604)。このようにして、左ビットシフト範囲分割処理では、最大論理識別子と最小論理識別子の先頭ビットの違いにより論理識別子範囲を分割する。
そして、CPU115は、新たな論理識別子範囲Range0,1の論理識別子をそれぞれ左ビットシフトする(ステップS605)。なお、図3に示す例では、論理識別子範囲idRangesを論理識別子範囲Range0,1に分割した後に左ビットシフトする処理を実行しているが、論理識別子範囲idRangesを左ビットシフトした後に論理識別子範囲Range0,1に分割するようにしてもよい。また、論理識別子範囲idRangesを論理識別子範囲Range0,1に分割すると同時に左ビットシフトする処理を実行するようにしてもよい。
次に、この実施の形態1におけるデータ検索システムの動作の具体例(データ検索処理の手順の具体例)について、図4および図5を用いて説明する。
図4は、この実施の形態1におけるde Bruijnグラフを示す説明図である。また、図5は、この実施の形態1における左ビットシフト範囲分割処理のアルゴリズムを視覚的に示す説明図である。
図4に示すように、論理識別子が与えらたノードがネットワーク内に存在するものとし、論理識別子13(2進数表示で「1101」)であるノード413が、データの論理識別子範囲が[7,11]であるデータを取得するものとする。
この論理識別子に相当するノードは、図4では、論理識別子7(2進数表示で「0111」)がノード407、論理識別子8(2進数表示で「1000」)がノード408、論理識別子9(2進数表示で「1001」)がノード409、論理識別子10(2進数表示で「1010」)がノード410、論理識別子11(2進数表示で「1011」)がノード411となる。これらのノードは、ネットワーク内に散在しているが、この実施の形態1で示した手順により、これら散在するノードからのデータ取得を可能とする。
図5の1201に記載の論理識別子範囲は、検索要求された論理識別子範囲[7,11]であって、左ビットシフト前の最大論理識別子と左ビットシフト前の最小論理識別子のビット列を木構造で表記している。また、図5の1202〜1213に記載の論理識別子範囲は、シフト後最大論理識別子とシフト後最小論理識別子のビット列を木構造で表記している。また、図5の1201〜1213に記載の論理識別子範囲におけるMin.以降には、ビット列に対応する最小論理識別子の値の10進数表記と、その横の()内にシフトが行われていない最小論理識別子の値の10進数表記とを表記している。さらに、図5の1201〜1213に記載の論理識別子範囲におけるMax.以降には、ビット列に対応する最大論理識別子の値の10進数表記と、その横の()内にシフトが行われていない最大論理識別子の値の10進数表記とを表記している。また、木構造のRootの左には、その木構造のビットシフト前の先頭ビットを示している。
まず、ノード413では、図5の1201に記載の論理識別子範囲[7,11]を探す処理を行う。図2に示すステップS701において、ノード413のCPU115は、論理識別子範囲[7,11]内にノード413の論理識別子「1101」のみが含まれるか否かを判定する(ステップS701)。しかし、上記の例では、ノード413の論理識別子「1101」は論理識別子範囲[7,11](最小論理識別子「0111」と最大論理識別子「1011」の範囲)に含まれないので、ステップS701の条件は成り立たない(ステップS701のNo)。従って、ノード413のCPU115は、論理識別子範囲[7,11]に対して、左ビットシフトを行い、論理識別子範囲[7,7](図5の1203)と論理識別子範囲[8,11](図5の1202)に分割する(ステップS703)。
具体的には、ノード413のCPU115が図3に示した処理を実行して論理識別子範囲を複数の論理識別子範囲に分割する。すなわち、ノード413のCPU115は、論理識別子範囲[7,11]に含まれる最大論理識別子の先頭ビットと最小論理識別子の先頭ビットとを取り出す(ステップS601)。ここでは、最大論理識別子「1011」の先頭ビット「1」が取り出され、最小論理識別子「0111」の先頭ビット「0」が取り出される。
そして、CPU115は、最大論理識別子の先頭ビットと最小論理識別子の先頭ビットが同一であるか否かを判定する(ステップS602)。上記の例では、各々の先頭ビットが「1」と「0」であって同一でないので(ステップS602のNo)、CPU115は、1側最小論理識別子と0側最大論理識別子を生成する(ステップS603)。ここで、1側最小論理識別子は「1000」であり、0側最大論理識別子は「0111」である。
次いで、CPU115は、新たな論理識別子範囲Range1に、論理識別子範囲[7,11]の中で1側最小論理識別子「1000」以上の論理識別子範囲を入力し、別の新たな論理識別子範囲Range0に、論理識別子範囲[7,11]の中で0側最大論理識別子「0111」以下の論理識別子範囲を入力する(ステップS604)。上記の例では、論理識別子範囲[7,11]のうち、1側最小論理識別子「1000」以上の論理識別子範囲[8,11]が新たな論理識別子範囲Range1に入力される。また、論理識別子範囲[7,11]のうち、0側最大論理識別子「0111」以下の論理識別子範囲[7,7]が別の新たな論理識別子範囲Range0に入力される。このようにして、左ビットシフト範囲分割処理では、先頭ビットの違いにより論理識別子範囲[7,11]を論理識別子範囲[7,7]と論理識別子範囲[8,11]に分割する。
そして、ノード413のCPU115は、新たな論理識別子範囲Range0(論理識別子範囲[7,7])内の論理識別子を全て左ビットシフトするとともに、新たな論理識別子範囲Range1(論理識別子範囲[8,11])内の論理識別子を全て左ビットシフトする(ステップS605)。このようにして、左ビットシフトされた分割後の論理識別子範囲Range0(図5の1203)と論理識別子範囲Range1(図5の1202)を取得する。
次いで、ノード413のCPU115は、ステップS703で分割された新たな論理識別子範囲Range0(論理識別子範囲[7,7])がNullであるかどうかを判定する(ステップS704)。上記の例では、論理識別子範囲Range0がNullではないので(ステップS704のNo)、CPU115は、ノード413の0側次ノードであるノード410にメッセージを転送して、そのノード410において論理識別子範囲Range0を検索させる(ステップS705)。
また、ノード413のCPU115は、ステップS703で分割された新たな論理識別子範囲Range1(論理識別子範囲[8,11])がNullであるかどうかを判定する(ステップS706)。この場合も、上記の例では、論理識別子範囲Range1がNullではないので(ステップS706のNo)、CPU115は、ノード413の1側次ノードであるノード411にメッセージを転送して、そのノード411において論理識別子範囲Range1を検索させる(ステップS707)。
次に、ノード411では、図5の1202に記載の論理識別子範囲[8,11]を探す処理を行う。ノード413から論理識別子範囲[8,11]の範囲検索要求を受け付けたノード411は、論理識別子範囲[8,11]に自身のノードの論理識別子「1011」のみが含まれるかどうかを判定する(ステップS701)。
論理識別子範囲[8,11]はノード411の論理識別子「1011」のみを含むものではないため(ステップS701のNo)、ノード411のCPU115は、論理識別子範囲[8,11]に対して、左ビットシフトを行い、複数の論理識別子範囲に分割する処理(図3に示す左ビットシフト範囲分割処理)を実行する(ステップS703)。しかし、ここでは、論理識別子範囲も上限値と下限値の先頭ビットが同一であるため、2つには分割されない。
具体的には、ノード411のCPU115は、論理識別子範囲[8,11]に含まれる最大論理識別子の先頭ビットと最小論理識別子の先頭ビットとを取り出す(ステップS601)。ここでは、図5の論理識別子範囲1202に示すように、最大論理識別子「0110」の先頭ビット「0」が取り出され、最小論理識別子「0000」の先頭ビット「0」が取り出される。
そして、CPU115は、最大論理識別子の先頭ビットと最小論理識別子の先頭ビットが同一であるか否かを判定する(ステップS602)。上記の例では、各々の先頭ビットがいずれも「0」であって同一である(ステップS602のYes)。従って、CPU115は、先頭ビットが「0」であると判定し(ステップS606のNo)、論理識別子範囲(図5の1202)内の論理識別子を左ビットシフトする処理を実行し、左ビットシフトした論理識別子範囲を新たな論理識別子範囲Range0に入力し、別の新たな論理識別子範囲Range1にNullを入力する(ステップS608)。
その後、ノード411のCPU115は、ビットシフトのみ行われた新たな論理識別子範囲Range0(図5の1204)がNullであるかどうかを判定する(ステップS704)。このとき、論理識別子範囲Range0はNullではないので(ステップS704のNo)、CPU115は、ノード411の0側次ノードであるノード406にメッセージを転送して、そのノード406において論理識別子範囲Range0を検索させる(ステップS705)。
なお、ノード411のCPU115は、新たな論理識別子範囲Range1に対してもNullであるかどうかを判定するが(ステップS706)、論理識別子範囲Range1はNullであるため(ステップS706のYes)、ステップS707の処理を実行しない。
次に、ノード410では、図5の1203に記載の論理識別子範囲[7,7]を探す処理を行う。ノード413から論理識別子範囲[7,7]の範囲検索要求を受け付けたノード410は、論理識別子範囲[7,7]に自身のノードの論理識別子「1010」のみが含まれるかどうかを判定する(ステップS701)。
論理識別子範囲[7,7]はノード410の論理識別子「1010」のみを含むものではないため(ステップS701のNo)、ノード410のCPU115は、論理識別子範囲[7,7]に対して、左ビットシフトを行い、複数の論理識別子範囲に分割する処理(図3に示す左ビットシフト範囲分割処理)を実行する(ステップS703)。しかし、ここでは、論理識別子範囲も上限値と下限値の先頭ビットが同一であるため、2つには分割されない。
具体的には、ノード410のCPU115は、論理識別子範囲[7,7]に含まれる最大論理識別子の先頭ビットと最小論理識別子の先頭ビットとを取り出す(ステップS601)。ここでは、図5の論理識別子範囲1203に示すように、最大論理識別子と最小論理識別子はいずれも「1110」であり、その先頭ビット「1」が取り出される。
そして、CPU115は、最大論理識別子の先頭ビットと最小論理識別子の先頭ビットが同一であるか否かを判定する(ステップS602)。上記の例では、各々の先頭ビットがいずれも「1」であって同一である(ステップS602のYes)。従って、CPU115は、先頭ビットが「1」であると判定し(ステップS606のYes)、論理識別子範囲(図5の1203)内の論理識別子を左ビットシフトする処理を実行し、左ビットシフトした論理識別子範囲を新たな論理識別子範囲Range1に入力し、別の新たな論理識別子範囲Range0にNullを入力する(ステップS607)。
その後、ノード410のCPU115は、ビットシフトのみ行われた新たな論理識別子範囲Range1(図5の1205)がNullであるかどうかを判定する(ステップS706)。このとき、論理識別子範囲Range1はNullではないので(ステップS706のNo)、CPU115は、ノード410の1側次ノードであるノード405にメッセージを転送して、そのノード405において論理識別子範囲Range1を検索させる(ステップS707)。
なお、ノード410のCPU115は、新たな論理識別子範囲Range0に対してもNullであるかどうかを判定するが(ステップS704)、論理識別子範囲Range0はNullであるため(ステップS704のYes)、ステップS705の処理を実行しない。
次に、ノード406では、図5の1204に記載の論理識別子範囲[8,11]を探す処理を行う。図2に示すステップS701において、ノード406のCPU115は、論理識別子範囲[8,11]内にノード406の論理識別子「0110」のみが含まれるか否かを判定する(ステップS701)。しかし、上記の例では、論理識別子範囲[8,11]はノード406の論理識別子「0110」のみを含むものではないので(ステップS701のNo)、ノード406のCPU115は、論理識別子範囲[8,11]に対して、左ビットシフトを行い、論理識別子範囲[8,9](図5の1207)と論理識別子範囲[10,11](図5の1206)に分割する(ステップS703)。
具体的には、ノード406のCPU115が図3に示した処理を実行して論理識別子範囲を複数の論理識別子範囲に分割する。すなわち、ノード406のCPU115は、論理識別子範囲[8,11]に含まれる最大論理識別子の先頭ビットと最小論理識別子の先頭ビットとを取り出す(ステップS601)。ここでは、最大論理識別子「1000」の先頭ビット「1」が取り出され、最小論理識別子「0000」の先頭ビット「0」が取り出される。
そして、CPU115は、最大論理識別子の先頭ビットと最小論理識別子の先頭ビットが同一であるか否かを判定する(ステップS602)。上記の例では、各々の先頭ビットが「1」と「0」であって同一でないので(ステップS602のNo)、CPU115は、1側最小論理識別子と0側最大論理識別子を生成する(ステップS603)。
ここで、1側最小論理識別子は「1010」(10進数表記で「10」)となる。すなわち、図5の1204に記載の論理識別子範囲は以前に2回ビットシフトされている(シフトカウントが「2」である)。2回のビットシフトで取り出された(はじき出された)値はそれぞれ「1」と「0」である(図5の1202で「1」が取り出され、図5の1204で「0」が取り出されている)。このことから、ビットシフトされる前の1側の論理識別子範囲の値は「101*」(「*」は「0」または「1」)となる。従って、1側最小論理識別子は「1010」となる。
また、0側最大論理識別子は「1001」(10進数表記で「9」)となる。すなわち、図5の1204に記載の論理識別子範囲は以前に2回ビットシフトされている(シフトカウントが「2」である)。2回のビットシフトで取り出された(はじき出された)値はそれぞれ「1」と「0」である(図5の1202で「1」が取り出され、図5の1204で「0」が取り出されている)。このことから、ビットシフトされる前の0側の論理識別子範囲の値は「100*」(「*」は「0」または「1」)となる。従って、0側最大論理識別子は「1001」となる。
次いで、CPU115は、新たな論理識別子範囲Range1に、論理識別子範囲[8,11]の中で1側最小論理識別子「1010」以上の論理識別子範囲を入力し、別の新たな論理識別子範囲Range0に、論理識別子範囲[8,11]の中で0側最大論理識別子「1001」以下の論理識別子範囲を入力する(ステップS604)。上記の例では、論理識別子範囲[8,11]のうち、1側最小論理識別子「1010」以上の論理識別子範囲[10,11]が新たな論理識別子範囲Range1に入力される。また、論理識別子範囲[8,11]のうち、0側最大論理識別子「1001」以下の論理識別子範囲[8,9]が別の新たな論理識別子範囲Range0に入力される。このようにして、左ビットシフト範囲分割処理では、先頭ビットの違いにより論理識別子範囲[8,11]を論理識別子範囲[8,9]と論理識別子範囲[10,11]に分割する。
そして、ノード406のCPU115は、新たな論理識別子範囲Range0(論理識別子範囲[8,9])内の論理識別子を全て左ビットシフトするとともに、新たな論理識別子範囲Range1(論理識別子範囲[10,11])内の論理識別子を全て左ビットシフトする(ステップS605)。このようにして、左ビットシフトされた分割後の論理識別子範囲Range0(図5の1207)と論理識別子範囲Range1(図5の1206)を取得する。
次いで、ノード406のCPU115は、ステップS703で分割された新たな論理識別子範囲Range0(論理識別子範囲[8,9])がNullであるかどうかを判定する(ステップS704)。上記の例では、論理識別子範囲Range0がNullではないので(ステップS704のNo)、CPU115は、ノード406の0側次ノードであるノード412にメッセージを転送して、そのノード412において論理識別子範囲Range0を検索させる(ステップS705)。
また、ノード406のCPU115は、ステップS703で分割された新たな論理識別子範囲Range1(論理識別子範囲[10,11])がNullであるかどうかを判定する(ステップS706)。この場合も、上記の例では、論理識別子範囲Range1がNullではないので(ステップS706のNo)、CPU115は、ノード406の1側次ノードであるノード413にメッセージを転送して、そのノード413において論理識別子範囲Range1を検索させる(ステップS707)。
以降は同様に、論理識別子範囲[8,9]はノード412にて論理識別子範囲[8,8](図5の1212)と論理識別子範囲[9,9](図5の1211)に分割されて、それぞれノード408とノード409に転送される。論理識別子範囲[10,11]もノード413にて論理識別子範囲[10,10](図5の1210)と論理識別子範囲[11,11](図5の1209)に分割され、それぞれノード410とノード411に転送される。
一方、ノード405に転送された論理識別子範囲[7,7]は、上限値と下限値の先頭ビットは常に同一なので(ステップS602のYes)、論理識別子範囲分割はされず、論理識別子範囲が図5の1205から図5の1208、図5の1208から図5の1213というように左ビットシフトを受けながら、ノード405からノード411へ、ノード411からノード407へと転送される。
ノード407、ノード408、ノード409、ノード410、ノード411に至った論理識別子範囲は、各ノードの論理識別子範囲のみを含むため(図2のステップS701のYes)、各ノードのCPU115は結果を初期に要求を出したノード413に返す(ステップS702)。
以上に説明したように、この実施の形態1では、検索対象の論理識別子範囲に属する論理識別子を担うノードに、検索メッセージが行き渡るように、先頭ビットの違いによって論理識別子範囲を分割しながら、左ビットシフトを実行し、論理識別子範囲を分割する手法を用いることで、定数次数と対数ホップ数を実現しつつグラフ上での範囲検索を実現することができる。
実施の形態2.
上記の実施の形態1はオーバレイネットワークに関係なく、de Bruijinグラフを用いた理論上の範囲検索のアルゴリズムについての説明であったが、実際には、Chordのハッシュ空間では各ノードは間隔を持って存在しているため(すなわち、例えば論理識別子空間16(2の4乗)である場合に、論理識別子0〜15の全てにノードが存在するわけではないため)、全ての論理識別子を持つノードが定義されたde Bruijinグラフは適用できない。そこで、この実施の形態2ではde Bruijin上の論理識別子(ID)をChordハッシュ空間上の仮想IDとし、一つのノードがある区間のIDを担当させている。
図6は、この実施の形態2におけるデータ検索システムの構成を示すブロック図である。図6に示すように、この実施の形態2におけるデータ検索システムは、ネットワーク800上でのアドレスを有する複数のピア810,820,830から構成される。図6には、ネットワーク800に接続されているピアはピア810,820,830だけであるが、ほかにも複数のピアがネットワーク800に接続されている。各ピアは、プログラム制御により動作するサーバなどのコンピュータ(中央処理装置;プロセッサ;データ処理装置)で構成されている(コンピュータのハードウェア構成は図1に示した構成と同様である)。なお、この実施の形態において、ピアとノードとは同義としている。
図1に示すように、ピア810は、ピア論理識別子格納部818、ローカルデータ格納部811、ルーティングテーブル812、メッセージ転送手段813、通信手段814、範囲分割手段815、左ビットシフト範囲分割手段816、登録・検索実行手段817を備えている。なお、ピア810以外のピア820,830も、ピア810と同一の構成を備えている。
ピア810を構成する格納部(ローカルデータ格納部811、ルーティングテーブル812、ピア論理識別子格納部818)には、それぞれ概略つぎのようなデータが格納されている。
ピア論理識別子格納部818には、オーバレイネットワークでの当該ピア(例えばピア810)の論理識別子(ノードIDともいう)が格納されている。論理識別子はオーバレイネットワーク上における各ピアを識別するための識別子である。
ローカルデータ格納部811には、全ピアで共有するデータ(コンテンツ)のうち当該ピア(例えばピア810)が担当するデータが格納される。各ピアがどの部分のデータを担当(管理)するかは、ピア論理識別子格納部818に格納された各ピアの論理識別子によって異なる。
ルーティングテーブル812は、各ピアがルーティングを行うときに参照するテーブルである。ルーティングテーブル812には、他のピアの論理識別子と、ネットワーク800上でのアドレス(例えば、Internet Protocol(IP)アドレス)の組が複数格納されている。このルーティングテーブルの管理方式(すなわち、全ピアの中から、どのピアの論理識別子とネットワークアドレスの組を持つか)は、非特許文献1に記載のKoordeと同一である。上述したように、ルーティングテーブル812には、当該ピアの論理識別子の2倍のpredecessorの論理識別子とアドレスの組、および当該ピアのsuccessorの論理識別子とアドレスの組が格納される。
ピア810を構成する手段(メッセージ転送手段813、通信手段814、範囲分割手段815、左ビットシフト範囲分割手段816、登録・検索実行手段817)は、それぞれ概略つぎのように動作する。
範囲分割手段815は、与えられた論理識別子範囲を、ルーティングテーブル812に格納されたピアの論理識別子を境界値として分割する。この場合、例えば、論理識別子範囲にピアの論理識別子が含まれる場合には、最小論理識別子とピアの論理識別子とから決定される論理識別子範囲と、ピアの論理識別子と最大論理識別子とから決定される論理識別子範囲とに分割される。このとき、シフト後最大論理識別子やシフト後最長論理識別子範囲も同時に分割する。
左ビットシフト範囲分割手段816は、与えられた論理識別子範囲について左ビットシフトを行うとともに、左ビットシフト前の先頭ビットによって異なる複数の論理識別子範囲を出力する。この手順は、図3に示した実施の形態1における左ビットシフト範囲分割処理の手順と同一である。
登録・検索実行手段817は、データの登録および検索の処理を実行する。例えば、登録・検索実行手段817は、外部プログラムから検索要求があった場合に呼ばれ、検索条件に応じて論理識別子範囲を生成し、これをメッセージ転送手段に渡し、返ってきた検索結果を外部プログラムに与える役割を担う。
メッセージ転送手段813は、データの登録要求および検索メッセージ(検索要求)の転送処理を実行する。メッセージ転送先の決定には、メッセージ内に含まれる論理識別子範囲が用いられる。この論理識別子範囲には、最大論理識別子と最小論理識別子、およびシフト後最大論理識別子、シフト後最小論理識別子が格納されている。
通信手段814は、他ピアのネットワーク800上でのアドレスを指定して、ネットワーク800上にメッセージを送受信する処理を担う。これにより、あるピアのメッセージ転送手段813によって他のピアのメッセージ転送手段813を呼び出すことが可能となる。
次に、この実施の形態2におけるデータ検索システムの動作について説明する。
図7は、この実施の形態2のデータ検索システムの全体動作を示すフローチャートである。図7に示す処理において、まず、ピアmにて登録・実行処理部817が、検索式Queryを含んだ検索要求を受け付け、検索式Queryに対応する論理識別子範囲リストRangesに変換して取得する(ステップS1001)。なお、検索要求は、例えば検索要求者(ユーザ)の入力部(図1の116)の操作に応じてピアmの登録・検索実行手段817に入力される。
次に、ピアmの登録・検索実行手段817は、検索結果を格納するリストResultsを初期化し(ステップS1002)、他ピアからの検索結果メッセージ(受信結果)をこのリストResultsに格納するプロセスの起動を行う(ステップS1002)。
次に、ピアmの登録・検索実行手段817は、検索結果を待つ最大時間をタイムアウト(Timeout)としてタイマに設定する(ステップS1003)。そして、ピアmの登録・検索実行手段817は、仮想ノードiを設定する(ステップS1004)。好適には、この仮想ノードiの論理識別子はピアmとsuccessorのピアの間から任意に選ばれる。
次いで、ピアmの登録・検索実行手段817は、ステップS1001で得られた論理識別子範囲リストと仮想ノードiを引数として、メッセージ転送手段813を非同期に呼び出す(ステップS1005)。これにより、メッセージ転送手段813において、図8に示すフローチャートの各処理が実行される。
その後、ピアmの登録・検索実行手段817は、論理子範囲リスト内の全ての論理識別子に対する検索結果が得られたか、あるいはTimeoutが0以下となるまで、待機し(待ち続け)(ステップS1006)、一定時間(Interval)毎にタイマの値を減算していく(ステップS1007)。
待ち条件を抜けた後(論理識別子範囲リスト内の全ての論理識別子に対する検索結果を得られたとき、あるいはタイマがタイムアウトしたとき)は、ピアmの登録・検索実行手段817は、他ピアから送信された検索結果が格納されている結果リストResultsを、検索要求者に対して提供する(ステップS1008)。
図8は、この実施の形態2のデータ検索手順を示すフローチャートである。ピアmにおいて、メッセージ転送手段813は、論理識別子範囲idRangesを仮想ノードiで探す要求を受けると(図7のステップS1005)、論理識別子範囲idRangesをSuccessorの論理識別子sとともに範囲分割手段815に渡す。範囲分割手段815は、論理識別子範囲idRangesをSuccessorの論理識別子sで2つの論理識別子範囲LowRangesとHighRangesに分割する(ステップS901)。そして、範囲分割手段815は、分割した2つの論理識別子範囲LowRangesとHighRangesをメッセージ転送手段813に渡す。
メッセージ転送手段813は、論理識別子範囲LowRangesがNullであるか否か判定する(ステップS902)。論理識別子範囲LowRangesがNullでない場合には(ステップS902のNo)、メッセージ転送手段813は、ローカルデータ格納部811において、論理識別子範囲LowRagesに含まれるシフト前の論理識別子をもとに、これと対応するデータ(論理識別子範囲LowRangeに対応する検索式に合致するデータ)を検索する(ステップS903)。そして、検索した検索結果を検索実行者に渡す。
次いで、メッセージ転送手段813は、論理識別子範囲HighRangesがNullであるか否か判定する(ステップS904)。論理識別子範囲HighRangeがNullである場合には(ステップS904のYes)、このピアmでの検索処理の実行を終了する。論理識別子範囲HighRangesがNullでない場合には(ステップS904のNo)、メッセージ転送手段813は、仮想ノードiが(m,s]に含まれるか否かを判定する(ステップS905)。(m,s]は、m(ピアmの論理識別子)よりも大きくs(Successorの論理識別子)以下であることを示している。
仮想ノードiが(m,s]の範囲に含まれない場合は(ステップS905のNo)、メッセージ転送手段813は、ピアs(Successor)に同一の論理識別子範囲idRangesと仮想ノードiを引数としてメッセージ転送手段813を呼び出す(ステップS911)。これにより、ピアs(Successor)において、論理識別子範囲idRangesを仮想ノードiで探す処理(図8に示す処理)が実行される。そして、このピアmでの検索処理の実行を終了する。
仮想ノードiが(m,s]の範囲に含まれる場合は(ステップS905のYes)、メッセージ転送手段813は、左ビットシフト範囲分割手段816に論理識別子範囲HighRangesを渡す。左ビットシフト範囲分割手段816は、左ビットシフトを行い、論理識別子範囲HighRangesを2つの論理識別子範囲Range0とRange1に分割する処理を実行する(ステップS906)。なお、左ビットシフト範囲分割手段816による論理識別子範囲を分割する手順は、図3に示した実施の形態1における左ビットシフト範囲分割処理の手順と同一である。左ビットシフト範囲分割手段816は、分割した2つの論理識別子範囲Range0,Range1をメッセージ転送手段813に渡す。
次いで、メッセージ転送手段813は、論理識別子範囲Range0がNullであるか否か判定する(ステップS907)。論理識別子範囲Range0がNullでない場合には(ステップS907のNo)、メッセージ転送手段813は、ピアd(Predecessor)のメッセージ転送手段813を、論理識別子範囲Range0、仮想ノード2×i(mod N)、すなわち仮想ノードiを左ビットシフトして得られる値で呼び出す(ステップS908)。これにより、ピアd(Predecessor)において、論理識別子範囲Range0を仮想ノード2×i(mod N)で探す処理(図8に示す処理)が実行される。
さらに、メッセージ転送手段813は、論理識別子範囲Range1がNullであるか否か判定する(ステップS909)。論理識別子範囲Range1がNullでない場合には(ステップS909のNo)、メッセージ転送手段813は、ピアdのメッセージ転送手段813を、論理識別子範囲Range1、仮想ノード2×i+1(mod N)、すなわち仮想ノードiを左ビットシフトして、最下位ビットを1とした値で呼び出す(ステップS910)。これにより、ピアd(Predecessor)において、論理識別子範囲Range1を仮想ノード2×i+1(mod N)で探す処理(図8に示す処理)が実行される。そして、処理を終了する。
次に、この実施の形態2におけるデータ検索システムの動作の具体例(データ検索処理の手順の具体例)について、図9および図10を用いて説明する。
図9は、この実施の形態2におけるピア間でのメッセージの流れの具体例を示す説明図である。また、図10は、この実施の形態2における左ビットシフト範囲分割処理のアルゴリズムを視覚的に示す説明図である。
図9において、オーバレイネットワーク上に参加している複数のピアを示す。論理識別子13であるピア1316が、検索式Queryとして{7≦温度≦11}を実行するものとし、温度という属性は論理識別子範囲と対応するものとする。
この場合、ピア1316の登録・検索実行手段817は、検索式Queryから対応する論理識別子範囲idRangesを算出し、論理識別子範囲[7,11]が得られる(ステップS1001)。次に、登録・検索実行手段817は、結果リストResultsを初期化して、他ピアからの結果を受け付けるプロセスを立ち上げ(ステップS1002)、タイマにタイムアウトを設定した後に(ステップS1003)、仮想ノードiを設定する(ステップS1004)。
仮想ノードiは任意の値でもよいが、好適には自身の論理識別子よりも大きくSuccessorの論理識別子以下の論理識別子であり、かつ、その下位ビットに宛先の論理識別子の先頭ビットをより長く含める。この場合、論理識別子1110と論理識別子1111が前者の条件を満たすため、この中で、可能な限り長く、宛先の論理識別子の先頭ビットを下位ビットに持つように左ビットシフト範囲分割を行ってよい。
図10に示す論路識別子範囲1401は、左ビットシフト範囲分割(図3に示した処理)により、[8,11]である論理識別子範囲1402と[7,7]である論理識別子範囲1403に分割される。前者の論理識別子範囲[8,11]のシフト前先頭ビットは1であり、後者の論理識別子範囲[7,7]のシフト前先頭ビットは0である。さらにピア1316にて左ビットシフト範囲分割をすることも可能であるが、後者の論理識別子範囲[7,7]をさらに左ビットシフト範囲分割すると、上記条件である論理識別子1110と論理識別子1111の下位から2ビット目に0(シフト前先頭ビット)であるものは存在しないので、さらなる左ビットシフト範囲分割は行わない。一方、前者の論理識別子範囲[8,11]はさらにピア1316にて左ビットシフト分割を行うことが可能である。
図10に示す論理識別子範囲1402(論理識別子範囲[8,11])に対して左ビットシフト範囲分割を行うと、先頭ビットとして0が得られ、論理識別子範囲1404(論理識別子範囲[8,11])が得られる。ここで、さらなる左ビットシフト範囲分割は不可能であるため、これ以上の分割は行わない。
以上から、ピア1316におけるステップS1005では、論理識別子範囲[8,11]を仮想ノード「1110」で探し(図9の1321)、さらに論理識別子範囲[7,7]を仮想ノード「1110」で探す(図9の1322)。
ピア1316において、登録・検索実行手段817は、メッセージ転送手段813を呼び出して、論理識別子範囲[8,11]を仮想ノード「1110」で探す(ステップS1005)。これにより、メッセージ転送手段813によって図8に示した処理が実行される。
ピア1316のメッセージ転送手段813は、まず、論理識別子範囲[8,11]をピア1316のSuccessorであるピア1317の論理識別子15(「1111」)とともに範囲分割手段815に渡す。範囲分割手段815は、ピア1316のSuccessorであるピア1317の論理識別子15を境界値として、論理識別子範囲[8,11]の分割を行うが(ステップS901)、この論理識別子範囲[8,11]に論理識別子「15」は含まれないため、ここでは論理識別子範囲LowRangesにNullを入力し、論理識別子範囲HighRangesに[8,11]を入力する。そのため、ステップS902の判定結果がYesとなり、ステップS904の判定結果がNoとなる。そして、メッセージ転送手段813は、仮想ノード「1110」が(1101,1111]の範囲に含まれるか否かの判定を行う(ステップS905)。
仮想ノード「1110」は(1101,1111]の範囲に含まれるので(ステップS905のYes)、メッセージ転送手段813は、左ビットシフト範囲分割手段816に対して、当該論理識別子範囲[8,11]を左ビットシフトして、2つの論理識別子範囲Range0とRange1に分割する処理を実行させる(ステップS906)。この結果、Range0には論理識別子範囲[8,9](図10の1407)が格納され、Range1には論理識別子範囲[10,11](図10の1406)が格納される。
そして、メッセージ転送手段813は、論理識別子範囲Range0はNullであるか否か判定する(ステップS907)。このとき、論理識別子範囲Range0([8,9])はNullでないので(ステップS907のNo)、メッセージ転送手段813は、ピア1316のdノード(Predecessor)であるピア1315のメッセージ転送手段813を、論理識別子範囲[8,9]、仮想ノード「1100」で呼び出す(ステップS908)。これは、図9の1323に対応する。これにより、ピア1315において、論理識別子範囲[8,9]を仮想ノード「1100」で探す処理(図8に示す処理)が実行される。
また、メッセージ転送手段813は、論理識別子範囲Range1はNullであるか否か判定する(ステップS909)。このとき、論理識別子範囲Range1([10,11])はNullでないので(ステップS909のNo)、メッセージ転送手段813は、ピア1316のdノード(Predecessor)であるピア1315のメッセージ転送手段813を、論理識別子範囲[10,11]、仮想ノード「1101」で呼び出す(ステップS910)。これは、図9の1324に対応する。これにより、ピア1315において、論理識別子範囲[10,11]を仮想ノード「1101」で探す処理(図8に示す処理)が実行される。
また、ピア1316において、論理識別子範囲[7,7]を仮想ノード「1110」で探す場合も同様に、登録・検索実行手段817は、メッセージ転送手段813を呼び出して、図8に示した処理を実行させる(ステップS1005)。
ピア1316のメッセージ転送手段813は、まず、論理識別子範囲[7,7]をピア1316のSuccessorであるピア1317の論理識別子15(「1111」)とともに範囲分割手段815に渡す。範囲分割手段815は、ピア1316のSuccessorであるピア1317の論理識別子15を境界値として、論理識別子範囲[7,7]の分割を行うが(ステップS901)、この論理識別子範囲[7,7]に論理識別子「15」は含まれないため、ここでは論理識別子範囲LowRangesにNullを入力し、論理識別子範囲HighRangesに[7,7]を入力する。そのため、ステップS902の判定結果がYesとなり、ステップS904の判定結果がNoとなる。そして、メッセージ転送手段813は、仮想ノード「1110」が(1101,1111]の範囲に含まれるか否かの判定を行う(ステップS905)。
仮想ノード「1110」は(1101,1111]の範囲に含まれるので(ステップS905のYes)、メッセージ転送手段813は、左ビットシフト範囲分割手段816に対して、当該論理識別子範囲[7,7]を左ビットシフトして、2つの論理識別子範囲Range0とRange1に分割する処理を実行させる(ステップS906)。ここでは、分割されずに左ビットシフトのみ行われ(図3のステップS602,S606,S607参照)、Range0にNullが格納され、Range1に論理識別子範囲[7,7](図10の1405)が格納される。
そして、メッセージ転送手段813は、論理識別子範囲Range0はNullであるか否か判定する(ステップS907)。このとき、論理識別子範囲Range0はNullであるので(ステップS907のYes)、ステップS908の処理を実行せずに、メッセージ転送手段813は、論理識別子範囲Range1はNullであるか否か判定する(ステップS909)。このとき、論理識別子範囲Range1([7,7])はNullでないので(ステップS909のNo)、メッセージ転送手段813は、ピア1316のdノード(Predecessor)であるピア1315のメッセージ転送手段813を、論理識別子範囲[7,7]、仮想ノード「1101」で呼び出す(ステップS910)。これは、図9の1325に対応する。これにより、ピア1315において、論理識別子範囲[7,7]を仮想ノード「1101」で探す処理(図8に示す処理)が実行される。
ピア1315において、論理識別子範囲[8,9](図10の1407)を仮想ノード「1100」で探す処理、論理識別子範囲[10,11](図10の1406)を仮想ノード「1101」で探す処理、および論理識別子範囲[7,7](図10の1405)を仮想ノード「1101」で探す処理が行われる。
これらの処理のいずれにおいても、まず、ピア1315の範囲分割手段815が、ピア1315のSuccessorの論理識別子13(「1101」)を境界値として分割する(ステップS901)。ここでは、論理識別子範囲[10,11]だけが、論理識別子範囲[10,10](図10の1410)と論理識別子範囲[11,11](図10の1409)に分割される。そして、ステップS903において、ピア1315のメッセージ転送手段813がSuccessorであるピア1316にこの範囲[11,11]のデータをローカルデータ格納部811から取得するように要求する。
この分割で残った論理識別子範囲[7,7](図10の1405)、論理識別子範囲[8,9](図10の1407)、論理識別子範囲[10,10](図10の1410)は、それぞれ、左ビットシフト範囲分割手段816によって左ビット範囲分割が行われる。
すなわち、論理識別子範囲[7,7](図10の1405)は論理識別子範囲[7,7](図10の1408)に変換され、論理識別子範囲[8,9](図10の1407)は論理識別子範囲[8,8](図10の1412)と論理識別子範囲[9,9](図10の1411)に分割され、論理識別子範囲[10,10](図10の1410)は論理識別子範囲[10,10](図10の1413)に変換される。
これらの論理識別子範囲は、ステップS908あるいはステップS910において、ピア1315のdノード(predecessor)であるピア1312に転送される。すなわち、仮想ノード「1011」での論理識別子範囲[7,7]の検索を要求するメッセージがピア1312に転送され(図9の1329)、仮想ノード「1000」での論理識別子範囲[8,8]の検索を要求するメッセージがピア1312に転送され、仮想ノード「1001」での論理識別子範囲[9,9]の検索を要求するメッセージがピア1312に転送され、仮想ノード「1010」での論理識別子範囲「10,10]の検索を要求するメッセージがピア1312に転送される。
ピア1312では、いずれの範囲もピア1312の論理識別子3(2進数表示で「0011」)とそのSuccessorの論理識別子6(2進数表示で「0110」)には含まれず、同様に、仮想ノードも含まれないため(ステップS905のNo)、ステップS911にて、全てSuccessorであるピア1313に転送される(図9の1330〜1333)。
ピア1313では、当該ピア1313の論理識別子6(2進数表示で「0110」)と、このピア1313のSuccessorであるピア1314の論理識別子9(2進数表示で「1001」)との間に、論理識別子範囲[7,7](図10の1333)、論理識別子範囲[8,8](図10の1332)、論理識別子範囲[9,9](図10の1331)が含まれるため、ピア1313はピア1314に対してこれらの範囲をローカルデータ格納部811から探して、検索実行者であるピア1316に返すように指示する(ステップS903)。残った範囲である[10,10](図10の1330)については、その仮想ノードがSuccessorとの間に存在しないため、ステップS911にてピア1313はSuccessoであるピア1314に論理識別子範囲[10,10]を転送する(図9の1334)。
ピア1314では、当該ピア1314の論理識別子9(2進数表示で「1001」)と、このピア1314のSuccessorであるピア1315の論理識別子10(2進数表示で「1010」)との間に、論理識別子範囲[10,10](図10の1334)が含まれるため、ピア1314はピア1315に対してこの範囲[10,10]をローカルデータ格納部811から探して、検索実行者であるピア1316に返すように指示する(ステップS903)。
以上により、全ての論理識別子範囲idRanges([7,11])の検索結果がピア1316に返される(ステップS1006)。そして、ピア1316の登録・検索実行手段817は、他ピアから送信された検索結果が格納されている結果リストResultsを検索要求者に対して提供する(ステップS1008)。
以上に説明したように、この実施の形態2では、検索式に合致する集合を論理識別子空間における範囲に変換し、この論理識別子範囲に属する論理識別子を担うピアに、検索メッセージが行き渡るように、論理識別子範囲とともに検索メッセージを分割する。このとき、論理識別子範囲に対する左ビットシフトを実行し、先頭ビットの違いによって、論理識別子範囲を分割する。このような手法を用いることで、de Bruijnグラフ上での範囲検索と同様に、定数次数と対数ホップ数を実現しつつオーバレイネットワーク上での範囲検索を実現することができる。
実施の形態3.
上記の実施の形態2は、de Bruijin上の論理識別子(ID)をChordハッシュ空間上の仮想IDとし、論理識別子範囲の先頭ビットの違いにより、新たな仮想IDを生成しつつ論理識別子範囲を分割していた。しかし、この場合、大きなハッシュ空間(ID空間)を用いる場合には、ビット数が多くなり、管理する仮想IDの数も多くなる。そこで、この実施の形態3では、複数の仮想IDを集合として、すなわち仮想範囲(仮想論理識別子範囲)として管理することにより、ピアが扱うデータ量を削減する。
図11は、この実施の形態3におけるデータ検索システムの構成を示すブロック図である。図11に示すように、この実施の形態3におけるデータ検索システムは、、ネットワーク2000上でのアドレスを有する複数のピア2010,2020,2030から構成される。図11には、ネットワーク2000に接続されているピアはピア2010,2020,2030だけであるが、ほかにも複数のピアがネットワーク2000に接続されている。各ピアは、プログラム制御により動作するサーバなどのコンピュータ(中央処理装置;プロセッサ;データ処理装置)で構成されている(コンピュータのハードウェア構成は図1に示した構成と同様である)。なお、この実施の形態において、ピアとノードとは同義としている。
図11に示すように、ピア2010は、ピア論理識別子格納部2018、ローカルデータ格納部2011、ルーティングテーブル2012、メッセージ転送手段2013、通信手段2014、検索範囲左ビットシフト手段2015、範囲分割手段A2016、範囲分割手段B2017、登録・検索実行手段2019を備えている。なお、ピア2010以外のピア2020,2030も、ピア2010と同一の構成を備えている。
ピア2010を構成する格納部(ローカルデータ格納部2011、ルーティングテーブル2012、ピア論理識別子格納部2018)は、上記の実施の形態2と同じ構成であるため、説明を省略する。
また、ピア2010を構成する通信手段2014、および登録・検索実行手段2019も、上記の実施の形態2と同じ構成であるため、説明を省略する。
ピア2010を構成する検索範囲左ビットシフト手段2015、範囲分割手段A2016、および範囲分割手段B2017は、それぞれ概略つぎのように動作する。
これらの手段では、検索対象を検索範囲として定義する。検索範囲には、仮想範囲と、論理識別子範囲と、シフト回数とが含まれる(図166の1920参照)。このようにして、この実施の形態3では、実施の形態2において個別に扱っていた仮想ノードを集合として扱い、扱うデータ量を削減する。
検索範囲左ビットシフト手段2015は、シフト回数を増加させ、仮想範囲の上限値および下限値を更新する処理を実行する。仮想範囲の上限値は、仮想範囲の上限値を左ビットシフトし、下位ビットに論理識別子範囲の上限値あるいは下限値の先頭ビットを取り出して割り当てる。なお、検索範囲左ビットシフト手段2015が実行する処理の詳細については図15を参照して後述する。
範囲分割手段A2016は、検索範囲内の仮想範囲を、与えられた範囲に属する否かで分割する。その際、検索範囲内の論理識別子範囲についても分割する。なお、範囲分割手段A2016が実行する処理の詳細については図14を参照して後述する。
範囲分割手段B2017は、検索範囲内の論理識別子範囲を、与えられた範囲に属する否かで分割する。その際、検索範囲内の仮想識別子範囲についても分割する。なお、範囲分割手段B2017が実行する処理の詳細については図13を参照して後述する。
次に、この実施の形態3におけるデータ検索システムの動作について説明する。
この実施の形態3のデータ検索システムの全体動作は、上記の実施の形態2のデータ検索システムの全体動作(図7)と略同様である。ただし、この実施の形態3では、ピアmにて論理識別子範囲を探す(検索する)方式が異なる。すなわち、この実施の形態3では、図7のステップS1004における「ピアmにて論理識別子範囲idRangesを仮想ノードiで探す」処理の代わりに、図12に示す「ピアmにて検索範囲集合qRangesを探す」処理が行われる。なお、この実施の形態3では、図7における仮想ノードの初期化(図7のステップS1003)の代わりに「検索範囲(仮想範囲と論理識別子範囲を含む)の初期化」が行われる。
図12は、この実施の形態3のデータ検索手順を示すフローチャートである。ピアmにおいて、メッセージ転送手段2013は、登録・検索実行手段2019からの検索範囲集合qRangesを探す要求を受けると、発見検索範囲集合foundRanges、未発見検索範囲集合NotFoundRanges、ピアd転送検索範囲集合dRanges、ピアs転送検索範囲集合sRangesを初期化する(ステップS1601)。
そして、メッセージ転送手段2013は、検索範囲集合qRanges内の各検索範囲qRangeを、ピアmとピアs(Successor)の論理識別子の範囲(m,s]とともに範囲分割手段B2017に渡し、各検索範囲qRangeに対して、ステップS1603の処理を繰り返し実行させる(ステップS1602)。
範囲分割手段B2017は、検索範囲qRangeを、ピアmとピアsの論理識別子の範囲(m,s]で、論理識別子範囲をもとに範囲内検索範囲inRangeと範囲外検索範囲outRangeに分割する(ステップ1603)。そして、範囲分割手段B2017は、範囲内検索範囲inRangeと範囲外検索範囲outRangeをメッセージ転送手段2013に返す。
メッセージ転送手段2013は、範囲分割手段B2017から各検索範囲qRangeに対する各範囲内検索範囲inRangeを順次取得し、範囲分割手段B2017から各検索範囲qRangeに対する各範囲外検索範囲outRangeを順次取得する。各々の範囲内検索範囲inRangeの集合が範囲内検索範囲集合inRangeSetであり、各々の範囲外検索範囲outRangeの集合が範囲外検索範囲集合outRangesである。
メッセージ転送手段2013は、検索範囲集合qRanges内の検索範囲qRangeに対して得られた範囲内検索範囲集合inRangeSetと範囲外検索範囲集合outRangesを、それぞれ、発見検索範囲集合foundRangesと未発見検索範囲集合NotFoundRangesに追加(格納)する(ステップS1604)。
次いで、メッセージ転送手段2013は、未発見検索範囲集合NotFoundRanges内の未発見検索範囲NotFoundRangeを、ピアmとピアsの論理識別子の範囲(m、s]とともに範囲分割手段A2016に渡し、各未発見検索範囲NotFoudRangeに対して、ステップS1606の処理を繰り返し実行させる(ステップS1605)。
範囲分割手段A2016は、未発見検索範囲NotFoudRangeを、ピアmとピアsの論理識別子の範囲(m,s]で、仮想範囲をもとに範囲内検索範囲inRangeと範囲外検索範囲outRangeに分割する(ステップS1606)。そして、範囲分割手段A2016は、範囲内検索範囲inRangeと範囲外検索範囲outRangeをメッセージ転送手段2013に返す。
メッセージ転送手段2013は、範囲分割手段A2016から各未発見検索範囲NotFoundRangeに対する各範囲内検索範囲inRangeを順次取得し、範囲分割手段A2016から各未発見検索範囲NotFoundRangeに対する各範囲外検索範囲outRangeを順次取得する。各々の範囲内検索範囲inRangeの集合が範囲内検索範囲集合inRangesであり、各々の範囲外検索範囲outRangeの集合が範囲外検索範囲集合outRangesである。
次いで、メッセージ転送手段2013は、範囲内検索範囲集合inRanges内の要素inRangeを検索範囲左ビットシフト手段2015に順次渡し、ステップS1608の処理を繰り返し実行させる(ステップS1607)。
検索範囲左ビットシフト手段2015は、範囲内検索範囲inRangeに対して、左ビットシフトの処理を実行する(ステップS1608)。そして、左ビットシフト後の範囲内検索範囲をメッセージ転送手段2013に返す。
メッセージ転送手段2013は、範囲内検索範囲集合inRangesと範囲外検索範囲集合outRangesを、それぞれ、ピアd転送検索範囲集合dRangesとピアs転送検索範囲集合sRangesに追加(格納)する(ステップS1609)。
次いで、メッセージ転送手段2013は、発見検索範囲集合foundRangesの要素数が0でなければ(ステップS1610のN)、ピアsにてローカルデータから範囲foundRangesを探させる(ステップS1611)。
また、メッセージ転送手段2013は、ピアd転送検索範囲集合dRangesの要素数が0でなければ(ステップS1612のN)、ピアdにてdRangesを探させる(ステップS1613)。同様に、ピアs転送検索範囲集合sRangesの要素数が0でなければ(ステップS1614のN)、ピアsにてsRangesを探させる(ステップS1615)。そして、処理を終了する。
次に、範囲分割手段B2017が実行する処理(ステップS1603)について説明する。図13は、この実施の形態3の範囲分割手段Aが実行する処理を示すフローチャートである。なお、検索範囲qRangeは、仮想検索範囲iRangeと論理識別子範囲kRangeとシフト回数cとから構成されている。
範囲分割手段B2017は、まず、検索範囲qRange中で、範囲Range(自身の論理識別子とSuccessorの論理識別子の間の範囲)に含まれる範囲を範囲内仮想範囲集合inKeyRangesに格納し、含まれない範囲を範囲外仮想範囲集合outKeyRangesに格納する(ステップS1801)。そして、範囲分割手段B2017は、範囲内検索範囲集合inQrangesと範囲外検索範囲集合outQRangesを初期化する(ステップS1802)。
次いで、範囲分割手段B2017は、範囲内仮想範囲集合inKeyRangesと範囲外仮想範囲集合outKeyRanges内の各仮想範囲eachKeyRangeに対して、ステップS1804〜S1809の処理を繰り返し実行する(ステップS1803)。
範囲分割手段B2017は、仮想範囲eachKeyRangeの上限値の先頭から(全ビット長−シフト回数c)ビットを上位に、論理識別子範囲kRangeの上限値を(全ビット長−シフト回数c)回右ビットシフトしたビット列を下位に持つビット列を新たな仮想論理識別子範囲の上限値(最大仮想論理識別子)NewImgRangeMaxとする(ステップS1604)。
また、範囲分割手段B2017は、仮想範囲eachKeyRangeの下限値の先頭から(全ビット長−シフト回数c)ビットを上位に、論理識別子範囲kRangeの上限値を(全ビット長−シフト回数c)回右ビットシフトしたビット列を下位に持つビット列を新たな仮想論理識別子範囲の下限値(最小仮想論理識別子)NewImgRangeMinとする(ステップS1605)。
そして、範囲分割手段B2017は、最大仮想論理識別子NewImgRangeMaxと最小仮想論理識別子NewImgRangeMinから、新たな仮想論理識別子範囲NewImgRangeを作成し、これと仮想範囲eachKeyRangeとシフト回数cから、新たな検索範囲NewQRangeを作成する(ステップS1806)。
次いで、範囲分割手段B2017は、仮想範囲eachKeyRangeが範囲内仮想範囲集合inKeyRangesに属するかどうかを判定する(ステップS1807)。仮想範囲eachKeyRangeが範囲内仮想範囲集合inKeyRangesに属すると判定した場合は(ステップS1807のY)、範囲内検索範囲集合inQRangesに新たな検索範囲NewQRangeを登録する(ステップS1808)。一方、仮想範囲eachKeyRangeが範囲内仮想範囲集合inKeyRangesに属さないと判定した場合は(ステップS1807のN)、範囲外検索範囲集合outKeyRangesに新たな検索範囲NewQRangeを登録する(ステップS1809)。
そして、範囲分割手段B2017は、範囲内検索範囲集合inQRangesと範囲外検索範囲集合outQRangesをメッセージ転送手段2013に返す(ステップS1810)。範囲内検索範囲集合inQRangesがメッセージ転送手段2013によって範囲内検索範囲集合inRangeSetとして取得され、範囲外検索範囲集合outQRangesがメッセージ転送手段2013によって範囲外検索範囲集合outRangesとして取得される。
次に、範囲分割手段A2016が実行する処理(ステップS1606)について説明する。図14は、この実施の形態3の範囲分割手段Bが実行する処理を示すフローチャートである。なお、検索範囲qRangeは、仮想検索範囲iRangeと論理識別子範囲kRangeとシフト回数cとから構成されている。
範囲分割手段A2016は、まず、検索範囲qRange中で、範囲Range(自身の論理識別子とSuccessorの論理識別子の間の範囲)に含まれる範囲を範囲内仮想範囲集合inImgRangesに格納し、含まれない範囲を範囲外仮想範囲集合outImgRangesに格納する(ステップS1701)。そして、範囲分割手段A2016は、範囲内検索範囲集合inQrangesと範囲外検索範囲集合outQRangesを初期化する(ステップS1702)。
次いで、範囲分割手段A2016は、範囲内仮想範囲集合inImgRangesと範囲外仮想範囲集合outImgRanges内の各仮想範囲eachImgRangeに対して、ステップS1704〜S1709の処理を繰り返し実行する(ステップS1703)。
範囲分割手段A2016は、仮想範囲eachImgRangeの上限値を(全ビット長−シフト回数c)回左ビットシフトし、下位の(全ビット長−シフト回数c)ビットに1を並べたビット列と、論理識別子範囲kRangeの上限値を比較し、小さい方を新たな論理識別子範囲の上限値(最大論理識別子)NewRangeMaxとする(ステップS1704)。
また、範囲分割手段A2016は、仮想範囲eachImgRangeの下限値を(全ビット長−シフト回数c)回左ビットシフトし、下位の(全ビット長−シフト回数c)ビットに0を並べたビット列と、論理識別子範囲kRangeの下限値を比較し、大きい方を新たな論理識別子範囲の下限値(最小論理識別子)NewRangeMinとする(ステップS1705)。
そして、範囲分割手段A2016は、最大論理識別子NewRangeMaxと最小論理識別子NewRangeMinから、新たな論理識別子範囲NewRangeを作成し、これと仮想範囲eachImgRangeとシフト回数cから、新たな検索範囲NewQRangeを作成する(ステップS1706)。
次いで、範囲分割手段A2016は、仮想範囲eachImgRangeが範囲内仮想範囲集合inImgRangesに属するかどうかを判定する(ステップS1707)。仮想範囲eachImgRangeが範囲内仮想範囲集合inImgRangesに属すると判定した場合は(ステップS1707のY)、範囲内検索範囲集合inQRangesに新たな検索範囲NewQRangeを登録する(ステップS1708)。一方、仮想範囲eachImgRangeが範囲内仮想範囲集合inImgRangesに属さないと判定した場合は(ステップS1707のN)、範囲外検索範囲集合outQRangesに新たな検索範囲NewQRangeを登録する(ステップS1709)。
そして、範囲分割手段A2016は、範囲内検索範囲集合inQRangesと範囲外検索範囲集合outQRangesをメッセージ転送手段2013に返す(ステップS1710)。範囲内検索範囲集合inQRangesがメッセージ転送手段2013によって範囲内検索範囲集合inRangesとして取得され、範囲外検索範囲集合outQRangesがメッセージ転送手段2013によって範囲外検索範囲集合outRangesとして取得される。
次に、検索範囲左ビットシフト手段2015が実行する処理(ステップS1608)について説明する。図15は、この実施の形態3の検索範囲左ビットシフト手段が実行する処理を示すフローチャートである。なお、検索範囲qRangeは、仮想検索範囲iRangeと論理識別子範囲kRangeとシフト回数cとから構成されている。
まず、検索範囲左ビットシフト手段2015は、シフト回数cを増やす(ステップS2101)。次いで、検索範囲左ビットシフト手段2015は、仮想範囲iRangeの上限値iMax(最大仮想論理識別子)に、それを左ビットシフトし下位ビットに、論理識別子範囲kRangeの上限値kMax(最大論理識別子)の先頭からcビット目を加えたビット列を与える(ステップS2102)。次に、検索範囲左ビットシフト手段2015は、仮想範囲iRangeの上限値iMax(最大仮想論理識別子)に、それを左ビットシフトし下位ビットに、論理識別子範囲kRangeの上限値kMax(最大論理識別子)の先頭からcビット目を加えたビット列を与える(ステップS2103)。そして、処理後の値をメッセージ転送手段2013に返す。
次に、この実施の形態3におけるデータ検索システムの動作の具体例(データ検索処理の手順の具体例)について、図16を用いて説明する。
図16は、この実施の形態3におけるピア間でのメッセージの流れの具体例を示す説明図である。
図16において、オーバレイネットワーク上に参加している複数のピアを示す。論理識別子13であるピア1916が、検索式Queryとして{7≦温度≦11}を実行するものとし、温度という属性は論理識別子範囲と対応するものとする。この例は、図9に示した例と同様である。
この場合、ピア1916の登録・検索実行手段2019は、検索式Queryから対応する論理識別子範囲idRangesを算出し、論理識別子範囲[7,11]が得られる。次に、登録・検索実行手段2019は、結果リストResultsを初期化して、他ピアからの結果を受け付けるプロセスを立ち上げ、タイマにタイムアウトを設定する(ステップS1001〜S1003参照)。その後に、検索範囲集合qRanges(図16の1920)を初期化する。
検索範囲集合の初期化は、検索式から導かれる論理識別子範囲集合idRanges内の論理識別子範囲idRangeを、検索範囲の論理識別子範囲(図16の1920の右欄)に設定し、シフト回数c(図16の1920の左欄)を0とすれば、仮想論理識別子範囲(図16の1920の中欄)は任意の値でもよいが、好適には、仮想論理識別子範囲は、自身の論理識別子(図16に示す例では13)よりも大きくSuccessorの論理識別子(図16に示す例では15)以下の範囲に属し、かつその上限値である仮想範囲上限値の下位ビットにidRangeの上限値の先頭ビットを多く持ち、下限値である仮想範囲下限値の下位ビットにidRangeの下限値の先頭ビットを多く持たせる。ここでは、ピア1916がシフト回数2、仮想範囲[14,14]、論理識別子範囲[8,11]である検索範囲1921と、シフト回数1、仮想範囲[14,14]、論理識別子範囲[7,7]である検索範囲1922の2つの検索範囲に初期化される。
図16において、ピア1916は、ピア1916の論理識別子15より大きくサクセサ(ピアs)の論理識別子15以下の範囲(13,15]を用いて、検索範囲1921と検索範囲1922をそれぞれ論理識別子範囲(検索範囲1921,1922の右欄)をもとに範囲分割する(ステップS1603)。それぞれその論理識別子範囲は(13,15]に含まれないため、未発見検索範囲集合に格納される(ステップS1604)。
次に、ピア1916は、この未発見検索範囲集合に含まれる検索範囲1921と検索範囲1922のそれぞれについて、ピア1916の論理識別子15より大きくサクセサ(ピアs)の論理識別子15以下の範囲(13,15]を用いて、仮想範囲を元に範囲分割を行う(ステップS1606)。それぞれの仮想範囲はいずれも[14,14]であり、この範囲に含まれるため、範囲内検索範囲集合に格納される。ピア1916は、この集合内の検索範囲に対して、左ビットシフトを行うことで(ステップS1608)、図16に示す検索範囲1923、検索範囲1924を得る。そして、これらはdノード転送検索範囲集合に格納される(ステップS1609)。発見検索範囲集合とsノード転送検索範囲集合の要素数は0であるが(ステップS1610のY、ステップS1614のY)、dノード検索範囲集合には、検索範囲1923、検索範囲1924が格納されているため(ステップS1612のN)、ピア1916は、これをdノードであるピア1915に転送し、ピア1915で検索範囲1923、検索範囲1924を含む検索範囲集合を探させる(ステップS1613)。
次に、ピア1915は、検索範囲1923、検索範囲1924を含む検索範囲集合を探すピア1915は、ピア1915の論理識別子10より大きくサクセサ(ピアs)の論理識別子13以下の範囲(10,13]で、論理識別子範囲をもとに範囲分割を行う(ステップS1603)。検索範囲1923の論理識別子範囲は[8,11]であるため、範囲内検索範囲集合としてその論識別子範囲に[11,11]を含む検索範囲1925が格納され、範囲外検索範囲集合としてその論理識別子範囲に[8,10]を含む検索範囲1926と論理識別子範囲が[7,7]である検索範囲1924が格納される。検索範囲1925は発見検索範囲集合に格納され、検索範囲1926および検索範囲1924は未発見検索範囲集合に格納される(ステップS1604)。
そして、ピア1915は、この未発見検索範囲集合に属する検索範囲1926および検索範囲1924のそれぞれは、ピア1915の論理識別子10より大きくサクセサ(ピアs)の論理識別子13以下の範囲(10,13]を用いて、仮想範囲をもとに範囲分割される(ステップS1606)。それぞれの仮想範囲が[12,13]と[13,13]であることから、これらは範囲内検索範囲集合に格納され、左ビットシフトされて、検索範囲1926、1927となる(ステップS1608)。ピア1915は、そのサクセサ(sノード)であるピア1916に対して、発見検索範囲集合に格納された検索範囲1925をローカル検索するように指示する(ステップS1611)。また、dノードであるピア1912に対して、検索範囲1926と検索範囲1927を転送する(ステップS1613)。
次に、検索範囲1926と検索範囲1927を受け付けたピア1912は、ピア1912の論理識別子3より大きくサクセサ(ピアs)の論理識別子6以下の範囲(3,6]で、論理識別子範囲をもとに範囲分割を行う(ステップS1603)。検索範囲1926と検索範囲1927の論理識別子範囲はそれぞれ[8,11]と[11,11]であるため、いずれも範囲外検索範囲集合に格納される。また、同範囲で仮想範囲に基づく範囲分割が実行されるが(ステップS1606)、ここでもその仮想範囲が[8,10]と[7,7]であるため、sノード転送検索範囲集合に格納され(ステップS1609)、sノードであるピア1913に転送される(ステップS1615)。
次に、検索範囲1928と検索範囲1927を受け付けたピア1913は、ピア1913の論理識別子6より大きくサクセサ(ピアs)の論理識別子9以下の範囲(6,9]で、論理識別子範囲をもとに範囲分割を行う(ステップS1603)。検索範囲1928の論理識別子範囲は[8,10]であるため、その論理識別子範囲が[10,10]である検索範囲1930と、その論理識別子範囲が[8,9]である検索範囲1931に分割され、検索範囲1930は範囲外検索範囲集合に格納され、検索範囲1931は範囲内検索範囲集合に格納される。また、検索範囲1929の論理識別子範囲は[11,11]であるため、範囲内検索範囲集合に格納される。検索範囲1931と検索範囲1929は発見検索範囲集合に格納されるため(ステップS1604)、これらの範囲がピア1913のサクセサ(ピアs)であるピア1914でローカル検索される(ステップS1611)。また、検索範囲1931については、サクセサ(ピアs)であるピア1914に検索指示される(ステップS1615)。
次に、検索範囲1930を受け付けたピア1914は、ピア1914の論理識別子9より大きくサクセサ(ピアs)の論理識別子10以下の範囲(9,10]で、論理識別子範囲をもとに範囲分割を行う(ステップS1603)。検索範囲1930は(9,10]に含まれるため、発見検索範囲集合に格納され(ステップS1604)、サクセサであるピア1915でローカル検索される(ステップS1611)。
以上に説明したように、この実施の形態3では、検索式に合致する集合を論理識別子空間における範囲に変換し、この論理識別子範囲に属する論理識別子を担うピアに、検索メッセージが行き渡るように、論理識別子範囲とともに検索メッセージを分割する。このとき、検索対象の論理識別子範囲に対する左ビットシフトの実行、あるいはシフト回数の増加を行い、それと同時に仮想範囲の上限値および下限値を左ビットシフトさせつつ下位ビットに論理識別子範囲の上限値および下限値のシフト回数ビット目のビットを割り当てる。このような手法を用いることで、de Bruijnグラフ上での範囲検索と同様に、定数次数と対数ホップ数を実現しつつオーバレイネットワーク上での範囲検索を実現することができる。さらに、複数の仮想ID(仮想ノード)を集合(仮想論理識別子範囲)として管理することにより、範囲検索を実行する際のオーバレイネットワーク上の各ピアが扱うデータ量を削減することができる。
上記の実施の形態2,3において、ピアは、例えばサーバやパーソナルコンピュータなどの計算機(端末)で実現されている。また、各ピアにおいて、CPUなどの制御部がハードディスクなどの記憶手段に記憶されているプログラム(データ検索用プログラム)に従って実施の形態2,3で説明した処理を実行することにより各構成部(手段)が実現される。また、各ピアにおいて、格納部、テーブルなどはハードディスクなどの記憶手段で実現される。
また、上記の実施の形態2,3において、各ピア(各ノード)にデータ(例えば図6、図11に示すローカルデータ格納部811に格納されるデータ)を格納する処理については、Koordeのアルゴリズムに従って行われるものとする。