(57)【特許請求の範囲】
【請求項１】
コンピュータに、
他のコンピュータに格納されたデータについて更新がなされてから所定時間内に、更新後のデータを格納することにより、更新前後のデータが格納部に格納された状態とし、
第１の時刻から前記所定時間経過した第２の時刻からさらに前記所定時間経過するまでに前記データについての参照要求を受け付け、且つ前記第１の時刻に前記他のコンピュータに前記更新を行なうトランザクションが存在していた場合に、前記格納部に格納された更新前のデータを前記参照要求の要求元に送信する、
処理を実行させることを特徴とするデータ管理プログラム。
【請求項２】
前記コンピュータに、
前記参照要求を受け付け、且つ前記第１の時刻に前記更新を行なうトランザクションがない場合に、前記格納部に格納された更新後のデータを前記参照要求の要求元に送信する、
処理を実行させることを特徴とする請求項１記載のデータ管理プログラム。
【請求項３】
他ノードに格納されているデータの少なくとも一部を含むデータと、分散データベースシステムにおいて、実行されている１または複数のトランザクションを特定する第１のトランザクション情報と、前記第１のトランザクション情報に示されるトランザクションに対応する要求を、トランザクションを管理する管理装置が受信した時刻を示す第１の時刻と、を格納する記憶部と、
前記記憶部に記憶されたデータのうちの複数世代を有するデータの参照要求を受信したときに、第２のトランザクション情報と前記第２のトランザクション情報に示されるトランザクションに対応する要求を前記管理装置が受信した時刻を示す第２の時刻を受信して前記記憶部に格納し、前記第１の時刻と前記第２の時刻との比較結果に基づいて、前記第１のトランザクション情報または前記第２のトランザクション情報のいずれかを用いて、前記複数世代を有するデータのうち参照する世代のデータを特定する処理部と、
を備え、
前記記憶部に記憶されたデータに対応する前記他ノードで格納されているデータが更新されているか否か判定する処理を行い、更新されている場合、前記記憶部に記憶されたデータを削除し、
第３のトランザクション情報および前記第３のトランザクション情報に示されるトランザクションに対応する要求を前記管理装置が受信した時刻を示す第３の時刻を、前記判定する処理の前に受信し、前記判定する処理の終了後に前記第３のトランザクション情報および第３の時刻を前記第１のトランザクション情報および前記第１の時刻として前記記憶部に格納することを特徴とするノード。
【請求項４】
前記ノードは、前記第１のトランザクション情報および前記第１の時刻を定期的に前記管理装置から受信することを特徴とする請求項３記載のノード。
【請求項５】
分散データベースシステムにおいて、実行されている１または複数のトランザクションを特定するトランザクション情報を管理するトランザクション情報管理部と、
ノードからの要求に応じて、該要求を受信した時刻を前記ノードに送信する時刻採番部と、
を備える管理装置と、
複数のノードと、
を備える分散データベースシステムにおいて、
前記複数のノードの各ノードは、
他ノードに格納されているデータの少なくとも一部を含むデータと、前記分散データベースシステムにおいて、実行されている１または複数のトランザクションを特定する第１のトランザクション情報と、前記第１のトランザクション情報に示されるトランザクションに対応する要求を、トランザクションを管理する前記管理装置が受信した時刻を示す第１の時刻と、を格納する記憶部と、
前記記憶部に記憶されたデータのうちの複数世代を有するデータの参照要求を受信したときに、第２のトランザクション情報と前記第２のトランザクション情報に示されるトランザクションに対応する要求を前記管理装置が受信した時刻を示す第２の時刻を受信して前記記憶部に格納し、前記第１の時刻と前記第２の時刻との比較結果に基づいて、前記第１のトランザクション情報または前記第２のトランザクション情報のいずれかを用いて、前記複数世代を有するデータのうち参照する世代のデータを特定する処理部と、を備え、
前記記憶部に記憶されたデータに対応する前記他ノードで格納されているデータが更新されているか否か判定する処理を行い、更新されている場合、前記記憶部に記憶されたデータを削除し、
第３のトランザクション情報および前記第３のトランザクション情報に示されるトランザクションに対応する要求を前記管理装置が受信した時刻を示す第３の時刻を、前記判定する処理の前に受信し、前記判定する処理の終了後に前記第３のトランザクション情報および第３の時刻を前記第１のトランザクション情報および前記第１の時刻として前記記憶部に格納することを特徴とする分散データベースシステム。
【請求項６】
他のコンピュータに格納されたデータについて更新がなされてから所定時間内に、更新後のデータを格納することにより、更新前後のデータが格納部に格納された状態とし、
第１の時刻から前記所定時間経過した第２の時刻からさらに前記所定時間経過するまでに前記データについての参照要求を受け付け、且つ前記第１の時刻に前記他のコンピュータに前記更新を行なうトランザクションが存在していた場合に、前記格納部に格納された更新前のデータを前記参照要求の要求元に送信する、
処理を含むコンピュータが実行するデータ管理方法。
【請求項７】
格納部と、
他のコンピュータに格納されたデータについて更新がなされてから所定時間内に、更新後のデータを格納することにより、更新前後のデータが前記格納部に格納された状態とし、第１の時刻から前記所定時間経過した第２の時刻からさらに前記所定時間経過するまでに前記データについての参照要求を受け付け、且つ前記第１の時刻に前記他のコンピュータに前記更新を行なうトランザクションが存在していた場合に、前記格納部に格納された更新前のデータを前記参照要求の要求元に送信する処理部と、
を備えるコンピュータ。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、データ管理プログラム、ノード、および分散データベースシステムに関する。
【背景技術】
【０００２】
データベースにおいて、データの参照が発生した場合に、整合性のあるデータを参照する必要がある。
整合性のあるデータ（または、Atomicなデータと呼ぶ）とは、あるトランザクションが更新を行なう前のデータ集合か、もしくはコミットした後のデータ集合のどちらかである。
【０００３】
ここで、整合性のあるデータの例を説明する。
図１Ａは、トランザクションの実行時間を示す図である。
図１Ｂは、参照されるデータを示す図である。
【０００４】
図１Ａにおいて横軸は時間を示しており、各トランザクションＴ１〜Ｔ５の実行時間を示している。
また、トランザクションＴ１〜Ｔ４は、それぞれレコードＲ１〜Ｒ４を更新する。尚、レコードはコミットされることで更新が確定する。
【０００５】
トランザクションＴ１は、時刻t_T1_aでレコードＲ１をコミットする。
トランザクションＴ２は、時刻t_T2_bでトランザクションを開始し、時刻t_T2_aでレコードＲ２をコミットする。
【０００６】
トランザクションＴ３は、時刻t_T3_aでレコードＲ３をコミットする。
トランザクションＴ４は、時刻t_T4_bでトランザクションを開始し、時刻t_T4_aでレコードＲ４をコミットする。
【０００７】
尚、時刻t_T1_a、t_T2_b、t_T3_a、およびt_T4_bは時刻tより前であり、時刻t_T2_aおよびt_T4_aは時刻tより後である。
図１Ａにおいて、トランザクションＴ５が時刻tで参照する整合性のあるデータ（すなわちレコードＲ１〜Ｒ４）は以下の（１）または（２）どちらかである。
（１）トランザクションＴ１、Ｔ３で更新された後のデータ（t_T1_a、t_T3_a時点のデータ）、且つトランザクションＴ２、Ｔ４で更新される前のデータ（t_T2_b、t_T4_b時点のデータ）。
（２）トランザクションＴ１、Ｔ３で更新された後のデータ（t_T1_a、t_T3_a時点のデータ）、且つトランザクションＴ２、Ｔ４で更新された後のデータ（t_T2_a、t_T4_a時点のデータ）。尚、データ集合（２）を参照する場合は、トランザクションＴ２、Ｔ４がコミットするまで待ちが発生し、トランザクションＴ２、Ｔ４のコミット後にデータを参照する。
【０００８】
図１Ｂは、データ集合（１）を示している。すなわち、時刻tでトランザクションＴ５が参照するレコードＲ１〜Ｒ４は、それぞれ時刻t_T1_a、t_T2_b、t_T3_a、t_T4_aにおける値である。すなわち、時刻tでトランザクションＴ５が参照するレコードＲ１〜Ｒ４は、時刻tでコミット済みのデータである。
【０００９】
また、データ集合（２）の場合は、レコードＲ１、Ｒ３はデータ集合（１）と同じであるが、レコードＲ２、Ｒ４は、コミット後のレコードＲ２’、Ｒ４’となる。すなわち、時刻t_T2_a、t_T4_aにおける値となる。
【００１０】
現在、データベース技術において、スケーラビリティやアベイラビリティの向上のために、分散データベースが用いられている。
分散データベースは、ネットワークに接続した複数のノードにデータを分散して配置し、複数のノードが持っている複数のデータベースをあたかも単一のデータベースであるかのように見せる技術である。
【００１１】
分散データベースでは、複数のノードにデータが分散されて配置されている。各ノードは、キャッシュを有し、該キャッシュに自身が担当するデータを格納している。また、各ノードは他のノードが担当するデータを自身のキャッシュに格納する場合もある。
【００１２】
尚、キャッシュに格納されているデータはキャッシュデータと呼ぶ。 
また、分散データベースに関する技術で、複数のノードで参照・更新を受け付ける方式がある。
【００１３】
図２Ａは、複数ノードにおけるデータの更新を示す図である。
図２Ｂは、複数ノードにおいてトランザクションＢが参照するデータを示す図である。
尚、以下の説明および図において、トランザクションをトランと表記する場合がある。
【００１４】
ノード１００５は、キャッシュ１００６を有し、キャッシュ１００６は、レコードＲ１およびＲ２を格納している。
ノード１０１５は、キャッシュ１０１６を有し、キャッシュ１０１６は、レコードＲ１およびＲ２を格納している。
トランザクションＡの開始時におけるレコードＲ１、Ｒ２の値は、それぞれR1_a、R2_aである。
【００１５】
図２Ａでは、２つのトランザクションＡおよびＢを実行する。トランザクションＡはデータの更新を行い、トランザクションＢはデータの参照を行う。
トランザクションＡの処理内容は、
(1)トランザクション開始
(2)レコードＲ１をR1_bに更新（UPDATE R1→R1_b）
(3)レコードＲ２をR2_bに更新（UPDATE R2→R2_b）
(4)コミット
である。尚、上記処理(1)〜(4)の処理は、それぞれ１０時、１０時１０分、１０時２０分、１０時３０分に実行される。
【００１６】
また、トランザクションＡにおいて、レコードＲ１およびＲ２の更新はノード１００５で行われる。
トランザクションＡが開始されると、ノード１００５は、レコードＲ１をR1_aからR1_bに更新する。ノード１００５は、更新したレコードＲ１の値R1_bをノード１０１５に送信する（ログシッピング）。また、ノード１００５は、レコードＲ２をR2_aからR2_bに更新する。ノード１００５は、更新したレコードＲ２の値R2_bをノード１０１５に送信する（ログシッピング）。
【００１７】
そして、ノード１００５はトランザクションＡをコミットする。
その後、ノード１００５は、コミット指示をノード１０１５に送信し、コミット指示を受信したノード１０１５は、レコードＲ１、Ｒ２をコミットする。それにより、ノード１０１５のレコードＲ１はR1_aからR1_b、レコードＲ２はR2_aからR2_bに更新される
ノード１０１５のデータは、ノード１００５の更新処理と非同期で更新される。
【００１８】
トランザクションＢの処理内容は、
(1)トランザクション開始
(2)レコードＲ１を参照（SELECT R1）
(3)レコードＲ２を参照（SELECT R2）
(4)コミット
である。尚、トランザクションＢは、ノード１０１５で実行される。
【００１９】
トランザクションＢにおいて、レコードＲ１、Ｒ２を参照する場合、参照時刻によって参照されるデータは、図２Ｂに示すようになる。
トランザクションＡの開始前、例えば９時５０分に、レコードＲ１、Ｒ２を参照すると、レコードＲ１、Ｒ２の値は、それぞれR1_a、R2_aとなる。
【００２０】
トランザクションＡの実行中、例えば１０時１５分に、レコードＲ１、Ｒ２を参照すると、レコードＲ１、Ｒ２の値は、コミット前なので、それぞれR1_a、R2_aとなる。尚、ノードには、MultiVersion Concurrency Control（MVCC：多版型同時実行制御）が実装されているものとする。
【００２１】
トランザクションＡのコミット後、例えば１０時４０分に、レコードＲ１、Ｒ２を参照すると、レコードＲ１、Ｒ２の値は、ノード１０１５でコミットが行われていなければ、それぞれR1_a、R2_aとなる。また、レコードＲ１、Ｒ２の値は、ノード１０１５でコミットが行われていれば、それぞれR1_b、R2_bとなる。
【先行技術文献】
【特許文献】
【００２２】
【特許文献１】特許第４３６２８３９号明細書
【特許文献２】特開２００６−２３５７３６号公報
【特許文献３】特開平０７−２６２０６５号公報
【非特許文献】
【００２３】
【非特許文献１】MySQL：MySQLのレプリケーションの特徴、[平成２３年４月２１日検索]、 インターネット、< URL:http://www.irori.org/doc/mysql-rep.html>
【非特許文献２】Symfoware Active DB Guard：独自のログシッピング技術、[平成２３年４月２１日検索]、 インターネット、< URL:http://software.fujitsu.com/jp/symfoware/catalog/pdf/cz3108.pdf>
【非特許文献３】Linkexpress Transactional Replication option：逐次差分連携方式、[平成２３年４月２１日検索]、 インターネット、< URL: http://software.fujitsu.com/jp/manual/manualfiles/M080000/J2X16100/02Z200/lxtro01/lxtro004.html>
【発明の概要】
【発明が解決しようとする課題】
【００２４】
図３Ａは、従来の複数ノードの更新（マルチサイト更新）を行った場合のデータの更新を示す図である。
図３Ｂは、従来の方式においてマルチサイト更新を行った場合のトランザクションＢが参照するデータを示す図である。
【００２５】
ノード１００７は、キャッシュ１００８を有し、キャッシュ１００８は、レコードＲ１およびＲ２を格納している。
ノード１０１７は、キャッシュ１０１８を有し、キャッシュ１０１８は、レコードＲ１およびＲ２を格納している。
トランザクションＡの開始時におけるレコードＲ１、Ｒ２の値は、それぞれR1_a、R2_aである。
【００２６】
図３Ａでは、２つのトランザクションＡおよびＢを実行する。トランザクションＡはデータの更新を行い、トランザクションＢはデータの参照を行う。
トランザクションＡの処理内容は、
(1)トランザクション開始
(2)レコードＲ１をR1_bに更新（UPDATE R1→R1_b）
(3)レコードＲ２をR2_bに更新（UPDATE R2→R2_b）
(4)コミット
である。尚、上記処理(1)〜(4)の処理は、それぞれ１０時、１０時１０分、１０時２０分、１０時３０分に実行される。  また、トランザクションＡにおいて、レコードＲ１の更新はノード１００７で行われ、レコードＲ２の更新はノード１０１７で行われる。
【００２７】
トランザクションＡが開始されると、ノード１００７は、レコードＲ１をR1_aからR1_bに更新する。ノード１００７は、更新したレコードＲ１の値R1_bをノード１０１７に送信する（ログシッピング）。
【００２８】
ノード１０１７は、レコードＲ２をR2_aからR2_bに更新する。ノード１０１７は、更新したレコードＲ２の値R2_bをノード１００７に送信する（ログシッピング）。
そして、ノード１００７、１０１７はトランザクションＡをコミットする。
【００２９】
その後、ノード１００７は、コミット指示をノード１０１７に送信し、コミット指示を受信したノード１０１７は、レコードＲ１をコミットする。それにより、ノード１０１７のレコードＲ１はR1_bに更新される。また、ノード１０１７は、コミット指示をノード１００７に送信し、コミット指示を受信したノード１００７は、レコードＲ２をコミットする。それにより、ノード１００７のレコードＲ２はR2_bに更新される。
【００３０】
トランザクションＢの処理内容は、
(1)トランザクション開始
(2)レコードＲ１を参照（SELECT R1）
(3)レコードＲ２を参照（SELECT R2）
(4)コミット
である。尚、トランザクションＢは、ノード１０１７で実行される。
【００３１】
トランザクションＢにおいて、レコードＲ１、Ｒ２を参照する場合、参照時刻によって参照されるデータは、図３Ｂに示すようになる。
トランザクションＡの開始前、例えば９時５０分に、レコードＲ１、Ｒ２を参照すると、レコードＲ１、Ｒ２の値は、それぞれR1_a、R2_aとなる。
【００３２】
トランザクションＡの実行中、例えば１０時１５分に、レコードＲ１、Ｒ２を参照すると、レコードＲ１、Ｒ２の値は、コミット前なので、それぞれR1_a、R2_aとなる。尚、ノードには、MultiVersion Concurrency Control（MVCC：多版型同時実行制御）が実装されているものとする。
【００３３】
トランザクションＡのコミット後、例えば１０時４０分に、レコードＲ１、Ｒ２を参照すると、レコードＲ１、Ｒ２の値は、ノード１０１７でレコードＲ１のコミットが行われていなければ、それぞれR1_a、R2_bとなる。また、レコードＲ１、Ｒ２の値は、ノード１０１７でレコードＲ１のコミットが行われていれば、それぞれR1_b、R2_bとなる。
【００３４】
すなわち、ノード１０１７でレコードＲ１のコミットが行われていなければ、レコードＲ１、Ｒ２の値は、それぞれR1_a、R2_bとなってしまい、整合性のあるデータが参照できないことになる。
【００３５】
このように、キャッシュデータ更新を非同期に行う方式でマルチサイト更新を行うと、整合性のあるデータを参照することが出来ない場合があった。
1つの側面では、本発明は、マルチサイト更新でキャッシュデータの更新を非同期に行う方式において、整合性のあるデータの参照を可能とすることを目的とする。
【課題を解決するための手段】
【００３６】
実施の形態に係るノードは、キャッシュと処理部とを備える。
キャッシュは、他ノードに格納されているデータの少なくとも一部であるキャッシュデータと、分散データベースシステムにおいて、実行されているトランザクションの一覧を示す第１のトランザクション一覧と、前記第１のトランザクション一覧の要求をトランザクション管理装置が受信した時刻を示す第１の時刻と、を格納する。
【００３７】
処理部は、前記キャッシュデータに含まれる複数世代を有するレコードの参照要求を受信したときに、第２のトランザクション一覧と前記第２のトランザクション一覧の要求を前記トランザクション管理装置が受信した時刻を示す第２の時刻を受信して前記キャッシュに格納する。そして、処理部は、前記第１の時刻と前記第２の時刻とを比較し、比較結果に基づいて、前記第１のトランザクション一覧または前記第２のトランザクション一覧のいずれかを第３のトランザクション一覧として選択し、前記第３のトランザクション一覧を用いて、前記複数世代を有するレコードのうち参照する世代のレコードを特定する。
【発明の効果】
【００３８】
実施の形態のノードによれば、マルチサイト更新でキャッシュデータの更新を非同期に行う方式において、整合性のあるデータの参照を可能とすることができる。
【図面の簡単な説明】
【００３９】
【図１Ａ】トランザクションの実行時間を示す図である。
【図１Ｂ】参照されるデータを示す図である。
【図２Ａ】複数ノードにおけるデータの更新を示す図である。
【図２Ｂ】複数ノードにおいてトランザクションＢが参照するデータを示す図である。
【図３Ａ】従来の複数ノードの更新（マルチサイト更新）を行った場合のデータの更新を示す図である。
【図３Ｂ】従来の方式においてマルチサイト更新を行った場合のトランザクションＢが参照するデータを示す図である。
【図４】実施の形態に係る分散データベースシステムの構成図である。
【図５】実施の形態に係るノードの構成図である。
【図６】キャッシュの構成図を示す図である。
【図７】ページの詳細な構成を示す図である。
【図８】レコードの構成を示す図である。
【図９】実施の形態に係るトランザクション管理装置の構成図である。
【図１０】実施の形態に係るキャッシュデータの最新化を示す図である。
【図１１】実施の形態に係るキャッシュデータ最新化処理のフローチャートである。
【図１２】実施の形態に係るデータの整合性を説明する図である。
【図１３】実施の形態に係るスナップショット選択処理のフローチャートである。
【図１４】実施の形態に係る参照レコードの特定処理のフローチャートである。
【図１５】Satisfy処理の例を示す図である。
【図１６】情報処理装置（コンピュータ）の構成図である。
【発明を実施するための形態】
【００４０】
以下、図面を参照しながら実施の形態を説明する。
図４は、実施の形態に係る分散データベースシステムの構成図である。
分散データベースシステム１０１は、ロードバランサ２０１、複数のノード３０１−ｉ（ｉ＝１〜３）、およびトランザクション管理装置４０１を備える。尚、ノード３０１−１〜３０１−３は、それぞれノード１〜３と表記する場合もある。
【００４１】
ロードバランサ２０１は、クライアント端末５０１と接続し、クライアント端末５０１からの要求を均等になるようにノード３０１のいずれかに振り分ける。尚、ロードバランサ２０１は、例えば、シリアルバスでノード３０１と接続している。
【００４２】
ノード３０１−ｉは、キャッシュ３０２−ｉと記憶部３０３−ｉを備える。
キャッシュ３０２−ｉは、キャッシュデータ３０４−ｉを有する。
キャッシュデータ３０４−ｉは、ノード３０１−ｉが有するデータベース３０５−ｉと同じ内容のデータを保持している。また、キャッシュデータは、他のノードが有するデータベース３０５と同じ内容のデータの一部または全てを有している。
【００４３】
例えば、キャッシュデータ３０４−１は、データベース３０５−１と同じ内容を有している。さらに、キャッシュデータ３０４−１は、データベース３０５−２、３０５−３の一部または全ての内容を有している。
【００４４】
キャッシュデータ３０４の内、自ノードが担当しているデータは、自ノードのデータベースの更新と同期して更新される。すなわち、キャッシュデータ３０４の内、自ノードが担当しているデータは最新のデータとなる。
【００４５】
キャッシュデータ３０４の内、他ノードが担当しているデータは、他ノードのデータベースの更新と非同期に更新される。すなわち、キャッシュデータ３０４の内、他ノードが担当しているデータは、最新のデータとならない場合がある。
【００４６】
記憶部３０３−ｉは、データベース３０５−ｉを有する。
ノード３０１は、クライアント端末５０１から要求されたデータが自身のキャッシュデータ３０４に無い場合は、該データを保持するノード３０１へ要求を送信し、該データを取得し、キャッシュデータ３０４として格納する。
【００４７】
トランザクション管理装置４０１は、分散データベースシステム１０１で実行されるトランザクションを制御する。尚、トランザクション管理装置４０１は、例えば、シリアルバスでノード３０１と接続している。
【００４８】
分散データベースシステム１０１において、データベース３０５の更新は複数のノードで行われる。すなわち、分散データベースシステム１０１は、マルチサイト更新を行う。
【００４９】
図５は、実施の形態に係るノードの詳細な構成図である。
図５では、ノード３０１−１の詳細な構成図を記載している。尚、ノード３０１−２、３０１−３については、保持するデータが違うだけで構成は同じため、説明は省略する。
ノード３０１−１は、受付部３１１、データ操作部３１２、レコード操作部３１３、キャッシュ管理部３１４、トランザクション管理部３１５、キャッシュ最新化部３１６、ログ管理部３１７、通信部３１８、キャッシュ３１９、および記憶部３２０を備える。
【００５０】
尚、キャッシュ３１９および記憶部３２０は、図４のキャッシュ３０２−１および記憶部３０３−１に対応している。
【００５１】
受付部３１１は、データベース操作、例えば、参照や更新、トランザクションの開始/終了などを受け付ける。
【００５２】
データ操作部３１２は、データベース作成時に定義した情報を参照して、受付部３１１が受け付けたデータ操作命令を解釈して実行する。
データ操作部３１２は、トランザクションの開始および終了指示をトランザクション管理部３１５に指示する。
【００５３】
データ操作部３１２は、受付部３１１が受け付けたデータ操作命令と定義情報を参照して、どのようにデータベースにアクセスするかを決定する。
データ操作部３１２は、アクセス手順に従い、レコード操作部３１３を呼び出してデータの検索や更新を実行する。データベースのレコードは、更新の度に新たな世代レコードを生成する方式になっているので、データの検索時はレコード操作部３１３に、どの時刻（例えばトランザクション開始時刻や、データ操作命令の実行時刻）のコミット済データを検索するかを通知する。また、データ更新時には、各データの担当ノードの情報を管理しているロケータ３２２を参照し、自ノードが更新データの担当ノードならば、自ノードのレコード操作部３１３に更新依頼を行う。自ノードが担当ノードでなければ、通信部３１８を介して担当ノードへ更新データを転送し、更新依頼を行う。
【００５４】
レコード操作部３１３は、データベースの検索や更新、トランザクションの終了、ログの採取を行なう。データベース３２３およびキャッシュデータ３２１のレコードはMVCCにより、更新の度に新たな世代レコードを作成する方式になっていて、レコード参照時には資源を占有（排他）せず、たとえ更新処理と競合しても、参照処理は排他待ちすることなく処理できるようになっている。
【００５５】
キャッシュ管理部３１４は、データ参照時にレコード操作部３１３より要求されたデータをキャッシュデータ３２１から返却する。データがない場合には、ロケータ３２２を参照して担当ノードを特定した後、担当ノードから最新データを取得して返す。
【００５６】
キャッシュ管理部３１４は、キャッシュデータ３２１の肥大化を抑えるために、参照されなくなった古い世代レコードを定期的に削除して再利用可能にする。また、キャッシュ管理部３１４は、キャッシュ３１９の空き容量が不足した場合は、データベース３２３にデータを書き込み、キャッシュ３１９に空きを作る。
【００５７】
トランザクション管理部３１５は、トランザクションをマネジメントする。トランザクション管理部３１５は、トランザクションがコミットする時には、ログ管理部３１７にコミットログを書き出すように依頼する。トランザクション管理部３１５は、トランザクションがロールバックする時には、トランザクションで更新した結果を無効化させる。
【００５８】
トランザクション管理部３１５は、トランザクション開始時、またはデータ参照時に、トランザクション管理装置４０１に時刻（トランザクションID）とスナップショットの取得依頼を行う。
【００５９】
また、トランザクション管理部３１５は、トランザクション開始時に、トランザクション管理装置４０１が管理しているスナップショットへ、トランザクションIDを追加するようにトランザクション管理装置４０１に依頼する。
【００６０】
また、トランザクション管理部３１５は、トランザクション終了時に、スナップショットからトランザクションIDを削除するようにトランザクション管理装置４０１に依頼する。
【００６１】
キャッシュ最新化部３１６は、キャッシュデータ３２１の最新化を行う
キャッシュ最新化部３１６は、他ノードの担当するデータが更新されたかどうかを確認するために、他ノードを定期巡回する。
【００６２】
ログ管理部３１７は、トランザクションの更新情報をログ３２４に記録する。更新情報は、トランザクションのロールバック時に更新データを無効化する場合や、分散データベースシステム１０１がダウンした場合にデータベース３２３を最新状態にリカバリするために使用される。
【００６３】
通信部３１８は、他ノードとの通信インタフェースである。他ノードが担当するデータを更新する場合や、キャッシュ最新化部３１６によるキャッシュ定期巡回で、他ノードのデータが更新されたかを確認するために、通信部３１８を介してやりとりする。
【００６４】
キャッシュ３１９は、ノード３０１−１で用いるデータを格納する記憶手段である。キャッシュ３１９は、記憶部３２０より読み書きの速度が速いことが望ましい。キャッシュ３１９は、例えば、Random Access Memory（ＲＡＭ）である。
【００６５】
キャッシュ３１９は、キャッシュデータ３２１およびロケータ３２２を格納している。尚、キャッシュデータは、図４のキャッシュデータ３０４−１に対応している。また、キャッシュ３１９は、後述するスナップショットや採番した時刻を格納する。
【００６６】
キャッシュデータ３２１は、データベース３２３の内容を含むデータである。キャッシュデータ３２１は、さらに他ノードが格納するデータベースの内容の少なくとも一部を含む。
【００６７】
ロケータ３２２は、各データをどのノードが担当しているかを示す情報である。すなわちデータと該データを有するデータベースを持つノードが対応付けられた情報である。
記憶部３２０は、ノード３０１−１で用いるデータを格納する記憶手段である。記憶部３２０は、例えば、磁気ディスク装置である。
記憶部３２０は、データベース３２３およびログ３２４を格納している。
【００６８】
図６は、キャッシュの構成図を示す図である。
ここでは、ノード３０１−１のキャッシュデータについて説明する。
キャッシュデータ３２１は、自ノード担当データ３３１と他ノード担当データ３３２からなる。
自ノード担当データ３３１は、自身が記憶部３２０に格納するデータ、すなわちノード３０１−１にとってはデータベース３２３と同じ内容のデータである。
【００６９】
データベース３２３は、複数のページから構成されるので、同様に自ノード担当データ３３１も複数のページから構成される。
自ノード担当データ３３１は、データベース３２３の更新と同期して更新されるため、常に最新のデータとなる。
【００７０】
他ノード担当データ３３２は、他のノードがそれぞれの記憶部に格納するデータベースの一部又は全てと同じ内容のデータである。
ただし、他ノード担当データ３３２は、他ノードのデータベースの更新とは非同期に更新される。そのため、他ノード担当データ３３２は、最新のデータではない場合がある。すなわち、ある時点において、他ノード担当データ３３２と他のノードに格納されているデータベースの内容が異なる場合がある。他ノード担当データ３３２も自ノード担当データ３３１と同様に複数のページから構成される。
【００７１】
例えば、ノード３０１−１の他ノード担当データ３３２は、データベース３０５−２
、３０５−３の一部または全てと同じ内容のデータである。
次にページの構成について説明する。
【００７２】
図７は、ページの詳細な構成を示す図である。
ページ３３３は、ページ制御部とレコード領域とを有する。
ページ制御部は、ページ番号、ページカウンタ、およびその他の制御情報を有する。
ページ番号は、ページを特定するための一意な値である。
ページカウンタは、ページが更新された回数を示し、ページが更新されるたびにインクリメントされる。
【００７３】
その他の制御情報は、レコード位置やサイズ、ページのサイズなどの情報である。
レコード領域は、レコードおよび未使用領域を備える。
レコードは、１件分のデータである。
未使用領域は、レコードが記述されていない領域である。
【００７４】
次にレコードの構成について説明する。
ノード３０１には、ＭＶＣＣが実装されており、一つのレコードは複数の世代のレコードで構成されている。
【００７５】
図８は、レコードの構成を示す図である。
図８は、一つのレコードの構成を示している。
レコードは、項目として、世代インデックス、作成者TRANID、削除者TRANID、およびデータを有する。
【００７６】
世代インデックスは、レコードの世代を示す値である。
作成者TRANIDは、その世代のレコードを作成したトランザクションを示す値である。
削除者TRANIDは、その世代のレコードを削除したトランザクションを示す値である。
データは、レコードのデータである。
【００７７】
図８においては、３世代のレコードを示しており、世代１が一番古いレコードであり、世代３は最新のレコードである。
【００７８】
次にトランザクション管理装置４０１について説明する。
図９は、実施の形態に係るトランザクション管理装置の構成図である。
トランザクション管理装置４０１は、トランザクションＩＤ採番部４０２、スナップショット管理部４０３、および時刻採番部４０４を備える。
【００７９】
トランザクションＩＤ採番部４０２は、トランザクションが開始された順番でトランザクションＩＤを採番する。実施の形態においては、トランザクションＩＤを”TRANID_時刻”としている。時刻はトランザクションＩＤ採番部４０２が採番の要求を受信した時刻である。トランザクションＩＤを”TRANID_時刻”とすることにより、トランザクションＩＤを比較すれば、どちらが先に開始されたトランザクションであるか分かる。
【００８０】
スナップショット管理部４０３は、スナップショット４０５を管理する。
スナップショット４０５は、実行中のトランザクションの一覧を示す情報である。スナップショット４０５は、スナップショット管理部４０３またはトランザクション管理装置４０１が有する記憶部（不図示）に格納される。
【００８１】
実施の形態において、スナップショット４０５は分散データベースシステム１０１で実行中のトランザクションのトランザクションＩＤの一覧である。スナップショット管理部４０３は、トランザクションの開始時に開始するトランザクションのトランザクションＩＤをスナップショット４０５に追加、またトランザクションの終了時に終了したトランザクションのトランザクションＩＤをスナップショット４０５から削除する。
【００８２】
時刻採番部４０４は、ノード３０１からの要求に応じて時刻を採番し、採番した時刻をノード３０１に送信する。ノード３０１からの要求に応じて時刻を採番するので、採番した時刻は要求を受信した時刻となる。
【００８３】
実施の形態において、時刻採番部４０４は、採番した時刻をトランザクションＩＤ採番部４０２が割り当てるトランザクションＩＤと同じ形式のデータとする。すなわち、採番した時刻を”TRANID_時刻”としてノードに送信する。
【００８４】
採番した時刻とトランザクションＩＤを同じ形式とすることにより、これらを比較することにより、採番した時刻とトランザクションの開始のどちらが先か分かる。
【００８５】
次にキャッシュデータの最新化について説明する。
図１０は、実施の形態に係るキャッシュデータの最新化を示す図である。
実施の形態のノードは、他ノードのデータベースの更新を定期的にチェックすることで、キャッシュデータが最新の状態であるかをチェックする。
【００８６】
図１０では、ノード０のキャッシュの最新化を表している。
図１０の白丸はページを示し、黒丸は担当ノードで更新されたページを示し、×はキャッシュ上で削除したページを示す。
【００８７】
ここでは、ノード０は、他ノード、すなわちノード１〜ノード３のデータベースの更新をチェックしている。
時刻t1におけるノード０の他ノード担当データ５０１は、ノード１〜ノード３が担当するページを４つずつ有している。
【００８８】
ノード０は、ノード１にページ番号を送付する。ノード１は、受信したページ番号に対応するページのページカウンタをノード０に送信する。
ノード０は、受信したページカウンタと他ノード担当データ５０１のページのページカウンタと比較し、異なっていれば、ページは更新されていると判断する。そして、ページカウンタが異なっていたページを削除する。図１０においては、他ノード担当データ５０１のうちノード１の左から３番目のページが削除される。
【００８９】
ノード２およびノード３に対しても同様の処理を行い、他ノード担当データ５０１のうちノード２の左から１番目のページとノード３の左から２番目のページが削除される。時刻t2で、全ての他ノードのチェックが終了する。
それにより、時刻t2において、他ノード担当データは、他ノード担当データ５０２の様になる。
【００９０】
図１１は、実施の形態に係るキャッシュデータ最新化処理のフローチャートである。
ここではノード３０１−１の処理について説明する。
ステップＳ９０１において、キャッシュ最新化部３１６は、トランザクション管理装置４０１に時刻の採番とスナップショット４０５を要求する。そして、キャッシュ最新化部３１６は、トランザクション管理装置４０１から採番した時刻とスナップショットを受信し、キャッシュ３１９の領域Ｃに格納する。上述したように、実施の形態において、採番した時刻の形式はトランザクションＩＤの形式と同一である。
【００９１】
ステップＳ９０２において、キャッシュ最新化部３１６は、複数の他ノードのうち未選択の他ノードを一つ選択し、選択した他ノードが担当する他ノード担当データのページ番号を送付する。
【００９２】
ステップＳ９０３において、キャッシュ最新化部３１６は、ページカウンタをページ番号を送付した他ノードから受信する。受信したページカウンタは最新のページカウンタである。
【００９３】
ステップＳ９０４において、キャッシュ最新化部３１６は、ページカウンタが更新されていたページを削除する。すなわち、キャッシュ最新化部３１６は、他ノード担当データの各ページのページカウンタと受信したページカウンタを比較して、異なっていた場合、ページカウンタが異っていたページを削除する。
【００９４】
ステップＳ９０５において、キャッシュ最新化部３１６は、全他ノードを処理したか。すなわち、全他ノードに対してページ番号を送付したか判定する。全他ノードを処理した場合、制御はステップＳ９０６へ進み、全他ノードを処理していない場合、制御はステップＳ９０２へ戻る。
【００９５】
ステップＳ９０６において、キャッシュ最新化部３１６は、キャッシュ３１９の領域Ｃの内容、すなわち採番した時刻およびスナップショット４０５をキャッシュ３１９の領域Ｂへコピーする。
【００９６】
図１２は、実施の形態に係るデータの整合性を説明する図である。
図１２において横軸は時間を示しており、各トランザクションＴ１〜Ｔ５の実行時間を示している。
【００９７】
ここで、時刻t1＜t2≦t3＜t4である。
また、トランザクションＴ１、Ｔ３は、時刻t1より前にコミットされている。トランザクションＴ２、Ｔ４は、時刻t1より前に開始している。
【００９８】
ノードは、他ノードの巡回を行い、データが更新されているかチェックしている。図１２では、時刻t1からt2間と時刻t2からt4間で１回分の巡回を行っている。
時刻t1では、トランザクションＴ１、Ｔ３でコミットされたデータ、およびトランザクションＴ２、Ｔ４開始時のデータがキャッシュデータに反映されている（すなわち、キャッシュデータと同じ）であるかは、確認できない。
【００９９】
時刻t2では、他ノードのキャッシュを1巡回したため、時刻t3で参照するデータにトランザクションＴ１、Ｔ３でコミットされたデータ、およびトランザクションＴ２、Ｔ４開始時のデータがキャッシュデータに反映されているか判断可能となる。上述のように、キャッシュの最新化処理で、他ノードで更新されたページは、キャッシュデータから削除される。
【０１００】
キャッシュデータに反映されていないデータ、すなわちキャッシュデータから削除されているデータを参照する場合は、ノードは時刻t3で担当ノードからデータを取得してキャッシュデータに格納する。取得するデータは、参照するデータが含まれるページである。ノードはページの取得後、時刻t1以降にコミットされた世代のデータは削除し、時刻t1までに更新された各世代のデータをキャッシュデータに反映する。
【０１０１】
時刻t3でデータを参照する場合は、時刻t1のスナップショット、またはレコードの参照要求の受信時に取得したスナップショットを使用する。スナップショットには、トランザクションＴ２、Ｔ４のトランザクションＩＤが含まれている。
【０１０２】
次に、参照レコードの特定に用いるスナップショットの選択処理について説明する。
図１３は、実施の形態に係るスナップショット選択処理のフローチャートである。
ここではノード３０１−１の処理について説明する。
【０１０３】
先ず、ノード３０１−１は、レコードの参照要求を受信すると、該レコードが自ノード担当データ３３１にあるか判定し、ある場合は、該レコードを読み出して応答する。自ノード担当データ３３１にあるか否かはロケータ３２２を用いて判断する。また、参照要求されたレコードが自ノード担当データ３３１にない、すなわち他ノードが担当するデータである場合、該レコードが他ノード担当データ３３２にあるか判定し、他ノード担当データ３３２にない場合は、該レコードを担当する他ノードから該レコードを含むページを取得し、図１２で説明したようにキャッシュデータ３２１に反映する。
【０１０４】
ステップＳ９１１において、トランザクション管理部３１５は、トランザクション管理装置４０１に時刻の採番とスナップショット４０５を要求する。そして、トランザクション管理部３１５は、トランザクション管理装置４０１から採番した時刻とスナップショットを受信し、キャッシュ３１９の領域Ａに格納する。
【０１０５】
ステップＳ９１２において、レコード操作部３１３は、領域Ａの採番した時刻と領域Ｂの採番した時刻を比較する。
ステップＳ９１３において、領域Ａの採番した時刻の方が新しい場合、制御はステップＳ９１４に進み、領域Ａの採番した時刻の方が新しくない場合、制御はステップＳ９１５へ進む。
【０１０６】
ステップＳ９１４において、レコード操作部３１３は、領域Ｂのスナップショットを選択する。
ステップＳ９１５において、レコード操作部３１３は、領域Ａのスナップショットを選択する。
【０１０７】
ステップＳ９１６において、レコード操作部３１３は、選択したスナップショットを使用して、複数の世代を有するレコードのうち参照する世代のレコード（有効レコード）を特定する。そして、特定したレコードを参照し、該レコードの値を要求元に送信する。
【０１０８】
次に参照レコードの特定処理について説明する。
上述のように、実施の形態のノードはＭＶＣＣを実装しており、レコードはレコード毎にそのレコードを作成したトランザクション、削除したトランザクションを識別する値を格納している。そして、ノードは、ある世代のレコードがあるトランザクションにとって有効な世代か無効な世代かを判定する。このような判定をSatisfy処理と呼ぶ。
【０１０９】
Satisfy処理では、下記のルールに合致するレコードが有効な世代のレコードであると判定する。
レコードの作成者TRANIDが、
自トランIDを除くスナップショット中のトランザクションID（TRANID）でない、且つ、
スナップショット取得時以降に開始されたTRANIDでない、
且つ
レコードの削除者TRANIDが、
未設定、または、
自トランIDを除くスナップショット中に含まれるTRANIDである、または、
スナップショット取得時以降に開始されたTRANIDである。
【０１１０】
ここで、自トランIDは、レコードを参照しようとするトランザクションのトランザクションＩＤである。
【０１１１】
図１４は、実施の形態に係る参照レコードの特定処理のフローチャートである。
図１４は、ステップＳ９１６の参照する世代のレコードの特定する処理の詳細を示す。
【０１１２】
ステップＳ９２１において、レコード操作部３１３は、全世代のレコードを判定したか判定する。全世代のレコードを判定した場合、処理を終了し、全世代のレコードを判定していない場合、未判定の世代のレコードの内、最古の世代のレコードを選択し、制御はステップＳ９２２へ進む。以下、選択した世代のレコードに対して有効な世代であるか無効な世代であるか判定する。
【０１１３】
ステップＳ９２２において、レコード操作部３１３は、レコードの作成者TRANIDが自トランID、またはスナップショット中のTRANIDでないか判定する。レコードの作成者TRANIDが自トランID、またはスナップショット中のTRANIDでない場合、制御はステップＳ９２２へ進み、自トランID、またはスナップショット中のTRANIDである場合、制御はステップＳ９２１へ戻る。
【０１１４】
ステップＳ９２３において、レコード操作部３１３は、レコードの作成者TRANIDがスナップショット取得時以降に開始されたTRANIDでないか判定する。レコードの作成者TRANIDがスナップショット取得時以降に開始されたTRANIDでない場合、制御はステップＳ９２４へ進み、スナップショット取得時以降に開始されたTRANIDである場合、制御はステップＳ９２１へ戻る。実施の形態において、スナップショット取得時以降に開始されたTRANIDでないかの判定は、該スナップショット取得時に採番した時刻を用いて判定する。
【０１１５】
ステップＳ９２４において、レコード操作部３１３は、レコードの削除者TRANIDが未設定であるか判定する。レコードの削除者TRANIDが未設定である場合、制御はステップＳ９２７へ進み、未設定で無い場合、制御はステップＳ９２５へ進む。
【０１１６】
ステップＳ９２５において、レコード操作部３１３は、レコードの削除者TRANIDが自トランIDでない、かつスナップショット中に含まれるTRANIDであるであるか判定する。レコードの削除者TRANIDが自トランIDでない、かつスナップショット中に含まれるTRANIDである場合、制御はステップＳ９２７へ進み、自トランIDである、またはスナップショット中に含まれるTRANIDでない場合、制御はステップＳ９２６へ進む。
【０１１７】
ステップＳ９２６において、レコード操作部３１３は、レコードの削除者TRANIDがスナップショット取得時以降に開始されたTRANIDであるか判定する。レコードの削除者TRANIDがスナップショット取得時以降に開始されたTRANIDである場合、制御はステップＳ９２７へ進み、スナップショット取得時以降に開始されたTRANIDで無い場合、制御はステップＳ９２１へ戻る。実施の形態において、スナップショット取得時以降に開始されたTRANIDであるかの判定は、該スナップショット取得時に採番した時刻を用いて判定する。
【０１１８】
ステップＳ９２７において、レコード操作部３１３は、選択した世代のレコードを有効レコードとして設定する。尚、以前に設定された有効レコードは、新たに有効レコードが設定されると無効となる。
【０１１９】
図１５は、Satisfy処理の例を示す図である。
図１５は、レコード８０１に対してSatisfy処理を行った場合を示している。
ここでは、スナップショットは“25,50,75”であり、自TRANIDは50であり、スナップショット取得時において次に開始するトランザクションに割り当てられるTRANIDは100である。
【０１２０】
上述のルールに基づいて、レコード８０１の各世代について有効な世代か無効な世代かすると、世代インデックスが１、３、５、６、８、１０のレコードは有効（Visible）と判定され、世代インデックスが２、４、７、９、１１のレコードは無効（Invisible）と判定される。
【０１２１】
ここで、有効なレコードの内で世代インデックが一番大きいレコード、すなわち有効なレコードの内で一番新しいレコードが最終的に有効なレコードとなる。すなわち、図１５では、世代インデックスが１０のレコードが有効なレコード、すなわちノードが参照するレコードとなる。
【０１２２】
実施の形態の分散データベースシステムによれば、マルチサイト更新が行われ、キャッシュデータの最新化を非同期に行われる分散データベースシステムにおいて、整合性のあるデータの参照が可能となる。
【０１２３】
図１６は、情報処理装置（コンピュータ）の構成図である。
実施の形態のノード３０１は、例えば、図１６に示すような情報処理装置１によって実現される。
【０１２４】
情報処理装置１は、CPU２、メモリ３、入力部４、出力部５、記憶部６、記録媒体駆動部７、およびネットワーク接続部８を備え、それらはバス９により互いに接続されている。
【０１２５】
CPU２は、情報処理装置１全体を制御する中央処理装置である。CPU２は、受付部３１１、データ操作部３１２、レコード操作部３１３、キャッシュ管理部３１４、トランザクション管理部３１５、キャッシュ最新化部３１６、ログ管理部３１７に対応する。
【０１２６】
メモリ３は、プログラム実行の際に、記憶部６（あるいは可搬記録媒体１０）に記憶されているプログラムあるいはデータを一時的に格納するRead Only Memory(ROM)やRandom Access Memory(RAM)等のメモリである。メモリ３は、キャッシュ３１９に対応する。CPU２は、メモリ３を利用してプログラムを実行することにより、上述した各種処理を実行する。
【０１２７】
この場合、可搬記録媒体１０等から読み出されたプログラムコード自体が実施の形態の機能を実現する。
入力部４は、例えば、キーボード、マウス、タッチパネル等である。
【０１２８】
出力部５は、例えば、ディスプレイ、プリンタ等である。
記憶部６は、例えば、磁気ディスク装置、光ディスク装置、テープ装置等である。情報処理装置１は、記憶部６に、上述のプログラムとデータを保存しておき、必要に応じて、それらをメモリ３に読み出して使用する。
【０１２９】
記憶部６は、記憶部３２０に対応する。
記録媒体駆動部７は、可搬記録媒体１０を駆動し、その記録内容にアクセスする。可搬記録媒体としては、メモリカード、フレキシブルディスク、Compact Disk Read Only Memory(CD-ROM)、光ディスク、光磁気ディスク等、任意のコンピュータ読み取り可能な記録媒体が用いられる。ユーザは、この可搬記録媒体１０に上述のプログラムとデータを格納しておき、必要に応じて、それらをメモリ３に読み出して使用する。
【０１３０】
ネットワーク接続部８は、LAN等の任意の通信ネットワークに接続され、通信に伴うデータ変換を行う。ネットワーク接続部は、通信部３１８に対応する。
【符号の説明】
【０１３１】
１０１    分散データベースシステム
２０１    ロードバランサ
３０１    ノード
３１１    受付部
３１２    データ操作部
３１３    レコード操作部
３１４    キャッシュ管理
３１５    トランザクション管理部
３１６    キャッシュ最新化部
３１７    ログ管理部
３１８    通信部
３１９    キャッシ
３２０    記憶部
３２１    キャッシュデータ
３２２    ロケータ
３２３    データベース
３２４    ログ
３３１    自ノード担当データ
３３２    他ノード担当データ
３３３    ページ
４０１    トランザクション管理装置
４０２    トランザクションＩＤ採番部
４０３    スナップショット管理部
４０４    時刻採番部
４０５    スナップショット
５０１    クライアント端末
１００５    ノード
１００６    キャッシュ
１００７    ノード
１００８    キャッシュ
１０１５    ノード
１０１６    キャッシュ
１０１７    ノード
１０１８    キャッシュ
【図１Ａ】
0005772458.tif 000002
【図１Ｂ】
0005772458.tif 000003
【図２Ａ】
0005772458.tif 000004
【図２Ｂ】
0005772458.tif 000005
【図３Ａ】
0005772458.tif 000006
【図３Ｂ】
0005772458.tif 000007
【図４】
0005772458.tif 000008
【図５】
0005772458.tif 000009
【図６】
0005772458.tif 000010
【図７】
0005772458.tif 000011
【図９】
0005772458.tif 000012
【図１０】
0005772458.tif 000013
【図１１】
0005772458.tif 000014
【図１２】
0005772458.tif 000015
【図１３】
0005772458.tif 000016
【図１４】
0005772458.tif 000017
【図１５】
0005772458.tif 000018
【図１６】
0005772458.tif 000019
【図８】
0005772458.tif 000020