(57)【特許請求の範囲】
【請求項１】
クラスタを構成する複数のノードのいずれかが、クライアントにサービスを提供するためのデータを原本データとして格納する所有者ノード、または、前記データの複製データを格納する１つ以上の複製ノードとして割り当てられるクラスタシステムの前記ノードであって、
前記クラスタを構成する複数のノードそれぞれのノード識別情報と、当該複数のノードそれぞれに対応付けられて設定されたメンバに固有な識別子であるメンバ識別子と、が格納されたメンバ識別子管理情報であって、前記データと前記所有者ノードおよび前記複製ノードとの対応関係を求めるために用いられる前記メンバ識別子管理情報が記憶される記憶部と、
前記クラスタにおいて前記ノードが離脱または追加した際に、前記メンバ識別子管理情報を、前記ノードの離脱または追加に応じた、前記データと前記所有者ノードおよび前記複製ノードとの新たな対応関係に変更して格納するメンバ識別子管理部と、
変更された前記メンバ識別子管理情報に基づいて、自ノードが記憶している前記原本データおよび前記複製データを再配置する再冗長化処理を実行する再冗長化処理部と、
前記データを新規に保持する際、および、前記再冗長化処理を実行する際に、（１）前記データに固有な識別子であるデータ識別子と、（２）当該データの前記原本データを格納する前記所有者ノードの前記ノード識別情報および前記メンバ識別子、並びに、当該データの前記複製データを格納する前記複製ノードの前記ノード識別情報および前記メンバ識別子、を示す所有者・複製先情報と、を前記データそれぞれに付与するデータ情報付与部と、
自ノードが保持する前記データの中から、（条件Ａ）前記データに付与された前記所有者・複製先情報の前記所有者ノードの前記ノード識別情報が、自ノードのノード識別情報であること、（条件Ｂ）前記データに付与された前記データ識別子が、前記メンバ識別子管理情報に基づき自ノードが前記所有者ノードとなるデータであること、の両条件を満たす前記データを整合対象データとして抽出し、前記抽出した整合対象データについて、自ノードが格納する原本データと、前記所有者・複製先情報に示される前記複製ノードが格納する複製データとを比較し、不整合が検出された場合に、前記原本データにより前記複製データを更新することにより不整合を回復させるデータ整合処理部と、
を備えることを特徴とするノード。
【請求項２】
クラスタを構成する複数のノードのいずれかが、クライアントにサービスを提供するためのデータを原本データとして格納する所有者ノード、または、前記データの複製データを格納する１つ以上の複製ノードとして割り当てられるクラスタシステムの前記ノードとしてのコンピュータを、
前記クラスタを構成する複数のノードそれぞれのノード識別情報と、当該複数のノードそれぞれに対応付けられて設定されたメンバに固有な識別子であるメンバ識別子と、が格納されたメンバ識別子管理情報であって、前記データと前記所有者ノードおよび前記複製ノードとの対応関係を求めるために用いられる前記メンバ識別子管理情報が記憶される記憶手段、
前記クラスタにおいて前記ノードが離脱または追加した際に、前記メンバ識別子管理情報を、前記ノードの離脱または追加に応じた、前記データと前記所有者ノードおよび前記複製ノードとの新たな対応関係に変更して格納するメンバ識別子管理手段、
変更された前記メンバ識別子管理情報に基づいて、自ノードが記憶している前記原本データおよび前記複製データを再配置する再冗長化処理を実行する再冗長化処理手段、
前記データを新規に保持する際、および、前記再冗長化処理を実行する際に、（１）前記データに固有な識別子であるデータ識別子と、（２）当該データの前記原本データを格納する前記所有者ノードの前記ノード識別情報および前記メンバ識別子、並びに、当該データの前記複製データを格納する前記複製ノードの前記ノード識別情報および前記メンバ識別子、を示す所有者・複製先情報と、を前記データそれぞれに付与するデータ情報付与手段、
自ノードが保持する前記データの中から、（条件Ａ）前記データに付与された前記所有者・複製先情報の前記所有者ノードの前記ノード識別情報が、自ノードのノード識別情報であること、（条件Ｂ）前記データに付与された前記データ識別子が、前記メンバ識別子管理情報に基づき自ノードが前記所有者ノードとなるデータであること、の両条件を満たす前記データを整合対象データとして抽出し、前記抽出した整合対象データについて、自ノードが格納する原本データと、前記所有者・複製先情報に示される前記複製ノードが格納する複製データとを比較し、不整合が検出された場合に、前記原本データにより前記複製データを更新することにより不整合を回復させるデータ整合処理手段、
として機能させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ネットワーク上に分散配置されるサーバをクラスタ化してデータを格納する分散処理システムにおいて、原本データと複製データとの間の不整合を検出する、ノードおよびプログラムに関する。
【背景技術】
【０００２】
近年、クラウドコンピューティングの隆盛に伴い、多量のデータの処理や保持を効率的に行うことが求められている。そこで、複数のサーバを協調動作させることにより効率的な処理を実現する分散処理技術が発展している。
【０００３】
分散処理を行う際には、クラスタを構成する各サーバ（以下、「クラスタメンバ」または「ノード」と称する。）が担当するデータ（処理対象のデータ）を決定する必要がある。このとき、クラスタ全体での処理能力を高めるためには、各ノードが担当するデータ数（データ量）は平均化されていることが望ましい。
【０００４】
代表的なデータの管理（振り分け）手法として、各データのｋｅｙをハッシュ関数にかけた値（以下、「ｈａｓｈ（ｋｅｙ）」と称する。）をノード数Ｎで割った余り、すなわち「ｈａｓｈ（ｋｅｙ） ｍｏｄ Ｎ」を番号として持つノードにデータを振り分けて管理するものがある。この場合、各ノードに事前に「０」から「Ｎ−１」までの番号を割り当てていることが前提となる。このような管理（振り分け）手法を用いた場合、ノードを追加すると、Ｎの値が変化して、多くのデータについて、そのデータの保存を担当するノードが変更になるため、担当するデータを再配置することが必要になる。
【０００５】
そこで、ノードの追加に伴い担当するクラスタメンバが変更になるデータ数を約１／Ｎに抑える方法として、コンシステントハッシュ（Consistent Hashing）法（非特許文献１参照）を用いた管理（振り分け）手法がある。このコンシステントハッシュ法は、Amazon Dynamo（非特許文献２参照）等で用いられる。
【０００６】
このコンシステントハッシュ法を用いたデータ管理（振り分け）手法では、ノードとデータの双方にＩＤ（IDentifier）を割り当てる。そして、データのＩＤから閉じたＩＤ空間（以下、「コンシステントハッシュのＩＤ空間」と称する。）を時計回りに辿った場合に最初に出合ったノードをそのデータの担当とする。ノードに対するＩＤの与え方の例としては、ＩＰ（Internet Protocol）アドレスをハッシュ関数にかけた値（hash（ＩＰアドレス））が挙げられる。
【０００７】
クラスタ構成の分散処理システムでは、各ノードの処理性能が等しい場合には、各ノードが担当するデータ量を等しくする、すなわち、コンシステントハッシュのＩＤ空間における、ノード間の距離（以下、「ノードの担当領域」と称する。）を等しくすることが望ましい。この点を解決するため、各ノードに仮想的に複数のＩＤ（仮想ＩＤ）を持たせる手法が用いられている（非特許文献１参照）。各ノードが複数の仮想ＩＤを持つことで、仮想ＩＤ毎の担当領域は異なっていても、大数の法則に従いノードの担当領域は平均化される。
【０００８】
ここで、コンシステントハッシュのＩＤ空間に配置するノード（各ノードに対し仮想ノードを設定した場合は、各仮想ノード）のことを、クラスタメンバを略して「メンバ」と称する。そして、コンシステントハッシュのＩＤ空間上に配置する１つ１つのノード（メンバ）に対応するＩＤ（仮想ノードを設定した場合は「仮想ＩＤ」）のことを「メンバ識別子」と称する。
【０００９】
多数のデータの管理をクラスタ構成の分散処理システムで実行する場合、あるノードに障害が発生した場合でも他のノードで処理が継続できるように、データの複製を保持することでデータの冗長化を実現している。コンシステントハッシュ法によるデータ管理手法を用いた分散処理システムにおいても、データの冗長化が必要であり、図１１に示すような複製データの配置手法をとるものがある。
【００１０】
図１１に示すように、コンシステントハッシュ法では、ノード（ノード「１」〜「４」）とデータ（データＡ〜Ｄ。黒丸（●）で表示）の双方にＩＤを割り当て、データのＩＤからコンシステントハッシュのＩＤ空間（以下、単に「ＩＤ空間」と称する場合がある。）を時計回りに辿り最初に出合ったノード（メンバ）をそのデータ（原本データ）の担当として決定する。そして、原本データを担当するノードのさらに右隣（時計回りに次）のノード（メンバ）にそのデータ（原本データ）を複製した複製データを担当させる。複製データを複数個設定する場合には、複製データを担当するノードのさらに右隣のノード（メンバ）というように順次２個目以降の複製データを担当させる。なお、以下において、原本データを担当（保持）するノード（メンバ）を「所有者」（所有者ノード）と称し、複製データを担当（保持）するノード（メンバ）を「バディ」（複製ノード）と称して説明する。
【００１１】
具体的には、図１１に示すデータＡを例に説明すると、データＡは、そのデータＡのＩＤの位置から、ＩＤ空間上を時計回りに辿り最初に出合ったノード「１」が担当（所有者）となる。また、そのデータＡ（原本データ）の複製データは、ＩＤ空間上でノード「１」の右隣にあたるノード「２」が担当（バディ）となる。
このように原本データ・複製データを担当するノード（メンバ）を決定することで、ノードに障害等が発生し、当該ノードが離脱した場合でも、複製データを所持しているノードが新たに原本データを担当するノードとなることにより処理を継続できるという利点がある。
【先行技術文献】
【非特許文献】
【００１２】
【非特許文献１】David karger et al.,“Consistent Hashing and Random Trees:Distributed Caching Protocols for Relieving Hot Spots on the World Wide Web”，［online］，1997，ACM，［平成26年3月26日検索］，インターネット<ＵＲＬ:http://www.akamai.com/dl/technical_publications/ConsistenHashingandRandomTreesDistributedCachingprotocolsforrelievingHotSpotsontheworldwideweb.pdf>
【非特許文献２】Giuseppe DeCandia，et al.，“Dynamo: Amazon’s Highly Available Key-value Store,” SOSP’07, October 14-17, 2007, Stevenson, Washington, USA，［online］、［平成26年3月26日検索］、インターネット<ＵＲＬ:http://www.allthingsdistributed.com/files/amazon-dynamo-sosp2007.pdf>
【発明の概要】
【発明が解決しようとする課題】
【００１３】
コンシステントハッシュ法によるデータ管理手法におけるデータ冗長処理について説明する。あるノードのＩＤ空間上のメンバ（所有者）において、原本データの更新が発生したとする。この場合、その原本データの複製を保持するメンバ（バディ）に対し、原本データの更新を複製データに反映させる複製処理を実行する。しかし、この複製処理が失敗すると、原本データと複製データとの間で不整合が生じてしまう。以下、図１を参照して説明する。
【００１４】
図１は、原本データと複製データとの間に、不整合が発生する例を説明するための図である。図１に示すように、ある原本データ「Ｘ」に対する信号を受信し（ステップＳ１）、その原本データを保持するメンバ（所有者）においてデータ「Ｘ」（原本データ）が更新されたとする（ステップＳ２）。この場合、このデータ「Ｘ」を保持するメンバ（所有者）は、データ「Ｘ」の更新情報を、すべてのバディ（図１においては、バディ「１」とバディ「２」）に送信する（ステップＳ３）。ここで、バディ「２」において、複製データの更新が失敗した場合（ステップＳ４）、所有者とバディ「２」との間で、データ「Ｘ」についての不整合が発生する。
【００１５】
分散処理システムにおいては、データの一貫性を担保するため、上記のような不整合を検出し、回復する仕組みが必要となるが、不整合の検出、回復処理は、ノード負荷に影響を与えるため、ノードの負荷を抑えつつ不整合を検出、回復させる仕組みが必要となる。
【００１６】
このような背景に鑑みて本発明がなされたのであり、本発明は、ノード負荷を抑えた上で、原本データと複製データとの間に発生した不整合を検出し、回復させる、ノードおよびプログラムを提供することを課題とする。
【課題を解決するための手段】
【００１７】
前記した課題を解決するため、請求項１に記載の発明は、  クラスタを構成する複数のノードのいずれかが、クライアントにサービスを提供するためのデータを原本データとして格納する所有者ノード、または、前記データの複製データを格納する１つ以上の複製ノードとして割り当てられるクラスタシステムの前記ノードであって、前記クラスタを構成する複数のノードそれぞれのノード識別情報と、当該複数のノードそれぞれに対応付けられて設定されたメンバに固有な識別子であるメンバ識別子と、が格納されたメンバ識別子管理情報であって、前記データと前記所有者ノードおよび前記複製ノードとの対応関係を求めるために用いられる前記メンバ識別子管理情報が記憶される記憶部と、前記クラスタにおいて前記ノードが離脱または追加した際に、前記メンバ識別子管理情報を、前記ノードの離脱または追加に応じた、前記データと前記所有者ノードおよび前記複製ノードとの新たな対応関係に変更して格納するメンバ識別子管理部と、変更された前記メンバ識別子管理情報に基づいて、自ノードが記憶している前記原本データおよび前記複製データを再配置する再冗長化処理を実行する再冗長化処理部と、前記データを新規に保持する際、および、前記再冗長化処理を実行する際に、（１）前記データに固有な識別子であるデータ識別子と、（２）当該データの前記原本データを格納する前記所有者ノードの前記ノード識別情報および前記メンバ識別子、並びに、当該データの前記複製データを格納する前記複製ノードの前記ノード識別情報および前記メンバ識別子、を示す所有者・複製先情報と、を前記データそれぞれに付与するデータ情報付与部と、自ノードが保持する前記データの中から、（条件Ａ）前記データに付与された前記所有者・複製先情報の前記所有者ノードの前記ノード識別情報が、自ノードのノード識別情報であること、（条件Ｂ）前記データに付与された前記データ識別子が、前記メンバ識別子管理情報に基づき自ノードが前記所有者ノードとなるデータであること、の両条件を満たす前記データを整合対象データとして抽出し、前記抽出した整合対象データについて、自ノードが格納する原本データと、前記所有者・複製先情報に示される前記複製ノードが格納する複製データとを比較し、不整合が検出された場合に、前記原本データにより前記複製データを更新することにより不整合を回復させるデータ整合処理部と、を備えることを特徴とするノードとした。
【００１８】
また、請求項２に記載の発明は、クラスタを構成する複数のノードのいずれかが、クライアントにサービスを提供するためのデータを原本データとして格納する所有者ノード、または、前記データの複製データを格納する１つ以上の複製ノードとして割り当てられるクラスタシステムの前記ノードとしてのコンピュータを、前記クラスタを構成する複数のノードそれぞれのノード識別情報と、当該複数のノードそれぞれに対応付けられて設定されたメンバに固有な識別子であるメンバ識別子と、が格納されたメンバ識別子管理情報であって、前記データと前記所有者ノードおよび前記複製ノードとの対応関係を求めるために用いられる前記メンバ識別子管理情報が記憶される記憶手段、前記クラスタにおいて前記ノードが離脱または追加した際に、前記メンバ識別子管理情報を、前記ノードの離脱または追加に応じた、前記データと前記所有者ノードおよび前記複製ノードとの新たな対応関係に変更して格納するメンバ識別子管理手段、変更された前記メンバ識別子管理情報に基づいて、自ノードが記憶している前記原本データおよび前記複製データを再配置する再冗長化処理を実行する再冗長化処理手段、前記データを新規に保持する際、および、前記再冗長化処理を実行する際に、（１）前記データに固有な識別子であるデータ識別子と、（２）当該データの前記原本データを格納する前記所有者ノードの前記ノード識別情報および前記メンバ識別子、並びに、当該データの前記複製データを格納する前記複製ノードの前記ノード識別情報および前記メンバ識別子、を示す所有者・複製先情報と、を前記データそれぞれに付与するデータ情報付与手段、自ノードが保持する前記データの中から、（条件Ａ）前記データに付与された前記所有者・複製先情報の前記所有者ノードの前記ノード識別情報が、自ノードのノード識別情報であること、（条件Ｂ）前記データに付与された前記データ識別子が、前記メンバ識別子管理情報に基づき自ノードが前記所有者ノードとなるデータであること、の両条件を満たす前記データを整合対象データとして抽出し、前記抽出した整合対象データについて、自ノードが格納する原本データと、前記所有者・複製先情報に示される前記複製ノードが格納する複製データとを比較し、不整合が検出された場合に、前記原本データにより前記複製データを更新することにより不整合を回復させるデータ整合処理手段、として機能させるためのプログラムとした。
【００１９】
このようにすることで、本発明のノードおよびプログラムによれば、（条件Ａ）、（条件Ｂ）の両方を満たすデータを整合対象データとして抽出することができる。つまり、再冗長化処理において整合性が回復できるデータについては、整合対象データとして抽出しないため、処理対象となるデータを絞り込むことができる。これにより、ノードおよびプログラムは、ノードへの負荷を抑えて原本データと複製データとの間に発生した不整合を検出し、回復させることができる。
【発明の効果】
【００２０】
本発明によれば、ノード負荷を抑えた上で、原本データと複製データとの間に発生した不整合を検出し、回復させる、ノードおよびプログラムを提供することができる。
【図面の簡単な説明】
【００２１】
【図１】原本データと複製データとの間に不整合が発生する例を説明するための図である。
【図２】本実施形態に係るノードを含む分散処理システムの全体構成を示す図である。
【図３】本実施形態に係るノードの構成例を示す機能ブロック図である。
【図４】本実施形態に係るメンバ識別子管理テーブル（メンバ識別子管理情報）のデータ構成例を示す図である。
【図５】本実施形態に係るノードに保持されるデータのデータ構成例を説明するための図である。
【図６】本実施形態に係るノードの再冗長化処理部が行う再冗長化対象データの検出処理の流れを示すフローチャートである。
【図７】本実施形態に係るノードの再冗長化処理部が行う再冗長化処理の所定のタイミングを説明するための図である。
【図８】本実施形態に係るノードのデータ整合処理部が行う不整合検出処理の流れを示すフローチャートである。
【図９】本実施形態に係るノードのデータ整合処理部が行う整合対象データリストの生成処理を説明するための図である。
【図１０】本実施形態に係るノードのデータ整合処理部が行う整合対象データリストの生成処理における（条件Ｂ）の判定処理を説明するための図である。
【図１１】コンシステントハッシュ法によるデータ管理手法を説明するための図である。
【発明を実施するための形態】
【００２２】
次に、本発明を実施するための形態（以下、「本実施形態」と称する。）に係るノード１を含む分散処理システム１０００等について説明する。
【００２３】
＜分散処理システムの全体構成＞
まず、本実施形態に係るノード１含む分散処理システム１０００の全体構成について説明する。
図２は、本実施形態に係るノード１を含む分散処理システム１０００の全体構成を示す図である。
【００２４】
この分散処理システム１０００は、各クライアント２からのメッセージを受け付けるロードバランサ３と、複数の振り分け装置４と、クラスタを構成する複数のノード１とを含んで構成される。ロードバランサ３は、クライアント２からのメッセージを単純なラウンドロビン等により各振り分け装置４に振り分ける。振り分け装置４は、受信したメッセージを、例えば、コンシステントハッシュ法等に基づき、各ノード１に振り分ける。各ノード１では、メッセージ処理を行い、クライアント２にサービスを提供する。
【００２５】
なお、図２においては、振り分け装置４とノード１とを別装置として記載したが、同一サーバ上で別々の機能として動作させることも可能である。また、振り分け装置４も、図２に示すように、クラスタ構成をとることができる。さらに、ロードバランサ３が存在せず、クライアント２から任意の振り分け装置４にメッセージを送信することも可能である。
【００２６】
本実施形態では、分散処理システム１０００のデータ管理手法として、ノード１の離脱時および追加時の影響が少ない、コンシステントハッシュ法によるデータ管理手法を例として説明する。ただし、コンシステントハッシュ法に限定されるものではない。また、図１１に示した複製データの配置手法により、コンシステントハッシュのＩＤ空間上で右隣（時計回りに次）のノード１（メンバ）に複製データを担当させることとする。
また、本実施形態に係る分散処理システム１０００では、クラスタからのノード１の離脱時におけるデータの再冗長化処理と、クラスタへのノード１の追加時におけるデータの再配置処理とにおいて同様の仕組みでノード間のデータ移行を行うため、以下の説明では、ノード１の離脱時と追加時とのデータ移行の処理を、併せて再冗長化処理と称して説明する。
【００２７】
（処理の概要）
本実施形態に係る分散処理システム１０００のノード１は、クラスタを構成する複数のノード１の通常の処理（クライアント２からのメッセージ処理）に影響を及ぼさないようにするため、ノード１の離脱や追加があった場合に、その離脱や追加の直後ではなく、所定のタイミングで再冗長化処理の対象となるデータ（再冗長化処理対象データ）を検出する処理を実行し、そこで検出されたデータについて、再冗長化処理を実行する。さらに、本実施形態に係るノード１は、各ノード１が保持する原本データについて、所定の時間間隔で、複製ノード（バディ）が保持する複製データとの間で不整合が発生しているか否かの検出処理（不整合検出処理）を行い、不整合が検出された場合に、その不整合を回復させる。この不整合検出処理の際、ノード１は、再冗長化処理において、整合性が回復できるデータについては、処理対象のデータ（後記する「整合対象データ」）として抽出しないことによりデータを絞り込み、ノード１への負荷を抑えた不整合検出処理を実行する。
【００２８】
＜ノードの構成＞
以下、本実施形態に係るノード１の構成例について、具体的に説明する。
【００２９】
図３は、本実施形態に係るノード１の構成例を示す機能ブロック図である。
ノード１は、図２に示したように、振り分け装置４と通信可能に接続されると共に、クラスタを構成する自身以外の他のノード１とも通信可能に接続される。そして、クライアント２からのメッセージを受信し、サービスを提供する。また、ノード１は、クラスタを構成するノードに離脱または追加があった場合に、移行が必要なデータについて、再冗長化処理を実行する。さらに、ノード１は、自身が保持する原本データと、他のノード１が保持するその原本データの複製データについての不整合を検出し、回復させる処理を実行する。
このノード１は、図３に示すように、制御部１０と、入出力部１１と、メモリ部１２と、記憶部１３（記憶手段）とを含んで構成される。
【００３０】
入出力部１１は、振り分け装置４や、自身以外の他のノード１との間の情報の入出力を行う。また、この入出力部１１は、通信回線を介して情報の送受信を行う通信インタフェースと、不図示のキーボード等の入力手段やモニタ等の出力手段等との間で入出力を行う入出力インタフェースとから構成される。
【００３１】
制御部１０は、ノード１全体の制御を司り、メンバ識別子管理部１０１（メンバ識別子管理手段）、メッセージ処理部１０２、データ情報付与部１０３（データ情報付与手段）、データ抽出部１０４、再冗長化処理部１０５（再冗長化処理手段）およびデータ整合処理部１０６（データ整合処理手段）を含んで構成される。なお、この制御部１０は、例えば、記憶部１３に格納されたプログラムをＣＰＵ（Central Processing Unit）がメモリ部１２であるＲＡＭ（Random Access Memory）に展開し実行することで実現される。
【００３２】
メンバ識別子管理部１０１（メンバ識別子管理手段）は、クラスタを構成する各ノード１に関する識別情報をメンバ識別子管理テーブル３００（メンバ識別子管理情報）として管理する。
【００３３】
図４は、本実施形態に係るメンバ識別子管理テーブル３００（メンバ識別子管理情報）のデータ構成例を示す図である。図４に示すように、メンバ識別子管理テーブル３００には、クラスタを構成する各ノード１のノードアドレス３０１（ノード識別情報）に対応付けてメンバ識別子３０２が格納される。
ノードアドレス３０１（ノード識別情報）は、各ノード１に固有なアドレスであり、例えば、ＩＰアドレスである。
メンバ識別子３０２は、ノード１（メンバ）に固有な識別子であり、例えば、コンシステントハッシュのＩＤ空間上でのノードＩＤに相当する。また、コンシステントハッシュ法において仮想ＩＤを用いる場合には、メンバ識別子３０２は、仮想ＩＤ毎に割り当てられ、メンバ識別子管理テーブル３００に登録される。そして、このメンバ識別子管理テーブル３００では、例えば、メンバ識別子３０２を昇順に並べることにより、コンシステントハッシュのＩＤ空間におけるＩＤ（または仮想ＩＤ）を昇順に並べて管理することができる。つまり、メンバ識別子管理テーブル３００において、メンバ識別子３０２を昇順に並べたときの次のノード１（メンバ）が、ＩＤ空間上での右隣（時計回りに次）のノード１（メンバ）となる。
【００３４】
例えば、図４においては、コンシステントハッシュのＩＤ空間に基づくメンバ識別子３０２が「０」〜「１１１１１」であるデータについては、同図の第１行目が指すノード（ノードアドレス「１０．０．０．２５４」、メンバ識別子「１１１１１」であるノード）が所有者として担当し、次の第２行目が指すノード（ノードアドレス「１０．０．０．１」、メンバ識別子「２２２２２」であるノード）がバディとして担当することを示す。同様に、データ識別子が「１１１１１」に１を加えた「１１１１２」〜「２２２２２」であるデータについては、第２行目が指すノード（ノードアドレス「１０．０．０．１」、メンバ識別子「２２２２２」であるノード）が所有者として担当し、次の第３行目が指すノード（ノードアドレス「１０．０．０．１２５」、メンバ識別子「３３３３３」のノード）がバディとして担当することを示す。
【００３５】
このようにして、このメンバ識別子管理テーブル３００に基づき、データとその所有者とバディとが対応付けられる。
なお、このメンバ識別子３０２は、メンバ識別子管理部１０１が各ノード１に対して付与することもできるし、他のノード１や外部装置（例えば、振り分け装置４等）が生成したメンバ識別子管理テーブル３００を受信して格納することも可能である。
【００３６】
メンバ識別子管理部１０１は、クラスタを構成する複数のノード１において、あるノード１（メンバ）が離脱した際には、そのノード１のノードアドレス３０１とメンバ識別子３０２とを含むレコードを削除する。また、メンバ識別子管理部１０１は、クラスタを構成する複数のノード１において、ノード１（メンバ）が追加された場合には、そのノード１のノードアドレス３０１とメンバ識別子３０２とを含むレコードを新規に登録する。つまり、メンバ識別子管理部１０１は、クラスタにおいてノード１が離脱または追加した際に、メンバ識別子管理テーブル３００を、ノード１の離脱または追加に応じた、データと所有者ノードおよび複製ノードとの新たな対応関係に変更して格納する。
【００３７】
図３に戻り、メッセージ処理部１０２は、振り分け装置４から振り分けられたメッセージを受信し、そのメッセージの処理を実行し、処理結果をクライアント２に返信することにより、サービスを提供する。このメッセージによりメッセージ処理部１０２が実行する処理は、例えば、データの登録、更新、検索、削除等である。また、メッセージ処理部１０２は、データの登録や更新等のメッセージを受信した場合に、自身以外の他のノード１（ここでは、メンバ識別子３０２を昇順に並べた場合の次のノード（メンバ）、つまり、コンシステントハッシュのＩＤ空間での右隣のノード（メンバ））にデータの複製を行うことでデータの冗長化を実現する。複製データを複数持つようにする場合には、さらに他のメンバ（ここでは、メンバ識別子３０２を昇順に並べた場合のさらに次のノード（メンバ）、つまり、コンシステントハッシュのＩＤ空間での２つ右隣のノード（メンバ））にデータの複製を行う。また、メッセージ処理部１０２は、メッセージの処理に必要なデータをそのノード１自身が保持していなかった場合には、他のノード１に要求すること等により、そのデータを取得することが可能である。
【００３８】
なお、メッセージ処理部１０２は、クラスタを構成するノード１に離脱や追加があった場合において、データの再冗長化処理が実行される前に、再冗長化の対象となるデータに関するメッセージを受信したときには、そのメッセージの処理を実行すると共に、そのデータの再冗長化処理を実行する。
【００３９】
データ情報付与部１０３（データ情報付与手段）は、各データ（データ本体４０３）に、そのデータのデータ識別子４０１と、所有者・バディ情報４０２（所有者・複製先情報）とを付与する（図５参照）。データ情報付与部１０３は、新規にデータ４００を登録する場合、または、ノード１（メンバ）の離脱や追加等によりデータ４００の再冗長化処理を実行した場合において、そのデータ（データ本体４０３）に、データ識別子４０１と、所有者・バディ情報４０２とを付与する。
【００４０】
図５は、本実施形態に係るノード１に保持されるデータ４００のデータ構成例を説明するための図である。
図５（ａ）に示すように、ノード１に保持されるデータ４００には、データ識別子４０１と、所有者・バディ情報４０２（所有者・複製先情報）と、データ本体４０３とが格納される。図５（ｂ）を参照して、各データの内容を説明する。
【００４１】
データ識別子４０１には、各データを一意に識別可能な値が格納される。例えば、コンシステントハッシュ法におけるデータのＩＤが格納される。
所有者・バディ情報４０２（所有者・複製先情報）には、そのデータについて、原本データを保持しているノード（所有者）に関する情報と、複製データを保持しているノード（バディ：複製ノード）に関する情報とが格納される。ここで、所有者に関する情報は、ＩＤ空間上での所有者（メンバ）を識別する情報として、ノードアドレス３０１（ノード識別情報）とメンバ識別子３０２の情報が格納される。なお、このノードアドレス３０１とメンバ識別子３０２は、メンバ識別子管理テーブル３００（図４）に格納される情報と同様の情報であるが、図５（ｂ）においては、ノードアドレス「１」、メンバ識別子「１」等のように簡略化して表記している。また、バディに関する情報は、ＩＤ空間上でのバディを識別する情報として、ノードアドレス３０１（ノードアドレス「２」）とメンバ識別子３０２（メンバ識別子「２」）の情報が格納される。
データ本体４０３には、メッセージ処理の対象となるデータそのものが格納される。
【００４２】
図３に戻り、データ抽出部１０４は、例えば、メンバ識別子管理部１０１により、メンバ識別子管理テーブル３００（図４参照）が変更されたことを契機として、次に示す判定対象データの抽出処理を行う。データ抽出部１０４は、データ４００に格納された所有者・バディ情報４０２を参照することにより、（１）自身が原本として管理しているデータ（原本データ）、および、（２）自身が複製として管理しているデータ（複製データ）のうち、その複製データの原本データを管理しているノード１（所有者）が離脱したノード１と一致するデータ、つまり、原本データが消失した複製データ、を再冗長化処理が必要か否かの判定対象となるデータ（判定対象データ）として抽出する。そして、データ抽出部１０４は、その抽出したデータのデータ識別子４０１を、抽出データ管理テーブル１００に格納する。
なお、ノード１が追加された場合には、（２）の原本データが消失した複製データは、存在しないため、そのノード１が原本として管理しているデータ（原本データ）のみが抽出される。
【００４３】
再冗長化処理部１０５（再冗長化処理手段）は、予め設定されるパラメータに基づく所定のタイミングで、データ抽出部１０４により抽出され抽出データ管理テーブル１００に格納された判定対象データについて、変更されたメンバ識別子管理テーブル３００に基づき、コンシステントハッシュ法等の予め定められたデータ管理手法に従った場合の所有者とバディとを特定し（以下、この処理を「シミュレーション」と称す。）、各データ（判定対象データ）に付与されている所有者・バディ情報４０２と比較する。そして、再冗長化処理部１０５は、この比較の結果、所有者のメンバ識別子３０２およびバディのメンバ識別子３０２が一致（完全一致）しないデータを、再冗長化対象データとして検出し、再冗長化処理を実行する。
【００４４】
なお、冗長数が３以上（複製データが２以上）の場合、複製データを管理する複数のノード１（ＩＤ空間上で原本データを管理する所有者に時計回りで近いノードから、バディ「１」，バディ「２」，・・・と呼ぶ。）が同一データに対して再冗長化処理を実行する虞がある。そこで、複数のバディが存在する場合には、番号の若い（昇順で手前の）バディが再冗長化処理を担当することとする。この再冗長化対象データの検出処理の詳細については、図６を参照して後記する。
【００４５】
この再冗長化処理部１０５は、再冗長化処理を実行する所定のタイミングを、設定された１つ以上のパラメータに基づき実行する。再冗長化処理部１０５は、１つ以上のパラメータにより、再冗長化処理の実行タイミングを調整することで、再冗長化処理の負荷が一度に集中して通常の処理を妨げサービス品質の低下を招かないように負荷を抑制しつつ、再冗長化処理を実行する。
【００４６】
パラメータは、例えば、再冗長化処理スレッド数、再冗長化処理実行間隔、シミュレーション最大個数が設定される。
【００４７】
再冗長化処理スレッド数とは、再冗長化処理を並列で実行できる最大スレッド数を示す。この再冗長化処理スレッド数に大きな値を設定すると、再冗長化処理にかかる時間を短縮することができるが、ノード１の処理負荷は大きくなる。これに対し、再冗長化処理スレッド数に小さな値を設定すると、再冗長化処理にかかる時間は増加するが、ノード１の処理負荷は小さくなる。
【００４８】
再冗長化処理実行間隔とは、各スレッドで、再冗長化処理部１０５が再冗長化対象データの検出処理（図６）を実行した結果、再冗長化対象データが検出され、再冗長化処理部１０５が、その再冗長化処理を実行した後に待機する時間を指す。
【００４９】
シミュレーション最大個数とは、各スレッドが前記したシミュレーション（変更後のメンバ識別子管理テーブル３００（図４参照）に基づく、所有者とバディの特定）を含む再冗長化対象データの検出処理を連続で実行する個数を指す。再冗長化処理部１０５は、再冗長化対象データの検出処理を連続で実行した後に、所定の時間待機し、その後、再びシミュレーションを含む再冗長化対象データの検出処理を開始する。
【００５０】
このシミュレーション最大個数を少なく設定する、または、再冗長化処理実行間隔を長く設定することで、ノード１は、処理負荷を抑えながら徐々にデータ移行処理を実行することが可能となる。
なお、この再冗長化処理スレッド数、再冗長化処理実行間隔、シミュレーション最大個数の各パラメータは、予めすべて設定されてもよいし、いずれか１つでもよいし、各パラメータを任意に組み合わせて設定されてもよい。
また、このパラメータにより調整される所定のタイミングでの再冗長化処理の詳細については、図７を参照して後記する。
【００５１】
データ整合処理部１０６（データ整合処理手段）は、各ノード（所有者）が保持する原本データについて、複製ノード（バディ）が保持する複製データと、所定の時間間隔で不整合検出処理を実行し、不整合を検出した場合に、その不整合を回復させる。
【００５２】
データ整合処理部１０６は、この不整合検出処理において、具体的には、整合対象データリスト生成処理、整合性確認処理、および、整合性回復処理を実行する。以下、具体的に説明する。
【００５３】
整合対象データリスト生成処理は、データ整合処理部１０６が、不整合検出処理の対象となるデータ（整合対象データ）のリスト（以下、「整合対象データリスト」と称する。）を生成する処理である。データ整合処理部１０６は、自ノード１が保持する全データの中から、以下の（条件Ａ）および（条件Ｂ）を満たすデータを抽出することにより、そのデータのデータ識別子４０１をリスト化してこの整合対象データリスト２００（後記する、図９（ｂ）参照）を生成する。
【００５４】
（条件Ａ）データに付与された「所有者・バディ情報」（所有者・複製先情報）の所有者が、自ノードのデータである。
（条件Ｂ）データの「データ識別子」が、メンバ識別子管理テーブルにおける自ノードのメンバの担当領域内に位置するデータである。
【００５５】
（条件Ａ）は、データに付与された所有者・バディ情報４０２の所有者のノード識別情報が、自ノードのノード識別情報であることを示す。そして、この（条件Ａ）は、各ノード１が保持するデータのうち、原本データのみを不整合検出処理の対象とするためのものである。
また、（条件Ｂ）は、データに付与されたデータ識別子４０１が、メンバ識別子管理テーブル３００に基づき自ノードが所有者となるデータであることを示す。そして、この（条件Ｂ）は、その時点における（更新された最新の）メンバ識別子管理テーブル３００において、データ識別子４０１が、自ノード１のメンバの担当領域内に位置しない、つまり、他ノード１の担当領域内に位置する場合、今後の再冗長化処理により他ノード１が所有者となるようなデータの再配置が行われ、そこで整合性回復が期待できるため、不整合検出処理の対象としないようにするためのものである。
（条件Ａ）、（条件Ｂ）の両方を満たすデータを、不整合検出処理の対象となるデータ（整合対象データ）として抽出することにより、ノード１が保持する全データの中から、整合対象データを絞り込むことができ、ノード１の処理負荷を抑えることができる。
【００５６】
整合性確認処理は、データ整合処理部１０６が、整合対象データリスト２００に抽出されたデータ識別子に対応する個々のデータ（整合対象データ）について、他のノード１に保持された複製データとの整合性を確認する処理である。
ノード１（所有者）のデータ整合処理部１０６は、所有者・バディ情報４０２に示される複製ノード（バディ）に対して、整合対象データ（原本データ）をハッシュ値に変換した値を送信する。複製ノード（バディ）のデータ整合処理部１０６は、整合対象データ（原本データ）の複製データを抽出して、その複製データをハッシュ値に変換した値を算出する。そして、複製ノード（バディ）のデータ整合処理部１０６は、受信した整合対象データ（原本データ）のハッシュ値と、算出した複製データのハッシュ値とを比較することにより、整合性を確認する。ここで、整合性確認処理に利用するデータの情報は、整合対象データ（原本データ）そのものでもよいし、その他、整合性確認を実行できる値であればよい。
複製ノード（バディ）のデータ整合処理部１０６は、整合性を確認した結果（値が一致すれば「整合」、値が不一致であれば「不整合」）を、原本データを保持するノード１（所有者）に送信する。
【００５７】
整合性回復処理は、自ノード１のデータ整合処理部１０６が、複製ノード（バディ）から、整合性を確認した結果（整合、不整合）を受け取り、その結果が不整合である場合に、その整合対象データ（原本データ）に対応する複製データの整合性を回復させる処理である。
自ノード１（所有者）のデータ整合処理部１０６は、整合性を確認した結果が不整合である応答を受け取ると、その整合対象データ（原本データ）を、不整合となった複製ノード（バディ）に送信し、その複製データを送信した原本データで上書き（更新）させることにより、整合性を回復する。
【００５８】
メモリ部１２は、ＲＡＭ等の一次記憶装置からなり、制御部１０によるデータ処理に必要な情報を一時的に記憶している。なお、このメモリ部１２には、前記した、抽出データ管理テーブル１００や、整合対象データリスト２００等が記憶される。
【００５９】
記憶部１３（記憶手段）は、ハードディスクやフラッシュメモリ等の記憶装置からなり、前記したメンバ識別子管理テーブル３００（図４参照）や、データ４００（図５参照）等が記憶される。
なお、データ４００の各データには、図５に示すように、そのデータのデータ識別子４０１、所有者・バディ情報４０２およびデータ本体４０３が格納される。
【００６０】
＜処理の流れ＞
次に、本実施形態に係るノード１が実行する処理の流れについて説明する。ここでは、再冗長化処理部１０５が行う再冗長化対象データの検出処理、および、所定のタイミングでの再冗長化処理について説明する。その後、データ整合処理部１０６が行う不整合検出処理について説明する。
【００６１】
≪再冗長化対象データの検出処理≫
再冗長化対象データの検出処理は、データ抽出部１０４が判定対象データとして抽出し、抽出データ管理テーブル１００に格納したデータについて、ノード１の離脱や追加に対応して変更されたメンバ識別子管理テーブル３００に基づき、コンシステントハッシュ法等の予め定められたデータ管理手法に従った場合の所有者とバディとを特定し（シミュレーション）、各データ（判定対象データ）に付与されている所有者・バディ情報４０２と比較する。そして、再冗長化処理部１０５は、この比較の結果、所有者のメンバ識別子およびバディのメンバ識別子が一致（完全一致）しないデータを、再冗長化対象データとして検出する。
【００６２】
図６は、本実施形態に係るノード１の再冗長化処理部１０５が行う再冗長化対象データの検出処理の流れを示すフローチャートである。
【００６３】
まず、ノード１の再冗長化処理部１０５は、抽出データ管理テーブル１００から抽出した判定対象データについて、シミュレーション（図６において、「Ａ処理」と記載）を実行する（ステップＳ１０）。具体的には、再冗長化処理部１０５は、抽出した判定対象データについて、変更されたメンバ識別子管理テーブル３００に基づき、コンシステントハッシュ法等の予め定められたデータ管理手法に従った場合の所有者とバディとを特定する。
【００６４】
次に、再冗長化処理部１０５は、抽出データ管理テーブル１００から抽出した判定対象データに格納された所有者・バディ情報４０２の所有者のメンバ識別子とバディのメンバ識別子とを抽出（図６において、「Ｂ処理」と記載）する（ステップＳ１１）。
【００６５】
続いて、シミュレーション（Ａ処理）の結果、自ノードが所有者か否かを判定する（ステップＳ１２）。ここで、シミュレーション（Ａ処理）の結果、自ノードが所有者である場合には（ステップＳ１２→Ｙｅｓ）、次のステップＳ１３に進み、一方、自ノードが所有者でない場合には（ステップＳ１２→Ｎｏ）、ステップＳ１５に進む。
【００６６】
ステップＳ１３において、再冗長化処理部１０５は、所有者・バディ情報抽出（Ｂ処理）の結果、自ノードが所有者か否かを判定する。ここで、所有者・バディ情報抽出（Ｂ処理）の結果、自ノードが所有者でない場合は（ステップＳ１３→Ｎｏ）、そのデータ（判定対象データ）を、再冗長化処理の対象となるデータ（再冗長化対象データ）として決定する。つまり、同じデータに関して、所有者がＡ処理とＢ処理とで一致しないため、再冗長化が必要なデータ（図６において、「再冗長化対象」と記載する。）となる。一方、所有者・バディ情報抽出（Ｂ処理）の結果、自ノードが所有者である場合は（ステップＳ１３→Ｙｅｓ）、次のステップＳ１４に進む。
【００６７】
ステップＳ１４において、再冗長化処理部１０５は、シミュレーション（Ａ処理）の結果と所有者・バディ情報抽出（Ｂ処理）の結果とでバディが一致するか否かを判定する。ここで、バディが一致する場合には（ステップＳ１４→Ｙｅｓ）、そのデータ（判定対象データ）は、再冗長化の必要のないデータ（図６において、「再冗長化対象外」と記載する。）となる。一方、バディが一致しない場合には（ステップＳ１４→Ｎｏ）、そのデータ（判定対象データ）を、再冗長化処理の対象となるデータ（再冗長化対象データ）として決定する。つまり、所有者が一致していても、バディが一致していないため、再冗長化対象データとなる。
【００６８】
次に、ステップＳ１２において、シミュレーション（Ａ処理）の結果、自ノードが所有者でない場合には（ステップＳ１２→Ｎｏ）、再冗長化処理部１０５は、所有者・バディ情報抽出（Ｂ処理）の結果、自ノードが所有者か否かを判定する（ステップＳ１５）。ここで、所有者・バディ情報抽出（Ｂ処理）の結果、自ノードが所有者ある場合には（ステップＳ１５→Ｙｅｓ）、そのデータ（判定対象データ）を、再冗長化処理の対象となるデータ（再冗長化対象データ）として決定する。つまり、所有者がＡ処理とＢ処理で一致しないため、再冗長化対象となる。一方、所有者・バディ情報抽出（Ｂ処理）の結果、自ノードが所有者でない場合は（ステップＳ１５→Ｎｏ）、次のステップＳ１６に進む。
【００６９】
ステップＳ１６において、再冗長化処理部１０５は、所有者・バディ情報抽出（Ｂ処理）の結果、所有者が変更後のメンバ識別子管理テーブル３００（図４参照）に存在するか否かを判定する。ここで、存在する場合には（ステップＳ１６→Ｙｅｓ）、そのデータ（判定対象データ）は、再冗長化対象外となる。一方、存在しない場合には（ステップＳ１６→Ｎｏ）、次のステップＳ１７に進む。
【００７０】
ステップＳ１７において、再冗長化処理部１０５は、所有者・バディ情報抽出（Ｂ処理）の結果、自身より若いバディ（メンバ識別子３０２を昇順に並べた場合に、番号が若いバディ）が存在し、変更後のメンバ識別子管理テーブル３００（図４参照）にも、その自身より若いバディが存在するか否かを判定する。つまり、複数のバディが存在する場合に、自身が番号の最も若いバディであるか否かを判定する。ここで、自身より若いバディが存在する場合には（ステップＳ１７→Ｙｅｓ）、同一データに対し重複して再冗長化処理を実行するのを避けるため、そのデータ（判定対象データ）を、再冗長化対象外とする。一方、自身より若いバディが存在しない場合には（ステップＳ１７→Ｎｏ）、そのデータ（判定対象データ）を、再冗長化処理の対象となるデータ（再冗長化対象データ）として決定する。
【００７１】
このようにすることで、再冗長化処理部１０５は、抽出データ管理テーブル１００に抽出された判定対象データそれぞれについて、再冗長化処理を実行すべきか否かを判定し、再冗長化対象データを検出することができる。また、複数のバディが存在する場合であっても、離脱や追加されたノード１の両隣にある、所有者と番号が最も若いバディとがトリガとなり再冗長化処理が実行されるので、同一データについて、重複して再冗長化処理を実行することを避けることができる。
【００７２】
≪所定のタイミングでの再冗長化処理≫
次に、図７を参照して、再冗長化処理部１０５が、予め設定されるパラメータに基づいて、再冗長化処理を実行する所定のタイミングについて説明する。
図７においては、予め設定されるパラメータの例として、再冗長化処理スレッド数、再冗長化処理実行間隔、および、シミュレーション最大個数が設定されている例を示す。
【００７３】
図７は、再冗長化処理スレッド数（符号Ｐ１）が「３」に設定されている例を示している。
また、各スレッドにおいて、再冗長化処理部１０５が、抽出データ管理テーブル１００から判定対象データを取得すると（ステップＳ２０）、再冗長化対象データの検出処理を実行し（ステップＳ２１）、再冗長化対象データが検出された場合には、そのまま再冗長化処理を実行する（ステップＳ２２）。
【００７４】
ここで、再冗長化対象データについて、ステップＳ２２において、再冗長化処理を実行した後、再冗長化処理部１０５は、再冗長化処理実行間隔（符号Ｐ２）が設定されているため、所定の時間、次の判定対象データの取得処理（ステップＳ２０）を行わずに待機する。
【００７５】
また、図７のスレッド「１」に示すように、シミュレーション最大個数（符号Ｐ３）のパラメータが「５」に設定されている場合には、再冗長化処理部１０５は、抽出データ管理テーブル１００から判定対象データを取得し、再冗長化対象データの検出処理を５回連続して実行する。そして、再冗長化処理部１０５は、シミュレーション最大個数（ここでは「５」回）の再冗長化対象データの検出処理を行っても、再冗長化対象データが検出されなかったときには、所定の時間待機する。
【００７６】
このようにすることで、再冗長化処理部１０５が、各パラメータにより設定された所定のタイミングで再冗長化対象データの検出処理を実行し、再冗長化対象データが検出された場合に、再冗長化処理を実行することができる。よって、クラスタを構成するノード１が離脱したり追加されたりした直後において、他の既存のノード１は、再冗長化処理を一時に実行しないため、ノード１が処理負荷を抑えながら徐々に再冗長化処理を実行することができる。
【００７７】
≪不整合検出処理≫
次にデータ整合処理部１０６が実行する不整合検出処理について説明する。図１を参照して説明したように、原本データの更新が発生した場合に、その複製データに更新が反映するように、メッセージ処理部１０２（図３）によりデータの複製が行われるが、その複製処理に失敗した場合に、原本データと複製データとの間で不整合が発生する。データ整合処理部１０６は、この原本データと複製データとの間で発生した不整合を検出して回復する処理（不整合検出処理）を実行する。
【００７８】
図８は、本実施形態に係るノード１のデータ整合処理部１０６が行う不整合検出処理の流れを示すフローチャートである。なお、以下に示す、ステップＳ３０〜Ｓ３４の処理は、データ整合処理部１０６に予め設定された所定の時間間隔ごとに実行される。
【００７９】
まず、データ整合処理部１０６は、不整合検出処理の対象となるデータ（整合対象データ）を抽出した整合対象データリスト２００の生成処理を実行する（ステップＳ３０）。
この整合対象データの抽出は、データ整合処理部１０６が、自ノード１に格納された全データに関して、前記した（条件Ａ）、（条件Ｂ）の両方を満たすデータのデータ識別子を抽出することにより行う。
【００８０】
図９および図１０を参照して、この整合対象データリスト２００の生成処理の詳細を説明する。
図９は、本実施形態に係るノード１のデータ整合処理部１０６が行う整合対象データリスト２００の生成処理を説明するための図である。
【００８１】
まず、データ整合処理部１０６は、自ノード１に格納された各データが、「（条件Ａ）データに付与された『所有者・バディ情報』の所有者が、自ノードのデータである。」を満たすか否かを判定するために、図９（ａ）の符号３１０に示すように、自ノード１が格納するデータ４００の所有者・バディ情報４０２の値を参照し、その所有者のノードアドレス（ノード識別情報）が自ノード１のノードアドレスと一致するか否かを判定する。
【００８２】
続いて、データ整合処理部１０６は、「（条件Ｂ）データの『データ識別子』が、メンバ識別子管理テーブルにおける自ノードのメンバの担当領域内に位置するデータである。」を満たすか否かを判定するため、図９（ａ）の符号３２０に示すように、自ノード１が格納するデータ４００のデータ識別子４０１の値を参照し、そのデータ識別子４０１の値が、メンバ識別子管理テーブル３００（図４）における自ノード１のメンバの担当領域内に位置するか否かを判定する。なお、（条件Ｂ）の判定処理の詳細は、図１０を参照して後記する。
【００８３】
データ整合処理部１０６は、（条件Ａ）、（条件Ｂ）の両方を満たすデータを抽出し、そのデータのデータ識別子をリスト化して整合対象データリスト２００を生成する（図９（ｂ）参照）。
【００８４】
図１０は、本実施形態に係るノード１のデータ整合処理部１０６が行う整合対象データリストの生成処理における（条件Ｂ）の判定処理を説明するための図である。
データ整合処理部１０６は、自ノード１が格納するデータ４００が（条件Ｂ）を満たすか否かを判定するため、まず、データ４００のデータ識別子４０１の値を抽出する。図１０（ａ）に示す例においては、ノード「Ａ」に格納されたデータ「Ｘ」のデータ識別子４０１として、コンシステントハッシュのＩＤの値「12345」が抽出されたものとする。
次に、データ整合処理部１０６は、メンバ識別子管理テーブル３００を参照し、抽出されたデータ識別子４０１の値が、自ノード１のメンバの担当領域内に位置するか否かを判定する。図１０（ｂ）に示す例では、抽出されたデータ識別子４０１の値「12345」が、コンシステントハッシュのＩＤ空間における領域「１」、つまり、自ノード（ここでは、ノードアドレス「１０．０．０．１」のノード「Ａ」）のメンバ「１」（メンバ識別子「22222」）の担当領域（「11112」〜「22222」）内に位置するデータであるため、（条件Ｂ）を満たすと判定される。
【００８５】
このようにして、データ整合処理部１０６は、（条件Ａ）、（条件Ｂ）の両方を満たすデータを抽出して、整合対象データリスト２００を生成する。この（条件Ｂ）を設定することにより、例えば、ノード１の離脱や追加により、メンバ識別子管理テーブル３００が変更され、再冗長化処理部１０５が、ノード１の処理負荷を抑えながら徐々に再冗長化処理を実行している場合に、その再冗長化処理により整合性回復が期待できるデータについては、不整合検出処理の対象としないようにすることができる。
【００８６】
図８に戻り、データ整合処理部１０６は、整合対象データリスト２００から１つの整合対象データのデータ識別子を抽出し、整合性確認処理を実行する（ステップＳ３１）。
この整合性確認処理は、以下の処理により行われる。自ノード１（所有者）のデータ整合処理部１０６は、所有者・バディ情報４０２に示される複製ノード（バディ）に対して、整合対象データ（原本データ）をハッシュ値に変換した値を送信する。その情報を受信した複製ノード（バディ）のデータ整合処理部１０６は、その整合対象データ（原本データ）に対応する複製データをハッシュ値に変換した値を算出し、その算出した複製データのハッシュ値と、受信した整合対象データ（原本データ）のハッシュ値とを比較することにより整合性を確認する。そして、複製ノード（バディ）のデータ整合処理部１０６は、その整合性の確認結果（整合、不整合）を、原本データを保持するノード１（所有者）に送信する。
【００８７】
続いて、自ノード１（所有者）のデータ整合処理部１０６は、複製ノード（バディ）から受信した整合性の確認結果が不整合であるか否かを判定する（ステップＳ３２）。そして、データ整合処理部１０６は、確認結果が不整合でなければ、つまり、整合であれば（ステップＳ３２→Ｎｏ）、ステップＳ３４に進む。一方、データ整合処理部１０６は確認結果が不整合であれば（ステップＳ３２→Ｙｅｓ）、次のステップＳ３３に進む。
【００８８】
ステップＳ３３において、データ整合処理部１０６は、整合性回復処理を実行する。
具体的には、データ整合処理部１０６は、その整合対象データ（原本データ）を、不整合となった複製ノード（バディ）に送信する。そして、複製ノード（バディ）のデータ整合処理部１０６が、受信した原本データを用いて、複製データを上書き（更新）することにより、整合性を回復させる。そして、ステップＳ３４に進む。
【００８９】
ステップＳ３４において、データ整合処理部１０６は、整合対象データリスト２００に抽出されたすべての整合対象データのデータ識別子を処理したか否かを判定する。ここで、まだ処理していない整合対象データのデータ識別子がある場合には（ステップＳ３４→Ｎｏ）、ステップＳ３１に戻る。一方、すべての整合対象データのデータ識別子の抽出を終えている場合には（ステップＳ３４→Ｙｅｓ）、不整合検出処理を終了する。
【００９０】
なお、ステップＳ３１〜Ｓ３４の処理について、データ整合処理部１０６は、複数のスレッドを設定して並列実行させてもよい。
【００９１】
以上説明したように、本実施形態に係るノードおよびプログラムによれば、再冗長化処理において整合性が回復できるデータについては、不整合検出処理の対象となるデータ（整合対象データ）として抽出しないことによりデータを絞り込みことができる。これにより、ノードおよびプログラムは、ノードへの負荷を抑えて原本データと複製データとの間に発生した不整合を検出し、回復することができる。
【符号の説明】
【００９２】
１      ノード
２      クライアント
３      ロードバランサ
４      振り分け装置
１０    制御部
１１    入出力部
１２    メモリ部
１３    記憶部（記憶手段）
１００  抽出データ管理テーブル
１０１  メンバ識別子管理部（メンバ識別子管理手段）
１０２  メッセージ処理部
１０３  データ情報付与部（データ情報付与手段）
１０４  データ抽出部
１０５  再冗長化処理部（再冗長化処理手段）
１０６  データ整合処理部（データ整合処理手段）
２００  整合対象データリスト
３００  メンバ識別子管理テーブル（メンバ識別子管理情報）
４００  データ
１０００  分散処理システム
【図１】
0005918802.tif 000002
【図２】
0005918802.tif 000003
【図３】
0005918802.tif 000004
【図４】
0005918802.tif 000005
【図５】
0005918802.tif 000006
【図６】
0005918802.tif 000007
【図７】
0005918802.tif 000008
【図８】
0005918802.tif 000009
【図９】
0005918802.tif 000010
【図１０】
0005918802.tif 000011
【図１１】
0005918802.tif 000012