(57)【特許請求の範囲】
【請求項１】
所定の関数を適用して得られるキーと該キーに対応するデータのペアを複数のノードに分散して記憶するシステムを管理するコンピュータに、
複数のシステムに共通の識別子と、前記識別子に共通に割り当てられたキーと、前記識別子に割り当てられたノードの情報とを管理テーブルに記憶し、
前記識別子への割り当てが解除されたノードが再び該識別子に割り当てられるとき、該ノードの割り当てを前記管理テーブルに反映すると共に、該ノードと該識別子に割り当てられている他のノードとの間で前記ペアを同期させる
処理を実行させる、情報管理プログラム。
【請求項２】
前記識別子に割り当てられているノードが前記ペアの更新要求を受け付けたとき、前記ノードは、受け付けた更新要求の内容を含む履歴データを蓄積し、前記ノードと同じ識別番号に割り当てられている他のノードに該履歴データを提供して前記他のノードとの間で前記履歴データを共有し、
前記情報管理プログラムは、前記コンピュータに、
前記ノードが蓄積している前記履歴データと、前記他のノードが蓄積している前記履歴データとが同じであるかを確認し、同じである場合に該履歴データの版数を更新し、該版数に基づいて前記ペアの同期を実施するか否かを判断する
処理を実行させる、請求項１に記載の情報管理プログラム。
【請求項３】
前記情報管理プログラムは、前記コンピュータに、
再び割り当てられるノードが記憶する前記ペアの集合と前記他のノードが記憶する前記ペアの集合との間の差分を特定し、特定された前記差分について前記ペアの同期を実施する
処理を実行させる、請求項２に記載の情報管理プログラム。
【請求項４】
前記情報管理プログラムは、前記コンピュータに、
前記再び割り当てられるノードの履歴データと、前記他のノードの履歴データとの差分を特定し、該差分として特定された更新要求の内容に基づいて前記再び割り当てられるノードが記憶する前記ペアを更新することで、前記ペアの同期を実施する
処理を実行させる、請求項３に記載の情報管理プログラム。
【請求項５】
所定の関数を適用して得られるキーと該キーに対応するデータのペアを複数のノードに分散して記憶するシステムを管理するコンピュータが、
複数のシステムに共通の識別子と、前記識別子に共通に割り当てられたキーと、前記識別子に割り当てられたノードの情報とを管理テーブルに記憶し、
前記識別子への割り当てが解除されたノードが再び該識別子に割り当てられるとき、該ノードの割り当てを前記管理テーブルに反映すると共に、該ノードと該識別子に割り当てられている他のノードとの間で前記ペアを同期させる
情報管理方法。
【請求項６】
所定の関数を適用して得られるキーと該キーに対応するデータのペアを複数のノードに分散して記憶するシステムを管理する情報管理装置であって、
複数のシステムに共通の識別子と、前記識別子に共通に割り当てられたキーと、前記識別子に割り当てられたノードの情報とを記憶する管理テーブルが格納される記憶部と、
前記識別子への割り当てが解除されたノードが再び該識別子に割り当てられるとき、該ノードの割り当てを前記管理テーブルに反映すると共に、該ノードと該識別子に割り当てられている他のノードとの間で前記ペアを同期させる制御部と
を有する、情報管理装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報管理プログラム、情報管理方法、及び情報管理装置に関する。
【背景技術】
【０００２】
世の中に存在する様々なデバイスに通信機能を持たせ、そのデバイスによる遠隔計測や、そのデバイスから収集される情報の活用などを実現するＩｏＴ（Internet of Things）技術が広く普及しつつある。こうしたＩｏＴ技術を活用する上で、各種デバイスによって収集される大量の情報をより効率良く管理し、所望の情報をより素早く検索できるようにする技術の開発が望まれている。
【０００３】
大量の情報を効率良く管理する方法としては、例えば、検索時に用いるキーを紐付けた情報（値）を複数の場所（ノード）に分散して格納する自律分散ＫＶＳ（Key-Value Store）と呼ばれる技術がある。自律分散ＫＶＳのシステムでは、キーと値のペアが格納されるノードを一意に決定できるようにしてキーによる値の検索を可能にするために、ＤＨＴ（Distributed Hash Table）やＳｋｉｐ  Ｇｒａｐｈなどのアルゴリズムが利用される。
【０００４】
例えば、ＤＨＴの１つであるＣｈｏｒｄでは、予め設定された複数のＩＤ（IDentification）に所定の規則に基づいてノードが割り当てられ、各ＩＤに対するノードの割り当てに応じてノードへのキーの割り当てが決定される。つまり、自律分散ＫＶＳのシステムへのノードの参加や離脱に対し、ノードの割り当てやキーの割り当てが自律的に決定される。そのため、自律分散ＫＶＳのシステムでは、ノードの追加や削減が容易であり、高いスケーラビリティを実現することが可能である。
【０００５】
なお、キー情報とデータとを関連付けてノードに格納し、キー情報のハッシュ値が属する範囲に対応付けてノードを管理し、データの格納先を変更する際に範囲とノードとの対応関係を変更することで、データの割り当てを柔軟に変更可能にする技術が提案されている。また、ノードの増減を管理する情報を利用し、離脱したノードが保持するデータ（欠損データ）のキーが属する範囲を特定する方法が提案されている。また、キーと、そのキーに対応するデータの元データとを含む登録情報をＤＨＴのノードに記憶させる際に、データのハッシュ値から登録情報の順序を決め、その順序に基づいて同一ノードに記憶させる登録情報を決定する方法が提案されている。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開２０１３−６１７３９号公報
【特許文献２】特開２０１５−３５１８２号公報
【特許文献３】特開２００９−２０７５７号公報
【非特許文献】
【０００７】
【非特許文献１】David Karger, Eric Lehman, Tom Leighton, Matthew Levine, Daniel Lewin, Rina Panigrahy, "Consistent Hashing and Random Trees: Distributed Caching Protocols for Relieving Hot Spots on the World Wide Web", http://dl.acm.org.citation.cfm?id=383071
【発明の概要】
【発明が解決しようとする課題】
【０００８】
自律分散ＫＶＳのシステムでは、ノードが離脱すると、そのノードに格納されているキーと値のペア（ＫＶペア）が失われる。そのため、自律分散ＫＶＳのシステムでは、上記の提案技術のようにＫＶペアを複製して複数のノードに格納し、そのＫＶペアの消失を防止する対策がとられる。しかし、ノードの参加や離脱が頻繁に生じると、ＫＶペアを他のノードへ複製する際に生じるノード間の通信負荷が大きくなる。
【０００９】
また、ノードの参加や離脱が生じると、ノードの検索に用いる情報の更新処理が発生する。そのため、頻繁なノードの参加や離脱はノードの処理負荷も増大させうる。例えば、参加や離脱が頻繁に生じうる移動端末などをノードとするシステムでは、通信環境が短時間で変化しうるため、一旦離脱したノードがすぐに再参加するケースが頻発しうる。再参加の度に新規参加の場合と同じ処理（ＫＶペアの複製など）を実行すると、ノード間の通信負荷やノードの処理負荷が増大してシステム性能が低下するリスクがある。
【００１０】
１つの側面によれば、本開示の目的は、ノードが再参加する際の負荷を低減することが可能な、情報管理プログラム、情報管理方法、及び情報管理装置を提供することにある。
【課題を解決するための手段】
【００１１】
本開示の１つの側面によれば、所定の関数を適用して得られるキーと該キーに対応するデータのペアを複数のノードに分散して記憶するシステムを管理するコンピュータが、複数のシステムに共通の識別子と、識別子に共通に割り当てられたキーと、識別子に割り当てられたノードの情報とを管理テーブルに記憶し、識別子への割り当てが解除されたノードが再び該識別子に割り当てられるとき、該ノードの割り当てを管理テーブルに反映すると共に、該ノードと該識別子に割り当てられている他のノードとの間でペアを同期させる情報管理方法が提供される。
【発明の効果】
【００１２】
ノードが再参加する際の負荷を低減することができる。
【図面の簡単な説明】
【００１３】
【図１】第１実施形態に係る情報管理装置の一例を示した図である。
【図２】自律分散ＫＶＳシステムの一例（Ｃｈｏｒｄ）について説明するための第１の図である。
【図３】自律分散ＫＶＳシステムの一例（Ｃｈｏｒｄ）について説明するための第２の図である。
【図４】自律分散ＫＶＳシステムの一例（Ｃｈｏｒｄ）について説明するための第３の図である。
【図５】第２実施形態に係る多重化分散ＫＶＳシステムの一例を示した図である。
【図６】第２実施形態に係る多重化分散ＫＶＳシステムにおけるノードの管理について説明するための図である。
【図７】第２実施形態に係るノードが保持するルーティングテーブルの一例を示した図である。
【図８】第２実施形態に係るノードの機能を実現可能なハードウェアの一例を示した図である。
【図９】第２実施形態に係る初期ノードが有する機能の一例を示したブロック図である。
【図１０】第２実施形態に係る操作履歴の一例を示した図である。
【図１１】第２実施形態に係るルーティングテーブルの一例を示した図である。
【図１２】第２実施形態に係る初期ノードリストの一例を示した図である。
【図１３】第２実施形態に係る同ＩＤノードリストの一例を示した図である。
【図１４】第２実施形態に係るノードプール情報の一例を示した図である。
【図１５】第２実施形態に係るＲＴＴデータの一例を示した図である。
【図１６】第２実施形態に係る通常ノードが有する機能の一例を示したブロック図である。
【図１７】第２実施形態に係るノードの割り当て方法について説明するための図である。
【図１８】第２実施形態に係るノードの参加時に実行される処理の流れについて説明するためのフロー図である。
【図１９】第２実施形態に係るＫＶＳ操作の受け付け時に実行される処理の流れについて説明するためのフロー図である。
【図２０】第２実施形態に係る同期及び死活監視の処理について説明するための図である。
【図２１】第２実施形態に係る同期及び死活監視の処理の流れについて説明するための第１のシーケンス図である。
【図２２】第２実施形態に係る同期及び死活監視の処理の流れについて説明するための第２のシーケンス図である。
【図２３】第２実施形態に係る同期確認及びバージョン更新の処理について説明するための図である。
【図２４】第２実施形態に係る同期確認及びバージョン更新の処理の流れについて説明するためのシーケンス図である。
【図２５】第２実施形態に係る再参加及び同期の処理について説明するための図である。
【図２６】第２実施形態に係る再参加及び同期の処理の流れについて説明するためのシーケンス図である。
【図２７】第２実施形態に係るＲＴＴ測定時の処理の流れについて説明するためのフロー図である。
【発明を実施するための形態】
【００１４】
以下に添付図面を参照しながら、本発明の実施形態について説明する。なお、本明細書及び図面において実質的に同一の機能を有する要素については、同一の符号を付することにより重複説明を省略する場合がある。
【００１５】
＜１．第１実施形態＞
図１を参照しながら、第１実施形態について説明する。第１実施形態は、ＤＨＴなどを利用して自律分散ＫＶＳを実現するシステムにおいてノードの離脱による情報の消失を防止する技術に関する。また、第１実施形態は、頻繁にシステムへの参加・離脱を繰り返す可能性のあるノードが存在する場合でも、ノードの離脱時に生じるノード間の通信負荷やノードの処理負荷を低減する仕組みに関する。
【００１６】
なお、図１は、第１実施形態に係る情報管理装置の一例を示した図である。図１に示した情報管理装置１０は、第１実施形態に係る情報管理装置の一例である。また、情報管理装置１０は、ノードの参加や離脱を管理する役割が割り当てられているノード（初期ノード）の１つである。図１の例において、情報管理装置１０は、ノードＮ０１に対応する。
【００１７】
図１に示すように、情報管理装置１０は、記憶部１１及び制御部１２を有する。
なお、記憶部１１は、ＲＡＭ（Random Access Memory）などの揮発性記憶装置、或いは、ＨＤＤ（Hard Disk Drive）やフラッシュメモリなどの不揮発性記憶装置である。制御部１２は、ＣＰＵ（Central Processing Unit）やＤＳＰ（Digital Signal Processor）などのプロセッサである。但し、制御部１２は、ＡＳＩＣ（Application Specific Integrated Circuit）やＦＰＧＡ（Field Programmable Gate Array）などの電子回路であってもよい。制御部１２は、例えば、記憶部１１又は他のメモリに記憶されたプログラムを実行する。
【００１８】
情報管理装置１０は、割り当てられたキーに対応する情報（値）を保持するノードを管理する。ノードは、例えば、携帯電話やスマートフォンなどの移動端末、カーナビゲーションシステムなどの車載端末、或いは、パーソナルコンピュータやサーバ装置などの情報処理装置である。また、ノードは、ＬＡＮ（Local Area Network）やインターネットなどのネットワークを利用して他のノードと通信する機能を有する。
【００１９】
制御部１２は、複数の識別番号（ＩＤ）が設定されているＩＤ空間の識別番号にノードを割り当て、ＩＤ空間へのノードの割り当てに基づいて個々のノードにキーを割り当てることで、識別番号を介して特定のキーを保持するノードを特定可能にする。なお、複数の識別番号にはそれぞれ１つのノードが割り当てられうる。また、１つのＩＤ空間に割り当てられているノードの集合は１つのシステムを形成する。
【００２０】
図１には、３つのＩＤ空間２１、２２、２３が例示されている。ＩＤ空間２１は、例えば、８つの黒点を有する１つのリングで表現される。黒点の近傍に記載されている数字は、その黒点の位置に対応する識別番号である。黒点を囲む円は、その黒点に対応する識別番号に割り当てられているノードを表す。図１の例では、ＩＤ空間２１の識別番号「０」にノードＮ０１が割り当てられている。
【００２１】
制御部１２は、識別番号の設定が共通するＩＤ空間２１、２２、２３を利用してノードを管理する。つまり、制御部１２は、ＩＤ空間２１、２２、２３に対応する複数のシステムを管理する。図１に示すように、ＩＤ空間２２、２３は８つの黒点を有する１つのリングで表現され、その黒点の位置にＩＤ空間２１と同じ識別番号が設定される。
【００２２】
なお、図１には３つのＩＤ空間を利用する例を示しているが、利用するＩＤ空間の数は２又は４以上であってもよい。また、図１の例では、説明の都合上、個々のＩＤ空間について、ＤＨＴの１つであるＣｈｏｒｄのＩＤ空間と同じ表現を用いているが、採用するアルゴリズムの種類に応じて表現を変形することが可能である。つまり、ＩＤ空間の多重化を実現する第１実施形態の技術を適用可能な範囲でＩＤ空間の表現を変形してもよい。
【００２３】
記憶部１１は、ＩＤ空間２１、２２、２３に対応する複数のシステムについて、同じ識別番号に割り当てられているノードが保持する情報の同期状況を記憶する。
ＩＤ空間２１、２２、２３の同じ識別番号に割り当てられているノードには、同じキーと値とが対応付けて格納される。また、１つのノードに対し、あるキーを指定して、そのキーに対応する値に対する操作（ＫＶＳ操作）が要求された場合、指定されたキーを保持するノードでＫＶＳ操作が実行される。そして、ＫＶＳ操作を実行したノードは、実行したＫＶＳ操作の履歴（操作履歴）を蓄積する。
【００２４】
また、第１実施形態では、あるノードでＫＶＳ操作が実行されると、そのノードと同じ識別番号に割り当てられている全てのノードに操作の内容が通知され、その通知を受けた各ノードが通知に応じてＫＶＳ操作を実行する。そして、ＫＶＳ操作を実行したノードは、実行したＫＶＳ操作の履歴（操作履歴）を蓄積する。つまり、同じ識別番号に割り当てられているノードの間で操作履歴が同期される。そして、各ノードは、操作履歴の同期状況を保持する。例えば、各ノードは、操作履歴のうち同期の完了が確認できた操作の集合に対して同期状況を管理するためのバージョン番号を付与する。
【００２５】
図１の例において、ノードＮ０１に対応する情報管理装置１０の記憶部１１は、操作履歴４１として、キーＫ５に値Ｖ５を対応付けて格納する操作（ｐｕｔ）と、キーＫ７に値Ｖ７を対応付けて格納する操作（ｐｕｔ）とを記憶している。この状況でノードＮ０１がＩＤ空間２１に対応するシステムから離脱した場合、離脱している間、同じ識別番号に割り当てられているノードＮ０２、Ｎ０３がＫＶＳ操作を受け付けてもノードＮ０１が保持する操作履歴は更新されない。
【００２６】
第１実施形態に係る自律分散ＫＶＳシステムでは、同じ識別番号に割り当てられている複数のノードのうち、一部のノードが離脱しても、残りのノードが所定数（例えば、２）以上あれば残りのノードが運用を継続する。そして、残りのノードが運用を継続している間に、離脱したノードが再参加した場合、再参加したノードを離脱前の識別番号に割り当てて運用が継続される。このような仕組みがあることで、頻繁にノードが参加・離脱する場合でも、特定のキーを保持するノードの探索に用いる情報（ルーティングテーブル）の更新などにかかる負荷を低減でき、システム性能の低下を効果的に抑制することができる。
【００２７】
但し、再参加するノードの離脱中に、同じ識別番号に割り当てられている他のノードがＫＶＳ操作を受け付けている場合、再参加時にＫＶＳ操作の同期が行われる。同期の方法としては、再参加するノードが、同じ識別番号に割り当てられている他のノードから操作履歴を取得する方法を採用することができる。
【００２８】
例えば、ノードＮ０１の離脱中に、ノードＮ０２がキーＫ５に対応する値Ｖ５の削除操作（ｄｅｌ）を受け付けた場合、この削除操作がノードＮ０２の操作履歴４２に反映される。また、ノードＮ０３がキーＫ７に対応する値Ｖ７の削除操作（ｄｅｌ）を受け付けた場合、この削除操作がノードＮ０３の操作履歴４３に反映される。また、これらの削除操作の内容はノードＮ０２、Ｎ０３の間で同期され、操作履歴４２、４３に反映される。そして、ノードＮ０２、Ｎ０３の間で同期の確認が行われ、同期状況（バージョン番号Ｖｅｒ．００２）が操作履歴４２、４３に付与される。
【００２９】
その後、ノードＮ０１が離脱前と同じ識別番号「０」に再び割り当てられたとき、制御部１２は、同じ識別番号「０」に割り当てられているノードＮ０２、Ｎ０３が保持する情報と、再び割り当てられたノードＮ０１が保持する情報とを同期させる。このとき、制御部１２は、同期状況の情報（Ｖｅｒ．００１）をノードＮ０２、Ｎ０３に通知し、ノードＮ０２、Ｎ０３に操作履歴の差分を要求する。
【００３０】
ノードＮ０２、Ｎ０３は、それぞれ操作履歴４２、４３を参照し、通知された同期状況の情報（Ｖｅｒ．００１）に基づいて、ノードＮ０１が保持する操作履歴の操作より新しい操作を特定する。図１の例では、新しい同期状況の情報（Ｖｅｒ．００２）が付与された操作（ノードＮ０１の離脱時に実行された削除操作）が特定される。この場合、ノードＮ０２は、自身が受け付けたキーＫ５に関する削除操作を差分としてノードＮ０１に通知する。また、ノードＮ０３は、自身が受け付けたキーＫ７に対する削除操作を差分としてノードＮ０１に通知する。
【００３１】
未同期の情報として上記の通知を受けると、制御部１２は、通知された操作の内容を記憶部１１が記憶している操作履歴に追加させる。そして、制御部１２は、操作履歴に追加した操作を自身が保持するキー及び値に反映させる。
【００３２】
上記のように、第１実施形態に係る情報管理方法は、所定の関数を適用して得られるキーと該キーに対応するデータのペアを複数のノードに分散して記憶するシステムを管理するコンピュータが次の処理を実行する仕組みと表現できる。
【００３３】
第１の処理は、複数のシステムに共通の識別子と、識別子に共通に割り当てられたキーと、識別子に割り当てられたノードの情報とを管理テーブル１１ａに記憶する処理である。第２の処理は、識別子への割り当てが解除されたノードが再び該識別子に割り当てられるとき、該ノードの割り当てを管理テーブル１１ａに反映すると共に、該ノードと該識別子に割り当てられている他のノードとの間でペアを同期させる処理である。
【００３４】
これまで説明してきたように、第１実施形態の自律分散ＫＶＳシステムは、同じノードの割り当てを有する複数のシステムを含み、同じ識別番号に割り当てられているノードには同じキーが割り当てられる。また、各システムのＩＤ空間に設定されている識別番号の系列が同じであるため、指定されたキーに対応する情報の操作が識別番号を介して各システムのノードに反映される。そのため、キーと値のペア、及びノードの関係がシステム間で容易に同期されうる。
【００３５】
その結果、複製されたシステムが存在するのと同じ状態になり、一部のシステムにあるノードが離脱しても、他のシステムにあるノードが情報を保持しているため、ノードの離脱による情報の消失を防止することができる。また、第１実施形態の技術を適用すれば、同じＩＤ空間に割り当てられている複数のノードに対し、バックアップ用に同じ情報を保持させなくても情報の消失を防止できる。そのため、ノードの参加や離脱の際にバックアップ用の情報をノード間でやり取りする負担やルーティングテーブルの更新にかかる負担などを回避することができる。
【００３６】
結果として、頻繁に参加と離脱を繰り返すノードが存在しても、参加と離脱時に生じる通信負荷や処理負荷の増大が抑制される。また、第１実施形態では、一時的に離脱したノードが離脱前と同じ識別番号に割り当てて運用を継続することを許容しているため、このような通信負荷や処理負荷の抑制を効果的に実現できる。さらに、各ノードが操作履歴の同期状況を保持しているため、再参加したノードが同じ識別番号に割り当てられている他のノードから操作履歴を受け取る際に、操作履歴の差分を特定することが容易になる。つまり、ノード間で操作履歴の差分をやり取りすれば済むため、通信負荷や処理負荷を抑制することができる。
【００３７】
以上、第１実施形態について説明した。
＜２．第２実施形態＞
次に、第２実施形態について説明する。第２実施形態は、ＤＨＴなどを利用して自律分散ＫＶＳを実現するシステム（自律分散ＫＶＳシステム）においてノードの離脱による情報の消失を防止する技術に関する。また、第２実施形態は、頻繁にシステムへの参加・離脱を繰り返す可能性のあるノードが存在する場合でも、ノードの離脱時に生じるノード間の通信負荷やノードの処理負荷を低減する仕組みに関する。
【００３８】
［２−１．自律分散ＫＶＳシステムの例］
自律分散ＫＶＳシステムでは、指定されたキーに対する値を保持しているノードを特定できるようにするＤＨＴなどの技術が利用される。ここでは、ＤＨＴの１つであるＣｈｏｒｄについて説明すると共に、自律分散ＫＶＳシステムで利用できる他の技術について述べる。なお、説明の都合上、Ｃｈｏｒｄのアルゴリズムを主な例として挙げるが、第２実施形態の技術を適用可能な範囲はこれに限定されない。
【００３９】
（Ｃｈｏｒｄ）
図２〜図４を参照しながら、自律分散ＫＶＳシステムの実現に利用可能なＣｈｏｒｄのアルゴリズム（以下、単にＣｈｏｒｄと称する。）について説明する。
【００４０】
なお、図２は、自律分散ＫＶＳシステムの一例（Ｃｈｏｒｄ）について説明するための第１の図である。図３は、自律分散ＫＶＳシステムの一例（Ｃｈｏｒｄ）について説明するための第２の図である。図４は、自律分散ＫＶＳシステムの一例（Ｃｈｏｒｄ）について説明するための第３の図である。
【００４１】
Ｃｈｏｒｄでは、リング状のＩＤ空間にＩＤを割り振り、設定された規則に基づいてＩＤに対するノードの割り当て及びノードに対するキーの割り当てを決めることで、特定のキーが割り当てられたノードを一意に決める仕組みを実現している。
【００４２】
図２の例は、ｍビット（ｍ＝３）のＩＤが割り振られたＩＤ空間に３つのノード（Ｎｏｄｅ＃０、Ｎｏｄｅ＃１、Ｎｏｄｅ＃３）を割り当てる方法を示している。また、図２の例は、３つのキー（Ｋｅｙ＃１、Ｋｅｙ＃２、Ｋｅｙ＃６）をノードに割り当てる方法を示している。
【００４３】
Ｎｏｄｅ＃ｉ（ｉ＝０，１，３）は「ＩＤ＝ｉ」の位置（以下、ＩＤ＃ｉと表記する。）に割り当てられる。なお、Ｎｏｄｅ＃ｉが割り当てられているＩＤをＮｏｄｅＩＤと表記する場合がある。また、Ｋｅｙ＃ｊの識別子は「ｊ」であり、この識別子をＫｅｙＩＤと表記する場合がある。
【００４４】
ＩＤ空間のノードにＫｅｙ＃ｊを割り当てるとき、Ｃｈｏｒｄでは、ＩＤ＃ｊ（ＫｅｙＩＤと同じ値のＩＤ）にノードが割り当てられている場合には、そのノードにＫｅｙ＃ｊが割り当てられる。一方、ＩＤ＃ｊにノードが割り当てられていない場合、リング上で、ＩＤ＃ｊより先にあるＩＤのうち、ノードが割り当てられている直近のＩＤ（Ｎｅｘｔ  ＮｏｄｅＩＤ）が特定され、Ｎｅｘｔ  ＮｏｄｅＩＤに割り当てられているノードにＫｅｙ＃ｊが割り当てられる。
【００４５】
図２の例では、ＩＤ＃１にＮｏｄｅ＃１が割り当てられているため、Ｋｅｙ＃１は、Ｎｏｄｅ＃１に割り当てられる。また、ＩＤ＃２にノードが割り当てられていないため、次にノードが割り当てられているＩＤ＃３にあるＮｏｄｅ＃３にＫｅｙ＃２が割り当てられる。同様に、ＩＤ＃６にノードが割り当てられていないため、次にノードが割り当てられているＩＤ＃０にあるＮｏｄｅ＃０にＫｅｙ＃６が割り当てられる。
【００４６】
Ｎｏｄｅ＃０、Ｎｏｄｅ＃１、Ｎｏｄｅ＃３は、それぞれＫｅｙ＃１、Ｋｅｙ＃２、Ｋｅｙ＃６の探索に利用するルーティングテーブルを保持している。ルーティングテーブルは、探索するキーのＫｅｙＩＤを含む範囲（Ｉｎｔｅｒｖａｌ）、及びそのキーを保持しているノード（Ｓｕｃｃｅｓｓｏｒ）に関する情報を有する。
【００４７】
例えば、図２（Ａ）は、Ｎｏｄｅ＃０が保持するルーティングテーブルである。Ｃｈｏｒｄの場合、ルーティングテーブルには、ｍ個のＩｎｔｅｒｖａｌと、各Ｉｎｔｅｒｖａｌに対応するＳｕｃｃｅｓｓｏｒのＩＤとが格納される。Ｉｎｔｅｒｖａｌは、ＮｏｄｅＩＤ（ｎ）及びルーティングテーブルの行番号（ｋ）に基づいて算出される。Ｉｎｔｅｒｖａｌの始点（Ｓｔａｒｔ（ｎ，ｋ））は、下記の式（１）により与えられる。
【００４８】
Ｓｔａｒｔ（ｎ，ｋ）＝（ｎ＋２k-1）  ｍｏｄ  ２m
…（１）
そして、Ｉｎｔｅｒｖａｌは、Ｓｔａｒｔ（ｎ，ｋ）以上、Ｓｔａｒｔ（ｎ＋１，ｋ）未満の範囲に設定される。例えば、ｎ＝０、ｋ＝１の場合、Ｓｔａｒｔ（０，１）は１となり、Ｓｔａｒｔ（１，１）は２となる。そのため、Ｎｏｄｅ＃０が保持するルーティングテーブルの１行目に記述されるＩｎｔｅｒｖａｌは１以上２未満となる。
【００４９】
Ｓｕｃｃｅｓｓｏｒ（図中ではＳｕｃ．と略記）は、Ｓｔａｒｔと同じ値のＩＤにノードが割り当てられている場合、Ｓｔａｒｔの値がＳｕｃｃｅｓｓｏｒの値となる。一方、Ｓｔａｒｔと同じ値のＩＤにノードが割り当てられていない場合、リング上でＳｔａｒｔの値と同じＩＤより先にあるＩＤのうち、ノードが割り当てられているＩＤ（Ｎｅｘｔ  ＮｏｄｅＩＤ）がＳｕｃｃｅｓｓｏｒの値となる。例えば、ｎ＝０、ｋ＝１の場合、Ｓｕｃｃｅｓｓｏｒは１となる。
【００５０】
同様に、ｋ＝２，３の場合についてＩｎｔｅｒｖａｌ及びＳｕｃｃｅｓｓｏｒを求めると、図２（Ａ）に示すようなルーティングテーブルが得られる。また、Ｎｏｄｅ＃１が保持するルーティングテーブルは、図２（Ｂ）のようになる。そして、Ｎｏｄｅ＃３が保持するルーティングテーブルは、図２（Ｃ）のようになる。
【００５１】
例えば、Ｎｏｄｅ＃１に対し、Ｋｅｙ＃２に紐付けられる値への操作が要求された場合、Ｎｏｄｅ＃１は、ルーティングテーブルを参照し、ＫｅｙＩＤである「２」を含むＩｎｔｅｒｖａｌ（［２，４））を特定する。そして、Ｎｏｄｅ＃１は、特定したＩｎｔｅｒｖａｌに対応するＳｕｃｃｅｓｓｏｒ（ＩＤ＃３にあるＮｏｄｅ＃３）がＫｅｙ＃２を保持していることを認識し、受け付けた操作をＮｏｄｅ＃３に要求する。
【００５２】
上記のように、Ｃｈｏｒｄは、ＩＤに対するノードの割り当てに基づいてキーの割り当てが決まるようにし、各ノードが特定のキーを保持するノードを探索できる仕組みを有する。そして、各ノードは、ノードの割り当てに基づいて予め計算されるＩｎｔｅｒｖａｌ及びＳｕｃｃｅｓｓｏｒを含むルーティングテーブルを保持し、このルーティングテーブルを利用して特定のキーを保持するノードを探索し、キーに紐付けられる値の操作を実施する。
【００５３】
また、新たなノードがＩＤ空間に追加される場合（ノードの参加）、少なくとも一部のノードが保持するルーティングテーブルが更新される。また、ノードの割り当てが変更されるため、キーの割り当ても更新されうる。
【００５４】
例えば、図３に示すように、Ｎｏｄｅ＃６が新たに参加した場合、Ｋｅｙ＃６はＮｏｄｅ＃６に割り当てられる。また、Ｎｏｄｅ＃０が保持するルーティングテーブルのうち、３行目のＳｕｃｃｅｓｓｏｒが「６」に変更される（図３（Ａ）を参照）。また、Ｎｏｄｅ＃１が保持するルーティングテーブルのうち、３行目のＳｕｃｃｅｓｓｏｒが「６」に変更される（図３（Ｂ）を参照）。また、Ｎｏｄｅ＃３が保持するルーティングテーブルのうち、１、２行目のＳｕｃｃｅｓｓｏｒが「６」に変更される（図３（Ｃ）を参照）。
【００５５】
Ｎｏｄｅ＃６が保持するルーティングテーブル（図３（Ｄ）を参照）の計算方法、及びＮｏｄｅ＃０、Ｎｏｄｅ＃１、Ｎｏｄｅ＃３が保持するルーティングテーブルの計算方法は、図２に示したルーティングテーブルの計算と同じである。このように、ノードの参加に応じて、キーの再割り当てやルーティングテーブルの更新が行われる。また、ＩＤ空間からノードが削除される場合（ノードの離脱）、図４（Ｎｏｄｅ＃１が離脱する例）に示すように、キーの再割り当てやルーティングテーブルの更新が行われる。
【００５６】
（その他の技術）
特定のキーを保持するノードを効率的に探索できるようにする仕組みとしては、上述したＣｈｏｒｄの他、ＣＡＮ（Content Addressable Network）、Ｐａｓｔｒｙ、ＫａｄｅｍｌｉａなどのＤＨＴがある。ＣＡＮは、キーを写像する論理空間（ＣｈｏｒｄのＩＤ空間に対応）としてＮ次元トーラスを採用する方式である。Ｐａｓｔｒｙは、論理空間としてＰａｓｔｒｙアルゴリズムを採用する方式である。Ｋａｄｅｍｌｉａは、論理空間として２分木を採用する方式である。また、各種ＤＨＴの他、自律分散ＫＶＳシステムの実現にＳｋｉｐ  Ｇｒａｐｈを利用することもできる。
【００５７】
第２実施形態に係る技術は、上述した様々な仕組みを採用する自律分散ＫＶＳシステムに広く適用可能である。
［２−２．多重化分散ＫＶＳシステム］
次に、図５〜図７を参照しながら、第２実施形態に係る多重化分散ＫＶＳシステムについて説明する。
【００５８】
図５は、第２実施形態に係る多重化分散ＫＶＳシステムの一例を示した図である。図６は、第２実施形態に係る多重化分散ＫＶＳシステムにおけるノードの管理について説明するための図である。図７は、第２実施形態に係るノードが保持するルーティングテーブルの一例を示した図である。
【００５９】
図５に示すように、第２実施形態に係る多重化分散ＫＶＳシステムは、例えば、制御装置１００、ＧＷ（Gateway）装置２００−１、２００−２、…、２００−Ｎ、及び端末装置３０１、３０２、３０３を有する。
【００６０】
制御装置１００は、例えば、パーソナルコンピュータやサーバ装置などのコンピュータである。ＧＷ装置２００−１、２００−２、…、２００−Ｎ、端末装置３０１、３０２、３０３は、例えば、パーソナルコンピュータ、携帯電話、スマートフォン、カーナビゲーションシステム、タブレット端末などの移動端末である。制御装置１００とＧＷ装置２００−１、２００−２、…、２００−Ｎとはネットワーク３００を介して通信することができる。ＧＷ装置２００−１は、ＢＴ（Bluetooth：登録商標）などの近距離通信を利用して端末装置３０１、３０２、３０３と通信することができる。
【００６１】
制御装置１００、ＧＷ装置２００−１、２００−２、…、２００−Ｎ、及び端末装置３０１、３０２、３０３は、それぞれＵＲＩ（Uniform Resource Identifier）やＩＰアドレスなどの特定情報に基づいて識別されうる。また、ＧＷ装置２００−１、２００−２、…、２００−Ｎ、及び端末装置３０１、３０２、３０３の少なくとも一部は、ＧＰＳ（Global Positioning System）、温度センサ、加速度センサなどの機能を有し、その機能を利用して取得した情報（センサ情報）を保持することができる。
【００６２】
例えば、端末装置３０１、３０２、３０３は、自身が保持するセンサ情報の種類や特徴と、自身の特定情報とを短距離通信でＧＷ装置２００−１に送信する。ＧＷ装置２００−１は、端末装置３０１、３０２、３０３の特定情報をそれぞれキーに紐付けて保持する。また、ＧＷ装置２００−２、…、２００−Ｎは、それぞれがセンサ情報を取得して保持し、自身の特定情報をキーに紐付けて保持する。この場合、ＧＷ装置２００−１、２００−２、…、２００−Ｎがそれぞれ自律分散ＫＶＳシステムのノードとなり、センサ情報の格納先を示す特定情報が、キーに紐付けられる値となる。
【００６３】
制御装置１００は、自律分散ＫＶＳシステムへの参加・離脱を管理するノード（初期ノード）を設定し、初期ノードに関する情報を他のノードに通知する機能を有する。例えば、制御装置１００は、Ｗｅｂサーバの機能を有し、その機能を利用して初期ノードに関する情報を他のノードに通知する。なお、図５の例は第２実施形態の技術を適用可能なシステムの一例を示したものであり、その適用範囲はこれに限定されない。但し、以下では、説明の都合上、ＧＷ装置２００−１、２００−２、…、２００−Ｎをノードと称する。
【００６４】
（ノードの種類・割り当て／キーの割り当て／ルーティングテーブル）
ノードには、初期ノードと通常ノードとがある。初期ノードは、ノードの参加や離脱を管理する機能（管理機能）を有するノードである。通常ノードは、初期ノードの管理機能が省略されたノードである。初期ノードは、制御装置１００により予め設定される。また、初期ノードが割り当てられているＩＤの情報は、制御装置１００により各ノードに通知される。また、初期ノード以外のノードは通常ノードとなる。
【００６５】
図６の例は、第２実施形態に係る多重化分散ＫＶＳシステムにおけるノードの割り当てを示している。図６に示すように、この多重化分散ＫＶＳシステムは、複数のＩＤ空間４０１、４０２、４０３を利用する。ＩＤ空間４０１、４０２、４０３は同じｍビットのＩＤ系列（ｍ＝３；ＩＤ＝０，１，…，７）を有する。
【００６６】
また、ＩＤ空間４０１、４０２、４０３の間ではノードの割り当てが共通となるように制御される。例えば、ＩＤ空間４０１のＩＤ＃０には初期ノード２１０が割り当てられている。この場合、ＩＤ空間４０２、４０３のＩＤ＃０にもノード（図６の例では通常ノード２２０、２３０）が割り当てられる。そして、ＩＤ空間４０１、４０２、４０３には同じＩＤ系列が設定され、ノードの割り当ても同じであるため、同じＩＤに割り当てられているノードには同じキー及び値が格納される。
【００６７】
図６の例では、ＩＤ空間４０１において、ＩＤ＃０に初期ノード２１０が割り当てられ、ＩＤ＃２に初期ノード２１２が割り当てられ、ＩＤ＃４に通常ノード２１４が割り当てられている。ＩＤ空間４０２では、ＩＤ＃０に通常ノード２２０が割り当てられ、ＩＤ＃２に通常ノード２２２が割り当てられ、ＩＤ＃４に通常ノード２２４が割り当てられている。ＩＤ空間４０３では、ＩＤ＃０に通常ノード２３０が割り当てられ、ＩＤ＃２に通常ノード２３２が割り当てられ、ＩＤ＃４に通常ノード２３４が割り当てられている。
【００６８】
例えば、ノードに割り当てられるキーとしてＫｅｙ＃０、Ｋｅｙ＃１、…、Ｋｅｙ＃７が用意されている場合、ＩＤ＃０に割り当てられているノードには、Ｋｅｙ＃５、Ｋｅｙ＃６、Ｋｅｙ＃７、Ｋｅｙ＃０が割り当てられる。ＩＤ＃２に割り当てられているノードには、Ｋｅｙ＃１、Ｋｅｙ＃２が割り当てられる。ＩＤ＃４に割り当てられているノードには、Ｋｅｙ＃３、Ｋｅｙ＃４が割り当てられる。そして、これらのキーに値が紐付けられ、そのキーを利用して値に対する操作が行われる。なお、ここではキーの割り当て方法の一例としてＣｈｏｒｄの規則（図２（Ｄ）を参照）を採用している。
【００６９】
このように、第２実施形態に係る多重化分散ＫＶＳシステムは、同じＩＤ系列を有するＩＤ空間を複数管理し、ＩＤに対するノードの割り当てを多重化することで、ノードごとキーと値のペアを冗長化する仕組みを採用している。この仕組みを実現するため、図６に示すように、初期ノード２１０、２１２は、それぞれノードプール４１０、４１２を管理する。ノードプール４１０、４１２は、システムへの参加を要求しているノードを一時的に収容し、ＩＤへの割り当てを待機させるためのプールである。
【００７０】
なお、ノードプール４１０、４１２は初期ノード２１０、２１２間の情報のやり取りにより同じ内容に維持される。図６の例では初期ノード２１０、２１２がそれぞれノードプール４１０、４１２を管理しているが、初期ノード２１０、２１２に共通のノードプールを１つ用意し、そのノードプールを初期ノード２１０、２１２のいずれか又は両方が管理する仕組みに変形できる。
【００７１】
例えば、初期ノード２１０が参加の要求を受け付けた場合、初期ノード２１０は、参加の要求を出したノードをノードプール４１０に一旦収容する。そして、初期ノード２１０は、ノードプール４１０に収容されているノードの数が、ＩＤ空間の数（図６の例では３）より大きいかを確認する。
【００７２】
収容されているノード数がＩＤ空間の数より大きい場合、初期ノード２１０は、ノードプール４１０からＩＤ空間の数と同数のノードを選択し、選択した各ノードに同じＩＤを割り振る。そして、初期ノード２１０は、ＩＤを割り振ったノードをＩＤ空間４０１、４０２、４０３の該当ＩＤに１つずつ割り当てる。この方法によれば、新規ノードの参加後もＩＤ空間４０１、４０２、４０３におけるノードの割り当てが同じ状態に維持される。
【００７３】
なお、第２実施形態に係る多重化分散ＫＶＳシステムの各ノードは、自身が属するＩＤ空間とは異なる他のＩＤ空間に属するノードにアクセスする機会がある。そのため、各ノードは、他のＩＤ空間に属するノードの情報を含むルーティングテーブルを保持する。例えば、ＩＤ＃０に割り当てられているノード（初期ノード２１０、通常ノード２２０、２３０）は、図７に示すようなルーティングテーブルを保持する。
【００７４】
図７に示すように、第２実施形態に係るルーティングテーブルは、ノードが割り当てられているＩＤ（ＮｏｄｅＩＤ：ｎ）、行番号ｋ、Ｓｔａｒｔ、Ｉｎｔｅｒｖａｌ、Ｓｕｃｃｅｓｓｏｒを有する。図２（Ａ）などに示したルーティングテーブルとの違いは、Ｓｕｃｃｅｓｓｏｒの欄に、他のＩＤ空間に属するノードの情報が含まれる点にある。
【００７５】
図７の例では、Ｓｕｃｃｅｓｓｏｒを特定するＩＤに加え、各ＩＤ空間のＳｕｃｃｅｓｓｏｒにアクセスするための情報（ＩＰ  Ａｄｄｒｅｓｓ）が記載されている。例えば、ｎ＝０、ｋ＝１に対応するＳｕｃｃｅｓｓｏｒのＩＤは２である。そして、ＩＤ＃２に割り当てられているＩＤ空間４０１、４０２、４０３のノードは、それぞれ初期ノード２１２、通常ノード２２２、２３２である。そのため、Ｓｕｃｃｅｓｓｏｒの欄には、初期ノード２１２、通常ノード２２２、２３２のＩＰ  Ａｄｄｒｅｓｓが記載される。
【００７６】
図７にはＩＤ＃０に割り当てられているノードが保持するルーティングテーブルの一例を示したが、他のＩＤに割り当てられているノードも、そのノードに対応するルーティングテーブルを保持している。そのため、あるＩＤ空間のノードが操作を受け付けたとき、そのノードは、自身が属するＩＤ空間から操作対象となる該当ノードを探索できるだけでなく、他のＩＤ空間から操作対象となる該当ノードを探索することが可能になる。
【００７７】
そして、上記のルーティングテーブルを利用することで、通信状態の良い該当ノードに操作を要求することができる。また、あるＩＤ空間の該当ノードが離脱した場合でも、他のＩＤ空間の該当ノードが処理を代替できるため、特別な処理を実行せずともシステムの運用を継続することができる。また、離脱したノードが再参加する際、離脱前のＩＤに割り当て、同じＩＤに割り当てられている他のノードと同期処理を実行することで、迅速に離脱前の状態へと復旧することが可能になる。
【００７８】
以上、多重化分散ＫＶＳシステムについて説明した。
［２−３．ハードウェア］
次に、図８を参照しながら、第２実施形態に係るノードの機能を実現可能なハードウェアについて説明する。図８は、第２実施形態に係るノードの機能を実現可能なハードウェアの一例を示した図である。
【００７９】
例えば、初期ノード２１０が有する機能は、図８に示すハードウェア資源を用いて実現することが可能である。つまり、初期ノード２１０が有する機能は、コンピュータプログラムを用いて図８に示すハードウェアを制御することにより実現される。
【００８０】
図８に示すように、このハードウェアは、主に、ＣＰＵ９０２と、ＲＯＭ（Read Only Memory）９０４と、ＲＡＭ９０６と、ホストバス９０８と、ブリッジ９１０とを有する。さらに、このハードウェアは、外部バス９１２と、インターフェース９１４と、入力部９１６と、出力部９１８と、記憶部９２０と、ドライブ９２２と、接続ポート９２４と、通信部９２６とを有する。
【００８１】
ＣＰＵ９０２は、例えば、演算処理装置又は制御装置として機能し、ＲＯＭ９０４、ＲＡＭ９０６、記憶部９２０、又はリムーバブル記録媒体９２８に記録された各種プログラムに基づいて各構成要素の動作全般又はその一部を制御する。ＲＯＭ９０４は、ＣＰＵ９０２に読み込まれるプログラムや演算に用いるデータなどを格納する記憶装置の一例である。ＲＡＭ９０６には、例えば、ＣＰＵ９０２に読み込まれるプログラムや、そのプログラムを実行する際に変化する各種パラメータなどが一時的又は永続的に格納される。
【００８２】
これらの要素は、例えば、高速なデータ伝送が可能なホストバス９０８を介して相互に接続される。一方、ホストバス９０８は、例えば、ブリッジ９１０を介して比較的データ伝送速度が低速な外部バス９１２に接続される。
【００８３】
入力部９１６としては、例えば、マウス、キーボード、タッチパネル、タッチパッド、ボタン、スイッチ、及びレバーなどが用いられる。また、入力部９１６としては、赤外線やその他の電波を利用して制御信号を送信することが可能なリモートコントローラが用いられることもある。また、入力部９１６は、ユーザが情報を入力するデバイスの他、ＧＰＳ、温度センサ、加速度センサなどのセンサ情報を収集し、収集した情報をＣＰＵ９０２などに入力するデバイスであってもよい。
【００８４】
出力部９１８としては、例えば、ＣＲＴ（Cathode Ray Tube）、ＬＣＤ（Liquid Crystal Display）、ＰＤＰ（Plasma Display Panel）、又はＥＬＤ（Electro-Luminescence Display）などのディスプレイ装置が用いられる。また、出力部９１８として、スピーカやヘッドホンなどのオーディオ出力装置、又はプリンタなどが用いられることもある。つまり、出力部９１８は、情報を視覚的又は聴覚的に出力することが可能な装置である。
【００８５】
記憶部９２０は、各種のデータを格納するための装置である。記憶部９２０としては、例えば、ＨＤＤなどの磁気記憶デバイスが用いられる。また、記憶部９２０として、ＳＳＤ（Solid State Drive）やＲＡＭディスクなどの半導体記憶デバイス、光記憶デバイス、又は光磁気記憶デバイスなどが用いられてもよい。
【００８６】
ドライブ９２２は、着脱可能な記録媒体であるリムーバブル記録媒体９２８に記録された情報を読み出し、又はリムーバブル記録媒体９２８に情報を書き込む装置である。リムーバブル記録媒体９２８としては、例えば、磁気ディスク、光ディスク、光磁気ディスク、又は半導体メモリなどが用いられる。
【００８７】
接続ポート９２４は、例えば、ＵＳＢ（Universal Serial Bus）ポート、ＩＥＥＥ１３９４ポート、ＳＣＳＩ（Small Computer System Interface）、ＲＳ−２３２Ｃポート、又は光オーディオ端子など、外部接続機器９３０を接続するためのポートである。外部接続機器９３０としては、例えば、プリンタなどが用いられる。
【００８８】
通信部９２６は、ネットワーク９３２に接続するための通信デバイスである。通信部９２６としては、例えば、有線又は無線ＬＡＮ用の通信回路、ＷＵＳＢ（Wireless USB）用の通信回路、光通信用の通信回路やルータ、ＡＤＳＬ（Asymmetric Digital Subscriber Line）用の通信回路やルータ、携帯電話ネットワーク用の通信回路などが用いられる。通信部９２６に接続されるネットワーク９３２は、有線又は無線により接続されたネットワークであり、例えば、インターネット、ＬＡＮ、放送網、衛星通信回線などを含む。
【００８９】
なお、初期ノード２１０以外のノードが有する機能も図８に示したハードウェアを用いて実現可能である。つまり、ＧＷ装置２００−１、２００−２、…、２００−Ｎが有する機能は図８に示したハードウェアを用いて実現可能である。また、制御装置１００及び端末装置３０１、３０２、３０３が有する機能も図８に示したハードウェアを用いて実現可能である。また、図８に示したハードウェアのうち一部の要素を省略する変形や、さらに要素を追加する変形も許容される。
【００９０】
以上、ハードウェアについて説明した。
［２−４．機能］
次に、ノードの機能について説明する。
【００９１】
（初期ノード）
まず、図９を参照しながら、初期ノードの機能について説明する。図９は、第２実施形態に係る初期ノードが有する機能の一例を示したブロック図である。なお、ここでは説明の都合上、初期ノード２１０の機能を例に説明する。
【００９２】
図９に示すように、初期ノード２１０は、記憶部２４１、操作処理部２４２、探索処理部２４３、プール管理部２４４、参加処理部２４５、同期処理部２４６、死活監視部２４７、及び離脱処理部２４８を有する。
【００９３】
なお、記憶部２４１の機能は、上述したＲＡＭ９０６や記憶部９２０などを用いて実現できる。操作処理部２４２、探索処理部２４３、プール管理部２４４、参加処理部２４５、同期処理部２４６、死活監視部２４７、及び離脱処理部２４８の機能は、上述したＣＰＵ９０２などを用いて実現できる。
【００９４】
記憶部２４１には、ＫＶＳデータ２４１ａ、操作履歴２４１ｂ、ルーティングテーブル２４１ｃ、初期ノードリスト２４１ｄ、同ＩＤノードリスト２４１ｅ、ノードプール情報２４１ｆ、及びＲＴＴデータ２４１ｇが格納される。
【００９５】
ＫＶＳデータ２４１ａは、初期ノード２１０に割り当てられているキー（図６の例ではＫｅｙ＃５、Ｋｅｙ＃６、Ｋｅｙ＃７、Ｋｅｙ＃０）と、そのキーに紐付けられて保持される値（Ｖａｌｕｅ）とのペアである。
【００９６】
操作履歴２４１ｂは、図１０に示すように、初期ノード２１０又は初期ノード２１０と同じＩＤに割り当てられているノードが受け付けた操作の履歴である。図１０は、第２実施形態に係る操作履歴の一例を示した図である。操作履歴２４１ｂには、同じＩＤに割り当てられているノードと同期済の履歴と、未同期の履歴とが含まれる。同期済の履歴には、バージョン情報（Ｖｅｒ．）が付与される。
【００９７】
図１０に例示した操作履歴２４１ｂには、Ｋｅｙ＃５に値ｖａｌ０５を紐付けて格納する操作（ｐｕｔ  Ｋｅｙ＃５  ｖａｌ０５）、Ｋｅｙ＃６に値ｖａｌ０６を紐付けて格納する操作（ｐｕｔ  Ｋｅｙ＃６  ｖａｌ０６）が含まれている。また、この操作履歴２４１ｂには、Ｋｅｙ＃５の値ｖａｌ０５を削除する操作（ｄｅｌ  Ｋｅｙ＃５  ｖａｌ０５）、Ｋｅｙ＃７に値ｖａｌ０７を紐付けて格納する操作（ｐｕｔ  Ｋｅｙ＃７  ｖａｌ０７）も含まれている。
【００９８】
操作履歴２４１ｂには、操作を受け付けたノードの所属するＩＤ空間の情報が併せて記載される。例えば、Ｋｅｙ＃５に値ｖａｌ０５を紐付けて格納する操作を初期ノード２１０が受け付けた場合、操作履歴２４１ｂには、初期ノード２１０が所属するＩＤ空間４０１の情報が記載される。同様に、初期ノード２１０と同じＩＤを有するノードが受け付け、実行した操作の履歴が、その操作を受け付けたノードの所属するＩＤ空間の情報に対応付けて操作履歴２４１ｂとして記憶部２４１に蓄積される。
【００９９】
バージョン情報は、同じＩＤに割り当てられているノードの間で未同期の履歴について同期完了が確認できた場合に、その未同期の履歴を同期済とするタイミングで、同期済とした履歴に付与される。つまり、同期完了の確認がとれた操作の集合に対し、確認の度に新たなバージョン情報が付与される。
【０１００】
ルーティングテーブル２４１ｃは、キーを保持するノードを探索する際に利用される情報である。例えば、初期ノード２１０が利用するルーティングテーブル２４１ｃは、図１１のようになる。図１１は、第２実施形態に係るルーティングテーブルの一例を示した図である。
【０１０１】
図１１に示すように、ルーティングテーブル２４１ｃには、例えば、行番号ｋ、Ｓｔａｒｔ、Ｉｎｔｅｒｖａｌ、Ｓｕｃｃｅｓｓｏｒが含まれる。また、Ｓｕｃｃｅｓｓｏｒの欄には、初期ノード２１０と同じＩＤ空間４０１に属するＳｕｃｃｅｓｓｏｒの情報（ＩＰ  Ａｄｄｒｅｓｓなど）の他、同じＩＤを有するＩＤ空間４０２、４０３のノードの情報（ＩＰ  Ａｄｄｒｅｓｓなど）が記載される。
【０１０２】
初期ノードリスト２４１ｄは、図１２に示すように、制御装置１００により設定された全ての初期ノードの情報（ＩＰ  Ａｄｄｒｅｓｓなど）を列挙した情報である。図１２は、第２実施形態に係る初期ノードリストの一例を示した図である。図６の例では、初期ノード２１０、２１２が設定されているため、図１２に例示した初期ノードリスト２４１ｄには、初期ノード２１０、２１２の情報が記載されている。
【０１０３】
同ＩＤノードリスト２４１ｅは、図１３に示すように、初期ノード２１０と同じＩＤに割り当てられているノードの情報（ＩＰ  Ａｄｄｒｅｓｓなど）を列挙した情報である。図１３は、第２実施形態に係る同ＩＤノードリストの一例を示した図である。図６の例では、初期ノード２１０と同じＩＤ＃０に通常ノード２２０、２３０が割り当てられているため、図１３に例示した同ＩＤノードリスト２４１ｅには、通常ノード２２０、２３０の情報が記載されている。
【０１０４】
ノードプール情報２４１ｆは、図１４に示すように、ノードプール４１０に収容されているノードの情報（ＩＰ  Ａｄｄｒｅｓｓなど）を含む。図１４は、第２実施形態に係るノードプール情報の一例を示した図である。例えば、ノードプール４１０に通常ノード２１６、…が収容されている場合、ノードプール情報２４１ｆには、通常ノード２１６、…の情報が記載される。
【０１０５】
ＲＴＴデータ２４１ｇは、図１５に示すように、ノードプール４１０に収容されているノードのペア毎に測定されたＲＴＴ（Round-Trip Time）を示すデータである。図１５は、第２実施形態に係るＲＴＴデータの一例を示した図である。ＲＴＴは、一方のノードから他方のノードにメッセージを送信し、そのメッセージに対する応答が他方のノードから一方のノードへと到達するまでにかかる時間である。ＲＴＴを参照することで、通信経路上におけるノード間の距離を評価することができる。
【０１０６】
例えば、ＲＴＴデータ２４１ｇを参照し、ＲＴＴが小さいノードの組み合わせを抽出（クラスタリング）することで、通信経路上で近傍にあるノードの集合（近傍ノード群）が得られる。多重化分散ＫＶＳシステムでは、同一ＩＤに割り当てられているノード間で操作要求の転送や操作履歴の同期などが実施されるため、同一ＩＤに割り当てられるノード間の距離が短いほどシステムの性能が向上する。そのため、第２実施形態に係る多重化分散ＫＶＳシステムでは、近傍ノード群に属するノードが同一ＩＤに割り当てられる。その際、ＲＴＴデータ２４１ｇが利用される。
【０１０７】
再び図９を参照する。
操作処理部２４２は、多重化分散ＫＶＳシステムの利用者又は他のノードから受け付けた操作の要求を処理する。
【０１０８】
例えば、利用者は、制御装置１００を介して初期ノード２１０に操作を要求する。初期ノード２１０に割り当てられているキーに関する操作である場合、操作処理部２４２は、その要求に応じて操作をＫＶＳデータ２４１ａに反映させる。また、操作処理部２４２は、受け付けた操作の内容と、自身が所属するＩＤ空間４０１の情報を操作履歴２４１ｂに記載する。受け付けた操作の要求が他のノードから出されたものである場合、操作処理部２４２は、上記と同様に、その操作をＫＶＳデータ２４１ａに反映させ、操作履歴２４１ｂに記載を追加する。
【０１０９】
探索処理部２４３は、ルーティングテーブル２４１ｃを参照し、指定されたキーを保持するノードを特定する。例えば、初期ノード２１０に割り当てられていないキーに対する操作の要求を操作処理部２４２が受け付けた場合、探索処理部２４３は、ルーティングテーブル２４１ｃに基づいて、そのキーに対応するＳｕｃｃｅｓｓｏｒのＩＤを特定する。
【０１１０】
例えば、Ｋｅｙ＃１（ＫｅｙＩＤ＝１）に対する操作の要求が受け付けられた場合、探索処理部２４３は、ルーティングテーブル２４１ｃ（図１１を参照）を参照し、ＫｅｙＩＤを含むＩｎｔｅｒｖａｌ（［１，２））を特定する。また、探索処理部２４３は、特定したＩｎｔｅｒｖａｌに対応するＳｕｃｃｅｓｓｏｒのＩＤ（ＩＤ＝２）を特定する。そして、探索処理部２４３は、特定したＳｕｃｃｅｓｓｏｒのＩＤを操作処理部２４２に通知する。この通知を受けた操作処理部２４２は、Ｓｕｃｃｅｓｓｏｒに対して操作の要求を転送する。
【０１１１】
プール管理部２４４は、ノードプール４１０を管理する。
例えば、プール管理部２４４は、ノードプール４１０にノードが追加された場合、追加されたノードの情報（ＩＰ  Ａｄｄｒｅｓｓなど）を収集し、収集した情報をノードプール情報２４１ｆに記載する。また、プール管理部２４４は、初期ノード２１２に対してノードの追加を通知すると共に、追加されたノードの情報を初期ノード２１２に提供する。一方、プール管理部２４４は、初期ノード２１２からノードの追加を通知された場合、初期ノード２１２から提供されるノードの情報をノードプール情報２４１ｆに記載する。
【０１１２】
また、プール管理部２４４は、ノードプール４１０に収容されているノード間のＲＴＴを計測し、計測したＲＴＴをＲＴＴデータ２４１ｇに記載する。また、プール管理部２４４は、ＲＴＴデータ２４１ｇに記載のＲＴＴに基づいて近傍ノード群を抽出する。なお、ＲＴＴの計測は、予め設定された周期又はタイミングで実行される。また、近傍ノード群の抽出は、予め設定された周期又はタイミングで実行されてもよいし、或いは、参加処理部２４５によるノードの参加処理が実行されるタイミングで実行されてもよい。
【０１１３】
参加処理部２４５は、ノードの参加に関する処理を実行する。例えば、参加処理部２４５は、ＩＤに割り当てられていないノードから参加要求を受けた場合、そのノードをノードプール４１０に収容する。また、参加処理部２４５は、ノードプール情報２４１ｆを参照し、ノードプール４１０に収容されているノードの数がＩＤ空間の数以上である場合、ＩＤ空間の数と同数のノードを選択し、選択したノードに同じＩＤを割り振る。そして、参加処理部２４５は、ＩＤ空間４０１、４０２、４０３の同じＩＤに、選択したノードを１つずつ割り当てる。
【０１１４】
なお、参加処理部２４５は、ＩＤ空間の数と同数のノードを含む近傍ノード群がある場合にノードの選択、ＩＤの割り振り、及びＩＤへの割り当てを実行してもよい。この場合、ＩＤ空間の数以上のノードがノードプール４１０に存在していてもノードの参加が見送られる。一方、この方法によれば、通信経路上の距離が短いノードの組が同じＩＤに割り当てられるため、システムの性能向上に寄与する。
【０１１５】
同期処理部２４６は、同じＩＤに割り当てられているノード間で操作履歴２４１ｂを同期する。例えば、同期処理部２４６は、操作履歴２４１ｂに記載されている操作のうち、同じＩＤに割り当てられている他のノードに通知していない操作を特定し、特定した操作を同ＩＤノードリスト２４１ｅに記載されている各ノードに通知する。なお、同期の処理は、操作処理部２４２が操作を受け付ける度に実行してもよいし、予め設定された周期又はタイミングで実行してもよい。
【０１１６】
また、同期処理部２４６は、操作履歴２４１ｂのうち同期完了の確認がとれていない操作の集合（未同期の履歴）について、同じＩＤに割り当てられているノード間で同期完了の確認を実施する。なお、同期完了の確認は、予め設定された周期又はタイミングで実施されてもよいし、上述した同期の処理が完了したタイミングや、同期の処理が完了してから所定の時間が経過したタイミングで実施されてもよい。
【０１１７】
同期完了の確認は、例えば、未同期の履歴に基づいて算出されるチェックサムを利用して行うことができる。チェックサムは、操作の集合を入力とし、その集合に含まれる操作の組み合わせが同じであれば同じ値を出力する関数を利用して計算される。つまり、未同期の履歴における操作の順序が異なっていても、同じ操作の組が含まれていれば、チェックサムの値は同じになる。
【０１１８】
同期完了の確認に際し、同期処理部２４６は、操作履歴２４１ｂに含まれる未同期の履歴からチェックサムを計算し、同じＩＤに割り当てられている他のノード（通常ノード２２０、２３０）にチェックサムを要求する。そして、同期処理部２４６は、他のノードから取得したチェックサムと、計算したチェックサムとが同じである場合、その未同期の履歴を同期済の履歴に設定すると共に、その履歴に新たなバージョン情報を付与する。このように、バージョン情報を利用することで、どの操作までが同期済で、どの操作までが未同期であるかを容易に確認することが可能になる。
【０１１９】
死活監視部２４７は、同期処理部２４６が同期の処理を実行する際、操作の通知に対する応答を監視し、その応答の有無に応じて通知先のノードが通信可能な状態にあるか否かを判断する。例えば、死活監視部２４７は、通知から応答までにかかる遅延時間を計測し、その遅延時間が予め設定された閾値より大きい場合、通知先のノードが通信不可の状態（離脱した状態）にあると判断する。
【０１２０】
また、死活監視部２４７は、離脱した状態にあると判断したノードの数をカウントする。そして、カウントした数が予め設定された閾値（例えば、２）以上の場合、死活監視部２４７は、離脱したノードの数が閾値以上であることを離脱処理部２４８に通知する。なお、死活監視部２４７は、初期ノード２１０以外の残存するノードの数をカウントし、カウントした数と予め設定された閾値（例えば、１）とを比較してもよい。また、死活監視部２４７は、離脱した状態にあると判断したノードの情報を同ＩＤノードリスト２４１ｅ及びルーティングテーブル２４１ｃから削除する。
【０１２１】
離脱処理部２４８は、初期ノード２１０を含め、同じＩＤに割り当てられているノードを離脱させる処理を実行する。例えば、離脱処理部２４８は、死活監視部２４７から、離脱した状態にあるノードの数が閾値以上である旨の通知を受けた場合、初期ノード２１０と異なるＩＤに割り当てられているノードの中から、ＫＶＳデータ２４１ａの移管先となる代替ノードを決定する。そして、離脱処理部２４８は、ＫＶＳデータ２４１ａを代替ノードに移管し、離脱処理の対象外である各ノードに初期ノード２１０の離脱を通知する。
【０１２２】
また、離脱処理部２４８は、初期ノード２１２に参加の要求を出す。初期ノード２１２に参加の要求を出すことで、初期ノード２１０はノードプール４１２に収容される。なお、離脱処理の対象となる他のノードがある場合、離脱処理部２４８は、その他のノードに対し、代替ノードの決定、ＫＶＳデータの移管、離脱の通知、及び参加の要求を行うように指示してもよい。
【０１２３】
また、離脱処理部２４８は、制御装置１００に対し、初期ノード２１０に代わる初期ノードの設定を依頼する。なお、初期ノード２１０以外に初期ノードがない場合、離脱処理部２４８は、離脱処理の対象外となる各ノードに初期ノード２１０の離脱を通知する前に、制御装置１００に初期ノードの設定を依頼する。そして、初期ノードが設定され、新たな初期ノードが各ノードに通知された後、離脱処理部２４８は、離脱の通知などの処理を実行し、新たな初期ノードに参加の要求を出す。
【０１２４】
以上、初期ノード２１０の機能について説明した。なお、初期ノード２１２の機能も同様である。
（通常ノード）
次に、図１６を参照しながら、通常ノードの機能について説明する。図１６は、第２実施形態に係る通常ノードが有する機能の一例を示したブロック図である。なお、ここでは説明の都合上、通常ノード２３０の機能を例に説明する。
【０１２５】
図１６に示すように、通常ノード２３０は、記憶部２５１、操作処理部２５２、探索処理部２５３、参加処理部２５４、同期処理部２５５、死活監視部２５６、及び離脱処理部２５７を有する。
【０１２６】
なお、記憶部２５１の機能は、上述したＲＡＭ９０６や記憶部９２０などを用いて実現できる。操作処理部２５２、探索処理部２５３、参加処理部２５４、同期処理部２５５、死活監視部２５６、及び離脱処理部２５７の機能は、上述したＣＰＵ９０２などを用いて実現できる。
【０１２７】
記憶部２５１には、ＫＶＳデータ２５１ａ、操作履歴２５１ｂ、ルーティングテーブル２５１ｃ、初期ノードリスト２５１ｄ、同ＩＤノードリスト２５１ｅが格納される。
ＫＶＳデータ２５１ａは、通常ノード２３０に割り当てられているキー（図６の例ではＫｅｙ＃５、Ｋｅｙ＃６、Ｋｅｙ＃７、Ｋｅｙ＃０）と、そのキーに紐付けられて保持される値（Ｖａｌｕｅ）とのペアである。
【０１２８】
操作履歴２５１ｂは、上述した操作履歴２４１ｂ（図１０を参照）と同様に、通常ノード２３０又は通常ノード２３０と同じＩＤに割り当てられているノードが受け付けた操作の履歴である。ルーティングテーブル２５１ｃは、上述したルーティングテーブル２４１ｃ（図１１を参照）と同様に、キーを保持するノードを探索する際に利用される情報である。
【０１２９】
初期ノードリスト２５１ｄは、上述した初期ノードリスト２４１ｄ（図１２を参照）と同様に、制御装置１００により設定された全ての初期ノードの情報（ＩＰ  Ａｄｄｒｅｓｓなど）を列挙した情報である。同ＩＤノードリスト２５１ｅは、上述した同ＩＤノードリスト２４１ｅ（図１３を参照）と同様に、初期ノード２１０と同じＩＤに割り当てられているノードの情報（ＩＰ  Ａｄｄｒｅｓｓなど）を列挙した情報である。
【０１３０】
なお、通常ノード２３０と初期ノード２１０とは同じＩＤに割り当てられるため、ルーティングテーブル２５１ｃ、同ＩＤノードリスト２５１ｅは同じ内容になる。また、初期ノードリスト２５１ｄは各ノードで共通の内容となる。
【０１３１】
操作処理部２５２は、多重化分散ＫＶＳシステムの利用者又は他のノードから受け付けた操作の要求を処理する。
例えば、利用者は、制御装置１００を介して通常ノード２３０に操作を要求する。通常ノード２３０に割り当てられているキーに関する操作である場合、操作処理部２５２は、その要求に応じて操作をＫＶＳデータ２５１ａに反映させる。また、操作処理部２５２は、受け付けた操作の内容と、自身が所属するＩＤ空間４０３の情報を操作履歴２５１ｂに記載する。受け付けた操作の要求が他のノードから出された要求である場合、操作処理部２５２は、上記と同様に、その操作をＫＶＳデータ２５１ａに反映させ、操作履歴２５１ｂに記載を追加する。
【０１３２】
探索処理部２５３は、ルーティングテーブル２５１ｃを参照し、指定されたキーを保持するノードを特定する。例えば、通常ノード２３０に割り当てられていないキーに対する操作の要求を操作処理部２５２が受け付けた場合、探索処理部２５３は、ルーティングテーブル２５１ｃに基づいて、そのキーに対応するＳｕｃｃｅｓｓｏｒのＩＤを特定する。そして、探索処理部２５３は、特定したＳｕｃｃｅｓｓｏｒのＩＤを操作処理部２５２に通知する。この通知を受けた操作処理部２５２は、Ｓｕｃｃｅｓｓｏｒに対して操作の要求を転送する。
【０１３３】
参加処理部２５４は、初期ノードリスト２５１ｄに記載されている初期ノードに参加の要求を出す。初期ノードからＩＤが割り振られ、通常ノード２３０がＩＤに割り当てられた場合、参加処理部２５４は、初期ノードからノードの割り当てに関する情報を取得し、ルーティングテーブル２５１ｃを生成する。なお、初期ノードがルーティングテーブル２５１ｃを生成する場合、参加処理部２５４は、初期ノードからルーティングテーブル２５１ｃを取得する。
【０１３４】
同期処理部２５５は、同じＩＤに割り当てられているノード間で操作履歴２５１ｂを同期する。例えば、同期処理部２５５は、操作履歴２５１ｂに記載されている操作のうち、同じＩＤに割り当てられている他のノードに通知していない操作を特定し、特定した操作を同ＩＤノードリスト２５１ｅに記載されている各ノードに通知する。
【０１３５】
なお、同期の処理は、操作処理部２５２が操作を受け付ける度に実行してもよいし、予め設定された周期又はタイミングで実行してもよい。また、同期処理部２５５は、通常ノード２３０の参加時に、同じＩＤのノードに対して同期を要求し、そのノードから取得した操作履歴を操作履歴２５１ｂとして記憶部２５１に格納し、その操作履歴２５１ｂからＫＶＳデータ２５１ａを生成してもよい。
【０１３６】
また、同期処理部２５５は、操作履歴２５１ｂのうち同期完了の確認がとれていない操作の集合（未同期の履歴）について、同じＩＤに割り当てられているノード間で同期完了の確認を実施する。なお、同期完了の確認は、予め設定された周期又はタイミングで実施されてもよいし、上述した同期の処理が完了したタイミングや、同期の処理が完了してから所定の時間が経過したタイミングで実施されてもよい。
【０１３７】
同期完了の確認は、例えば、未同期の履歴に基づいて算出されるチェックサムを利用して行うことができる。チェックサムは、操作の集合を入力とし、その集合に含まれる操作の組み合わせが同じであれば同じ値を出力する関数を利用して計算される。つまり、未同期の履歴における操作の順序が異なっていても、同じ操作の組が含まれていれば、チェックサムの値は同じになる。
【０１３８】
同期完了の確認に際し、同期処理部２５５は、操作履歴２５１ｂに含まれる未同期の履歴からチェックサムを計算し、同じＩＤに割り当てられている他のノード（初期ノード２１０、通常ノード２２０）にチェックサムを要求する。そして、同期処理部２５５は、他のノードから取得したチェックサムと、計算したチェックサムとが同じである場合、その未同期の履歴を同期済の履歴に設定すると共に、その履歴に新たなバージョン情報を付与する。このように、バージョン情報を利用することで、どの操作までが同期済で、どの操作までが未同期であるかを容易に確認することが可能になる。
【０１３９】
死活監視部２５６は、同期処理部２５５が同期の処理を実行する際、操作の通知に対する応答を監視し、その応答の有無に応じて通知先のノードが通信可能な状態にあるか否かを判断する。例えば、死活監視部２５６は、通知から応答までにかかる遅延時間を計測し、その遅延時間が予め設定された閾値より大きい場合、通知先のノードが通信不可の状態（離脱した状態）にあると判断する。
【０１４０】
また、死活監視部２５６は、離脱した状態にあると判断したノードの数をカウントする。そして、カウントした数が予め設定された閾値（例えば、２）以上の場合、死活監視部２５６は、離脱したノードの数が閾値以上であることを離脱処理部２５７に通知する。なお、死活監視部２５６は、通常ノード２３０以外の残存するノードの数をカウントし、カウントした数と予め設定された閾値（例えば、１）とを比較してもよい。また、死活監視部２５６は、離脱した状態にあると判断したノードの情報を同ＩＤノードリスト２５１ｅ及びルーティングテーブル２５１ｃから削除する。
【０１４１】
離脱処理部２５７は、通常ノード２３０を含め、同じＩＤに割り当てられているノードを離脱させる処理を実行する。例えば、離脱処理部２５７は、死活監視部２５６から、離脱した状態にあるノードの数が閾値以上である旨の通知を受けた場合、通常ノード２３０と異なるＩＤに割り当てられているノードの中から、ＫＶＳデータ２５１ａの移管先となる代替ノードを決定する。そして、離脱処理部２５７は、ＫＶＳデータ２５１ａを代替ノードに移管し、離脱処理の対象外である各ノードに通常ノード２３０の離脱を通知する。
【０１４２】
また、離脱処理部２５７は、初期ノード２１２に参加の要求を出す。初期ノード２１２に参加の要求を出すことで、通常ノード２３０はノードプール４１２に収容される。なお、離脱処理の対象となる他のノードがある場合、離脱処理部２５７は、その他のノードに対し、代替ノードの決定、ＫＶＳデータの移管、離脱の通知、及び参加の要求を行うように指示してもよい。
【０１４３】
以上、通常ノード２３０の機能について説明した。なお、通常ノード２３０以外の通常ノード（通常ノード２１４など）が有する機能も同様である。
［２−５．処理の流れ］
次に、多重化分散ＫＶＳシステムにおいて実行される処理の流れについて説明する。
【０１４４】
（ノードの参加）
まず、図１７及び図１８を参照しながら、ノードの参加時に実行される処理の流れについて説明する。図１７は、第２実施形態に係るノードの割り当て方法について説明するための図である。図１８は、第２実施形態に係るノードの参加時に実行される処理の流れについて説明するためのフロー図である。
【０１４５】
図１７の例は、通常ノード２１６が初期ノード２１０に参加の要求を出した場合に実行される割り当て処理の様子を示している。この例ではノードプール４１０に通常ノード２２６、２２７、２３４、２３６が収容されており、参加の要求を受けた初期ノード２１０は、通常ノード２１６をノードプール４１０に収容する。
【０１４６】
例えば、ＲＴＴデータ２４１ｇに基づいて通常ノード２１６、２２６、２３６が近傍ノード群として抽出された場合、初期ノード２１０は、通常ノード２１６、２２６、２３６に同じＩＤ（この例ではＩＤ＃６）を割り当てる。そして、初期ノード２１０は、例えば、ＩＤ空間４０１のＩＤ＃６に通常ノード２１６を割り当て、ＩＤ空間４０２のＩＤ＃６に通常ノード２２６を割り当て、ＩＤ空間４０３のＩＤ＃６に通常ノード２３６を割り当てる。
【０１４７】
通常ノード２１６、２２６、２３６の参加によりノードの割り当てが変更されたため、各ノードが保持するルーティングテーブルが更新される。また、図６に示した例のようにＫｅｙ＃０、＃１、…、＃７がノードに割り当てられている場合、通常ノード２１６、２２６、２３６の参加によりキーの割り当ても変更される。この例では、初期ノード２１０及び通常ノード２２０、２３０に割り当てられていたＫｅｙ＃５、Ｋｅｙ＃６が通常ノード２１６、２２６、２３６に割り当てられる。
【０１４８】
上記のような参加の要求があると、初期ノード２１０は、以下の流れで処理を実行する（図１８を参照）。
（Ｓ１０１）参加処理部２４５は、通常ノード２１６から参加の要求を受け付ける。
【０１４９】
（Ｓ１０２）参加処理部２４５は、参加の要求を出した通常ノード２１６からノードの情報（ＩＰ  Ａｄｄｒｅｓｓ）を取得する。また、参加処理部２４５は、通常ノード２１６をノードプール４１０に追加する。つまり、参加処理部２４５は、通常ノード２１６の情報をノードプール情報２４１ｆに記載する。
【０１５０】
（Ｓ１０３）参加処理部２４５は、ノードプール情報２４１ｆを参照し、ノードプール４１０に収容されているノードの数が閾値ＴｈＪ以上であるか否かを判定する。閾値ＴｈＪは、例えば、ＩＤ空間の数（多重度）より大きい数に設定される。ノードの数が閾値ＴｈＪ以上である場合、処理はＳ１０４へと進む。一方、ノードの数が閾値ＴｈＪ未満である場合、処理はＳ１０８へと進む。
【０１５１】
（Ｓ１０４）参加処理部２４５は、ＲＴＴデータ２４１ｇを参照し、ＲＴＴの小さいＮ個（ＮはＩＤ空間の多重度）のノードを選択する。なお、近傍ノード群が抽出されている場合、参加処理部２４５は、Ｎ個のノードを含む近傍ノード群のノードを選択する。例えば、参加処理部２４５は、Ｎ個のノードから選択される全てのノードのペアについて測定されたＲＴＴの合計値を基準に、その合計値が最小になるノードの組を選択する。
【０１５２】
（Ｓ１０５）参加処理部２４５は、Ｓ１０４で選択したノードに同じＩＤを割り当てる。このとき、参加処理部２４５は、ＩＤ空間４０１、４０２、４０３の中でノードが割り当てられていないＩＤの中から１つのＩＤを特定し、特定したＩＤをＳ１０４で選択したノードに割り当てる。未割り当てのＩＤが複数ある場合、例えば、参加処理部２４５は、未割り当てのＩＤからランダムに１つのＩＤを選択してノードに割り当てる。
【０１５３】
（Ｓ１０６）参加処理部２４５は、同じＩＤを割り当てたＮ個のノードに対して異なるＩＤ空間４０１、４０２、４０３への参加を指示する。つまり、参加処理部２４５は、ＩＤ空間４０１、４０２、４０３の同じＩＤにそれぞれ１つのノードを割り当てる。
【０１５４】
（Ｓ１０７）参加処理部２４５は、同じＩＤを割り当てたＮ個のノードに対して、各ノードの情報（ＩＰ  Ａｄｄｒｅｓｓ）を通知する。つまり、参加処理部２４５は、これらＮ個のノードが同ＩＤノードリストを生成できるように、各ノードの情報を収集して各ノードに通知する。Ｓ１０７の処理が完了すると、図１８に示した一連の処理は終了する。
【０１５５】
（Ｓ１０８）参加処理部２４５は、参加の要求を出した通常ノード２１６に対し、プール保持状態であることを通知する。なお、プール保持状態とは、ノードプール４１０に収容され、ＩＤへの割り当てを待機している状態を言う。プール保持状態の通知を受けた通常ノード２１６は、初期ノード２１０からＩＤが割り当てられるのを待機する状態となる。Ｓ１０８の処理が完了すると、図１８に示した一連の処理は終了する。
【０１５６】
ここまで、ノードの参加時に実行される処理の流れについて説明してきた。
（ＫＶＳ操作）
次に、図１９を参照しながら、ＫＶＳ操作（ＫＶＳデータに対する操作）の受け付け時に実行される処理の流れについて説明する。図１９は、第２実施形態に係るＫＶＳ操作の受け付け時に実行される処理の流れについて説明するためのフロー図である。なお、ここでは説明の都合上、初期ノード２１０が操作の要求を受け付けた場合を例に説明する。
【０１５７】
（Ｓ１１１）操作処理部２４２は、ＫＶＳ操作（ＫＶＳデータに対する操作）の指示を受け付ける。ＫＶＳ操作の指示は、操作対象の値に紐付けられるキーの情報を含む。また、ＫＶＳ操作としては、例えば、値の格納（ｐｕｔ）、値の取得（ｇｅｔ）、値の削除（ｄｅｌ）などがある。
【０１５８】
（Ｓ１１２）操作処理部２４２は、受け付けたＫＶＳ操作の指示が自ノード（初期ノード２１０）宛ての指示であるか否かを判定する。
例えば、操作処理部２４２は、初期ノード２１０に割り当てられているキーの集合に、ＫＶＳ操作の指示で指定されたキーが含まれる場合、自ノード宛ての指示であると判定する。自ノード宛ての指示であると判定した場合、処理はＳ１１３へと進む。一方、自ノード宛ての指示ではないと判定した場合、処理はＳ１１４へと進む。
【０１５９】
（Ｓ１１３）操作処理部２４２は、ＫＶＳ操作の指示に応じた処理を実行する。
例えば、指示が値の格納（ｐｕｔ）である場合、操作処理部２４２は、指示に応じてキーと値とのペアをＫＶＳデータ２４１ａとして記憶部２４１に格納する。指示が値の取得（ｇｅｔ）である場合、操作処理部２４２は、指定されたキーに対応する値を記憶部２４１から取得し、取得した値をＫＶＳ操作の要求元に返す。指示が値の削除（ｄｅｌ）である場合、操作処理部２４２は、指定されたキーと値とを記憶部２４１から削除する。
【０１６０】
また、操作処理部２４２は、実行したＫＶＳ操作の内容と、初期ノード２１０が所属するＩＤ空間４０１の情報とを操作履歴２４１ｂに記録する。Ｓ１１３の処理が完了すると、図１９に示した一連の処理は終了する。
【０１６１】
（Ｓ１１４）操作処理部２４２は、ＫＶＳ操作の指示を宛先ノード（指定されたキーを保持するノード）に転送する。
例えば、操作処理部２４２は、指示に含まれるキーの情報を探索処理部２４３に通知し、そのキーを保持するノードのＩＰ  Ａｄｄｒｅｓｓを要求する。この要求を受けた探索処理部２４３は、ルーティングテーブル２４１ｃを参照し、通知されたキーを保持するノード（Ｓｕｃｃｅｓｓｏｒ）を特定する。そして、探索処理部２４３は、特定したノードのＩＰ  Ａｄｄｒｅｓｓを操作処理部２４２に通知する。
【０１６２】
操作処理部２４２は、探索ノードのＩＰ  Ａｄｄｒｅｓｓとして、同じＩＤに割り当てられている複数のノードのＩＰ  Ａｄｄｒｅｓｓを探索処理部２４３から取得する。操作処理部２４２は、取得したＩＰ  Ａｄｄｒｅｓｓのうち、初期ノード２１０と同じＩＤ空間４０１に属するノードのＩＰ  Ａｄｄｒｅｓｓを選択し、選択したＩＰ  ＡｄｄｒｅｓｓにＫＶＳ操作の指示を転送する。
【０１６３】
（Ｓ１１５）操作処理部２４２は、ＫＶＳ操作の指示を転送した後、宛先ノードから応答が返ってくるまでの時間（応答待ち時間）を計測する。そして、操作処理部２４２は、応答待ち時間が閾値ＴｈＲ以上であるか否かを判定する。閾値ＴｈＲは任意に設定可能であるが、例えば、初期ノード２１０と宛先ノードとの間のＲＴＴにマージンを加えた予測値に基づいて設定される。応答待ち時間が閾値ＴｈＲ以上の場合、処理はＳ１１７へと進む。一方、応答待ち時間が閾値ＴｈＲ以上でない場合、処理はＳ１１６へと進む。
【０１６４】
（Ｓ１１６）操作処理部２４２は、ＫＶＳ操作の転送先（宛先ノード）から応答を受信する。
ＫＶＳ操作が値の格納（ｐｕｔ）や削除（ｄｅｌ）である場合、操作処理部２４２は、宛先ノードにおける処理の完了を示す応答を受信する。ＫＶＳ操作が値の取得（ｇｅｔ）である場合、操作処理部２４２は、宛先ノードから応答として、指定されたキーに対応する値を取得する。この場合、操作処理部２４２は、取得した値をＫＶＳ操作の要求元に返す。Ｓ１１６の処理が完了すると、図１９に示した一連の処理は終了する。
【０１６５】
（Ｓ１１７）操作処理部２４２は、Ｓ１１４でＫＶＳ操作を転送した転送先と同じＩＤのノード（宛先ノード）があるか否かを判定する。
例えば、操作処理部２４２は、探索処理部２４３から取得したＩＰ  Ａｄｄｒｅｓｓのうち、初期ノード２１０とは異なるＩＤ空間４０２、４０３に属するノードのＩＰ  Ａｄｄｒｅｓｓを特定する。そして、操作処理部２４２は、特定したＩＰ  Ａｄｄｒｅｓｓに対して稼働確認のメッセージを送信する。
【０１６６】
送信したメッセージに対して少なくとも１つの応答が得られた場合、操作処理部２４２は、宛先ノードがあると判定する。宛先ノードがあると判定した場合、処理はＳ１１８へと進む。なお、複数のノードから応答が得られた場合、操作処理部２４２は、未選択のノードから１つのノードを宛先ノードとして選択する。一方、宛先ノードがないと判定した場合、処理はＳ１１９へと進む。
【０１６７】
（Ｓ１１８）操作処理部２４２は、ＫＶＳ操作の指示を宛先ノード（同じＩＤのノード）に転送する。Ｓ１１８の処理が完了すると、処理はＳ１１５へと進む。
（Ｓ１１９）操作処理部２４２は、ＫＶＳ操作がエラー終了した際の処理（エラー処理）を実行する。例えば、操作処理部２４２は、ＫＶＳ操作の操作元に対し、ＫＶＳ操作がエラー終了した旨を通知する。Ｓ１１９の処理が完了すると、図１９に示した一連の処理は終了する。
【０１６８】
ここまで、ＫＶＳ操作（ＫＶＳデータに対する操作）の受け付け時に実行される処理の流れについて説明してきた。
（操作履歴の同期・ノードの死活監視）
次に、図２０〜図２２を参照しながら、同期及び死活監視の処理の流れについて説明する。図２０は、第２実施形態に係る同期及び死活監視の処理について説明するための図である。図２１は、第２実施形態に係る同期及び死活監視の処理の流れについて説明するための第１のシーケンス図である。図２２は、第２実施形態に係る同期及び死活監視の処理の流れについて説明するための第２のシーケンス図である。
【０１６９】
図２０の例は、同じＩＤに割り当てられている通常ノード２１４、２２４、２３４の間で操作履歴及びＫＶＳデータを同期する様子を示している。なお、同期の処理は、予め設定された周期又はタイミングで実行されてもよいし、あるノードでＫＶＳ操作が完了し、操作履歴が更新されたタイミングで実行されてもよい。
【０１７０】
図２０の例では、通常ノード２３４がＫｅｙ＃３にｖａｌ０３を格納する操作（ｐｕｔ）を受け付け、通常ノード２２４がＫｅｙ＃４にｖａｌ０４を格納する操作（ｐｕｔ）を受け付けた段階までの操作履歴が同期済である。この状態で通常ノード２１４がＫｅｙ＃３の値ｖａｌ０３を削除する操作（ｄｅｌ）を受け付けた場合、図２０に示すように、この操作は未同期の操作履歴となる。
【０１７１】
この未同期の操作履歴は通常ノード２２４、２３４に未通知であるから、通常ノード２１４は、未通知の操作履歴を通常ノード２２４、２３４に通知し、操作履歴の同期を要求する。この要求を受けた通常ノード２２４、２３４は、通知された操作履歴をそれぞれ自身の操作履歴（未同期の操作履歴）に追加する。また、通常ノード２２４、２３４は、追加した操作履歴に基づいて、それぞれ自身のＫＶＳデータを更新する。この例ではＫｅｙ＃３の値ｖａｌ０３が削除される。
【０１７２】
また、通常ノード２１４は、それぞれ未同期の操作履歴についてチェックサムを計算し、計算したチェックサムを通常ノード２２４、２３４に通知する。また、通常ノード２１４は、通常ノード２２４、２３４から、それぞれが持つ未同期の操作履歴について計算されたチェックサムを取得する。そして、通常ノード２１４は、通常ノード２２４、２３４から取得したチェックサムと、計算したチェックサムとが一致する場合、そのチェックサムの計算に用いた未同期の履歴を同期済に変更し、同期済に変更した履歴にバージョン情報を付与する。
【０１７３】
図２０の例では、未同期から同期済に変更された履歴に対し、バージョン情報（Ｖｅｒ．００２）が付与されている。なお、通常ノード２２４、２３４も同様にチェックサムの比較を実施し、比較したチェックサムが全て一致した場合に、未同期の履歴を同期済に変更し、同期済に変更した履歴にバージョン情報（Ｖｅｒ．００２）を付与する。
【０１７４】
上記のように、同期の際、同じＩＤに割り当てられている全てのノードが通信を実施する。そのため、同期を実施する際に通信不可の状態にあるノードを検出することができる。例えば、通常ノード２１４は、通常ノード２２４、２３４にそれぞれ稼働状況を確認するメッセージを送信し、そのメッセージに対する応答が得られるか否かを確認する（死活監視）。そして、通常ノード２１４は、応答が得られたノードを対象に同期を実施する。
【０１７５】
通常ノード２１４に未通知の操作履歴がある場合、同じＩＤに割り当てられている通常ノード２１４、２２４、２３４が実行する処理は、例えば、以下の流れで実行される（図２１を参照）。
【０１７６】
（Ｓ１２１、Ｓ１２２）通常ノード２１４は、未通知の操作履歴を通常ノード２２４、２３４に送信する。このとき、通常ノード２１４は、同ＩＤノードリストを参照し、通常ノード２１４と同じＩＤに割り当てられている通常ノード２２４、２３４のＩＰ  Ａｄｄｒｅｓｓに対して未通知の操作履歴を送信する。
【０１７７】
（Ｓ１２３、Ｓ１２４）通常ノード２１４から未通知の操作履歴を受信した通常ノード２２４、２３４は、受信を完了した旨を示す応答を通常ノード２１４に返す。
（Ｓ１２５）通常ノード２１４は、通常ノード２２４、２３４から応答を受信し、応答の有無に基づいて通信が不可の状態にあるノードの数（通信不可ノード数）をカウントする。この例では通常ノード２２４、２３４が通信可能な状態にあるため、通信不可ノード数は０となる。
【０１７８】
また、通常ノード２１４は、通信不可ノード数が閾値ＴｈＮ以上であるか否かを判定する。閾値ＴｈＮは１以上の任意の数に設定できるが、例えば、ＩＤ空間の多重数から１を減じた数（この例では２）に設定することができる。
【０１７９】
ＩＤ空間の多重度が３の場合、通信不可ノード数が２の状態とは、通常ノード２１４と同じＩＤに割り当てられている他のノードが全て離脱した状態（正常に通信できない状態）にあることを意味する。つまり、ＫＶＳデータの冗長性が失われている状態である。後述するように、このような状態にある場合、その冗長性を回復するための処理が実行される。Ｓ１２５の状態では通信不可ノード数が０であるから、通常ノード２１４は、通信不可ノード数が閾値ＴｈＮ以上ではないと判定し、そのまま動作を継続する。
【０１８０】
（Ｓ１２６、Ｓ１２７）通常ノード２２４は、通常ノード２１４から受信した未通知の操作履歴に基づいて自身が保持する操作履歴を更新する（図２０を参照）。また、通常ノード２２４は、更新後の操作履歴にある未実行のＫＶＳ操作（未通知の操作履歴に対応するＫＶＳ操作）を自身が保持するＫＶＳデータに適用する。そして、通常ノード２２４は、そのまま動作を継続する。
【０１８１】
（Ｓ１２８、Ｓ１２９）通常ノード２３４は、通常ノード２１４から受信した未通知の操作履歴に基づいて自身が保持する操作履歴を更新する（図２０を参照）。また、通常ノード２３４は、更新後の操作履歴にある未実行のＫＶＳ操作（未通知の操作履歴に対応するＫＶＳ操作）を自身が保持するＫＶＳデータに適用する。そして、通常ノード２３４は、そのまま動作を継続する。
【０１８２】
Ｓ１２５、Ｓ１２７、Ｓ１２９の処理が完了した後、通常ノード２１４、２２４、２３４はそのまま動作を継続する。そして、ある時点で通常ノード２３４が離脱し（後述するＳ１３０の処理）、さらに、通常ノード２１４が未通知の操作履歴を他のノードに通知する同期の処理が生じる場合、以下のように処理が進行する。
【０１８３】
（Ｓ１３０）通常ノード２３４が離脱する場合としては、例えば、通信環境の悪化や通常ノード２３４の電源断などがある。また、通常ノード２３４の利用者により多重化分散ＫＶＳシステムから離脱する操作が行われた場合などでも通常ノード２３４が離脱する。
【０１８４】
（Ｓ１３１、Ｓ１３２）同期の処理を実行するタイミングで、通常ノード２１４は、未通知の操作履歴を通常ノード２２４、２３４に送信する。このとき、通常ノード２１４は、同ＩＤノードリストを参照し、通常ノード２１４と同じＩＤに割り当てられている通常ノード２２４、２３４のＩＰ  Ａｄｄｒｅｓｓに対して未通知の操作履歴を送信する。
【０１８５】
（Ｓ１３３）通常ノード２１４から未通知の操作履歴を受信した通常ノード２２４は、受信を完了した旨を示す応答を通常ノード２１４に返す。一方、通常ノード２３４は既に離脱しているため、通常ノード２１４から通常ノード２３４に送信された未通知の操作履歴は通常ノード２３４に到達しない。そのため、通常ノード２３４は、未通知の操作履歴に対する応答を送信しない。
【０１８６】
（Ｓ１３４）通常ノード２１４は、通常ノード２２４から応答を受信し、応答の有無に基づいて通信が不可の状態にあるノードの数（通信不可ノード数）をカウントする。この例では通常ノード２２４から応答が得られ、通常ノード２３４からは応答が得られていないため、通信不可ノード数は１となる。
【０１８７】
また、通常ノード２１４は、通信不可ノード数が閾値ＴｈＮ以上であるか否かを判定する。Ｓ１３４の段階では通信不可ノード数が１であるから、通常ノード２１４は、通信不可ノード数が閾値ＴｈＮ以上ではないと判定し、そのまま動作を継続する。つまり、通常ノード２１４の他に、同じＩＤに割り当てられている通常ノード２２４が正常稼働しており、ＫＶＳデータの冗長性が維持されているため、通常ノード２１４の運用がそのまま継続される。
【０１８８】
（Ｓ１３５、Ｓ１３６）通常ノード２２４は、通常ノード２１４から受信した未通知の操作履歴に基づいて自身が保持する操作履歴を更新する（図２０を参照）。また、通常ノード２２４は、更新後の操作履歴にある未実行のＫＶＳ操作（未通知の操作履歴に対応するＫＶＳ操作）を自身が保持するＫＶＳデータに適用する。そして、通常ノード２２４は、そのまま動作を継続する。
【０１８９】
上記のように、多重化分散ＫＶＳシステムでは、同じＩＤに割り当てられているノードが複数存在するため、一部のノードが離脱しても、ＫＶＳデータの冗長性が失われない限り、そのまま運用を継続することができる。もちろん、完全に冗長性が失われる前に、冗長性が低下した段階で対処する仕組みにすることもできる。
【０１９０】
例えば、ＩＤ空間の多重度がＷ（Ｗ≧４）の場合、同じＩＤに割り当てられているノードの数が２になった時点で冗長性を回復するための処理を実施する仕組みに変形することができる。つまり、ＩＤ空間の多重度に応じて閾値ＴｈＮを適切に変形することで、ＫＶＳデータの消失に対するリスクを好適に抑制することができる。
【０１９１】
ここで、通信不可ノード数が閾値ＴｈＮ未満となった場合に実行される処理の流れについて説明する（図２２を参照）。
（Ｓ１４１、Ｓ１４２）通常ノード２２４、２３４が離脱する。
【０１９２】
（Ｓ１４３、Ｓ１４４）同期の処理を実行するタイミングで、通常ノード２１４は、未通知の操作履歴を通常ノード２２４、２３４に送信する。このとき、通常ノード２１４は、同ＩＤノードリストを参照し、通常ノード２１４と同じＩＤに割り当てられている通常ノード２２４、２３４のＩＰ  Ａｄｄｒｅｓｓに対して未通知の操作履歴を送信する。
【０１９３】
但し、通常ノード２２４、２３４は既に離脱しているため、未通知の操作履歴は通常ノード２２４、２３４に到達しない。そして、通常ノード２１４は、通常ノード２２４、２３４から未通知の操作履歴に対する応答を得ることができない。
【０１９４】
（Ｓ１４５）通常ノード２１４は、応答の有無に基づいて通信が不可の状態にあるノードの数（通信不可ノード数）をカウントする。この例では通常ノード２２４、２３４から応答が得られないため、通信不可ノード数は２となる。また、通常ノード２１４は、通信不可ノード数が閾値ＴｈＮ以上であるか否かを判定する。
【０１９５】
Ｓ１４５の状態では通信不可ノード数が２であるから、通常ノード２１４は、通信不可ノード数が閾値ＴｈＮ以上であると判定する。つまり、通常ノード２１４の他に、正常稼働している同じＩＤのノードが存在せず、ＫＶＳデータの冗長性が失われている。この場合、通常ノード２１４は、その対処としてＳ１４６以降の処理を実行する。
【０１９６】
（Ｓ１４６）通常ノード２１４は、ＫＶＳ操作の受け付けを停止する。
（Ｓ１４７）通常ノード２１４は、通常ノード２１４の機能を移管する移管先のノード（代替ノード）を特定する。
【０１９７】
例えば、通常ノード２１４は、自身が離脱した場合に、自身が保持するキーの割当先となるノードを探索し、そのノードを代替ノードとする。図６の例でＩＤ＃４のノードが離脱する場合、ＩＤ＃４のノードが保持するＫｅｙ＃３、Ｋｅｙ＃４は、ＩＤ＃０のノードに移管される。この場合、通常ノード２１４は、ＩＤ＃０のノード（初期ノード２１０）を代替ノードとする。なお、操作の受け付けを停止した後に、通常ノード２１４に対して要求されたＫＶＳ操作は、代替ノードに転送される。
【０１９８】
（Ｓ１４８、Ｓ１４９）通常ノード２１４は、自身が保持しているＫＶＳデータを代替ノードに移管する。そして、通常ノード２１４は、自身の離脱を各ノードに通知すると共に、初期ノード２１０に対して参加を要求する。初期ノード２１０に参加を要求することで、通常ノード２１４はノードプール４１０に収容される。
【０１９９】
上記のように、各ノードは、同期処理の中で通信不可ノード数を監視し、同じＩＤに割り当てられているノードの多重化が維持されているかを確認する。そして、ノードの多重化が十分でなく、ＫＶＳデータの冗長性が低下していると判断される状況にある場合、そのＩＤに割り当てられているノードを離脱させてノードプールに戻す制御が実施される。ノードプールに十分な数のノードがあれば、それら複数のノードが共通するＩＤに割り当てられ、ＫＶＳデータの冗長性が回復される。
【０２００】
ここまで、同期及び死活監視の処理の流れについて説明してきた。
（同期確認・バージョン更新）
次に、図２３及び図２４を参照しながら、同期処理及びバージョン更新の処理の流れについて説明する。図２３は、第２実施形態に係る同期確認及びバージョン更新の処理について説明するための図である。図２４は、第２実施形態に係る同期確認及びバージョン更新の処理の流れについて説明するためのシーケンス図である。
【０２０１】
図２３の例は、通常ノード２１４、２２４、２３４の間で未同期の操作履歴について同期確認を実施し、同期確認がとれた操作履歴に対してバージョンを付与する処理（バージョン更新）の様子を示している。なお、操作履歴の内容は、最上段が最も古く、最下段が最も新しい操作となる（ｔ１＜ｔ２＜ｔ３）。
【０２０２】
上述したように、通常ノード２１４、２２４、２３４は、各自が受け付けた操作を相互に通知し、各自が保持する操作履歴及びＫＶＳデータに反映させる。そのため、通常ノード２１４、２２４、２３４がいずれも正常に動作していれば、同じ操作の組が操作履歴に含まれる。しかし、各自が操作を受け付けるタイミングと、他のノードが受け付けた操作の通知を各自が受け取るタイミングとが異なるため、操作履歴に記載される操作の順序は、図２３に示すように各自で異なることがある。
【０２０３】
そのため、通常ノード２１４、２２４、２３４は、同期確認の対象となる操作の集合に、同じ操作の組が含まれていれば同期の処理が完了していると判断する。この判断には、操作の順序に関係なく、同じ操作の組を持つ操作の集合が入力された場合に同じ値を出力する関数（チェックサム関数ｆ）が利用される。例えば、操作Ｏｐ＃１、Ｏｐ＃２を含む２つの集合Ｓ１２（Ｓ１２＝｛Ｏｐ＃１，Ｏｐ＃２｝）、Ｓ２１（Ｓ２１＝｛Ｏｐ＃２，Ｏｐ＃２｝）とが与えられた場合、ｆ（Ｓ１２）とｆ（Ｓ２１）とは等しくなる。
【０２０４】
図２３に示すように、通常ノード２１４が保持する操作履歴のうちｔ１からｔ２の間における操作の集合をＱ１とし、ｔ１からｔ３の間における操作の集合をＱ２と表記する。また、通常ノード２２４が保持する操作履歴のうちｔ１からｔ２の間における操作の集合をＱ３とし、ｔ１からｔ３の間における操作の集合をＱ４とする。また、通常ノード２３４が保持する操作履歴のうちｔ１からｔ２の間における操作の集合をＱ５とし、ｔ１からｔ３の間における操作の集合をＱ６とする。
【０２０５】
この場合、通常ノード２１４、２２４、２３４の操作履歴に反映されるタイミングの違いから、ｔ２の時点で同期確認が実施されると、「ｆ（Ｑ１）≠ｆ（Ｑ３）」及び「ｆ（Ｑ３）≠ｆ（Ｑ５）」となり、同期の処理が完了していないと判断される。一方、ｔ３の時点で同期確認が実施されると、「ｆ（Ｑ２）＝ｆ（Ｑ４）＝ｆ（Ｑ６）」となるから、通常ノード２１４、２２４、２３４は、同期の処理が完了していると判断する。そのため、図２３の例では、Ｑ２、Ｑ４、Ｑ６に対してバージョン情報が付与される。
【０２０６】
なお、同じＩＤに割り当てられているノードのうち、同期確認を開始するノードは予め設定されていてもよいし、ランダムに選択されてもよい。例えば、通常ノード２１４が同期確認を開始する場合、以下のような流れで処理が実行される（図２４を参照）。
【０２０７】
（Ｓ１５１）通常ノード２１４は、自身が保持する操作履歴のうち未同期の操作履歴についてチェックサムを計算する。なお、チェックサムの値は、操作の順序に関係なく、同じ操作の組を持つ操作の集合が入力された場合に同じ値を出力する関数（図２３のチェックサム関数ｆを参照）を用いて計算される。
【０２０８】
（Ｓ１５２、Ｓ１５３）通常ノード２１４は、同じＩＤに割り当てられている通常ノード２２４、２３４に対し、各自が保持する未同期の操作履歴についてチェックサムを計算し、計算したチェックサムを通知するように要求する。
【０２０９】
（Ｓ１５４、Ｓ１５５）通常ノード２２４は、自身が保持する操作履歴のうち未同期の操作履歴についてチェックサムを計算する。なお、通常ノード２２４は、通常ノード２１４がチェックサムの計算に利用した関数と同じ関数を利用してチェックサムを計算する。そして、通常ノード２２４は、計算したチェックサムを通常ノード２１４に通知する。
【０２１０】
（Ｓ１５６、Ｓ１５７）通常ノード２３４は、自身が保持する操作履歴のうち未同期の操作履歴についてチェックサムを計算する。なお、通常ノード２３４は、通常ノード２１４がチェックサムの計算に利用した関数と同じ関数を利用してチェックサムを計算する。そして、通常ノード２３４は、計算したチェックサムを通常ノード２１４に通知する。
【０２１１】
（Ｓ１５８、Ｓ１５９）通常ノード２１４は、Ｓ１５１で計算したチェックサムと、通常ノード２２４、２３４から通知されたチェックサムとを比較する。比較したチェックサムが全て一致した場合、通常ノード２１４は、Ｓ１６０に処理を進める。一方、不一致となるチェックサムの組がある場合、通常ノード２１４は、同期確認の処理を終了する。
【０２１２】
（Ｓ１６０）通常ノード２１４は、Ｓ１５１でチェックサムの計算に利用した未同期の操作履歴を同期済に変更し、同期済に変更した操作履歴にバージョン情報を設定する。例えば、通常ノード２１４は、過去に同期済の操作履歴に対して付与されているバージョン情報（図２０の例ではＶｅｒ．００１）を参照し、新たに同期済に変更した操作履歴に対して、最新のバージョンを表すバージョン情報（Ｖｅｒ．００２）を付与する。
【０２１３】
（Ｓ１６１、Ｓ１６２）通常ノード２１４は、同期済に変更した操作履歴に対して付与したバージョン情報を通常ノード２２４、２３４に通知する。なお、通常ノード２１４は、チェックサムが全て一致した旨を通常ノード２２４、２３４に通知し、通常ノード２２４、２３４が自律的に操作履歴の種別変更（未同期→同期済）及びバージョン情報の付与を実施するように変形してもよい。
【０２１４】
（Ｓ１６３）通常ノード２２４は、Ｓ１５４でチェックサムの計算に利用した未同期の操作履歴を同期済に変更し、同期済に変更した操作履歴に、通常ノード２１４から通知されたバージョン情報を設定する。
【０２１５】
（Ｓ１６４）通常ノード２３４は、Ｓ１５６でチェックサムの計算に利用した未同期の操作履歴を同期済に変更し、同期済に変更した操作履歴に、通常ノード２１４から通知されたバージョン情報を設定する。Ｓ１６４の処理が完了すると、図２４に示した同期確認及びバージョン更新に関する一連の処理は終了する。
【０２１６】
ここまで、同期確認及びバージョン更新の処理の流れについて説明してきた。
（ノードの再参加）
次に、図２５及び図２６を参照しながら、再参加及び同期の処理の流れについて説明する。図２５は、第２実施形態に係る再参加及び同期の処理について説明するための図である。図２６は、第２実施形態に係る再参加及び同期の処理の流れについて説明するためのシーケンス図である。
【０２１７】
図２５の例は、一旦離脱した通常ノード２３４が再参加する際に実施される同期の様子を示している。通常ノード２３４が移動端末である場合、通信環境の変化により一時的に通信不可の状態になることがある。この場合、通常ノード２３４は、図２１（Ｓ１３２、Ｓ１３４を参照）のように、離脱した状態にあると判断される。
【０２１８】
仮に、一時的に離脱状態になった通常ノード２３４を新たなＩＤに割り当てて再参加させると、通常ノード２３４が保持しているＫＶＳデータ及び操作履歴は利用できなくなる。一方、一時的に通信不可の状態になった後、すぐに通常ノード２３４の通信状態が復旧する場合、通常ノード２３４を元のＩＤに再参加させ、既に保持しているＫＶＳデータや操作履歴を利用して運用を継続できれば、システムの負担を低減できる。
【０２１９】
図２１を参照しながら説明したように、多重化分散ＫＶＳシステムでは、同じＩＤに割り当てられているノードの一部が離脱した場合でも、残りのノードで運用が継続される。そのため、残りのノードで運用が継続されている際、一時的に離脱したノードを元のＩＤに再参加させ、図２５に示すように、離脱期間に更新されている操作履歴を同期させれば、再参加したノードを加えた状態で運用を継続することができる。
【０２２０】
図２５の例では、再参加した通常ノード２３４が、運用を継続している通常ノード２１４、２２４から操作履歴を取得する。このとき、通常ノード２３４は、自身が保持する操作履歴の最新バージョンを通常ノード２１４、２２４に通知し、自身が保持する操作履歴と、通常ノード２１４、２２４が保持する操作履歴との差分を取得する。
【０２２１】
例えば、通常ノード２１４は、通常ノード２３４から通知された最新バージョンと、自身が保持する操作履歴のバージョンとを照合し、その最新バージョンより新しいバージョンに対応する操作履歴を特定する。そして、通常ノード２１４は、特定した操作履歴のうち、自身が受け付けたＫＶＳ操作の内容を差分として通常ノード２３４に通知する。このとき、通常ノード２１４は、通知するＫＶＳ操作のバージョン情報を併せて通知する。
【０２２２】
同様に、通常ノード２２４は、通常ノード２３４から通知された最新バージョンと、自身が保持する操作履歴のバージョンとを照合し、その最新バージョンより新しいバージョンに対応する操作履歴を特定する。そして、通常ノード２２４は、特定した操作履歴のうち、自身が受け付けたＫＶＳ操作の内容を差分として通常ノード２３４に通知する。このとき、通常ノード２２４は、通知するＫＶＳ操作のバージョン情報を併せて通知する。
【０２２３】
通常ノード２３４は、通常ノード２１４、２２４から差分として通知されたＫＶＳ操作の内容及びバージョン情報を自身の操作履歴に追加すると共に、そのＫＶＳ操作を自身のＫＶＳデータに反映させる。この処理により、通常ノード２１４、２２４、２３４のＫＶＳデータが同期される。
【０２２４】
上記のように通常ノード２３４が再参加する場合、通常ノード２３４及び通常ノード２３４と同じＩＤに割り当てられている通常ノード２１４、２２４は、以下の流れで処理を実行する（図２６を参照）。
【０２２５】
（Ｓ１７１、Ｓ１７２）通常ノード２３４が離脱する。その後、通常ノード２３４が再参加する。なお、離脱から再参加までの期間が所定期間（例えば、１秒など）より短い場合に再参加を許可する仕組みとしてもよい。
【０２２６】
（Ｓ１７３、Ｓ１７４）通常ノード２３４は、稼働確認のメッセージを通常ノード２１４、２２４に送信する。このとき、通常ノード２２４は、同ＩＤノードリストを参照し、通常ノード２３４と同じＩＤに割り当てられている通常ノード２１４、２２４のＩＰ  Ａｄｄｒｅｓｓに対して稼働確認のメッセージを送信する。
【０２２７】
（Ｓ１７５、Ｓ１７６）通常ノード２３４から稼働確認のメッセージを受信した通常ノード２１４、２２４は、受信を完了した旨を示す応答を通常ノード２３４に返す。
なお、この例では通常ノード２１４、２２４が稼働しているため、通常ノード２１４、２２４から稼働確認のメッセージに対する応答が通常ノード２３４に返される。しかし、図２２の例のように、既に通常ノード２１４、２２４が離脱している場合、稼働確認のメッセージに対する応答は通常ノード２３４に返されない。この場合、通常ノード２３４は、再参加の処理を終了し、例えば、初期ノード２１０に参加を要求する。
【０２２８】
（Ｓ１７７、Ｓ１７８）通常ノード２３４は、自身が保持する操作履歴の最新バージョンを通常ノード２１４、２２４に通知し、操作履歴の差分を要求する。
（Ｓ１７９）通常ノード２２４は、通常ノード２３４から通知された最新バージョンと、自身が保持する操作履歴のバージョンとを照合し、その最新バージョンより新しいバージョンに対応する操作履歴を特定する。そして、通常ノード２２４は、特定した操作履歴のうち、自身が受け付けたＫＶＳ操作の内容を差分として通常ノード２３４に通知する。このとき、通常ノード２２４は、通知するＫＶＳ操作のバージョン情報を併せて通知する。
【０２２９】
（Ｓ１８０）通常ノード２１４は、通常ノード２３４から通知された最新バージョンと、自身が保持する操作履歴のバージョンとを照合し、その最新バージョンより新しいバージョンに対応する操作履歴を特定する。そして、通常ノード２１４は、特定した操作履歴のうち、自身が受け付けたＫＶＳ操作の内容を差分として通常ノード２３４に通知する。このとき、通常ノード２１４は、通知するＫＶＳ操作のバージョン情報を併せて通知する。
【０２３０】
（Ｓ１８１、Ｓ１８２）通常ノード２３４は、通常ノード２１４、２２４から受信した操作履歴の差分に基づいて自身が保持する操作履歴を更新する。また、通常ノード２３４は、更新後の操作履歴にある未実行のＫＶＳ操作（操作履歴の差分に対応するＫＶＳ操作）を自身が保持するＫＶＳデータに適用する。Ｓ１８１までの処理が完了した後、通常ノード２１４、２２４、２３４はそのまま動作を継続する。
【０２３１】
上記のように、一時的に離脱したノードを元のＩＤに割り当て、同じＩＤに割り当てられている他のノードと操作履歴を同期してＫＶＳデータを更新することで、多重化分散ＫＶＳシステムは離脱前の状態に復旧する。このような再参加を許容することで、新たなノードの参加に伴うルーティングテーブルの再構築、キーの再割り当て、ＫＶＳデータの移管などの処理を省略することができ、頻繁にノードの参加・離脱があってもシステムの性能低下を抑制することができる。
【０２３２】
さらに、同期済の操作履歴にバージョン情報を付与することで、同期状況の把握が容易になり、ノードが再参加する際に操作履歴の差分を利用して操作履歴及びＫＶＳデータの同期が可能になる。その結果、再参加にかかる通信負荷及び処理負荷がさらに低減でき、頻繁にノードの参加・離脱があってもシステムの性能低下を抑制することができる。
【０２３３】
ここまで、再参加及び同期の処理の流れについて説明してきた。
（ＲＴＴ測定）
次に、図２７を参照しながら、ＲＴＴ測定時の処理の流れについて説明する。図２７は、第２実施形態に係るＲＴＴ測定時の処理の流れについて説明するためのフロー図である。なお、ここでは説明の都合上、初期ノード２１０がＲＴＴを測定する場合を例に説明する。
【０２３４】
（Ｓ１９１）プール管理部２４４は、ノードプール情報２４１ｆを参照し、ノードプール４１０からノードのペアを選択する。
（Ｓ１９２）プール管理部２４４は、Ｓ１９１で選択したノード間のＲＴＴを測定する。例えば、プール管理部２４４は、選択したペアの一方に対して他方のＩＰ  Ａｄｄｒｅｓｓを通知し、ＩＰネットワークにおけるノードの到達性を確認するためのソフトウェアであるｐｉｎｇを利用してＲＴＴを測定するように指示する。そして、プール管理部２４４は、指示を与えたノードからＲＴＴを取得する。
【０２３５】
（Ｓ１９３）プール管理部２４４は、Ｓ１９１で選択したノードのペアと、Ｓ１９２で取得したＲＴＴとを対応付け、ＲＴＴデータ２４１ｇとして記憶部２４１に保存する。
（Ｓ１９４）プール管理部２４４は、全てのペアを選択し終えたか否かを判定する。全てのペアを選択し終えた場合、処理はＳ１９５へと進む。一方、未選択のペアがある場合、処理はＳ１９１へと進む。
【０２３６】
（Ｓ１９５）プール管理部２４４は、ＲＴＴデータ２４１ｇを参照し、ＲＴＴが相互にＴｈＴ（例えば、１００ミリ秒など）より小さくなるノードの集合（近傍ノード群）を特定する（クラスタリング）。
【０２３７】
例えば、プール管理部２４４は、ノードプール４１０からＩＤ空間の多重度と同じ数のノードを選択し、選択したノードのペア毎にＲＴＴが閾値ＴｈＴより小さいか否かを判定する。そして、全てのペアのＲＴＴが閾値ＴｈＴより小さい場合、プール管理部２４４は、選択したノードの集合を近傍ノード群（図１５を参照）として特定する。
【０２３８】
Ｓ１９５の処理が完了すると、図２７に示した一連の処理は終了する。
以上、多重化分散ＫＶＳシステムにおいて実行される処理の流れについて説明した。
上記のように、多重化分散ＫＶＳシステムは、識別子を割り当てる論理空間を多重化し、識別子に割り当てるノードを冗長化させてＫＶＳデータの冗長化を図ることで、ノードの離脱によるデータの消失を防止している。また、同じ識別子に割り当てられた一部のノードが離脱しても冗長性が許容可能な範囲で維持されている場合には残りのノードで運用が継続される。
【０２３９】
そのため、ノードの離脱頻度が高い場合でも、離脱時に生じる処理負担を低減でき、システムの性能を安定的に維持することができる。また、一時的に離脱したノードが再参加する際、元の識別子に割り当てて他のノードと操作履歴を同期するため、ノードの離脱と再参加が頻繁に繰り返される場合でも、ルーティングテーブルの再計算などを省略でき、システムの性能が好適に維持される。つまり、ルーティングテーブルの更新コストや同期用データの転送コストを低減でき、参加・離脱の頻度が高いノードを多数含むシステムに第２実施形態の技術を適用した場合の効果は格別なものとなる。
【０２４０】
さらに、同期済の操作履歴にバージョン情報を付与することで、同期状況の把握が容易になり、ノードが再参加する際に操作履歴の差分を利用して操作履歴及びＫＶＳデータの同期が可能になる。その結果、再参加にかかる通信負荷及び処理負荷がさらに低減でき、頻繁にノードの参加・離脱があってもシステムの性能低下を抑制することができる。つまり、参加・離脱の頻度が高いノードを多数含むシステムに第２実施形態の技術を適用した場合の効果は更に格別なものとなる。
【０２４１】
なお、識別子を割り当てる論理空間の規定やキーの探索アルゴリズムなどについてＣｈｏｒｄの方式を例に説明を進めてきたが、他のＤＨＴやＳｋｉｐ  Ｇｒａｐｈなどの方式に対しても第２実施形態の技術を適用可能である。つまり、論理空間の多重化、同一識別子に割り当てられるノードの一部が離脱した場合の処理、及び再参加時の処理などは、他の方式に同様に当てはめることが可能であり、こうした方式を採用する変形例についても当然に第２実施形態の技術的範囲に属する。
【０２４２】
以上、第２実施形態について説明した。
【符号の説明】
【０２４３】
１０  情報管理装置
１１  記憶部
１１ａ  管理テーブル
１２  制御部
２１、２２、２３  ＩＤ空間
４１、４２、４３  操作履歴
Ｎ０１、Ｎ０２、Ｎ０３  ノード
Ｋ１、Ｋ５、Ｋ７  キー
Ｖ１、Ｖ５、Ｖ７  値
【図１】
0006674099.tif 000002
【図２】
0006674099.tif 000003
【図３】
0006674099.tif 000004
【図４】
0006674099.tif 000005
【図５】
0006674099.tif 000006
【図６】
0006674099.tif 000007
【図７】
0006674099.tif 000008
【図８】
0006674099.tif 000009
【図９】
0006674099.tif 000010
【図１０】
0006674099.tif 000011
【図１１】
0006674099.tif 000012
【図１２】
0006674099.tif 000013
【図１３】
0006674099.tif 000014
【図１４】
0006674099.tif 000015
【図１５】
0006674099.tif 000016
【図１６】
0006674099.tif 000017
【図１７】
0006674099.tif 000018
【図１８】
0006674099.tif 000019
【図１９】
0006674099.tif 000020
【図２０】
0006674099.tif 000021
【図２１】
0006674099.tif 000022
【図２２】
0006674099.tif 000023
【図２３】
0006674099.tif 000024
【図２４】
0006674099.tif 000025
【図２５】
0006674099.tif 000026
【図２６】
0006674099.tif 000027
【図２７】
0006674099.tif 000028