(58)【調査した分野】(Int.Cl.,DB名)
前記制御部は、2以上のトランザクションに対応する2以上の更新データが前記記憶部に記憶されているとき、前記リストに基づいて前記2以上の更新データについて前記他の情報処理装置に移行する順序を決定する、
請求項1記載の情報処理装置。
前記制御部は、前記2以上のトランザクションのうち一の未移行の更新データに対応する一のトランザクションに属する処理要求が前記情報処理装置で受信されたときは、当該一の未移行の更新データの移行順位を繰り上げる、
請求項2記載の情報処理装置。
前記情報処理装置に対して一のトランザクションに属する第1の処理要求が送信されたときは、前記他の情報処理装置に対して前記第1の処理要求と同じ処理を示す第2の処理要求が送信されており、
前記制御部は、前記1または2以上の更新データの移行を開始した後は、前記情報処理装置で受信された前記第1の処理要求を破棄する、
請求項1乃至3の何れか一項に記載の情報処理装置。
【発明を実施するための形態】
【0019】
以下、本実施の形態について図面を参照して説明する。
[第1の実施の形態]
図1は、第1の実施の形態の情報処理装置を示す図である。
【0020】
第1の実施の形態の情報処理装置10は、冗長構成のデータベースシステムに含まれている。情報処理装置10は、データベース管理システム(DBMS:Database Management System)のプログラムを実行するコンピュータであってもよい。また、情報処理装置10は、他の情報処理装置から処理要求を受け付けるサーバ装置であってもよい。
【0021】
情報処理装置10は、データベース11を管理する。データベース11が関係データベース(RDB:Relational Database)である場合、データベース11は、データレコードを格納する1または2以上のテーブルを含む。データベース11は、HDD(Hard Disk Drive)などの不揮発性の記憶装置またはRAM(Random Access Memory)などの揮発性の記憶装置に格納され得る。この不揮発性または揮発性の記憶装置は、情報処理装置10が備えていてもよいし、情報処理装置10の外部に接続されていてもよい。
【0022】
冗長構成のデータベースシステムには、更に情報処理装置10aが含まれる。情報処理装置10と情報処理装置10aとは、ネットワークを介して通信可能である。情報処理装置10aは、データベース11と同期されて同じ内容のデータを格納することになる冗長なデータベースを管理していてもよい。情報処理装置10がトランザクションを実行する現用系として動作しているとき、情報処理装置10aは、トランザクションを実行しない待機系として動作する。ただし、現用系が情報処理装置10から情報処理装置10aに切り替えられることがある。例えば、情報処理装置10の保守作業が行われるとき、管理者からの指示に応じて、現用系が情報処理装置10aに切り替えられる。
【0023】
情報処理装置10は、記憶部12および制御部13を有する。記憶部12は、HDDなどの不揮発性の記憶装置でもよいし、RAMなどの揮発性の記憶装置でもよい。制御部13は、例えば、プロセッサである。プロセッサは、CPU(Central Processing Unit)やDSP(Digital Signal Processor)であってもよく、ASIC(Application Specific Integrated Circuit)やFPGA(Field Programmable Gate Array)などの特定用途の集積回路を含んでいてもよい。プロセッサは、RAMなどの記憶装置(例えば、記憶部12)に記憶されたプログラムを実行するものであってもよい。また、2以上のプロセッサの集合(マルチプロセッサ)を「プロセッサ」と呼んでもよい。
【0024】
記憶部12は、更新データ15−1,15−2を記憶する。更新データ15−1は、コミットもロールバックもされていない情報処理装置10で実行中のトランザクション14−1(Tr1)に対応し、データベース11に未反映の更新処理の内容を示す。同様に、更新データ15−2は、情報処理装置10で実行中のトランザクション14−2(Tr2)に対応し、データベース11に未反映の更新処理の内容を示す。
【0025】
更新データ15−1は、例えば、データベース11に対して実行する命令、または、データベース11に含まれる更新前のデータと更新後のデータの対応を示す。トランザクション14−1について更新処理を示す処理要求が発生すると、データベース11が更新される代わりに更新データ15−1が生成または更新される。トランザクション14−1についてコミット要求が発生すると、更新データ15−1に基づいてデータベース11が更新される。このとき、2以上のテーブルが纏めて更新されることもある。一方、トランザクション14−1についてロールバック要求が発生すると、更新データ15−1がデータベース11に反映されずに破棄される。同様に、更新データ15−2についても、トランザクション14−2の状態に応じて生成・更新・破棄などが行われる。
【0026】
制御部13は、情報処理装置10で実行中のトランザクション14−1,14−2を示すリスト16を生成する。リスト16は、例えば、トランザクション14−1,14−2の識別情報を含む。トランザクションを実行する現用系が情報処理装置10から情報処理装置10aに切り替わるとき、制御部13は、リスト16のコピーを情報処理装置10aに送信する。リスト16は、現用系の切替が指示されたときに生成してもよいし、切替が指示される前に生成しておいてもよい。後者の場合、例えば、情報処理装置10は、実行中のトランザクションが変化する毎にリスト16を更新して最新状態を維持する。
【0027】
また、制御部13は、現用系が情報処理装置10aに切り替わるとき、リスト16に基づいて更新データ15−1,15−2を情報処理装置10aに移行する。例えば、制御部13は、更新データ15−1,15−2を順次移行していき、各トランザクションの更新データが移行済か否かを、リスト16を用いて管理する。制御部13は、情報処理装置10aに移行する順序をリスト16に基づいて決定してもよい。このとき、制御部13は、トランザクション14−2に属する処理要求を情報処理装置10が受け付けた場合、更新データ15−2の移行順位を繰り上げ、その処理要求に対応する処理を情報処理装置10aに実行させるようにしてもよい。また、制御部13は、情報処理装置10が切替命令を受け付ける前に、トランザクション14−1に属する処理要求を受け付けていた場合、更新データ15−1の移行順位を繰り下げ、その処理要求に対応する処理を情報処理装置10の実行が完了するまでトランザクションの更新データの移行を待たせてもよい。情報処理装置10aも、受信したリスト16のコピーを用いて、各トランザクションの更新データが移行済か否かを管理できる。
【0028】
第1の実施の形態の情報処理装置10によれば、トランザクションを実行する現用系が情報処理装置10aに切り替わるときに、リスト16を用いて、実行中のトランザクション14−1,14−2を情報処理装置10aに引き継ぐことが可能となる。よって、トランザクション14−1,14−2を一旦ロールバックして情報処理装置10aに引き継がない場合と比べて、現用系を切り替えた後に大量の処理要求が情報処理装置10aに集中するのを抑制でき、情報処理装置10aの負荷を低減できる。よって、データベースシステムのレスポンス性能の悪化を抑え、無停止で現用系を切り替えることが可能となる。
【0029】
また、コミット前のトランザクション14−1,14−2の状態を情報処理装置10,10a間で継続的に同期する場合と比べて、現用系を切り替えるときのみ引き継ぎを行えばよく、待機系として動作中の情報処理装置10aの負荷を低減できる。よって、待機系として動作する情報処理装置10aの計算リソース(CPUリソースなど)を、更新を伴わないデータ処理など他の処理に利用でき、計算リソースを有効活用できる。
【0030】
[第2の実施の形態]
図2は、第2の実施の形態のデータベースシステムを示す図である。
第2の実施の形態のデータベースシステムは、データベースを管理するDBサーバを冗長化し、データベースの可用性を向上させたものである。このデータベースシステムは、業務サーバ20,20a、端末装置31およびDBサーバ100,100a,100bを有する。上記の装置は、ネットワーク30に接続されている。
【0031】
業務サーバ20,20aは、業務に用いられるアプリケーションソフトウェアを実行するサーバコンピュータである。データベースを利用するアプリケーションソフトウェアが稼働しているとき、業務サーバ20,20aは、DB100,100a,100bとコネクションを確立しておく。業務サーバ20,20aは、DBサーバ100,100a,100bにメッセージを送信し、何れかのDBサーバから処理結果を受信する。業務サーバ20,20aは、DBサーバ100,100a,100bにとって、データ処理を要求する「DBクライアント」であると言うことができる。なお、ユーザが操作するクライアントコンピュータをDBクライアントとして用いることも可能である。
【0032】
端末装置31は、データベースシステムの管理者が操作するクライアントコンピュータである。管理者は、業務サーバ20,20aを用いた業務サービスを停止させずに、DBサーバ100,100a,100bのうち一部のDBサーバに対して保守作業を行うことがある。保守作業としては、例えば、DBサーバ100,100a,100bで動作するソフトウェアのアップデートやハードウェア部品の交換などが挙げられる。継続的にDBサーバ100,100a,100bのソフトウェアやハードウェアの保守を行うことで、障害発生による業務サービスの異常停止を抑制することができる。
【0033】
保守作業が行われるとき、端末装置31は、業務サーバ20,20aに処理結果を通知する現用状態のDBサーバに対して、現用状態のDBサーバの切替を指示するコマンドを送信する。コマンドに応じて現用状態のDBサーバを切り替えることを、「スイッチオーバ」と言うことがある。スイッチオーバが行われると、切替元のDBサーバは、業務サーバ20,20aとの間のコネクションを切断してDBMSを停止させる。これにより、切替元のDBサーバに対して保守作業を行うことができる。スイッチオーバ後は、切替先のDBサーバが現用状態になり、業務サーバ20,20aに処理結果を通知する。スイッチオーバ中に、ハートビートなどにより異常を検知した場合は、本発明のトランザクションを示すリストを使用したトランザクションの移行をせずに、フェイルオーバーによる移行元から移行先への切り替えを行う。
【0034】
DBサーバ100,100a,100bは、それぞれデータベースを保持するサーバコンピュータである。DBサーバ100,100a,100bのデータベースは、格納されるデータが同じになるように同期されている。DBサーバ100,100a,100bの全てが稼働している場合、1つのDBサーバ(例えば、DBサーバ100)が現用状態であり、他のDBサーバ(例えば、DBサーバ100a,100b)が待機状態である。
【0035】
現用状態のDBサーバは、業務サーバ20,20aからのメッセージに応じてデータ処理を行い、処理結果を業務サーバ20,20aに通知する。現用状態のDBサーバでは、トランザクションが実行され得る。一方、待機状態のDBサーバは、業務サーバ20,20aからメッセージを受信してもデータ処理を行わず、処理結果を業務サーバ20,20aに通知しない。待機状態のDBサーバでは、トランザクションが直接的には実行されない。ただし、現用状態のDBサーバでデータベースが更新されると、待機状態のDBサーバもデータベースを更新し、現用状態のDBサーバのデータベースと同期させる。
【0036】
図3は、DBサーバのハードウェア例を示すブロック図である。
DBサーバ100は、CPU101、RAM102、HDD103、画像信号処理部104、入力信号処理部105、媒体リーダ106および通信インタフェース107を有する。これらのユニットはバスに接続されている。CPU101は、第1の実施の形態の制御部13の一例である。RAM102またはHDD103は、第1の実施の形態の記憶部12の一例である。業務サーバ20,20a、端末装置31およびDBサーバ100a,100bも、DBサーバ100と同様のハードウェアを用いて実現可能である。
【0037】
CPU101は、プログラムの命令を実行する演算回路を含むプロセッサである。CPU101は、HDD103に記憶されているプログラムやデータの少なくとも一部をRAM102にロードし、プログラムを実行する。なお、CPU101は複数のプロセッサコアを備えてもよく、DBサーバ100は複数のプロセッサを備えてもよく、以下で説明する処理を複数のプロセッサまたはプロセッサコアを用いて並列に実行してもよい。また、複数のプロセッサの集合(マルチプロセッサ)を「プロセッサ」と呼んでもよい。
【0038】
RAM102は、CPU101が実行するプログラムやCPU101が演算に用いるデータを一時的に記憶する揮発性の半導体メモリである。なお、DBサーバ100は、RAM以外の種類のメモリを備えてもよく、複数個のメモリを備えてもよい。
【0039】
HDD103は、OS(Operating System)やミドルウェアやアプリケーションソフトウェアなどのソフトウェアのプログラム、および、データを記憶する不揮発性の記憶装置である。なお、DBサーバ100は、フラッシュメモリやSSD(Solid State Drive)などの他の種類の記憶装置を備えてもよく、複数の不揮発性の記憶装置を備えてもよい。
【0040】
画像信号処理部104は、CPU101からの命令に従って、DBサーバ100に接続されたディスプレイ111に画像を出力する。ディスプレイ111としては、CRT(Cathode Ray Tube)ディスプレイ、液晶ディスプレイ(LCD:Liquid Crystal Display)、プラズマディスプレイ(PDP:Plasma Display Panel)、有機EL(OEL:Organic Electro-Luminescence)ディスプレイなどを用いることができる。
【0041】
入力信号処理部105は、DBサーバ100に接続された入力デバイス112から入力信号を取得し、CPU101に出力する。入力デバイス112としては、マウスやタッチパネルやタッチパッドやトラックボールなどのポインティングデバイス、キーボード、リモートコントローラ、ボタンスイッチなどを用いることができる。また、DBサーバ100に、複数の種類の入力デバイスが接続されていてもよい。
【0042】
媒体リーダ106は、記録媒体113に記録されたプログラムやデータを読み取る読み取り装置である。記録媒体113として、例えば、フレキシブルディスク(FD:Flexible Disk)やHDDなどの磁気ディスク、CD(Compact Disc)やDVD(Digital Versatile Disc)などの光ディスク、光磁気ディスク(MO:Magneto-Optical disk)、半導体メモリなどを使用できる。媒体リーダ106は、例えば、記録媒体113から読み取ったプログラムやデータをRAM102またはHDD103に格納する。
【0043】
通信インタフェース107は、ネットワーク30に接続され、ネットワーク30を介して業務サーバ20,20aやDBサーバ100a,100bと通信を行うインタフェースである。通信インタフェース107は、ケーブルで通信装置と接続される有線通信インタフェースでもよいし、基地局と無線で接続される無線通信インタフェースでもよい。
【0044】
なお、DBサーバ100は、媒体リーダ106を備えていなくてもよく、ユーザが操作する端末装置から制御可能である場合には画像信号処理部104や入力信号処理部105を備えていなくてもよい。また、ディスプレイ111や入力デバイス112が、DBサーバ100の筐体と一体に形成されていてもよい。
【0045】
図4は、スイッチオーバを利用した保守作業の例を示す図である。
DBサーバ100は、データベース121とDBMS131を有する。データベース121は、HDD103またはRAM102に保存されている。DBMS131は、例えば、CPU101が実行するミドルウェアとして実装される。同様に、DBサーバ100aはデータベース121aとDBMS131aを有し、DBサーバ100bはデータベース121bとDBMS131bを有する。ここでは、DBサーバ100が現用状態として稼働し、DBサーバ100a,100bが待機状態として稼働しているとする。
【0046】
業務サーバ20は、DBサーバ100,100a,100bそれぞれとコネクションを確立する。DBサーバ100,100a,100bによって管理されるデータにアクセスする場合、業務サーバ20は、検索要求や更新要求などの処理要求を示すメッセージを、DBサーバ100,100a,100bに送信する。待機状態のDBサーバ100a,100bは、業務サーバ20から受信したメッセージを破棄する。一方、現用状態のDBサーバ100は、受信したメッセージに応じて、データベース121からのデータの検索やデータベース121の更新などの処理を行い、処理結果を業務サーバ20に通知する。
【0047】
ここで、DBサーバ100に対して保守作業が行われる場合、端末装置31はDBサーバ100に対して切替命令を送信する。これにより、現用状態のDBサーバ100と1つの待機状態のDBサーバ(ここでは、DBサーバ100a)の間でスイッチオーバが実行される。スイッチオーバ中も、業務サーバ20からDBサーバ100,100a,100bには処理要求が送信され得る。切替元のDBサーバ100は、業務サーバ20から受信したメッセージを破棄するようになる。スイッチオーバに関与しない待機状態のDBサーバ100bは、引き続き業務サーバ20から受信したメッセージを破棄する。一方、切替先のDBサーバ100aは、受信したメッセージに応じた処理を行い、処理結果を業務サーバ20に通知するようになる。なお、後述するように、切替元のDBサーバ100で実行中であったトランザクションは、切替先のDBサーバ100aに引き継がれる。
【0048】
DBサーバ100からDBサーバ100aへのスイッチオーバが完了すると、切替元のDBサーバ100は、業務サーバ20との間のコネクションを切断し、DBMS131を停止させる。これにより、DBサーバ100は停止状態に遷移し、保守作業を行うことが可能となる。切替先のDBサーバ100aは、現用状態に遷移する。DBサーバ100の保守作業が終わると、DBMS131を起動させ、DBサーバ100を待機状態としてデータベースシステムに再び組み込むことが可能である。スイッチオーバによって現用状態のDBサーバを次々と切り替えていくことで、DBサーバ100,100a,100bに対して順に保守作業を行うことができる。このような方法で複数のコンピュータのソフトウェアおよびハードウェアをアップデートすることを「ローリングアップデート」と言うことがある。
【0049】
次に、コネクションとトランザクションの関係について説明する。
図5は、コネクションとトランザクションの例を示す図である。
業務サーバ20は、業務サーバ20上でのアプリケーションソフトウェアの実行状況に応じて、DBサーバ100,100a,100bそれぞれとの間に1または2以上のコネクションを確立する。業務サーバ20は、異なるアプリケーションソフトウェアからの要求に応じて、同一のDBサーバとの間に複数のコネクションを確立することがある。
【0050】
例えば、業務サーバ20は、DBサーバ100との間にコネクション#11,#13を確立し、DBサーバ100aとの間にコネクション#21,#23を確立する。各コネクションの識別情報として、コネクション#11にはセッションID=Aが付与され、コネクション#13にはセッションID=Cが付与される。これに対し、コネクション#21にはコネクション#11と同じセッションID=Aが付与され、コネクション#23にはコネクション#13と同じセッションID=Cが付与される。
【0051】
DBサーバの異なる2つのコネクションに同じセッションIDが付与されるのは、要求元の業務サーバやアプリケーションソフトウェアが同じであり、且つ、同じDBMSプログラムに従ってDBサーバ100,100aがセッションIDを決定するためである。同様に、例えば、業務サーバ20aは、DBサーバ100との間にコネクション#12を確立し、DBサーバ100aとの間にコネクション#22を確立する。各コネクションの識別情報として、コネクション#12にはセッションID=Bが付与され、コネクション#22にはコネクション#12と同じセッションID=Bが付与される。
【0052】
業務サーバ20,20aおよびDBサーバ100,100a,100bは、異なるタイミングで送信される複数の処理要求に応じた一連の更新処理を、1つのトランザクションとして扱うことがある。業務サーバ20,20aおよびDBサーバ100,100a,100bは、1つのセッションIDにつき同時に1つのトランザクションのみ発生させることができる。あるトランザクションがコミットまたはロールバックによって終了すると、同じコネクション上で次のトランザクションを発生させることが可能である。
【0053】
例えば、業務サーバ20は、更新要求をコネクション#11上で送信し、同じ内容の更新要求をコネクション#21上で送信する。DBサーバ100は、コネクション#11上で更新要求を受信し、トランザクションIDを付与してトランザクション#1を発生させる。一方、DBサーバ100aは、コネクション#21で受信した更新要求を破棄する。以降、業務サーバ20は、トランザクション#1に属する処理要求をコネクション#11上で送信し、同じ内容の処理要求をコネクション#21上で送信する。業務サーバ20は、更新内容をデータベースに反映させる場合はコミット要求を送信し、取り消す場合はロールバック要求を送信する。これにより、トランザクション#1が終了する。
【0054】
トランザクション#1が終了した後、業務サーバ20は、コネクション#11上でトランザクション#4に属する処理要求を送信することができる。このとき、業務サーバ20は、同じ内容の処理要求をコネクション#21上で送信する。また、例えば、業務サーバ20は、トランザクション#1と並行して、コネクション#13上でトランザクション#3に属する処理要求を送信する。このとき、業務サーバ20は、同じ内容の処理要求をコネクション#23上で送信する。また、業務サーバ20aは、トランザクション#1と並行して、コネクション#12上でトランザクション#2に属する処理要求を送信する。このとき、業務サーバ20aは、同じ内容の処理要求をコネクション#22上で送信する。
【0055】
次に、DBサーバ100,100a,100bによるトランザクションの制御と、スイッチオーバ中のトランザクションの引き継ぎについて説明する。
図6は、トランザクション処理例を示す第1の図である。
【0056】
トランザクション#0を発生させるような処理要求を業務サーバ20がDBサーバ100,100a,100bに送信すると、現用状態のDBサーバ100は、更新するデータの取得などデータベース121を更新する前までの処理を実行する。そして、DBサーバ100は、更新内容などトランザクション#0の状態を示すトランザクションログ150を生成して保持する。また、DBサーバ100は、DBサーバ100が保持する移行リスト141にトランザクション#0を登録し、その移行状態を「未移行」に設定する。一方、待機状態のDBサーバ100a,100bは、業務サーバ20から受信した処理要求を破棄する。なお、
図6〜9では、DBサーバ100bの動作の記載を省略している。
【0057】
その後、業務サーバ20がトランザクション#0のコミット要求をDBサーバ100,100a,100bに送信すると、DBサーバ100は、トランザクションログ150が示す更新内容をデータベース121に反映させる。また、DBサーバ100は、トランザクションログ150のコピーであるトランザクションログ150aを、待機状態のDBサーバ100a,100bに送信する。DBサーバ100aは、業務サーバ20から受信したコミット要求を破棄し、DBサーバ100から受信したトランザクションログ150aが示す更新内容をデータベース121aに反映させる。DBサーバ100bも、DBサーバ100aと同様の処理を行う。そして、DBサーバ100は、トランザクションログ150を削除し、移行リスト141からトランザクション#0の情報を消去する。
【0058】
図7は、トランザクション処理例を示す第2の図である。
ここでは、
図5で説明したトランザクション#1,#2,#3がDBサーバ100で実行中であるとする。DBサーバ100は、トランザクション#1に対応するトランザクションログ151と、トランザクション#2に対応するトランザクションログ152と、トランザクション#3に対応するトランザクションログ153を有する。また、DBサーバ100が有する移行リスト141には、トランザクション#1,#2,#3が登録されており、各トランザクションの移行状態が「未移行」に設定されている。
【0059】
このとき、端末装置31がDBサーバ100に切替命令を送信したとする。すると、DBサーバ100からDBサーバ100aへのスイッチオーバが行われる。切替元のDBサーバ100は、移行リスト141のコピーである移行リスト141aをDBサーバ100aに送信する。その後、DBサーバ100は、移行リスト141に従って、トランザクションログ151,152,153を1つずつDBサーバ100aに送信していく。送信順序は、例えば、トランザクションが移行リスト141に登録された順(発生タイミングが早い順)とする。ただし、任意の順序で送信するようにしてもよい。
【0060】
例えば、DBサーバ100は、移行リスト141の先頭に登録されているトランザクション#1を最初に選択する。すると、DBサーバ100は、トランザクション#1に対応するトランザクションログ151のコピーであるトランザクションログ151aを、DBサーバ100aに送信する。DBサーバ100は、移行リスト141に記載されたトランザクション#1の移行状態を「移行済」に更新し、DBサーバ100aは、移行リスト141aに記載されたトランザクション#1の移行状態を「移行済」に更新する。
【0061】
図8は、トランザクション処理例を示す第3の図である。
スイッチオーバ中であっても、DBサーバ100,100a,100bは、業務サーバ20,20aから処理要求を受信する可能性がある。前述のようにトランザクション#1がDBサーバ100からDBサーバ100aに引き継がれた後、業務サーバ20がトランザクション#1に属する処理要求をDBサーバ100,100a,100bに送信したとする。切替元のDBサーバ100は、この処理要求を破棄する。切替先のDBサーバ100aは、移行リスト141aを参照して、トランザクション#1の移行状態が「移行済」であることを検知する。すると、DBサーバ100aは、DBサーバ100から受信したトランザクションログ151aを用いて、トランザクション#1の処理を進める。なお、DBサーバ100bは、業務サーバ20から受信した処理要求を破棄する。
【0062】
次に、業務サーバ20がトランザクション#3に属する処理要求をDBサーバ100,100a,100bに送信したとする。DBサーバ100は、この処理要求を破棄する。また、DBサーバ100は、移行リスト141を参照して、トランザクション#3の移行状態が「未移行」であることを検知する。すると、DBサーバ100は、トランザクション#3に対応するトランザクションログ153の移行順位が早くなるように、移行リスト141を更新する。DBサーバ100aは、移行リスト141aを参照して、トランザクション#3の移行状態が「未移行」であることを検知する。すると、DBサーバ100aは、処理要求をバッファに格納して、移行状態が「移行済」になるのを待つ。なお、DBサーバ100bは、業務サーバ20から受信した処理要求を破棄する。
【0063】
図9は、トランザクション処理例を示す第4の図である。
トランザクション#3の移行順位が繰り上がることで、DBサーバ100は、次にトランザクション#2をスキップしてトランザクション#3を選択する。トランザクション#3は、例えば、移行リスト141の中で、最も前方に登録されている「未移行」のトランザクションである。すると、DBサーバ100は、トランザクション#3に対応するトランザクションログ153のコピーであるトランザクションログ153aを、DBサーバ100aに送信する。DBサーバ100は、移行リスト141に記載されたトランザクション#3の移行状態を「移行済」に更新し、DBサーバ100aは、移行リスト141aに記載されたトランザクション#3の移行状態を「移行済」に更新する。
【0064】
DBサーバ100aは、トランザクション#3の移行状態が「移行済」に変わったことを検知すると、バッファからトランザクション#3の処理要求を取り出す。DBサーバ100aは、トランザクション#3に対応するトランザクションログ153aを用いて、その処理要求に応じた処理を実行し、業務サーバ20に処理結果を通知する。このように、スイッチオーバが開始されると、業務サーバ20からのメッセージは切替先のDBサーバ100aによって処理され、DBサーバ100aから業務サーバ20に処理結果が通知される。このとき、当該メッセージが未移行のトランザクションに属するものである場合、切替元のDBサーバ100はそのトランザクションの移行順位を繰り上げ、DBサーバ100aはそのトランザクションが移行されてからメッセージを処理する。
【0065】
次に、DBサーバ100の機能およびDBサーバ100が実行する処理について説明する。DBサーバ100a,100bも、同様の機能を有し同様の処理を行う。
図10は、業務サーバとDBサーバの機能例を示すブロック図である。
【0066】
業務サーバ20は、プログラム記憶部21、ユーザプログラム制御部22、DBアクセス部23および通信制御部24を有する。プログラム記憶部21は、例えば、業務サーバ20が備えるRAMまたはHDDに確保した記憶領域として実現される。ユーザプログラム制御部22、DBアクセス部23および通信制御部24は、例えば、業務サーバ20が実行するソフトウェアのモジュールとして実現される。
【0067】
プログラム記憶部21は、ユーザが作成したアプリケーションソフトウェアのプログラム(ユーザプログラム)を記憶する。ユーザプログラムが起動すると、ユーザプログラムの実行インスタンスである「プロセス」が生成される。ユーザプログラムの中には、1つのプロセスの中で、並行して実行可能な1または2以上の「スレッド」を生成するものもある。また、ユーザプログラムの中には、データベースとの間のコネクションを生成するよう要求し、そのコネクションを指定して処理要求を出力するものもある。データベースとの間のコネクションは、スレッド毎に生成することが可能である。
【0068】
ユーザプログラム制御部22は、プログラム記憶部21に記憶されたユーザプログラムを起動し、業務サーバ20におけるユーザプログラムの実行を制御する。
DBアクセス部23は、ユーザプログラム制御部22によって起動されたプロセスまたはスレッドからの要求に応じて、データベースへのアクセスを実行する。コネクションの確立が要求された場合、DBアクセス部23は、3つのコネクション要求を生成してDBサーバ100,100a,100b宛てのメッセージとして出力する。複数のサーバへコネクションを確立する要求を生成するときは、1つのコネクション要求を生成して、マルチキャストに対応したネットワーク機器を使用して、DBサーバ100,100a,100b宛てのメッセージとして出力してもよい。データベースの検索や更新などが要求された場合、DBアクセス部23は、3つの処理要求を生成してDBサーバ100,100a,100b宛てのメッセージとして出力する。トランザクションのコミットまたはロールバックが要求された場合、DBアクセス部23は、3つのコミット要求またはロールバック要求を生成してDBサーバ100,100a,100b宛てのメッセージとして出力する。また、DBアクセス部23は、何れかのDBサーバから結果通知を受け取ると、その結果通知が指定するプロセスまたはスレッドに渡す。
【0069】
通信制御部24は、ネットワーク30を介した通信を制御する。通信制御部24は、DBアクセス部23からメッセージを受け付け、DBアクセス部23から指定されたDBサーバにそのメッセージを送信する。また、通信制御部24は、何れかのDBサーバから結果通知を受信し、受信した結果通知をDBアクセス部23に渡す。
【0070】
DBサーバ100は、データベース121、ログ記憶部122、サーバ情報記憶部123、移行リスト記憶部124、メッセージバッファ125、DBMS131および通信制御部135を有する。ログ記憶部122、サーバ情報記憶部123、移行リスト記憶部124およびメッセージバッファ125は、例えば、RAM102またはHDD103に確保した記憶領域として実現される。通信制御部135は、例えば、DBサーバ100が実行するソフトウェアのモジュールとして実現される。
【0071】
データベース121は、前述のように、データを記憶する。データベース121が関係データベース(RDB)である場合、データベース121は、1または2以上のテーブルを記憶する。データベース121は、データ構造の定義情報を記憶していてもよい。
【0072】
ログ記憶部122は、
図6のトランザクションログ150や
図7のトランザクションログ151〜153などのトランザクションログを記憶する。1つのトランザクションログは、1つのトランザクションに対応し、当該トランザクションの状態を示す。各トランザクションログは、処理要求を受け付けたコネクションを示すセッションIDや、データベースに未反映の更新内容を示す更新データなどを含んでいる。
【0073】
サーバ情報記憶部123は、DBサーバ100を起動するときに参照される設定ファイルを記憶する。設定ファイルは、ユーザによって作成される。設定ファイルには、現用状態のDBサーバを決定するときに用いられる情報が記載される。
【0074】
移行リスト記憶部124は、
図6の移行リスト141を記憶する。前述のように、移行リスト141は、DBサーバ100において実行中のトランザクションを示す。移行リスト141は、トランザクションの生成や終了に応じて更新され、また、スイッチオーバ中に他のDBサーバにトランザクションを移行するときに参照される。
【0075】
メッセージバッファ125は、業務サーバ20,20aから受信したメッセージのうち、すぐに処理できないメッセージを一時的に記憶する。例えば、メッセージバッファ125は、
図8のトランザクション#3に属する処理要求を記憶する。
【0076】
DBMS131は、業務サーバ20,20aからメッセージを受け付け、データベース121へのアクセスを制御する。また、DBMS131は、データベース121と他のDBサーバのデータベースとの間の同期を制御する。DBMS131は、クラスタ制御部132、切替部133およびメッセージ処理部134を有する。
【0077】
クラスタ制御部132は、サーバ情報記憶部123に記憶された設定ファイルを参照して、DBMS131の起動処理を行う。また、クラスタ制御部132は、他のDBサーバの稼働状況を監視し、他のDBサーバの稼働状況に応じてDBサーバ100の状態(現用状態、待機状態または停止状態)を決定する。また、クラスタ制御部132は、端末装置31からコマンドを受け付け、コマンドに応じてDBサーバ100の状態を決定する。ただし、スイッチオーバを示すコマンドである切替命令は、端末装置31から切替命令を受信した他のDBサーバ経由で転送されることもある。切替命令を受け付けた場合は、クラスタ制御部132は、切替命令を切替部133に出力する。
【0078】
切替部133は、クラスタ制御部132から切替命令を取得すると、トランザクションの引き継ぎを制御する。DBサーバ100が現用状態の場合、DBサーバ100はトランザクションを引き渡す切替元になり得る。DBサーバ100が待機状態の場合、DBサーバ100はトランザクションを受け入れる切替先になり得る。DBサーバ100が切替元である場合、切替部133は、移行リスト記憶部124に記憶された移行リスト141を参照して、ログ記憶部122に格納されたトランザクションログを切替先のDBサーバに順次送信していく。DBサーバ100が切替先である場合、切替部133は、切替元から移行リスト141を取得して移行リスト記憶部124に保存し、移行リスト141を参照して、切替元からトランザクションログを順次取得しログ記憶部122に保存する。
【0079】
メッセージ処理部134は、業務サーバ20,20aから、検索要求・更新要求・コミット要求・ロールバック要求などのメッセージを取得する。DBサーバ100が待機状態である場合、メッセージ処理部134は、取得したメッセージを破棄し、要求されている処理を行わない。DBサーバ100が現用状態である場合、メッセージ処理部134は、取得したメッセージに応じた処理を行い、処理結果をメッセージの送信元に通知する。
【0080】
ここで、更新要求によって新たなトランザクションが発生する場合、メッセージ処理部134は、そのトランザクションに対応するトランザクションログを生成してログ記憶部122に格納する。トランザクションに属する更新要求に対しては、メッセージ処理部134は、更新内容をデータベース121に反映させずにトランザクションログに記載しておく。その後、コミット要求を取得した場合、メッセージ処理部134は、ログ記憶部122に記憶されたトランザクションログに基づいてデータベース121を更新する。ロールバック要求を取得した場合、メッセージ処理部134は、ログ記憶部122に記憶されたトランザクションログを破棄することで、トランザクションの更新処理を取り消す。
【0081】
ただし、DBサーバ100がスイッチオーバの切替先である場合、メッセージ処理部134は、業務サーバ20,20aから取得するメッセージを切替元のDBサーバに代わって処理する。移行済のトランザクションに関するメッセージを取得した場合、メッセージ処理部134は、ログ記憶部122に格納された当該トランザクションに対応するトランザクションログを用いてメッセージを処理する。未移行のトランザクションに関するメッセージを取得した場合、メッセージ処理部134は、そのメッセージをメッセージバッファ125に一時的に保存し、当該トランザクションが移行されるのを待つ。
【0082】
通信制御部135は、ネットワーク30を介した通信を制御する。通信制御部135は、業務サーバ20,20aからメッセージを受信し、受信したメッセージをメッセージ処理部134に渡す。また、通信制御部135は、メッセージ処理部134から処理結果を受け付け、メッセージに対する応答として業務サーバ20,20aに送信する。また、通信制御部135は、端末装置31からコマンドを受信し、受信したコマンドをクラスタ制御部132に渡す。また、通信制御部135は、DBサーバ100a,100bとの間で、トランザクションログ、移行リスト141、コマンドなどを送受信する。
【0083】
図11は、設定ファイルの例を示す図である。
設定ファイル142は、上記のサーバ情報記憶部123に記憶されている。設定ファイル142には、パラメータと値の組が記載される。設定ファイル142に記載されるパラメータには、ClusterServersおよびStartupTimerが含まれる。
【0084】
パラメータClusterServersは、クラスタシステムに参加している複数のDBサーバを示す。パラメータClusterServersの値として、DBサーバを識別するサーバIDが列挙される。サーバIDは、優先度の高いサーバの順に列挙しておく。正常に稼働している(生存している)DBサーバのうち、最も優先度が高いものが現用状態として動作する。
【0085】
パラメータStartupTimerは、生存確認メッセージに対する応答の最大待ち時間を示す。パラメータStartupTimerの値として、待ち時間の閾値である秒数が与えられる。DBMS131が起動すると、DBサーバ100の状態を決定するため、DBサーバ100は他のDBサーバに生存確認メッセージを送信する。DBサーバ100は、生存確認メッセージを送信してからStartupTimer秒経過する前に応答があったDBサーバを、生存していると判定する。一方、DBサーバ100は、生存確認メッセージを送信してからStartupTimer秒経過しても応答がないDBサーバを、生存していないと判定する。
【0086】
図12は、生存サーバリストの例を示す図である。
生存サーバリスト143は、DBMS131が起動したときに生成され、上記のサーバ情報記憶部123に格納される。生存サーバリスト143は、サーバID、IP(Internet Protocol)アドレス、ポート番号および優先度の項目を含む。
【0087】
サーバIDの項目には、生存を判断できたDBサーバ(DBサーバ100自身を含む)を識別するサーバIDが登録される。サーバIDは、各DBサーバに対して予め指定されている。例えば、DBサーバ100のサーバIDがSV1、DBサーバ100aのサーバIDがSV2、DBサーバ100bのサーバIDがSV3である。IPアドレスの項目には、生存を判断できたDBサーバが使用しているIPアドレスが登録される。ポート番号の項目には、生存を判断できたDBサーバがDBサーバ間のメッセージ通信に使用しているポート番号が登録される。優先度の項目には、生存を判断できたDBサーバの優先度が登録される。優先度は、設定ファイル142から判断できる。
図12の例では、「1」が最も優先度が高く、「2」「3」はそれよりも優先度が低いことを示している。
【0088】
図13は、メッセージの例を示す図である。
メッセージ144は、業務サーバ20からDBサーバ100,100a,100bに送信され得る。メッセージ144は、クライアントID、クライアントIPアドレス、クライアントポート番号、クライアントプロセスID、クライアントスレッドID、セッションID、要求時刻、要求種別、対象リソースおよび入力データの項目を含む。
【0089】
クライアントIDの項目には、送信元の業務サーバの識別情報が登録される。クライアントIDは、各業務サーバに対して予め指定されている。クライアントIPアドレスの項目には、送信元の業務サーバが使用しているIPアドレスが登録される。クライアントポート番号の項目には、メッセージ144の送信に用いた送信元ポート番号が登録される。クライアントプロセスIDの項目には、メッセージ144の送信を指示したプロセスを識別するプロセスIDが登録される。クライアントスレッドIDの項目には、メッセージ144の送信を指示したスレッドを識別するスレッドIDが登録される。セッションIDの項目には、メッセージ144の送信に用いるコネクションの識別情報が登録される。
【0090】
なお、セッションIDは、コネクション確立時に、クライアントID・クライアントIPアドレス・クライアントポート番号・クライアントプロセスID・クライアントスレッドIDから、所定のアルゴリズムに従って生成される。このため、同じスレッドがDBサーバ100,100a,100bそれぞれとコネクションを確立した場合、これら3つのコネクションに付与されるセッションIDは同一となる。
【0091】
要求時刻の項目には、送信元の業務サーバが付与するタイムスタンプとして、メッセージ144の生成時刻が登録される。要求種別の項目には、処理の種別が登録される。例えば、要求種別として、データ検索を示す「SELECT」、データ挿入を示す「INSERT」、データ書換を示す「UPDATE」、データ消去を示す「DELETE」などが挙げられる。対象リソースの項目には、データベース名・スキーマ名・テーブル名・パーティション名など、処理対象のデータ領域を示す名称が登録される。入力データの項目には、検索条件・カーソル名など、処理対象のデータを特定するための情報が登録される。
【0092】
DBサーバ100から業務サーバ20に返信される結果通知としてのメッセージも、メッセージ144と同様の項目を含み得る。ただし、結果通知のメッセージは、入力データの項目に代えて、出力データの項目を含む。出力データの項目には、メッセージ144に応じて実行された処理の結果が登録される。検索要求に対する応答の場合、検索されたデータが出力データに含まれる。更新要求に対する応答の場合、更新の成否を示す情報や書換または挿入されたレコードの行を示す情報が出力データに含まれる。
【0093】
図14は、トランザクションログの例を示す図である。
トランザクションログ151は、トランザクションが発生したときに生成され、上記のログ記憶部122に格納される。トランザクションログ151は、トランザクションID、クライアントID、クライアントIPアドレス、クライアントポート番号、セッションID、開始時刻、トランザクション状態、トランザクション種別、対象リソース、排他競合相手、カーソル状態、カーソル位置および更新データの項目を含む。
【0094】
トランザクションIDの項目には、新たなトランザクションが発生したときに付与される識別情報が登録される。新たなトランザクションは、例えば、何れのトランザクションにも属さない更新要求をDBサーバ100が処理したときに発生し得る。クライアントID・クライアントIPアドレス・クライアントポート番号・セッションIDの項目には、トランザクションが発生する契機となったメッセージに記載されたものが登録される。
【0095】
開始時刻の項目には、DBサーバ100が付与するタイムスタンプとして、トランザクションの発生時刻が登録される。トランザクション状態の項目には、トランザクションが次の処理要求などを待っているとき、「CONTINUE」が設定される。トランザクション種別の項目には、読み込み専用(ReadOnly)または読み書き可能(ReadWrite)が設定される。トランザクション種別は、トランザクション開始時に業務サーバ20,20aから指定されることがある。対象リソースの項目には、データベース名・スキーマ名・テーブル名・パーティション名などのデータ領域を示す名称が登録される。
【0096】
排他競合相手の項目には、トランザクションが他のトランザクションと同じリソースにアクセスしようとし、そのリソースの排他ロックが解放されるのを待っているとき、競合する他のトランザクションを特定する情報が登録される。例えば、排他競合相手の情報には、セッションIDとクライアントIDが含まれる。カーソル状態の項目には、処理対象のデータを特定するためにカーソルが使用されているとき、「OPEN」が設定される。カーソル位置の項目には、テーブル内のカーソルが指している行の番号が登録される。
【0097】
更新データの項目には、データベース121に未反映の更新内容が登録される。更新データには、例えば、テーブル名・更新する列(カラム)の名称・更新前のデータ・更新後のデータが含まれる。DBサーバ100は、更新要求を受信すると、更新対象の取得などデータベース121を更新する直前までの処理を行い、データベース121を更新せずに更新データをトランザクションログ151に登録しておく。その後、コミット要求を受信すると、DBサーバ100は、更新データに従ってデータベース121を更新する。
【0098】
図15は、移行リストの例を示す図である。
移行リスト141は、上記の移行リスト記憶部124に記憶されている。移行リスト141は、トランザクションID、セッションID、クライアントID、IPアドレス、ポート番号および移行状態の項目を含む。トランザクションIDの項目には、トランザクション発生時に生成された識別情報が登録される。セッションID・クライアントID・IPアドレス・ポート番号の項目には、トランザクションログと同様の情報が登録される。移行状態の項目には、トランザクションが移行されたか否かを示す値として、「0」(未移行)と「1」(移行中)と「2」(移行済)の何れかが登録される。
【0099】
新たに発生したトランザクションの移行状態の初期値は「0」(未移行)である。DBサーバ100がスイッチオーバの切替元である場合、トランザクションログを切替先のDBサーバに送信すると、そのトランザクションログに対応するトランザクションの移行状態が「1」(移行中)になる。その後、切替先のDBサーバから応答があると、移行状態が「2」(移行済)になる。DBサーバ100がスイッチオーバの切替先である場合、トランザクションログを切替元のDBサーバから受信すると、そのトランザクションログに対応するトランザクションの移行状態が「2」(移行済)になる。
【0100】
図16は、DBサーバ起動の手順例を示すフローチャートである。
(S100)クラスタ制御部132は、DBMS131が起動すると、DBサーバ100の初期状態を待機状態に設定する。(S101)クラスタ制御部132は、サーバ情報記憶部123に記憶された設定ファイル142のパラメータClusterServersを参照し、クラスタシステムに参加する他のDBサーバに生存確認メッセージを送信する。このとき、クラスタ制御部132は、生存確認メッセージの送信時刻を保持しておく。
【0101】
(S102)クラスタ制御部132は、生存確認メッセージを送信してからの経過時間が、設定ファイル142のパラメータStartupTimerの値(閾値)を超えたか判断する。経過時間が閾値を超えた場合はステップS107に処理が進み、閾値を超えていない場合はステップS103に処理が進む。(S103)クラスタ制御部132は、生存確認メッセージの送信先の何れかのDBサーバから、応答メッセージを受信したか確認する。応答メッセージを受信した場合はステップS105に処理が進み、受信していない場合はステップS104に処理が進む。(S104)クラスタ制御部132は、一定時間(例えば、100ms。または、設定ファイル142にパラメータを追加して、その値を使用してもよい)待機する。その後、処理がステップS102に進む。
【0102】
(S105)クラスタ制御部132は、応答メッセージの送信元のDBサーバを生存サーバリスト143に登録する。なお、DBサーバ100自身も生存サーバリスト143に登録される。(S106)クラスタ制御部132は、生存確認メッセージの送信先のDBサーバ全てから応答メッセージを受信したか判断する。全てのDBサーバから応答メッセージを受信した場合はステップS107に処理が進み、応答メッセージを受信していないDBサーバがある場合はステップS102に処理が進む。
【0103】
(S107)クラスタ制御部132は、生存サーバリスト143に登録された生存している(DBMSが正常に稼働している)DBサーバの中で、DBサーバ100の優先度が最も高いか判断する。DBサーバ100の優先度が最も高い場合はステップS108に処理が進み、それ以外の場合はステップS109に処理が進む。(S108)クラスタ制御部132は、DBサーバ100の状態を待機状態から現用状態に遷移させる。
【0104】
図17は、DBサーバ起動の手順例を示すフローチャート(続き)である。
(S109)クラスタ制御部132は、生存サーバリスト143に登録された生存サーバの数を保持する。また、クラスタ制御部132は、カウンタn=1に初期化する。(S110)クラスタ制御部132は、生存サーバリスト143に登録されたn番目のDBサーバに対する被監視スレッドを起動する。被監視スレッドの処理は後述する。(S111)クラスタ制御部132は、生存サーバリスト143に登録されたn番目のDBサーバに対する監視スレッドを起動する。監視スレッドの処理は後述する。
【0105】
(S112)クラスタ制御部132は、カウンタnをインクリメント(1だけ加算)する。(S113)クラスタ制御部132は、カウンタnの値がステップS109で保持した生存サーバ数より大きいか判断する。条件を満たす場合、生存サーバリスト143に登録された全てのDBサーバを選択したため、ステップS114に処理が進む。条件を満たさない場合、生存している未選択のDBサーバがあるため、ステップS110に処理が進む。(S114)クラスタ制御部132は、コマンド受信スレッドを起動する。コマンド受信スレッドの処理は後述する。(S115)クラスタ制御部132は、メッセージ受信スレッドを起動する。メッセージ受信スレッドの処理は後述する。
【0106】
なお、上記の被監視スレッド・監視スレッド・コマンド受信スレッド・メッセージ受信スレッドは、並行して実行することができる。被監視スレッド・監視スレッド・コマンド受信スレッド・メッセージ受信スレッドは、任意の順序で起動してよい。
【0107】
図18は、生存被監視の手順例を示すフローチャートである。
この生存被監視の処理は、上記の被監視スレッドの中で実行される。
(S120)クラスタ制御部132は、DBサーバ100の停止フラグがONであるか判断する。停止フラグは、DBMS131が停止しようとしているか否かを示すフラグである。DBMS131が起動したときの停止フラグの初期値はOFFであり、後述するタイミングで停止フラグがOFFからONに変化する。停止フラグがONの場合、他のDBサーバがDBサーバ100の生存を判断しなくてよいため、生存被監視の処理が終了する。停止フラグがOFFの場合、ステップS121に処理が進む。
【0108】
(S121)クラスタ制御部132は、上記のステップS110で指定された相手のDBサーバが現用状態または待機状態に安定しているか判断する。現用状態と待機状態以外の状態としては、例えば、DBMSが停止している停止状態が挙げられる。条件を満たす場合はステップS122に処理が進み、条件を満たさない場合はステップS123に処理が進む。(S122)クラスタ制御部132は、指定された相手のDBサーバに対して生存確認メッセージを送信する。生存確認メッセージは、例えば、設定ファイル142に記載されたサーバIDに基づいて生成される。(S123)クラスタ制御部132は、一定時間(例えば、1000ms。または、設定ファイル142にパラメータを追加して、その値を使用してもよい)待機する。その後、ステップS120に処理が進む。
【0109】
図19は、生存監視の手順例を示すフローチャートである。
この生存監視の処理は、上記の監視スレッドの中で実行される。
(S130)クラスタ制御部132は、無反応カウンタ=0に初期化する。(S131)クラスタ制御部132は、DBサーバ100の停止フラグがONであるか判断する。停止フラグがONの場合、DBサーバ100が他のDBサーバの生存を判断しなくてよいため、生存監視の処理が終了する。停止フラグがOFFの場合、ステップS132に処理が進む。(S132)クラスタ制御部132は、上記のステップS111で指定された監視対象のDBサーバからの生存確認メッセージの受信状況を参照する。
【0110】
(S133)クラスタ制御部132は、監視対象のDBサーバから生存確認メッセージを受信したか判断する。受信した場合はステップS130に処理が進み、受信していない場合はステップS134に処理が進む。(S134)クラスタ制御部132は、無反応カウンタが閾値を超えたか、すなわち、連続して生存確認メッセージを受信できなかった回数が閾値を超えたか判断する。閾値は、例えば、3回とする。条件を満たす場合はステップS137に処理が進み、条件を満たさない場合はステップS135に処理が進む。
【0111】
(S135)クラスタ制御部132は、無反応カウンタをインクリメント(1だけ加算)する。(S136)クラスタ制御部132は、一定時間(例えば、1000ms。または、設定ファイル142にパラメータを追加して、その値を使用してもよい)待機し、次に生存確認メッセージが受信されると期待されるタイミングを待つ。その後、ステップS131に処理が進む。(S137)クラスタ制御部132は、上記の監視対象のDBサーバのDBMSが正常に動作していないと判断し、後述するクラスタ縮退の処理によって当該DBサーバをクラスタシステムから外す。
【0112】
図20は、コマンド受信の手順例を示すフローチャートである。
このコマンド受信の処理は、上記のコマンド受信スレッドの中で実行される。
(S140)クラスタ制御部132は、コマンドの受信状況を参照する。端末装置31から受信し得るコマンドとしては、縮退命令・組込命令・切替命令・停止命令などが挙げられる。なお、切替命令は、他のDBサーバから受信することもある。
【0113】
(S141)クラスタ制御部132は、縮退命令を受信したか判断する。縮退命令は、クラスタシステムに属するDBサーバを減らすことを指示するコマンドであり、除外するDBサーバを指定している。縮退命令を受信した場合はステップS142に処理が進み、縮退命令を受信していない場合はステップS143に処理が進む。(S142)クラスタ制御部132は、後述するクラスタ縮退の処理によって、指定されたDBサーバをクラスタシステムから外す。その後、ステップS140に処理が進む。
【0114】
(S143)クラスタ制御部132は、組込命令を受信したか判断する。組込命令は、クラスタシステムに属するDBサーバを増やすことを指示するコマンドであり、組み込むDBサーバを指定している。組込命令を受信した場合はステップS144に処理が進み、組込命令を受信していない場合はステップS145に処理が進む。(S144)クラスタ制御部132は、後述するサーバ組込の処理によって、指定されたDBサーバをクラスタシステムに組み込む。その後、ステップS140に処理が進む。
【0115】
(S145)クラスタ制御部132は、切替命令を受信したか判断する。切替命令は、現用状態のDBサーバを切り替えるスイッチオーバを指示するコマンドである。切替命令は、端末装置31から切替元のDBサーバに送信され、切替元のDBサーバから切替先のDBサーバに転送される。切替命令を受信した場合はステップS146に処理が進み、切替命令を受信していない場合はステップS147に処理が進む。(S146)切替部133は、後述するスイッチオーバの処理を行う。その後、ステップS140に処理が進む。
【0116】
(S147)クラスタ制御部132は、停止命令を受信したか判断する。停止命令は、DBMSの停止を指示するコマンドである。停止命令を受信した場合はステップS148に処理が進み、停止命令を受信していない場合はステップS140に処理が進む。(S148)クラスタ制御部132は、停止フラグをONに設定する。(S149)クラスタ制御部132は、DBMS131を停止させ、DBサーバ100を停止状態にする。
【0117】
なお、上記の縮退命令・組込命令・切替命令・停止命令を判定する順序は一例であり、任意の順序で判定してもよいし、並行して判定するようにしてもよい。
図21は、クラスタ縮退の手順例を示すフローチャートである。
【0118】
このクラスタ縮退の処理は、上記のステップS137,S142および後述するステップS210においてそれぞれ実行される。
(S150)クラスタ制御部132は、サーバ情報記憶部123に記憶された生存サーバリスト143から、指定されたDBサーバの情報を削除する。(S151)クラスタ制御部132は、生存サーバリスト143に登録された生存サーバ(今回外すものを除く)の数を保持する。また、クラスタ制御部132は、カウンタn=1に初期化する。(S152)クラスタ制御部132は、生存サーバリスト143に登録されたn番目のDBサーバに対して縮退メッセージを送信する。縮退メッセージは、クラスタシステムから外すDBサーバを示す情報(例えば、当該DBサーバのサーバID)を含む。
【0119】
(S153)クラスタ制御部132は、カウンタnをインクリメントする。(S154)クラスタ制御部132は、カウンタnの値がステップS151で保持した生存サーバ数より大きいか判断する。条件を満たす場合はステップS155に処理が進み、条件を満たさない場合はステップS152に処理が進む。(S155)クラスタ制御部132は、指定されたDBサーバを外した後の生存しているDBサーバの中で、DBサーバ100の優先度が最も高いか判断する。DBサーバ100の優先度が最も高い場合はステップS156に処理が進み、それ以外の場合はクラスタ縮退の処理が終了する。
【0120】
(S156)クラスタ制御部132は、DBサーバ100の現在の状態が現用状態であるか判断する。現用状態である場合はクラスタ縮退の処理が終了し、それ以外の場合はステップS157に処理が進む。(S157)クラスタ制御部132は、DBサーバ100の状態を現用状態に遷移させる。これにより、DBサーバ100は、外したDBサーバに代わって、トランザクションを実行し業務サーバ20,20aに応答することになる。
【0121】
図22は、サーバ組込の手順例を示すフローチャートである。
このサーバ組込の処理は、上記のステップS144において実行される。
(S160)クラスタ制御部132は、生存サーバリスト143に登録された生存サーバの数を保持する。また、クラスタ制御部132は、カウンタn=1に初期化する。(S161)クラスタ制御部132は、生存サーバリスト143に登録されたn番目のDBサーバに対して組込メッセージを送信する。組込メッセージは、クラスタシステムに組み込むDBサーバを示す情報(例えば、当該DBサーバのサーバID)を含む。(S162)クラスタ制御部132は、カウンタnをインクリメントする。
【0122】
(S163)クラスタ制御部132は、カウンタnの値がステップS160で保持した生存サーバ数より大きいか判断する。条件を満たす場合はステップS164に処理が進み、条件を満たさない場合はステップS161に処理が進む。(S164)クラスタ制御部132は、生存サーバリスト143に新たなDBサーバを登録する。(S165)クラスタ制御部132は、新たなDBサーバを加えた後の生存しているDBサーバの中で、DBサーバ100の優先度が最も高いか判断する。DBサーバ100の優先度が最も高い場合はステップS166に処理が進み、それ以外の場合はステップS168に処理が進む。
【0123】
(S166)クラスタ制御部132は、DBサーバ100の現在の状態が現用状態であるか判断する。現用状態である場合はサーバ組込の処理が終了し、現用状態でない場合はステップS167に処理が進む。(S167)クラスタ制御部132は、DBサーバの状態を現用状態へ遷移させる。そして、サーバ組込の処理が終了する。
【0124】
(S168)クラスタ制御部132は、DBサーバ100の現在の状態が現用状態であるか判断する。現用状態である場合はステップS169に処理が進み、現用状態でない場合はサーバ組込の処理が終了する。(S169)クラスタ制御部132は、DBサーバ100の状態を現用状態から待機状態に遷移させる。これにより、DBサーバ100に代わって、追加されたDBサーバがトランザクションを実行し業務サーバ20,20aに応答することになる。なお、組み込むDBサーバの優先度は、例えば、端末装置31から指定される。組込命令に優先度を示す情報が含まれていてもよい。
【0125】
図23は、スイッチオーバの手順例を示すフローチャートである。
このスイッチオーバの処理は、切替命令を受信したときに実行される。
(S200)切替部133は、DBサーバ100の切替中フラグをONに設定する。切替中フラグは、DBサーバ100が、切替元または切替先としてスイッチオーバを実行中であるか否かを示すフラグである。DBサーバ100が現用状態で切替フラグがONであることは、DBサーバ100から他のDBサーバにトランザクションを移行し、DBサーバ100をクラスタシステムから切り離す途中であることを示す。DBサーバ100が待機状態で切替フラグがONであることは、他のDBサーバからDBサーバ100にトランザクションを移行し、DBサーバ100を現用状態にする途中であることを示す。
【0126】
(S201)切替部133は、DBサーバ100がスイッチオーバの切替先であるか、すなわち、DBサーバ100が待機状態であるか判断する。切替先である場合はステップS202に処理が進み、切替元である場合はステップS212に処理が進む。
【0127】
(S202)切替部133は、切替元のDBサーバから受信した切替命令に付加されている移行リスト141を取得し、移行リスト記憶部124に格納する。(S203)切替部133は、切替元のDBサーバに対して、移行リスト141を受信したことを示す応答メッセージを返信する。このとき、切替部133は、応答メッセージの返信時刻を保持しておく。(S204)切替部133は、切替元のDBサーバからトランザクションログを受信したか判断する。トランザクションログを受信した場合はステップS205に処理が進み、受信していない場合はステップS208に処理が進む。なお、切替元のDBサーバから受信されたトランザクションログは、ログ記憶部122に格納される。
【0128】
(S205)切替部133は、切替元のDBサーバに対して、トランザクションログを受信したことを示す応答メッセージを返信する。(S206)切替部133は、受信したトランザクションログに対応するエントリを移行リスト141から検索し、検索したエントリの移行状態を「2」(移行済)に更新する。受信したトランザクションログに対応するエントリは、例えば、トランザクションIDを用いて検索できる。(S207)切替部133は、移行リスト141に移行状態が「0」(未移行)のエントリが存在するか、すなわち、未移行のトランザクションがあるか判断する。未移行のトランザクションがある場合はステップS204に処理が進み、ない場合はステップS210に処理が進む。
【0129】
(S208)切替部133は、ステップS203で応答メッセージを返信してからの経過時間が閾値を超えたか判断する。この閾値は、設定ファイル142にパラメータを追加して、その値を使用してもよい。条件を満たす場合はステップS210に処理が進み、条件を満たさない場合はステップS209に処理が進む。(S209)切替部133は、一定時間(例えば、10ms。または、設定ファイル142にパラメータを追加して、その値を使用してもよい)待機する。その後、ステップS204に処理が進む。
【0130】
(S210)クラスタ制御部132は、クラスタシステムから外すDBサーバとして切替元のDBサーバを指定し、
図21に示したクラスタ縮退の処理を実行する。これにより、業務サーバ20,20aと切替元のDBサーバとの間のコネクションが切断され、そのDBMSが停止する。(S211)クラスタ制御部132は、移行リスト141の全てのエントリの移行状態を「0」(未移行)に更新する。また、クラスタ制御部132は、DBサーバ100の切替中フラグをONからOFFに戻す。
【0131】
図24は、スイッチオーバの手順例を示すフローチャート(続き)である。
(S212)切替部133は、サーバ情報記憶部123に記憶された生存サーバリスト143に登録されたDBサーバの中から、優先度が2番目に高い待機状態のDBサーバを検索し、検索したDBサーバを切替先として特定する。(S213)切替部133は、端末装置31から受信された切替命令に、移行リスト記憶部124に記憶された移行リスト141を付加し、ステップS212で特定した切替先のDBサーバに送信する。このとき、切替部133は、切替命令の送信時刻を保持しておく。
【0132】
(S214)切替部133は、切替先のDBサーバから切替命令に対する応答メッセージを受信したか判断する。応答メッセージを受信した場合はステップS217に処理が進み、受信していない場合はステップS215に処理が進む。(S215)切替部133は、切替命令を送信してからの経過時間が閾値を超えたか判断する。この閾値は、上記のステップS208の値と同じでもよい。条件を満たす場合はステップS210に処理が進み、条件を満たさない場合はステップS216に処理が進む。(S216)切替部133は、一定時間(例えば、10ms。または、設定ファイル142にパラメータを追加して、その値を使用してもよい)待機する。その後、処理がステップS214に進む。
【0133】
(S217)切替部133は、移行状態が「0」(未移行)である移行リスト141のエントリの中で最も順位の高いものを選択し、選択したエントリの移行状態を「1」(移行中)に更新する。順位の高いエントリは、移行リスト141の中で前方に登録されているものである。原則として、早く発生したトランザクションに対応するエントリほど、移行リスト141の前方に存在する。ただし、後述するように、スイッチオーバ中にエントリの順序が入れ替えられることがある。また、切替部133は、明示的に順序が繰り上げられたエントリを除き、任意の順序でエントリを選択するようにしてもよい。
【0134】
(S218)切替部133は、ステップS217で選択したエントリに対応するトランザクションログをログ記憶部122から取得し、切替先のDBサーバに送信する。エントリに対応するトランザクションログは、例えば、トランザクションIDを用いて検索できる。このとき、切替部133は、トランザクションログの送信時刻を保持しておく。(S219)切替部133は、切替先のDBサーバから、トランザクションログに対する応答メッセージを受信したか判断する。応答メッセージを受信した場合はステップS222に処理が進み、受信していない場合はステップS220に処理が進む。
【0135】
(S220)切替部133は、トランザクションログを送信してからの経過時間が閾値を超えたか判断する。この閾値は、上記のステップS208またはステップS215の値と同じでもよい。条件を満たす場合はステップS210に処理が進み、条件を満たさない場合はステップS221に処理が進む。(S221)切替部133は、一定時間(例えば、10ms。または、設定ファイル142にパラメータを追加して、その値を使用してもよい)待機する。その後、ステップS219に処理が進む。
【0136】
(S222)切替部133は、ステップS217で選択した移行リスト141のエントリの移行状態を「2」(移行済)に更新する。(S223)切替部133は、移行リスト141に移行状態が「0」(未移行)のエントリが存在するか、すなわち、未移行のトランザクションがあるか判断する。未移行のトランザクションがある場合はステップS217に処理が進み、ない場合はステップS210に処理が進む。
【0137】
図25は、メッセージ処理の手順例を示すフローチャート(第1の図)である。
このメッセージ処理は、上記のメッセージ受信スレッドの中で実行される。
(S230)メッセージ処理部134は、業務サーバ20,20aからのメッセージの受信状況を参照する。(S231)メッセージ処理部134は、何れかの業務サーバからメッセージを受信したか判断する。業務サーバ20,20aから受信し得るメッセージには、コネクション確立を要求するコネクション要求、検索または更新を示す処理要求、コミット要求およびロールバック要求が含まれる。メッセージを受信した場合はステップS232に処理が進み、受信していない場合はステップS239に処理が進む。
【0138】
(S232)メッセージ処理部134は、DBサーバ100が現用状態であるか判断する。現用状態である場合はステップS233に処理が進み、現用状態でない場合はステップS254に処理が進む。(S233)メッセージ処理部134は、DBサーバ100の切替中フラグがONであるか判断する。切替中フラグがONである場合はステップS236に処理が進み、切替中フラグがOFFである場合はステップS234に処理が進む。
【0139】
(S234)メッセージ処理部134は、DBサーバ100とメッセージの送信元の業務サーバとの間にコネクションが確立済であるか判断する。コネクションが確立されていない場合、受信したメッセージはコネクション要求である可能性がある。コネクションを確立済である場合はステップS241に処理が進み、コネクションが確立されていない場合はステップS235に処理が進む。(S235)メッセージ処理部134は、DBサーバ100と送信元の業務サーバとの間にコネクションを確立する。このとき、メッセージ処理部134は、コネクションに、クライアントID・クライアントIPアドレス・クライアントポート番号・クライアントプロセスID・クライアントスレッドIDから算出されるセッションIDを付与する。その後、ステップS241に処理が進む。
【0140】
(S236)メッセージ処理部134は、DBサーバ100と送信元の業務サーバとの間にコネクションが確立済であるか判断する。コネクションを確立済である場合はステップS237に処理が進み、コネクションが確立されていない場合はステップS238に処理が進む。(S237)メッセージ処理部134は、メッセージがトランザクションIDを含む場合、移行リスト141から当該トランザクションIDを含むエントリを検索し、検索したエントリの順位を移行リスト141の中で繰り上げる。例えば、検索したエントリを、移行状態が「0」(未移行)のエントリのうちの最も前方に移動する。すなわち、メッセージ処理部134は、メッセージが属するトランザクションの移行順位を繰り上げる。(S238)メッセージ処理部134は、受信したメッセージを、当該メッセージが要求する処理を実行せずに破棄する。その後、ステップS230に処理が進む。
【0141】
(S239)メッセージ処理部134は、DBサーバ100の停止フラグがONであるか判断する。停止フラグがONの場合はメッセージ処理が終了し、停止フラグがOFFの場合はステップS240に処理が進む。(S240)メッセージ処理部134は、一定時間(例えば、10ms。または、設定ファイル142にパラメータを追加して、その値を使用してもよい)待機する。その後、ステップS230に処理が進む。
【0142】
図26は、メッセージ処理の手順例を示すフローチャート(第2の図)である。
(S241)メッセージ処理部134は、受信したメッセージがコミット要求であるか判断する。コミット要求の場合はステップS242に処理が進み、コミット要求でない場合はステップS244に処理が進む。(S242)メッセージ処理部134は、コミット要求が指定するトランザクションに対応するトランザクションログをログ記憶部122から取得し、当該トランザクションログに含まれる更新データをデータベース121に反映させる。データベース121は、当該更新データに従って更新される。(S243)メッセージ処理部134は、生存サーバリスト143を参照して、待機状態のDBサーバ(例えば、DBサーバ100a,100b)を特定し、全ての待機状態のDBサーバに上記のトランザクションログを送信する。その後、ステップS252に処理が進む。
【0143】
(S244)メッセージ処理部134は、受信したメッセージがロールバック要求であるか判断する。ロールバック要求の場合はステップS252に処理が進み、ロールバック要求でない場合はステップS245に処理が進む。後者の場合、主に、メッセージは検索要求や更新要求などの処理要求であることが想定される。(S245)メッセージ処理部134は、受信したメッセージに対応するトランザクションが存在するか判断する。例えば、メッセージがトランザクションIDを含み、当該トランザクションIDが移行リスト141に登録されている場合、トランザクションが存在すると判断される。存在する場合はステップS246に処理が進み、存在しない場合はステップS248に処理が進む。
【0144】
(S246)メッセージ処理部134は、メッセージが指定するトランザクションに対応するトランザクションログをログ記憶部122から取得し、当該トランザクションログとメッセージに含まれる入力データとに応じてデータ処理を仮実行する。メッセージが検索要求である場合、メッセージ処理部134は、データベース121からのデータの検索を最後まで実行してよい。メッセージが更新要求である場合、メッセージ処理部134は、データベース121を更新せずに更新内容をトランザクションログに保存しておく。(S247)メッセージ処理部134は、データ処理が成功したか判断する。成功した場合はステップS253に処理が進み、失敗した場合はステップS252に処理が進む。
【0145】
(S248)メッセージ処理部134は、メッセージに含まれる入力データに応じてデータ処理を仮実行する。(S249)メッセージ処理部134は、データ処理が成功したか判断する。成功した場合はステップS250に処理が進み、失敗した場合はステップS253に処理が進む。(S250)メッセージ処理部134は、データ処理によってトランザクションが発生するか判断する。データベース121を更新する直前までの更新処理が成功した場合は、トランザクションが発生し得る。参照処理でもトランザクション処理が発生し得るが、データ更新を伴わない。トランザクションが発生する場合はステップS251に処理が進み、発生しない場合はステップS253に処理が進む。
【0146】
(S251)メッセージ処理部134は、新たなトランザクションIDやデータベース121に未反映の更新内容などを含むトランザクションログを生成し、ログ記憶部122に格納する。また、メッセージ処理部134は、新たなトランザクションIDなどを含むエントリを移行リスト141に登録する。その後、ステップS253に処理が進む。
【0147】
(S252)メッセージ処理部134は、ステップS242のトランザクションログをログ記憶部122から削除し、移行リスト141から当該トランザクションログに対応するエントリを削除する。(S253)メッセージ処理部134は、処理結果をメッセージの送信元の業務サーバに通知する。検索要求に対する結果通知には、検索されたデータが含まれ得る。更新要求に対する結果通知には、更新の成否を示す情報が含まれ得る。コミット要求やロールバック要求に対する結果通知には、コミットやロールバックの成否を示す情報が含まれる。その後、ステップS230に処理が進む。
【0148】
図27は、メッセージ処理の手順例を示すフローチャート(第3の図)である。
(S254)メッセージ処理部134は、DBサーバ100の切替中フラグがONであるか判断する。切替中フラグがONの場合はステップS255に処理が進み、切替中フラグがOFFの場合はステップS262に処理が進む。(S255)メッセージ処理部134は、受信したメッセージがトランザクションIDを含む場合、移行リスト141から当該トランザクションIDを含むエントリを検索する。すなわち、メッセージ処理部134は、メッセージが指定するトランザクションを検索する。(S256)メッセージ処理部134は、メッセージがトランザクションを指定しており、かつ、指定されたトランザクションが移行リスト141に登録されているか判断する。条件を満たす場合はステップS257に処理が進み、条件を満たさない場合はステップS261に処理が進む。
【0149】
(S257)メッセージ処理部134は、ステップS255で検索されたエントリの移行状態が「2」(移行済)であるか判断する。トランザクションが移行済の場合はステップS241に処理が進み、移行済でない場合(未移行の場合)はステップS258に処理が進む。(S258)スイッチオーバにおける切替元のDBサーバが異常なく生存しているか判断する。異常なく生存している場合はステップS259に処理が進み、それ以外の場合はステップS260に処理が進む。(S259)メッセージ処理部134は、受信したメッセージをメッセージバッファ125に保持させておき、一定時間(例えば、10ms。または、設定ファイル142にパラメータを追加して、その値を使用してもよい)待機する。その後、ステップS257に処理が進む。
【0150】
(S260)メッセージ処理部134は、メッセージの送信元の業務サーバに対し、エラーを示す処理結果を通知する。その後、ステップS230に処理が進む。(S261)メッセージ処理部134は、DBサーバ100とメッセージの送信元の業務サーバとの間にコネクションを確立する。その後、ステップS241に処理が進む。(S262)メッセージ処理部134は、受信したメッセージが要求する処理を実行せずに当該メッセージを破棄する。その後、ステップS230に処理が進む。
【0151】
次に、他のデータベースシステムによるトランザクション処理の例を挙げ、前述のDBサーバ100,100a,100bによるトランザクション処理と比較する。
図28は、第1の他のトランザクション処理例を示すシーケンス図である。
【0152】
第1の他のトランザクション処理例では、データベースシステムは、業務サーバ41と現用状態のDBサーバ42と待機状態のDBサーバ43を含む。
(S300)業務サーバ41は、処理要求をDBサーバ42に送信する。(S301)DBサーバ42は、更新内容をデータベースに反映させずトランザクションログに記載しておく。(S302)DBサーバ42は、処理結果を業務サーバ41に通知する。
【0153】
(S303)業務サーバ41は、コミット要求をDBサーバ42に送信する。(S304)DBサーバ42は、トランザクションログを用いてDBサーバ42のデータベースを更新する。(S305)DBサーバ42は、トランザクションログをDBサーバ43に送信する。(S306)DBサーバ43は、トランザクションログを用いてDBサーバ43のデータベースを更新する。(S307)DBサーバ43は、処理結果をDBサーバ42に通知する。(S308)DBサーバ42は、処理結果を業務サーバ41に通知する。
【0154】
(S309)業務サーバ41は、処理要求をDBサーバ42に送信する。(S310)DBサーバ42は、更新内容をトランザクションログに記載しておく。(S311)DBサーバ42は、処理結果を業務サーバ41に通知する。(S312)DBサーバ42,43に切替命令が入力される。(S313)DBサーバ42は、実行中のトランザクションをロールバックし、保持しているトランザクションログを破棄する。これにより、DBサーバ42は停止可能になり、DBサーバ43は待機状態から現用状態に遷移する。
【0155】
(S314)業務サーバ41は、切替を検知すると、実行中であったトランザクションを最初から実行し直すため、ステップS309と同じ処理を示す処理要求をDBサーバ43に送信する。(S315)DBサーバ43は、更新内容をトランザクションログに記載しておく。(S316)DBサーバ43は、処理結果を業務サーバ41に通知する。(S317)業務サーバ41は、コミット要求をDBサーバ43に送信する。(S318)DBサーバ43は、トランザクションログを用いてDBサーバ43のデータベースを更新する。(S319)DBサーバ43は、処理結果を業務サーバ41に通知する。
【0156】
このように、第1の他のトランザクション処理例では、DBサーバ42でトランザクションがコミットされたときに、DBサーバ43のデータベースがDBサーバ42と同期される。DBサーバ43は、DBサーバ42で実行中のトランザクションについてのトランザクションログを保持しない。また、DBサーバ42からDBサーバ43へのスイッチオーバが指示されると、データベースシステムからDBサーバ42が即時に切り離され、DBサーバ42で実行中のトランザクションはDBサーバ43に引き継がれない。
【0157】
しかし、第1の他のトランザクション処理例では、スイッチオーバ直後に、ロールバックされたトランザクションを最初から実行し直すための処理要求がDBサーバ43に集中することになる。このため、スイッチオーバ直後は、切替先のDBサーバ43の負荷が高くなり、処理要求に対する応答が一時的に遅くなるおそれがある。これに対し、前述のDBサーバ100,100a,100bによるトランザクション処理によれば、スイッチオーバ時にトランザクションが引き継がれ、切替先のDBサーバの負荷を低減できる。よって、業務サーバ20,20aを停止させなくても、スイッチオーバを円滑に行える。
【0158】
図29は、第2の他のトランザクション処理例を示すシーケンス図である。
第2の他のトランザクション処理例では、データベースシステムは、業務サーバ51と現用状態のDBサーバ52と待機状態のDBサーバ53を含む。
【0159】
(S320)業務サーバ51は、処理要求をDBサーバ52に送信する。(S321)DBサーバ52は、更新内容をデータベースに反映させずトランザクションログに記載しておく。(S322)DBサーバ52は、トランザクションログの差分をDBサーバ53に通知する。(S323)DBサーバ53は、通知された差分に基づいてトランザクションログを生成または更新する。(S324)DBサーバ53は、処理結果をDBサーバ52に通知する。(S325)DBサーバ52は、処理結果を業務サーバ51に通知する。
【0160】
(S326)業務サーバ51は、コミット要求をDBサーバ52に送信する。(S327)DBサーバ52は、トランザクションログを用いてDBサーバ52のデータベースを更新する。(S328)DBサーバ52は、コミット要求をDBサーバ53に転送する。(S329)DBサーバ53は、DBサーバ53が保持するトランザクションログを用いてデータベースを更新する。(S330)DBサーバ53は、処理結果をDBサーバ52に通知する。(S331)DBサーバ52は、処理結果を業務サーバ51に通知する。
【0161】
(S332)業務サーバ51は、処理要求をDBサーバ52に送信する。(S333)DBサーバ52は、更新内容をトランザクションログに記載しておく。(S334)DBサーバ52は、トランザクションログの差分をDBサーバ53に通知する。(S335)DBサーバ53は、通知された差分に基づいてトランザクションログを生成または更新する。(S336)DBサーバ53は、処理結果をDBサーバ52に通知する。(S337)DBサーバ52は、処理結果を業務サーバ51に通知する。
【0162】
(S338)DBサーバ52,53に切替命令が入力される。(S339)DBサーバ52は、実行中のトランザクションをロールバックし、保持しているトランザクションログを破棄する。これにより、DBサーバ52は停止可能になり、DBサーバ53は待機状態から現用状態に遷移する。(S340)業務サーバ51は、切替を検知すると、実行中のトランザクションの状態がDBサーバ52,53間で同期されていたため、トランザクションの続きとしてコミット要求をDBサーバ53に送信する。(S341)DBサーバ53は、トランザクションログを用いてDBサーバ53のデータベースを更新する。(S342)DBサーバ53は、処理結果を業務サーバ51に通知する。
【0163】
このように、第2の他のトランザクション処理例では、DBサーバ52でトランザクションログが更新されると、これと同期してDBサーバ53でもトランザクションログが更新される。よって、データベースシステムからDBサーバ52を即時に切り離しても、切替先のDBサーバ53がトランザクションを引き継ぐことができる。
【0164】
しかし、第2の他のトランザクション処理例では、DBサーバ52,53間でトランザクションログを継続的に同期しているため、待機状態であってもDBサーバ53の負荷が高くなるおそれがある。このため、DBサーバ53をデータ検索に利用するなどDBサーバ53の計算リソースをトランザクション以外の処理に活用することが難しくなる。また、DBサーバ52,53間で継続的に通信が発生するため、業務サーバ51への応答が遅くなるおそれがある。これに対し、前述のDBサーバ100,100a,100bによるトランザクション処理によれば、通常時では、待機状態のDBサーバは現用状態のDBサーバで実行中のトランザクションについてトランザクションログを保持しない。よって、待機状態のDBサーバの負荷を低減でき、また、応答速度が向上する。
【0165】
図30は、第3の他のトランザクション処理例を示すシーケンス図である。
第3の他のトランザクション処理例では、データベースシステムは、業務サーバ61と現用状態のDBサーバ62と待機状態のDBサーバ63を含む。
【0166】
(S350)業務サーバ61は、処理要求をDBサーバ62,63の両方に送信する。(S351)DBサーバ62は、更新内容をデータベースに反映させずトランザクションログに記載しておく。(S352)DBサーバ63は、DBサーバ62と同様に、トランザクションログの生成または更新を行う。(S353)DBサーバ62は、処理結果を業務サーバ61に通知する。DBサーバ63は、処理結果を業務サーバ61に通知する。
【0167】
(S354)業務サーバ61は、コミット要求をDBサーバ62,63の両方に送信する。(S355)DBサーバ62は、DBサーバ62が保持するトランザクションを用いてDBサーバ62のデータベースを更新する。(S356)DBサーバ63は、DBサーバ62とは独立に、DBサーバ63が保持するトランザクションを用いてDBサーバ63のデータベースを更新する。(S357)DBサーバ62は、処理結果を業務サーバ61に通知する。DBサーバ63は、処理結果を業務サーバ61に通知する。
【0168】
(S358)業務サーバ61は、処理要求をDBサーバ62,63の両方に送信する。(S359)DBサーバ62は、更新内容をトランザクションログに記載しておく。(S360)DBサーバ63は、DBサーバ62と同様に、トランザクションログの生成または更新を行う。(S361)DBサーバ62は、処理結果を業務サーバ61に通知する。DBサーバ63は、処理結果を業務サーバ61に通知する。
【0169】
(S362)DBサーバ62,63に切替命令が入力される。(S363)DBサーバ62は、実行中のトランザクションをロールバックし、保持しているトランザクションログを破棄する。これにより、DBサーバ62は停止可能になり、DBサーバ63は待機状態から現用状態に遷移する。(S364)業務サーバ61は、切替を検知すると、DBサーバ62,63それぞれで独立にトランザクションが実行されていたため、トランザクションの続きとしてコミット要求をDBサーバ63に送信する。(S365)DBサーバ63は、トランザクションログを用いてDBサーバ63のデータベースを更新する。(S366)DBサーバ63は、処理結果を業務サーバ61に通知する。
【0170】
このように、第3の他のトランザクション処理例では、業務サーバ61からDBサーバ62,63の両方に処理要求が送信され、DBサーバ62,63の両方から業務サーバ61に処理結果が通知される。DBサーバ62,63の両方で、同様のトランザクションが実行される。よって、データベースシステムからDBサーバ62を即時に切り離しても、切替先のDBサーバ63がトランザクションの続きを実行することができる。
【0171】
しかし、第3の他のトランザクション処理例では、待機状態のDBサーバ63が現用状態とDBサーバ62と同様のトランザクションを継続的に実行するため、DBサーバ63の負荷が高くなるおそれがある。このため、DBサーバ63の計算リソースをトランザクション以外の処理に活用することが難しくなる。これに対し、前述のDBサーバ100,100a,100bによるトランザクション処理によれば、通常時では、待機状態のDBサーバはトランザクションを直接は実行しないため、その負荷を低減できる。
【0172】
図31は、第4の他のトランザクション処理例を示すシーケンス図である。
第4の他のトランザクション処理例では、データベースシステムは、業務サーバ71と現用状態のDBサーバ72と待機状態のDBサーバ73を含む。また、このデータベースシステムは、業務サーバ71とDBサーバ72,73が共通にアクセス可能なキュー74と、DBサーバ72,73が共通にアクセス可能なキュー75とを含む。キュー74,75は、業務サーバ71やDBサーバ72,73と異なる装置に実装されてもよい。
【0173】
(S370)業務サーバ71は、処理要求#1−1をキュー74に格納する。(S371)業務サーバ71は、処理要求#1−2をキュー74に格納する。(S372)業務サーバ71は、コミット要求#1をキュー74に格納する。(S373)業務サーバ71は、処理要求#2−1をキュー74に格納する。(S374)業務サーバ71は、コミット要求#2をキュー74に格納する。キュー74はFIFO(First In First Out)型の記憶領域であり、上記のメッセージを到着順に並べて保持している。
【0174】
(S375)DBサーバ72は、キュー74の先頭から処理要求#1−1を取り出す。(S376)DBサーバ72は、更新内容をデータベースに反映させずにトランザクションログに記載しておく。(S377)DBサーバ72は、処理結果を業務サーバ71に通知する。(S378)DBサーバ72,73に切替命令が入力される。
【0175】
(S379)DBサーバ72は、DBサーバ72で実行中のトランザクションを完了させるため、キュー74の先頭から処理要求#1−2を取り出す。(S380)DBサーバ72は、更新内容をトランザクションログに記載しておく。(S381)DBサーバ72は、処理結果を業務サーバ71に通知する。(S382)DBサーバ72は、キュー74の先頭からコミット要求#1を取り出す。(S383)DBサーバ72は、トランザクションログを用いてデータベースを更新する。(S384)DBサーバ72は、トランザクションログをキュー75に格納する。(S385)DBサーバ72は、処理結果を業務サーバ71に送信する。そして、DBサーバ72は、実行中のトランザクションがなくなったことを検知すると、キュー74からメッセージを取り出すことを停止する。
【0176】
(S386)DBサーバ73は、キュー75の先頭からトランザクションログを取り出す。(S387)DBサーバ73は、トランザクションログを用いてDBサーバ73のデータベースを更新する。(S388)DBサーバ73は、DBサーバ72で実行中のトランザクションがなくなると、新たなトランザクションを開始するため、キュー74の先頭から処理要求#2−1を取り出す。(S389)DBサーバ73は、更新内容をトランザクションログに記載しておく。(S390)DBサーバ73は、処理結果を業務サーバ71に通知する。(S391)DBサーバ73は、キュー74の先頭からコミット要求#2を取り出す。(S392)DBサーバ73は、トランザクションログを用いてデータベースを更新する。(S393)DBサーバ73は、業務サーバ71に処理結果を通知する。
【0177】
このように、第4の他のトランザクション処理例では、DBサーバ72からDBサーバ73へのスイッチオーバが指示されると、DBサーバ72で実行中のトランザクションが完了するまで、そのトランザクションに属する処理要求が取り出される。その間に到着した新たなトランザクションを発生させる処理要求は、キュー74に蓄積される。実行中のトランザクションがなくなると、DBサーバ73が処理要求を取り出し始める。
【0178】
しかし、第4の他のトランザクション処理例では、切替元のDBサーバ72で実行中のトランザクションが全て完了するまで、切替先のDBサーバ73は処理を開始しない。このため、DBサーバ73が処理を開始する時点でキュー74には多くの処理要求が蓄積されているおそれがあり、DBサーバ73の負荷が大きくなるおそれがある。これに対し、前述のDBサーバ100,100a,100bによるトランザクション処理によれば、実行中の複数のトランザクションが切替先のDBサーバに順次引き継がれ、切替先のDBサーバでは引き継がれたトランザクションから順に処理を再開できる。よって、切替先のDBサーバの負荷を低減でき、スイッチオーバを円滑に行える。
【0179】
第2の実施の形態のデータベースシステムによれば、トランザクションを実行する現用状態のDBサーバが切り替わるとき、実行中のトランザクションを示す移行リスト141が切替元のDBサーバと切替先のDBサーバで共有される。そして、移行リスト141に基づいて、実行中のトランザクションに対応するトランザクションログが切替先のDBサーバに移行される。このため、実行中のトランザクションを一旦ロールバックして切替先のDBサーバに引き継がない場合と比べて、スイッチオーバ直後の切替先のDBサーバの負荷を低減できる。よって、データベースシステムの応答時間の悪化を抑え、業務サーバ20,20aを停止させずにスイッチオーバを行うことが可能となる。
【0180】
また、コミット前のトランザクションに対応するトランザクションログをDBサーバ間で継続的に同期する場合と比べて、待機状態のDBサーバの負荷を低減できる。よって、待機状態のDBサーバの計算リソースを、データベースの検索などデータベースを更新するトランザクション以外の処理に利用でき、計算リソースを有効活用できる。また、切替元のDBサーバに、あるトランザクションに属するメッセージが到着すると、そのトランザクションの移行が他のトランザクションよりも早くなるように移行順位が繰り上がる。これにより、業務サーバ20,20aへの応答時間を短縮することができる。
【0181】
なお、前述のように、第1の実施の形態の情報処理は、情報処理装置10,10aにプログラムを実行させることで実現することができる。第2の実施の形態の情報処理は、業務サーバ20,20a、端末装置31およびDBサーバ100,100a,100bにプログラムを実行させることで実現することができる。
【0182】
プログラムは、コンピュータ読み取り可能な記録媒体(例えば、記録媒体113)に記録しておくことができる。記録媒体としては、例えば、磁気ディスク、光ディスク、光磁気ディスク、半導体メモリなどを使用できる。磁気ディスクには、FDおよびHDDが含まれる。光ディスクには、CD、CD−R(Recordable)/RW(Rewritable)、DVDおよびDVD−R/RWが含まれる。プログラムは、可搬型の記録媒体に記録されて配布されることがある。その場合、可搬型の記録媒体からHDDなどの他の記録媒体(例えば、HDD103)にプログラムを複製して(インストールして)実行してもよい。