以下に添付図面を参照して、この発明に係る差分更新装置、差分更新システム、差分更新方法、差分更新プログラム及び差分更新サーバの実施形態を図面に基づいて説明する。なお、以下では、キャッシュデータ(以下、キャッシュと略記)の書き換え前後の差分を更新する差分更新処理を死活監視サービスの一部分として提供する死活監視システムについて説明するが、この実施形態により本発明が限定されるものではない。
[第1の実施形態]
以下、第1の実施形態では、第1の実施形態に係る死活監視システムの概要、死活監視システムの構成、処理の流れを順に説明し、最後に第1の実施形態による効果を説明する。
[死活監視システムの概要]
図1を用いて、第1の実施形態に係る死活監視システムの概要を説明する。図1は、第1の実施形態に係る死活監視システムの概要を説明するための図である。
第1の実施形態に係る死活監視システム1は、死活監視装置10と、該死活監視装置10に接続される複数のクライアント20A,20Bとを有する。死活監視装置10は、複数のサーバを有し、複数のサーバのうち、一つのサーバの役割をマスタ10Aとし、その他のサーバの役割をレプリカ10B〜10Eとする。なお、死活監視システム1の構成は図1の例に限定されるものではなく、例えば、死活監視システム1は、任意数のサーバと、任意数のクライアントを有して良い。また、クライアント20A,20Bの各装置を区別無く総称する場合に、クライアント20と記載する。
第1の実施形態において、死活監視システム1は、欠送防止処理を実現するとともに、マスタ10Aに記憶されたデータについてのディレクトリ情報が更新されると、該ディレクトリ情報のキャッシュデータであるディレクトリキャッシュを記憶するクライアント20において、ディレクトリキャッシュの差分更新処理を行う。
ここで、イベント情報の欠送が発生することを防止する構成は、死活監視装置10によって実現される。すなわち、死活監視装置10は、サーバ故障ならびにネットワーク分断に耐えることができるシステム上でイベント情報を冗長化する。具体的には、死活監視装置10は、マスタ10Aが管理するイベント情報をレプリケーションにより冗長化することで、レプリカ10B〜10Eでもマスタ10Aが管理するイベント情報を記憶させる。例えば、死活監視装置10は、既存のPaxosアルゴリズムやQuorumプロトコルによるレプリケーション技術によって、サーバ故障やネットワーク分断に耐えられる冗長化を行っている。
死活監視装置10では、イベントが発生すると、マスタ10Aが複数のクライアント20A,20Bに対してイベント情報を配送する。ここで、マスタ10Aに故障が発生した場合には、マスタをマスタ10Aからレプリカ10Bに切替えて、新しいマスタであるレプリカ10Bが複数のクライアント20A,20Bと再接続し、送信を完了していないイベント情報を複数のクライアント20A,20Bに対して送信する。
これにより、クライアント20側での欠送イベント情報の補完が不要となるため、システム構成を複雑にすることがなくなり、また、マスタ故障時に新マスタからイベント情報を配送可能なため、イベント情報の欠送防止処理が実現される。
このような構成のもと、各クライアント20は、マスタ10Aに記憶されたデータについてのディレクトリ情報が更新されると、該ディレクトリ情報の差分更新処理を行う旨の差分更新通知をマスタ10Aから受信し、受信した差分更新通知を用いてディレクトリキャッシュを更新する。
図1には、クライアント20Bによって記憶されるディレクトリキャッシュが更新される場合を例示する。図1の例では、マスタ10A及びレプリカ10B〜10Eは、ディレクトリ名「ディレクトリA」のディレクトリ(以下、ディレクトリAと略記)の配下にファイル名「File1〜3」のファイルを記憶している。また、クライアント20Bは、ディレクトリA配下のファイル名のリストをディレクトリキャッシュとして既に取得し(ディレクトリ監視)、記憶している。すなわち、クライアント20Bは、死活監視装置10のディレクトリAを監視する。
ここで、例えば、マスタ10Aは、クライアント20AによってディレクトリA配下にファイル名「File4」のファイルが新規に追加されると、追加されたファイル名「File4」をリストに追加する旨の追加通知(差分更新通知)をクライアント20Bへ送信する。そして、クライアント20Bは、受信した追加通知を用いて、リストにファイル名「File4」を追加、すなわち、更新前後の差分に相当する情報を更新する(差分更新)。
また、例えば、マスタ10Aに故障が発生し、追加通知がクライアント20へ送信されなかった場合には、未送信の追加通知は欠送防止処理によってクライアント20Bへ送信される。具体的には、マスタがマスタ10Aからレプリカ10Bに切替わり、新しいマスタであるレプリカ10Bが、未送信の追加通知をイベント情報としてクライアント20Bに対して送信することにより、差分更新が行われる。
これにより、マスタ10Aに故障が発生した場合にも、ディレクトリキャッシュの差分更新処理が実現されるので、ディレクトリキャッシュの更新に要する通信負荷を軽減することが可能となる。
なお、図1の例では、ファイルの追加に伴ってディレクトリキャッシュが更新される場合を説明したが、実施形態はこれに限定されるものではなく、例えば、ディレクトリ情報の更新に伴ってディレクトリキャッシュは更新される。具体的には、ファイルの追加や削除、或いはディレクトリの追加や削除によってディレクトリ情報が更新されることにより、該ディレクトリ情報のキャッシュは更新される。
また、図1の例では、ファイル名がディレクトリキャッシュとしてクライアント20に記憶され、更新される場合を説明したが、実施形態はこれに限定されるものではない。例えば、クライアント20は、マスタ10Aのディレクトリ配下に属するファイル及びディレクトリの名称、属性、更新日時、サイズ、物理的な格納場所を示す情報等のディレクトリ情報(ディレクトリエントリ)をディレクトリキャッシュとして記憶する。また、以下において、ファイル及びディレクトリを総称する場合に、「ノード」と記載する。
[死活監視システムの構成]
図2を用いて、図1に示した死活監視システム1の構成を説明する。図2は、第1の実施形態に係る死活監視システムの構成を示すブロック図である。図2に示すように、この死活監視システム1は、死活監視装置10及びクライアント20を備え、死活監視装置10のマスタ10Aとクライアント20とが接続されている。以下にこれらの各装置の構成を説明する。
死活監視装置10は、複数のサーバのうちの一つのサーバであるマスタ10Aと、その他のサーバであるレプリカ10B〜10Eを有する。また、マスタ10A及びレプリカ10B〜10Eは、それぞれが独立したデータベース30A〜30Eを保持している。
データベース30A〜30Eは、例えば、クライアント20上で動作するアプリケーションによって利用される各種情報を記憶する。具体的には、データベース30A〜30Eは、所定のディレクトリ配下にアプリケーションによって利用される各種ファイルを記憶する。
また、例えば、データベース30A〜30Eは、死活監視装置10上で発生したイベントに関する情報であるイベント情報を記憶する。また、各データベース30A〜30Eが記憶するイベント情報については、それぞれ同期しているため、同じ内容のイベント情報が記憶されているものとする。
マスタ10A及びレプリカ10B〜10Eは、更新部11、生成部12、イベント送信部13、同期部14、接続部15、送信未完了イベント送信部16及び記憶部17を有する。なお、各サーバ(マスタ10A及びレプリカ10B〜10E)は、マスタとレプリカで役割が異なるが、構成については同様である。以下にこれらの各部の処理を説明する。また、以下の説明では、マスタ10Aがマスタの役割であり、マスタ10Aに故障が発生した後にレプリカ10Bが新たなマスタとなる場合を例にして説明する。
記憶部17は、各種処理に必要なデータ及びプログラムを格納する。例えば、マスタ10Aの記憶部17は、セッションを管理するための情報であるセッション情報一覧と、ノードを管理するための情報であるノード情報一覧と、イベント情報を管理するための情報であるイベント一覧とを記憶する。なお、ノード情報一覧及びイベント一覧は、マスタ10A及びレプリカ10B〜10Eがそれぞれ保持するデータベース30A〜30Eにおいても記憶される情報である。また、上記したデータベース30A〜30Eは、セッションの一覧であるセッション一覧を記憶する。以下では、セッション情報一覧、ノード情報一覧、イベント一覧及びセッション一覧について、図3〜図6を用いてそれぞれ具体的に説明する。
例えば、マスタ10Aの記憶部17は、図3に例示するように、セッション情報一覧として、セッションを一意に識別する「セッションID」と、各クライアント20に関する情報である「クライアント情報」と、各クライアント20が現在アクセスしているノードのノードIDを示す「アクセス中のノードID」と、クライアント20に送信するイベント情報のイベントIDである「送信するイベントのエントリ」とを対応付けて記憶する。図3の例を挙げて説明すると、記憶部17は、例えば、セッションID「1」と、クライアント情報としてIPアドレス「10.0.0.1」と、アクセス中のノードID「Nid=1」と、送信するイベントのエントリ「Eid=1,2,5」とを対応付けて記憶する。つまり、記憶部17は、セッションID「1」のセッションで接続されるIPアドレス「10.0.0.1」のクライアント20が、ノードID「Nid=1」のディレクトリキャッシュを保持しており、イベントID「Eid=1,2,5」のイベント情報をクライアント20に送信することを記憶する。
また、例えば、マスタ10Aの記憶部17は、図4に例示するように、ノード情報一覧として、ノードを一意に識別する「ノードID」と、ノードが属する親のノード(ディレクトリ)のノードIDを示す「親ノードID」と、ノードの種別を示す「ノード種別」と、ノードに現在アクセスしているセッションのセッションIDを示す「アクセス中のセッションID」とを対応付けて記憶する。図4の例を挙げて説明すると、記憶部17は、例えば、ノードID「1」と、親ノードID「Pid=0」と、ノード種別「ディレクトリ」と、アクセス中のセッションID「Sid=1,3」とを対応付けて記憶する。なお、親ノードIDには、図4に示した例に限らず、ルートを示す情報が記憶されても良い。
また、例えば、マスタ10Aの記憶部17は、図5に例示するように、イベント一覧として、イベントを一意に識別する「イベントID」と、イベントの発生元となるノードを示す「イベント発生元のノードID」と、イベントの種別を示す「イベント種別」と、イベントの発生元となるセッションのセッションIDを示す「イベント発生元のセッションID」とを対応付けて記憶する。図5の例を挙げて説明すると、記憶部17は、例えば、イベントID「1」と、イベント発生元のノードID「Nid=2」と、イベント種別「ファイル追加」と、イベント発生元のセッションID「Sid=2」とを対応付けて記憶する。つまり、記憶部17は、セッションID「Sid=2」のセッションで接続されるクライアント20からの要求によってノードID「Nid=2」のファイルが追加されたことを、イベントID「1」のイベントとして記憶する。なお、図5の例では、ノードの追加又は削除がイベントとして登録される場合を例示したが、これに限定されるものではなく、例えば、ファイルの内容の更新や、ノードに対するアクセスの無効など、ノードに対して発生した各種イベントが登録されても良い。
また、データベース30A〜30Eは、図6に例示するように、セッション一覧として、セッションを一意に識別する「セッションID」と、各クライアント20に関する情報である「クライアント情報」と、各クライアント20が現在アクセスしているノードのノードIDを示す「アクセス中のノードID」とを対応付けて記憶する。図6の例を挙げて説明すると、データベース30A〜30Eは、例えば、セッションID「1」と、クライアント情報としてIPアドレス「10.0.0.1」と、アクセス中のノードID「Nid=1」とを対応付けて記憶する。
ここで、レプリカ10B〜10Eのデータベース30B〜30Eが記憶するノード情報一覧、イベント一覧及びセッション一覧は、マスタ10Aのデータベース30Aが記憶するノード情報一覧、イベント一覧及びセッション一覧の複製である。また、上記したように、レプリカ10B〜10Eのデータベース30B〜30Eは、セッション情報一覧を記憶していない。このため、レプリカ10B〜10Eのいずれかがマスタに切り替わった場合には、データベース30B〜30Eに記憶されたイベント一覧及びセッション一覧からセッション情報一覧を構築して、該セッション情報一覧を記憶部17にセットする。
更新部11は、死活監視装置10によって管理される各種情報を更新する。具体的には、更新部11は、データベース30に記憶された各種情報を更新する旨の要求をクライアント20から受信する。そして、更新部11は、受信した要求に応じてデータベース30に記憶された各種情報を更新する。より具体的には、更新部11は、ノードの追加又は削除を行う旨の要求であるノードの追加・削除要求を、要求元のアプリケーションが動作するクライアント20から受信する。
一例としては、マスタ10Aの更新部11は、セッションID「2」のセッションで接続されるクライアントからノードID「2」のファイルを追加する旨の追加要求を受信した場合には、ノードID「2」のファイルをデータベース30Aに新規に追加する。また、他の例としては、マスタ10Aの更新部11は、セッションID「3」のセッションで接続されるクライアントからノードID「6」のファイルを削除する旨の削除要求を受信した場合には、ノードID「6」のファイルをデータベース30Aから削除する。
生成部12は、更新部11によって更新された情報について、更新後の情報と、更新前の情報との差分を更新するための差分更新通知を生成する。具体的には、マスタ10Aの生成部12は、データベース30に記憶された各種情報が更新されると、差分更新通知を生成する。そして、生成部12は、生成した差分更新通知をイベント情報としてイベント一覧に登録する。なお、ここで生成部12によって登録されるイベントIDは、例えば、イベント一覧に登録される順にイベントIDを1増加させて採番したイベントIDが生成部12によって選択され、登録される。
イベント送信部13は、自サーバがマスタ10Aである場合に、自サーバが保持している記憶部17がイベント一覧として記憶するイベント情報をクライアント20に対して送信する。具体的には、イベント送信部13は、定期的にクライアント20に対して送信する死活監視情報にイベント情報を付加することで、イベント情報をクライアント20に対して送信する。ここで、死活監視装置10とクライアント20との間で行う死活監視とは、死活監視装置10及びクライアント20の両計算機間の接続が保てていることの確認をするためのものである。また、イベント送信部13は、イベント情報として、イベントを一意に識別する「イベントID」とイベントの種類を示す「イベントの種類」とを死活監視情報に付加してクライアント20に送信する。
また、例えば、イベント送信部13は、差分更新通知をイベント情報として送信する場合には、差分更新通知の通知先となる通知先クライアントの一覧を取得し、取得した通知先クライアントに対して差分更新通知を送信する。
なお、イベント送信部13は、クライアント20へ送信するイベント情報の順序を保つために、通信順序を保証する通信路を用いて、クライアント20にイベント情報を送信する。例えば、イベント送信部13は、TCP(Transmission Control Protocol)やUDP(User Datagram Protocol)を用いた通信路でイベント情報をクライアント20に送信する。ただし、UDPを用いた通信路を適用する場合には、UDP通信に通信順序を保証する機能を追加する必要がある。
同期部14は、自サーバがマスタ10Aである場合に、マスタ10Aが保持するデータベース30Aが記憶するイベント情報をレプリカ10B〜10Eに通知してデータベース30B〜30Eに記憶させる。具体的には、同期部14は、イベントが発生して自サーバが保持するデータベースにイベント情報を登録するたびに、該イベント情報をレプリカ10B〜10Eに通知してデータベース30B〜30Eに記憶させる。
また、同期部14は、クライアント20に対してイベント情報の送信を完了したか否かを示す情報を、レプリカ10B〜10Eに通知してレプリカ10B〜10Eのデータベース30B〜30Eにそれぞれ記憶させる。ここで、同期部14は、イベント情報の送信を完了したか否かを示す情報として、クライアント20に送信した最新のイベント情報のイベントIDである「最新送信完了イベントID」をレプリカ10B〜10Eに通知してレプリカ10B〜10Eのデータベース30B〜30Eにそれぞれ記憶させる。
接続部15は、マスタ10Aに故障が発生した場合には、レプリカ10B〜10Eのなかから選択された新しいマスタであるレプリカ10Bとクライアント20とを通信可能に接続する。具体的には、接続部15は、クライアント20のクライアントライブラリ21が送信したマスタの問い合わせを受け付け、かつ、自サーバが新しいマスタであるレプリカ10Bである場合には、クライアント20と通信可能に接続する。なお、新しいマスタの選択については、例えば、既存のPaxosによるマスタの選定機能を利用して行う。
送信未完了イベント送信部16は、新しいマスタであるレプリカ10Bが保持するデータベース20Bが記憶するイベント情報のうちクライアント20に対して送信未完了であるイベント情報を、最新送信完了イベントIDを用いて特定し、該送信未完了であるイベント情報をクライアント20に送信する。具体的には、送信未完了イベント送信部16は、最新送信完了イベントIDのイベント情報より新しいイベントIDのイベント情報を送信未完了であるイベント情報として特定し、該イベント情報をクライアント20に送信する。
また、クライアント20は、クライアントライブラリ21とアプリケーション22とを有する。また、クライアントライブラリ21は、セッション管理部21aと、キャッシュ更新部21bと、キャッシュ記憶部21cとを有しており、死活監視のため、定期的にマスタ10Aと通信を行う。
セッション管理部21aは、マスタ10Aから受信した死活監視情報にイベント情報が付加されている場合には、マスタ10Aが送信した最新のイベント情報のイベントIDである最新送信完了イベントIDを用いて、該イベント情報を二重に受信していないか確認する冗送確認処理を行う。なお、上記した最新送信完了イベントIDと死活監視装置10が記憶する最新受信完了イベントIDとは、同種の情報であり、クライアント視点では、「最新受信完了イベントID」とし、死活監視装置視点では、「最新送信完了イベントID」としている。具体的には、セッション管理部21aは、最新受信完了イベントIDを保持し、受信したイベント情報のイベントIDが最新受信完了イベントIDよりも新しいイベント情報であれば、イベント情報をアプリケーション22に通知する。
また、セッション管理部21aは、マスタ10Aが故障してフェイルオーバが起こると、接続先を新たなマスタであるレプリカ10Bに変更する。ここで、フェイルオーバ中にクライアント20が故障等により再接続を行わなかった場合について、図7を用いて説明する。図7は、死活監視システムによる新マスタへの切替処理を説明する図である。図7に例示するように、マスタ10Aに故障が発生してフェイルオーバでマスタが交代し、レプリカ10Bが新マスタとなる(図7の(1)参照)。ここで、フェイルオーバ中にクライアント20Bは、故障したため新マスタであるレプリカ10Bと再接続を行わなかったものとし(図7の(2)参照)、クライアント20Aは、新マスタであるレプリカ10Bと再接続を行ったものとする(図7の(3)参照)。
この場合には、新マスタであるレプリカ10Bは、一定期間再接続のなかったセッション(この例では、故障したクライアント20Bとのセッション)に関する情報を新マスタであるレプリカ10Bの記憶部17及びデータベース30Bから削除する。つまり、セッションが切断した場合には、そのクライアントへのイベント情報の送信が不要になるため、セッションに関する情報を記憶部17及びデータベース30Bから削除する(図7の(4)参照)。
また、セッション管理部21aは、受信した死活監視情報に差分更新通知がイベント情報として付加されている場合には、該差分更新通知をキャッシュ更新部21bへ通知する。例えば、セッション管理部21aは、受信した死活監視情報にイベントID「1」の差分更新通知が付加されていれば、差分更新通知をキャッシュ更新部21bへ通知する。
キャッシュ更新部21bは、マスタ10Aから通知された差分更新通知を用いて、ディレクトリキャッシュを差分更新する。一例としては、キャッシュ更新部21bは、イベントID「1」の差分更新通知をセッション管理部21aから受け付ける。ここで、イベントID「1」の差分更新通知は、ノードID「2」のファイルが追加された旨の差分更新通知である。この結果、キャッシュ更新部21bは、キャッシュ記憶部21cに記憶されたディレクトリキャッシュにノードID「2」のファイル名を追加する。他の例としては、キャッシュ更新部21bは、イベントID「4」の差分更新通知をセッション管理部21aから受け付ける。ここで、イベントID「4」の差分更新通知は、ノードID「6」のファイルが削除された旨の差分更新通知である。この結果、キャッシュ更新部21bは、キャッシュ記憶部21cに記憶されたディレクトリキャッシュからノードID「6」のファイル名を削除する。
キャッシュ記憶部21cは、マスタ10Aによって管理される各種情報のキャッシュを記憶する。具体的には、キャッシュ記憶部21cは、アプリケーション22によって利用されるためにマスタ10Aから取得された各種情報のディレクトリキャッシュを記憶する。
[死活監視システムによる欠送防止処理]
図8〜図12を用いて、第1の実施形態に係る死活監視システム1によるイベント情報の欠送防止処理の流れを説明する。なお、本実施形態では、ノードの更新によって発生した差分更新通知がイベント情報として各クライアント20に通知される場合に、差分更新通知の欠送を防止するために行われる欠送防止処理について説明するが、実施形態はこれに限定されるものではない。例えば、イベント情報の欠送防止処理は、各クライアント20上で動作するアプリケーション22からの要求によって発生した各種イベントが、各クライアント20に通知される場合にも実行され得る。
図8〜図12は、第1の実施形態に係る死活監視システム1による欠送防止処理の流れを示すシーケンス図である。図8には、死活監視システムがイベント情報の欠送を防止するために行う正常時のイベント配送処理の流れを示す。図9〜図12には、死活監視システムによるフェイルオーバ時のイベント配送処理の流れを示す。また、図9〜図12は、それぞれフェイルオーバの発生時が異なる。具体的には、図9の例では、イベント発生前にフェイルオーバが発生した場合を示しており、図10の例では、イベント情報送信前にフェイルオーバが発生した場合を示しており、図11の例では、応答受信前にフェイルオーバが発生した場合を示しており、図12の例では、応答受信後にフェイルオーバが発生した場合を示している。
まず、図8を用いて、死活監視システムがイベント情報の欠送を防止するために行う正常時のイベント配送処理の流れを説明する。図8に示すように、マスタ10Aは、イベントが発生すると(ステップS101)、イベント情報を記憶部17及びデータベース30Aに登録し(ステップS102)、イベント情報の複製をレプリカ10B、10Cに通知する(ステップS103)。レプリカ10B、10Cは、イベント情報の複製を受信すると、データベース30B、30Cにイベント情報の複製を登録し、登録を行った旨の応答をマスタ10Aに送信する(ステップS104)。
そして、マスタ10Aは、定期的に通信している死活監視情報にイベント情報を付加して、クライアント20のクライアントライブラリ21にイベント情報を送信する(ステップS105)。クライアントライブラリ21は、イベント情報の受信を完了すると、最新送信完了イベントIDを用いて、イベント情報を二重に受信していないか確認する冗送確認処理を行う(ステップS106)。そして、クライアントライブラリ21は、二重に受信していないイベント情報である場合には、イベント情報をアプリケーション22に通知する(ステップS107)。
そして、クライアントライブラリ21は、最新受信完了イベントIDを含むイベント受信完了応答をマスタ10Aに送信する(ステップS108)。続いて、マスタ10Aは、イベント受信完了応答を受信すると、イベント情報の送信が完了した旨の登録と最新受信完了イベントIDの更新とを行う(ステップS109)。その後、マスタ10Aは、最新受信完了イベントIDの複製をレプリカ10B、10Cに通知する(ステップS110)。レプリカ10B、10Cは、最新受信完了イベントIDの複製を受信すると、データベース30B、30Cに最新受信完了イベントIDを登録し、登録を行った旨の応答をマスタ10Aに送信する(ステップS111)。そして、マスタ10Aは、レプリカ10B、10Cからの応答を受信し、イベント情報を受信すべき全クライアント20から応答が揃った場合に、送信を完了したイベント情報を削除する(ステップS112)。その後、マスタ10Aは、自身のデータベース30Aからイベント情報を削除した場合には、レプリカ10B、10Cに対してイベント情報の削除を複製させる(ステップS113)。そして、レプリカ10B、10Cは、イベント情報の削除を複製してデータベース30B、30Cからイベント情報を削除すると、削除を行った旨の応答をマスタ10Aに送信する(ステップS114)。
続いて、図9を用いて、第1の実施形態に係る死活監視システムによるフェイルオーバ時のイベント配送処理の流れを説明する。図9に示すように、マスタ10Aは、イベントが発生すると(ステップS201)、イベント情報を記憶部17及びデータベース30Aに登録し(ステップS202)、該イベント情報の複製をレプリカ10B、10Cに通知する(ステップS203)。
そして、マスタ10Aに故障が発生し(ステップS204)、フェイルオーバによりレプリカ10Bを新マスタに切り替える。ここで、マスタ10Aが故障しているため、通信ができず、レプリカ10Cからの応答が失敗する(ステップS205)。また、クライアントライブラリ21は、マスタ10Aとの定期通信が途絶えたことからマスタ10Aとの接続切断を検出すると、レプリカのどれかにマスタの問い合わせを行い(ステップS206)、新マスタであるレプリカ10Bから新しいマスタである旨の返信を受信する(ステップS208)。そして、クライアントライブラリ21は、新マスタであるレプリカ10Bとの再接続を要求し(ステップS209)、新マスタであるレプリカ10Bとのセッションを確立してマスタと再接続する(ステップS210)。また、新マスタであるレプリカ10Bは、クライアントライブラリ21との再接続処理と並行して、データベース30Bからイベント情報を読み出し、イベント情報を復元する処理を行う(ステップS207)。
そして、新マスタであるレプリカ10Bは、イベント情報のうちクライアント20に対して送信未完了であるイベント情報を、最新受信完了イベントIDを用いて特定し、該送信未完了であるイベント情報をクライアント20に送信する(ステップS211)。クライアントライブラリ21は、イベント情報の受信を完了すると、最新送信完了イベントIDを用いて、イベント情報を二重に受信していないか確認する冗送確認処理を行う(ステップS212)。そして、クライアントライブラリ21は、二重に受信していないイベント情報である場合には、イベント情報をアプリケーション22に通知する(ステップS213)。
そして、クライアントライブラリ21は、最新受信完了イベントIDを含むイベント受信完了応答を新マスタであるレプリカ10Bに送信する(ステップS214)。続いて、新マスタであるレプリカ10Bは、イベント受信完了応答を受信すると、イベント情報の送信が完了した旨の登録と最新受信完了イベントIDの更新とを行う(ステップS215)。その後、新マスタであるレプリカ10Bは、最新受信完了イベントIDの複製をレプリカ10Cに通知する(ステップS216)。レプリカ10Cは、最新受信完了イベントIDの複製を受信すると、データベース30Cに最新受信完了イベントIDを登録し、登録を行った旨の応答を新マスタであるレプリカ10Bに送信する(ステップS217)。そして、新マスタであるレプリカ10Bは、レプリカ10Cからの応答を受信し、イベント情報を受信すべき全クライアント20から応答が揃った場合に、送信を完了したイベント情報を削除する(ステップS218)。その後、新マスタであるレプリカ10Bは、自身のデータベース30Bからイベント情報を削除した場合には、レプリカ10Cに対してイベント情報の削除を複製させる(ステップS219)。そして、レプリカ10Cは、イベント情報の削除を複製してデータベース30Cからイベント情報を削除すると、削除を行った旨の応答を新マスタであるレプリカ10Bに送信する(ステップS220)。
次に、図10を用いて、第1の実施形態に係る死活監視システムによるフェイルオーバ時のイベント配送処理の流れを説明する。図10に示すように、マスタ10Aは、イベントが発生すると(ステップS301)、イベント情報を記憶部17及びデータベース30Aに登録し(ステップS302)、該イベント情報の複製をレプリカ10B、10Cに通知する(ステップS303)。レプリカ10B、10Cは、イベント情報の複製を受信すると、データベース30B、30Cにイベント情報の複製を登録し、登録を行った旨の応答をマスタ10Aに送信する(ステップS304)。
そして、マスタ10Aに故障が発生し(ステップS305)、イベント情報の送信が失敗すると(ステップS306)、フェイルオーバによりレプリカ10Bを新マスタであるレプリカ10Bに切り替える。続いて、新マスタであるレプリカ10Bは、データベース30Bからイベント情報を読み出し、イベント情報を復元する処理を行う(ステップS307)。ここで、クライアントライブラリ21は、マスタ10Aとの定期通信が途絶えたことからマスタ10Aとの接続切断を検出すると、レプリカのどれかにマスタの問い合わせを行い(ステップS308)、新マスタであるレプリカ10Bから新しいマスタである旨の返信を受信する(ステップS309)。そして、クライアントライブラリ21は、新マスタであるレプリカ10Bとの再接続を要求し(ステップS310)、新マスタであるレプリカ10Bとのセッションを確立してマスタと再接続する(ステップS311)。
そして、新マスタであるレプリカ10Bは、イベント情報のうちクライアント20に対して送信未完了であるイベント情報を、最新受信完了イベントIDを用いて特定し、該送信未完了であるイベント情報をクライアント20に送信する(ステップS312)。クライアントライブラリ21は、イベント情報の受信を完了すると、最新送信完了イベントIDを用いて、イベント情報を二重に受信していないか確認する冗送確認処理を行う(ステップS313)。そして、クライアントライブラリ21は、二重に受信していないイベント情報である場合には、イベント情報をアプリケーション22に通知する(ステップS314)。
そして、クライアントライブラリ21は、最新受信完了イベントIDを含むイベント受信完了応答を新マスタであるレプリカ10Bに送信する(ステップS315)。続いて、新マスタであるレプリカ10Bは、イベント受信完了応答を受信すると、イベント情報の送信が完了した旨の登録と最新受信完了イベントIDの更新とを行う(ステップS316)。その後、新マスタであるレプリカ10Bは、最新受信完了イベントIDの複製をレプリカ10Cに通知する(ステップS317)。レプリカ10Cは、最新受信完了イベントIDの複製を受信すると、データベース30Cに最新受信完了イベントIDを登録し、登録を行った旨の応答を新マスタであるレプリカ10Bに送信する(ステップS318)。そして、新マスタであるレプリカ10Bは、レプリカ10Cからの応答を受信し、イベント情報を受信すべき全クライアント20から応答が揃った場合に、送信を完了したイベント情報を削除する(ステップS319)。その後、新マスタであるレプリカ10Bは、自身のデータベース30Bからイベント情報を削除した場合には、レプリカ10Cに対してイベント情報の削除を複製させる(ステップS320)。そして、レプリカ10Cは、イベント情報の削除を複製してデータベース30Cからイベント情報を削除すると、削除を行った旨の応答を新マスタであるレプリカ10Bに送信する(ステップS321)。
次に、図11を用いて、第1の実施形態に係る死活監視システムによるフェイルオーバ時のイベント配送処理の流れを説明する。図11に示すように、マスタ10Aは、イベントが発生すると(ステップS401)、イベント情報を記憶部17及びデータベース30Aに登録し(ステップS402)、該イベント情報の複製をレプリカ10B、10Cに通知する(ステップS403)。レプリカ10B、10Cは、イベント情報の複製を受信すると、データベース30B、30Cにイベント情報の複製を登録し、登録を行った旨の応答をマスタ10Aに送信する(ステップS404)。
そして、マスタ10Aは、定期的に通信している死活監視情報にイベント情報を付加して、クライアント20のクライアントライブラリ21にイベント情報を送信する(ステップS405)。クライアントライブラリ21は、イベント情報の受信を完了すると、最新送信完了イベントIDを用いて、イベント情報を二重に受信していないか確認する冗送確認処理を行う(ステップS406)。そして、クライアントライブラリ21は、二重に受信していないイベント情報である場合には、イベント情報をアプリケーション22に通知する(ステップS407)。
そして、マスタ10Aに故障が発生し、フェイルオーバによりレプリカ10Bを新マスタであるレプリカ10Bに切り替える(ステップS408)。続いて、新マスタであるレプリカ10Bは、データベース30Bからイベント情報を読み出し、イベント情報を復元する処理を行う(ステップS409)。また、クライアントライブラリ21は、マスタ10Aに故障が発生したため、イベント受信完了応答を旧マスタ10Aに送信することに失敗する(ステップS410)。ここで、クライアントライブラリ21は、マスタ10Aとの定期通信が途絶えたことからマスタ10Aとの接続切断を検出すると、レプリカのどれかにマスタの問い合わせを行い(ステップS411)、新マスタであるレプリカ10Bから新しいマスタである旨の返信を受信する(ステップS412)。そして、クライアントライブラリ21は、新マスタであるレプリカ10Bとの再接続を要求し(ステップS413)、新マスタであるレプリカ10Bとのセッションを確立してマスタと再接続する(ステップS414)。
続いて、新マスタであるレプリカ10Bは、イベント情報のうちクライアント20に対して送信未完了であるイベント情報を、最新受信完了イベントIDを用いて特定し、該送信未完了であるイベント情報をクライアント20に送信する(ステップS415)。そして、クライアントライブラリ21は、イベント情報の受信を完了すると、最新送信完了イベントIDを用いて、イベント情報を二重に受信していないか確認する冗送確認処理を行う(ステップS416)。ここでは、クライアントライブラリ21は、受信したイベント情報が、ステップS405において受信しているイベント情報であるため、イベント情報をアプリケーション22に通知せずに、最新受信完了イベントIDを含むイベント受信完了応答を新マスタであるレプリカ10Bに送信する(ステップS417)。
続いて、新マスタであるレプリカ10Bは、イベント受信完了応答を受信すると、イベント情報の送信が完了した旨の登録と最新受信完了イベントIDの更新とを行う(ステップS418)。その後、新マスタであるレプリカ10Bは、最新受信完了イベントIDの複製をレプリカ10Cに通知する(ステップS419)。レプリカ10Cは、最新受信完了イベントIDの複製を受信すると、データベース30Cに最新受信完了イベントIDを登録し、登録を行った旨の応答を新マスタであるレプリカ10Bに送信する(ステップS420)。そして、新マスタであるレプリカ10Bは、レプリカ10Cからの応答を受信し、イベント情報を受信すべき全クライアント20から応答が揃った場合に、送信を完了したイベント情報を削除する(ステップS421)。その後、新マスタであるレプリカ10Bは、自身のデータベース30Bからイベント情報を削除した場合には、レプリカ10Cに対してイベント情報の削除を複製させる(ステップS422)。そして、レプリカ10Cは、イベント情報の削除を複製してデータベース30Cからイベント情報を削除すると、削除を行った旨の応答を新マスタであるレプリカ10Bに送信する(ステップS423)。
次に、図12を用いて、第1の実施形態に係る死活監視システムによるフェイルオーバ時のイベント配送処理の流れを説明する。図12に示すように、マスタ10Aは、イベントが発生すると(ステップS501)、イベント情報を記憶部17及びデータベース30Aに登録し(ステップS502)、該イベント情報の複製をレプリカ10B、10Cに通知する(ステップS503)。レプリカ10B、10Cは、イベント情報の複製を受信すると、データベース30B、30Cにイベント情報の複製を登録し、登録を行った旨の応答をマスタ10Aに送信する(ステップS504)。
そして、マスタ10Aは、定期的に通信している死活監視情報にイベント情報を付加して、クライアント20のクライアントライブラリ21にイベント情報を送信する(ステップS505)。クライアントライブラリ21は、イベント情報の受信を完了すると、最新送信完了イベントIDを用いて、イベント情報を二重に受信していないか確認する冗送確認処理を行う(ステップS506)。そして、クライアントライブラリ21は、二重に受信していないイベント情報である場合には、イベント情報をアプリケーション22に通知する(ステップS507)。
そして、クライアントライブラリ21は、最新受信完了イベントIDを含むイベント受信完了応答をマスタ10Aに送信する(ステップS508)。ここで、マスタ10Aに故障が発生し、フェイルオーバによりレプリカ10Bを新マスタであるレプリカ10Bに切り替える(ステップS509)。続いて、新マスタであるレプリカ10Bは、データベース30Bからイベント情報を読み出し、イベント情報を復元する処理を行う(ステップS510)。ここで、クライアントライブラリ21は、マスタ10Aとの定期通信が途絶えたことからマスタ10Aとの接続切断を検出すると、レプリカのどれかにマスタの問い合わせを行い(ステップS511)、新マスタであるレプリカ10Bから新しいマスタである旨の返信を受信する(ステップS512)。そして、クライアントライブラリ21は、新マスタであるレプリカ10Bとの再接続を要求し(ステップS513)、新マスタであるレプリカ10Bとのセッションを確立してマスタと再接続する(ステップS514)。
続いて、新マスタであるレプリカ10Bは、イベント情報のうちクライアント20に対して送信未完了であるイベント情報を、最新受信完了イベントIDを用いて特定し、該送信未完了であるイベント情報をクライアント20に送信する(ステップS515)。そして、クライアントライブラリ21は、イベント情報の受信を完了すると、最新送信完了イベントIDを用いて、イベント情報を二重に受信していないか確認する冗送確認処理を行う(ステップS516)。ここでは、クライアントライブラリ21は、受信したイベント情報が、ステップS505において受信しているイベント情報であるため、イベント情報をアプリケーション22に通知せずに、最新受信完了イベントIDを含むイベント受信完了応答を新マスタであるレプリカ10Bに送信する(ステップS517)。
続いて、新マスタであるレプリカ10Bは、イベント受信完了応答を受信すると、イベント情報の送信が完了した旨の登録と最新受信完了イベントIDの更新とを行う(ステップS518)。その後、新マスタであるレプリカ10Bは、最新受信完了イベントIDの複製をレプリカ10Cに通知する(ステップS519)。レプリカ10Cは、最新受信完了イベントIDの複製を受信すると、データベース30Cに最新受信完了イベントIDを登録し、登録を行った旨の応答を新マスタであるレプリカ10Bに送信する(ステップS520)。そして、新マスタであるレプリカ10Bは、レプリカ10Cからの応答を受信し、イベント情報を受信すべき全クライアント20から応答が揃った場合に、送信を完了したイベント情報を削除する(ステップS521)。その後、新マスタであるレプリカ10Bは、自身のデータベース30Bからイベント情報を削除した場合には、レプリカ10Cに対してイベント情報の削除を複製させる(ステップS522)。そして、レプリカ10Cは、イベント情報の削除を複製してデータベース30Cからイベント情報を削除すると、削除を行った旨の応答を新マスタであるレプリカ10Bに送信する(ステップS523)。
[死活監視システムによる差分更新処理]
図13を用いて、第1の実施形態に係る死活監視システム1による差分更新処理の流れを説明する。図13は、第1の実施形態に係る死活監視システム1による差分更新処理の流れを示すシーケンス図である。図13には、クライアント20Bがマスタ10Aに記憶されたディレクトリ情報「File1,Dir2」のディレクトリキャッシュを取得し、クライアント20Aによるファイル名「File3」のファイルの追加に応じてディレクトリキャッシュを更新する場合を例示する。
図13に示すように、クライアント20Bは、アプリケーション22からディレクトリ情報を取得するためのディレクトリ情報取得要求が発生すると(ステップS601)、マスタ10Aへ該ディレクトリ情報取得要求を送信する(ステップS602)。クライアント20Bは、送信したディレクトリ情報取得要求に対応するディレクトリ情報のリストをマスタ10Aから受信すると(ステップS603)、該リストをキャッシュ記憶部21cに格納する(ステップS604)。この結果、クライアント20Bは、ディレクトリ情報「File1,Dir2」のディレクトリキャッシュを取得する。
これ以降、クライアント20Bは、アプリケーション22からディレクトリ情報取得要求が発生するごとに(ステップS605)、取得済みのディレクトリキャッシュを読み込んで(ステップS606)、これを利用する。
ここで、クライアント20Aが新規にファイル名「File3」のファイルを追加する要求をマスタ10Aに対して送信すると(ステップS607)、マスタ10Aは、ファイルを作成する(ステップS608)。そして、マスタ10Aは、ファイル名「File3」のファイルを作成すると、ファイルの作成完了をクライアント20Aへ通知する(ステップS609)。
マスタ10Aは、ファイル名「File3」のファイルを新規に追加すると、ファイル名「File3」を追加する旨の差分更新通知をイベントとして発生させる。そして、マスタ10Aは、ファイル名「File3」を追加する旨の差分更新通知を、ディレクトリキャッシュを保持するクライアント20Bに送信する(ステップS610)。この結果、クライアント20Bは、ディレクトリキャッシュのリストを更新し(ステップS611)、ファイル名「File3」のディレクトリ情報をリストに追加する。そして、クライアント20Bは、更新完了通知をマスタ10Aへ送信する(ステップS612)。
これ以降、クライアント20Bは、アプリケーション22からディレクトリ情報取得要求が発生するごとに(ステップS613)、更新済みのディレクトリキャッシュを読み込んで(ステップS614)、これを利用する。
なお、マスタ10Aは、ファイルが更新されたことを契機として、差分更新通知をイベントとして発生させた後に、図8のステップS101以降の処理も実行する。これにより、差分更新通知が欠送されることを防止する。すなわち、差分更新通知が発生した後に、マスタ10Aにおいて故障が発生した場合には、図9〜図12のいずれかの処理によって差分更新通知が通知先クライアント20へ送信されることとなる。このため、マスタ10Aは、差分更新通知を欠送させることなく通知先クライアント20に送信することができる。
また、図13では、ノードの追加や削除を行うクライアント20と、ディレクトリキャッシュを保持するクライアント20とが異なる場合を例示したが、これらのクライアントが同一の場合にも同様の処理によって差分更新処理が行われる。例えば、図13において、クライアント20Aがディレクトリキャッシュを保持していれば、マスタ10Aは、ファイル名「File3」を追加する旨の差分更新通知を、クライアント20Aにも送信する(ステップS610)。この結果、クライアント20Aは、ディレクトリキャッシュのリストを更新し(ステップS611)、ファイル名「File3」のディレクトリ情報をリストに追加する。そして、クライアント20Aは、更新完了通知をマスタ10Aへ送信する(ステップS612)。
ここで、図13及び図3〜図5を用いて、ファイルが追加される場合の差分更新処理と、ファイルが削除される場合の差分更新処理とをそれぞれ詳細に説明する。なお、ここでは、図13に例示のクライアント20Aは、マスタ10AとセッションID「Sid=2」で接続されており、クライアント20Bは、マスタ10AとセッションID「Sid=1」で接続されている。また、マスタ10Aは、ノードID「Nid=1」のディレクトリ配下に、ノードID「Nid=5」のファイル(図13のファイル名「File1」)と、ノードID「Nid=3」のディレクトリ(図13のディレクトリ名「Dir2」)とをそれぞれ記憶する。また、クライアント20Bは、ステップS602の処理において、図4に例示のノードID「Nid=1」のディレクトリのディレクトリ情報を取得済みであるものとする。
まず、ファイルが追加される場合の差分更新処理について説明する。ステップS607において、例えば、クライアント20Aは、ノードID「Nid=1」のディレクトリ配下にファイル名「File3」のファイルを追加する要求をマスタ10Aに対して送信する。マスタ10Aは、ファイル名「File3」のファイルを追加する要求を受信すると、ファイル名「File3」のファイルを作成する(ステップS608)。また、マスタ10Aは、ファイル名「File3」のファイルを作成するとき、作成されるファイルのメタデータとして、図3〜図5に例示の各種一覧の更新を行う。
具体的には、マスタ10Aの更新部11は、ファイル名「File3」のファイルが作成されると、作成されたファイルを識別するためのノードIDを割り当て、ノード情報一覧に登録する。図4に示す例では、更新部11は、ノードID「2」、親ノードID「Pid=1」、ノード種別「ファイル」及びアクセス中のセッションID「Sid=2」が対応付けられたレコードをノード情報一覧に追加する。
また、マスタ10Aの生成部12は、ファイル名「File3」のファイルが作成されると、ファイルが作成されたことを通知するためのイベント情報(差分更新通知)を生成し、イベント一覧に登録する。図5に示す例では、生成部12は、イベント発生元のノードID「Nid=2」と、イベント種別「ファイル追加」と、イベント発生元のセッションID「Sid=2」とを対応付けてイベントID「1」のイベント情報としてイベント一覧に登録する。
また、マスタ10Aのイベント送信部13は、ファイル名「File3」のファイルが作成されると、イベントID「1」の差分更新通知の通知先を特定し、セッション情報一覧に登録する。図3に示す例では、イベント送信部13は、ノード情報一覧を参照し、ファイル名「File3」のファイルが作成されるディレクトリのノードID「Nid=1」に対応するアクセス中のセッションID「Sid=1,3」を特定する。そして、イベント送信部13は、セッション情報一覧を参照し、特定した各セッションID「Sid=1,3」に対応する「送信するイベントのエントリ」に「Eid=1」をそれぞれ追加する。
このように、マスタ10Aは、ファイル名「File3」のファイルの作成に伴って、作成されたファイルのメタデータを図3〜図5に例示の各種一覧に登録する。その後、イベント送信部13は、ファイルの作成完了をクライアント20Aへ通知する(ステップS609)。
そして、イベント送信部13は、各クライアント20に対して死活監視情報を定期的に送信する際に、セッション情報一覧を参照する。そして、イベント送信部13は、「送信するイベントのエントリ」にあるイベント情報(差分更新通知)を、該当するセッションIDで接続されたクライアント20に対して送信する。ここで、図3を用いて、セッションID「1」で接続されたクライアント20(図13のクライアント20B)に定期的な死活監視情報を送信する場合を説明する。この場合、イベント送信部13は、図3に例示のセッション情報一覧を参照し、セッションID「1」に送信するイベントのエントリとして「Eid=1,2,5」を特定する。そして、イベント送信部13は、イベントID「1,2,5」の各イベント情報をイベント一覧から取得する。そして、イベント送信部13は、取得した各イベント情報を死活監視情報に付加して送信する。この結果、ファイル名「File3」のファイルが作成されたことを通知するためのイベントID「1」のイベント情報(差分更新通知)がセッションID「1」で接続されたクライアント通知される(ステップS610)。このように、マスタ10Aは、ファイルの追加に応じて差分更新処理を実行する。
次に、ファイルが削除される場合の差分更新処理について説明する。ステップS607に相当する処理として、例えば、クライアント20Aは、ノードID「Nid=3」のディレクトリ配下にあるノードID「Nid=6」のファイルを削除する要求をマスタ10Aに対して送信する。マスタ10Aは、ノードID「Nid=6」のファイルを削除する要求を受信すると、ノードID「Nid=6」のファイルを削除する(ステップS608に相当)。また、マスタ10Aは、ノードID「Nid=6」のファイルを削除するとき、削除されるファイルのメタデータとして、図3〜図5に例示の各種一覧の更新を行う。
具体的には、マスタ10Aの更新部11は、ノードID「Nid=6」のファイルが削除されると、削除されたファイルのノードIDに対応するレコードを、ノード情報一覧から削除する。図4に示す例では、更新部11は、ノードID「6」、親ノードID「Pid=3」、ノード種別「ファイル」及びアクセス中のセッションID「なし」が対応付けられたレコードをノード情報一覧から削除する。なお、ここでは、説明の便宜上、削除されたファイルにアクセス中のセッションIDが無い場合を例示したが、削除されたノードにアクセス中のセッションIDがある場合も考えられる。このような場合には、マスタ10Aは、セッションIDで接続されたクライアント20に対してアクセスが無効になる旨を通知する処理を別途行っても良い。
また、マスタ10Aの生成部12は、ノードID「Nid=6」のファイルが削除されると、ファイルが削除されたことを通知するためのイベント情報(差分更新通知)を生成し、イベント一覧に登録する。図5に示す例では、生成部12は、イベント発生元のノードID「Nid=6」と、イベント種別「ファイル削除」と、イベント発生元のセッションID「Sid=3」とを対応付けてイベントID「4」のイベント情報としてイベント一覧に登録する。
また、マスタ10Aのイベント送信部13は、ノードID「Nid=6」のファイルが削除されると、イベントID「4」の差分更新通知の通知先を特定し、セッション情報一覧に登録する。図3に示す例では、イベント送信部13は、ノード情報一覧を参照し、ノードID「Nid=6」のファイルが属するディレクトリのノードID「Nid=3」に対応するアクセス中のセッションID「Sid=4」を特定する。そして、イベント送信部13は、セッション情報一覧を参照し、特定したセッションID「Sid=4」に対応する「送信するイベントのエントリ」に「Eid=4」を追加する。
このように、マスタ10Aは、ノードID「Nid=6」のファイルの削除に伴って、削除されたファイルのメタデータを図3〜図5に例示の各種一覧に登録する。その後、イベント送信部13は、ファイルの削除完了をクライアント20Aへ通知する(ステップS609に相当)。
そして、イベント送信部13は、各クライアント20に対して死活監視情報を定期的に送信する際に、セッション情報一覧を参照する。そして、イベント送信部13は、「送信するイベントのエントリ」にあるイベント情報(差分更新通知)を、該当するセッションIDで接続されたクライアント20に対して送信する。ここで、図3を用いて、セッションID「4」で接続されたクライアント20に定期的な死活監視情報を送信する場合を説明する。この場合、イベント送信部13は、図3に例示のセッション情報一覧を参照し、セッションID「4」に送信するイベントのエントリとして「Eid=3,4,7」を特定する。そして、イベント送信部13は、イベントID「3,4,7」の各イベント情報をイベント一覧から取得する。そして、イベント送信部13は、取得した各イベント情報を死活監視情報に付加して送信する。この結果、ノードID「Nid=6」のファイルが削除されたことを通知するためのイベントID「4」のイベント情報(差分更新通知)がセッションID「4」で接続されたクライアント通知される(ステップS610に相当)。このように、マスタ10Aは、ファイルの削除に応じて差分更新処理を実行する。
[クライアントによる処理]
次に、図14〜図18を用いて、第1の実施形態に係るクライアント20による処理を説明する。図14は、第1の実施形態に係るクライアントの定期通信開始処理の処理手順を説明するためのフローチャートである。図15は、第1の実施形態に係るクライアントの定期通信受信処理の処理手順を説明するためのフローチャートである。図16は、第1の実施形態に係るクライアントのイベント処理の処理手順を説明するためのフローチャートである。図17は、第1の実施形態に係るクライアントのディレクトリ情報取得要求発生時の処理手順を説明するためのフローチャートである。図18は、第1の実施形態に係るクライアントのノードの追加・削除要求発生時の処理手順を説明するためのフローチャートである。
まず、図14を用いてクライアントの定期通信開始処理の処理手順を説明する。図14に示すように、クライアント20は、全てのサーバ10A〜10Eへ接続要求を行う(ステップS701)。そして、クライアント20は、マスタ10Aの接続先を受信すると(ステップS702)、マスタ10Aへ受信完了応答を送信する(ステップS703)。
続いて、クライアント20は、死活監視タイマをセットし(ステップS704)、定期通信受信処理(後に図13を用いて詳述)を行って(ステップS705)、処理を終了する。
次に、図15を用いてクライアントの定期通信受信処理の処理手順を説明する。図15に示すように、クライアント20は、死活監視タイムアウト前に受信したか判定する(ステップS801)。この結果、クライアント20は、死活監視タイムアウト前に死活監視情報を受信した場合には(ステップS801肯定)、イベント処理(後に図16を用いて詳述)を行って(ステップS802)、マスタ10Aへ受信完了応答を送信し(ステップS803)、死活監視タイマをリセットした後、再度セットして(ステップS804)、ステップS801に戻る。
また、ステップS801において、クライアント20は、死活監視タイムアウト前に死活監視情報を受信しなかった場合には(ステップS801否定)、処理を終了する。
次に、図16を用いてクライアントのイベント処理の処理手順を説明する。図16に示すように、クライアント20は、イベント情報を受信したか否か、すなわち、死活監視情報にイベント情報が付加されているか否かを判定する(ステップS901)。この結果、クライアント20は、イベント情報を受信していない場合には(ステップS901否定)、処理を終了する。一方、クライアント20は、イベント情報を受信した場合には(ステップS901肯定)、受信したイベント情報が以前に受信していないイベント情報であるか否かを判定する(ステップS902)。
この結果、クライアント20は、以前に受信していないイベント情報ではない、すなわち、以前に受信済みのイベント情報である場合には(ステップS902否定)、処理を終了する。一方、クライアント20は、以前に受信していないイベント情報である場合には(ステップS902肯定)、受信したイベントが差分更新通知であるか否かを判定する(ステップS903)。
この結果、クライアント20は、差分更新通知である場合には(ステップS903肯定)、ディレクトリキャッシュを差分更新し(ステップS904)、ステップS905の処理へ移行する。一方、クライアント20は、差分更新通知でない場合には(ステップS903否定)、ステップS904の処理を実行することなくステップS905の処理へ移行する。
続いて、クライアント20は、受信したイベント情報がアプリケーションに通知するイベント情報であるか否かを判定する(ステップS905)。この結果、クライアント20は、アプリケーションに通知するイベント情報である場合には(ステップS905肯定)、アプリケーション22にイベント情報を通知して(ステップS906)、処理を終了する。一方、クライアント20は、アプリケーションに通知するイベント情報ではない場合には(ステップS905否定)、ステップS906の処理を実行することなく処理を終了する。
次に、図17を用いてクライアントのディレクトリ情報取得要求発生時の処理手順を説明する。図17に示すように、クライアント20は、ディレクトリ情報取得要求がアプリケーションから発生すると(ステップS1001肯定)、ディレクトリキャッシュを保持しているか否かを判定する(ステップS1002)。この結果、クライアント20は、ディレクトリキャッシュを保持している場合には(ステップS1002肯定)、保持しているディレクトリキャッシュを読み込んでアプリケーションへ返却する(ステップS1003)。なお、クライアント20は、ディレクトリ情報取得要求がアプリケーションから発生するまで(ステップS1001否定)、処理を開始しない。
一方、クライアント20は、ディレクトリキャッシュを保持していない場合には(ステップS1002否定)、発生したディレクトリ情報取得要求をマスタ10Aへ送信する(ステップS1004)。そして、クライアント20は、送信したディレクトリ情報取得要求に対応するディレクトリ情報をマスタ10Aから受信すると(ステップS1005)、該ディレクトリ情報をディレクトリキャッシュとしてキャッシュ記憶部21cに格納する(ステップS1006)。
次に、図18を用いてクライアントのノードの追加・削除要求発生時の処理手順を説明する。図18に示すように、クライアント20は、ノードの追加又は削除を行う旨の追加・削除要求がアプリケーションから発生すると(ステップS1101肯定)、ノードの追加・削除要求をマスタ10Aへ送信する(ステップS1102)。そして、クライアント20は、マスタ10Aがノードの追加又は削除を行うと、ノードの追加又は削除を行った旨の応答をマスタ10Aから受信し(ステップS1103)、処理を終了する。なお、クライアント20は、ノードの追加又は削除を行う旨の追加・削除要求がアプリケーションから発生するまで(ステップS1101否定)、処理を開始しない。
なお、クライアントのノードの追加・削除要求発生時の処理手順は、上記の例に限定されるものではない。例えば、クライアント20は、ノードの追加を行った際に、追加したノードの親ノードIDに対応するノードのディレクトリキャッシュを保持していれば、マスタ10Aからの差分更新通知を待つことなく、追加したノードのディレクトリ情報を該ディレクトリキャッシュに追加しても良い。また、クライアント20は、ノードの削除を行った際に、削除したノードのディレクトリキャッシュを保持していれば、マスタ10Aからの差分更新通知を待つことなく、削除したノードのディレクトリ情報を該ディレクトリキャッシュから削除しても良い。
[死活監視装置による処理]
次に、図19及び図20を用いて、第1の実施形態に係る死活監視装置による処理を説明する。図19は、第1の実施形態に係る死活監視装置10におけるイベント配信処理の処理手順を説明するためのフローチャートである。図20は、第1の実施形態に係る死活監視装置10における差分更新処理の処理手順を説明するためのフローチャートである。
まず、図19を用いて第1の実施形態に係る死活監視装置10におけるイベント配信処理の処理手順を説明する。図19に示すように、マスタ10Aは、イベントが発生すると、イベント情報を登録し(ステップS1201)、レプリカ10B〜10Eへイベント情報の複製を通知する(ステップS1202)。そして、マスタ10Aは、クライアント20へイベント情報を送信し(ステップS1203)、クライアントから最新受信完了イベントIDを含むイベント受信完了応答を受信する(ステップS1204)。そして、マスタ10Aは、イベント受信完了応答に含まれる最新受信完了イベントIDを登録する(ステップS1205)。
続いて、マスタ10Aは、イベント受信完了応答に含まれる最新受信完了イベントIDを複製して、レプリカ10B〜10Eへ通知する(ステップS1206)。その後、マスタ10Aは、イベント情報を送信したクライアント全てから応答があったか判定する(ステップS1207)。この結果、マスタ10Aは、イベント情報を送信したクライアント全てから応答がなかった場合(ステップS1207否定)、処理を終了する。
また、マスタ10Aは、イベント情報を送信したクライアント全てから応答があった場合(ステップS1207肯定)、イベント情報を削除し(ステップS1208)、レプリカ10B〜10Eへイベント情報削除を複製させて(ステップS1209)、処理を終了する。
次に、図20を用いて第1の実施形態に係る死活監視装置10における差分更新処理の処理手順を説明する。図20に示すように、マスタ10Aは、ノードの追加・削除要求をクライアント20から受信すると(ステップS1301肯定)、ノードの追加・削除要求に基づいて、データベース30Aを更新する(ステップS1302)。そして、マスタ10Aは、ノードの追加・削除要求の送信元のクライアント20へ追加・削除完了の旨の応答を送信する(ステップS1303)。
また、マスタ10Aは、ノードの追加・削除要求に基づいて、データベース30Aを更新すると、更新したノードの差分更新通知を生成し(ステップS1304)、これをイベント情報としてイベント一覧に登録する。すなわち、マスタ10Aは、図19のステップS1201及びステップS1202に示したように、差分更新通知をイベント情報として登録し、登録したイベント情報の複製をレプリカ10B〜10Eへ通知する。例えば、マスタ10Aは、セッションID「2」のセッションで接続されるクライアントからノードID「2」のファイルを追加する旨の追加要求を受信した場合には、イベント発生元のノードID「Nid=2」と、イベント種別「ファイル追加」と、イベント発生元のセッションID「Sid=2」とを対応付けてイベントID「1」のイベントとしてイベント一覧に登録する。
そして、マスタ10Aは、差分更新通知の通知先となる通知先クライアントの一覧を取得する(ステップS1305)。例えば、マスタ10Aは、ノード情報一覧を参照し、イベント発生元のノードID「Nid=2」の親ノードID「Pid=1」のノードにアクセス中のセッションID「Sid=1,3」を取得する。そして、マスタ10Aは、セッション情報一覧を参照し、取得した各セッションID「Sid=1,3」に対応する「送信するイベントのエントリ」に「Eid=1」をそれぞれ追加する。
そして、マスタ10Aは、通知先クライアントへ差分更新通知をイベント情報として送信する(ステップS1306)。すなわち、マスタ10Aは、図19のステップS1203〜ステップS1209に示したように、差分更新通知をイベント情報として各クライアントへ送信し、応答を受信する。例えば、マスタ10Aは、IPアドレス「10.0.0.1」及び「10.0.1.4」の各クライアントに差分更新通知を送信し、送信先の全てのクライアントから応答を受信すると、イベントID「1」のイベント情報(差分更新通知)を削除する。
[第1の実施形態の効果]
第1の実施形態に係るクライアント20は、複数のサーバのうちの一つのサーバであるマスタサーバに記憶されたデータのキャッシュを記憶する。クライアント20は、前記マスタサーバに記憶されたデータが更新された場合に、更新後のデータと更新前のデータとの間の差分を更新する旨の差分更新通知と、当該差分更新通知の送信を完了したか否かを示す送信完了情報との同期処理が前記マスタサーバによって行われた前記複数のサーバのうち、当該マスタサーバ、又は、当該マスタサーバ以外のレプリカサーバのなかから選択された新たなマスタサーバから、前記差分更新通知を受信する。クライアント20は、受信された差分更新通知を用いて、前記キャッシュを更新する。このため、クライアント20は、キャッシュの更新に要する通信負荷を軽減することができる。例えば、死活監視装置10は、ディレクトリキャッシュに対して追加・削除を行うノードのみを差分更新するため、キャッシュの更新に要する通信負荷を軽減することができ、ディレクトリ情報の更新を高速に行うことができる。
ここで、図21を用いて第1の実施形態に係る死活監視システムの効果を説明する。図21は、第1の実施形態に係る死活監視システムの効果を説明するための図である。図21には、死活監視の対象となる3台のクライアント20A〜20C(計算機1〜3)が死活監視装置10に接続されており、4台目のクライアント20D(計算機4)が追加された場合の差分更新処理を例示する。なお、図21において、クライアント20A〜20D(計算機1〜4)の名称は、それぞれ「m1〜m4」であるものとする。
図21の左側には、4台目のクライアント20Dが追加される前の死活監視システムの状態を示す。この場合、死活監視装置10は、5台のサーバで構成され、各クライアント20A〜20Cと接続されている。このとき、死活監視装置10は、接続されている各クライアント20A〜20C(計算機1〜3)の名前のファイル名「m1,m2,m3」のファイルをそれぞれ作成し、ディレクトリ名「mDir」のディレクトリ配下に保持している。また、各クライアント20A〜20Cは、ディレクトリ名「mDir」のディレクトリを監視しており、ディレクトリ名「mDir」のキャッシュとしてファイル名「m1,m2,m3」をそれぞれ保持している。また、死活監視装置10は、各クライアント20A〜20Cがディレクトリ名「mDir」のキャッシュを保持している旨の情報を記憶している。
ここで、4台目のクライアント20D(計算機)が死活監視の対象として死活監視装置10に接続されると、クライアント20Dは、死活監視装置10のディレクトリ名「mDir」のディレクトリ配下に自装置を示すファイル名「m4」のファイルを作成する要求を送信し(1.ファイル追加)、これを追加する(2.ファイル追加)。ここで、従来の技術では、各クライアント20A〜20Cが追加前に保持していたキャッシュを削除してから、追加後のディレクトリ情報であるファイル名「m1,m2,m3,m4」を再受信するので、通信負荷が大きかった。すなわち、各クライアント20A〜20Cは、ファイル追加の前後で変化のないファイル名「m1,m2,m3」についても再受信していたので、通信負荷が大きかった。
これに対して、第1の実施形態に係る死活監視装置10は、このファイル名「m4」のファイルの追加を契機として、各クライアント20が保持するキャッシュにファイル名「m4」を追加する旨の差分更新通知を行う。具体的には、死活監視装置10は、追加されたファイル名「m4」の親のディレクトリ名「mDir」のディレクトリ情報を保持するクライアント20A〜20Cを通知先クライアントとして特定する(3.差分通知準備)。そして、死活監視装置10は、特定した各クライアント20A〜20Cに対してファイル名「m4」を追加する旨の差分更新通知を送信する(4.更新情報通知)。このように、第1の実施形態に係る死活監視システムは、各クライアント20A〜20Cに対してファイル名「m1,m2,m3,m4」を通知するのではなく、新たに追加されたファイル名「m4」のみを通知することができるので、キャッシュの更新に要する通信負荷を軽減することができる。
更に具体例を挙げて説明する。例えば、サーバにおいて、ディレクトリ名「mDir」のディレクトリ配下に10000個のファイルが管理されている状況で、サーバ側に1個のファイルが追加された場合を説明する。この場合、従来技術では、10001個のファイル名が各クライアント20に再通知されていた。これに対して、第1の実施形態に係る死活監視装置10は、追加された1個のファイル名のみを各クライアント20に通知する。このため、第1の実施形態に係る死活監視装置10は、キャッシュの更新に要する通信負荷を軽減することができる。
また、従来技術では、例えば、差分更新通知が発生した後に、マスタ10Aに故障が発生した場合には、一部のクライアント20に対して差分更新通知が欠送してしまう恐れがあった。すなわち、従来技術では、キャッシュの維持が担保されなかったため、分散システムに対してキャッシュの差分更新技術を実装することができなかった。これに対して、第1の実施形態に係る死活監視装置10は、欠送防止処理を行うことによって差分更新通知の欠送を防止しているので、故障が発生しても差分更新通知が欠送することを防止することができる。すなわち、死活監視装置10は、フェイルオーバの前後でもキャッシュの維持が担保されるため、分散システムに対してキャッシュの差分更新技術を実装することが可能となった。
[第2の実施形態]
上記の第1の実施形態では、ディレクトリキャッシュが差分更新される場合を説明したが、実施形態はこれに限定されるものではない。例えば、実施形態は、マスタ10Aから取得されたファイルのキャッシュが差分更新される場合に適用されても良い。そこで、第2の実施形態では、マスタ10Aから取得されたファイルのキャッシュが差分更新される場合を説明する。
第2の実施形態に係る死活監視システム1は、図2に示した死活監視システム1と比較して、基本的に同様の機能構成を有し、クライアント20がディレクトリ情報ではなくファイル等のデータをキャッシュデータとして保持する点が相違する。以下、この相違点について中心的に説明することとする。
図22を用いて、第2の実施形態に係る死活監視システム1による差分更新処理の流れを説明する。図22は、第2の実施形態に係る死活監視システム1による差分更新処理の流れを示すシーケンス図である。図22には、クライアント20Bがマスタ10Aに記憶されたファイル名「FileA」のキャッシュを取得した場合を説明する。そして、クライアント20Aによるファイル名「FileA」の内容の更新に応じて、キャッシュが差分更新される場合を例示する。
図22に示すように、クライアント20Bは、アプリケーション22からファイル名「FileA」のファイルを取得するための取得要求が発生すると(ステップS1401)、マスタ10Aへ「FileA」の取得要求を送信する(ステップS1402)。クライアント20Bは、送信した取得要求に対応するファイルの内容をマスタ10Aから受信すると(ステップS1403)、ファイルのキャッシュを格納する(ステップS1404)。この結果、クライアント20Bは、ファイル名「FileA」のファイルのキャッシュを取得する。なお、クライアント20Bが取得したファイル名「FileA」の内容は、例えば、「Line1 aaa,Line2 bbb」である。
これ以降、クライアント20Bは、アプリケーション22からファイル名「FileA」のファイルを取得するための取得要求が発生するごとに(ステップS1405)、取得済みのキャッシュを読み込んで(ステップS1406)、これを利用する。
ここで、クライアント20Aがファイル名「FileA」のファイルを更新する旨の更新要求をマスタ10Aに対して送信すると(ステップS1407)、マスタ10Aは、ファイル名「FileA」のファイルを更新する。例えば、マスタ10Aは、ファイル名「FileA」のファイル更新要求を受信すると、ファイル名「FileA」のファイルを更新する(ステップS1408)。例えば、マスタ10Aは、ファイル名「FileA」のファイルの内容を「Line1 aaa,Line2 bbb,Line3 ccc」に変更する旨の更新要求であれば、データベース30Aに記憶された更新前のファイル名「FileA」のファイルの内容を生成部12へ通知する。そして、マスタ10Aは、更新要求で指定されたファイルの内容を生成部12へ通知するとともに、データベース30Aに記憶されたファイル名「FileA」のファイルを更新要求にしたがって上書きする(更新)。そして、マスタ10Aは、ファイル名「FileA」のファイルを更新すると、ファイルの更新完了をクライアント20Aへ通知する(ステップS1409)。
マスタ10Aは、ファイル名「FileA」のファイルを更新すると、ファイル名「FileA」のファイルを更新するための差分更新通知を生成する。具体的には、マスタ10Aの生成部12は、更新前のファイル名「FileA」の内容と、更新後のファイル名「FileA」の内容とを比較する。そして、マスタ10Aの生成部12は、更新前のファイル名「FileA」の内容の「Line2 bbb」の次に「Line3 ccc」を挿入する旨の差分更新通知を生成する。そして、マスタ10Aは、生成した差分更新通知を、キャッシュを保持するクライアント20Bに送信する(ステップS1410)。この結果、クライアント20Bは、キャッシュのファイル名「FileA」の内容を更新し(ステップS1411)、キャッシュデータ内の「Line2 bbb」の次に「Line3 ccc」を挿入する。そして、クライアント20Bは、更新完了通知をマスタ10Aへ送信する(ステップS1412)。
これ以降、クライアント20Bは、アプリケーション22からファイル名「FileA」のファイルを取得するための取得要求が発生するごとに(ステップS1413)、更新済みのキャッシュを読み込んで(ステップS1414)、これを利用する。
このように、第2の実施形態によれば、死活監視システム1は、マスタ10Aから取得されたファイルのキャッシュを差分更新することもできる。このため、死活監視システムは、キャッシュの更新に要する通信負荷を軽減することが期待される。
[第3の実施形態]
さて、これまで本発明の実施形態について説明したが、本発明は上述した実施形態以外にも、種々の異なる形態にて実施されてよいものである。そこで、以下では第3の実施形態として本発明に含まれる他の実施形態を説明する。
例えば、上記の実施形態では、クライアント20がマスタ10Aから受信した差分更新通知に基づいてキャッシュの差分更新を行う場合を説明したが、実施形態はこれに限定されるものではない。例えば、ノードの追加・削除要求を送信したクライアント20がキャッシュを保持していれば、マスタ10Aからの差分更新通知を待つことなくキャッシュの差分更新を行っても良い。
図23を用いて第3の実施形態に係るクライアント20のノードの追加・削除要求発生時の処理手順を説明する。図23は、第3の実施形態に係るクライアントのノードの追加・削除要求発生時の処理手順を説明するためのフローチャートである。
図23に示すように、クライアント20は、ノードの追加又は削除を行う旨の追加・削除要求がアプリケーション22から発生すると(ステップS1501肯定)、ノードの追加・削除要求をマスタ10Aへ送信する(ステップS1502)。そして、クライアント20は、マスタ10Aがノードの追加又は削除を行うと、ノードの追加又は削除を行った旨の応答をマスタ10Aから受信する(ステップS1503)。なお、クライアント20は、ノードの追加又は削除を行う旨の追加・削除要求がアプリケーション22から発生するまで(ステップS1101否定)、処理を開始しない。
そして、クライアント20は、追加・削除したノードを含むキャッシュを保持しているか判定する(ステップS1504)。クライアント20は、キャッシュを保持している場合には(ステップS1504肯定)、追加・削除要求に基づいて、保持しているキャッシュに対してノードの追加・削除を行う差分更新を実行し(ステップS1505)、処理を終了する。なお、クライアント20は、キャッシュを保持していない場合には(ステップS1504否定)、処理を終了する。
このように、ノードの追加・削除要求を送信したクライアント20がキャッシュを保持していれば、クライアント20は、マスタ10Aからの差分更新通知を待つことなくキャッシュの差分更新を行うことができる。
また、図示した各装置の各構成要素は機能概念的なものであり、必ずしも物理的に図示の如く構成されていることを要しない。すなわち、各装置の分散・統合の具体的形態は図示のものに限られず、その全部または一部を、各種の負荷や使用状況などに応じて、任意の単位で機能的または物理的に分散・統合して構成することができる。例えば、イベント送信部13と送信未完了イベント送信部16を統合してもよい。さらに、各装置にて行なわれる各処理機能は、その全部または任意の一部が、CPUおよび当該CPUにて解析実行されるプログラムにて実現され、あるいは、ワイヤードロジックによるハードウェアとして実現され得る。
また、本実施例において説明した各処理のうち、自動的におこなわれるものとして説明した処理の全部または一部を手動的におこなうこともでき、あるいは、手動的におこなわれるものとして説明した処理の全部または一部を公知の方法で自動的におこなうこともできる。この他、上記文書中や図面中で示した処理手順、制御手順、具体的名称、各種のデータやパラメータを含む情報については、特記する場合を除いて任意に変更することができる。
また、上記実施形態において説明した死活監視装置10が実行する処理をコンピュータが実行可能な言語で記述したプログラムを作成することもできる。例えば、実施例1に係る死活監視装置10が実行する処理をコンピュータが実行可能な言語で記述した差分更新プログラムを作成することもできる。この場合、コンピュータが差分更新プログラムを実行することにより、上記実施形態と同様の効果を得ることができる。さらに、かかる差分更新プログラムをコンピュータ読み取り可能な記録媒体に記録して、この記録媒体に記録された差分更新プログラムをコンピュータに読み込ませて実行することにより上記第一の実施形態と同様の処理を実現してもよい。以下に、図2に示した死活監視装置10と同様の機能を実現する差分更新プログラムを実行するコンピュータの一例を説明する。
図24は、差分更新プログラムを実行するコンピュータ1000を示す図である。図24に例示するように、コンピュータ1000は、例えば、メモリ1010と、CPU1020と、ハードディスクドライブインタフェース1030と、ディスクドライブインタフェース1040と、ネットワークインタフェース1070とを有し、これらの各部はバス1080によって接続される。
メモリ1010は、図24に例示するように、ROM(Read Only Memory)1011及びRAM1012を含む。ROM1011は、例えば、BIOS(Basic Input Output System)等のブートプログラムを記憶する。ハードディスクドライブインタフェース1030は、図24に例示するように、ハードディスクドライブ1031に接続される。ディスクドライブインタフェース1040は、図24に例示するように、ディスクドライブ1041に接続される。例えば磁気ディスクや光ディスク等の着脱可能な記憶媒体が、ディスクドライブに挿入される。
ここで、図24に例示するように、ハードディスクドライブ1031は、例えば、OS1091、アプリケーションプログラム1092、プログラムモジュール1093、プログラムデータ1094を記憶する。すなわち、上記の差分更新プログラムは、コンピュータ1000によって実行される指令が記述されたプログラムモジュールとして、例えばハードディスクドライブ1031に記憶される。
また、上記実施形態で説明した各種データは、プログラムデータとして、例えばメモリ1010やハードディスクドライブ1031に記憶される。そして、CPU1020が、メモリ1010やハードディスクドライブ1031に記憶されたプログラムモジュール1093やプログラムデータ1094を必要に応じてRAM1012に読み出し、各手順を実行する。
なお、差分更新プログラムに係るプログラムモジュール1093やプログラムデータ1094は、ハードディスクドライブ1031に記憶される場合に限られず、例えば着脱可能な記憶媒体に記憶され、ディスクドライブ等を介してCPU1020によって読み出されてもよい。あるいは、差分更新プログラムに係るプログラムモジュール1093やプログラムデータ1094は、ネットワーク(LAN(Local Area Network)、WAN(Wide Area Network)等)を介して接続された他のコンピュータに記憶され、ネットワークインタフェース1070を介してCPU1020によって読み出されてもよい。