以下に添付図面を参照しながら、本発明の実施形態について説明する。なお、本明細書及び図面において実質的に同一の機能を有する要素については、同一の符号を付することにより重複説明を省略する場合がある。
<1.第1実施形態>
図1を参照しながら、第1実施形態について説明する。第1実施形態は、DHTなどを利用して自律分散KVSを実現するシステムにおいてノードの離脱による情報の消失を防止する技術に関する。また、第1実施形態は、頻繁にシステムへの参加・離脱を繰り返す可能性のあるノードが存在する場合でも、ノードの離脱時に生じるノード間の通信負荷やノードの処理負荷を低減する仕組みに関する。
なお、図1は、第1実施形態に係る情報管理装置の一例を示した図である。図1に示した情報管理装置10は、第1実施形態に係る情報管理装置の一例である。また、情報管理装置10は、ノードの参加や離脱を管理する役割が割り当てられているノード(初期ノード)の1つである。図1の例において、情報管理装置10は、ノードN01に対応する。
図1に示すように、情報管理装置10は、記憶部11及び制御部12を有する。
なお、記憶部11は、RAM(Random Access Memory)などの揮発性記憶装置、或いは、HDD(Hard Disk Drive)やフラッシュメモリなどの不揮発性記憶装置である。制御部12は、CPU(Central Processing Unit)やDSP(Digital Signal Processor)などのプロセッサである。但し、制御部12は、ASIC(Application Specific Integrated Circuit)やFPGA(Field Programmable Gate Array)などの電子回路であってもよい。制御部12は、例えば、記憶部11又は他のメモリに記憶されたプログラムを実行する。
情報管理装置10は、割り当てられたキーに対応する情報(値)を保持するノードを管理する。ノードは、例えば、携帯電話やスマートフォンなどの移動端末、カーナビゲーションシステムなどの車載端末、或いは、パーソナルコンピュータやサーバ装置などの情報処理装置である。また、ノードは、LAN(Local Area Network)やインターネットなどのネットワークを利用して他のノードと通信する機能を有する。
制御部12は、複数の識別番号(ID)が設定されているID空間の識別番号にノードを割り当て、ID空間へのノードの割り当てに基づいて個々のノードにキーを割り当てることで、識別番号を介して特定のキーを保持するノードを特定可能にする。なお、複数の識別番号にはそれぞれ1つのノードが割り当てられうる。また、1つのID空間に割り当てられているノードの集合は1つのシステムを形成する。
図1には、3つのID空間21、22、23が例示されている。ID空間21は、例えば、8つの黒点を有する1つのリングで表現される。黒点の近傍に記載されている数字は、その黒点の位置に対応する識別番号である。黒点を囲む円は、その黒点に対応する識別番号に割り当てられているノードを表す。図1の例では、ID空間21の識別番号「0」にノードN01が割り当てられている。
制御部12は、識別番号の設定が共通するID空間21、22、23を利用してノードを管理する。つまり、制御部12は、ID空間21、22、23に対応する複数のシステムを管理する。図1に示すように、ID空間22、23は8つの黒点を有する1つのリングで表現され、その黒点の位置にID空間21と同じ識別番号が設定される。
なお、図1には3つのID空間を利用する例を示しているが、利用するID空間の数は2又は4以上であってもよい。また、図1の例では、説明の都合上、個々のID空間について、DHTの1つであるChordのID空間と同じ表現を用いているが、採用するアルゴリズムの種類に応じて表現を変形することが可能である。つまり、ID空間の多重化を実現する第1実施形態の技術を適用可能な範囲でID空間の表現を変形してもよい。
記憶部11は、ID空間21、22、23に対応する複数のシステムについて、同じ識別番号に割り当てられているノードが保持する情報の同期状況を記憶する。
ID空間21、22、23の同じ識別番号に割り当てられているノードには、同じキーと値とが対応付けて格納される。また、1つのノードに対し、あるキーを指定して、そのキーに対応する値に対する操作(KVS操作)が要求された場合、指定されたキーを保持するノードでKVS操作が実行される。そして、KVS操作を実行したノードは、実行したKVS操作の履歴(操作履歴)を蓄積する。
また、第1実施形態では、あるノードでKVS操作が実行されると、そのノードと同じ識別番号に割り当てられている全てのノードに操作の内容が通知され、その通知を受けた各ノードが通知に応じてKVS操作を実行する。そして、KVS操作を実行したノードは、実行したKVS操作の履歴(操作履歴)を蓄積する。つまり、同じ識別番号に割り当てられているノードの間で操作履歴が同期される。そして、各ノードは、操作履歴の同期状況を保持する。例えば、各ノードは、操作履歴のうち同期の完了が確認できた操作の集合に対して同期状況を管理するためのバージョン番号を付与する。
図1の例において、ノードN01に対応する情報管理装置10の記憶部11は、操作履歴41として、キーK5に値V5を対応付けて格納する操作(put)と、キーK7に値V7を対応付けて格納する操作(put)とを記憶している。この状況でノードN01がID空間21に対応するシステムから離脱した場合、離脱している間、同じ識別番号に割り当てられているノードN02、N03がKVS操作を受け付けてもノードN01が保持する操作履歴は更新されない。
第1実施形態に係る自律分散KVSシステムでは、同じ識別番号に割り当てられている複数のノードのうち、一部のノードが離脱しても、残りのノードが所定数(例えば、2)以上あれば残りのノードが運用を継続する。そして、残りのノードが運用を継続している間に、離脱したノードが再参加した場合、再参加したノードを離脱前の識別番号に割り当てて運用が継続される。このような仕組みがあることで、頻繁にノードが参加・離脱する場合でも、特定のキーを保持するノードの探索に用いる情報(ルーティングテーブル)の更新などにかかる負荷を低減でき、システム性能の低下を効果的に抑制することができる。
但し、再参加するノードの離脱中に、同じ識別番号に割り当てられている他のノードがKVS操作を受け付けている場合、再参加時にKVS操作の同期が行われる。同期の方法としては、再参加するノードが、同じ識別番号に割り当てられている他のノードから操作履歴を取得する方法を採用することができる。
例えば、ノードN01の離脱中に、ノードN02がキーK5に対応する値V5の削除操作(del)を受け付けた場合、この削除操作がノードN02の操作履歴42に反映される。また、ノードN03がキーK7に対応する値V7の削除操作(del)を受け付けた場合、この削除操作がノードN03の操作履歴43に反映される。また、これらの削除操作の内容はノードN02、N03の間で同期され、操作履歴42、43に反映される。そして、ノードN02、N03の間で同期の確認が行われ、同期状況(バージョン番号Ver.002)が操作履歴42、43に付与される。
その後、ノードN01が離脱前と同じ識別番号「0」に再び割り当てられたとき、制御部12は、同じ識別番号「0」に割り当てられているノードN02、N03が保持する情報と、再び割り当てられたノードN01が保持する情報とを同期させる。このとき、制御部12は、同期状況の情報(Ver.001)をノードN02、N03に通知し、ノードN02、N03に操作履歴の差分を要求する。
ノードN02、N03は、それぞれ操作履歴42、43を参照し、通知された同期状況の情報(Ver.001)に基づいて、ノードN01が保持する操作履歴の操作より新しい操作を特定する。図1の例では、新しい同期状況の情報(Ver.002)が付与された操作(ノードN01の離脱時に実行された削除操作)が特定される。この場合、ノードN02は、自身が受け付けたキーK5に関する削除操作を差分としてノードN01に通知する。また、ノードN03は、自身が受け付けたキーK7に対する削除操作を差分としてノードN01に通知する。
未同期の情報として上記の通知を受けると、制御部12は、通知された操作の内容を記憶部11が記憶している操作履歴に追加させる。そして、制御部12は、操作履歴に追加した操作を自身が保持するキー及び値に反映させる。
上記のように、第1実施形態に係る情報管理方法は、所定の関数を適用して得られるキーと該キーに対応するデータのペアを複数のノードに分散して記憶するシステムを管理するコンピュータが次の処理を実行する仕組みと表現できる。
第1の処理は、複数のシステムに共通の識別子と、識別子に共通に割り当てられたキーと、識別子に割り当てられたノードの情報とを管理テーブル11aに記憶する処理である。第2の処理は、識別子への割り当てが解除されたノードが再び該識別子に割り当てられるとき、該ノードの割り当てを管理テーブル11aに反映すると共に、該ノードと該識別子に割り当てられている他のノードとの間でペアを同期させる処理である。
これまで説明してきたように、第1実施形態の自律分散KVSシステムは、同じノードの割り当てを有する複数のシステムを含み、同じ識別番号に割り当てられているノードには同じキーが割り当てられる。また、各システムのID空間に設定されている識別番号の系列が同じであるため、指定されたキーに対応する情報の操作が識別番号を介して各システムのノードに反映される。そのため、キーと値のペア、及びノードの関係がシステム間で容易に同期されうる。
その結果、複製されたシステムが存在するのと同じ状態になり、一部のシステムにあるノードが離脱しても、他のシステムにあるノードが情報を保持しているため、ノードの離脱による情報の消失を防止することができる。また、第1実施形態の技術を適用すれば、同じID空間に割り当てられている複数のノードに対し、バックアップ用に同じ情報を保持させなくても情報の消失を防止できる。そのため、ノードの参加や離脱の際にバックアップ用の情報をノード間でやり取りする負担やルーティングテーブルの更新にかかる負担などを回避することができる。
結果として、頻繁に参加と離脱を繰り返すノードが存在しても、参加と離脱時に生じる通信負荷や処理負荷の増大が抑制される。また、第1実施形態では、一時的に離脱したノードが離脱前と同じ識別番号に割り当てて運用を継続することを許容しているため、このような通信負荷や処理負荷の抑制を効果的に実現できる。さらに、各ノードが操作履歴の同期状況を保持しているため、再参加したノードが同じ識別番号に割り当てられている他のノードから操作履歴を受け取る際に、操作履歴の差分を特定することが容易になる。つまり、ノード間で操作履歴の差分をやり取りすれば済むため、通信負荷や処理負荷を抑制することができる。
以上、第1実施形態について説明した。
<2.第2実施形態>
次に、第2実施形態について説明する。第2実施形態は、DHTなどを利用して自律分散KVSを実現するシステム(自律分散KVSシステム)においてノードの離脱による情報の消失を防止する技術に関する。また、第2実施形態は、頻繁にシステムへの参加・離脱を繰り返す可能性のあるノードが存在する場合でも、ノードの離脱時に生じるノード間の通信負荷やノードの処理負荷を低減する仕組みに関する。
[2−1.自律分散KVSシステムの例]
自律分散KVSシステムでは、指定されたキーに対する値を保持しているノードを特定できるようにするDHTなどの技術が利用される。ここでは、DHTの1つであるChordについて説明すると共に、自律分散KVSシステムで利用できる他の技術について述べる。なお、説明の都合上、Chordのアルゴリズムを主な例として挙げるが、第2実施形態の技術を適用可能な範囲はこれに限定されない。
(Chord)
図2〜図4を参照しながら、自律分散KVSシステムの実現に利用可能なChordのアルゴリズム(以下、単にChordと称する。)について説明する。
なお、図2は、自律分散KVSシステムの一例(Chord)について説明するための第1の図である。図3は、自律分散KVSシステムの一例(Chord)について説明するための第2の図である。図4は、自律分散KVSシステムの一例(Chord)について説明するための第3の図である。
Chordでは、リング状のID空間にIDを割り振り、設定された規則に基づいてIDに対するノードの割り当て及びノードに対するキーの割り当てを決めることで、特定のキーが割り当てられたノードを一意に決める仕組みを実現している。
図2の例は、mビット(m=3)のIDが割り振られたID空間に3つのノード(Node#0、Node#1、Node#3)を割り当てる方法を示している。また、図2の例は、3つのキー(Key#1、Key#2、Key#6)をノードに割り当てる方法を示している。
Node#i(i=0,1,3)は「ID=i」の位置(以下、ID#iと表記する。)に割り当てられる。なお、Node#iが割り当てられているIDをNodeIDと表記する場合がある。また、Key#jの識別子は「j」であり、この識別子をKeyIDと表記する場合がある。
ID空間のノードにKey#jを割り当てるとき、Chordでは、ID#j(KeyIDと同じ値のID)にノードが割り当てられている場合には、そのノードにKey#jが割り当てられる。一方、ID#jにノードが割り当てられていない場合、リング上で、ID#jより先にあるIDのうち、ノードが割り当てられている直近のID(Next NodeID)が特定され、Next NodeIDに割り当てられているノードにKey#jが割り当てられる。
図2の例では、ID#1にNode#1が割り当てられているため、Key#1は、Node#1に割り当てられる。また、ID#2にノードが割り当てられていないため、次にノードが割り当てられているID#3にあるNode#3にKey#2が割り当てられる。同様に、ID#6にノードが割り当てられていないため、次にノードが割り当てられているID#0にあるNode#0にKey#6が割り当てられる。
Node#0、Node#1、Node#3は、それぞれKey#1、Key#2、Key#6の探索に利用するルーティングテーブルを保持している。ルーティングテーブルは、探索するキーのKeyIDを含む範囲(Interval)、及びそのキーを保持しているノード(Successor)に関する情報を有する。
例えば、図2(A)は、Node#0が保持するルーティングテーブルである。Chordの場合、ルーティングテーブルには、m個のIntervalと、各Intervalに対応するSuccessorのIDとが格納される。Intervalは、NodeID(n)及びルーティングテーブルの行番号(k)に基づいて算出される。Intervalの始点(Start(n,k))は、下記の式(1)により与えられる。
Start(n,k)=(n+2k-1) mod 2m
…(1)
そして、Intervalは、Start(n,k)以上、Start(n+1,k)未満の範囲に設定される。例えば、n=0、k=1の場合、Start(0,1)は1となり、Start(1,1)は2となる。そのため、Node#0が保持するルーティングテーブルの1行目に記述されるIntervalは1以上2未満となる。
Successor(図中ではSuc.と略記)は、Startと同じ値のIDにノードが割り当てられている場合、Startの値がSuccessorの値となる。一方、Startと同じ値のIDにノードが割り当てられていない場合、リング上でStartの値と同じIDより先にあるIDのうち、ノードが割り当てられているID(Next NodeID)がSuccessorの値となる。例えば、n=0、k=1の場合、Successorは1となる。
同様に、k=2,3の場合についてInterval及びSuccessorを求めると、図2(A)に示すようなルーティングテーブルが得られる。また、Node#1が保持するルーティングテーブルは、図2(B)のようになる。そして、Node#3が保持するルーティングテーブルは、図2(C)のようになる。
例えば、Node#1に対し、Key#2に紐付けられる値への操作が要求された場合、Node#1は、ルーティングテーブルを参照し、KeyIDである「2」を含むInterval([2,4))を特定する。そして、Node#1は、特定したIntervalに対応するSuccessor(ID#3にあるNode#3)がKey#2を保持していることを認識し、受け付けた操作をNode#3に要求する。
上記のように、Chordは、IDに対するノードの割り当てに基づいてキーの割り当てが決まるようにし、各ノードが特定のキーを保持するノードを探索できる仕組みを有する。そして、各ノードは、ノードの割り当てに基づいて予め計算されるInterval及びSuccessorを含むルーティングテーブルを保持し、このルーティングテーブルを利用して特定のキーを保持するノードを探索し、キーに紐付けられる値の操作を実施する。
また、新たなノードがID空間に追加される場合(ノードの参加)、少なくとも一部のノードが保持するルーティングテーブルが更新される。また、ノードの割り当てが変更されるため、キーの割り当ても更新されうる。
例えば、図3に示すように、Node#6が新たに参加した場合、Key#6はNode#6に割り当てられる。また、Node#0が保持するルーティングテーブルのうち、3行目のSuccessorが「6」に変更される(図3(A)を参照)。また、Node#1が保持するルーティングテーブルのうち、3行目のSuccessorが「6」に変更される(図3(B)を参照)。また、Node#3が保持するルーティングテーブルのうち、1、2行目のSuccessorが「6」に変更される(図3(C)を参照)。
Node#6が保持するルーティングテーブル(図3(D)を参照)の計算方法、及びNode#0、Node#1、Node#3が保持するルーティングテーブルの計算方法は、図2に示したルーティングテーブルの計算と同じである。このように、ノードの参加に応じて、キーの再割り当てやルーティングテーブルの更新が行われる。また、ID空間からノードが削除される場合(ノードの離脱)、図4(Node#1が離脱する例)に示すように、キーの再割り当てやルーティングテーブルの更新が行われる。
(その他の技術)
特定のキーを保持するノードを効率的に探索できるようにする仕組みとしては、上述したChordの他、CAN(Content Addressable Network)、Pastry、KademliaなどのDHTがある。CANは、キーを写像する論理空間(ChordのID空間に対応)としてN次元トーラスを採用する方式である。Pastryは、論理空間としてPastryアルゴリズムを採用する方式である。Kademliaは、論理空間として2分木を採用する方式である。また、各種DHTの他、自律分散KVSシステムの実現にSkip Graphを利用することもできる。
第2実施形態に係る技術は、上述した様々な仕組みを採用する自律分散KVSシステムに広く適用可能である。
[2−2.多重化分散KVSシステム]
次に、図5〜図7を参照しながら、第2実施形態に係る多重化分散KVSシステムについて説明する。
図5は、第2実施形態に係る多重化分散KVSシステムの一例を示した図である。図6は、第2実施形態に係る多重化分散KVSシステムにおけるノードの管理について説明するための図である。図7は、第2実施形態に係るノードが保持するルーティングテーブルの一例を示した図である。
図5に示すように、第2実施形態に係る多重化分散KVSシステムは、例えば、制御装置100、GW(Gateway)装置200−1、200−2、…、200−N、及び端末装置301、302、303を有する。
制御装置100は、例えば、パーソナルコンピュータやサーバ装置などのコンピュータである。GW装置200−1、200−2、…、200−N、端末装置301、302、303は、例えば、パーソナルコンピュータ、携帯電話、スマートフォン、カーナビゲーションシステム、タブレット端末などの移動端末である。制御装置100とGW装置200−1、200−2、…、200−Nとはネットワーク300を介して通信することができる。GW装置200−1は、BT(Bluetooth:登録商標)などの近距離通信を利用して端末装置301、302、303と通信することができる。
制御装置100、GW装置200−1、200−2、…、200−N、及び端末装置301、302、303は、それぞれURI(Uniform Resource Identifier)やIPアドレスなどの特定情報に基づいて識別されうる。また、GW装置200−1、200−2、…、200−N、及び端末装置301、302、303の少なくとも一部は、GPS(Global Positioning System)、温度センサ、加速度センサなどの機能を有し、その機能を利用して取得した情報(センサ情報)を保持することができる。
例えば、端末装置301、302、303は、自身が保持するセンサ情報の種類や特徴と、自身の特定情報とを短距離通信でGW装置200−1に送信する。GW装置200−1は、端末装置301、302、303の特定情報をそれぞれキーに紐付けて保持する。また、GW装置200−2、…、200−Nは、それぞれがセンサ情報を取得して保持し、自身の特定情報をキーに紐付けて保持する。この場合、GW装置200−1、200−2、…、200−Nがそれぞれ自律分散KVSシステムのノードとなり、センサ情報の格納先を示す特定情報が、キーに紐付けられる値となる。
制御装置100は、自律分散KVSシステムへの参加・離脱を管理するノード(初期ノード)を設定し、初期ノードに関する情報を他のノードに通知する機能を有する。例えば、制御装置100は、Webサーバの機能を有し、その機能を利用して初期ノードに関する情報を他のノードに通知する。なお、図5の例は第2実施形態の技術を適用可能なシステムの一例を示したものであり、その適用範囲はこれに限定されない。但し、以下では、説明の都合上、GW装置200−1、200−2、…、200−Nをノードと称する。
(ノードの種類・割り当て/キーの割り当て/ルーティングテーブル)
ノードには、初期ノードと通常ノードとがある。初期ノードは、ノードの参加や離脱を管理する機能(管理機能)を有するノードである。通常ノードは、初期ノードの管理機能が省略されたノードである。初期ノードは、制御装置100により予め設定される。また、初期ノードが割り当てられているIDの情報は、制御装置100により各ノードに通知される。また、初期ノード以外のノードは通常ノードとなる。
図6の例は、第2実施形態に係る多重化分散KVSシステムにおけるノードの割り当てを示している。図6に示すように、この多重化分散KVSシステムは、複数のID空間401、402、403を利用する。ID空間401、402、403は同じmビットのID系列(m=3;ID=0,1,…,7)を有する。
また、ID空間401、402、403の間ではノードの割り当てが共通となるように制御される。例えば、ID空間401のID#0には初期ノード210が割り当てられている。この場合、ID空間402、403のID#0にもノード(図6の例では通常ノード220、230)が割り当てられる。そして、ID空間401、402、403には同じID系列が設定され、ノードの割り当ても同じであるため、同じIDに割り当てられているノードには同じキー及び値が格納される。
図6の例では、ID空間401において、ID#0に初期ノード210が割り当てられ、ID#2に初期ノード212が割り当てられ、ID#4に通常ノード214が割り当てられている。ID空間402では、ID#0に通常ノード220が割り当てられ、ID#2に通常ノード222が割り当てられ、ID#4に通常ノード224が割り当てられている。ID空間403では、ID#0に通常ノード230が割り当てられ、ID#2に通常ノード232が割り当てられ、ID#4に通常ノード234が割り当てられている。
例えば、ノードに割り当てられるキーとしてKey#0、Key#1、…、Key#7が用意されている場合、ID#0に割り当てられているノードには、Key#5、Key#6、Key#7、Key#0が割り当てられる。ID#2に割り当てられているノードには、Key#1、Key#2が割り当てられる。ID#4に割り当てられているノードには、Key#3、Key#4が割り当てられる。そして、これらのキーに値が紐付けられ、そのキーを利用して値に対する操作が行われる。なお、ここではキーの割り当て方法の一例としてChordの規則(図2(D)を参照)を採用している。
このように、第2実施形態に係る多重化分散KVSシステムは、同じID系列を有するID空間を複数管理し、IDに対するノードの割り当てを多重化することで、ノードごとキーと値のペアを冗長化する仕組みを採用している。この仕組みを実現するため、図6に示すように、初期ノード210、212は、それぞれノードプール410、412を管理する。ノードプール410、412は、システムへの参加を要求しているノードを一時的に収容し、IDへの割り当てを待機させるためのプールである。
なお、ノードプール410、412は初期ノード210、212間の情報のやり取りにより同じ内容に維持される。図6の例では初期ノード210、212がそれぞれノードプール410、412を管理しているが、初期ノード210、212に共通のノードプールを1つ用意し、そのノードプールを初期ノード210、212のいずれか又は両方が管理する仕組みに変形できる。
例えば、初期ノード210が参加の要求を受け付けた場合、初期ノード210は、参加の要求を出したノードをノードプール410に一旦収容する。そして、初期ノード210は、ノードプール410に収容されているノードの数が、ID空間の数(図6の例では3)より大きいかを確認する。
収容されているノード数がID空間の数より大きい場合、初期ノード210は、ノードプール410からID空間の数と同数のノードを選択し、選択した各ノードに同じIDを割り振る。そして、初期ノード210は、IDを割り振ったノードをID空間401、402、403の該当IDに1つずつ割り当てる。この方法によれば、新規ノードの参加後もID空間401、402、403におけるノードの割り当てが同じ状態に維持される。
なお、第2実施形態に係る多重化分散KVSシステムの各ノードは、自身が属するID空間とは異なる他のID空間に属するノードにアクセスする機会がある。そのため、各ノードは、他のID空間に属するノードの情報を含むルーティングテーブルを保持する。例えば、ID#0に割り当てられているノード(初期ノード210、通常ノード220、230)は、図7に示すようなルーティングテーブルを保持する。
図7に示すように、第2実施形態に係るルーティングテーブルは、ノードが割り当てられているID(NodeID:n)、行番号k、Start、Interval、Successorを有する。図2(A)などに示したルーティングテーブルとの違いは、Successorの欄に、他のID空間に属するノードの情報が含まれる点にある。
図7の例では、Successorを特定するIDに加え、各ID空間のSuccessorにアクセスするための情報(IP Address)が記載されている。例えば、n=0、k=1に対応するSuccessorのIDは2である。そして、ID#2に割り当てられているID空間401、402、403のノードは、それぞれ初期ノード212、通常ノード222、232である。そのため、Successorの欄には、初期ノード212、通常ノード222、232のIP Addressが記載される。
図7にはID#0に割り当てられているノードが保持するルーティングテーブルの一例を示したが、他のIDに割り当てられているノードも、そのノードに対応するルーティングテーブルを保持している。そのため、あるID空間のノードが操作を受け付けたとき、そのノードは、自身が属するID空間から操作対象となる該当ノードを探索できるだけでなく、他のID空間から操作対象となる該当ノードを探索することが可能になる。
そして、上記のルーティングテーブルを利用することで、通信状態の良い該当ノードに操作を要求することができる。また、あるID空間の該当ノードが離脱した場合でも、他のID空間の該当ノードが処理を代替できるため、特別な処理を実行せずともシステムの運用を継続することができる。また、離脱したノードが再参加する際、離脱前のIDに割り当て、同じIDに割り当てられている他のノードと同期処理を実行することで、迅速に離脱前の状態へと復旧することが可能になる。
以上、多重化分散KVSシステムについて説明した。
[2−3.ハードウェア]
次に、図8を参照しながら、第2実施形態に係るノードの機能を実現可能なハードウェアについて説明する。図8は、第2実施形態に係るノードの機能を実現可能なハードウェアの一例を示した図である。
例えば、初期ノード210が有する機能は、図8に示すハードウェア資源を用いて実現することが可能である。つまり、初期ノード210が有する機能は、コンピュータプログラムを用いて図8に示すハードウェアを制御することにより実現される。
図8に示すように、このハードウェアは、主に、CPU902と、ROM(Read Only Memory)904と、RAM906と、ホストバス908と、ブリッジ910とを有する。さらに、このハードウェアは、外部バス912と、インターフェース914と、入力部916と、出力部918と、記憶部920と、ドライブ922と、接続ポート924と、通信部926とを有する。
CPU902は、例えば、演算処理装置又は制御装置として機能し、ROM904、RAM906、記憶部920、又はリムーバブル記録媒体928に記録された各種プログラムに基づいて各構成要素の動作全般又はその一部を制御する。ROM904は、CPU902に読み込まれるプログラムや演算に用いるデータなどを格納する記憶装置の一例である。RAM906には、例えば、CPU902に読み込まれるプログラムや、そのプログラムを実行する際に変化する各種パラメータなどが一時的又は永続的に格納される。
これらの要素は、例えば、高速なデータ伝送が可能なホストバス908を介して相互に接続される。一方、ホストバス908は、例えば、ブリッジ910を介して比較的データ伝送速度が低速な外部バス912に接続される。
入力部916としては、例えば、マウス、キーボード、タッチパネル、タッチパッド、ボタン、スイッチ、及びレバーなどが用いられる。また、入力部916としては、赤外線やその他の電波を利用して制御信号を送信することが可能なリモートコントローラが用いられることもある。また、入力部916は、ユーザが情報を入力するデバイスの他、GPS、温度センサ、加速度センサなどのセンサ情報を収集し、収集した情報をCPU902などに入力するデバイスであってもよい。
出力部918としては、例えば、CRT(Cathode Ray Tube)、LCD(Liquid Crystal Display)、PDP(Plasma Display Panel)、又はELD(Electro-Luminescence Display)などのディスプレイ装置が用いられる。また、出力部918として、スピーカやヘッドホンなどのオーディオ出力装置、又はプリンタなどが用いられることもある。つまり、出力部918は、情報を視覚的又は聴覚的に出力することが可能な装置である。
記憶部920は、各種のデータを格納するための装置である。記憶部920としては、例えば、HDDなどの磁気記憶デバイスが用いられる。また、記憶部920として、SSD(Solid State Drive)やRAMディスクなどの半導体記憶デバイス、光記憶デバイス、又は光磁気記憶デバイスなどが用いられてもよい。
ドライブ922は、着脱可能な記録媒体であるリムーバブル記録媒体928に記録された情報を読み出し、又はリムーバブル記録媒体928に情報を書き込む装置である。リムーバブル記録媒体928としては、例えば、磁気ディスク、光ディスク、光磁気ディスク、又は半導体メモリなどが用いられる。
接続ポート924は、例えば、USB(Universal Serial Bus)ポート、IEEE1394ポート、SCSI(Small Computer System Interface)、RS−232Cポート、又は光オーディオ端子など、外部接続機器930を接続するためのポートである。外部接続機器930としては、例えば、プリンタなどが用いられる。
通信部926は、ネットワーク932に接続するための通信デバイスである。通信部926としては、例えば、有線又は無線LAN用の通信回路、WUSB(Wireless USB)用の通信回路、光通信用の通信回路やルータ、ADSL(Asymmetric Digital Subscriber Line)用の通信回路やルータ、携帯電話ネットワーク用の通信回路などが用いられる。通信部926に接続されるネットワーク932は、有線又は無線により接続されたネットワークであり、例えば、インターネット、LAN、放送網、衛星通信回線などを含む。
なお、初期ノード210以外のノードが有する機能も図8に示したハードウェアを用いて実現可能である。つまり、GW装置200−1、200−2、…、200−Nが有する機能は図8に示したハードウェアを用いて実現可能である。また、制御装置100及び端末装置301、302、303が有する機能も図8に示したハードウェアを用いて実現可能である。また、図8に示したハードウェアのうち一部の要素を省略する変形や、さらに要素を追加する変形も許容される。
以上、ハードウェアについて説明した。
[2−4.機能]
次に、ノードの機能について説明する。
(初期ノード)
まず、図9を参照しながら、初期ノードの機能について説明する。図9は、第2実施形態に係る初期ノードが有する機能の一例を示したブロック図である。なお、ここでは説明の都合上、初期ノード210の機能を例に説明する。
図9に示すように、初期ノード210は、記憶部241、操作処理部242、探索処理部243、プール管理部244、参加処理部245、同期処理部246、死活監視部247、及び離脱処理部248を有する。
なお、記憶部241の機能は、上述したRAM906や記憶部920などを用いて実現できる。操作処理部242、探索処理部243、プール管理部244、参加処理部245、同期処理部246、死活監視部247、及び離脱処理部248の機能は、上述したCPU902などを用いて実現できる。
記憶部241には、KVSデータ241a、操作履歴241b、ルーティングテーブル241c、初期ノードリスト241d、同IDノードリスト241e、ノードプール情報241f、及びRTTデータ241gが格納される。
KVSデータ241aは、初期ノード210に割り当てられているキー(図6の例ではKey#5、Key#6、Key#7、Key#0)と、そのキーに紐付けられて保持される値(Value)とのペアである。
操作履歴241bは、図10に示すように、初期ノード210又は初期ノード210と同じIDに割り当てられているノードが受け付けた操作の履歴である。図10は、第2実施形態に係る操作履歴の一例を示した図である。操作履歴241bには、同じIDに割り当てられているノードと同期済の履歴と、未同期の履歴とが含まれる。同期済の履歴には、バージョン情報(Ver.)が付与される。
図10に例示した操作履歴241bには、Key#5に値val05を紐付けて格納する操作(put Key#5 val05)、Key#6に値val06を紐付けて格納する操作(put Key#6 val06)が含まれている。また、この操作履歴241bには、Key#5の値val05を削除する操作(del Key#5 val05)、Key#7に値val07を紐付けて格納する操作(put Key#7 val07)も含まれている。
操作履歴241bには、操作を受け付けたノードの所属するID空間の情報が併せて記載される。例えば、Key#5に値val05を紐付けて格納する操作を初期ノード210が受け付けた場合、操作履歴241bには、初期ノード210が所属するID空間401の情報が記載される。同様に、初期ノード210と同じIDを有するノードが受け付け、実行した操作の履歴が、その操作を受け付けたノードの所属するID空間の情報に対応付けて操作履歴241bとして記憶部241に蓄積される。
バージョン情報は、同じIDに割り当てられているノードの間で未同期の履歴について同期完了が確認できた場合に、その未同期の履歴を同期済とするタイミングで、同期済とした履歴に付与される。つまり、同期完了の確認がとれた操作の集合に対し、確認の度に新たなバージョン情報が付与される。
ルーティングテーブル241cは、キーを保持するノードを探索する際に利用される情報である。例えば、初期ノード210が利用するルーティングテーブル241cは、図11のようになる。図11は、第2実施形態に係るルーティングテーブルの一例を示した図である。
図11に示すように、ルーティングテーブル241cには、例えば、行番号k、Start、Interval、Successorが含まれる。また、Successorの欄には、初期ノード210と同じID空間401に属するSuccessorの情報(IP Addressなど)の他、同じIDを有するID空間402、403のノードの情報(IP Addressなど)が記載される。
初期ノードリスト241dは、図12に示すように、制御装置100により設定された全ての初期ノードの情報(IP Addressなど)を列挙した情報である。図12は、第2実施形態に係る初期ノードリストの一例を示した図である。図6の例では、初期ノード210、212が設定されているため、図12に例示した初期ノードリスト241dには、初期ノード210、212の情報が記載されている。
同IDノードリスト241eは、図13に示すように、初期ノード210と同じIDに割り当てられているノードの情報(IP Addressなど)を列挙した情報である。図13は、第2実施形態に係る同IDノードリストの一例を示した図である。図6の例では、初期ノード210と同じID#0に通常ノード220、230が割り当てられているため、図13に例示した同IDノードリスト241eには、通常ノード220、230の情報が記載されている。
ノードプール情報241fは、図14に示すように、ノードプール410に収容されているノードの情報(IP Addressなど)を含む。図14は、第2実施形態に係るノードプール情報の一例を示した図である。例えば、ノードプール410に通常ノード216、…が収容されている場合、ノードプール情報241fには、通常ノード216、…の情報が記載される。
RTTデータ241gは、図15に示すように、ノードプール410に収容されているノードのペア毎に測定されたRTT(Round-Trip Time)を示すデータである。図15は、第2実施形態に係るRTTデータの一例を示した図である。RTTは、一方のノードから他方のノードにメッセージを送信し、そのメッセージに対する応答が他方のノードから一方のノードへと到達するまでにかかる時間である。RTTを参照することで、通信経路上におけるノード間の距離を評価することができる。
例えば、RTTデータ241gを参照し、RTTが小さいノードの組み合わせを抽出(クラスタリング)することで、通信経路上で近傍にあるノードの集合(近傍ノード群)が得られる。多重化分散KVSシステムでは、同一IDに割り当てられているノード間で操作要求の転送や操作履歴の同期などが実施されるため、同一IDに割り当てられるノード間の距離が短いほどシステムの性能が向上する。そのため、第2実施形態に係る多重化分散KVSシステムでは、近傍ノード群に属するノードが同一IDに割り当てられる。その際、RTTデータ241gが利用される。
再び図9を参照する。
操作処理部242は、多重化分散KVSシステムの利用者又は他のノードから受け付けた操作の要求を処理する。
例えば、利用者は、制御装置100を介して初期ノード210に操作を要求する。初期ノード210に割り当てられているキーに関する操作である場合、操作処理部242は、その要求に応じて操作をKVSデータ241aに反映させる。また、操作処理部242は、受け付けた操作の内容と、自身が所属するID空間401の情報を操作履歴241bに記載する。受け付けた操作の要求が他のノードから出されたものである場合、操作処理部242は、上記と同様に、その操作をKVSデータ241aに反映させ、操作履歴241bに記載を追加する。
探索処理部243は、ルーティングテーブル241cを参照し、指定されたキーを保持するノードを特定する。例えば、初期ノード210に割り当てられていないキーに対する操作の要求を操作処理部242が受け付けた場合、探索処理部243は、ルーティングテーブル241cに基づいて、そのキーに対応するSuccessorのIDを特定する。
例えば、Key#1(KeyID=1)に対する操作の要求が受け付けられた場合、探索処理部243は、ルーティングテーブル241c(図11を参照)を参照し、KeyIDを含むInterval([1,2))を特定する。また、探索処理部243は、特定したIntervalに対応するSuccessorのID(ID=2)を特定する。そして、探索処理部243は、特定したSuccessorのIDを操作処理部242に通知する。この通知を受けた操作処理部242は、Successorに対して操作の要求を転送する。
プール管理部244は、ノードプール410を管理する。
例えば、プール管理部244は、ノードプール410にノードが追加された場合、追加されたノードの情報(IP Addressなど)を収集し、収集した情報をノードプール情報241fに記載する。また、プール管理部244は、初期ノード212に対してノードの追加を通知すると共に、追加されたノードの情報を初期ノード212に提供する。一方、プール管理部244は、初期ノード212からノードの追加を通知された場合、初期ノード212から提供されるノードの情報をノードプール情報241fに記載する。
また、プール管理部244は、ノードプール410に収容されているノード間のRTTを計測し、計測したRTTをRTTデータ241gに記載する。また、プール管理部244は、RTTデータ241gに記載のRTTに基づいて近傍ノード群を抽出する。なお、RTTの計測は、予め設定された周期又はタイミングで実行される。また、近傍ノード群の抽出は、予め設定された周期又はタイミングで実行されてもよいし、或いは、参加処理部245によるノードの参加処理が実行されるタイミングで実行されてもよい。
参加処理部245は、ノードの参加に関する処理を実行する。例えば、参加処理部245は、IDに割り当てられていないノードから参加要求を受けた場合、そのノードをノードプール410に収容する。また、参加処理部245は、ノードプール情報241fを参照し、ノードプール410に収容されているノードの数がID空間の数以上である場合、ID空間の数と同数のノードを選択し、選択したノードに同じIDを割り振る。そして、参加処理部245は、ID空間401、402、403の同じIDに、選択したノードを1つずつ割り当てる。
なお、参加処理部245は、ID空間の数と同数のノードを含む近傍ノード群がある場合にノードの選択、IDの割り振り、及びIDへの割り当てを実行してもよい。この場合、ID空間の数以上のノードがノードプール410に存在していてもノードの参加が見送られる。一方、この方法によれば、通信経路上の距離が短いノードの組が同じIDに割り当てられるため、システムの性能向上に寄与する。
同期処理部246は、同じIDに割り当てられているノード間で操作履歴241bを同期する。例えば、同期処理部246は、操作履歴241bに記載されている操作のうち、同じIDに割り当てられている他のノードに通知していない操作を特定し、特定した操作を同IDノードリスト241eに記載されている各ノードに通知する。なお、同期の処理は、操作処理部242が操作を受け付ける度に実行してもよいし、予め設定された周期又はタイミングで実行してもよい。
また、同期処理部246は、操作履歴241bのうち同期完了の確認がとれていない操作の集合(未同期の履歴)について、同じIDに割り当てられているノード間で同期完了の確認を実施する。なお、同期完了の確認は、予め設定された周期又はタイミングで実施されてもよいし、上述した同期の処理が完了したタイミングや、同期の処理が完了してから所定の時間が経過したタイミングで実施されてもよい。
同期完了の確認は、例えば、未同期の履歴に基づいて算出されるチェックサムを利用して行うことができる。チェックサムは、操作の集合を入力とし、その集合に含まれる操作の組み合わせが同じであれば同じ値を出力する関数を利用して計算される。つまり、未同期の履歴における操作の順序が異なっていても、同じ操作の組が含まれていれば、チェックサムの値は同じになる。
同期完了の確認に際し、同期処理部246は、操作履歴241bに含まれる未同期の履歴からチェックサムを計算し、同じIDに割り当てられている他のノード(通常ノード220、230)にチェックサムを要求する。そして、同期処理部246は、他のノードから取得したチェックサムと、計算したチェックサムとが同じである場合、その未同期の履歴を同期済の履歴に設定すると共に、その履歴に新たなバージョン情報を付与する。このように、バージョン情報を利用することで、どの操作までが同期済で、どの操作までが未同期であるかを容易に確認することが可能になる。
死活監視部247は、同期処理部246が同期の処理を実行する際、操作の通知に対する応答を監視し、その応答の有無に応じて通知先のノードが通信可能な状態にあるか否かを判断する。例えば、死活監視部247は、通知から応答までにかかる遅延時間を計測し、その遅延時間が予め設定された閾値より大きい場合、通知先のノードが通信不可の状態(離脱した状態)にあると判断する。
また、死活監視部247は、離脱した状態にあると判断したノードの数をカウントする。そして、カウントした数が予め設定された閾値(例えば、2)以上の場合、死活監視部247は、離脱したノードの数が閾値以上であることを離脱処理部248に通知する。なお、死活監視部247は、初期ノード210以外の残存するノードの数をカウントし、カウントした数と予め設定された閾値(例えば、1)とを比較してもよい。また、死活監視部247は、離脱した状態にあると判断したノードの情報を同IDノードリスト241e及びルーティングテーブル241cから削除する。
離脱処理部248は、初期ノード210を含め、同じIDに割り当てられているノードを離脱させる処理を実行する。例えば、離脱処理部248は、死活監視部247から、離脱した状態にあるノードの数が閾値以上である旨の通知を受けた場合、初期ノード210と異なるIDに割り当てられているノードの中から、KVSデータ241aの移管先となる代替ノードを決定する。そして、離脱処理部248は、KVSデータ241aを代替ノードに移管し、離脱処理の対象外である各ノードに初期ノード210の離脱を通知する。
また、離脱処理部248は、初期ノード212に参加の要求を出す。初期ノード212に参加の要求を出すことで、初期ノード210はノードプール412に収容される。なお、離脱処理の対象となる他のノードがある場合、離脱処理部248は、その他のノードに対し、代替ノードの決定、KVSデータの移管、離脱の通知、及び参加の要求を行うように指示してもよい。
また、離脱処理部248は、制御装置100に対し、初期ノード210に代わる初期ノードの設定を依頼する。なお、初期ノード210以外に初期ノードがない場合、離脱処理部248は、離脱処理の対象外となる各ノードに初期ノード210の離脱を通知する前に、制御装置100に初期ノードの設定を依頼する。そして、初期ノードが設定され、新たな初期ノードが各ノードに通知された後、離脱処理部248は、離脱の通知などの処理を実行し、新たな初期ノードに参加の要求を出す。
以上、初期ノード210の機能について説明した。なお、初期ノード212の機能も同様である。
(通常ノード)
次に、図16を参照しながら、通常ノードの機能について説明する。図16は、第2実施形態に係る通常ノードが有する機能の一例を示したブロック図である。なお、ここでは説明の都合上、通常ノード230の機能を例に説明する。
図16に示すように、通常ノード230は、記憶部251、操作処理部252、探索処理部253、参加処理部254、同期処理部255、死活監視部256、及び離脱処理部257を有する。
なお、記憶部251の機能は、上述したRAM906や記憶部920などを用いて実現できる。操作処理部252、探索処理部253、参加処理部254、同期処理部255、死活監視部256、及び離脱処理部257の機能は、上述したCPU902などを用いて実現できる。
記憶部251には、KVSデータ251a、操作履歴251b、ルーティングテーブル251c、初期ノードリスト251d、同IDノードリスト251eが格納される。
KVSデータ251aは、通常ノード230に割り当てられているキー(図6の例ではKey#5、Key#6、Key#7、Key#0)と、そのキーに紐付けられて保持される値(Value)とのペアである。
操作履歴251bは、上述した操作履歴241b(図10を参照)と同様に、通常ノード230又は通常ノード230と同じIDに割り当てられているノードが受け付けた操作の履歴である。ルーティングテーブル251cは、上述したルーティングテーブル241c(図11を参照)と同様に、キーを保持するノードを探索する際に利用される情報である。
初期ノードリスト251dは、上述した初期ノードリスト241d(図12を参照)と同様に、制御装置100により設定された全ての初期ノードの情報(IP Addressなど)を列挙した情報である。同IDノードリスト251eは、上述した同IDノードリスト241e(図13を参照)と同様に、初期ノード210と同じIDに割り当てられているノードの情報(IP Addressなど)を列挙した情報である。
なお、通常ノード230と初期ノード210とは同じIDに割り当てられるため、ルーティングテーブル251c、同IDノードリスト251eは同じ内容になる。また、初期ノードリスト251dは各ノードで共通の内容となる。
操作処理部252は、多重化分散KVSシステムの利用者又は他のノードから受け付けた操作の要求を処理する。
例えば、利用者は、制御装置100を介して通常ノード230に操作を要求する。通常ノード230に割り当てられているキーに関する操作である場合、操作処理部252は、その要求に応じて操作をKVSデータ251aに反映させる。また、操作処理部252は、受け付けた操作の内容と、自身が所属するID空間403の情報を操作履歴251bに記載する。受け付けた操作の要求が他のノードから出された要求である場合、操作処理部252は、上記と同様に、その操作をKVSデータ251aに反映させ、操作履歴251bに記載を追加する。
探索処理部253は、ルーティングテーブル251cを参照し、指定されたキーを保持するノードを特定する。例えば、通常ノード230に割り当てられていないキーに対する操作の要求を操作処理部252が受け付けた場合、探索処理部253は、ルーティングテーブル251cに基づいて、そのキーに対応するSuccessorのIDを特定する。そして、探索処理部253は、特定したSuccessorのIDを操作処理部252に通知する。この通知を受けた操作処理部252は、Successorに対して操作の要求を転送する。
参加処理部254は、初期ノードリスト251dに記載されている初期ノードに参加の要求を出す。初期ノードからIDが割り振られ、通常ノード230がIDに割り当てられた場合、参加処理部254は、初期ノードからノードの割り当てに関する情報を取得し、ルーティングテーブル251cを生成する。なお、初期ノードがルーティングテーブル251cを生成する場合、参加処理部254は、初期ノードからルーティングテーブル251cを取得する。
同期処理部255は、同じIDに割り当てられているノード間で操作履歴251bを同期する。例えば、同期処理部255は、操作履歴251bに記載されている操作のうち、同じIDに割り当てられている他のノードに通知していない操作を特定し、特定した操作を同IDノードリスト251eに記載されている各ノードに通知する。
なお、同期の処理は、操作処理部252が操作を受け付ける度に実行してもよいし、予め設定された周期又はタイミングで実行してもよい。また、同期処理部255は、通常ノード230の参加時に、同じIDのノードに対して同期を要求し、そのノードから取得した操作履歴を操作履歴251bとして記憶部251に格納し、その操作履歴251bからKVSデータ251aを生成してもよい。
また、同期処理部255は、操作履歴251bのうち同期完了の確認がとれていない操作の集合(未同期の履歴)について、同じIDに割り当てられているノード間で同期完了の確認を実施する。なお、同期完了の確認は、予め設定された周期又はタイミングで実施されてもよいし、上述した同期の処理が完了したタイミングや、同期の処理が完了してから所定の時間が経過したタイミングで実施されてもよい。
同期完了の確認は、例えば、未同期の履歴に基づいて算出されるチェックサムを利用して行うことができる。チェックサムは、操作の集合を入力とし、その集合に含まれる操作の組み合わせが同じであれば同じ値を出力する関数を利用して計算される。つまり、未同期の履歴における操作の順序が異なっていても、同じ操作の組が含まれていれば、チェックサムの値は同じになる。
同期完了の確認に際し、同期処理部255は、操作履歴251bに含まれる未同期の履歴からチェックサムを計算し、同じIDに割り当てられている他のノード(初期ノード210、通常ノード220)にチェックサムを要求する。そして、同期処理部255は、他のノードから取得したチェックサムと、計算したチェックサムとが同じである場合、その未同期の履歴を同期済の履歴に設定すると共に、その履歴に新たなバージョン情報を付与する。このように、バージョン情報を利用することで、どの操作までが同期済で、どの操作までが未同期であるかを容易に確認することが可能になる。
死活監視部256は、同期処理部255が同期の処理を実行する際、操作の通知に対する応答を監視し、その応答の有無に応じて通知先のノードが通信可能な状態にあるか否かを判断する。例えば、死活監視部256は、通知から応答までにかかる遅延時間を計測し、その遅延時間が予め設定された閾値より大きい場合、通知先のノードが通信不可の状態(離脱した状態)にあると判断する。
また、死活監視部256は、離脱した状態にあると判断したノードの数をカウントする。そして、カウントした数が予め設定された閾値(例えば、2)以上の場合、死活監視部256は、離脱したノードの数が閾値以上であることを離脱処理部257に通知する。なお、死活監視部256は、通常ノード230以外の残存するノードの数をカウントし、カウントした数と予め設定された閾値(例えば、1)とを比較してもよい。また、死活監視部256は、離脱した状態にあると判断したノードの情報を同IDノードリスト251e及びルーティングテーブル251cから削除する。
離脱処理部257は、通常ノード230を含め、同じIDに割り当てられているノードを離脱させる処理を実行する。例えば、離脱処理部257は、死活監視部256から、離脱した状態にあるノードの数が閾値以上である旨の通知を受けた場合、通常ノード230と異なるIDに割り当てられているノードの中から、KVSデータ251aの移管先となる代替ノードを決定する。そして、離脱処理部257は、KVSデータ251aを代替ノードに移管し、離脱処理の対象外である各ノードに通常ノード230の離脱を通知する。
また、離脱処理部257は、初期ノード212に参加の要求を出す。初期ノード212に参加の要求を出すことで、通常ノード230はノードプール412に収容される。なお、離脱処理の対象となる他のノードがある場合、離脱処理部257は、その他のノードに対し、代替ノードの決定、KVSデータの移管、離脱の通知、及び参加の要求を行うように指示してもよい。
以上、通常ノード230の機能について説明した。なお、通常ノード230以外の通常ノード(通常ノード214など)が有する機能も同様である。
[2−5.処理の流れ]
次に、多重化分散KVSシステムにおいて実行される処理の流れについて説明する。
(ノードの参加)
まず、図17及び図18を参照しながら、ノードの参加時に実行される処理の流れについて説明する。図17は、第2実施形態に係るノードの割り当て方法について説明するための図である。図18は、第2実施形態に係るノードの参加時に実行される処理の流れについて説明するためのフロー図である。
図17の例は、通常ノード216が初期ノード210に参加の要求を出した場合に実行される割り当て処理の様子を示している。この例ではノードプール410に通常ノード226、227、234、236が収容されており、参加の要求を受けた初期ノード210は、通常ノード216をノードプール410に収容する。
例えば、RTTデータ241gに基づいて通常ノード216、226、236が近傍ノード群として抽出された場合、初期ノード210は、通常ノード216、226、236に同じID(この例ではID#6)を割り当てる。そして、初期ノード210は、例えば、ID空間401のID#6に通常ノード216を割り当て、ID空間402のID#6に通常ノード226を割り当て、ID空間403のID#6に通常ノード236を割り当てる。
通常ノード216、226、236の参加によりノードの割り当てが変更されたため、各ノードが保持するルーティングテーブルが更新される。また、図6に示した例のようにKey#0、#1、…、#7がノードに割り当てられている場合、通常ノード216、226、236の参加によりキーの割り当ても変更される。この例では、初期ノード210及び通常ノード220、230に割り当てられていたKey#5、Key#6が通常ノード216、226、236に割り当てられる。
上記のような参加の要求があると、初期ノード210は、以下の流れで処理を実行する(図18を参照)。
(S101)参加処理部245は、通常ノード216から参加の要求を受け付ける。
(S102)参加処理部245は、参加の要求を出した通常ノード216からノードの情報(IP Address)を取得する。また、参加処理部245は、通常ノード216をノードプール410に追加する。つまり、参加処理部245は、通常ノード216の情報をノードプール情報241fに記載する。
(S103)参加処理部245は、ノードプール情報241fを参照し、ノードプール410に収容されているノードの数が閾値ThJ以上であるか否かを判定する。閾値ThJは、例えば、ID空間の数(多重度)より大きい数に設定される。ノードの数が閾値ThJ以上である場合、処理はS104へと進む。一方、ノードの数が閾値ThJ未満である場合、処理はS108へと進む。
(S104)参加処理部245は、RTTデータ241gを参照し、RTTの小さいN個(NはID空間の多重度)のノードを選択する。なお、近傍ノード群が抽出されている場合、参加処理部245は、N個のノードを含む近傍ノード群のノードを選択する。例えば、参加処理部245は、N個のノードから選択される全てのノードのペアについて測定されたRTTの合計値を基準に、その合計値が最小になるノードの組を選択する。
(S105)参加処理部245は、S104で選択したノードに同じIDを割り当てる。このとき、参加処理部245は、ID空間401、402、403の中でノードが割り当てられていないIDの中から1つのIDを特定し、特定したIDをS104で選択したノードに割り当てる。未割り当てのIDが複数ある場合、例えば、参加処理部245は、未割り当てのIDからランダムに1つのIDを選択してノードに割り当てる。
(S106)参加処理部245は、同じIDを割り当てたN個のノードに対して異なるID空間401、402、403への参加を指示する。つまり、参加処理部245は、ID空間401、402、403の同じIDにそれぞれ1つのノードを割り当てる。
(S107)参加処理部245は、同じIDを割り当てたN個のノードに対して、各ノードの情報(IP Address)を通知する。つまり、参加処理部245は、これらN個のノードが同IDノードリストを生成できるように、各ノードの情報を収集して各ノードに通知する。S107の処理が完了すると、図18に示した一連の処理は終了する。
(S108)参加処理部245は、参加の要求を出した通常ノード216に対し、プール保持状態であることを通知する。なお、プール保持状態とは、ノードプール410に収容され、IDへの割り当てを待機している状態を言う。プール保持状態の通知を受けた通常ノード216は、初期ノード210からIDが割り当てられるのを待機する状態となる。S108の処理が完了すると、図18に示した一連の処理は終了する。
ここまで、ノードの参加時に実行される処理の流れについて説明してきた。
(KVS操作)
次に、図19を参照しながら、KVS操作(KVSデータに対する操作)の受け付け時に実行される処理の流れについて説明する。図19は、第2実施形態に係るKVS操作の受け付け時に実行される処理の流れについて説明するためのフロー図である。なお、ここでは説明の都合上、初期ノード210が操作の要求を受け付けた場合を例に説明する。
(S111)操作処理部242は、KVS操作(KVSデータに対する操作)の指示を受け付ける。KVS操作の指示は、操作対象の値に紐付けられるキーの情報を含む。また、KVS操作としては、例えば、値の格納(put)、値の取得(get)、値の削除(del)などがある。
(S112)操作処理部242は、受け付けたKVS操作の指示が自ノード(初期ノード210)宛ての指示であるか否かを判定する。
例えば、操作処理部242は、初期ノード210に割り当てられているキーの集合に、KVS操作の指示で指定されたキーが含まれる場合、自ノード宛ての指示であると判定する。自ノード宛ての指示であると判定した場合、処理はS113へと進む。一方、自ノード宛ての指示ではないと判定した場合、処理はS114へと進む。
(S113)操作処理部242は、KVS操作の指示に応じた処理を実行する。
例えば、指示が値の格納(put)である場合、操作処理部242は、指示に応じてキーと値とのペアをKVSデータ241aとして記憶部241に格納する。指示が値の取得(get)である場合、操作処理部242は、指定されたキーに対応する値を記憶部241から取得し、取得した値をKVS操作の要求元に返す。指示が値の削除(del)である場合、操作処理部242は、指定されたキーと値とを記憶部241から削除する。
また、操作処理部242は、実行したKVS操作の内容と、初期ノード210が所属するID空間401の情報とを操作履歴241bに記録する。S113の処理が完了すると、図19に示した一連の処理は終了する。
(S114)操作処理部242は、KVS操作の指示を宛先ノード(指定されたキーを保持するノード)に転送する。
例えば、操作処理部242は、指示に含まれるキーの情報を探索処理部243に通知し、そのキーを保持するノードのIP Addressを要求する。この要求を受けた探索処理部243は、ルーティングテーブル241cを参照し、通知されたキーを保持するノード(Successor)を特定する。そして、探索処理部243は、特定したノードのIP Addressを操作処理部242に通知する。
操作処理部242は、探索ノードのIP Addressとして、同じIDに割り当てられている複数のノードのIP Addressを探索処理部243から取得する。操作処理部242は、取得したIP Addressのうち、初期ノード210と同じID空間401に属するノードのIP Addressを選択し、選択したIP AddressにKVS操作の指示を転送する。
(S115)操作処理部242は、KVS操作の指示を転送した後、宛先ノードから応答が返ってくるまでの時間(応答待ち時間)を計測する。そして、操作処理部242は、応答待ち時間が閾値ThR以上であるか否かを判定する。閾値ThRは任意に設定可能であるが、例えば、初期ノード210と宛先ノードとの間のRTTにマージンを加えた予測値に基づいて設定される。応答待ち時間が閾値ThR以上の場合、処理はS117へと進む。一方、応答待ち時間が閾値ThR以上でない場合、処理はS116へと進む。
(S116)操作処理部242は、KVS操作の転送先(宛先ノード)から応答を受信する。
KVS操作が値の格納(put)や削除(del)である場合、操作処理部242は、宛先ノードにおける処理の完了を示す応答を受信する。KVS操作が値の取得(get)である場合、操作処理部242は、宛先ノードから応答として、指定されたキーに対応する値を取得する。この場合、操作処理部242は、取得した値をKVS操作の要求元に返す。S116の処理が完了すると、図19に示した一連の処理は終了する。
(S117)操作処理部242は、S114でKVS操作を転送した転送先と同じIDのノード(宛先ノード)があるか否かを判定する。
例えば、操作処理部242は、探索処理部243から取得したIP Addressのうち、初期ノード210とは異なるID空間402、403に属するノードのIP Addressを特定する。そして、操作処理部242は、特定したIP Addressに対して稼働確認のメッセージを送信する。
送信したメッセージに対して少なくとも1つの応答が得られた場合、操作処理部242は、宛先ノードがあると判定する。宛先ノードがあると判定した場合、処理はS118へと進む。なお、複数のノードから応答が得られた場合、操作処理部242は、未選択のノードから1つのノードを宛先ノードとして選択する。一方、宛先ノードがないと判定した場合、処理はS119へと進む。
(S118)操作処理部242は、KVS操作の指示を宛先ノード(同じIDのノード)に転送する。S118の処理が完了すると、処理はS115へと進む。
(S119)操作処理部242は、KVS操作がエラー終了した際の処理(エラー処理)を実行する。例えば、操作処理部242は、KVS操作の操作元に対し、KVS操作がエラー終了した旨を通知する。S119の処理が完了すると、図19に示した一連の処理は終了する。
ここまで、KVS操作(KVSデータに対する操作)の受け付け時に実行される処理の流れについて説明してきた。
(操作履歴の同期・ノードの死活監視)
次に、図20〜図22を参照しながら、同期及び死活監視の処理の流れについて説明する。図20は、第2実施形態に係る同期及び死活監視の処理について説明するための図である。図21は、第2実施形態に係る同期及び死活監視の処理の流れについて説明するための第1のシーケンス図である。図22は、第2実施形態に係る同期及び死活監視の処理の流れについて説明するための第2のシーケンス図である。
図20の例は、同じIDに割り当てられている通常ノード214、224、234の間で操作履歴及びKVSデータを同期する様子を示している。なお、同期の処理は、予め設定された周期又はタイミングで実行されてもよいし、あるノードでKVS操作が完了し、操作履歴が更新されたタイミングで実行されてもよい。
図20の例では、通常ノード234がKey#3にval03を格納する操作(put)を受け付け、通常ノード224がKey#4にval04を格納する操作(put)を受け付けた段階までの操作履歴が同期済である。この状態で通常ノード214がKey#3の値val03を削除する操作(del)を受け付けた場合、図20に示すように、この操作は未同期の操作履歴となる。
この未同期の操作履歴は通常ノード224、234に未通知であるから、通常ノード214は、未通知の操作履歴を通常ノード224、234に通知し、操作履歴の同期を要求する。この要求を受けた通常ノード224、234は、通知された操作履歴をそれぞれ自身の操作履歴(未同期の操作履歴)に追加する。また、通常ノード224、234は、追加した操作履歴に基づいて、それぞれ自身のKVSデータを更新する。この例ではKey#3の値val03が削除される。
また、通常ノード214は、それぞれ未同期の操作履歴についてチェックサムを計算し、計算したチェックサムを通常ノード224、234に通知する。また、通常ノード214は、通常ノード224、234から、それぞれが持つ未同期の操作履歴について計算されたチェックサムを取得する。そして、通常ノード214は、通常ノード224、234から取得したチェックサムと、計算したチェックサムとが一致する場合、そのチェックサムの計算に用いた未同期の履歴を同期済に変更し、同期済に変更した履歴にバージョン情報を付与する。
図20の例では、未同期から同期済に変更された履歴に対し、バージョン情報(Ver.002)が付与されている。なお、通常ノード224、234も同様にチェックサムの比較を実施し、比較したチェックサムが全て一致した場合に、未同期の履歴を同期済に変更し、同期済に変更した履歴にバージョン情報(Ver.002)を付与する。
上記のように、同期の際、同じIDに割り当てられている全てのノードが通信を実施する。そのため、同期を実施する際に通信不可の状態にあるノードを検出することができる。例えば、通常ノード214は、通常ノード224、234にそれぞれ稼働状況を確認するメッセージを送信し、そのメッセージに対する応答が得られるか否かを確認する(死活監視)。そして、通常ノード214は、応答が得られたノードを対象に同期を実施する。
通常ノード214に未通知の操作履歴がある場合、同じIDに割り当てられている通常ノード214、224、234が実行する処理は、例えば、以下の流れで実行される(図21を参照)。
(S121、S122)通常ノード214は、未通知の操作履歴を通常ノード224、234に送信する。このとき、通常ノード214は、同IDノードリストを参照し、通常ノード214と同じIDに割り当てられている通常ノード224、234のIP Addressに対して未通知の操作履歴を送信する。
(S123、S124)通常ノード214から未通知の操作履歴を受信した通常ノード224、234は、受信を完了した旨を示す応答を通常ノード214に返す。
(S125)通常ノード214は、通常ノード224、234から応答を受信し、応答の有無に基づいて通信が不可の状態にあるノードの数(通信不可ノード数)をカウントする。この例では通常ノード224、234が通信可能な状態にあるため、通信不可ノード数は0となる。
また、通常ノード214は、通信不可ノード数が閾値ThN以上であるか否かを判定する。閾値ThNは1以上の任意の数に設定できるが、例えば、ID空間の多重数から1を減じた数(この例では2)に設定することができる。
ID空間の多重度が3の場合、通信不可ノード数が2の状態とは、通常ノード214と同じIDに割り当てられている他のノードが全て離脱した状態(正常に通信できない状態)にあることを意味する。つまり、KVSデータの冗長性が失われている状態である。後述するように、このような状態にある場合、その冗長性を回復するための処理が実行される。S125の状態では通信不可ノード数が0であるから、通常ノード214は、通信不可ノード数が閾値ThN以上ではないと判定し、そのまま動作を継続する。
(S126、S127)通常ノード224は、通常ノード214から受信した未通知の操作履歴に基づいて自身が保持する操作履歴を更新する(図20を参照)。また、通常ノード224は、更新後の操作履歴にある未実行のKVS操作(未通知の操作履歴に対応するKVS操作)を自身が保持するKVSデータに適用する。そして、通常ノード224は、そのまま動作を継続する。
(S128、S129)通常ノード234は、通常ノード214から受信した未通知の操作履歴に基づいて自身が保持する操作履歴を更新する(図20を参照)。また、通常ノード234は、更新後の操作履歴にある未実行のKVS操作(未通知の操作履歴に対応するKVS操作)を自身が保持するKVSデータに適用する。そして、通常ノード234は、そのまま動作を継続する。
S125、S127、S129の処理が完了した後、通常ノード214、224、234はそのまま動作を継続する。そして、ある時点で通常ノード234が離脱し(後述するS130の処理)、さらに、通常ノード214が未通知の操作履歴を他のノードに通知する同期の処理が生じる場合、以下のように処理が進行する。
(S130)通常ノード234が離脱する場合としては、例えば、通信環境の悪化や通常ノード234の電源断などがある。また、通常ノード234の利用者により多重化分散KVSシステムから離脱する操作が行われた場合などでも通常ノード234が離脱する。
(S131、S132)同期の処理を実行するタイミングで、通常ノード214は、未通知の操作履歴を通常ノード224、234に送信する。このとき、通常ノード214は、同IDノードリストを参照し、通常ノード214と同じIDに割り当てられている通常ノード224、234のIP Addressに対して未通知の操作履歴を送信する。
(S133)通常ノード214から未通知の操作履歴を受信した通常ノード224は、受信を完了した旨を示す応答を通常ノード214に返す。一方、通常ノード234は既に離脱しているため、通常ノード214から通常ノード234に送信された未通知の操作履歴は通常ノード234に到達しない。そのため、通常ノード234は、未通知の操作履歴に対する応答を送信しない。
(S134)通常ノード214は、通常ノード224から応答を受信し、応答の有無に基づいて通信が不可の状態にあるノードの数(通信不可ノード数)をカウントする。この例では通常ノード224から応答が得られ、通常ノード234からは応答が得られていないため、通信不可ノード数は1となる。
また、通常ノード214は、通信不可ノード数が閾値ThN以上であるか否かを判定する。S134の段階では通信不可ノード数が1であるから、通常ノード214は、通信不可ノード数が閾値ThN以上ではないと判定し、そのまま動作を継続する。つまり、通常ノード214の他に、同じIDに割り当てられている通常ノード224が正常稼働しており、KVSデータの冗長性が維持されているため、通常ノード214の運用がそのまま継続される。
(S135、S136)通常ノード224は、通常ノード214から受信した未通知の操作履歴に基づいて自身が保持する操作履歴を更新する(図20を参照)。また、通常ノード224は、更新後の操作履歴にある未実行のKVS操作(未通知の操作履歴に対応するKVS操作)を自身が保持するKVSデータに適用する。そして、通常ノード224は、そのまま動作を継続する。
上記のように、多重化分散KVSシステムでは、同じIDに割り当てられているノードが複数存在するため、一部のノードが離脱しても、KVSデータの冗長性が失われない限り、そのまま運用を継続することができる。もちろん、完全に冗長性が失われる前に、冗長性が低下した段階で対処する仕組みにすることもできる。
例えば、ID空間の多重度がW(W≧4)の場合、同じIDに割り当てられているノードの数が2になった時点で冗長性を回復するための処理を実施する仕組みに変形することができる。つまり、ID空間の多重度に応じて閾値ThNを適切に変形することで、KVSデータの消失に対するリスクを好適に抑制することができる。
ここで、通信不可ノード数が閾値ThN未満となった場合に実行される処理の流れについて説明する(図22を参照)。
(S141、S142)通常ノード224、234が離脱する。
(S143、S144)同期の処理を実行するタイミングで、通常ノード214は、未通知の操作履歴を通常ノード224、234に送信する。このとき、通常ノード214は、同IDノードリストを参照し、通常ノード214と同じIDに割り当てられている通常ノード224、234のIP Addressに対して未通知の操作履歴を送信する。
但し、通常ノード224、234は既に離脱しているため、未通知の操作履歴は通常ノード224、234に到達しない。そして、通常ノード214は、通常ノード224、234から未通知の操作履歴に対する応答を得ることができない。
(S145)通常ノード214は、応答の有無に基づいて通信が不可の状態にあるノードの数(通信不可ノード数)をカウントする。この例では通常ノード224、234から応答が得られないため、通信不可ノード数は2となる。また、通常ノード214は、通信不可ノード数が閾値ThN以上であるか否かを判定する。
S145の状態では通信不可ノード数が2であるから、通常ノード214は、通信不可ノード数が閾値ThN以上であると判定する。つまり、通常ノード214の他に、正常稼働している同じIDのノードが存在せず、KVSデータの冗長性が失われている。この場合、通常ノード214は、その対処としてS146以降の処理を実行する。
(S146)通常ノード214は、KVS操作の受け付けを停止する。
(S147)通常ノード214は、通常ノード214の機能を移管する移管先のノード(代替ノード)を特定する。
例えば、通常ノード214は、自身が離脱した場合に、自身が保持するキーの割当先となるノードを探索し、そのノードを代替ノードとする。図6の例でID#4のノードが離脱する場合、ID#4のノードが保持するKey#3、Key#4は、ID#0のノードに移管される。この場合、通常ノード214は、ID#0のノード(初期ノード210)を代替ノードとする。なお、操作の受け付けを停止した後に、通常ノード214に対して要求されたKVS操作は、代替ノードに転送される。
(S148、S149)通常ノード214は、自身が保持しているKVSデータを代替ノードに移管する。そして、通常ノード214は、自身の離脱を各ノードに通知すると共に、初期ノード210に対して参加を要求する。初期ノード210に参加を要求することで、通常ノード214はノードプール410に収容される。
上記のように、各ノードは、同期処理の中で通信不可ノード数を監視し、同じIDに割り当てられているノードの多重化が維持されているかを確認する。そして、ノードの多重化が十分でなく、KVSデータの冗長性が低下していると判断される状況にある場合、そのIDに割り当てられているノードを離脱させてノードプールに戻す制御が実施される。ノードプールに十分な数のノードがあれば、それら複数のノードが共通するIDに割り当てられ、KVSデータの冗長性が回復される。
ここまで、同期及び死活監視の処理の流れについて説明してきた。
(同期確認・バージョン更新)
次に、図23及び図24を参照しながら、同期処理及びバージョン更新の処理の流れについて説明する。図23は、第2実施形態に係る同期確認及びバージョン更新の処理について説明するための図である。図24は、第2実施形態に係る同期確認及びバージョン更新の処理の流れについて説明するためのシーケンス図である。
図23の例は、通常ノード214、224、234の間で未同期の操作履歴について同期確認を実施し、同期確認がとれた操作履歴に対してバージョンを付与する処理(バージョン更新)の様子を示している。なお、操作履歴の内容は、最上段が最も古く、最下段が最も新しい操作となる(t1<t2<t3)。
上述したように、通常ノード214、224、234は、各自が受け付けた操作を相互に通知し、各自が保持する操作履歴及びKVSデータに反映させる。そのため、通常ノード214、224、234がいずれも正常に動作していれば、同じ操作の組が操作履歴に含まれる。しかし、各自が操作を受け付けるタイミングと、他のノードが受け付けた操作の通知を各自が受け取るタイミングとが異なるため、操作履歴に記載される操作の順序は、図23に示すように各自で異なることがある。
そのため、通常ノード214、224、234は、同期確認の対象となる操作の集合に、同じ操作の組が含まれていれば同期の処理が完了していると判断する。この判断には、操作の順序に関係なく、同じ操作の組を持つ操作の集合が入力された場合に同じ値を出力する関数(チェックサム関数f)が利用される。例えば、操作Op#1、Op#2を含む2つの集合S12(S12={Op#1,Op#2})、S21(S21={Op#2,Op#2})とが与えられた場合、f(S12)とf(S21)とは等しくなる。
図23に示すように、通常ノード214が保持する操作履歴のうちt1からt2の間における操作の集合をQ1とし、t1からt3の間における操作の集合をQ2と表記する。また、通常ノード224が保持する操作履歴のうちt1からt2の間における操作の集合をQ3とし、t1からt3の間における操作の集合をQ4とする。また、通常ノード234が保持する操作履歴のうちt1からt2の間における操作の集合をQ5とし、t1からt3の間における操作の集合をQ6とする。
この場合、通常ノード214、224、234の操作履歴に反映されるタイミングの違いから、t2の時点で同期確認が実施されると、「f(Q1)≠f(Q3)」及び「f(Q3)≠f(Q5)」となり、同期の処理が完了していないと判断される。一方、t3の時点で同期確認が実施されると、「f(Q2)=f(Q4)=f(Q6)」となるから、通常ノード214、224、234は、同期の処理が完了していると判断する。そのため、図23の例では、Q2、Q4、Q6に対してバージョン情報が付与される。
なお、同じIDに割り当てられているノードのうち、同期確認を開始するノードは予め設定されていてもよいし、ランダムに選択されてもよい。例えば、通常ノード214が同期確認を開始する場合、以下のような流れで処理が実行される(図24を参照)。
(S151)通常ノード214は、自身が保持する操作履歴のうち未同期の操作履歴についてチェックサムを計算する。なお、チェックサムの値は、操作の順序に関係なく、同じ操作の組を持つ操作の集合が入力された場合に同じ値を出力する関数(図23のチェックサム関数fを参照)を用いて計算される。
(S152、S153)通常ノード214は、同じIDに割り当てられている通常ノード224、234に対し、各自が保持する未同期の操作履歴についてチェックサムを計算し、計算したチェックサムを通知するように要求する。
(S154、S155)通常ノード224は、自身が保持する操作履歴のうち未同期の操作履歴についてチェックサムを計算する。なお、通常ノード224は、通常ノード214がチェックサムの計算に利用した関数と同じ関数を利用してチェックサムを計算する。そして、通常ノード224は、計算したチェックサムを通常ノード214に通知する。
(S156、S157)通常ノード234は、自身が保持する操作履歴のうち未同期の操作履歴についてチェックサムを計算する。なお、通常ノード234は、通常ノード214がチェックサムの計算に利用した関数と同じ関数を利用してチェックサムを計算する。そして、通常ノード234は、計算したチェックサムを通常ノード214に通知する。
(S158、S159)通常ノード214は、S151で計算したチェックサムと、通常ノード224、234から通知されたチェックサムとを比較する。比較したチェックサムが全て一致した場合、通常ノード214は、S160に処理を進める。一方、不一致となるチェックサムの組がある場合、通常ノード214は、同期確認の処理を終了する。
(S160)通常ノード214は、S151でチェックサムの計算に利用した未同期の操作履歴を同期済に変更し、同期済に変更した操作履歴にバージョン情報を設定する。例えば、通常ノード214は、過去に同期済の操作履歴に対して付与されているバージョン情報(図20の例ではVer.001)を参照し、新たに同期済に変更した操作履歴に対して、最新のバージョンを表すバージョン情報(Ver.002)を付与する。
(S161、S162)通常ノード214は、同期済に変更した操作履歴に対して付与したバージョン情報を通常ノード224、234に通知する。なお、通常ノード214は、チェックサムが全て一致した旨を通常ノード224、234に通知し、通常ノード224、234が自律的に操作履歴の種別変更(未同期→同期済)及びバージョン情報の付与を実施するように変形してもよい。
(S163)通常ノード224は、S154でチェックサムの計算に利用した未同期の操作履歴を同期済に変更し、同期済に変更した操作履歴に、通常ノード214から通知されたバージョン情報を設定する。
(S164)通常ノード234は、S156でチェックサムの計算に利用した未同期の操作履歴を同期済に変更し、同期済に変更した操作履歴に、通常ノード214から通知されたバージョン情報を設定する。S164の処理が完了すると、図24に示した同期確認及びバージョン更新に関する一連の処理は終了する。
ここまで、同期確認及びバージョン更新の処理の流れについて説明してきた。
(ノードの再参加)
次に、図25及び図26を参照しながら、再参加及び同期の処理の流れについて説明する。図25は、第2実施形態に係る再参加及び同期の処理について説明するための図である。図26は、第2実施形態に係る再参加及び同期の処理の流れについて説明するためのシーケンス図である。
図25の例は、一旦離脱した通常ノード234が再参加する際に実施される同期の様子を示している。通常ノード234が移動端末である場合、通信環境の変化により一時的に通信不可の状態になることがある。この場合、通常ノード234は、図21(S132、S134を参照)のように、離脱した状態にあると判断される。
仮に、一時的に離脱状態になった通常ノード234を新たなIDに割り当てて再参加させると、通常ノード234が保持しているKVSデータ及び操作履歴は利用できなくなる。一方、一時的に通信不可の状態になった後、すぐに通常ノード234の通信状態が復旧する場合、通常ノード234を元のIDに再参加させ、既に保持しているKVSデータや操作履歴を利用して運用を継続できれば、システムの負担を低減できる。
図21を参照しながら説明したように、多重化分散KVSシステムでは、同じIDに割り当てられているノードの一部が離脱した場合でも、残りのノードで運用が継続される。そのため、残りのノードで運用が継続されている際、一時的に離脱したノードを元のIDに再参加させ、図25に示すように、離脱期間に更新されている操作履歴を同期させれば、再参加したノードを加えた状態で運用を継続することができる。
図25の例では、再参加した通常ノード234が、運用を継続している通常ノード214、224から操作履歴を取得する。このとき、通常ノード234は、自身が保持する操作履歴の最新バージョンを通常ノード214、224に通知し、自身が保持する操作履歴と、通常ノード214、224が保持する操作履歴との差分を取得する。
例えば、通常ノード214は、通常ノード234から通知された最新バージョンと、自身が保持する操作履歴のバージョンとを照合し、その最新バージョンより新しいバージョンに対応する操作履歴を特定する。そして、通常ノード214は、特定した操作履歴のうち、自身が受け付けたKVS操作の内容を差分として通常ノード234に通知する。このとき、通常ノード214は、通知するKVS操作のバージョン情報を併せて通知する。
同様に、通常ノード224は、通常ノード234から通知された最新バージョンと、自身が保持する操作履歴のバージョンとを照合し、その最新バージョンより新しいバージョンに対応する操作履歴を特定する。そして、通常ノード224は、特定した操作履歴のうち、自身が受け付けたKVS操作の内容を差分として通常ノード234に通知する。このとき、通常ノード224は、通知するKVS操作のバージョン情報を併せて通知する。
通常ノード234は、通常ノード214、224から差分として通知されたKVS操作の内容及びバージョン情報を自身の操作履歴に追加すると共に、そのKVS操作を自身のKVSデータに反映させる。この処理により、通常ノード214、224、234のKVSデータが同期される。
上記のように通常ノード234が再参加する場合、通常ノード234及び通常ノード234と同じIDに割り当てられている通常ノード214、224は、以下の流れで処理を実行する(図26を参照)。
(S171、S172)通常ノード234が離脱する。その後、通常ノード234が再参加する。なお、離脱から再参加までの期間が所定期間(例えば、1秒など)より短い場合に再参加を許可する仕組みとしてもよい。
(S173、S174)通常ノード234は、稼働確認のメッセージを通常ノード214、224に送信する。このとき、通常ノード224は、同IDノードリストを参照し、通常ノード234と同じIDに割り当てられている通常ノード214、224のIP Addressに対して稼働確認のメッセージを送信する。
(S175、S176)通常ノード234から稼働確認のメッセージを受信した通常ノード214、224は、受信を完了した旨を示す応答を通常ノード234に返す。
なお、この例では通常ノード214、224が稼働しているため、通常ノード214、224から稼働確認のメッセージに対する応答が通常ノード234に返される。しかし、図22の例のように、既に通常ノード214、224が離脱している場合、稼働確認のメッセージに対する応答は通常ノード234に返されない。この場合、通常ノード234は、再参加の処理を終了し、例えば、初期ノード210に参加を要求する。
(S177、S178)通常ノード234は、自身が保持する操作履歴の最新バージョンを通常ノード214、224に通知し、操作履歴の差分を要求する。
(S179)通常ノード224は、通常ノード234から通知された最新バージョンと、自身が保持する操作履歴のバージョンとを照合し、その最新バージョンより新しいバージョンに対応する操作履歴を特定する。そして、通常ノード224は、特定した操作履歴のうち、自身が受け付けたKVS操作の内容を差分として通常ノード234に通知する。このとき、通常ノード224は、通知するKVS操作のバージョン情報を併せて通知する。
(S180)通常ノード214は、通常ノード234から通知された最新バージョンと、自身が保持する操作履歴のバージョンとを照合し、その最新バージョンより新しいバージョンに対応する操作履歴を特定する。そして、通常ノード214は、特定した操作履歴のうち、自身が受け付けたKVS操作の内容を差分として通常ノード234に通知する。このとき、通常ノード214は、通知するKVS操作のバージョン情報を併せて通知する。
(S181、S182)通常ノード234は、通常ノード214、224から受信した操作履歴の差分に基づいて自身が保持する操作履歴を更新する。また、通常ノード234は、更新後の操作履歴にある未実行のKVS操作(操作履歴の差分に対応するKVS操作)を自身が保持するKVSデータに適用する。S181までの処理が完了した後、通常ノード214、224、234はそのまま動作を継続する。
上記のように、一時的に離脱したノードを元のIDに割り当て、同じIDに割り当てられている他のノードと操作履歴を同期してKVSデータを更新することで、多重化分散KVSシステムは離脱前の状態に復旧する。このような再参加を許容することで、新たなノードの参加に伴うルーティングテーブルの再構築、キーの再割り当て、KVSデータの移管などの処理を省略することができ、頻繁にノードの参加・離脱があってもシステムの性能低下を抑制することができる。
さらに、同期済の操作履歴にバージョン情報を付与することで、同期状況の把握が容易になり、ノードが再参加する際に操作履歴の差分を利用して操作履歴及びKVSデータの同期が可能になる。その結果、再参加にかかる通信負荷及び処理負荷がさらに低減でき、頻繁にノードの参加・離脱があってもシステムの性能低下を抑制することができる。
ここまで、再参加及び同期の処理の流れについて説明してきた。
(RTT測定)
次に、図27を参照しながら、RTT測定時の処理の流れについて説明する。図27は、第2実施形態に係るRTT測定時の処理の流れについて説明するためのフロー図である。なお、ここでは説明の都合上、初期ノード210がRTTを測定する場合を例に説明する。
(S191)プール管理部244は、ノードプール情報241fを参照し、ノードプール410からノードのペアを選択する。
(S192)プール管理部244は、S191で選択したノード間のRTTを測定する。例えば、プール管理部244は、選択したペアの一方に対して他方のIP Addressを通知し、IPネットワークにおけるノードの到達性を確認するためのソフトウェアであるpingを利用してRTTを測定するように指示する。そして、プール管理部244は、指示を与えたノードからRTTを取得する。
(S193)プール管理部244は、S191で選択したノードのペアと、S192で取得したRTTとを対応付け、RTTデータ241gとして記憶部241に保存する。
(S194)プール管理部244は、全てのペアを選択し終えたか否かを判定する。全てのペアを選択し終えた場合、処理はS195へと進む。一方、未選択のペアがある場合、処理はS191へと進む。
(S195)プール管理部244は、RTTデータ241gを参照し、RTTが相互にThT(例えば、100ミリ秒など)より小さくなるノードの集合(近傍ノード群)を特定する(クラスタリング)。
例えば、プール管理部244は、ノードプール410からID空間の多重度と同じ数のノードを選択し、選択したノードのペア毎にRTTが閾値ThTより小さいか否かを判定する。そして、全てのペアのRTTが閾値ThTより小さい場合、プール管理部244は、選択したノードの集合を近傍ノード群(図15を参照)として特定する。
S195の処理が完了すると、図27に示した一連の処理は終了する。
以上、多重化分散KVSシステムにおいて実行される処理の流れについて説明した。
上記のように、多重化分散KVSシステムは、識別子を割り当てる論理空間を多重化し、識別子に割り当てるノードを冗長化させてKVSデータの冗長化を図ることで、ノードの離脱によるデータの消失を防止している。また、同じ識別子に割り当てられた一部のノードが離脱しても冗長性が許容可能な範囲で維持されている場合には残りのノードで運用が継続される。
そのため、ノードの離脱頻度が高い場合でも、離脱時に生じる処理負担を低減でき、システムの性能を安定的に維持することができる。また、一時的に離脱したノードが再参加する際、元の識別子に割り当てて他のノードと操作履歴を同期するため、ノードの離脱と再参加が頻繁に繰り返される場合でも、ルーティングテーブルの再計算などを省略でき、システムの性能が好適に維持される。つまり、ルーティングテーブルの更新コストや同期用データの転送コストを低減でき、参加・離脱の頻度が高いノードを多数含むシステムに第2実施形態の技術を適用した場合の効果は格別なものとなる。
さらに、同期済の操作履歴にバージョン情報を付与することで、同期状況の把握が容易になり、ノードが再参加する際に操作履歴の差分を利用して操作履歴及びKVSデータの同期が可能になる。その結果、再参加にかかる通信負荷及び処理負荷がさらに低減でき、頻繁にノードの参加・離脱があってもシステムの性能低下を抑制することができる。つまり、参加・離脱の頻度が高いノードを多数含むシステムに第2実施形態の技術を適用した場合の効果は更に格別なものとなる。
なお、識別子を割り当てる論理空間の規定やキーの探索アルゴリズムなどについてChordの方式を例に説明を進めてきたが、他のDHTやSkip Graphなどの方式に対しても第2実施形態の技術を適用可能である。つまり、論理空間の多重化、同一識別子に割り当てられるノードの一部が離脱した場合の処理、及び再参加時の処理などは、他の方式に同様に当てはめることが可能であり、こうした方式を採用する変形例についても当然に第2実施形態の技術的範囲に属する。
以上、第2実施形態について説明した。