(58)【調査した分野】(Int.Cl.,DB名)
前記クライアント装置は、送信した前記操作情報に応じた前記データベースの変更が成功しなかった場合、前記操作情報を送信してから前記一定時間を経過していないことを条件として、同一の前記操作情報を前記マスターのサーバ装置に再送信する
請求項4に記載のデータベースシステム。
前記複数のサーバ装置のそれぞれは、前記クライアント装置から受信した前記操作情報の前記識別子が、前記識別子記憶部に記憶されている場合、受信した前記操作情報に応じた処理が成功したことを表す結果を前記クライアント装置に送信する結果送信部をさらに有する
請求項2から7の何れか1項に記載のデータベースシステム。
【発明を実施するための形態】
【0013】
以下、図面を参照しながら実施形態に係るデータベースシステムについて詳細に説明する。本実施形態に係るデータベースシステムは、クライアント装置から同一の操作情報が再送信された場合に重複実行を無くすことを目的とする。
【0014】
図1は、実施形態に係るデータベースシステムの構成を示す図である。データベースシステム10は、複数のサーバ装置30と、調停装置40と、クライアント装置50とを備える。複数のサーバ装置30、調停装置40およびクライアント装置50は、それぞれが情報処理装置であって、ネットワークを介して互いに接続可能である。
【0015】
複数のサーバ装置30は、それぞれがデータベースを記憶する。複数のサーバ装置30は、1つがマスターとして動作し、他の少なくとも1つのサーバ装置30がマスターをバックアップするスレーブとして動作する。
【0016】
マスターのサーバ装置30は、クライアント装置50からデータベースの操作を指示する操作情報を受信する。データベースの操作とは、例えば、レコードの参照、検索、更新、削除、新規登録等のことをいう。
【0017】
スレーブのサーバ装置30は、マスターのサーバ装置30との間でレプリケーションを実行して、マスターのサーバ装置30が有するデータベースと同一の変更処理を実行する。より具体的には、マスターのサーバ装置30は、データベースの変更(更新、削除、新規登録等)のログをスレーブのサーバ装置30に送信する。スレーブのサーバ装置30は、データベースの変更のログを受信すると、ログに従って自身が有するデータベースを変更する。これにより、それぞれのスレーブのサーバ装置30は、データベースをマスターのサーバ装置30に同期させることができる。なお、スレーブのサーバ装置30が複数個設定されている場合、マスターのサーバ装置30は、それぞれのスレーブのサーバ装置30との間でレプリケーションを実行する。
【0018】
調停装置40は、複数のサーバ装置30のうちの1つをマスターのサーバ装置30に設定する。また、調停装置40は、複数のサーバ装置30のうちマスター以外の他の少なくとも1つをスレーブのサーバ装置30に設定する。また、調停装置40は、それぞれのサーバ装置30が故障をしたか否かを監視する。調停装置40は、マスターのサーバ装置30が故障した場合、何れかのスレーブのサーバ装置30をマスターのサーバ装置30に設定する。また、調停装置40は、クライアント装置50から問い合わせを受信した場合、何れがマスターのサーバ装置30であるかを回答する。
【0019】
クライアント装置50は、データベースの操作を指示する操作情報をマスターのサーバ装置30に送信する。また、クライアント装置50は、マスターのサーバ装置30が不明である場合、調停装置40に問い合わせて、マスターのサーバ装置30の通知を受ける。これにより、クライアント装置50は、マスターのサーバ装置30に操作情報を送信することができる。
【0020】
図2は、調停装置40によるマスターおよびスレーブの設定の処理の流れを示す図である。調停装置40は、サービスを開始する場合、何れかのサーバ装置30が故障した場合および新たなサーバ装置30が追加された場合等に、それぞれのサーバ装置30に対してマスターまたはスレーブの役割を設定する。この場合、調停装置40は、複数のサーバ装置30が同時にマスターに設定されないように役割を設定する。
【0021】
なお、データベースシステム10は、何れかのサーバ装置30が故障した場合等に、故障していない複数のサーバ装置30のうちの1つがマスターとして動作し、残りの少なくとも1つがスレーブとして動作すれば、調停装置40を備えない構成であってもよい。例えば、マスターの故障を検知したり、新たなサーバ装置30の追加を検知したりしたタイミングにおいて、それぞれのサーバ装置30は、特定のディスクロックを取得する。そして、それぞれのサーバ装置30は、特定のディスクロックが取得できた場合にマスターとして動作し、取得できなかった場合にスレーブとして動作する。これにより、データベースシステム10は、調停装置40を備えない構成において、それぞれのサーバ装置30に適切に役割を設定できる。
【0022】
また、例えば、マスターの故障を検知したり、新たなサーバ装置30の追加を検知したりしたタイミングにおいて、複数のサーバ装置30は、互いに、マスターとなるサーバ装置30を投票する投票処理を実行する。そして、複数のサーバ装置30は、マスターが決定するまで投票処理を繰り返す。このようにしても、データベースシステム10は、調停装置40を備えない構成において、それぞれのサーバ装置30に適切に役割を設定できる。
【0023】
図3は、クライアント装置50によるデータベースの操作およびレプリケーションの処理の流れを示す図である。
【0024】
クライアント装置50は、上位階層のアプリケーションからデータベースの操作の指示を受けた場合、操作情報を生成して、マスターのサーバ装置30に送信する。操作情報は、例えば、複数の更新処理等をまとめたトランザクションの実行要求であってよい。また、操作情報は、SQL文によるデータベースの操作要求であってもよい。また、操作情報は、1つのレコードの更新、削除または新規登録等の要求であってもよい。また、操作情報は、クライアント装置50がマスターのサーバ装置30に接続してから、少なくとも1つのトランザクションの実行をし、接続を終了するまでのセッションに含まれる全ての情報であってもよい。
【0025】
マスターのサーバ装置30は、クライアント装置50から操作情報を受信した場合、操作情報に従ってデータベースを操作する。マスターのサーバ装置30は、操作情報に従ったデータベースの操作が成功すると、クライアント装置50に成功したことを表す情報を返信する。なお、マスターのサーバ装置30は、操作情報に従った処理が失敗した場合には、クライアント装置50に失敗したことを表す情報を返信する。
【0026】
また、マスターのサーバ装置30は、操作情報に従ってデータベースを変更する場合、スレーブのサーバ装置30との間でレプリケーションを実行する。具体的には、マスターのサーバ装置30は、データベースの変更のログをスレーブのサーバ装置30に送信する。データベースの変更のログは、データベースの更新、削除または登録等の履歴を伝達できる情報であれば、どのような情報であってもよい。例えば、データベースの変更のログは、データベースの操作を表すSQL文であってもよいし、レコードレベルの変更データであってもよい。
【0027】
スレーブのサーバ装置30は、データベースの変更のログを受信する。そして、スレーブのサーバ装置30は、受信したログと同一の変更がされるように、データベースを変更する。なお、スレーブのサーバ装置30が複数存在する場合、マスターのサーバ装置30は、それぞれのスレーブのサーバ装置30との間でレプリケーションを実行する。
【0028】
また、レプリケーションは、同期処理、非同期処理または準同期処理に分けることができる。同期処理では、スレーブのサーバ装置30がデータベースを変更した後に、マスターのサーバ装置30のデータベースを変更する。非同期処理では、マスターのサーバ装置30がデータベースを変更してから、ログをスレーブのサーバ装置30に送信する。準同期処理では、スレーブのサーバ装置30がログを受信したことを確認してから、マスターのサーバ装置30がデータベースを変更する。
【0029】
本実施形態においては、サーバ装置30は、同期処理によりレプリケーションを実行する。しかし、サーバ装置30は、非同期処理または準同期処理によりレプリケーションを実行してもよい。
【0030】
図4は、マスターのサーバ装置30が故障した状態を示す図である。調停装置40は、サービスの運用中において、それぞれのサーバ装置30から定期的にハートビート(正常に動作していることを示すパケット)を受信して、それぞれのサーバ装置30の動作を監視する。調停装置40は、ハートビートが受信できなくなった場合、そのサーバ装置30が故障したと判断する。
【0031】
また、マスターのサーバ装置30が故障している場合、クライアント装置50は、操作情報を送信しても、結果を受信することができない。クライアント装置50は、操作情報を送信してから所定時間を経過しても結果を受信できない場合、フェイルオーバが発生したと判断する。
【0032】
図5は、マスターのサーバ装置30が故障した後の処理の流れを示す図である。マスターのサーバ装置30が故障したと判断した場合、調停装置40は、何れかのスレーブのサーバ装置30をマスターのサーバ装置30に変更するフェイルオーバを実行する。
【0033】
また、クライアント装置50は、操作情報を送信してから所定時間を経過しても結果を受信できないので、フェイルオーバが発生したと判断した場合、調停装置40にマスターのサーバ装置30を問い合わせる。クライアント装置50は、一例として、マスターのサーバ装置30のネットワークアドレス等を回答として取得する。そして、クライアント装置50は、同一の操作情報を、新しいマスターのサーバ装置30に再送信する。
【0034】
図6は、クライアント装置50の構成を示す図である。クライアント装置50は、操作情報生成部51と、識別子生成部52と、操作送信部53と、結果受信部54とを有する。
【0035】
操作情報生成部51は、アプリケーションからデータベースの操作指示を受け付ける。そして、操作情報生成部51は、操作指示に応じた処理をサーバ装置30に実行させるための操作情報を生成する。
【0036】
識別子生成部52は、操作情報生成部51が生成した操作情報毎に、ユニークな識別子を生成する。識別子生成部52は、一例として、UUID(Universally Unique Identifier)等に基づく識別子を生成する。なお、識別子は、サーバ装置30に送信されて、サーバ装置30より少なくとも一定期間保持される。識別子は、サーバ装置30が保持している期間の範囲でユニークであればよい。ここで、一定期間は、マスターのサーバ装置30が故障してから、新たなマスターのサーバ装置30が動作を開始するまでの期間であり、フェイルオーバタイムと呼ぶ。
【0037】
また、識別子生成部52は、他の装置から受信した情報に基づき識別子を生成してもよい。識別子生成部52は、例えば、マスターのサーバ装置30または他の装置から識別子を受信し、受信した識別子を出力してもよい。また、識別子生成部52は、例えば、マスターのサーバ装置30または他の装置から識別子の元となる情報を受信し、受信した情報に基づき識別子を生成してもよい。
【0038】
操作送信部53は、操作情報生成部51により生成された操作情報に、識別子生成部52により生成された識別子を付加する。そして、操作送信部53は、識別子を付加した操作情報をマスターのサーバ装置30に送信する。
【0039】
結果受信部54は、マスターのサーバ装置30から、送信した操作情報に従ったデータベースの操作の結果を受信する。結果受信部54は、成功したことを表す結果を受信した場合、操作情報生成部51に結果を返す。操作情報生成部51は、成功したことを表す結果が返された場合、その結果をアプリケーションに返す。
【0040】
また、結果受信部54は、失敗したことを表す結果を受信した場合、または、操作情報を送信してから所定期間が経過しても結果を受信できない場合(タイムアウトした場合)、その旨を操作送信部53に通知する。この場合、操作送信部53は、調停装置40に新しいマスターのサーバ装置30を問い合わせる。そして、操作送信部53は、問い合わせて得られた新しいマスターのサーバ装置30に対して同一の操作情報を再送信する。この場合において、操作送信部53は、同一の識別子を操作情報に付加する。
【0041】
なお、結果受信部54は、操作送信部53が最初に操作情報を送信してから、フェイルオーバタイムを経過した後も、失敗したことを表す結果を受信するかまたはタイムアウトした場合には、操作情報生成部51に操作情報を再送信させず、失敗したことを表す結果をアプリケーションに返す。
【0042】
図7は、サーバ装置30の構成を示す図である。サーバ装置30は、データ保存部61と、識別子記憶部62と、ログ保存部63と、情報処理部64とを有する。
【0043】
データ保存部61は、データベースを記憶する。データ保存部61は、ハードディスク等の不揮発性の記憶装置であってもよいし、RAM(Random Access Memory)等の揮発性の記憶装置であってもよい。
【0044】
識別子記憶部62は、識別子のリストを記憶する。識別子記憶部62は、RAM等の揮発性の記憶装置である。従って、識別子記憶部62は、サーバ装置30が再起動した場合、記憶している識別子のリストをクリアする。
【0045】
ログ保存部63は、データベースの変更のログを記憶する。ログ保存部63は、ハードディスク等の不揮発性の記憶装置である。従って、ログ保存部63は、サーバ装置30が再起動した場合にも、記憶しているログを記憶し続ける。
【0046】
情報処理部64は、CPU等のプロセッサがプログラムを実行することにより実現される機能ブロックである。情報処理部64は、一部の機能構成がハードウェアにより実現されていてもよい。
【0047】
情報処理部64は、操作受信部71と、操作部72と、ログ処理部73と、第1レプリケーション部74と、結果送信部75と、第2レプリケーション部76と、リカバリ部77とを有する。操作受信部71、操作部72、ログ処理部73、第1レプリケーション部74および結果送信部75は、サーバ装置30をマスターとして動作させるための機能ブロックである。第2レプリケーション部76は、サーバ装置30をスレーブとして動作させるための機能ブロックである。
【0048】
操作受信部71は、クライアント装置50から、識別子が付加された操作情報を受信する。操作部72は、クライアント装置50から受信した操作情報に応じて、データ保存部61からデータベースを読み出して操作する。例えば、操作部72は、クライアント装置50から受信した操作情報に応じて、データ保存部61に記憶されているデータベースを変更する。
【0049】
また、操作部72は、クライアント装置50から受信した操作情報に応じてデータベースを変更する場合、操作情報の識別子を識別子記憶部62に記憶させる。さらに、操作部72は、クライアント装置50から操作情報を受信した場合、クライアント装置50から受信した操作情報の識別子が、識別子記憶部62に記憶されているか否かをチェックする。そして、操作部72は、クライアント装置50から受信した操作情報の識別子が、識別子記憶部62に記憶されている場合、受信した操作情報に応じたデータベースの変更を実行しない。また、操作部72は、現時点から一定時間前の時点より前に受信した操作情報の識別子を、識別子記憶部62から削除する。ここで、一定時間は、フェイルオーバタイムである。
【0050】
ログ処理部73は、操作部72による操作情報に応じたデータベースの変更のログを生成する。そして、ログ処理部73は、操作情報に応じたデータベースの変更のログに、操作情報の識別子を付加する。また、ログ処理部73は、識別子が付加されたログをログ保存部63に記憶させる。
【0051】
第1レプリケーション部74は、スレーブのサーバ装置30との間でレプリケーションを実行する。具体的には、第1レプリケーション部74は、識別子が付加されたログをスレーブのサーバ装置30に送信する。
【0052】
結果送信部75は、操作情報に応じた処理結果をクライアント装置50に送信する。結果送信部75は、例えば、レプリケーションおよび操作情報に応じたデータベースの変更が完了した後に、受信した操作情報に応じた処理が成功したことを表す結果をクライアント装置50に送信する。また、結果送信部75は、例えば、レプリケーション、または、操作情報に応じたデータベースの変更が失敗した場合、受信した操作情報に応じた処理が失敗したことを表す結果をクライアント装置50に送信する。
【0053】
また、結果送信部75は、クライアント装置50から受信した操作情報の識別子が、識別子記憶部62に記憶されている場合、受信した操作情報に応じた処理が成功したことを表す結果をクライアント装置50に送信する。
【0054】
第2レプリケーション部76は、マスターのサーバ装置30との間でレプリケーションを実行する。具体的には、第2レプリケーション部76は、マスターのサーバ装置30から識別子が付加されたログを受信する。続いて、第2レプリケーション部76は、マスターのサーバ装置30から受信したログに応じて、データ保存部61に記憶されているデータベースを変更する。また、第2レプリケーション部76は、ログをログ保存部63に記憶させる。さらに、第2レプリケーション部76は、ログの識別子を識別子記憶部62に記憶させる。
【0055】
リカバリ部77は、サーバ装置30が再起動された場合、ログ保存部63に記憶されたログに基づき、データ保存部61に記憶されたデータベースを復元する。例えば、リカバリ部77は、通常の動作時において、データ保存部61に記憶されたデータベースのイメージを定期的に取得して例えば不揮発性の記憶装置に記憶させる。再起動がされた場合、リカバリ部77は、障害発生点から最も近い時点のデータベースのイメージを読み出してデータ保存部61に記憶させる。続いて、リカバリ部77は、そのイメージを取得した時点から後のログをログ保存部63から読み出し、読み出したログに基づきデータベースを障害発生の直前の時点まで復元する。
【0056】
また、リカバリ部77は、再起動がされてデータベースが復元された場合、ログ保存部63に記憶されたログの識別子に基づき、識別子記憶部62に記憶された識別子のリストを復元する。
【0057】
図8は、クライアント装置50の処理を示すフローチャートである。クライアント装置50は、アプリケーションからデータベースの操作の指示を受けた場合、
図8に示す処理を実行する。
【0058】
まず、クライアント装置50は、操作情報を生成する(ステップS31)。続いて、クライアント装置50は、識別子を生成する(ステップS32)。続いて、クライアント装置50は、操作情報に識別子を付加したメッセージを生成する(ステップS33)。続いて、クライアント装置50は、マスターのサーバ装置30にメッセージを送信する(ステップS34)。
【0059】
続いて、クライアント装置50は、マスターのサーバ装置30から、操作情報に応じた処理が成功したことを表す結果を受信したか否かを判断する(ステップS35)。クライアント装置50は、成功したことを表す結果を受信していない場合(S35のNo)、操作情報を送信してから所定時間を経過してタイムアウトしたか、または、操作情報に応じた処理が失敗したことを表す結果を受信したかを判断する(ステップS36)。クライアント装置50は、タイムアウトもしておらず、失敗したことを表す結果も受信していない場合(S36のNo)、ステップS35に処理を戻して、ステップS35とステップS36の処理を繰り返す。
【0060】
成功したことを表す結果を受信した場合(S35のYes)、クライアント装置50は、アプリケーションにデータベースの操作が成功したことを通知して(ステップS37)、本フローを終了する。
【0061】
タイムアウトまたは失敗したことを表す結果を受信した場合(S36のYes)、クライアント装置50は、最初に操作情報を送信してから、フェイルオーバタイムを経過したか否かを判断する(ステップS38)。フェイルオーバタイムを経過した場合(S38のYes)、クライアント装置50は、アプリケーションにデータベースの操作が失敗したことを通知して(ステップS39)、本フローを終了する。
【0062】
フェイルオーバタイムを経過していない場合(S38のNo)、クライアント装置50は、調停装置40にマスターのサーバ装置30を問い合わせる(ステップS40)。続いて、クライアント装置50は、問い合わせをして得られたマスターのサーバ装置30に、同一のメッセージ、すなわち、同一の識別子が付加された同一の操作情報を送信する(ステップS41)。クライアント装置50は、ステップS41を終えると、処理をステップS35に戻し、処理を繰り返す。
【0063】
図9は、マスターのサーバ装置30の処理を示すフローチャートである。マスターのサーバ装置30は、クライアント装置50からメッセージ(識別子が付加された操作情報)を受信した場合、
図9に示す処理を実行する。
【0064】
まず、操作部72は、識別子記憶部62に記憶されている識別子のリストから、フェイルオーバタイム前の時点より前の識別子を削除する(ステップS51)。これにより、操作部72は、識別子記憶部62から不要な識別子を削除してメモリ容量を効率良く使用することができる。
【0065】
続いて、操作部72は、クライアント装置50から受信した操作情報の識別子が、識別子記憶部62に記憶されているか否かをチェックする(ステップS52)。操作情報の識別子が、識別子記憶部62に記憶されている場合(S52のYes)、操作部72は、何ら処理を実行しない。そして、この場合(S52のYes)、結果送信部75は、受信した操作情報に応じた処理が成功したことを表す結果をクライアント装置50に送信して(ステップS58)、本フローを終了する。
【0066】
受信した操作情報の識別子が識別子記憶部62に記憶されていない場合(S52のNo)、操作部72は、受信した操作情報の識別子を識別子記憶部62に記憶させる(ステップS53)。この場合において、操作部72は、時刻情報を識別子に付加する。時刻は、例えば、操作情報を受信した時刻である。これにより、操作部72は、フェイルオーバタイム前の時点より前に受信した識別子を、識別子記憶部62から削除することができる。
【0067】
続いて、操作部72は、受信した操作情報に応じて、データ保存部61に記憶されたデータベースを操作する(ステップS54)。
【0068】
続いて、ログ処理部73は、データベースの操作によって生じたデータベースの変更のログを生成する(ステップS55)。この場合、ログ処理部73は、データベースの変更のログに、操作情報の識別子を付加する。そして、ログ処理部73は、識別子が付加されたログをログ保存部63に記憶させる。
【0069】
続いて、第1レプリケーション部74は、スレーブのサーバ装置30との間でレプリケーションを実行する(ステップS56)。具体的には、第1レプリケーション部74は、スレーブのサーバ装置30に識別子が付加されたログを送信して、スレーブのサーバ装置30からレプリケーションが成功したことを表す結果を受信する。
【0070】
続いて、操作部72は、データ保存部61に記憶されているデータベースを書き換えて、データベースの操作により生じたデータベースの変更を確定する(ステップS57)。そして、結果送信部75は、操作情報に応じた処理が成功したことを表す結果をクライアント装置50に送信して(ステップS58)、本フローを終了する。
【0071】
なお、ステップS52からステップS58までの何れかの処理が成功しなかった場合、結果送信部75は、操作情報に応じた処理が失敗したことを表す結果をクライアント装置50に送信して、本フローを終了する。この場合、操作部72およびログ処理部73は、実行した処理をロールバックして、データ保存部61およびログ保存部63を操作情報の受信前の状態に戻す。
【0072】
図10は、スレーブのサーバ装置30の処理を示すフローチャートである。スレーブのサーバ装置30は、マスターのサーバ装置30からレプリケーションの実行要求を受信した場合、
図10に示す処理を実行する。
【0073】
まず、第2レプリケーション部76は、マスターのサーバ装置30から識別子が付加されたログを受信する(ステップS61)。続いて、第2レプリケーション部76は、マスターのサーバ装置30から受信したログを、識別子が付加された状態でログ保存部63に記憶させる(ステップS62)。続いて、第2レプリケーション部76は、識別子記憶部62に記憶されている識別子のリストから、フェイルオーバタイム前の時点より前の識別子を削除する(ステップS63)。
【0074】
続いて、第2レプリケーション部76は、マスターのサーバ装置30から受信したログに付加されていた識別子を、識別子記憶部62に記憶させる(ステップS64)。この場合において、第2レプリケーション部76は、時刻情報を識別子に付加する。時刻情報は、例えば、識別子が付加されていた操作情報の受信時刻である。これにより、第2レプリケーション部76は、フェイルオーバタイム前の時点より前に受信した識別子を、識別子記憶部62から削除することができる。
【0075】
続いて、第2レプリケーション部76は、マスターのサーバ装置30から受信したログに応じて、データ保存部61に記憶されているデータベースを変更する(ステップS65)。データベースの変更が成功した場合、第2レプリケーション部76は、マスターのサーバ装置30にレプリケーションが成功したことを表す結果を返信して(ステップS66)、本フローを終了する。
【0076】
図11は、リカバリ時のサーバ装置30の処理を示すフローチャートである。サーバ装置30は、例えば、ネットワークのエラー等により再起動した場合、
図11に示すリカバリ処理を実行する。
【0077】
まず、リカバリ部77は、ログ保存部63から、データベースの変更のログを読み出す(ステップS71)。なお、リカバリ部77は、データ保存部61に記憶されたデータベースのイメージを定期的に取得して例えば不揮発性の記憶装置に記憶させている場合には、最新のデータベースのイメージも読み出す。この場合、リカバリ部77は、最新のデータベースのイメージを取り込んだ時点から後のログを読み出せばよい。
【0078】
続いて、リカバリ部77は、読み出したログに基づき、データ保存部61に記憶されたデータベースを障害発生時の状態に復元する(ステップS72)。リカバリ部77は、一例として、最新のデータベースのイメージをログに基づき順次に更新することにより、データベースを障害発生時の状態に復元する。
【0079】
続いて、リカバリ部77は、ログ保存部63に記憶されたログの識別子に基づき、識別子記憶部62に記憶された識別子のリストを復元する(ステップS73)。そして、ステップS73の処理が完了した場合、リカバリ部77は、本フローを終了する。
【0080】
図12は、データベースの操作時の処理の流れを示す図である。データベースシステム10は、データベースを操作する場合、
図12に示す流れで処理を進める。
【0081】
まず、クライアント装置50は、識別子(例えば#11)を付加した操作情報をマスターのサーバ装置30に送信する(ステップS111)。続いて、マスターのサーバ装置30の情報処理部64は、受信した操作情報の識別子が、識別子記憶部62に記憶されているか否かをチェックする(ステップS112)。操作情報の識別子が、識別子記憶部62に記憶されていない場合、情報処理部64は、受信した操作情報の識別子を識別子記憶部62に記憶させる(ステップS113)。
【0082】
続いて、マスターのサーバ装置30の情報処理部64は、操作情報に応じて、データ保存部61に記憶されたデータベースを操作する(ステップS114)。続いて、マスターのサーバ装置30の情報処理部64は、データベースの変更のログを生成して、ログ保存部63に記憶させる(ステップS115)。この場合、情報処理部64は、ログに操作情報の識別子を付加する。
【0083】
続いて、マスターのサーバ装置30の情報処理部64は、スレーブのサーバ装置30の情報処理部64に、識別子が付加されたログを送信する(ステップS116)。続いて、スレーブのサーバ装置30の情報処理部64は、受信したログを、識別子が付加された状態でログ保存部63に記憶させる(ステップS117)。続いて、スレーブのサーバ装置30の情報処理部64は、受信したログに付加されていた識別子を、識別子記憶部62に記憶させる(ステップS118)。続いて、スレーブのサーバ装置30の情報処理部64は、受信したログに応じて、データ保存部61に記憶されているデータベースを変更する(ステップS119)。そして、スレーブのサーバ装置30の情報処理部64は、マスターのサーバ装置30にレプリケーションが成功したことを表す処理結果を送信する(ステップS120)。
【0084】
続いて、マスターのサーバ装置30の情報処理部64は、データ保存部61内のデータベースに変更内容を書き込むことにより、データベースの操作により生じたデータベースの変更を確定する(ステップS121)。そして、マスターのサーバ装置30の情報処理部64は、操作情報に応じた処理が成功したこと表す結果をクライアント装置50に送信する(ステップS122)。
【0085】
図13は、故障時の処理の流れを示す図である。データベースシステム10は、マスターのサーバ装置30が故障した場合、
図13に示す流れで処理を進める。
【0086】
マスターのサーバ装置30が故障した場合、調停装置40は、何れか1つのスレーブのサーバ装置30を、マスターに変更する(ステップS131)。続いて、クライアント装置50は、識別子(例えば#12)を付加した操作情報を、元のマスターのサーバ装置30に送信する(ステップS132)。しかし、元のマスターのサーバ装置30は、故障しているので、処理結果を返信できない。
【0087】
クライアント装置50は、操作情報を送信してから所定時間が経過することによりタイムアウトすると、調停装置40にマスターのサーバ装置30を問い合わせる(ステップS133)。調停装置40は、クライアント装置50に対して、新たなマスターのサーバ装置30を回答する(ステップS134)。
【0088】
図14は、未処理の操作情報を、スレーブからマスターに変更されたサーバ装置30に再送信した場合の処理の流れを示す図である。クライアント装置50が未処理の操作情報をスレーブからマスターに変更されたサーバ装置30に再送信する場合、データベースシステム10は、
図13の処理に続いて、
図14に示す流れで処理を進める。
【0089】
まず、クライアント装置50は、識別子(例えば#12)を付加した操作情報を、新たなマスターのサーバ装置30に再送信する(ステップS135)。この場合において、クライアント装置50は、元のマスターのサーバ装置30へと送信した操作情報および識別子と同一の操作情報および識別子を再送信する。
【0090】
続いて、新たなマスターのサーバ装置30の情報処理部64は、受信した操作情報の識別子が、識別子記憶部62に記憶されているか否かをチェックする(ステップS136)。本例では、サーバ装置30が未処理であるので、識別子記憶部62は、操作情報の識別子(#12)を記憶していない。
【0091】
続いて、新たなマスターのサーバ装置30の情報処理部64は、受信した操作情報の識別子を識別子記憶部62に記憶させる(ステップS137)。続いて、新たなマスターのサーバ装置30の情報処理部64は、操作情報に応じて、データ保存部61に記憶されたデータベースを操作する(ステップS138)。続いて、新たなマスターのサーバ装置30の情報処理部64は、データベースの変更のログを生成して、ログ保存部63に記憶させる(ステップS139)。
【0092】
続いて、新たなマスターのサーバ装置30の情報処理部64は、データベースの操作により生じたデータベースの変更を確定する(ステップS140)。そして、マスターのサーバ装置30の情報処理部64は、操作情報に応じた処理が成功したことを表す結果をクライアント装置50に送信する(ステップS141)。なお、スレーブのサーバ装置30が設定されている場合には、マスターのサーバ装置30およびスレーブのサーバ装置30は、レプリケーションを実行する。
【0093】
図15は、処理済みの操作情報を、スレーブからマスターに変更されたサーバ装置30に再送信した場合の処理の流れを示す図である。
【0094】
レプリケーションが完了した場合、スレーブのサーバ装置30のデータ保存部61には、操作情報に応じた変更が完了した後のデータベースが記憶されている。また、スレーブのサーバ装置30の識別子記憶部62には、クライアント装置50が送信した操作情報の識別子(例えば#12)が記憶されている。
【0095】
しかし、レプリケーションが完了した後、クライアント装置50に成功の返信をする前に、マスターのサーバ装置30が故障したとする。この場合、クライアント装置50は、新たなマスターのサーバ装置30に、同一の識別子(例えば#12)を付加した同一の操作情報を再送信する(ステップS151)。
【0096】
この場合、元はスレーブであった新たなマスターのサーバ装置30の識別子記憶部62には、操作情報の識別子(#12)が既に記憶されている(ステップS152)。従って、情報処理部64は、データ保存部61に記憶されているデータベースに対しては、何ら処理を実行しない。そして、新たなマスターのサーバ装置30の情報処理部64は、受信した操作情報に応じた処理が成功したことを表す結果をクライアント装置50に送信する(ステップS153)。
【0097】
図16は、マスターのサーバ装置30が再起動して、再度マスターに設定された場合の処理の流れを示す図である。
【0098】
ログの生成および記憶が完了した場合、マスターのサーバ装置30のログ保存部63には、操作情報に応じたデータベースの変更のログが記憶されている。しかし、ログの記憶が完了した後、クライアント装置50に成功したことを表す結果を送信する前に、マスターのサーバ装置30のネットワークが例えば一時的に切断されたとする。この場合、マスターのサーバ装置30は、シャットダウンした後に再起動をする。
【0099】
サーバ装置30の情報処理部64は、再起動をした場合、ログ保存部63に記憶されているログを読み出して、データ保存部61に記憶されているデータベースを再起動直前の状態に復元する(ステップS161)。さらに、サーバ装置30の情報処理部64は、再起動をした場合、ログ保存部63に記憶されているログに付加されている識別子を読み出して、識別子記憶部62に記憶されている識別子のリストを、再起動の直前の状態に復元する(ステップS162)。
【0100】
また、調停装置40は、マスターのサーバ装置30が再起動した場合、再度、マスターおよびスレーブの設定を行う。この場合において、調停装置40は、同一のサーバ装置30をマスターとして設定してもよい。
【0101】
図17は、処理済みの操作情報を、再起動後に再度マスターに設定されたサーバ装置30に再送信した場合の処理の流れを示す図である。
【0102】
例えば、ある識別子(#14)の操作情報に応じたデータベースの変更のログの生成および記憶が完了した場合、マスターのサーバ装置30のログ保存部63には、そのログが記憶されている。また、マスターのサーバ装置30の識別子記憶部62には、クライアント装置50が送信した操作情報の識別子(例えば#14)が記憶されている。
【0103】
しかし、ログの記憶が完了した後、成功したことを表す結果を送信する前に、マスターのサーバ装置30がシャットダウンし、その後、再起動し、再度マスターに設定されたとする。この場合、クライアント装置50は、マスターのサーバ装置30に、同一の識別子(例えば#14)を付加した同一の操作情報を再送信する(ステップS163)。
【0104】
この場合、マスターのサーバ装置30の識別子記憶部62には、操作情報の識別子(#14)が復元により記憶されている(ステップS164)。従って、情報処理部64は、データ保存部61に記憶されているデータベースに対しては、何ら処理を実行しない。そして、マスターのサーバ装置30の情報処理部64は、受信した操作情報に応じた処理が成功したことを表す結果をクライアント装置50に送信する(ステップS165)。
【0105】
以上のように、本実施形態に係るデータベースシステム10によれば、操作情報に付加された識別子をデータベースの変更のログに付加して記憶させておくので、クライアント装置50から同一の操作情報が再送信された場合に重複実行を無くすことができる。例えば、データベースシステム10によれば、サーバ装置30がスレーブからマスターに変更された場合、または、マスターのサーバ装置30が再起動した後に再度マスターに設定された場合であっても、操作情報に付加された識別子をログから復元することができるので、クライアント装置50から同一の操作情報が再送信された場合に重複実行を無くすことができる。
【0106】
図18は、実施形態に係る情報処理装置200のハードウェア構成を示す図である。サーバ装置30、調停装置40およびクライアント装置50は、例えば
図18に示すようなハードウェア構成の情報処理装置200により実現される。
【0107】
この情報処理装置200は、CPU(Central Processing Unit)201と、RAM(Random Access Memory)202と、ROM(Read Only Memory)203と、操作入力装置204と、表示装置205と、記憶装置206と、通信装置207とを備える。そして、これらの各部は、バスにより接続される。
【0108】
CPU201は、プログラムに従って演算処理および制御処理等を実行するプロセッサである。CPU201は、RAM202の所定領域を作業領域として、ROM203および記憶装置206等に記憶されたプログラムとの協働により各種処理を実行する。
【0109】
RAM202は、SDRAM(Synchronous Dynamic Random Access Memory)等のメモリである。RAM202は、CPU201の作業領域として機能する。ROM203は、プログラムおよび各種情報を書き換え不可能に記憶するメモリである。
【0110】
操作入力装置204は、マウスおよびキーボード等の入力デバイスである。操作入力装置204は、ユーザから操作入力された情報を指示信号として受け付け、指示信号をCPU201に出力する。
【0111】
表示装置205は、LCD(Liquid Crystal Display)等の表示デバイスである。表示装置205は、CPU201からの表示信号に基づいて、各種情報を表示する。
【0112】
記憶装置206は、フラッシュメモリ等の半導体による記憶媒体、または、磁気的若しくは光学的に記録可能な記憶媒体等にデータを書き込みおよび読み出しをする装置である。記憶装置206は、CPU201からの制御に応じて、記憶媒体にデータの書き込みおよび読み出しをする。通信装置207は、CPU201からの制御に応じて外部の機器とネットワークを介して通信する。
【0113】
サーバ装置30で実行されるプログラムは、操作受信モジュール、操作モジュール、ログ処理モジュール、第1レプリケーションモジュール、結果送信モジュール、第2レプリケーションモジュールおよびリカバリモジュールを含むモジュール構成となっている。このプログラムは、CPU201(プロセッサ)によりRAM202上に展開して実行されることにより、情報処理装置200を、操作受信部71、操作部72、ログ処理部73、第1レプリケーション部74、結果送信部75、第2レプリケーション部76およびリカバリ部77として機能させる。なお、サーバ装置30は、このような構成に限らず、操作受信部71、操作部72、ログ処理部73、第1レプリケーション部74、結果送信部75、第2レプリケーション部76およびリカバリ部77の少なくとも一部をハードウェア回路(例えば半導体集積回路)により実現した構成であってもよい。
【0114】
クライアント装置50で実行されるプログラムは、操作情報生成モジュール、識別子生成モジュール、操作送信モジュールおよび結果受信モジュールを含むモジュール構成となっている。このプログラムは、CPU201(プロセッサ)によりRAM202上に展開して実行されることにより、情報処理装置200を操作情報生成部51、識別子生成部52、操作送信部53および結果受信部54として機能させる。なお、クライアント装置50は、このような構成に限らず、操作情報生成部51、識別子生成部52、操作送信部53および結果受信部54の少なくとも一部をハードウェア回路(例えば半導体集積回路)により実現した構成であってもよい。
【0115】
また、サーバ装置30またはクライアント装置50で実行されるプログラムは、コンピュータにインストール可能な形式または実行可能な形式のファイルで、CD−ROM、フレキシブルディスク、CD−R、DVD(Digital Versatile Disk)等のコンピュータで読み取り可能な記録媒体に記録されて提供される。
【0116】
また、サーバ装置30またはクライアント装置50で実行されるプログラムを、インターネット等のネットワークに接続されたコンピュータ上に格納し、ネットワーク経由でダウンロードさせることにより提供するように構成してもよい。また、サーバ装置30またはクライアント装置50で実行されるプログラムをインターネット等のネットワーク経由で提供または配布するように構成してもよい。また、サーバ装置30またはクライアント装置50で実行されるプログラムを、ROM等に予め組み込んで提供するように構成してもよい。
【0117】
本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、請求の範囲に記載された発明とその均等の範囲に含まれる。