(57)【特許請求の範囲】
【請求項１】
データベースを記憶する複数のノードと、前記複数のノードを管理する管理装置と、を備えるデータベースシステムであって、
前記管理装置は、
前記複数のノードのそれぞれの状況の変更に応じて、データ集合を記憶して前記データ集合へのアクセス要求を受け付ける第１ノード、および、前記データ集合を記憶して前記第１ノードのバックアップとなる第２ノードを割り当てて、前記複数のノードのそれぞれに割り当てに応じた動作を指示する第１割当部と、
前記複数のノードの状況と、前記第１ノードおよび前記第２ノードの割り当て状況の変更に応じて、前記第１ノードまたは前記第２ノードの候補となる第３ノードを割り当てて、前記複数のノードのそれぞれに対して、前記第３ノードに前記第１ノードまたは前記第２ノードとして動作させるための準備を指示する第２割当部と、
を有し、
前記複数のノードのそれぞれは、
前記第１ノードまたは前記第２ノードのデータ集合を、前記第３ノードに送信する転送部、
を有する
データベースシステム。
【請求項２】
前記複数のノードは、前記データベースを複数のパーティションに分割して記憶し、
前記第１割当部は、前記複数のパーティションのそれぞれに対して、前記第１ノードおよび前記第２ノードを割り当て、
前記第２割当部は、前記複数のパーティションのそれぞれに対して、前記第３ノードを割り当てる
請求項１に記載のデータベースシステム。
【請求項３】
前記第１割当部は、複数のパーティションのそれぞれに対して、前記複数のノードのそれぞれが前記第１ノードか前記第２ノードかを示す第１テーブルを生成し、前記第１テーブルを前記複数のノードのそれぞれに配布することにより割り当てに応じた動作を指示し、
前記第２割当部は、複数のパーティションのそれぞれに対して、前記複数のノードのそれぞれが前記第３ノードかを示す第２テーブルを生成し、前記第２テーブルを前記複数のノードのそれぞれに配布することにより前記準備を指示する
請求項２に記載のデータベースシステム。
【請求項４】
前記第１割当部は、前記第３ノードへのデータ集合の送信が完了した場合、前記複数のパーティションのそれぞれに対して前記第１ノードおよび前記第２ノードを再度割り当てる
請求項２に記載のデータベースシステム。
【請求項５】
前記複数のノードのうちの何れかのノードで障害が発生した場合、
前記第１割当部は、前記障害が発生したノードを除いて、前記第１ノードおよび前記第２ノードを再度割り当て、
前記第２割当部は、前記障害が発生したノードを除いて、前記第３ノードを再度割り当てる
請求項４に記載のデータベースシステム。
【請求項６】
前記第２割当部は、前記複数のパーティションのそれぞれに対して、少なくとも前記第１ノードおよび前記第２ノードが存在するように、前記第３ノードを割り当てる
請求項５に記載のデータベースシステム。
【請求項７】
新たなノードが追加された場合、前記第２割当部は、前記複数のパーティションのそれぞれに対して、前記新たなノードを含めて前記第３ノードを再度割り当てる
請求項４に記載のデータベースシステム。
【請求項８】
前記第２割当部は、割り当てられた前記第１ノードおよび前記第２ノードの数の差がノード間で予め定められた値の範囲内となるように、前記複数のパーティションのそれぞれに対して、前記第３ノードを割り当てる
請求項７に記載のデータベースシステム。
【請求項９】
前記第２割当部は、演算能力の高いノードが演算能力の低いノードよりも優先的に前記第１ノードまたは前記第２ノードとなるように、前記第３ノードを割り当てる
請求項８に記載のデータベースシステム。
【請求項１０】
前記第２割当部は、前記アクセス要求を受け付ける数が少ないノードが前記アクセス要求を受け付ける数が多いノードよりも優先的に前記第１ノードまたは前記第２ノードとなるように、前記第３ノードを割り当てる
請求項８に記載のデータベースシステム。
【請求項１１】
前記複数のノードのそれぞれは、前記第１ノードのパーティションに対する一連のアクセス要求を含むトランザクションを受け付けてクライアントからのアクセス要求に応じた処理を実行し、前記パーティションのデータ集合の更新または登録のアクセス要求を実行する場合、前記第２ノードに一連のアクセス要求を含むトランザクションを送信して実行させるアクセス処理部をさらに有し、
前記転送部は、前記第１ノードまたは前記第２ノードの前記パーティションのデータ集合を、前記トランザクションの実行を妨害しないバックグラウンドで、前記第３ノードに送信する
請求項１に記載のデータベースシステム。
【請求項１２】
データベースを記憶する複数のノードを管理する管理装置であって、
前記管理装置は、
前記複数のノードのそれぞれの状況の変更に応じて、データ集合を記憶して前記データ集合へのアクセス要求を受け付ける第１ノード、および、前記データ集合を記憶して前記第１ノードのバックアップとなる第２ノードを割り当てて、前記複数のノードのそれぞれに割り当てに応じた動作を指示する第１割当部と、
前記複数のノードの状況と、前記第１ノードおよび前記第２ノードの割り当て状況との変更に応じて、前記第１ノードまたは前記第２ノードの候補となる第３ノードを割り当てて、前記複数のノードのそれぞれに対して、前記第３ノードに前記第１ノードまたは前記第２ノードとして動作させるための準備を指示する第２割当部と、
を有し、
前記複数のノードのそれぞれは、
前記第１ノードまたは前記第２ノードのデータ集合を、前記第３ノードに送信する
管理装置。
【請求項１３】
請求項１に記載のデータベースシステムに備えられるノード。
【請求項１４】
請求項１に記載のデータベースシステムに備えられる管理装置としてコンピュータを機能させるためのプログラム。
【請求項１５】
請求項１に記載のデータベースシステムに備えられるノードとしてコンピュータを機能させるためのプログラム。
【請求項１６】
データベースを記憶する複数のノードと、前記複数のノードを管理する管理装置と、を備えるデータベースシステムにおけるデータ処理方法であって、
前記管理装置が、
前記複数のノードのそれぞれの状況の変更に応じて、データ集合を記憶して前記データ集合へのアクセス要求を受け付ける第１ノード、および、前記データ集合を記憶して前記第１ノードのバックアップとなる第２ノードを割り当てて、前記複数のノードのそれぞれに割り当てに応じた動作を指示する第１割当ステップと、
前記複数のノードの状況と、前記第１ノードおよび前記第２ノードの割り当て状況の変更に応じて、前記第１ノードまたは前記第２ノードの候補となる第３ノードを割り当てて、前記複数のノードのそれぞれに対して、前記第３ノードに前記第１ノードまたは前記第２ノードとして動作させるための準備を指示する第２割当ステップと、
を実行し、
前記複数のノードのそれぞれが、
前記第１ノードまたは前記第２ノードのデータ集合を、前記第３ノードに送信する転送ステップ
を実行する
データ処理方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明の実施形態は、データベースシステム、プログラムおよびデータ処理方法に関する。
【背景技術】
【０００２】
（シェアードナッシング型データベース）
従来より、シェアードナッシング型のデータベースシステムが知られている。シェアードナッシング型のデータベースシステムは、互いがネットワークで接続された複数のデータベースノードを備える。【０００３】
複数のデータベースノードのそれぞれは、プロセッサ、メモリおよびストレージ等のリソースを個別に有するコンピュータである。シェアードナッシング型のデータベースシステムは、データベースノード毎にリソースが完全に分離されているので、データベースノード間でアクセス競合が発生しない。従って、シェアードナッシング型のデータベースシステムは、データベースノードを増やすことにより性能を線形に向上させることができる。すなわち、シェアードナッシング型のデータベースシステムは、データベースノードを追加するスケールアウトが効率良く実現できるシステムである。【０００４】
（パーティショニング）
シェアードナッシング型のデータベースシステムでは、パーティショニングと呼ばれる技術を適用できる。パーティショニングは、データベースを複数に分割し、分割したそれぞれのデータ集合（パーティションと呼ばれる。）を複数のデータベースノードに分散して記憶させる技術である。パーティショニングを適用したシェアードナッシング型のデータベースシステムは、それぞれのデータベースノードに記憶させるデータ集合を小さくできるので、クライアントからのアクセスを複数のデータベースノードに分散させることができる。【０００５】
（シャーディング）
データベース技術の一つに、シャーディングと呼ばれる技術がある。シャーディングは、データをより小さなデータに分割し、複数のデータベースノードに自動的に分散して保存する技術である。シャーディングは、シェアードナッシング型のデータベースシステムのパーティショニングと類似した技術である。【０００６】
（分散キーバリュー型データベース）
また、キーバリュー型データベースが知られている。キーバリュー型データベースは、プログラミング言語の連想配列またはＭａｐと同様にキーとバリューとのペアからなる単純なデータモデルに基づくデータベースである。また、キーバリュー型データベースをキーによりシャーディングすることで分散化した分散キーバリュー型データベースも知られている。【０００７】
キーバリュー型データベースは、データモデルが単純であるので、シャーディングおよびパーティショニングの処理が容易である。また、分散キーバリュー型データベースは、複数のキーバリュー型データベースノードを使って、単一のキーバリュー型データベースノードでは対応できないような大規模なデータ集合を処理することができる。従って、分散キーバリュー型データベースを、複数のデータベースノードを備えるシェアードナッシング型のデータベースシステムに適用することにより、スケールアウトが可能な大規模なデータベースシステムを実現することができる。【０００８】
さらに、このような分散キーバリュー型データベースを適用したシェアードナッシング型のデータベースシステム（以下、スケールアウト型データベースシステムと呼ぶ）は、複数のデータベースノードに均等にデータを配置することにより、クライアントからのアクセスを分散させて、全体としてスループットおよびレスポンスを向上させることができる。
【先行技術文献】
【特許文献】
【０００９】
【特許文献１】特開２００９−１５７７８５号公報
【特許文献２】特開２００５−１９６６０２号公報
【非特許文献】
【００１０】
【非特許文献１】“MongoDB  Manual  Contents”、[Online]、１０ｇｅｎ、[平成２５年１月１８日検索]、インターネット<URL:http://docs.mongodb.org/manual/contents/>
【発明の概要】
【発明が解決しようとする課題】
【００１１】
ところで、スケールアウト型データベースシステムでは、データの複製（レプリカ）を他のデータベースノードに記憶させるレプリケーションと呼ばれる技術が適用される。スケールアウト型データベースシステムは、レプリケーションを行うことで、あるデータベースノードに障害が生じたとしても、レプリカを記憶したデータベースノードを用いてサービスを継続することができる。データのレプリカを記憶するデータベースノードの個数を冗長度と呼ぶ。スケールアウト型データベースシステムでは、例えば冗長度として２個または３個が設定される。【００１２】
ここで、スケールアウト型データベースシステムは、データベースノードに障害が発生し、障害が発生したデータベースノードを切り離すと、予め設定した値よりも冗長度が低下する。スケールアウト型データベースシステムは、冗長度が低下したまま長時間を稼動し続けると、更なるデータベースノードの障害が発生したときにシステム全体の動作停止または広範囲のデータ損失が発生する可能性が高くなる。このため、スケールアウト型データベースシステムでは、データベースノードに障害が発生した後に、新たなデーベースノードを追加し、追加されたデータベースノードにレプリカを記憶させて冗長度を元に戻す仕組みが必要である。【００１３】
また、スケールアウト型データベースシステムでは、データの配置によっては、記憶するデータ量がデータベースノード間で不均衡となる場合がある。また、スケールアウト型データベースシステムでは、データの配置によっては、クライアントからのアクセス量がデータベースノード間で不均衡となる場合がある。【００１４】
このようなデータ配置の不均衡が大きくなると、スケールアウト型データベースシステムでは、データ量の多いデータベースノードまたはクライアントからのアクセスのデータベースノードでの処理時間が相対的に長くなる。スケールアウト型データベースシステムは、クライアントからのアクセスを分散させることがメリットの一つであるので、このようなデータ配置の不均衡によりメリットが失われてしまう。【００１５】
以上のような冗長度の低下およびデータ配置の不均衡を解決するために、スケールアウト型データベースシステムは、データ配置に不均衡が生じた時点で複数のデータベースノードへのデータの再配置処理をしなければならない。【００１６】
しかしながら、従来のデータベースシステムでは、このような再配置処理を、サービスを停止した状態で実施しなければならなかった。また、従来のデータベースシステムでは、データの再配置処理の負荷が非常に高いので、効率良く処理を実行しなければ著しく処理効率を悪化させてしまっていた。
【課題を解決するための手段】
【００１７】
実施形態に係るデータベースシステムは、データベースを記憶する複数のノードと、複数のノードを管理する管理装置と、を備える。管理装置は、第１割当部と、第２割当部とを有する。第１割当部は、複数のノードのそれぞれの状況の変更に応じて、データ集合を記憶してデータ集合へのアクセス要求を受け付ける第１ノード、および、データ集合を記憶して第１ノードのバックアップとなる第２ノードを割り当てて、複数のノードのそれぞれに割り当てに応じた動作を指示する。第２割当部は、複数のノードの状況と、第１ノードおよび第２ノードの割り当て状況の変更に応じて、第１ノードまたは第２ノードの候補となる第３ノードを割り当てて、複数のノードのそれぞれに対して、第３ノードに第１ノードまたは第２ノードとして動作させるための準備を指示する。複数のノードのそれぞれは、第１ノードまたは第２ノードのデータ集合を、第３ノードに送信する転送部、を有する。
【図面の簡単な説明】
【００１８】
【図１】図１は、実施形態に係るデータベースシステムのハードウェア構成を示す図である。
【図２】図２は、実施形態に係るデータベースシステムの機能構成を示す図である。
【図３】図３は、データ保持表の一例を示す図である。
【図４】図４は、現役割表の一例を示す図である。
【図５】図５は、次役割表の一例を示す図である。
【図６】図６は、目標役割表の一例を示す図である。
【図７】図７は、データストア部に記憶されているデータ集合の一例を示す図である。
【図８】図８は、レプリケーション処理を説明するための図である。
【図９】図９は、短期同期処理を説明するための図である。
【図１０】図１０は、長期同期処理を説明するための図である。
【図１１】図１１は、ノードに割り当てられる役割の遷移を示す図である。
【図１２】図１２は、管理装置のクラスタ管理部の処理フローを示す図である。
【図１３】図１３は、管理装置の第１割当部による次役割表の算出処理のフローを示す図である。
【図１４】図１４は、管理装置の第２割当部による目標役割表の算出処理のフローを示す図である。
【図１５】図１５は、ノードのアクセス処理部の処理フローを示す図である。
【図１６】図１６は、ノードのノード管理部の処理フローを示す図である。
【図１７】図１７は、ノードの転送部の処理フローを示す図である。
【図１８】図１８は、３つのパーティション＃１〜＃３のそれぞれに対して、オーナーおよびバックアップとなるノードを割り当てた場合の、ノード３０−Ａからノード３０−Ｃのそれぞれの状態を示す図である。
【図１９】図１９は、図１８の状態からノード３０−Ｃに障害が発生したことに応じて短期同期処理を実行した後の、ノード３０−Ａからノード３０−Ｃのそれぞれの状態を示す図である。
【図２０】図２０は、図１９の状態から実行される長期同期処理の一例を示す図である。
【図２１】図２１は、図２０の長期同期処理が完了したことに応じて短期同期処理を実行した後の、ノード３０−Ａからノード３０−Ｃのそれぞれの状態を示す図である。
【図２２】図２２は、図２１の状態からノード３０−Ｄを追加した場合の、ノード３０−Ａからノード３０−Ｄのそれぞれの状態を示す図である。
【図２３】図２３は、図２２の状態から実行される長期同期処理の一例を示す図である。
【図２４】図２４は、図２３の長期同期処理が完了したことに応じて短期同期処理を実行した後の、ノード３０−Ａからノード３０−Ｄのそれぞれの状態を示す図である。
【発明を実施するための形態】
【００１９】
図１は、実施形態に係るデータベースシステム１０のハードウェア構成を示す図である。データベースシステム１０は、外部のコンピュータであるクライアントからデータベースに対するアクセス要求（例えば、参照、更新または登録）をネットワークを介して受信し、受信したアクセス要求に応じた処理を実行する。
【００２０】
データベースシステム１０は、管理装置２０と、複数のノード３０とを備える。管理装置２０および複数のノード３０は、ネットワークを介して互いに接続される。なお、図１には２個のノード３０が示されているが、データベースシステム１０は、３個以上のノード３０を備えてもよい。
【００２１】
データベースシステム１０は、一例として、分散キーバリュー型データベースをシェアードナッシング型のデータベースに適用したスケールアウトが可能なデータベースシステムである。このようなデータベースシステム１０は、複数のノード３０にデータ集合が分散されているが、外部のコンピュータであるクライアントから巨大な一つのデータベースとしてアクセスされる。
【００２２】
管理装置２０および複数のノード３０のそれぞれは、互いにハードウェア的に独立したコンピュータである。複数のノード３０のそれぞれは、クライアントからのアクセス要求を独立に受け付け、アクセス要求に応じた処理を独立にすることができる。
【００２３】
管理装置２０および複数のノード３０のそれぞれは、一例として、ＣＰＵ（Central  Processing  Unit）１２、メモリ１３、通信Ｉ／Ｆ１４およびストレージＩ／Ｆ１５を有する。また、管理装置２０および複数のノード３０のそれぞれは、ストレージＩ／Ｆ１５を介して外部記憶装置１６に接続される。なお、外部記憶装置１６は、ノード３０の内部に設けられていてもよい。
【００２４】
また、データベースシステム１０は、データベースを複数のパーティションに分割して記憶する。パーティションの数は、予め定められている。データベースを分割する方法は、予め定められた方法であれば、どのような方法であってもよい。
【００２５】
複数のノード３０のそれぞれは、複数のパーティションのそれぞれ毎に、オーナーとしての役割を担うか、バックアップとしての役割を担うか、または、オーナーおよびバックアップの何れの役割も担わないかが割り当てられる。
【００２６】
オーナーは、対応するパーティションのデータ集合を記憶して、対応するパーティションのデータ集合へのクライアントからのアクセス要求を受け付けて処理する。また、バックアップは、対応するパーティションのデータ集合を記憶して、例えばオーナーに障害が発生したときに、代わってオーナーの役割を担えるように、オーナーをバックアップする。なお、オーナーおよびバックアップと呼ばずに、マスターおよびスレーブと呼ばれる場合もある。
【００２７】
管理装置２０は、複数のノード３０を管理する。管理装置２０は、一例として、複数のパーティションのそれぞれ毎に、オーナーとするノード３０およびバックアップとするノード３０を割り当てる。
【００２８】
この場合において、管理装置２０は、何れかのノード３０の故障によっても可能な限りデータベースが復元されるように冗長度を予め定められた範囲で持たせるように、バックアップとするノード３０を割り当てる。さらに、管理装置２０は、データベースに含まれるデータ集合が複数のノード３０に分散して配置されるように、オーナーおよびバックアップとするノード３０を割り当てる。
【００２９】
なお、管理装置２０は、何れかのノード３０に設けられてもよい。また、管理装置２０として機能するノード３０は、任意のアルゴリズムにより選択されてもよい。また、管理装置２０として機能するノード３０に障害が発生した場合には、他のノード３０が管理装置２０として機能してもよい。
【００３０】
このようなデータベースシステム１０は、複数のノード３０のうち何れかのノード３０に障害が発生した場合には、障害が発生したノード３０を切り離すことができる。また、データベースシステム１０は、新たにノード３０を追加して、データベースの性能を向上させることができる。
【００３１】
図２は、実施形態に係るデータベースシステム１０の機能構成を示す図である。
【００３２】
管理装置２０は、表記憶部２１と、第１割当部２２と、第２割当部２３と、クラスタ管理部２４とを有する。第１割当部２２、第２割当部２３およびクラスタ管理部２４は、管理装置２０のＣＰＵ１２がプログラムを実行することにより実現される。また、第１割当部２２、第２割当部２３およびクラスタ管理部２４は、一部または全部がハードウェア回路で実現されてもよい。また、表記憶部２１は、管理装置２０のメモリ１３または外部記憶装置１６により実現される。
【００３３】
表記憶部２１は、複数のパーティションのそれぞれに対する複数のノード３０のそれぞれの役割を定めるための４つの表を記憶する。４つの表のそれぞれは、テーブル形式のデータであってもよいし、テーブル形式以外のデータであってもよい。
【００３４】
具体的には、表記憶部２１は、データ保持表、現役割表、次役割表および目標役割表を記憶する。
【００３５】
データ保持表は、複数のパーティションのそれぞれに対する、複数のノード３０のそれぞれのタイムスタンプを格納する。タイムスタンプは、対応するノード３０が記憶している対応するパーティションのデータ集合の更新履歴を表す。タイムスタンプは、一例として、データ集合が更新される毎にインクリメントされる値である。従って、あるパーティションにおけるタイムスタンプの最も大きいノード３０は、そのパーティションの最新のデータ集合を記憶しているノード３０であることを意味する。
【００３６】
なお、データベースのサイズが時間とともに増加していく場合、データ保持表は、タイムスタンプに代えて、対応するノード３０が記憶している対応するパーティションのデータ集合のサイズまたはデータ数等を格納してもよい。
【００３７】
データ保持表は、一例として、図３に示されるように、行によりノード３０が特定され、列によりパーティションが特定される。この場合、データ保持表は、行および列が直交するそれぞれのセルに、その行により特定されるノード３０が記憶している、その列により特定されるパーティションのデータ集合のタイムスタンプを格納する。
【００３８】
現役割表は、複数のパーティションのそれぞれに対する、複数のノード３０のそれぞれに割り当てられたデータベースでの役割を格納する。具体的には、現役割表は、複数のパーティションのそれぞれに対して、複数のノード３０のそれぞれがオーナーとして割り当てられているか、バックアップとして割り当てられているか、または、オーナーとしてもバックアップとしても割り当てられていないかを格納する。
【００３９】
現役割表は、一例として、図４に示されるように、行によりノード３０が特定され、列によりパーティションが特定される。この場合、現役割表は、行および列が直交する位置のそれぞれのセルに、その列により特定されるパーティションに対する、その行により特定されるノード３０に割り当てられた役割を格納する。なお、図面には、オーナーとしての役割が割り当てられていることを“ＯＷＮＥＲ”または“Ｏ”と記載し、バックアップとしての役割が割り当てられていることを“ＢＡＣＫＵＰ”または“Ｂ”を記載し、オーナーにもバックアップにも割り当てられていないことを“Ｎｏｎｅ”または“Ｎ”を記載し若しくは空白とする。
【００４０】
次役割表は、複数のパーティションのそれぞれに対する、複数のノード３０のそれぞれに次に割り当てられる役割を格納する。すなわち、次役割表は、複数のパーティションのそれぞれに対して、複数のノード３０のそれぞれが、次に、オーナーとして割り当てられているか、バックアップとして割り当てられているか、または、オーナーとしてもバックアップとしても割り当てられていないかを格納する。次役割表は、例えばノード３０に障害が発生したり新たなノード３０が追加されたりした場合等に、現役割表と置き換えられる表である。
【００４１】
次役割表は、一例として、図５に示されるように、行によりノード３０が特定され、列によりパーティションが特定される。この場合、次役割表は、行および列が直交する位置のそれぞれのセルに、その列により特定されるパーティションに対する、その行により特定されるノード３０に割り当てられた次の役割を格納する。
【００４２】
目標役割表は、複数のパーティションのそれぞれに対する、複数のノード３０のそれぞれに割り当てられたバックアップの候補としての役割を格納する。バックアップの候補は、将来、そのパーティションに対して、そのノード３０がオーナーまたはバックアップとしての役割を担うための準備をする役割である。なお、本実施形態の説明では、役割の名称を「バックアップの候補」としているが、バックアップの候補に割り当てられたノード３０が、将来、オーナーとなってもよい。
【００４３】
目標役割表は、一例として、図６に示されるように、行によりノード３０が特定され、列によりパーティションが特定される。この場合、目標役割表は、行および列が直交する位置のそれぞれのセルに、その列により特定されるパーティションに対する、その行により特定されるノード３０に割り当てられたバックアップの候補としての役割を格納する。なお、図面には、バックアップの候補としての役割が割り当てられている場合には“ＭＩＤ−ＢＡＣＫＵＰ”または“Ｍ”を記載し、バックアップの候補として割り当てられていない場合には空白とする。
【００４４】
第１割当部２２は、複数のノード３０のそれぞれの状況の変更に応じて、複数のパーティションのそれぞれに対して、オーナーとなるノード３０、および、バックアップとなるノード３０を割り当てる。また、例えば、複数のノード３０のうちの何れかのノード３０で障害が発生した場合、第１割当部２２は、障害が発生したノード３０を除いてオーナーおよびバックアップとなるノード３０を再度割り当てる。
【００４５】
また、新たなノード３０が追加された場合、第１割当部２２は、複数のパーティションのそれぞれに対して、新たなノード３０を含めてオーナーおよびバックアップとなるノード３０を再度割り当てる。また、バックアップの候補として割り当てられたノード３０へのデータ集合の送信が完了したことによりオーナーまたはバックアップとなることができるノード３０が新たに発生した場合、第１割当部２２は、複数のパーティションのそれぞれに対してオーナーおよびバックアップとなるノード３０を再度割り当てる。
【００４６】
ここで、第１割当部２２は、複数のパーティションの全てに対して、少なくともオーナーが存在するように、オーナーおよびバックアップとなるノード３０を割り当てる。これにより、第１割当部２２は、少なくともデータベースを機能させることができる。
【００４７】
また、第１割当部２２は、少なくともデータベースを機能させることを条件として、予め定められた範囲内の冗長度を有するように、複数のパーティションのそれぞれに対してオーナーおよびバックアップとなるノード３０を割り当てる。これにより、第１割当部２２は、何れかのノード３０に障害が発生しても、少なくともデータベースを機能させることができる可能性を高くすることができる。
【００４８】
また、第１割当部２２は、少なくともデータベースを機能させ且つ予め定められた範囲内の冗長度を有する条件として、オーナーおよびバックアップが複数のノード３０のそれぞれに分散するように、複数のパーティションのそれぞれに対してオーナーおよびバックアップとなるノード３０を割り当てる。これにより、第１割当部２２は、複数のノード３０のそれぞれの処理の負荷を均等とすることができる。
【００４９】
なお、本例においては、第１割当部２２は、次役割表を計算することにより、オーナーおよびバックアップとなるノード３０を割り当てる。第１割当部２２による次役割表の算出方法の一例については、図１３を参照して後で説明する。
【００５０】
第２割当部２３は、複数のノード３０の状況および現割当表により割り当てられるオーナーおよびバックアップの割り当て状況の変更に応じて、複数のパーティションのそれぞれに対して、バックアップの候補となるノード３０を割り当てる。また、例えば複数のノード３０のうちの何れかのノード３０で障害が発生した場合、第２割当部２３は、障害が発生したノード３０を除いてバックアップの候補となるノード３０を再度割り当てる。また、例えば、新たなノード３０が追加された場合、第２割当部２３は、複数のパーティションのそれぞれに対して、新たなノード３０を含めてバックアップの候補となるノード３０を再度割り当てる。
【００５１】
ここで、第２割当部２３は、将来において予め定められた範囲内の冗長度を有するように、複数のパーティションのそれぞれに対してバックアップの候補となるノード３０を割り当てる。これにより、第２割当部２３は、将来において何れかのノード３０に障害が発生しても、少なくともデータベースを機能させることができる可能性を高くすることができる。
【００５２】
また、第２割当部２３は、将来においてオーナーおよびバックアップが複数のノード３０のそれぞれに分散して割り当てられるように、複数のパーティションのそれぞれに対してバックアップの候補となるノード３０を割り当てる。これにより、第２割当部２３は、将来において複数のノード３０のそれぞれの処理の負荷を均等とすることができる。
【００５３】
なお、本例においては、第２割当部２３は、目標役割表を計算することにより、バックアップの候補となるノード３０を割り当てる。第２割当部２３による目標役割表の算出方法の一例については、図１４を参照して後で説明する。
【００５４】
クラスタ管理部２４は、複数のノード３０のそれぞれとネットワークを介してメッセージをやり取りして、複数のノード３０のそれぞれを管理する。例えば、クラスタ管理部２４は、一定時間毎に、ハートビートと呼ばれるメッセージを複数のノード３０のそれぞれとやり取りする。そして、クラスタ管理部２４は、ハートビートの返信の有無によって、障害が発生したノード３０を特定する。
【００５５】
また、クラスタ管理部２４は、定期的に、複数のノード３０のそれぞれからデータ保持表を受信する。そして、クラスタ管理部２４は、全てのノード３０から受信したデータ保持表をまとめて表記憶部２１に記憶させる。また、クラスタ管理部２４は、データ保持表が受信できたか否かによって、障害が発生したノード３０を特定する。
【００５６】
また、クラスタ管理部２４は、起動時に、第１割当部２２に次役割表を算出させ、算出させた次役割表を複数のノード３０のそれぞれに配布することにより複数のノード３０のそれぞれに割り当てに応じた動作を指示する。また、クラスタ管理部２４は、定期的に、第１割当部２２に次役割表を算出させる。そして、クラスタ管理部２４は、算出させた次役割表が現役割表から変化した場合、算出させた次役割表を複数のノード３０のそれぞれに配布することにより複数のノード３０のそれぞれに割り当てに応じた動作を指示する。そして、クラスタ管理部２４は、次役割表を配布後、表記憶部２１に記憶されている現役割表を、次役割表の内容に更新する。
【００５７】
例えば、何れかのノード３０に障害が発生した場合、新たなノード３０の追加があった場合、または、候補として割り当てられたノード３０へのデータ集合の送信が完了してバックアップとして割り当て可能なノード３０が発生した場合、第１割当部２２は、算出した次役割表が現役割表から変化する。従って、クラスタ管理部２４は、このような場合、次役割表を複数のノード３０のそれぞれに配布する。
【００５８】
また、クラスタ管理部２４は、定期的に、第２割当部２３に目標役割表を算出させ、算出した目標役割表を複数のノード３０のそれぞれに配布する。クラスタ管理部２４は、目標役割表を配布することにより、複数のノード３０のそれぞれに対して、候補として割り当てられたノード３０にオーナーまたはバックアップとして動作させるための準備を指示する。なお、クラスタ管理部２４は、次役割表と目標役割表とを異なる周期で算出させる。
【００５９】
複数のノード３０のそれぞれは、データストア部３１と、表記憶部３２と、アクセス処理部３３と、ノード管理部３４と、転送部３５とを有する。アクセス処理部３３、ノード管理部３４および転送部３５は、ノード３０のＣＰＵ１２がプログラムを実行することにより実現される。また、アクセス処理部３３、ノード管理部３４および転送部３５は、一部または全部がハードウェア回路で実現されてもよい。データストア部３１および表記憶部３２は、ノード３０のメモリ１３または外部記憶装置１６により実現される。
【００６０】
データストア部３１は、データベースを分割した複数のパーティションのうち、自ノードが現役割表によりオーナーまたはバックアップに割り当てられたパーティションのデータ集合を記憶する。例えば、図７に示されるように、３つに分割されたパーティション＃１〜＃３のうち、自ノードが、パーティション＃１に対してオーナーに割り当てられ、パーティション＃３に対してバックアップに割り当てられているとする。この場合、データストア部３１は、パーティション＃１およびパーティション＃３のデータ集合を記憶する。
【００６１】
また、ノード３０は、目標役割表によりバックアップの候補に割り当てられたパーティションについては、そのパーティションのオーナーに割り当てられたノード３０からデータ集合を受信する。データストア部３１は、自ノードが目標役割表によりバックアップの候補に割り当てられたパーティションのデータ集合における、オーナーのノード３０から受信済みの一部または全部を記憶する。
【００６２】
表記憶部３２は、データ保持表の自ノードに対応する部分を記憶する。また、表記憶部３２は、現役割表、次役割表および目標役割表を記憶する。現役割表は、次役割表を受信した場合、次役割表の内容に書き換えられる。目標役割表は、定期的に受信する目標役割表が変化した場合には、変化後の内容に書き換えられる。
【００６３】
アクセス処理部３３は、クライアントからのアクセス要求をネットワークを介して受信する。そして、アクセス処理部３３は、複数のパーティションのそれぞれに対して、現役割表により自ノードに対して割り当てられた役割に応じた処理を実行する。
【００６４】
具体的には、アクセス処理部３３は、現役割表によりオーナーとして割り当てられたパーティションに対するクライアントからのアクセス要求を受け付けて、そのアクセス要求に応じた処理を実行する。アクセス処理部３３は、一例として、参照要求を受け付けた場合には、そのパーティションのデータ集合の中の対応するデータを読み出してクライアントに送信する。また、アクセス処理部３３は、一例として、更新要求を受け付けた場合には、そのパーティションのデータ集合の対応するデータを更新する。また、アクセス処理部３３は、一例として、登録要求を受け付けた場合には、そのパーティションのデータ集合に新たなデータを登録する。
【００６５】
なお、アクセス処理部３３は、一連のアクセス要求を含むトランザクションを受け付けてもよい。この場合、アクセス処理部３３は、クライアントからの一連のアクセス要求をトランザクション処理により実行する。
【００６６】
また、アクセス処理部３３は、更新要求および登録要求を処理した場合には、現役割表によりそのパーティションについてバックアップに割り当てられたノード３０との間でレプリケーション処理を実行する。レプリケーション処理とは、バックアップに割り当てられたノード３０に、オーナーに割り当てられたノード３０に記憶されているデータ集合のレプリカ（複製）を生成するための処理である。
【００６７】
具体的には、図８に示されるように、アクセス処理部３３は、自ノードがオーナーに割り当てられたパーティションに対する更新または登録の要求を受け付けた場合、同一のアクセス要求をバックアップとして割り当てられた他のノード３０へと送信する。そして、他のノード３０のアクセス処理部３３は、バックアップとして割り当てられたパーティションに対する、オーナーとして割り当てられたノード３０から更新または登録の要求を受け付けて、その要求に応じた更新または登録の処理を実行する。
【００６８】
アクセス処理部３３は、このようなレプリケーション処理をすることにより、オーナーとして割り当てられたノード３０とバックアップとして割り当てられたノード３０との間で、データ集合の同期を取ることができる。
【００６９】
なお、オーナーとして割り当てられたノード３０のアクセス処理部３３は、レプリケーション処理を実行する場合において、一連のアクセス要求を含むトランザクションを送信してもよい。この場合、バックアップとして割り当てられたノード３０のアクセス処理部３３は、レプリケーション処理をトランザクション処理により実行する。
【００７０】
また、アクセス処理部３３は、更新要求および登録要求を処理した場合には、表記憶部３２に記憶されたデータ保持表の対応するパーティションのタイムスタンプを更新する。
【００７１】
ノード管理部３４は、管理装置２０のクラスタ管理部２４とネットワークを介してメッセージをやり取りする。ノード管理部３４は、クラスタ管理部２４からハートビートと呼ばれるメッセージを受信したことに応じて、自ノードに障害が発生していければ応答メッセージを送信する。また、ノード管理部３４は、定期的に、表記憶部３２に記憶されているデータ保持表をクラスタ管理部２４へと送信する。
【００７２】
また、ノード管理部３４は、クラスタ管理部２４から次役割表を受信し、受信した次役割表を表記憶部３２に記憶させる。そして、次役割表を受信した場合には、ノード管理部３４は、図９に示されるように、次役割表により割り当てられた役割で複数のノード３０のそれぞれを動作させるためにクライアントからのアクセス要求に応じた処理を一時的に中断して行う同期処理である、短期同期処理を実行する。
【００７３】
具体的には、ノード管理部３４は、複数のパーティションのそれぞれに対して、次役割表により示された役割で複数のノード３０のそれぞれを動作させるために、アクセス処理部３３にレプリケーション処理と同様の処理を実行させる。これにより、ノード管理部３４は、複数のパーティションのそれぞれに対して、オーナーとして割り当てられたノード３０とバックアップとして割り当てられたノード３０との間のデータ集合の同期を取ることができる。そして、データ集合の同期をとった後に、ノード管理部３４は、アクセス処理部３３に、現役割表を次役割表の内容に書き換えて、複数のパーティションのそれぞれに対する次役割表により割り当てられた新たな役割に応じた処理を実行させる。
【００７４】
そして、ノード管理部３４は、短期同期処理が完了すると、現役割表の内容を次役割表の内容に更新する。以後、アクセス処理部３３は、クライアントからのアクセス要求を受け付けることができる。
【００７５】
また、ノード管理部３４は、クラスタ管理部２４から目標役割表を定期的に受信し、受信した目標役割表を表記憶部３２に記憶させる。
【００７６】
転送部３５は、図１０に示されるように、目標役割表により割り当てられた役割で複数のノード３０のそれぞれを動作させるためにクライアントからのアクセス要求に対する処理を中断させずに行う同期処理である、長期同期処理を実行する。具体的には、転送部３５は、自ノードが現役割表によりオーナーとして割り当てられたパーティションのデータ集合を、目標役割表によりバックアップの候補として割り当てられており且つ現役割表によりオーナーにもバックアップにも割り当てられていない他のノード３０に、アクセス要求に対する処理を中断させずに送信する。また、転送部３５は、自ノードが目標役割表によりバックアップの候補として割り当てられており且つ現役割表によりオーナーにもバックアップにも割り当てられていないパーティションのデータ集合を、現役割表によりオーナーとして割り当てられた他のノード３０から、アクセス要求に対する処理を中断させずに受信する。
【００７７】
転送部３５は、このような長期同期処理を実行することにより、オーナーに割り当てられたノード３０に記憶されたデータ集合のレプリカを、オーナーまたはバックアップに割り当てられていないノード３０に記憶させることができる。これにより、転送部３５は、長期同期処理が完了した後において、オーナーまたはバックアップとなることができるノード３０を新たに生成することができる。
【００７８】
ここで、長期同期処理を実行する場合において、転送部３５は、オーナーに割り当てられたパーティションのデータ集合を、アクセス処理部３３によるトランザクションの実行を妨害しないバックグラウンドで、バックアップの候補として割り当てられたノード３０に送信する。また、転送部３５は、バックアップの候補として割り当てられたパーティションのデータ集合を、バックグラウンドで、オーナーに割り当てられたノード３０から受信する。なお、バックグラウンドでの処理とは、一例として、ノード３０が複数のＣＰＵ１２を備える場合にはトランザクション処理を実行していない一部のＣＰＵ１２を用いて実行する処理である。また、バックグラウンドでの処理とは、一例として、ＣＰＵ１２が時分割処理をしている場合にはＣＰＵ１２がトランザクション処理を実行していない一部の時間帯で実行する処理である。これにより、転送部３５は、クライアントからのアクセス要求に対する応答速度等の低下を招くことなく、長期同期処理を実行することができる。
【００７９】
また、転送部３５は、現役割表で自ノードがバックアップに割り当てられたパーティションのデータ集合を、目標役割表によりバックアップの候補に割り当てられており且つオーナーにもバックアップにも割り当てられていない他のノード３０に対して送信してもよい。この場合、転送部３５は、他のノード３０から同一のデータ集合が送信されていないことを条件として処理をする。
【００８０】
図１１は、ノード３０に割り当てられる役割の遷移を示す図である。ノード３０は、複数のパーティションのそれぞれに対して、“オーナー”、“バックアップ”または“バックアップの候補”が割り当てられた状態、または、何れの役割も割り当てられていない“無し”状態のいずれかに遷移する。
【００８１】
ノード３０は、“無し”状態と“オーナー”状態との間を、短期同期処理により相互に遷移する。また、ノード３０は、“オーナー”状態と“バックアップ”状態との間を、短期同期処理により相互に遷移する。また、ノード３０は、“バックアップ”状態から“無し”状態へと、短期同期処理により遷移する。
【００８２】
また、ノード３０は、“無し”状態と“バックアップの候補”状態との間を、長期同期処理により相互に遷移する。そして、ノード３０は、“バックアップの候補”状態から“バックアップ”状態へと、短期同期処理により遷移する。
【００８３】
図１２は、管理装置２０のクラスタ管理部２４の処理フローを示す図である。クラスタ管理部２４は、以下のステップＳ１１１〜ステップＳ１４２の処理を実行する。
【００８４】
まず、ステップＳ１１１において、クラスタ管理部２４は、データ保持表の受信イベント、第１の定周期イベントまたは第２の定周期イベントを検出する。データ保持表の受信イベントは、複数のノード３０のそれぞれから送信されたデータ保持表をクラスタ管理部２４が受信した場合に発生する。第１の定周期イベントおよび第２の定周期イベントは、それぞれ定期的に発生する。ただし、第１の定周期イベントと第２の定周期イベントとの発生間隔は、互いに異なる。
【００８５】
クラスタ管理部２４は、データ保持表の受信イベントを検出した場合には、処理をステップＳ１２１に進める。クラスタ管理部２４は、第１の定周期イベントを検出した場合には、処理をステップＳ１３１に進める。クラスタ管理部２４は、第２の定周期イベントを検出した場合には、処理をステップＳ１４１に進める。
【００８６】
データ保持表の受信イベントを検出した場合、ステップＳ１２１において、クラスタ管理部２４は、起動してから最初のデータ保持表の受信イベントであるか否かを判断する。
【００８７】
起動してから最初のデータ保持表の受信イベントである場合（ステップＳ１２１のＹｅｓ）、クラスタ管理部２４は、処理をステップＳ１２２に進める。ステップＳ１２２において、クラスタ管理部２４は、受信したデータ保持表を表記憶部２１に登録する。
【００８８】
続いて、ステップＳ１２３において、クラスタ管理部２４は、次役割表を第１割当部２２に算出させる。なお、第１割当部２２による次役割表の算出処理については、図１３を参照して説明する。
【００８９】
続いて、ステップＳ１２４において、クラスタ管理部２４は、算出した次役割表を複数のノード３０のそれぞれに配布する。そして、クラスタ管理部２４は、ステップＳ１２４の処理を終えると、処理をステップＳ１１１に戻す。
【００９０】
また、起動してから最初のデータ保持表の受信イベントではない場合（ステップＳ１２１のＮｏ）、ステップＳ１２５において、クラスタ管理部２４は、表記憶部２１のデータ保持表を更新する。そして、クラスタ管理部２４は、ステップＳ１２５の処理を終えると、処理をステップＳ１１１に戻す。
【００９１】
一方、第１の定周期イベントを検出した場合、ステップＳ１３１において、クラスタ管理部２４は、前回の第１の定周期イベントから今回の第１の定周期イベントまでの間に、複数のノード３０の全てからデータ保持表が受信できたか否かを判断する。クラスタ管理部２４は、複数のノード３０の全てからデータ保持表を受信できた場合（ステップＳ１３１のＹｅｓ）、処理をステップＳ１３４に進める。クラスタ管理部２４は、何れかのノード３０からデータ保持表を受信できなかった場合（ステップＳ１３１のＮｏ）、処理をステップＳ１３２に進める。
【００９２】
ステップＳ１３２において、クラスタ管理部２４は、データ保持表を受信できなかったノード３０をデータベースシステム１０から切り離す処理を行う。続いて、ステップＳ１３３において、クラスタ管理部２４は、切り離したノード３０の内容をデータ保持表から削除して、データ保持表を更新する。クラスタ管理部２４は、ステップＳ１３３の処理を終えると、処理をステップＳ１３４に進める。
【００９３】
ステップＳ１３４において、クラスタ管理部２４は、次役割表を第１割当部２２に算出させる。なお、第１割当部２２による次役割表の算出処理については、図１３を参照して説明する。
【００９４】
続いて、ステップＳ１３５において、クラスタ管理部２４は、次役割表が変化したか否かを判断する。例えば、障害が発生したノード３０を切り離した場合、新たなノード３０が追加された場合、または、長期同期処理が完了してバックアップとして割り当てられるノード３０が変更する場合に、次役割表が変化する。
【００９５】
次役割表が変化していない場合（ステップＳ１３５のＮｏ）、クラスタ管理部２４は、処理をステップＳ１１１に戻す。次役割表が変化した場合（ステップＳ１３５のＹｅｓ）、ステップＳ１３６において、クラスタ管理部２４は、変化後の次役割表を複数のノード３０のそれぞれに配布する。そして、クラスタ管理部２４は、ステップＳ１３６の処理を終えると、処理をステップＳ１１１に戻す。
【００９６】
また、一方、第２の定周期イベントを検出した場合、ステップＳ１４１において、クラスタ管理部２４は、目標役割表を第２割当部２３に算出させる。なお、第２割当部２３による目標役割表の算出処理については、図１４を参照して説明する。
【００９７】
続いて、ステップＳ１４２において、クラスタ管理部２４は、算出した目標役割表を複数のノード３０のそれぞれに配布する。そして、クラスタ管理部２４は、ステップＳ１４２の処理を終えると、処理をステップＳ１１１に戻す。
【００９８】
図１３は、管理装置２０の第１割当部２２による次役割表の算出処理のフローを示す図である。第１割当部２２は、図１２のステップＳ１２３およびステップＳ１３４でクラスタ管理部２４に呼び出されて、以下のステップＳ２１１〜ステップＳ２２０の処理を実行する。
【００９９】
まず、ステップＳ２１１において、第１割当部２２は、次役割表を初期化する。このとき、第１割当部２２は、次役割表の複数のノード３０のそれぞれをデータ保持表のノード３０に対応付ける。これにより、第１割当部２２は、障害発生により切り離されたノード３０および新たに追加されたノード３０を、次役割表に反映することができる。
【０１００】
続いて、ステップＳ２１２とステップＳ２２０の間において、第１割当部２２は、パーティション毎にループ処理を実行する。例えば、第１割当部２２は、データベースを第１から第３のパーティションに分割する場合には、第１のパーティション、第２のパーティションおよび第３のパーティションのそれぞれを対象として、ステップＳ２１２からステップＳ２２０の処理を実行する。
【０１０１】
パーティション毎のループ処理内では、まず、ステップＳ２１３において、第１割当部２２は、対象のパーティションについて、データ保持表で最大のタイムスタンプを有するノード３０の集合を選択する。本例において、タイムスタンプは、対象のパーティションのデータ集合が更新される毎に１ずつインクリメントされる値である。従って、ステップＳ２１３では、第１割当部２２は、対象のパーティションについて、最新のデータ集合を記憶しているノード３０の集合を選択することができる。
【０１０２】
続いて、ステップＳ２１４において、第１割当部２２は、ステップＳ２１３で選択したノード３０の集合の中から、次役割表でオーナーおよびバックアップとして割り当てられたパーティションの数が最も少ない１つのノード３０を選択して、選択したノード３０をオーナーとして割り当てる。これにより、第１割当部２２は、最新のデータ集合を記憶しているノード３０の集合のうち負荷の最も小さいノード３０をオーナーとして割り当てることができる。
【０１０３】
なお、オーナーおよびバックアップとして割り当てられたパーティションの数が最も少ないノード３０が複数個存在する場合には、第１割当部２２は、演算能力の高いノード３０を演算能力の低いノード３０よりも優先的にオーナーとして割り当ててもよい。これに代えて、第１割当部２２は、アクセス要求を受け付ける数が少ないノード３０をアクセス要求を受け付ける数が多いノード３０よりも優先的にオーナーとして割り当ててもよい。
【０１０４】
続いて、ステップＳ２１５において、第１割当部２２は、対象のパーティションについて、オーナーとして割り当てたノード３０を除いて、最大のタイムスタンプからの差が一定の範囲内のタイムスタンプを有するノード３０の集合を選択する。これにより、第１割当部２２は、対象のパーティションについて、最新のデータ集合または最新のデータ集合に比較的近いデータ集合を記憶しているノード３０の集合を選択することができる。
【０１０５】
続いて、ステップＳ２１６とステップＳ２１９との間において、第１割当部２２は、レプリケーションの数分、ループ処理を実行する。ここで、レプリケーションの数とは、オーナーに割り当てられたノード３０との間でレプリケーション処理が可能な最大のノード３０の数をいう。すなわち、レプリケーションの数は、割り当てが可能なバックアップの数と同一である。
【０１０６】
レプリケーションの数分のループ処理内では、まず、ステップＳ２１７において、第１割当部２２は、ステップＳ２１５で選択したノード３０の集合の中に、バックアップとして割り当て可能なノード３０が存在するか否かを判断する。バックアップとして割り当て可能なノード３０が存在する場合（ステップＳ２１７のＹｅｓ）、第１割当部２２は、処理をステップＳ２１８に進める。
【０１０７】
バックアップとして割り当て可能なノード３０が無い場合（ステップＳ２１７のＮｏ）、第１割当部２２は、レプリケーションの数分のループ処理を強制的に抜けて、処理をステップＳ２２０に進める。すなわち、従って、第１割当部２２は、バックアップが存在しなかったり、バックアップの数がレプリケーションの数未満であったりする次役割表を算出する場合もある。
【０１０８】
ステップＳ２１８において、第１割当部２２は、ステップＳ２１５で選択したノード３０の集合の中から、次役割表でオーナーおよびバックアップとして割り当てられたパーティションの数が最も少ないノード３０を、バックアップとして割り当てる。これにより、第１割当部２２は、最新のデータ集合または最新のデータ集合に近いデータを記憶しているノード３０の集合のうち負荷の小さい順にバックアップとするノード３０を割り当てることができる。
【０１０９】
なお、オーナーおよびバックアップとして割り当てられたパーティションの数が最も少ないノード３０が複数個存在する場合には、第１割当部２２は、演算能力の高いノード３０を演算能力の低いノード３０よりも優先的にバックアップとして割り当ててもよい。これに代えて、第１割当部２２は、アクセス要求を受け付ける数が少ないノード３０をアクセス要求を受け付ける数が多いノード３０よりも優先的にバックアップとして割り当ててもよい。
【０１１０】
そして、第１割当部２２は、選択したノード３０の集合からバックアップとして割り当てたノード３０を除いて、処理をステップＳ２１９に進める。ステップＳ２１９において、第１割当部２２は、ステップＳ２１６からステップＳ２１９までの処理回数が、レプリケーションの数より少ない場合には処理をステップＳ２１６に戻し、レプリケーションの数に一致した場合には処理をステップＳ２２０に進める。
【０１１１】
続いて、ステップＳ２２０において、第１割当部２２は、ステップＳ２１２からステップＳ２２０までの処理を全てのパーティションに対して実行していない場合には、処理をステップＳ２１６に戻す。そして、第１割当部２２は、ステップＳ２１２からステップＳ２２０までの処理を全てのパーティションに対して実行した場合には、次役割表の算出を終了して本フローを抜ける。
【０１１２】
以上のように第１割当部２２によれば、複数のパーティションの全てに対してオーナーとなるノード３０を割り当てることにより、少なくともデータベースを機能させることができる。これとともに、第１割当部２２によれば、可能な限りバックアップとなるノード３０を割り当てることによりデータベースの冗長度を担保することができる。さらに、第１割当部２２によれば、より負荷の小さいノード３０から順にオーナーおよびバックアップとなるノード３０を割り当てることにより、複数のノード３０のそれぞれの負荷を均等にすることができる。
【０１１３】
図１４は、管理装置２０の第２割当部２３による目標役割表の算出処理のフローを示す図である。第２割当部２３は、図１２のステップＳ１４１でクラスタ管理部２４に呼び出されて、以下のステップＳ３１１〜ステップＳ３２４の処理を実行する。
【０１１４】
まず、ステップＳ３１１において、第２割当部２３は、目標役割表を初期化する。このとき、第２割当部２３は、目標役割表の複数のノード３０のそれぞれをデータ保持表のノード３０に対応付ける。これにより、第２割当部２３は、障害発生により切り離されたノード３０および新たに追加されたノード３０を、目標役割表に反映することができる。
【０１１５】
続いて、ステップＳ３１２において、第２割当部２３は、現役割表のパーティションを、割り当てられたオーナーおよびバックアップの合計数で昇順にソートする。これにより、第２割当部２３は、バックアップとして割り当てられたノード３０が少ないパーティションから順に、バックアップの候補を割り当てることができる。すなわち、第２割当部２３は、現役割表において、冗長度の少ないパーティションから順に、バックアップの候補となるノード３０を割り当てることができる。
【０１１６】
続いて、ステップＳ３１３において、第２割当部２３は、複数のノード３０のそれぞれに対応する負荷値を初期化する。負荷値は、ノード３０にバックアップの候補の役割を割り当てたことに応じて増加する値である。第２割当部２３は、一例として、それぞれの負荷値を“０”に初期化する。
【０１１７】
続いて、ステップＳ３１４とステップＳ３２４の間において、第２割当部２３は、パーティション毎にループ処理を実行する。この場合において、第２割当部２３は、ステップＳ３１２で並べ替えられた現役割表のパーティションの順で対象のパーティションを選択して、ループ処理を実行する。
【０１１８】
パーティション毎のループ処理内では、まず、ステップＳ３１５において、第２割当部２３は、対象のパーティションについて、データ保持表で最大のタイムスタンプのノード３０を選択する。
【０１１９】
続いて、ステップＳ３１６において、第２割当部２３は、現役割表のノード３０を、値Ｖで降順にソートする。ここで、値Ｖは、オーナーとして割り当てられたノード３０については“＋１”、バックアップとして割り当てられたノード３０については“＋１”、および、最大のタイムスタンプのノード３０については“＋１”とされる値である。従って、オーナーでも無く、バックアップでもなく且つタイムスタンプも最大でないノード３０の値Ｖは、“０”となる。
【０１２０】
これにより、第２割当部２３は、オーナーおよびバックアップとして割り当てられたノード３０または最新のデータ集合を記憶するノード３０を先に、バックアップの候補となるノード３０として割り当てることができる。
【０１２１】
なお、値Ｖが同一のノード３０が複数個並んでいる場合には、第２割当部２３は、演算能力の高いノード３０が先にバックアップの候補となるように上位に配置する。これにより、第２割当部２３は、演算能力の高いノード３０が演算能力の低いノード３０よりも優先的にオーナーまたはバックアップとなるように、バックアップの候補となるノード３０を割り当てることができる。これに代えて、第２割当部２３は、アクセス要求を受け付ける数が少ないノード３０が先にバックアップの候補となるように上位に配置してもよい。これにより、第２割当部２３は、アクセス要求を受け付ける数が少ないノード３０がアクセス要求を受け付ける数が多いノード３０よりも優先的にオーナーまたはバックアップとなるように、バックアップの候補となるノード３０を割り当てることができる。
【０１２２】
続いて、ステップＳ３１７において、第２割当部２３は、定数である上限重みＭＬＯＡＤを下記の式（１）により算出する。
ＭＬＯＡＤ＝｛パーティションの数×（レプリケーション数＋１）＋（ノード数−１）｝÷ノード数  …（１）
【０１２３】
ここで、（レプリケーション数＋１）は、１つのパーティションに対して割り当てること可能な、オーナーおよびバックアップの最大数を表す。このような、上限重みＭＬＯＡＤは、１つのノード３０にバックアップの候補として割り当てられることができる数の上限の基準を表す。
【０１２４】
続いて、ステップＳ３１８とステップＳ３２３の間において、第２割当部２３は、ノード３０毎にループ処理を実行する。この場合において、第２割当部２３は、ステップＳ３１６で並べ替えられた現役割表の順序で対象のノード３０を選択して、ループ処理を実行する。
【０１２５】
ノード３０毎のループ処理内では、まず、ステップＳ３１９において、第２割当部２３は、（レプリケーションの数＋１）個分のノード３０に、バックアップの候補となるノード３０を割り当てたか否かを判断する。（レプリケーションの数＋１）個分のノード３０にバックアップの候補を割り当てた場合には（ステップＳ３１９のＹｅｓ）、処理をステップＳ３２４に進める。この場合、第２割当部２３は、対象のパーティションに対してバックアップの候補となるノード３０を最大数割り当ている。
【０１２６】
第２割当部２３は、（レプリケーションの数＋１）個分のノード３０にバックアップの候補を割り当てていない場合には（ステップＳ３１９のＮｏ）、処理をステップＳ３２０に進める。
【０１２７】
ステップＳ３２０において、第２割当部２３は、対象となるノード３０の負荷値が、上限重みＭＬＯＡＤより小さいかを判断する。対象となるノード３０の負荷値が上限重みＭＬＯＡＤより小さい場合には（ステップＳ３２０のＹｅｓ）、第２割当部２３は、処理をステップＳ３２１に進める。
【０１２８】
対象となるノード３０の負荷値が上限重みＭＬＯＡＤ以上の場合には（ステップＳ３２０のＮｏ）、第２割当部２３は、処理をステップＳ３２３に進める。これにより、第２割当部２３は、ある一つのノード３０にバックアップの候補としての役割を基準値以上割り当てた場合には、そのノード３０をこれ以上バックアップの候補として割り当てることを回避することができる。この結果、第２割当部２３は、複数のノード３０にバックアップの候補としての役割を分散して割り当てることができる。
【０１２９】
ステップＳ３２１において、第２割当部２３は、対象のパーティションに対して対象のノード３０をバックアップの候補として割り当てる。続いて、ステップＳ３２２において、第２割当部２３は、対象のノード３０の負荷値に“１”を加算することにより更新する。これにより、第２割当部２３は、候補として割り当てられる毎にノード３０の負荷値を１ずつ増加させることができる。第２割当部２３は、ステップＳ３２２の処理を終えると、処理をステップＳ３２３に進める。
【０１３０】
続いて、ステップＳ３２３において、第２割当部２３は、ステップＳ３１８からステップＳ３２３までの処理を複数のノード３０の全てに対して実行していない場合には、処理をステップＳ３１８に戻す。また、第２割当部２３は、ステップＳ３１８からステップＳ２２３までの処理を複数のノード３０の全てに対して実行した場合には、処理をステップＳ３２４に進める。
【０１３１】
続いて、ステップＳ３２４において、第２割当部２３は、ステップＳ３１４からステップＳ３２４までの処理を複数のパーティションの全てに対して実行していない場合には、処理をステップＳ３１４に戻す。そして、第２割当部２３は、ステップＳ３１４からステップＳ３２４までの処理を複数のパーティションの全てに対して実行した場合には、目標役割表の算出を終了して本フローを抜ける。
【０１３２】
以上のように第２割当部２３によれば、冗長度の少ない（すなわち、割り当てられたバックアップの数が少ない）パーティションから順に、バックアップの候補を割り当てるので、効率良くデータベースの冗長度を確保することができる。さらに、第２割当部２３によれば、割り当てたバックアップの候補の数が基準値以上となったノード３０に対してさらにバックアップの候補を割り当てないので、複数のノード３０に分散してバックアップの候補を割り当てることができる。
【０１３３】
図１５は、ノード３０のアクセス処理部３３の処理フローを示す図である。アクセス処理部３３は、以下のステップＳ４１１〜ステップＳ４３３の処理を実行する。
【０１３４】
まず、ステップＳ４１１において、アクセス処理部３３は、クライアントからの要求受信イベントまたはレプリケーション処理による要求受信イベントを検出する。クライアントからの要求受信イベントは、データベースに対するアクセス要求をクライアントからネットワークを介して受信した場合に発生する。レプリケーション処理による要求受信イベントは、レプリケーション処理による更新要求または登録要求を、オーナーとなる他のノード３０からネットワークを介して受信した場合に発生する。
【０１３５】
アクセス処理部３３は、クライアントからの要求受信イベントを検出した場合には、処理をステップＳ４２１に進める。アクセス処理部３３は、レプリケーション処理による要求受信イベントを検出した場合には、処理をステップＳ４３１に進める。
【０１３６】
クライアントからの要求受信イベントを検出した場合、ステップＳ４２１において、アクセス処理部３３は、クライアントからのアクセス要求に示される要求先のパーティションの番号を例えば計算して取得する。続いて、ステップＳ４２２において、アクセス処理部３３は、要求先のパーティションに対して自ノードがオーナーに割り当てられているか否かを現役割表を参照して判断する。
【０１３７】
要求先のパーティションに対して自ノードがオーナーに割り当てられていない場合には（ステップＳ４２２のＮｏ）、ステップＳ４２３において、アクセス処理部３３は、クライアントにオーナーに割り当てられたノード３０の番号を通知して、処理をステップＳ４１１に戻す。
【０１３８】
要求先のパーティションに対して自ノードがオーナーに割り当てられている場合には（ステップＳ４２２のＹｅｓ）、ステップＳ４２４において、アクセス処理部３３は、アクセス要求のタイプが、参照であるか、更新または登録であるかを判断する。
【０１３９】
アクセス要求のタイプが参照である場合には（ステップＳ４２４の参照）、ステップＳ４２５において、アクセス処理部３３は、参照要求のあったデータをデータストア部３１から読み出してクライアントに送信し、処理をステップＳ４１１に戻す。
【０１４０】
アクセス要求のタイプが更新または登録である場合には（ステップＳ４２４の更新／登録）、ステップＳ４２６において、要求先のパーティションに対してバックアップとして割り当てられた他のノード３０との間でレプリケーション処理を実行する。すなわち、アクセス処理部３３は、クライアントから受信した更新または登録の要求と同一のアクセス要求をバックアップとして割り当てられたノード３０へと送信する。
【０１４１】
レプリケーション処理が完了すると、続いて、ステップＳ４２７において、アクセス処理部３３は、クライアントから送信された更新または登録要求に従って、データストア部３１に記憶されているデータの更新またはデータストア部３１に新たなデータの登録をする。続いて、ステップＳ４２８において、アクセス処理部３３は、データ保持表のタイムスタンプを１インクリメントすることにより更新し、処理をステップＳ４１１に戻す。
【０１４２】
一方、アクセス処理部３３は、レプリケーション処理による要求受信イベントを検出した場合、ステップＳ４３１において、オーナーとなるノード３０から送信された更新または登録要求に従って、データストア部３１に記憶されているデータの更新またはデータストア部３１に新たなデータの登録をする。続いて、ステップＳ４３２において、アクセス処理部３３は、データ保持表のタイムスタンプを１インクリメントすることにより更新する。続いて、ステップＳ４３３において、アクセス処理部３３は、登録または更新が完了したことをオーナーに通知して、処理をステップＳ４１１に戻す。
【０１４３】
なお、アクセス処理部３３は、ステップＳ４２５およびステップＳ４２８において、一連のアクセス要求を含むトランザクションをクライアントから受け付けて、クライアントからのアクセス要求に応じたトランザクション処理を実行してもよい。また、アクセス処理部３３は、ステップＳ４２６において、レプリケーション処理により更新または登録の要求を送信する場合、バックアップとして割り当てられたノード３０に一連のアクセス要求を含むトランザクションを送信してもよい。また、アクセス処理部３３は、ステップＳ４３１において、一連のアクセス要求を含むトランザクションをオーナーとなるノード３０から受け付けて、オーナーとなるノード３０からのアクセス要求に応じたトランザクション処理を実行してもよい。
【０１４４】
図１６は、ノード３０のノード管理部３４の処理フローを示す図である。ノード管理部３４は、以下のステップＳ５１１〜ステップＳ５４１の処理を実行する。
【０１４５】
まず、ステップＳ５１１において、ノード管理部３４は、第３の定周期イベント、次役割表の受信イベントまたは目標役割表の受信イベントを検出する。第３の定周期イベントは、定期的に発生する。次役割表の受信イベントは、次役割表をノード管理部３４が受信した場合に発生する。目標役割表の受信イベントは、目標役割表をノード管理部３４が受信した場合に発生する。
【０１４６】
ノード管理部３４は、第３の定周期イベントを検出した場合には、処理をステップＳ５２１に進める。ノード管理部３４は、次役割表の受信イベントを検出した場合には、処理をステップＳ５３１に進める。ノード管理部３４は、目標役割表の受信イベントを検出した場合には、処理をステップＳ５４１に進める。
【０１４７】
第３の定周期イベントを検出した場合、ステップＳ５２１において、ノード管理部３４は、表記憶部３２に記憶されているデータ保持表を管理装置２０のクラスタ管理部２４に送信する。そして、ノード管理部３４は、処理をステップＳ５１１に戻す。
【０１４８】
次役割表の受信イベントを検出した場合、ステップＳ５３１において、ノード管理部３４は、アクセス処理部３３がトランザクションを実行中であれば、処理を中断させる。続いて、ステップＳ５３２において、ノード管理部３４は、受信した次役割表に従って、短期同期処理を実行する。
【０１４９】
具体的には、ノード管理部３４は、複数のパーティションのそれぞれに対して、オーナーとなるノード３０とバックアップとなるノード３０との間において記憶しているデータ集合に相違がある場合には、アクセス処理部３３にレプリケーション処理と同様の処理を実行させる。これにより、ノード管理部３４は、複数のパーティションのそれぞれに対して、オーナーとして割り当てられたノード３０とバックアップとして割り当てられたノード３０との間の同期を取ることができる。そして、ノード管理部３４は、複数のパーティションのそれぞれに対して、次役割表により割り当てられた新たな役割（オーナーおよびバックアップ）に応じた処理をアクセス処理部３３に実行させる。
【０１５０】
短期同期処理が完了すると、続いて、ステップＳ５３３において、ノード管理部３４は、現役割表を、次役割表の内容に書き換える。これにより、アクセス処理部３３は、クライアントからのアクセス要求を受け付けることができる。
【０１５１】
続いて、ステップＳ５３４において、ノード管理部３４は、中断してトランザクションを再開させる。そして、ノード管理部３４は、処理をステップＳ５１１に戻す。
【０１５２】
目標役割表の受信イベントを検出した場合、ステップＳ５４１において、ノード管理部３４は、表記憶部３２に記憶されている目標役割表を更新する。そして、ノード管理部３４は、処理をステップＳ５１１に戻す。
【０１５３】
図１７は、ノード３０の転送部３５の処理フローを示す図である。転送部３５は、以下のステップＳ６１１〜ステップＳ６１８の処理、および、ステップＳ６２１〜ステップＳ６２２の処理を実行する。
【０１５４】
まず、ステップＳ６１１において、転送部３５は、ＣＰＵ１２の負荷が予め定められた基準値より大きいか否かを判断する。負荷が基準値より大きい場合（ステップＳ６１１のＹｅｓ）、ステップＳ６１２において、転送部３５は、一定時間スリープしてから、処理をステップＳ６１１に戻す。
【０１５５】
負荷が基準値以下である場合（ステップＳ６１１のＮｏ）、ステップＳ６１３において、転送部３５は、現役割表と目標役割表との間の差を検出する。続いて、ステップＳ６１４において、転送部３５は、現役割表と目標役割表との間に差があるか否かを判断する。
【０１５６】
現役割表と目標役割表との間に差が無い場合（ステップＳ６１４のＮｏ）、ステップＳ６１５において、転送部３５は、現役割表、次役割表および目標役割表の何れにも自ノードに役割が割り当てられていないパーティションがあれば、そのデータ集合を消去する。そして、転送部３５は、ステップＳ６１５の処理の後、処理をステップＳ６１１に戻す。
【０１５７】
現役割表と目標役割表との間に差がある場合（ステップＳ６１４のＹｅｓ）、ステップＳ６１６において、転送部３５は、現役割表で自ノードがオーナーのパーティションについて、目標役割表ではバックアップの候補であり且つ現役割表ではオーナーでもバックアップでもない他のノード３０を検出する。
【０１５８】
続いて、ステップＳ６１７において、転送部３５は、目標役割表ではバックアップの候補であり、現役割表ではオーナーでもバックアップでもない他のノード３０が存在するか否かを判断する。存在しない場合（ステップＳ６１７のＮｏ）、転送部３５は、処理をステップＳ６１１に戻す。
【０１５９】
存在する場合（ステップＳ６１７のＹｅｓ）、ステップＳ６１８において、転送部３５は、クライアントからのアクセス要求に対する処理を中断させずに、長期同期処理を開始する。具体的には、転送部３５は、現役割表で自ノードがオーナーに割り当てられたパーティションについて、目標役割表によりバックアップの候補に割り当てられており且つ現役割表によりオーナーにもバックアップにも割り当てられていない他のノード３０に対して、そのパーティションのデータ集合を送信する。この場合に、転送部３５は、データ集合をアクセス処理部３３によるトランザクションの実行を妨害しないバックグラウンドで送信する。これにより、転送部３５は、クライアントからのアクセス要求に対する応答速度等の低下を招くことなく、長期同期処理を実行することができる。
【０１６０】
そして、転送部３５は、ステップＳ６１８の処理を終了すると、処理をステップＳ６１１に戻す。
【０１６１】
一方、目標役割表によりバックアップの候補に割り当てられており且つ現役割表によりオーナーにもバックアップにも割り当てられていないパーティションを有する他のノード３０の転送部３５は、以下のステップＳ６２１およびステップＳ６２２の処理を実行する。
【０１６２】
ステップＳ６２１において、転送部３５は、クライアントからのアクセス要求に対する処理を中断させずに、長期同期処理を開始する。具体的には、転送部３５は、目標役割表によりバックアップの候補に割り当てられており且つ現役割表によりオーナーにもバックアップにも割り当てられていないパーティションについて、オーナーに割り当てられたノード３０からデータ集合を受信する。この場合に、転送部３５は、データ集合をアクセス処理部３３によるトランザクションの実行を妨害しないバックグラウンドで受信する。
【０１６３】
続いて、ステップＳ６２２において、転送部３５は、データ保持表を更新する。長期同期処理が完了すると、オーナーとなるノード３０に記憶されているデータ集合のレプリカが記憶されるので、転送部３５は、データ保持表を更新することにより、そのパーティションのタイムスタンプを、オーナーのデータ保持表のタイムスタンプと一致させることができる。そして、転送部３５は、ステップＳ６２２の処理を終えると、転送部３５は、本フローを終了する。
【０１６４】
以上のように転送部３５によれば、バックアップの候補として割り当てられたノード３０にオーナーとして割り当てられたノード３０のデータ集合のレプリカを生成するので、オーナーまたはバックアップとなることができるノード３０を新たに発生させることができる。
【０１６５】
図１８〜図２４を参照して、データベースシステム１０の動作例を説明する。図１８は、３つのパーティション＃１〜＃３のそれぞれに対して、オーナーおよびバックアップとなるノード３０を割り当てた場合の、ノード３０−Ａからノード３０−Ｃのそれぞれの状態を示す図である。
【０１６６】
本例では、図１８の現役割表に示されるように、パーティション＃１に対して、オーナーにノード３０−Ａが割り当てられ、バックアップにノード３０−Ｂが割り当てられる。また、パーティション＃２に対して、オーナーにノード３０−Ｂが割り当てられ、バックアップにノード３０−Ｃが割り当てられる。また、パーティション＃３に対して、オーナーにノード３０−Ｃが割り当てられ、バックアップにノード３０−Ａが割り当てられる。
【０１６７】
ノード３０−Ａおよびノード３０−Ｂは、パーティション＃１に対するレプリケーション処理をトランザクションにより実行している。この結果、図１８のデータ保持表に示されるように、パーティション＃１のタイムスタンプは、ノード３０−Ａおよびノード３０−Ｂで同一値となる。
【０１６８】
また、ノード３０−Ｂおよびノード３０−Ｃは、パーティション＃２に対するレプリケーション処理をトランザクションにより実行している。この結果、図１８のデータ保持表に示されるように、パーティション＃２のタイムスタンプは、ノード３０−Ｂおよびノード３０−Ｃで同一値となる。
【０１６９】
また、ノード３０−Ｃおよびノード３０−Ａは、パーティション＃３に対するレプリケーション処理をトランザクションにより実行している。この結果、図１８のデータ保持表に示されるように、パーティション＃３のタイムスタンプは、ノード３０−Ｃおよびノード３０−Ａで同一値となる。
【０１７０】
図１９は、図１８の状態からノード３０−Ｃに障害が発生したことに応じて短期同期処理を実行した後の、ノード３０−Ａからノード３０−Ｃのそれぞれの状態を示す図である。管理装置２０のクラスタ管理部２４は、図１８の状態からノード３０−Ｃからデータ保持表を検出することができず、ノード３０−Ｃに障害が発生したことを検出したとする。
【０１７１】
複数のノード３０のうちの何れかのノード３０で障害が発生した場合、管理装置２０のクラスタ管理部２４は、障害が発生したノード３０を切り離すとともに、第１割当部２２に次役割表を計算させる。
【０１７２】
クラスタ管理部２４からの呼び出しに応じて、第１割当部２２は、障害の発生したノード３０を除いてオーナーおよびバックアップとなるノード３０を再度割り当てて、次役割表を生成する。この場合に、第１割当部２２は、少なくともデータベースを機能させるべく、複数のパーティションのそれぞれに対して少なくともオーナーが存在するようにノード３０を割り当てる。例えば、第１割当部２２は、オーナーであったノード３０に障害が発生した場合には、バックアップであったノード３０をオーナーに割り当てる。さらに、第１割当部２２は、よりデータベースの冗長度を高めるべく、複数のパーティションのそれぞれに対して可能な限りバックアップが存在するようにノード３０を割り当てる。
【０１７３】
本例では、再割り当ての結果、図１９の次役割表に示されるように、パーティション＃１に対して、オーナーにノード３０−Ａが割り当てられ、バックアップにノード３０−Ｂが割り当てられる。また、パーティション＃２に対して、オーナーにノード３０−Ｂが割り当てられる。また、パーティション＃３に対して、オーナーにノード３０−Ａが割り当てられる。
【０１７４】
そして、クラスタ管理部２４は、次役割表をノード３０−Ａおよびノード３０−Ｂに配布する。ノード３０−Ａおよびノード３０−Ｂのそれぞれのノード管理部３４は、次役割表を受信すると短期同期処理を実行するとともに、現役割表の内容を次役割表の内容に書き換える。これにより、ノード３０−Ａおよびノード３０−Ｂのそれぞれは、新たに割り当てられた役割に応じた処理を実行することができる。
【０１７５】
図２０は、図１９の状態から実行される長期同期処理の一例を示す図である。また、管理装置２０のクラスタ管理部２４は、障害が発生したノード３０−Ｃを切り離した場合、第２割当部２３に目標役割表を計算させる。
【０１７６】
クラスタ管理部２４からの呼び出しに応じて、第２割当部２３は、障害が発生したノード３０を除いてバックアップの候補となるノード３０を再度割り当てて、目標役割表を生成する。この場合に、第２割当部２３は、データベースの冗長度を高めるべく、複数のパーティションのそれぞれに対して、少なくともオーナーおよびバックアップが存在するように候補となるノード３０を割り当てる。
【０１７７】
図１９の状態では、パーティション＃２およびパーティション＃３に対するバックアップのノード３０が存在しない。従って、第２割当部２３は、パーティション＃２に対するバックアップの候補としてノード３０−Ａを割り当て、パーティション＃３に対するバックアップの候補としてノード３０−Ｂを割り当てる。
【０１７８】
なお、本例では、第２割当部２３は、現役割表により既にオーナーおよびバックアップとして割り当てられているノード３０も、バックアップの候補として割り当てる。このため、図２０の目標役割表に示されるように、パーティション＃１〜＃３のそれぞれに対して、ノード３０−Ａおよびノード３０−Ｂの両者がバックアップの候補として割り当てられる。
【０１７９】
そして、クラスタ管理部２４は、目標役割表をノード３０−Ａおよびノード３０−Ｂに配布する。ノード３０−Ａおよびノード３０−Ｂのそれぞれの転送部３５は、現役割表と目標役割表の差の部分に対して長期同期処理を実行する。すなわち、ノード３０−Ｂの転送部３５は、パーティション＃２のデータ集合をバックグラウンドでノード３０−Ａに送信する。また、ノード３０−Ａの転送部３５は、パーティション＃３のデータ集合をバックグラウンドでノード３０−Ｂに送信する。
【０１８０】
なお、このとき、転送部３５は、クライアントからのアクセス要求に対する処理を中断させずに、長期同期処理を実行する。
【０１８１】
長期同期処理が完了すると、ノード３０−Ａは、パーティション＃２のデータ集合のレプリカを記憶することができる。さらに、図２０のデータ保持表に示されるように、このときのパーティション＃２のタイムスタンプは、ノード３０−Ａおよびノード３０−Ｂで同一値となる。
【０１８２】
また、ノード３０−Ｂは、パーティション＃３のデータ集合のレプリカを記憶することができる。さらに、図２０のデータ保持表に示されるように、パーティション＃３のタイムスタンプは、ノード３０−Ａおよびノード３０−Ｂで同一値となる。
【０１８３】
図２１は、図２０の長期同期処理が完了したことに応じて短期同期処理を実行した後の、ノード３０−Ａからノード３０−Ｃのそれぞれの状態を示す図である。管理装置２０のクラスタ管理部２４は、定期的に第１割当部２２を呼び出して次役割表を計算させる。
【０１８４】
長期同期処理が完了した後にクラスタ管理部２４から呼び出された場合、第１割当部２２は、複数のパーティションのそれぞれに対して、長期同期処理により生成されたレプリカを利用してより冗長度が高まるように、オーナーおよびバックアップとなるノード３０を再度割り当てる。
【０１８５】
本例では、図２１の次役割表に示されるように、パーティション＃１に対して、オーナーとしてノード３０−Ａが割り当てられ、バックアップとしてノード３０−Ｂが割り当てられる。また、パーティション＃２に対して、オーナーとしてノード３０−Ｂが割り当てられ、バックアップとしてノード３０−Ａが割り当てられる。また、パーティション＃３に対して、オーナーとしてノード３０−Ａが割り当てられ、バックアップとしてノード３０−Ｂが割り当てられる。
【０１８６】
そして、クラスタ管理部２４は、次役割表をノード３０−Ａおよびノード３０−Ｂに配布する。ノード３０−Ａおよびノード３０−Ｂのそれぞれのノード管理部３４は、次役割表を受信すると短期同期処理を実行するとともに、現役割表の内容を次役割表の内容に書き換える。これにより、ノード３０−Ａおよびノード３０−Ｂのそれぞれは、新たに割り当てられた役割に応じた処理を実行することができる。
【０１８７】
図２２は、図２１の状態からノード３０−Ｄを追加した場合の、ノード３０−Ａからノード３０−Ｄのそれぞれの状態を示す図である。管理装置２０のクラスタ管理部２４は、例えば図２１の状態からノード３０−Ｄが新たに追加されたことを検出したとする。
【０１８８】
クラスタ管理部２４は、図２２のデータ保持表に示されるように、ノード３０−Ｄを追加したデータ保持表を生成する。第１割当部２２は、データ保持表にノード３０−Ｄが追加されたことに応じて、ノード３０−Ｄが追加された次役割表を生成する。
【０１８９】
もっとも、ノード３０−Ｄは、データ集合を記憶していない。従って、第１割当部２２は、ノード３０−Ｄが追加された直後では、オーナーおよびバックアップの割り当てを変更しない。
【０１９０】
図２３は、図２２の状態から実行される長期同期処理の一例を示す図である。新たなノード３０が追加された場合、第２割当部２３は、複数のパーティションのそれぞれに対して、新たなノード３０を含めてバックアップの候補となるノード３０を再度割り当てる。この場合、第２割当部２３は、割り当てられたオーナーおよびバックアップの数の差がノード３０間で予め定められた値の範囲内となるように、複数のパーティションのそれぞれに対して、バックアップの候補となるノード３０を割り当てる。
【０１９１】
本例では、再割り当ての結果、図２３の目標役割表に示されるように、パーティション＃１に対して、ノード３０−Ａおよびノード３０−Ｂがバックアップの候補として割り当てられる。また、パーティション＃２に対して、ノード３０−Ｂおよびノード３０−Ｄがバックアップの候補として割り当てられる。また、パーティション＃３に対して、ノード３０−Ａおよびノード３０−Ｄがバックアップの候補として割り当てられる。
【０１９２】
そして、クラスタ管理部２４は、目標役割表をノード３０−Ａ、ノード３０−Ｂおよびノード３０−Ｄに配布する。ノード３０−Ａ、ノード３０−Ｂおよびノード３０−Ｄのそれぞれの転送部３５は、現役割表と目標役割表の差の部分に対して長期同期処理を実行する。
【０１９３】
すなわち、ノード３０−Ｂの転送部３５は、パーティション＃２のデータ集合をバックグラウンドでノード３０−Ｄに送信する。また、ノード３０−Ａの転送部３５は、パーティション＃３のデータ集合をバックグラウンドでノード３０−Ｄに送信する。なお、このとき、転送部３５は、クライアントからのアクセス要求に対する処理を中断せずに長期同期処理を実行する。
【０１９４】
この結果、ノード３０−Ｄは、パーティション＃２のデータ集合のレプリカを記憶することができる。さらに、図２３のデータ保持表に示されるように、パーティション＃２のタイムスタンプは、ノード３０−Ｂおよびノード３０−Ｄで同一値となる。
【０１９５】
また、ノード３０−Ｄは、パーティション＃３のデータ集合のレプリカを記憶することができる。さらに、図２３のデータ保持表に示されるように、パーティション＃３のタイムスタンプは、ノード３０−Ａおよびノード３０−Ｄで同一値となる。
【０１９６】
図２４は、図２３の長期同期処理が完了したことに応じて短期同期処理を実行した後の、ノード３０−Ａからノード３０−Ｄのそれぞれの状態を示す図である。長期同期処理が完了した後にクラスタ管理部２４から呼び出された場合、第１割当部２２は、複数のパーティションのそれぞれに対して、長期同期処理により生成されたレプリカを利用してよりノード３０間の負荷が均等となるように、オーナーおよびバックアップとなるノード３０を再度割り当てる。
【０１９７】
本例では、再割り当ての結果、図２４の次役割表に示されるように、パーティション＃１に対して、オーナーとしてノード３０−Ａが割り当てられ、バックアップとしてノード３０−Ｂが割り当てられる。また、パーティション＃２に対して、オーナーとしてノード３０−Ｂが割り当てられ、バックアップとしてノード３０−Ｄが割り当てられる。また、パーティション＃３に対して、オーナーとしてノード３０−Ａが割り当てられ、バックアップとしてノード３０−Ｄが割り当てられる。
【０１９８】
そして、クラスタ管理部２４は、次役割表をノード３０−Ａ、ノード３０−Ｂおよびノード３０−Ｄに配布する。ノード３０−Ａ、ノード３０−Ｂおよびノード３０−Ｄのそれぞれのノード管理部３４は、次役割表を受信すると短期同期処理を実行するとともに、現役割表の内容を次役割表の内容に書き換える。これにより、ノード３０−Ａ、ノード３０−Ｂおよびノード３０−Ｄのそれぞれは、新たに割り当てられた役割に応じた処理を実行することができる。
【０１９９】
以上のように、本実施形態に係るデータベースシステム１０によれば、バックアップの候補となるノード３０を割り当ててオーナーとなるノード３０から候補となるノード３０へとデータ集合の転送をするので、データベースに冗長度を持たせ且つノード３０の処理の負荷を均等することができる。さらに、データベースシステム１０によれば、このような処理をクライアントからのアクセス要求に対する処理を中断させずに実行することができるので、ノード３０を切り離したりノード３０を新たに追加したりした場合にも、システムを停止させずにデータの再配置をすることができる。
【０２００】
また、本実施形態の管理装置２０およびノード３０で実行されるプログラムは、インストール可能な形式または実行可能な形式のファイルでＣＤ−ＲＯＭ、フレキシブルディスク（ＦＤ）、ＣＤ−Ｒ、ＤＶＤ（Ｄｉｇｉｔａｌ  Ｖｅｒｓａｔｉｌｅ  Ｄｉｓｋ）等のコンピュータで読み取り可能な記録媒体に記録されて提供される。
【０２０１】
また、本実施形態の管理装置２０およびノード３０で実行されるプログラムを、インターネット等のネットワークに接続されたコンピュータ上に格納し、ネットワーク経由でダウンロードさせることにより提供するように構成してもよい。また、本実施形態の管理装置２０およびノード３０で実行されるプログラムをインターネット等のネットワーク経由で提供または配布するように構成してもよい。
【０２０２】
また、本実施形態の管理装置２０およびノード３０プログラムを、ＲＯＭ等に予め組み込んで提供するように構成してもよい。
【０２０３】
本実施形態の管理装置２０で実行されるプログラムは、上述した各部（表記憶部２１、第１割当部２２、第２割当部２３およびクラスタ管理部２４）を含むモジュール構成となっており、実際のハードウェアとしてはＣＰＵ（プロセッサ）が上記記憶媒体からプログラムを読み出して実行することにより上記各部が主記憶装置上にロードされ、表記憶部２１、第１割当部２２、第２割当部２３およびクラスタ管理部２４が主記憶装置上に生成されるようになっている。
【０２０４】
また、本実施形態のノード３０で実行されるプログラムは、上述した各部（データストア部３１、表記憶部３２、アクセス処理部３３、ノード管理部３４および転送部３５）を含むモジュール構成となっており、実際のハードウェアとしてはＣＰＵ（プロセッサ）が上記記憶媒体からプログラムを読み出して実行することにより上記各部が主記憶装置上にロードされ、データストア部３１、表記憶部３２、アクセス処理部３３、ノード管理部３４および転送部３５が主記憶装置上に生成されるようになっている。
【０２０５】
本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、請求の範囲に記載された発明とその均等の範囲に含まれる。
【符号の説明】
【０２０６】
１０  データベースシステム
１２  ＣＰＵ
１３  メモリ
１４  通信Ｉ／Ｆ
１５  ストレージＩ／Ｆ
１６  外部記憶装置
２０  管理装置
２１  表記憶部
２２  第１割当部
２３  第２割当部
２４  クラスタ管理部
３０  ノード
３１  データストア部
３２  表記憶部
３３  アクセス処理部
３４  ノード管理部
３５  転送部
【図１】
0005698865.tif 000002
【図２】
0005698865.tif 000003
【図３】
0005698865.tif 000004
【図４】
0005698865.tif 000005
【図５】
0005698865.tif 000006
【図６】
0005698865.tif 000007
【図７】
0005698865.tif 000008
【図８】
0005698865.tif 000009
【図９】
0005698865.tif 000010
【図１０】
0005698865.tif 000011
【図１１】
0005698865.tif 000012
【図１２】
0005698865.tif 000013
【図１３】
0005698865.tif 000014
【図１４】
0005698865.tif 000015
【図１５】
0005698865.tif 000016
【図１６】
0005698865.tif 000017
【図１７】
0005698865.tif 000018
【図１８】
0005698865.tif 000019
【図１９】
0005698865.tif 000020
【図２０】
0005698865.tif 000021
【図２１】
0005698865.tif 000022
【図２２】
0005698865.tif 000023
【図２３】
0005698865.tif 000024
【図２４】
0005698865.tif 000025