(57)【要約】  システム（１）は、複数のノード（３）を有する。複数のノード（３）は、記憶部（５）と、送信制御部（６ｂ）と、通信部（４）と、取得部（６ｄ）とを有する。記憶部（５）は、ログを記憶する。送信制御部（６ｂ）は、異常が発生したノード以外の他のノードに、記憶部（５）に記憶されたログが生成された順番を示す情報の送信を依頼する。通信部（４）は、他のノードから他のノードに記憶されたログが生成された順番を示す情報を受信する。取得部（６ｄ）は、受信した情報が示す順番、および、記憶部（５）に記憶されたログが生成された順番に基づいて、次のような処理を行う。すなわち、取得部（６ｄ）は、記憶部に記憶されたログが生成された順番よりも新しい順番のログが記憶された他のノードが存在する場合には、新しい順番のログが記憶された他のノードから、記憶部（５）に記憶されたログよりも新しい順番のログを取得する。
2014006713.tif 000002
【特許請求の範囲】
【請求項１】
複数のノードを有するシステムであって、
前記複数のノードは、
ログを記憶する記憶部と、
異常が発生したノード以外の他のノードに、前記記憶部に記憶されたログが生成された順番を示す情報の送信を依頼する送信制御部と、
前記他のノードから前記他のノードに記憶されたログが生成された順番を示す情報を受信する受信部と、
前記受信した情報が示す順番、および、前記記憶部に記憶されたログが生成された順番に基づいて、前記記憶部に記憶されたログが生成された順番よりも新しい順番のログが記憶された他のノードが存在する場合には、当該新しい順番のログが記憶された他のノードから、前記記憶部に記憶されたログよりも新しい順番のログを取得する取得部と、
を有することを特徴とするシステム。
【請求項２】
前記取得部は、前記記憶部に記憶されたログが生成された順番よりも新しく、かつ、該順番に最も近い順番のログが記憶された他のノードから、前記記憶部に記憶されたログよりも新しい順番のログを取得する
ことを特徴とする請求項１に記載のシステム。
【請求項３】
ログを記憶する記憶部と、
異常が発生した情報処理装置以外の他の情報処理装置に、前記記憶部に記憶されたログが生成された順番を示す情報の送信を依頼する送信制御部と、
前記他の情報処理装置から前記他の情報処理装置に記憶されたログが生成された順番を示す情報を受信する受信部と、
前記受信した情報が示す順番、および、前記記憶部に記憶されたログが生成された順番に基づいて、前記記憶部に記憶されたログが生成された順番よりも新しい順番のログが記憶された他の情報処理装置が存在する場合には、当該新しい順番のログが記憶された他の情報処理装置から、前記記憶部に記憶されたログよりも新しい順番のログを取得する取得部と、
を有することを特徴とする情報処理装置。
【請求項４】
情報処理装置が、
異常が発生した情報処理装置以外の他の情報処理装置に、ログを記憶する記憶部に記憶されたログが生成された順番を示す情報の送信を依頼し、
前記他の情報処理装置から前記他の情報処理装置に記憶されたログが生成された順番を示す情報を受信する受信部により受信された情報が示す順番、および、前記記憶部に記憶されたログが生成された順番に基づいて、前記記憶部に記憶されたログが生成された順番よりも新しい順番のログが記憶された他の情報処理装置が存在する場合には、当該新しい順番のログが記憶された他の情報処理装置から、前記記憶部に記憶されたログよりも新しい順番のログを取得する、
各処理を実行することを特徴とする取得方法。
【請求項５】
コンピュータに、
異常が発生した情報処理装置以外の他の情報処理装置に、ログを記憶する記憶部に記憶されたログが生成された順番を示す情報の送信を依頼し、
前記他の情報処理装置から前記他の情報処理装置に記憶されたログが生成された順番を示す情報を受信する受信部により受信された情報が示す順番、および、前記記憶部に記憶されたログが生成された順番に基づいて、前記記憶部に記憶されたログが生成された順番よりも新しい順番のログが記憶された他の情報処理装置が存在する場合には、当該新しい順番のログが記憶された他の情報処理装置から、前記記憶部に記憶されたログよりも新しい順番のログを取得する、
各処理を実行させることを特徴とする取得プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、システム、情報処理装置、取得方法および取得プログラムに関する。
【背景技術】
【０００２】
従来、ＳＱＬなどを用いてデータベースに対してデータの変更、削除、追加などの更新を行う装置がある。また、データベースを２台設けて、１つのデータベースに更新が行われた場合に、更新された内容を他のデータベースに反映させるシステムがある（例えば特許文献１、特許文献２および特許文献３参照）。【０００３】
かかるシステムでは、例えば、ＳＱＬを用いた処理を実行するアプリケーションを実行する第１のノードから、データベースを有する第２のノードがＳＱＬ文を受信した場合には、第２のノードは、次のような処理を行う。すなわち、第２のノードは、ＳＱＬ文に基づいてデータベースを更新し、データベースの更新内容を示すログを生成する。そして、第２のノードは、生成したログをリカバリログとしてリカバリログファイルに登録する。また、第２のノードは、生成したログを差分ログとして他のデータベースを有する第３のノードに送信する。かかる差分ログを受信した第３のノードは、受信した差分ログを差分ログファイルに登録するとともに、受信した差分ログをリカバリログとしてリカバリログファイルに登録する。そして、第３のノードは、リカバリログファイルを用いてデータベースを更新する。なお、リカバリログおよび差分ログには、ログが生成された順番を示す情報である世代番号が含まれる。【０００４】
また、上記のシステムでは、例えば、第２のノードがマスタノード、第３のノードがスレーブノードである場合に、第２のノードに異常が発生したときには、第３のノードがマスタノードに切り替わり第１のノードによるアプリケーションの実行が継続される。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２００７−２７２６４８号公報
【特許文献２】国際公開第２００８／１２９６２０号
【特許文献３】特開２００７−５８６１１号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
しかしながら、上記の従来の技術を、データベースを有する３台以上のノードに適用した場合には、負荷が１台のマスタノードに集中してしまうという問題がある。上記の従来の技術を、データベースを有する３台以上のノードに適用した場合について説明する。図１４および図１５は、従来の技術を、データベースを有する３台以上のノードに適用した場合の一例を説明するための図である。図１４の例に示すシステムは、アプリケーションノード９０、ノード９１ａ〜９１ｆを有する。図１４の例では、アプリケーションノード９０は、ＳＱＬを用いた処理を実行するアプリケーションを実行する。また、図１４の例は、ノード９１ａがマスタノードであり、ノード９１ｂ〜９１ｆがスレーブノードである場合を示す。また、図１４の例では、ノード９１ａ〜９１ｆのそれぞれは、データベースを有する。図１４の例では、ノード９１ａがアプリケーションノード９０からＳＱＬ文を受信した場合には、ノード９１ａは、ＳＱＬ文に基づいてデータベースを更新する。そして、ノード９１ａは、データベースの更新内容を示すログを生成する。そして、ノード９１ａは、生成したログをリカバリログとしてリカバリログファイルに登録する。これに加えて、ノード９１ａは、生成したログを差分ログとしてノード９１ｂ〜９１ｆに送信する。差分ログを受信したノード９１ｂ〜９１ｆは、受信した差分ログを差分ログファイルに登録するとともに、受信した差分ログをリカバリログとしてリカバリログファイルに登録する。そして、ノード９１ｂ〜９１ｆのそれぞれは、リカバリログファイルを用いてデータベースを更新する。【０００７】
ここで、マスタノードであるノード９１ａに異常が発生した場合には、例えば、図１５に示すように、ノード９１ｂがマスタノードに切り替わる。ここで、図１５の例に示すように、スレーブノードであるノード９１ｃ〜９１ｆにおける受信済みの差分ログの最新の世代番号は、それぞれ、「２」、「５」、「２」、「４」である。すなわち、図１５の例では、ノード９１ｃ〜９１ｆのそれぞれは、世代番号「２」、「５」、「２」、「４」のそれぞれの差分ログまでを保持している。そして、新たにマスタノードとなったノード９１ｂは、図１５の例に示すように、ノード９１ｃ〜９１ｆにおける受信済みの差分ログの世代番号が、ノード９１ｂにおける差分ログの世代番号「６」となるように、各ノード９１ｃ〜９１ｆに差分ログを送信する。図１５の例では、ノード９１ｂは、ノード９１ｃに世代番号「３」〜「６」の差分ログを送信する。また、ノード９１ｂは、ノード９１ｄに世代番号「６」の差分ログを送信する。また、ノード９１ｂは、ノード９１ｅに世代番号「３」〜「６」の差分ログを送信する。また、ノード９１ｂは、ノード９１ｆに世代番号「５」〜「６」の差分ログを送信する。このように、上記の従来の技術を、データベースを有する３台以上のノードに適用した場合には、新たにマスタノードに切り替わったノードは、全てのスレーブノードに多数の差分ログを送信する。そのため、上記の従来の技術を、データベースを有する３台以上のノードに適用した場合には、負荷がマスタノードに集中してしまうという問題がある。【０００８】
１つの側面では、本発明は、負荷が１つのノードに集中することを抑制することを目的とする。
【課題を解決するための手段】
【０００９】
一態様のシステムは、複数のノードを有するシステムである。複数のノードは、記憶部と、送信制御部と、受信部と、取得部とを有する。記憶部は、ログを記憶する。送信制御部は、異常が発生したノード以外の他のノードに、記憶部に記憶されたログが生成された順番を示す情報の送信を依頼する。受信部は、他のノードから他のノードに記憶されたログが生成された順番を示す情報を受信する。取得部は、前記受信した情報が示す順番、および、記憶部に記憶されたログが生成された順番に基づいて、次のような処理を行う。すなわち、取得部は、記憶部に記憶されたログが生成された順番よりも新しい順番のログが記憶された他のノードが存在する場合には、新しい順番のログが記憶された他のノードから、記憶部に記憶されたログよりも新しい順番のログを取得する。
【発明の効果】
【００１０】
一態様によれば、負荷が１つのノードに集中することを抑制することができる。
【図面の簡単な説明】
【００１１】
【図１】図１は、実施例１に係るシステムの構成の一例を示す図である。
【図２】図２は、実施例１に係るノードの機能的な構成の一例を示す図である。
【図３Ａ】図３Ａは、リカバリログファイルの一例を示す図である。
【図３Ｂ】図３Ｂは、差分ログファイルの一例を示す図である。
【図４】図４は、各ノードが実行する処理の一例を説明するための図である。
【図５】図５は、各ノードが実行する処理の一例を説明するための図である。
【図６】図６は、各ノードが実行する処理の一例を説明するための図である。
【図７】図７は、各ノードが実行する処理の一例を説明するための図である。
【図８】図８は、各ノードが実行する処理の一例を説明するための図である。
【図９】図９は、各ノードが実行する処理の一例を説明するための図である。
【図１０】図１０は、決定処理の手順を示すフローチャートである。
【図１１】図１１は、取得処理の手順を示すフローチャートである。
【図１２】図１２は、送信処理の手順を示すフローチャートである。
【図１３】図１３は、プログラムを実行するコンピュータを示す図である。
【図１４】図１４は、従来の技術を、データベースを有する３台以上のノードに適用した場合の一例を説明するための図である。
【図１５】図１５は、従来の技術を、データベースを有する３台以上のノードに適用した場合の一例を説明するための図である。
【発明を実施するための形態】
【００１２】
以下に、本願の開示するシステム、情報処理装置、取得方法および取得プログラムの実施例を図面に基づいて詳細に説明する。なお、実施例は開示の技術を限定するものではない。
【実施例１】
【００１３】
実施例１に係るシステムについて説明する。図１は、実施例１に係るシステムの構成の一例を示す図である。図１の例に示すシステム１は、アプリケーションノード２、および、６台のノード３ａ〜３ｆを有する。なお、アプリケーションノード、および、ノードの台数は、任意の台数を採用できる。アプリケーションノード２と、ノード３ａ〜３ｆとは、ネットワーク７０を介して接続されている。すなわち、アプリケーションノード２と、ノード３ａ〜３ｆとは、互いに通信可能である。なお、アプリケーションノード２と、ノード３ａ〜３ｆとは、有線に限らず、無線など任意の通信網を介して接続することができる。以下、ノード３ａ〜３ｆを区別することなく説明する場合には、ノード３と総称する。また、ノード３は、互いに異常の発生を監視しており、他のノード３の異常の発生を検出すると、他のノード３の異常を検出したことを示す情報をアプリケーションノード２および異常が発生していないノード３に送信する。これにより、アプリケーションノード２および異常が発生していないノード３は、異常が発生したノード３を把握することができる。【００１４】
アプリケーションノード２は、ＳＱＬを用いた処理を行うアプリケーションを実行する。例えば、アプリケーションノード２は、ノード３ａ〜３ｆのうち、マスタノードのノードにＳＱＬ文を送信し、マスタノードのデータベースにアクセスする。【００１５】
ノード３は、データベースを有する。複数のノード３のうち、マスタノードは、アプリケーションノード２からＳＱＬ文を受信した場合には、ＳＱＬ文に基づいてデータベースを更新する。そして、マスタノードは、データベースの更新内容を示すログを生成する。そして、マスタノードは、生成したログをリカバリログとしてリカバリログファイルに登録する。これに加えて、マスタノードは、生成したログを差分ログとして、スレーブノードに送信する。差分ログを受信したスレーブノードは、受信した差分ログを差分ログファイルに登録するとともに、受信した差分ログをリカバリログとしてリカバリログファイルに登録する。そして、スレーブノードは、リカバリログファイルを用いてデータベースを更新する。これにより、マスタノードおよびスレーブノードのデータベースの登録内容が一致するようになる。ただし、マスタノードとスレーブノードとの間で通信の遅延が発生するなどの理由により、スレーブノードでのデータベースの更新が遅くなり、全ノードの登録内容が一致しないような状況もあり得る。【００１６】
図２は、実施例１に係るノードの機能的な構成の一例を示す図である。ノード３は、通信部４、記憶部５、制御部６を有する。【００１７】
通信部４は、ノード間の通信を行うためのインターフェースである。例えば、通信部４は、他のノード３と定期的に正常であることを示す情報を交換している。そして、通信部４は、他のノード３から正常であることを示す情報を所定期間受信できなかった場合、または、異常の発生を示す情報を受信した場合、もしくは、通信の異常を検出した場合には、後述する通信制御部６ｂへ異常の発生を送信する。また、通信部４は、アプリケーションノード２からネットワーク７０を介してＳＱＬ文を受信した場合には、受信したＳＱＬ文を制御部６へ送信する。また、通信部４は、後述する送信制御部６ｂから、リカバリログの世代番号を受信した場合には、ネットワーク７０を介してスレーブノードへ、受信した世代番号を送信する。また、通信部４は、後述する決定部６ｃから、マスタノードであることを示す情報を受信した場合には、ネットワーク７０を介して、スレーブノードおよびアプリケーションノード２へ、受信した情報を送信する。また、通信部４は、後述する取得部６ｄから、差分ログの要求を受信した場合には、ネットワーク７０を介して、後述する親ノードへ、受信した要求を送信する。また、通信部４は、取得部６ｄから、完了通知を受信した場合には、ネットワーク７０を介して、親ノードへ、受信した完了通知を送信する。また、通信部４は、後述する実行部６ａから、差分ログを受信した場合には、ネットワーク７０を介して、スレーブノードへ、受信した差分ログを送信する。【００１８】
記憶部５は、各種の情報を記憶する。例えば、記憶部５は、Ｄａｔａ  Ｂａｓｅ（ＤＢ；データベース）５ａ、リカバリログファイル５ｂ、差分ログファイル５ｃを記憶する。【００１９】
ＤＢ５ａには、アプリケーションノード２からの処理の要求に応じて実行された処理に関するデータが後述する実行部６ａにより登録される。例えば、自ノードがマスタノードである場合には、アプリケーションノード２から送信されたＳＱＬ文が後述する実行部６ａにより実行された結果、ＤＢ５ａの登録内容が更新される。また、自ノードがスレーブノードである場合には、リカバリファイル５ｂに基づいて実行部６ａによりＤＢ５ａの登録内容が更新される。【００２０】
また、リカバリログファイル５ｂには、自ノードがマスタノードである場合に、アプリケーションノード２からの処理の要求に応じて実行された処理の履歴であるログが実行部６ａにより登録される。かかるログには、ログが生成された順番を示す情報である世代番号が含まれる。また、リカバリログファイル５ｂには、自ノードがスレーブノードである場合に、差分ログファイル５ｃに新たに登録された差分ログが、リカバリログとして実行部６ａにより登録される。図３Ａは、リカバリログファイルの一例を示す図である。図３Ａの例は、リカバリログファイル５ｂに、世代番号が「１」、「２」、・・・のログが登録された場合を示す。なお、リカバリログファイル５ｂに登録されるログは、「リカバリログ」とも称される。【００２１】
また、差分ログファイル５ｃは、自ノードがスレーブノードである場合に、マスタノードから送信されたログが実行部６ａにより登録される。かかるログには、ログが生成された順番を示す情報である世代番号が含まれる。図３Ｂは、差分ログファイルの一例を示す図である。図３Ｂの例は、差分ログファイル５ｃに、世代番号が「１」、「２」、・・・のログが登録された場合を示す。なお、差分ログファイル５ｃに登録されるログは、「差分ログ」とも称される。【００２２】
記憶部５は、例えば、フラッシュメモリなどの半導体メモリ素子、または、ハードディスク、光ディスクなどの記憶装置である。なお、記憶部５は、上記の種類の記憶装置に限定されるものではなく、Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ（ＲＡＭ）、Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ（ＲＯＭ）であってもよい。【００２３】
制御部６は、各種の処理手順を規定したプログラムや制御データを格納するための内部メモリを有し、これらによって種々の処理を実行する。図１に示すように、制御部６は、実行部６ａと、送信制御部６ｂと、決定部６ｃと、取得部６ｄとを有する。【００２４】
実行部６ａは、Ｒｅｌａｔｉｏｎａｌ  ＤａｔａＢａｓｅ  Ｍａｎａｇｅｍｅｎｔ  Ｓｙｓｔｅｍ（ＲＤＢＭＳ）のソフトウェアがインストールされた処理部である。例えば、実行部６ａは、自ノードがマスタノードである場合には、次のような処理を行う。すなわち、実行部６ａは、アプリケーションノード２からＳＱＬ文を受信すると、受信したＳＱＬ文を実行してＤＢ５ａを更新する。そして、実行部６ａは、世代番号を生成し、生成した世代番号と、実行したＳＱＬ文を示す情報とを含むログを生成する。続いて、実行部６ａは、生成したログをリカバリログとしてリカバリログファイル５ｂに登録する。そして、実行部６ａは、生成したログを差分ログとして、スレーブノードに送信する。これにより、マスタノードおよびスレーブノードの各ＤＢ５ａの登録内容が一致するようになる。このように、実行部６ａは、マスタノードおよびスレーブノードの各ＤＢ５ａの登録内容を一致させるミラーリングの機能を有する。なお、マスタノードとスレーブノードとの間で通信の遅延が発生するなどの理由により、スレーブノードでのデータベースの更新が遅くなり、全ノードの登録内容が一致しないような状況もあり得る。【００２５】
さらに、実行部６ａは、自ノードがマスタノードである場合には、次のような処理も行う。すなわち、実行部６ａは、自ノードに対する子ノードから、後述の完了通知を受信した場合には、全てのスレーブノードに対して、スレーブノードが保有していない世代番号の差分ログを送信する。【００２６】
また、実行部６ａは、自ノードがスレーブノードである場合には、次のような処理を行う。すなわち、実行部６ａは、マスタノードおよび他のスレーブノードから差分ログを受信した場合には、受信した差分ログを差分ログファイル５ｃに登録するとともに、受信した差分ログをリカバリログとしてリカバリログファイル５ｂに登録する。そして、実行部６ａは、リカバリログファイル５ｃを用いてＤＢ５ａを更新する。【００２７】
送信制御部６ｂは、異常が発生したノード以外の他のノードに、記憶部５に記憶されたログが生成された順番を示す情報を送信するように制御する。すなわち、送信制御部６ｂは、異常が発生したノード以外の他のノードに、記憶部５に記憶されたログが生成された順番を示す情報の送信を依頼する。具体例を挙げて説明する。例えば、送信制御部６ｂは、通信部４から、あるノードの異常を検出したことを示す情報を受信したときには、次のような処理を行う。すなわち、送信制御部６ｂは、リカバリログファイル５ｂに登録されたリカバリログの最新の世代番号を通信部４に送信して、異常が発生していない他のノード３に送信するように制御する。【００２８】
図４は、各ノードが実行する処理の一例を説明するための図である。図４の例は、ノード３ａがマスタノードである場合に、ノード３ａに異常が発生した場合の一例を示す。図４の例に示すように、通信部４から、ノード３ａの異常を検出したことを示す情報を受信したノード３ｂの送信制御部６ｂは、リカバリログの最新の世代番号「６」をノード３ｂ〜３ｆに送信するように通信部４を制御する。また、図４の例に示すように、通信部４から、ノード３ａの異常を検出したことを示す情報を受信したノード３ｃの送信制御部６ｂは、リカバリログの最新の世代番号「２」をノード３ｂ、３ｄ〜３ｆに送信するように通信部４を制御する。また、図４の例に示すように、通信部４から、ノード３ａの異常を検出したことを示す情報を受信したノード３ｄの送信制御部６ｂは、リカバリログの最新の世代番号「５」をノード３ａ、３ｂ、３ｅ、３ｆに送信するように通信部４を制御する。また、図４の例に示すように、通信部４から、ノード３ａの異常を検出したことを示す情報を受信したノード３ｅの送信制御部６ｂは、リカバリログの最新の世代番号「２」をノード３ｂ〜３ｄ、３ｆに送信するように通信部４を制御する。また、図４の例に示すように、通信部４から、ノード３ａの異常を検出したことを示す情報を受信したノード３ｆの送信制御部６ｂは、リカバリログの最新の世代番号「４」をノード３ｂ〜３ｅに送信するように通信部４を制御する。【００２９】
決定部６ｃは、自ノードのリカバリログの最新の世代番号、および、他ノードのリカバリログの最新の世代番号に基づいて、自ノードがマスタノードであるのか、または、スレーブノードであるのかを決定する。例えば、決定部６ｃは、異常が発生していない他の全てのノードから、リカバリログの最新の世代番号を受信したか否かを判定する。他の全てのノードからリカバリログの最新の世代番号を受信した場合には、決定部６ｃは、次のような処理を行う。すなわち、決定部６ｃは、自ノードのリカバリログの最新の世代番号と、他のノードから受信した世代番号とを比較し、自ノードのリカバリログの最新の世代番号が、他のノードから受信した世代番号よりも最新であるか否かを判定する。【００３０】
最新であると判定した場合には、決定部６ｃは、自ノードをマスタノードとして決定する。そして、決定部６ｃは、異常が発生していない他のノードをスレーブノードとして決定する。続いて、決定部６ｃは、自ノードがマスタノードであることを示す情報を通信部４へ送信して、かかる情報をスレーブノードおよびアプリケーションノード２へ送信するように通信部４を制御する。これにより、かかる情報を受信したアプリケーションノード２は、ＳＱＬ文の送信先を新たなマスタノードに切り替える。また、かかる情報を受信したスレーブノードは、マスタノードがどのノードであるかを把握することができる。【００３１】
一方、最新でないと判定した場合には、決定部６ｃは、自ノードをスレーブノードとして決定する。なお、決定部６ｃは、最新の世代番号が複数ある場合には、次のような処理を行うこともできる。例えば、決定部６ｃは、最新の世代番号のリカバリログを有する各ノードのＭｅｄｉａ  Ａｃｃｅｓｓ  Ｃｏｎｔｒｏｌ  ａｄｄｒｅｓｓ（ＭＡＣアドレス）を比較して、ＭＡＣアドレスが小さいノードをマスタノードとして決定することもできる。【００３２】
例えば、図４の例に示すように、ノード３ｂの決定部６ｃは、自ノードのリカバリログの世代番号「６」が最新であるため、自ノードをマスタノードとして決定する。また、ノード３ｂの決定部６ｃは、ノード３ｃ〜３ｆをスレーブノードとして決定する。そして、ノード３ｂの決定部６ｃは、ノード３ｂがマスタノードであることを示す情報をアプリケーションノード２およびスレーブノードに送信するように通信部４を制御する。これにより、図４の例に示すように、アプリケーションノード２は、ＳＱＬ文の送信先をノード３ｂに切り替える。また、図４の例に示すように、ノード３ｃ〜３ｆの各決定部６ｃは、自ノードをスレーブノードとして決定する。【００３３】
取得部６ｄは、自ノードがスレーブノードである場合に、通信部４により受信された他ノードのリカバリログの世代番号、および、自ノードに記憶されたリカバリログの最新の世代番号に基づいて、次のような処理を行う。すなわち、取得部６ｄは、自ノードに記憶されたリカバリログの最新の世代番号よりも新しい世代番号のログが記憶された他のノードが存在するか否かを判定する。存在する場合には、取得部６ｄは、新しい世代番号のログが記憶された他のノードから、自ノードのリカバリログの最新の世代番号よりも新しい世代番号のログを取得する。【００３４】
例えば、取得部６ｄは、まず、自ノードがスレーブノードである場合に、通信部４により他ノードの最新のリカバリログの世代番号が受信されたときには、次のような処理を行う。すなわち、取得部６ｄは、他ノードの最新のリカバリログの世代番号と、自ノードのリカバリログの最新の世代番号とを比較する。そして、取得部６ｄは、自ノードのリカバリログの最新の世代番号よりも新しい世代番号のリカバリログを最新の世代番号のリカバリログとして有する他のノードがあるか否かを判定する。新しい世代番号のリカバリログを最新の世代番号のリカバリログとして有する他のノードがある場合には、取得部６ｄは、次のような処理を行う。すなわち、取得部６ｄは、新しい世代番号のリカバリログを有する他のノードのうち、自ノードのリカバリログの最新の世代番号に最も近い世代番号のリカバリログを最新のリカバリログとして有する他のノードを自ノードに対する親ノードとして決定する。【００３５】
図５および図６は、各ノードが実行する処理の一例を説明するための図である。図５および図６の例は、先の図４の例において、ノード３ｂがマスタノードとして決定され、ノード３ｃ〜３ｆがスレーブノードとして決定された場合を示す。図５、図６の例に示すように、ノード３ｆの取得部６ｄは、自ノードのリカバリログの最新の世代番号「４」よりも新しい世代番号「５」のリカバリログを最新の世代番号のリカバリログとしてノード３ｄが有しているため、次のような処理を行う。すなわち、ノード３ｆの取得部６ｄは、新しい世代番号「５」のリカバリログを最新のリカバリログとして有するノード３ｄを自ノードに対する親ノードとして決定する。また、ノード３ｃの取得部６ｄは、自ノードのリカバリログの最新の世代番号「２」よりも新しい世代番号「５」、「４」のリカバリログを最新の世代番号のリカバリログとして有するノード３ｄ、３ｆがあるため、次のような処理を行う。すなわち、ノード３ｃの取得部６ｄは、ノード３ｄ、３ｆのうち、自ノードのリカバリログの最新の世代番号「２」に最も近い世代番号「４」のリカバリログを最新のリカバリログとして有するノード３ｆを自ノードに対する親ノードとして決定する。また、ノード３ｅの取得部６ｄは、自ノードのリカバリログの最新の世代番号「２」よりも新しい世代番号「５」、「４」のリカバリログを最新の世代番号のリカバリログとして有するノード３ｄ、３ｆがあるため、次のような処理を行う。すなわち、ノード３ｅの取得部６ｄは、ノード３ｄ、３ｆのうち、自ノードのリカバリログの最新の世代番号「２」に最も近い世代番号「４」のリカバリログを最新のリカバリログとして有するノード３ｆを自ノードに対する親ノードとして決定する。【００３６】
そして、取得部６ｄは、他ノードの最新のリカバリログの世代番号と、自ノードのリカバリログの最新の世代番号とを比較する。そして、取得部６ｄは、自ノードのリカバリログの最新の世代番号よりも古い世代番号のリカバリログを最新の世代番号のリカバリログとして有する他のノードがあるか否かを判定する。古い世代番号のリカバリログを最新の世代番号のリカバリログとして有する他のノードがある場合には、取得部６ｄは、次のような処理を行う。すなわち、取得部６ｄは、古い世代番号のリカバリログを有する他のノードのうち、自ノードのリカバリログの最新の世代番号に最も近い世代番号のリカバリログを最新のリカバリログとして有する他のノードを自ノードに対する子ノードとして決定する。【００３７】
例えば、図５および図６の例では、ノード３ｄのリカバリログの最新の世代番号「５」よりも古い世代番号「４」、「２」、「２」のリカバリログを最新の世代番号のリカバリログとしてノード３ｆ、３ｃ、３ｅが有する場合が示されている。この場合、ノード３ｄの取得部６ｄは、ノード３ｆ、３ｃ、３ｅのうち、自ノードのリカバリログの最新の世代番号「５」に最も近い世代番号「４」のリカバリログを最新のリカバリログとして有するノード３ｆを自ノードに対する子ノードとして決定する。また、ノード３ｆの取得部６ｄは、自ノードのリカバリログの最新の世代番号「４」よりも古い世代番号「２」のリカバリログを最新の世代番号のリカバリログとして有するノード３ｃ、３ｅがあるため、次のような処理を行う。すなわち、ノード３ｆの取得部６ｄは、自ノードのリカバリログの最新の世代番号「４」に最も近い世代番号「２」のリカバリログを最新のリカバリログとして有するノード３ｃ、３ｅを自ノードに対する子ノードとして決定する。【００３８】
子ノードおよび親ノードが決定された場合には、取得部６ｄは、決定された親ノードがマスタノードであるか否かを判定する。決定された親ノードがマスタノードでない場合には、取得部６ｄは、自ノードのリカバリログの最新の世代番号よりも新しい世代番号の差分ログを送信する旨の要求を通信部４に送信して、かかる要求を親ノードに送信するように通信部４を制御する。これにより、自ノードのリカバリログの最新の世代番号よりも１つ新しい世代番号から、スレーブノード内での最新の世代番号までのリカバリログが差分ログとして、親ノードから自ノードに送信される。【００３９】
例えば、図５および図６の例に示すように、ノード３ｆの取得部６ｄは、世代番号「４」よりも新しい世代番号の差分ログを送信する旨の要求を通信部４に送信して、かかる要求を親ノードであるノード３ｄに送信するように通信部４を制御する。これにより、ノード３ｆのリカバリログの最新の世代番号「４」よりも１つ新しい世代番号「５」のリカバリログが差分ログとして、親ノードであるノード３ｄからノード３ｆに送信される。【００４０】
自ノードのリカバリログの最新の世代番号よりも１つ新しい世代番号から、スレーブノード内での最新の世代番号までのリカバリログが差分ログとして、親ノードから送信された場合や、親ノードがマスタノードである場合には、取得部６ｄは次の処理を行う。すなわち、取得部６ｄは、自ノードに対する全ての子ノードから完了通知を受信したか否かを判定する。全ての子ノードから完了通知を受信した場合には、取得部６ｄは、完了通知を通信部４に送信して、親ノードに完了通知を送信するように通信部４を制御する。【００４１】
例えば、図５および図６の例が示す場合では、ノード３ｆの取得部６ｄは、子ノードであるノード３ｃ、３ｅから完了通知を受信した場合には、完了通知を通信部４に送信して、親ノードであるノード３ｄに完了通知を送信するように通信部４を制御する。また、ノード３ｄの取得部６ｄは、子ノードであるノード３ｆから完了通知を受信した場合には、完了通知を通信部４に送信して、親ノードであるノード３ｂに完了通知を送信するように通信部４を制御する。【００４２】
一方、古い世代番号のリカバリログを有する他のノードがあるか否かを判定した結果、古い世代番号のリカバリログを有する他のノードがない場合には、取得部６ｄは、次のような処理を行う。すなわち、取得部６ｄは、自ノードのリカバリログの最新の世代番号よりも新しい世代番号の差分ログを送信する旨の要求を通信部４に送信して、かかる要求を親ノードに送信するように通信部４を制御する。これにより、自ノードのリカバリログの最新の世代番号よりも１つ新しい世代番号から、スレーブノード内での最新の世代番号までのリカバリログが差分ログとして、親ノードから自ノードに送信される。【００４３】
例えば、図５および図６の例が示す場合では、ノード３ｃの取得部６ｄは、世代番号「２」よりも新しい世代番号の差分ログを送信する旨の要求を通信部４に送信して、かかる要求を親ノードであるノード３ｆに送信するように通信部４を制御する。これにより、ノード３ｃのリカバリログの最新の世代番号「２」よりも１つ新しい世代番号「３」から、スレーブノード内での最新の世代番号「５」までのリカバリログが差分ログとして、親ノードであるノード３ｆからノード３ｃに送信される。同様に、ノード３ｅの取得部６ｄは、世代番号「２」よりも新しい世代番号の差分ログを送信する旨の要求を通信部４に送信して、かかる要求を親ノードであるノード３ｆに送信するように通信部４を制御する。これにより、ノード３ｅのリカバリログの最新の世代番号「２」よりも１つ新しい世代番号「３」から、スレーブノード内での最新の世代番号「５」までのリカバリログが差分ログとして、親ノードであるノード３ｆからノード３ｅに送信される。【００４４】
そして、自ノードのリカバリログの最新の世代番号よりも１つ新しい世代番号から、スレーブノード内での最新の世代番号までのリカバリログが差分ログとして、親ノードから自ノードに送信された場合には、取得部６ｄは、次のような処理を行う。すなわち、取得部６ｄは、完了通知を通信部４に送信して、親ノードに完了通知を送信するように通信部４を制御する。【００４５】
例えば、図５および図６の例が示す場合では、ノード３ｃの取得部６ｄは、完了通知を通信部４に送信して、親ノードであるノード３ｆに完了通知を送信するように通信部４を制御する。同様に、ノード３ｅの取得部６ｄは、完了通知を通信部４に送信して、親ノードであるノード３ｆに完了通知を送信するように通信部４を制御する。【００４６】
ここで、上述したように、実行部６ａは、自ノードがマスタノードである場合には、自ノードに対する子ノードから、完了通知を受信した場合には、全てのスレーブノードに対して、スレーブノードが保有していない世代番号の差分ログを送信する。【００４７】
図７〜図９は、各ノードが実行する処理の一例を説明するための図である。図７の例は、先の図５および図６の例において、マスタノードとして決定されたノード３ｂにアプリケーションノード２からＳＱＬ文が送信されて、世代番号「７」のリカバリログが新たにリカバリログファイル５ｂに登録された場合を示す。また、図８および図９の例は、先の図５および図６の例において、スレーブノードであるノード６ｃ〜６ｆのそれぞれのリカバリログの最新の世代番号がスレーブノード内で最新の世代番号「５」となった場合を示す。【００４８】
図７〜図９の例が示すように、自ノードがマスタノードであるノード３ｂの実行部６ａは、自ノードに対する子ノードであるノード３ｄから完了通知を受信した場合には、次の処理を行う。すなわち、自ノードがマスタノードであるノード３ｂの実行部６ａは、全てのスレーブノード（ノード３ｃ〜３ｆ）に対して、スレーブノードが保有していない世代番号「６」および「７」のリカバリログを差分ログとして送信する。【００４９】
このように、本実施例のシステム１では、スレーブノードの親ノードと子ノードとの間で差分ログをやりとりした上で、マスタノードからスレーブノードへ差分ログを送信する。したがって、本実施例のシステム１によれば、負荷が１つのノードに集中することを抑制することができる。【００５０】
制御部６は、Ａｐｐｌｉｃａｔｉｏｎ  Ｓｐｅｃｉｆｉｃ  Ｉｎｔｅｇｒａｔｅｄ  Ｃｉｒｃｕｉｔ（ＡＳＩＣ）などの集積回路である。また、制御部６は、Ｆｉｅｌｄ  Ｐｒｏｇｒａｍｍａｂｌｅ  Ｇａｔｅ  Ａｒｒａｙ（ＦＰＧＡ）であってもよい。また、制御部６は、Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ（ＣＰＵ）などの電子回路であってもよい。さらに、制御部６は、Ｍｉｃｒｏ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ（ＭＰＵ）であってもよい。【００５１】
次に、本実施例に係るノード３が実行する処理の流れを説明する。図１０は、決定処理の手順を示すフローチャートである。この決定処理は、例えば、ノード３に電源が投入されている間、所定時間ごとに繰り返し実行される。【００５２】
図１０に示すように、送信制御部６ｂは、上述した通信部４から、ノードの異常を検出したことを示す情報を受信したか否かを判定する（Ｓ１０１）。ノードの異常を検出したことを示す情報を受信していない場合（Ｓ１０１否定）には、送信制御部６ｂは、再びＳ１０１の判定を行う。一方、ノードの異常を検出したことを示す情報を受信した場合（Ｓ１０１肯定）には、送信制御部６ｂは、次のような処理を行う。すなわち、送信制御部６ｂは、リカバリログファイル５ｂに登録されたリカバリログの最新の世代番号を通信部４に送信して、異常が発生していない他のノードに送信するように制御する（Ｓ１０２）。【００５３】
続いて、決定部６ｃは、異常が発生していない他の全てのノードから、リカバリログの最新の世代番号を受信したか否かを判定する（Ｓ１０３）。他の全てのノードからリカバリログの最新の世代番号を受信していない場合（Ｓ１０３否定）には、決定部６ｃは、再び、Ｓ１０３の判定を行う。一方、他の全てのノードからリカバリログの最新の世代番号を受信した場合（Ｓ１０３肯定）には、決定部６ｃは、次のような処理を行う。すなわち、決定部６ｃは、自ノードのリカバリログの最新の世代番号と、他のノードから受信した世代番号とを比較し、自ノードのリカバリログの最新の世代番号が、他のノードから受信した世代番号よりも最新であるか否かを判定する（Ｓ１０４）。【００５４】
最新である場合（Ｓ１０４肯定）には、決定部６ｃは、自ノードをマスタノードとして決定する（Ｓ１０５）。そして、決定部６ｃは、異常が発生していない他のノードをスレーブノードとして決定する（Ｓ１０６）。続いて、決定部６ｃは、自ノードがマスタノードであることを示す情報を通信部４へ送信して、かかる情報をスレーブノードおよびアプリケーションノード２へ送信するように通信部４を制御し（Ｓ１０７）、処理を終了する。【００５５】
一方、最新でない場合（Ｓ１０４否定）には、決定部６ｃは、自ノードをスレーブノードとして決定し（Ｓ１０８）、処理を終了する。【００５６】
図１１は、取得処理の手順を示すフローチャートである。この取得処理は、例えば、先の図１０に示す決定処理において、自ノードをスレーブノードとして決定したノードにより実行される。【００５７】
図１１に示すように、取得部６ｄは、他ノードの最新のリカバリログの世代番号と、自ノードのリカバリログの最新の世代番号とを比較する。そして、取得部６ｄは、自ノードのリカバリログの最新の世代番号よりも新しい世代番号のリカバリログを最新の世代番号のリカバリログとして有する他のノードがあるか否かを判定する（Ｓ２０１）。新しい世代番号のリカバリログを最新の世代番号のリカバリログとして有する他のノードがない場合（Ｓ２０１否定）には、処理を終了する。【００５８】
一方、新しい世代番号のリカバリログを最新の世代番号のリカバリログとして有する他のノードがある場合（Ｓ２０１肯定）には、取得部６ｄは、新しい世代番号のリカバリログを有する他のノードのうち、次のノードを自ノードに対する親ノードとして決定する。すなわち、取得部６ｄは、自ノードのリカバリログの最新の世代番号に最も近い世代番号のリカバリログを最新のリカバリログとして有する他のノードを自ノードに対する親ノードとして決定する（Ｓ２０２）。【００５９】
そして、取得部６ｄは、他ノードの最新のリカバリログの世代番号と、自ノードのリカバリログの最新の世代番号とを比較する。そして、取得部６ｄは、自ノードのリカバリログの最新の世代番号よりも古い世代番号のリカバリログを最新の世代番号のリカバリログとして有する他のノードがあるか否かを判定する（Ｓ２０３）。古い世代番号のリカバリログを最新の世代番号のリカバリログとして有する他のノードがある場合（Ｓ２０３肯定）には、取得部６ｄは、次のような処理を行う。すなわち、取得部６ｄは、古い世代番号のリカバリログを有する他のノードのうち、自ノードのリカバリログの最新の世代番号に最も近い世代番号のリカバリログを最新のリカバリログとして有するノードを自ノードに対する子ノードとして決定する（Ｓ２０４）。【００６０】
続いて、取得部６ｄは、Ｓ２０２で決定された親ノードがマスタノードであるか否かを判定する（Ｓ２０５）。決定された親ノードがマスタノードでない場合（Ｓ２０５否定）には、取得部６ｄは、次のような処理を行う。すなわち、取得部６ｄは、自ノードのリカバリログの最新の世代番号よりも新しい世代番号の差分ログを送信する旨の要求を通信部４に送信して、かかる要求を親ノードに送信するように通信部４を制御する（Ｓ２０６）。そして、取得部６ｄは、親ノードから送信された差分ログを受信したか否かを判定する（Ｓ２０７）。親ノードから送信された差分ログを受信していない場合（Ｓ２０７否定）には、取得部６ｄは、再び、Ｓ２０７の判定を行う。【００６１】
一方、親ノードから送信された差分ログを受信した場合（Ｓ２０７肯定）や、親ノードがマスタノードである場合（Ｓ２０５肯定）には、取得部６ｄは次の処理を行う。すなわち、取得部６ｄは、自ノードに対する全ての子ノードから完了通知を受信したか否かを判定する（Ｓ２０８）。全ての子ノードから完了通知を受信していない場合（Ｓ２０８否定）には、取得部６ｄは、再び、Ｓ２０８の判定を行う。【００６２】
一方、全ての子ノードから完了通知を受信した場合（Ｓ２０８肯定）には、取得部６ｄは、完了通知を通信部４に送信して、親ノードに完了通知を送信するように通信部４を制御し（Ｓ２０９）、処理を終了する。【００６３】
また、古い世代番号のリカバリログを有する他のノードがない場合（Ｓ２０３否定）には、取得部６ｄは、次のような処理を行う。すなわち、取得部６ｄは、自ノードのリカバリログの最新の世代番号よりも新しい世代番号の差分ログを送信する旨の要求を通信部４に送信して、かかる要求を親ノードに送信するように通信部４を制御する（Ｓ２１０）。【００６４】
そして、親ノードから送信された差分ログを受信したか否かを判定する（Ｓ２１１）。親ノードから送信された差分ログを受信していない場合（Ｓ２１１否定）には、取得部６ｄは、再び、Ｓ２１１の判定を行う。一方、親ノードから送信された差分ログを受信した場合（Ｓ２１１肯定）には、取得部６ｄは、次のような処理を行う。すなわち、取得部６ｄは、完了通知を通信部４に送信して、親ノードに完了通知を送信するように通信部４を制御し（Ｓ２１２）、処理を終了する。【００６５】
図１２は、送信処理の手順を示すフローチャートである。この送信処理は、例えば、先の図１０に示す決定処理において、自ノードをマスタノードとして決定したノードにより実行される。【００６６】
図１２に示すように、実行部６ａは、自ノードに対する子ノードから、完了通知を受信したか否かを判定する（Ｓ３０１）。完了通知を受信していない場合（Ｓ３０１否定）には、実行部６ａは、再び、Ｓ３０１の判定を行う。一方、完了通知を受信した場合（Ｓ３０１肯定）には、実行部６ａは、全てのスレーブノードに対して、スレーブノードが保有していない世代番号の差分ログを送信する（Ｓ３０２）。そして、実行部６ａは、ミラーリングを開始し（Ｓ３０３）、処理を終了する。【００６７】
上述してきたように、本実施例のシステム１では、スレーブノードの親ノードと子ノードとの間で差分ログをやりとりした上で、マスタノードからスレーブノードへ差分ログを送信する。したがって、本実施例のシステム１によれば、負荷が１つのノードに集中することを抑制することができる。【００６８】
さて、これまで開示のシステムに関する実施例について説明したが、本発明は上述した実施例以外にも、種々の異なる形態にて実施されてよいものである。そこで、以下では、本発明に含まれる他の実施例を説明する。【００６９】
例えば、異常が検出されたノードが修理されるなどして状態が正常に回復した場合には、上記の実施例で説明したスレーブノードが行う処理と同様の処理を行って、異常が検出されたノードをスレーブノードとしてシステムに組み込んでもよい。【００７０】
また、実施例において説明した各処理のうち、自動的に行われるものとして説明した処理の全部または一部を手動的に行うこともできる。また、本実施例において説明した各処理のうち、手動的に行われるものとして説明した処理の全部または一部を公知の方法で自動的に行うこともできる。【００７１】
また、各種の負荷や使用状況などに応じて、各実施例において説明した各処理の各ステップでの処理を任意に細かくわけたり、あるいはまとめたりすることができる。また、ステップを省略することもできる。【００７２】
また、各種の負荷や使用状況などに応じて、各実施例において説明した各処理の各ステップでの処理の順番を変更できる。【００７３】
また、図示した各装置の各構成要素は機能概念的なものであり、必ずしも物理的に図示の如く構成されていることを要しない。すなわち、各装置の分散・統合の具体的状態は図示のものに限られず、その全部または一部を、各種の負荷や使用状況などに応じて、任意の単位で機能的または物理的に分散・統合して構成することができる。【００７４】
［プログラム］
また、上記の実施例で説明したノード３の各種の処理は、あらかじめ用意されたプログラムをパーソナルコンピュータやワークステーションなどのコンピュータシステムで実行することによって実現することもできる。そこで、以下では、図１３を用いて、上記の実施例で説明したノード３と同様の機能を有するプログラムを実行するコンピュータの一例を説明する。図１３は、プログラムを実行するコンピュータを示す図である。【００７５】
図１３に示すように、コンピュータ３００は、ＣＰＵ３１０、ＲＯＭ３２０、Ｈａｒｄ  Ｄｉｓｋ  Ｄｒｉｖｅ（ＨＤＤ）３３０、ＲＡＭ３４０を有する。ＣＰＵ３１０、ＲＯＭ３２０、ＨＤＤ３３０、ＲＡＭ３４０は、バスを介して接続される。【００７６】
ＲＯＭ３２０には、ＯＳなどの基本プログラムが記憶されている。また、ＨＤＤ３３０には、上記の各実施例で示す実行部６ａ、送信制御部６ｂ、決定部６ｃ、取得部６ｄと同様の機能を発揮するプログラム３３０ａが予め記憶される。なお、プログラム３３０ａについては、適宜分離しても良い。また、ＨＤＤ３３０には、ＤＢ、リカバリログファイル、差分ログファイルが設けられる。これらＤＢ、リカバリログファイル、差分ログファイルは、上述したＤＢ５ａ、リカバリログファイル５ｂ、差分ログファイル５ｃに対応する。【００７７】
そして、ＣＰＵ３１０が、プログラム３３０ａをＨＤＤ３３０から読み出して実行する。【００７８】
そして、ＣＰＵ３１０は、ＤＢ、リカバリログファイル、差分ログファイルを読み出してＲＡＭ３４０に格納する。さらに、ＣＰＵ３１０は、ＲＡＭ３４０に格納されたＤＢ、リカバリログファイル、差分ログファイルを用いて、プログラム３３０ａを実行する。なお、ＲＡＭ３４０に格納される各データは、常に全てのデータがＲＡＭ３３０に格納されなくともよい。処理に用いられるデータがＲＡＭ３４０に格納されれば良い。【００７９】
なお、上記したプログラム３３０ａについては、必ずしも最初からＨＤＤ３３０に記憶させておく必要はない。【００８０】
例えば、コンピュータ３００に挿入されるフレキシブルディスク（ＦＤ）、ＣＤ−ＲＯＭ、ＤＶＤディスク、光磁気ディスク、ＩＣカードなどの「可搬用の物理媒体」にプログラムを記憶させておく。そして、コンピュータ３００がこれらからプログラムを読み出して実行するようにしてもよい。  【００８１】
さらには、公衆回線、インターネット、ＬＡＮ、ＷＡＮなどを介してコンピュータ３００に接続される「他のコンピュータ（またはサーバ）」などにプログラムを記憶させておく。そして、コンピュータ３００がこれらからプログラムを読み出して実行するようにしてもよい。
【符号の説明】
【００８２】
１        システム
２        アプリケーションノード
３        ノード
５        記憶部
５ａ      ＤＢ
５ｂ      リカバリログファイル
５ｃ      差分ログファイル
６        制御部
６ａ      実行部
６ｂ      送信制御部
６ｃ      決定部
６ｄ      取得部
【図１】
2014006713.tif 000003
【図２】
2014006713.tif 000004
【図３Ａ】
2014006713.tif 000005
【図３Ｂ】
2014006713.tif 000006
【図４】
2014006713.tif 000007
【図５】
2014006713.tif 000008
【図６】
2014006713.tif 000009
【図７】
2014006713.tif 000010
【図８】
2014006713.tif 000011
【図９】
2014006713.tif 000012
【図１０】
2014006713.tif 000013
【図１１】
2014006713.tif 000014
【図１２】
2014006713.tif 000015
【図１３】
2014006713.tif 000016
【図１４】
2014006713.tif 000017
【図１５】
2014006713.tif 000018
【国際調査報告】
2014006713.tif 000019
2014006713.tif 000020
2014006713.tif 000021