以下に、本願の開示する情報処理システム、情報処理装置、情報処理方法及びプログラムの実施例を図面に基づいて詳細に説明する。なお、この実施例は開示の技術を限定するものではない。
まず、実施例に係る情報処理システムの処理の流れについて説明する。図1A〜図1Cは、実施例に係る情報処理システムの処理の流れを示す第1の図〜第3の図である。図1Aは、データを追加する場合を示し、図1Bはデータを更新する場合を示し、図1Cはコミットする場合を示す。図1Aにおいて、サーバ#101及びサーバ#201は、クライアント#1で動作するアプリケーションが使用するデータを記憶し、クライアント#1からのトランザクション要求を受信してトランザクション処理を行うサーバ装置2である。サーバ#101は現用サーバとして動作し、サーバ#201は待機サーバとして動作する。
クライアント#1は、サーバ装置2が記憶するデータを使用するアプリケーションが動作するクライアント装置3である。クライアント#1とサーバ#101とサーバ#201は、業務LAN(Local Area Network)4aで接続される。また、サーバ#101とサーバ#201は、同期LAN4bで接続される。
図1Aに示すように、クライアント#1は、データ追加の要求電文11をサーバ#101、#201に送信する。クライアント#1は、トランザクションの最初に電文を送信する際、仮トランID「T−CL#1」を生成し、電文に付加する(1)。ここで、「トラン」は、トランザクションを表し、以下の記載においても同様である。仮トランIDは、トランザクションを識別する仮の識別子である。要求電文11には、仮トランIDとして「T−CL#1」、追加されるデータとして「rec#1」が含まれる。
クライアント#1は、仮トランIDをトランIDとして待機応答記憶部65に格納し、管理する。トランザクションの正式な識別子が現用サーバにより決定されると待機応答記憶部65のトランIDは、正式な識別子で書き換えられる。待機応答記憶部65のNoは、データ操作の通番である。また、クライアント#1は、仮トランIDをデータID記憶部66に格納し、管理する。
要求電文11を受信すると、現用サーバは、トランザクション処理を実施し、トランザクション処理の実施後に、トランID、データIDを決定する(2)。ここで、トランIDは、トランザクションを識別する識別子であり、データIDは、データを識別する識別子である。そして、現用サーバは、トランID、仮トランID、No、データID及びデータをトラン情報記憶部55aに格納して管理する。図1Aでは、トランIDとして「T#001」、仮トランIDとして「T−CL#1」、NOとして「1」、データIDとして「100」、データとして「rec#1」がトラン情報記憶部55aを用いて管理される。
一方、要求電文11を受信すると、待機サーバは、仮トランIDでデータ「rec#1」を管理する(3)。待機サーバは、仮トランID、No及びデータをトラン情報記憶部55eに格納して管理する。このタイミングでは、トランID及びデータIDは空白である。待機サーバは、次回電文受信時に、トランID及びデータIDを含めてトラン情報記憶部55eを更新する。そして、待機サーバはクライアント#1に応答する。クライアント#1は、待機サーバから応答があれば、待機サーバの識別番号を待機応答記憶部65のサーバNoに追記する(4)。図1Aでは、「#201」が追記されている。
現用サーバは、処理したデータのデータIDと処理したトランザクションのトランIDを応答電文12に埋め込み返却する(5)。図1Aでは、トランIDとして「T#001」、データIDとして「100」が応答電文12に含まれる。クライアント#1は、応答電文12を受け取ると、処理対象データのデータID「100」とトランID「T#001」をデータID記憶部66に保存する(6)。また、クライアント#1は、待機応答記憶部65のトランIDを応答電文12に含まれるトランID「T#001」で書き換える。
そして、図1Bに示すように、クライアント#1は、次のデータ更新の要求電文13を送信する際にデータID記憶部66を参照して要求電文13にトランID及びデータIDを付与する(7)。そして、クライアント#1は、データ更新の要求電文13をサーバ#101、サーバ#201に送信する(8)。クライアント#1は、仮トランID、更新データに加え、正式なトランID、前回のデータのデータIDを同時に送信する。図1Bでは、仮トランID「T−CL#1」、更新データ「rec#2」に加え、データID記憶部66が記憶するトランID「T#001」とデータID「100」が要求電文13に含まれる。
要求電文13を受信すると、現用サーバは、トランザクション処理を実施し、トランザクション処理の実施後に、処理対象データのデータIDを決定する(9)。そして、現用サーバは、トラン情報記憶部55aにトランID、仮トランID、No、データID及びデータを格納する。図1Bでは、トランID「T#001」、仮トランID「T−CL#1」、NO「2」、データID「101」、データ「rec#2」がトラン情報記憶部55aに格納される。
一方、要求電文13を受信すると、待機サーバは、トラン情報記憶部55eにおいて、仮トランID「T−CL#1」と正式なトランID「T#001」を対応付け、前回操作したデータ「rec#1」のデータIDとトランIDを更新する(10)。そして、待機サーバはクライアント#1に応答する。クライアント#1は、待機サーバから応答があれば、待機サーバの識別番号を待機応答記憶部65のサーバNoに追記する。図1Bでは、「#201」が追記されている。また、クライアント#1は、データID記憶部66からNoが「1」であるデータIDに関する情報を削除する(11)。図1Bでは、データID「100」に関する情報が削除される。
現用サーバは、データIDとトランザクションのトランIDを応答電文14に埋め込み返却する(12)。図1Bでは、トランIDとして「T#001」、データIDとして「101」が応答電文14に含まれる。クライアント#1は、応答電文14を受け取ると、データID「101」とトランID「T#001」をデータID記憶部66に保存する(13)。
そして、図1Cに示すように、クライアント#1は、次のコミットの要求電文15を送信する際にデータID記憶部66を参照して要求電文15にトランID及びデータIDを付与する(14)。そして、クライアント#1は、コミットの要求電文15をサーバ#101、サーバ#201に送信する(15)。すなわち、クライアント#1は、仮トランIDに加え、トランID、前回のデータのデータIDを同時に送信する。図1Bでは、仮トランID「T−CL#1」に加え、データID記憶部66が記憶するトランID「T#001」とデータID「101」が要求電文15に含まれる。
要求電文15を受信すると、現用サーバは、コミット処理を実施する(16)。すなわち、現用サーバは、トラン情報記憶部55aの情報をデータ記憶部5bに反映させる。そして、現用サーバは、この時点では、トラン情報記憶部55aが記憶する情報を消さずに残しておく。
一方、要求電文15を受信すると、待機サーバは、要求電文15とトラン情報記憶部55eの情報に基づいてコミット処理を実施する(17)。すなわち、待機サーバは、要求電文15とトラン情報記憶部55eの情報をデータ記憶部5bに反映させる。そして、待機サーバは、この時点では、トラン情報記憶部55eが記憶する情報を消さずに残しておく。
上記(16)、(17)では、現用サーバ及び待機サーバは、それぞれトラン情報記憶部55a及び55eの情報を消さないで、次回にクライアント#1から要求が来るまで保持しておく。すなわち、次回にクライアント#1から要求が来ると、トラン情報記憶部55a及び55eの情報は消される。
クライアント#1は、サーバ#101及びサーバ#201の両方から応答があるのを待つ(18)。サーバ#101からの応答電文16には、トランIDが含まれる。図1Cでは、「T#001」が応答電文16に含まれる。
なお、複数のクライアント装置3からの要求を、サーバ装置2においてマルチスレッドで同時に処理する場合、トランザクションの実行順序が重要になる。例えば、同一データに対する更新処理では、クライアント#1が先に動作したか、クライアント#2が先に動作したかで結果が異なる場合がある。本実施例では、唯一の現用サーバでトランザクションの実行順序を決定し、現用サーバで採番したトランIDを基に待機サーバでデータを管理することで、冗長構成を含めた全てのサーバ装置2でトランザクションの整合性を保証することができる。
トランザクションで処理するデータについても、現用サーバで一意に特定する必要がある。例えば、以下のような場合は、待機サーバでもデータを一意に特定することは可能である。
・RDB(Relational Data Base)のように、事前に一意性制約(主キーなど)が定義されている場合
・Key−Value方式のように、データと対応するキー値が事前に分っている場合
しかし、Key−Value方式でない、又は、一意性制約が定義されていない場合には、クライアント装置3側で事前にデータを特定する情報がないため、現用サーバ及び待機サーバそれぞれで、処理対象のデータを一意に特定することはできない。データ操作のトランザクションが複数のクライアント装置3から同時に実行される場合、トランザクションの実行順序が決定されて、初めて「データ」を一意に決定することができる。
本実施例では、トランIDと同様に、唯一の現用サーバがデータを一意に特定する情報である「データID」を決定し、現用サーバで採番されたデータIDを基に待機サーバでデータを管理する。したがって、冗長構成を含めた構成でトランザクションの整合性を保証することができる。データIDは、データ追加時は新規に採番され、データ更新時は更新対象のデータのデータIDとなる。
冗長構成を含めた全てのサーバ装置2で、トランザクションの整合性を保証するためには、トランザクションの実行順序及びトランザクションで操作したデータを情報処理システム内で一致させる必要がある。しかし、トランザクション実行順序、トランザクションを一意に特定するためのトランザクションID、処理対象データを一意に特定するためのデータIDは、現用サーバでのみ採番・特定される。このため、従来の方式では、トランザクションの実行順序及びトランザクションで操作したデータを情報処理システム内で一致させることができない。そこで、本実施例では、クライアント装置3で「仮トランID」を採番し、「仮トランID」を基に現用サーバと待機サーバのトランザクション情報を管理することで、トランザクションの整合性を保証することができる。
図2は、仮トランIDの構造の一例を示す図である。図2に示すように、仮トランIDには、IPアドレスとプロセスIDとスレッドIDと通番が含まれる。IPアドレスは、クライアント装置3のIPアドレスである。プロセスID及びスレッドIDは、要求電文を送信するアプリケーションのプロセス及びスレッドの識別子である。通番は、プロセス内の通番である。
図3は、クライアント装置3及び待機サーバがトランID及びデータIDを取得するタイミングを示す図である。図3において、D[n]は、n回目に操作したデータを表す。トランザクションの初回の処理の場合は、クライアント装置3では、事前にトランIDを取得できないため、クライアント装置3で仮トランIDを生成し、待機サーバに送信する(図3の1a)。要求電文を受信した待機サーバは、仮トランIDでデータを管理する(図3の1b)。この時点では、待機サーバではトランID及びデータIDは特定されていない。
正式なトランID及びデータIDは、現用サーバが応答電文に付加し、クライアント装置3に通知する。通知されたトランID及びデータIDは、クライアント装置3のデータID記憶部66に記録される(図3の1c)。次に、クライアント装置3は、要求電文を送信する際に、一つ前に処理したデータのデータIDとトランIDをデータID記憶部66から読み出して要求電文に付加して送信する(図3の2a)。
すなわち、実施例では、現用サーバで採番されたトランID及びデータIDを、クライアント装置3が次の処理の要求電文で待機サーバに送信することで、トランID及びデータIDを情報処理システム内で一致させるようにしている(待機サーバでは、情報通知が1処理分遅延する)。トランザクションが開始すれば、クライアント装置3でトランIDを取得することが可能になるため、トランザクション処理の2回目以降は、待機サーバでも要求電文受信時にトランIDを取得できる(図3の2b)。
次に、操作電文ロスト時の処理の流れについて図4〜図5Bを用いて説明する。図4は、現用サーバで操作電文のロストが発生した時の処理の流れを示す図である。本実施例では、現用サーバが唯一トランザクション処理(各種ID採番、排他制御等)を行うため、現用サーバに対する操作電文がロストした場合、現用サーバから応答が来ない状態となる。クライアント装置3は、現用サーバからの応答を一定時間待ち合わせ、一定時間を越えても現用サーバから応答がない場合は、現用サーバに対して、操作電文の再送を行う。一定回数再送しても、現用サーバから応答がなかった場合は、クライアント装置3は、永続的な通信異常であると判断し、ロールバックを行い(待機サーバに蓄積されているトラン情報をクリアする)、アプリケーションにエラーを通知する。
すなわち、図4に示すように、クライアント#1は、データ追加の要求電文11をサーバ#101、#201に送信する(1)。そして、現用サーバに至る経路上で電文ロストが発生する(2)。一方、要求電文11を受信すると、待機サーバは、仮トランIDでデータ「rec#1」を管理する(3)。このタイミングでは、トランID及びデータIDは空白であり、次回要求電文受信時に更新される。そして、待機サーバはクライアント#1に応答する。クライアント#1は、待機サーバから応答があれば、待機サーバの識別番号を待機応答記憶部65のサーバNoに追記する(4)。
また、クライアント#1は、現用サーバからの応答を待ち、一定時間現用サーバから応答がなければ、要求電文11を再送する(5)。そして、クライアント#1は、一定回数再送しても、現用サーバから応答がなければ、処理をロールバックし、エラー復帰する。
図5A及び図5Bは、待機サーバで操作電文のロストが発生した時の処理の流れを示す第1の図及び第2の図である。本実施例では、トランザクション処理のレスポンス向上のため、以下の方式で応答を待合わせる。
・コミットの要求電文:現用サーバおよび待機サーバからの応答を同期方式で待合わせる。
・追加・更新・削除の要求電文:現用サーバからの応答は同期方式で待合わせ、待機サーバからの応答は非同期方式で待合わせる。
クライアント装置3は、コミット実行時に追加・更新・削除の要求電文に対する待機サーバの応答が確認できていない場合は、待機サーバへの電文がロストしたと判断し、コミット依頼時に現用サーバから待機サーバにデータをミラーリングする方式に切替える。
例えば、図5Aに示すように、クライアント#1が、データ更新の要求電文13にトランID及びデータIDを付与する(1)。そして、クライアント#1は、データ更新の要求電文13をサーバ#101、サーバ#201に送信する(2)。
待機サーバへの要求電文がパケットロストしたため、待機サーバは、データ「rec#1」のデータIDの更新ができない(3)。一方、現用サーバは、応答電文14を送信し、クライアント#1は、現用サーバの応答電文14に含まれるデータID及びトランIDをデータID記憶部66に保存する(4)。ただし、待機サーバへの要求電文の送信に失敗したので、クライアント#1は、待機サーバからの応答は受信できない。したがって、クライアント#1は待機応答記憶部65のサーバNoに情報を書き込むことができず、処理完了とならない。また、トランID及びデータIDの送達確認ができないため、データID記憶部66のNoが「1」である情報は削除されない(5)。
そして、クライアント#1は、図5Bに示すように、待機応答記憶部65で、トランIDが「T#001」のトランザクションに関して待機サーバの処理が完了になっていないので、ミラーリングコミットフラグをONにしてコミットの要求電文17を送信する(6)。クライアント#1は、コミット時点で待機応答記憶部65に未応答のエントリが1個以上記録されていれば、ミラーリング方式に切替える。
現用サーバは、要求電文17を受信すると、コミット処理を実行する(7)。一方、待機サーバは、要求電文17を受信すると、ミラーリングコミットフラグがONなので、現用サーバからの指示を待つ(8)。そして、現用サーバは、ミラーリングコミットフラグがONなので、コミット対象のデータをミラーリングする(9)。そして、待機サーバは、ミラーリングによるコミットを行う(10)。
次に、コミット電文ロスト時の処理の流れについて説明する。現用サーバと待機サーバに同時にコミット処理の要求電文を送信し、並列にコミット処理を行った場合、一部のサーバはコミットが成功、一部のサーバはコミットが失敗という状態になると、サーバ間でデータの整合性がとれていない状態となる。このため、別のクライアント装置3から同一データに対する操作が来た場合にトランザクションの整合性がとれない。
そこで、本実施例では、情報処理システムは以下の処理を行う。なお、ここでは、トランザクションのコミット電文再送中のクライアント装置3をクライアント#1とし、クライアント#1のコミット電文再送中に、同一データに対するトランザクションを行ったクライアント装置3をクライアント#2とする。
・コミットの要求電文ロスト時は、クライアント#1側で要求電文の再送を行う。
・現用サーバへのコミットの要求電文がロストした場合は、クライアント#2の操作要求時に、現用サーバは、トラン情報記憶部55aの情報から同一データに対してクライアント#1がトランザクション中であることを検知し、クライアント#2にリトライさせる。
・待機サーバへのコミットの要求電文がロストした場合は、現用サーバは、クライアント#1に対するトランザクション処理が完了した後も、トラン情報記憶部55aの情報を残しておく。そして、後続するクライアント#2に対するトランザクション処理開始時に、現用サーバ及び待機サーバは、それぞれのトラン情報記憶部55a及び55eに格納されているトランID及び仮トランIDから、同一データがコミット中であることを検知する。そして、現用サーバ及び待機サーバは、クライアント#2にリトライさせるように、先行トランの情報を送信する。
現用サーバに対するコミット要求の電文がロストした場合、現用サーバ及び待機サーバは以下の状態となる。
・現用サーバ:コミット失敗。トランザクション中の状態。データに対するロック(排他)獲得済み。
・待機サーバ:コミット成功。トランザクションはコミットされている状態。
この場合、先行するクライアント#1が現用サーバに対するコミット要求再送中に、後続するクライアント#2から同一データに対する更新操作の要求電文が来たとしても、現用サーバ側で、既にクライアント#1でデータに対してロック獲得済みである。このため、クライアント#2の更新操作の要求電文が届いた時点で、現用サーバは、クライアント#2の更新操作をキャンセル(ロールバック)させることができる。
待機サーバに対するコミット要求の電文がロストした場合、現用サーバ及び待機サーバは以下の状態となる。
・現用サーバ:コミット成功。トランザクションはコミットされている状態。
・待機サーバ:コミット失敗。トランザクション中の状態。トランID、データID未特定の状態あり。
現用サーバは、クライアント#1に対するトランザクション処理が完了した後も、トラン情報記憶部55aの情報を残しておく。そして、現用サーバは、後続するクライアント#2に対するトランザクション処理を開始する際に、同一データ(同一データID)に対してトラン情報記憶部55aに残っているトランID及び仮トランIDをクライアント#2に通知する。
一方、待機サーバは、データ比較(文字列・バイナリ比較等)やインデックスキー値比較等から、クライアント#2と「同一データらしきデータ(データID不定のため同一性を確定できない)」をコミット中であるクライアント#1がいることを予測する。そして、待機サーバは、予測した先行トランのトランID及び仮トランIDをクライアント#2に通知する。
クライアント#2は、待機サーバで予測した先行トランの情報と、現用サーバの応答から得られた先行トランの情報を、仮トランIDで対応付けることで、同一データに対して、コミット中のトランザクションが存在することを検知する。
なお、操作(更新、追加、削除)するデータを特定するためにインデックスを使用する場合が多いが、インデックスに一意性制約がついていない場合もあるため、待機サーバは、インデックスキー値による比較を行っても、あくまで先行トランを予測しかできない。クライアント#2は、現用サーバからの応答と待機サーバからの応答を突合せることで、始めて、先行トランの有無を判断できる。
図6は、待機サーバでコミット電文のロストが発生した時の処理の流れを示す図である。図6に示すように、現用サーバでは、トランID「T#001」のコミットが成功する(1)。そして、待機サーバは、次回、クライアント#1から要求が来るまで、すなわち、クライアント#1で待機サーバのコミットが完了するまでトラン情報記憶部55aが記憶する情報を保持する(2)。
このとき、クライアント#1は、待機サーバへのトランID「T#001」のコミット電文がロストしたため、待機サーバにコミット電文を再送中の状態にある(3)。また、クライアント#2がデータID「100」に対する更新処理を仮トランIDを「T−CL#2」として要求する(4)。
すると、現用サーバで、クライアント#2のトラン(仮トランID:「T−CL#2」)の処理を実施する。現用サーバは、加えて、処理するデータ「rec#1」と同一データID「100」のデータを先行してトランID「T#001」(T−CL#1)で処理していたことを検知する(5)。そして、現用サーバは、クライアント#2へ、トランID「T#002」及び仮トランID「T−CL#2」の応答と同時に、先行トランのトランID「T#001」及び仮トランID「T−CL#1」を応答する(6)。
一方、待機サーバは、クライアント#2の仮トランID「T−CL#2」で処理するデータ又はインデックスキー値を比較し、同一らしきデータを処理している先行トラン(T−CL#1)があることを検知する(7)。そして、待機サーバは、クライアント#2のトラン(T−CL#2)の情報に加え、先行トラン(T−CL#1)の情報も応答する(8)。
そして、現用サーバ及び待機サーバからの応答を受け取ると、クライアント#2は、待機サーバに、同一データを操作する先行トラン(T−CL#1)が存在することを検知する。そして、クライアント#2は、トラン(T#002、T−CL#2)をロールバックし、アプリにリトライさせる(9)。ここで、「アプリ」は、アプリケーションである。
次に、通信遅延により電文追越しが発生した時の処理の流れについて説明する。実施例に係る情報処理システムでは、現用サーバは、処理依頼の要求電文が到着した順番で、トランザクションを開始する。同一データを操作する場合は、後続のトランザクションは先行するトランザクションが完了するのを待たされるか、又は、クライアント装置3はアプリケーションにエラー通知を行う。一方、待機サーバは応答電文を非同期方式で待合わせており、かつ、電文の追越しを保証しない一般的なネットワーク環境を考えると、現用サーバにおける要求電文の到着順と異なる順番で待機サーバが要求電文を受信する場合がありえる。
実施例に係る情報処理システムでは、現用サーバは、唯一トランザクション処理を行い、クライアント装置3を介して、現用サーバの情報(トランIDやデータID)を待機サーバに通知する。このため、待機サーバ側の受信順番が異なっても、現用サーバと待機サーバでデータの整合性を維持することができる。
図7A〜図7Cは、通信遅延により電文追越しが発生した時の処理の流れを示す第1の図〜第3の図である。図7Aは、電文追越しが発生しない正常な場合を示し、図7Bは、現用サーバと待機サーバとの間で電文の到着順が一致していない場合を示し、図7Cは、複数クライアントの電文が現用サーバと待機サーバとの間で到着順が一致していない場合を示す。
図7Aに示すように、正常な場合には、現用サーバがクライアント#1から要求電文#1を受信し(t1)、待機サーバがクライアント#1から要求電文#1を受信する(t2)。そして、現用サーバがトラン情報記憶部55aを更新してクライアント#1に応答し(t3)、待機サーバがトラン情報記憶部55eを更新してクライアント#1に応答する(t4)。
そして、現用サーバがクライアント#1から要求電文#2を受信し(t5)、待機サーバがクライアント#1から要求電文#2を受信する(t6)。そして、現用サーバがトラン情報記憶部55aを更新してクライアント#1に応答し(t7)、待機サーバがトラン情報記憶部55eを更新してクライアント#1に応答する(t8)。
一方、図7Bでは、現用サーバは要求電文#1、要求電文#2の順番で受信し、待機サーバは要求電文#2、要求電文#1の順番で受信する。このような電文の追越しは、オンプレミス環境ではほとんど発生しないが、ネットワーク機器を複数介し、かつ、通信品質が保証されないネットワーク環境(安価で低速なネットワーク機器やインターネット環境)等を利用するクラウド環境では、考慮が必要である。
図7Bに示すように、現用サーバは、クライアント#1から要求電文#1を受信し(t11)、トラン情報記憶部55aを更新してクライアント#1に応答する(t12)。そして、現用サーバがクライアント#1から要求電文#2を受信し(t13)、待機サーバがクライアント#1から要求電文#2を受信する(t14)。
そして、現用サーバがトラン情報記憶部55aを更新してクライアント#1に応答し(t15)、待機サーバがトラン情報記憶部55eを更新してクライアント#1に応答する(t16)。そして、待機サーバが遅れて到着した要求電文#1を受信し(t17)、トラン情報記憶部55eを更新してクライアント#1に応答する(t18)。この時点での待機サーバのトラン情報記憶部55eの状態を図7Aと比較すると、トラン情報記憶部55eの状態は状態S#2で同じである。
また、図7Cでは、異なるクライアント装置3から送信された要求電文の到着順番が、現用サーバと待機サーバで異なった場合であっても、現用サーバに到着した順番で要求電文が処理される。同一データに対する操作要求であれば、先に現用サーバに要求電文が到着した方が優先され、トランザクションの処理が開始される。後から現用サーバに要求電文が到着したクライアント装置3は、排他獲得に失敗する。このため、先に待機サーバに到着したトランザクション(仮トランID:「T−CL#2」)は、ロールバック(又はは、リトライ)される。
図7Cに示すように、現用サーバは、クライアント#1から要求電文#11を受信し(t21)、トラン情報記憶部55aを更新してクライアント#1に応答する(t22)。そして、現用サーバは、クライアント#2から要求電文#21を受信する(t23)が、既にT−CL#1でrec#1の排他を獲得済みであるので、クライアント#2にT−CL#2の失敗を応答する(t25)。
一方、待機サーバは、クライアント#2から要求電文#21を受信し(t24)、トラン情報記憶部55eを更新してクライアント#2に応答する(t26)。そして、待機サーバは、遅れて到着した要求電文#11を受信し(t27)、トラン情報記憶部55eを更新してクライアント#1に応答する(t28)。
また、クライアント#2は、T−CL#2の失敗を通知されると、T−CL#2のロールバックを現用サーバと待機サーバに指示する(t29,t30)。指示を受けた現用サーバは何もしないが、指示を受けた待機サーバはロールバックにより、トラン情報記憶部55eのT−CL#2の情報をクリアする。そして、現用サーバと待機サーバは、クライアント#2に応答を返す(t31,t32)。
次に、実施例に係る情報処理システムの構成について説明する。図8は、実施例に係る情報処理システムの構成を示す図である。図8に示すように、実施例に係る情報処理システム1は、サーバ装置#1〜サーバ装置#3で表される3台のサーバ装置2と、クライアント#1及びクライアント#2で表される2台のクライアント装置3を有する。
クライアント装置3とサーバ装置2は、業務用の通信を行うための業務LAN4a及びネットワーク4を介して接続される。また、サーバ装置2は、ミラーリングを行うための同期LAN4bで接続される。サーバ装置#1は、現用サーバとして動作し、サーバ装置#2及びサーバ装置#3は待機サーバとして動作する。なお、図8では、2台のクライアント装置3及び待機サーバを示すが、情報処理システム1は、3台以上のクライアント装置3及び待機サーバを有してよい。
図9は、サーバ装置2のハードウェア構成の一例を示す図である。図9に示すように、サーバ装置2は、CPU(Central Processing Unit)21と、メモリ22と、HDD(Hard Disk Drive)23と、画像信号処理部24と、入力信号処理部25と、磁気ディスクドライブ26と、通信インタフェース27とを有する。CPU21、メモリ22、HDD23、画像信号処理部24、入力信号処理部25、磁気ディスクドライブ26及び通信インタフェース27は、バス28により接続される。
CPU21は、メモリ22からプログラムを読み出して実行する中央処理装置である。メモリ22は、プログラムやプログラムの実行途中結果などを記憶するRAM(Random Access Memory)である。HDD23は、プログラムやデータを格納するディスク装置である。HDD23は、サーバ装置2を制御するサーバ制御プログラム5aを記憶する。
画像信号処理部24は、ディスプレイ41への表示を制御する。入力信号処理部25は、入力デバイス42からの入力を制御する。磁気ディスクドライブ26は、磁気ディスク43を制御する。通信インタフェース27は、業務LAN4a及びネットワーク4を介した通信を制御する。また、通信インタフェース27は、同期LAN4bを介した通信を制御する。
そして、サーバ制御プログラム5aは、CD・DVD等の磁気ディスクに記憶され、磁気ディスクから読み出されてサーバ装置2にインストールされる。あるいは、サーバ制御プログラム5aは、ネットワーク4を介して接続された他のサーバ装置のデータベースなどに記憶され、これらのデータベースから読み出されてサーバ装置2にインストールされる。そして、インストールされたサーバ制御プログラム5aは、HDD23からメモリ22に読出されてCPU21によって実行される。
図10は、クライアント装置3のハードウェア構成の一例を示す図である。図10に示すように、クライアント装置3は、CPU31と、メモリ32と、HDD33と、画像信号処理部34と、入力信号処理部35と、磁気ディスクドライブ36と、通信インタフェース37とを有する。CPU31、メモリ32、HDD33、画像信号処理部34、入力信号処理部35、磁気ディスクドライブ36及び通信インタフェース37は、バス38により接続される。
CPU31は、メモリ32からプログラムを読み出して実行する中央処理装置である。メモリ32は、プログラムやプログラムの実行途中結果などを記憶するRAMである。HDD33は、プログラムやデータを格納するディスク装置である。HDD33は、クライアント装置3を制御するクライアント制御プログラム6aを記憶する。また、HDD33は、クライアント装置3で実行されるアプリケーションプログラム7aを記憶する。
画像信号処理部34は、ディスプレイ46への表示を制御する。入力信号処理部35は、入力デバイス47からの入力を制御する。磁気ディスクドライブ36は、磁気ディスク48を制御する。通信インタフェース37は、ネットワーク4を介した通信を制御する。
そして、クライアント制御プログラム6a及びアプリケーションプログラム7aは、CD・DVD等の磁気ディスクに記憶され、磁気ディスクから読み出されてクライアント装置3にインストールされる。あるいは、クライアント制御プログラム6a及びアプリケーションプログラム7aは、ネットワーク4を介して接続された他のサーバ装置のデータベースなどに記憶され、これらのデータベースから読み出されてクライアント装置3にインストールされる。そして、インストールされたクライアント制御プログラム6a及びアプリケーションプログラム7aは、HDD33からメモリ32に読出されてCPU31によって実行される。
次に、サーバ装置2及びクライアント装置3の機能構成について説明する。図11は、サーバ装置2及びクライアント装置3の機能構成を示す図である。図11に示すように、サーバ装置2は、データ記憶部5bとサーバ制御部5とを有する。
データ記憶部5bは、クライアント装置3で動作するアプリケーション7が使用するデータを記憶する。データ記憶部5bは、メモリ22上に実現されるがHDD23上に実現されてもよい。図12は、データ記憶部5bの一例を示す図である。図12に示すように、データ記憶部5bは、データIDとデータを対応付けて記憶する。データIDは、データを識別する識別子である。例えば、データIDが「00000101」であるデータは「“abcdef”」である。
サーバ制御部5は、サーバ装置2を制御する。サーバ制御部5は、図9に示したサーバ制御プログラム5aがCPU21により実行されることで実現される。サーバ制御部5は、処理制御部51と通信制御部52とを有する。処理制御部51は、トランザクションに関する処理を制御する。通信制御部52は、通信インタフェース27を用いてクライアント装置3及び他のサーバ装置2との通信を制御する。
処理制御部51は、現用系処理制御部51aと待機系処理制御部51bとを有する。現用系処理制御部51aは、サーバ装置2が現用サーバとして動作する時に、トランザクションに関する処理を制御し、待機系処理制御部51bは、サーバ装置2が待機サーバとして動作する時に、トランザクションに関する処理を制御する。
現用系処理制御部51aは、トラン情報記憶部55aと、トラン処理部55bと、トランID生成部55cと、データID生成部55dとを有する。待機系処理制御部51bは、トラン情報記憶部55eとデータ管理部55fを有する。
トラン情報記憶部55aは、トランザクションに関する情報を記憶する。図13は、トラン情報記憶部55aの一例を示す図である。図13に示すように、トラン情報記憶部55aは、コミット状態と、トランIDと、仮トランIDと、Noと、インデックスキー値と、データIDと、データとを対応付けて要求電文毎に記憶する。
コミット状態は、コミットが完了したか否かを示す。コミット状態が「1」である場合には、コミットが完了し、コミット状態が「0」である場合には、コミットが未完である。インデックスキー値は、データのインデックスキーの値である。例えば、トランIDが「01000001」であり、仮トランIDが「xxx.xxx.xxx.101−12345−67890−201」であり、Noが「1」である要求電文のデータは「“abcdef”」であり、コミットが未完了である。データの識別子は「0000000101」であり、インデックスキー値は「“key1”」である。なお、図1A〜図7Cでは、コミット状態、インデックスキー値は省略されている。
トラン処理部55bは、クライアント装置3から要求電文を受信し、要求電文に応じた処理を行って、クライアント装置3に応答電文を送信する。
具体的には、トラン処理部55bは、データの追加を要求する要求電文を受信すると、トランザクション処理を実行する。トランザクション処理には、排他処理等が含まれる。そして、トラン処理部55bは、トランID生成部55cにトランIDの生成を指示し、データID生成部55dにデータIDの生成を指示する。
そして、トラン処理部55bは、生成されたトランID及びデータIDと要求電文の情報に基づいてトラン情報記憶部55aを更新する。そして、トラン処理部55bは、生成されたトランID及びデータIDを応答電文に含め、クライアント装置3に応答電文を送信する。
また、トラン処理部55bは、データの更新を要求する要求電文を受信すると、トランザクション処理を実行する。そして、トラン処理部55bは、データID生成部55dにデータIDの生成を指示し、生成されたデータIDと要求電文の情報に基づいてトラン情報記憶部55aを更新する。そして、トラン処理部55bは、生成されたデータIDを応答電文に含め、クライアント装置3に応答電文を送信する。
また、トラン処理部55bは、コミットを要求する要求電文を受信すると、トラン情報記憶部55aが記憶する情報をデータ記憶部5bに反映させるコミット処理を行う。コミット処理を行ったトランザクションに関して、トラン処理部55bは、トラン情報記憶部55aが記憶する情報を消さずに保持する。そして、トラン処理部55bは、同じクライアント装置3から次の要求電文を受信すると、コミット処理を行ったトランザクションに関して、トラン情報記憶部55aが記憶する情報を消す。
また、トラン処理部55bは、コミット要求のミラーリングフラグがONである場合には、トラン情報記憶部55aが記憶する情報を待機サーバに送信し、コミットを指示する。また、トラン処理部55bは、クライアント装置3からの要求に基づいて待機サーバが処理中のデータについて別のクライアント装置3から要求電文を受信したことをトラン情報記憶部55aを用いて検知する。そして、トラン処理部55bは、応答電文に先行トランの情報を含めて別のクライアント装置3に応答する。
トランID生成部55cは、トラン処理部55bの指示に基づいてトランIDを生成する。データID生成部55dは、トラン処理部55bの指示に基づいてデータIDを生成する。
トラン情報記憶部55eは、トランザクションに関する情報を記憶する。トラン情報記憶部55eは、トラン情報記憶部55aと同様のデータ構造を有する。
データ管理部55fは、クライアント装置3から要求電文を受信し、要求電文に応じた処理を行って、クライアント装置3に応答電文を送信する。具体的には、トラン処理部55bは、データ操作を要求する要求電文を受信すると、要求電文に含まれる情報に基づいてトラン情報記憶部55eを更新し、クライアント装置3に応答電文を送信する。
データ管理部55fは、要求電文に前回の要求電文に関するトランID及びデータIDが含まれる場合には、トラン情報記憶部55eが記憶する前回の要求電文に関する情報を更新する。すなわち、データ管理部55fは、トラン情報記憶部55eが記憶する前回の要求電文に関する情報において、トランIDが空白である場合には、トランIDを追記し、データIDが空白である場合には、データIDを追記する。
また、データ管理部55fは、クライアント装置3からコミットを要求する要求電文を受信すると、トラン情報記憶部55eが記憶する情報をデータ記憶部5bに反映させるコミット処理を行う。コミット処理を行ったトランザクションに関して、データ管理部55fは、トラン情報記憶部55eが記憶する情報を消さずに保持する。そして、データ管理部55fは、同じクライアント装置3から次の要求電文を受信すると、コミット処理を行ったトランザクションに関して、トラン情報記憶部55eが記憶する情報を消す。
また、データ管理部55fは、コミット要求のミラーリングフラグがONである場合には、コミット処理を行うことなく現用サーバからの指示を待つ。そして、現用サーバからミラーリング指示を受信すると、データ管理部55fは、現用サーバから送信された情報に基づいてコミット処理を行う。
また、データ管理部55fは、クライアント装置3からの要求電文により処理するデータと同一の可能性があるデータをトラン情報記憶部55eが記憶しているか否かをインデックスキー値又はデータを比較することにより判定する。そして、同一の可能性があるデータをトラン情報記憶部55eが記憶している場合には、データ管理部55fは、同一の可能性があるデータに対応する仮トランIDを付加してクライアント装置3に応答する。
クライアント装置3は、クライアント装置3を制御するクライアント制御部6とアプリケーション7を有する。クライアント制御部6は、図10に示したクライアント制御プログラム6aがCPU31により実行されることで実現される。アプリケーション7は、図10に示したアプリケーションプログラム7aがCPU31により実行されることでクライアント装置3上で実現される。
クライアント制御部61は、処理制御部61と通信制御部62とを有する。処理制御部61は、トランザクションに関する処理を制御する。通信制御部62は、通信インタフェース37を用いてサーバ装置2との通信を制御する。
処理制御部61は、待機応答記憶部65と、データID記憶部66と、仮トランID生成部67と、要求送信部68と、応答受信部69とを有する。
待機応答記憶部65は、待機サーバの応答状態に関する情報を記憶する。図14A及び図14Bは、それぞれ待機応答記憶部65の一例を示す図である。図14Aは、待機サーバが1台の場合を示し、図14Bは、待機サーバが2台の場合を示す。
図14A及び14Bに示すように、待機応答記憶部65は、トランIDとNoと待機サーバNo#1とを要求電文毎に記憶する。待機サーバが2台の場合には、待機応答記憶部65は、さらに待機サーバNo#2を記憶する。
待機サーバNo#1及び待機サーバNo#2は、クライアント装置3により応答が受信された待機サーバを識別する番号である。応答を受信していない場合には、待機サーバNo#1及び待機サーバNo#2は、空白である。例えば、図14Aでは、トランIDが「01000001」であり、Noが「1」である要求電文については、待機サーバNo#1が「1」であるクライアント装置3から応答が来ている。
データID記憶部66は、データID及び関連する情報を記憶する。図15は、データID記憶部66の一例を示す図である。図15に示すように、データID記憶部66は、トランIDと、仮トランIDと、Noと、データIDとを対応付けて記憶する。例えば、トランIDが「01000001」であり、仮トランIDが「xxx.xxx.xxx.101−12345−67890−201」であり、Noが「1」である要求電文のデータの識別子は「00000101」である。
仮トランID生成部67は、仮トランIDを生成する。図16は、仮トランIDの例を示す図である。図2に示したように、仮トランIDは、IPアドレスとプロセスIDとスレッドIDと通番とから構成される。図16に示すように、IPアドレスが「xxx.xxx.xxx.101」であり、プロセスIDが「12345」であり、スレッドIDが「67890」であり、通番が「201」である場合には、仮トランIDは、それらを「−」で結合した値である。すなわち、仮トランIDは、「xxx.xxx.xxx.101−12345−67890−201」である。
要求送信部68は、要求電文を作成し、現用サーバと待機サーバへ送信する。具体的には、要求送信部68は、トランザクションの最初の要求電文を送信する時に、仮トランID生成部67に仮トランIDの生成を指示し、待機応答記憶部65及びデータID記憶部66に通番とともに書き込む。そして、要求送信部68は、要求電文に仮トランIDを加え、現用サーバと待機サーバへ送信する。
また、要求送信部68は、2回目以降に要求電文を送信する場合には、データID記憶部66を参照し、現用サーバから1つ前の要求電文に対する応答電文で送信されたトランIDとデータIDを要求電文に追加して現用サーバと待機サーバへ送信する。
また、要求送信部68は、コミットの要求電文を送信する場合には、待機応答記憶部65を確認する。そして、要求送信部68は、全ての待機サーバから応答を受信している場合には、ミラーリングコミットフラグを「0」に設定し、応答を受信していない待機サーバがある場合には、ミラーリングコミットフラグを「1」に設定する。そして、要求送信部68は、現用サーバから1つ前の要求電文に対する応答電文で送信されたトランIDとデータIDを要求電文に追加して現用サーバと待機サーバへ送信する。
応答受信部69は、サーバ装置2から送信された応答電文を受信して処理する。応答受信部69は、現用応答処理部69aと待機応答処理部69bとを有する。現用応答処理部69aは、現用サーバから送信された応答電文を受信して処理する。待機応答処理部69bは、待機サーバから送信された応答電文を受信して処理する。
具体的には、現用応答処理部69aは、現用サーバからデータ操作に対する応答電文を受信すると、応答電文に含まれるトランIDとデータIDを仮トランIDに対応付けてデータID記憶部66に格納する。また、現用応答処理部69aは、現用サーバからトランIDを最初に受信した場合には、待機応答記憶部65の仮トランIDをトランIDで書き換える。
また、現用応答処理部69aは、データ操作に対する応答電文を一定時間現用サーバから受信できない場合には、データ操作の要求電文を再送する。一定回数再送しても現用サーバから応答がない場合には、現用応答処理部69aは、処理をロールバックし、エラー復帰する。
また、現用応答処理部69aは、要求電文に対する応答電文に他のクライアント装置3による先行トランの情報が含まれている場合には、待機応答処理部69bに先行トランの情報を通知する。
待機応答処理部69bは、待機サーバから応答を受信すると、応答を送信した待機サーバの識別子を待機応答記憶部65のサーバNoに追記する。また、待機応答処理部69bは、待機サーバから応答を受信すると、データID記憶部66から1つ前の通番の情報を削除する。
また、待機応答処理部69bは、応答に他のクライアント装置3による先行トランの情報が含まれている場合には、現用応答処理部69aから通知された先行トラン情報に含まれる仮トランIDと応答に含まれる仮トランIDが一致するか否かを判定する。そして、一致した場合には、待機応答処理部69bは、現用サーバと待機サーバにロールバックを指示し、アプリケーション7にリトライを要求する。
次に、電文の例について図17〜図20を用いて説明する。図17は、要求電文(データ操作)の例を示す図である。図17に示すように、要求電文(データ操作)には、制御情報、データ、仮トランID、トランID、No及びデータIDが含まれる。
制御情報は、データ操作が追加、更新、削除のいずれであるかを示す。データは、操作対象のデータである。制御情報とデータがデータ操作の要求情報である。トランID、No及びデータIDは、以前処理したデータの管理情報である。なお、図1A〜図7Cでは、制御情報は省略されている。
図18は、応答電文(データ操作)の例を示す図である。図18(a)は、直前でコミットされたトランザクションがない場合を示し、図18(b)は、直前でコミットされたトランザクションが1つある場合を示し、図18(c)は、直前でコミットされたトランザクションが2つある場合を示す。
図18に示すように、応答電文(データ操作)には、制御情報、トランID、データID及びPREV−TID数が含まれる。また、応答電文(データ操作)には、直前でコミットされたトランザクションが1つある場合には、PREV仮トランID#1が含まれ、2つある場合には、PREV仮トランID#1及びPREV仮トランID#2が含まれる。
図18において、トランIDとデータIDは今回処理したデータの管理情報である。PREV−TID数は、直前でコミットされたトランザクションの数であり、図18(a)では「0」であり、図18(b)では「1」であり、図18(c)では「2」である。PREV仮トランID#1及びPREV仮トランID#2は、直前でコミットされたトランザクションの仮トランIDである。
図19は、要求電文(コミット)の例を示す図である。図19(a)は、ミラーリングコミットフラグがOFF(0)である場合を示し、図19(b)は、ミラーリングコミットフラグがON(1)である場合を示す。図19に示すように、要求電文(コミット)には、制御情報、ミラーリングコミットフラグ、仮トランID、トランID、No及びデータIDが含まれる。
制御情報とミラーリングコミットフラグはコミットの要求情報であり、トランIDとNoとデータIDは、以前処理したデータの管理情報である。なお、ミラーリングする場合には、NoとデータIDは不要である。
図20は、応答電文(コミット)の例を示す図である。図20に示すように、応答電文(コミット)には、制御情報とトランIDが含まれる。トランIDは、今回処理したデータの管理情報である。
次に、情報処理システム1の処理の全体フローについて説明する。なお、以下では、クライアント#1を1台のクライアント装置3の例とし、クライアント#1及びクライアント#2を2台のクライアント装置3の例として説明する。
図21Aは、全体フローを示す第1の図である。図21Aに示すように、クライアント#1のクライアント制御部6は、仮トランIDを作成し(t41)、データ操作依頼#1を現用サーバと待機サーバに送信する(t42)。なお、現用サーバと待機サーバへのデータ送信は、マルチキャスト通信等の一斉通信でもよい。
そして、現用サーバのサーバ制御部5は、トランザクション処理を行い、トランID、データIDを決定する(t43)。一方、待機サーバのサーバ制御部5は、トラン情報を記憶する(t44)。ここで、トラン情報とは、トラン情報記憶部55eが要求電文毎に記憶する情報である。ただし、この時点では、トランID、データIDは未確定である。
そして、クライアント制御部6は、現用サーバからの応答電文を受信すると、データID記憶部66に1回目のトランID、データIDを記憶する(t45)。また、クライアント制御部6は、待機サーバからの応答を受信すると、待機応答記憶部65に待機サーバの応答結果を記憶する(t46)。t41〜t46の処理は、1回目のデータ操作に対応する処理である。
そして、クライアント制御部6は、データ操作依頼#2を現用サーバと待機サーバに送信する(t47)。この時、クライアント制御部6は、1回目のトランID、データIDを付加する。そして、現用サーバのサーバ制御部5は、トランザクション処理を行う(t48)。一方、待機サーバのサーバ制御部5は、トラン情報を記憶する(t49)。この時、待機サーバのサーバ制御部5は、1回目のトランID、データIDを記録する。
そして、クライアント制御部6は、現用サーバからの応答電文を受信すると、データID記憶部66に2回目のデータIDを記憶する(t50)。また、クライアント制御部6は、待機サーバからの応答を受信すると、待機応答記憶部65に待機サーバの応答結果を記憶する(t51)。t47〜t51の処理は、2回目のデータ操作に対応する処理である。データ操作が繰り返された場合には、t47〜t51の処理が繰り返される。
そして、クライアント制御部6は、コミット依頼を現用サーバと待機サーバに送信する(t52)。この時、クライアント制御部6は、2回目のデータIDを付加する。そして、クライアント制御部6は、現用サーバと待機サーバの両方から応答が来るのを待つ(t53)。
現用サーバのサーバ制御部5は、コミット依頼を受信すると、コミット処理を行う(t54)。また、待機サーバのサーバ制御部5は、コミット依頼を受信すると、トラン情報を記憶する(t55)。この時、待機サーバのサーバ制御部5は、2回目のデータIDを記録する。そして、待機サーバのサーバ制御部5は、コミット処理を行う(t56)。t52〜t56の処理は、コミット処理である。
図21Bは、全体フローを示す第2の図である。図21Bは、図21Aと比較して、電文を示す一方でクライアント#1がデータを記憶する処理を省略している。図21Bにおいて、仮TIDは仮トランIDであり、TIDはトランIDである。また、MRRは、ミラーリングコミットフラグである。
図21Bでは、初回のデータ操作に対応する処理をフェーズ#1とし、2回目以降のデータ操作に対応する処理をフェーズ#2とし、コミット処理をフェーズ#3としている。以下の図22〜図30は、クライアント#1、現用サーバ及び待機サーバの処理のフローをフェーズ毎に示す。
図22は、クライアント#1による初回のデータ操作処理(フェーズ#1)のフローを示すフローチャートである。図22に示すように、クライアント#1は、仮トランID(仮TID#1)を作成し(ステップS1)、仮トランID(仮TID#1)とデータ#1を要求電文に設定する(ステップS2)。
そして、クライアント#1は、要求電文を現用サーバと待機サーバに送信する(ステップS3)。その後、クライアント#1は、応答電文を受信する(ステップS4)と、応答電文の送信元は現用サーバであるか待機サーバであるかを判定する(ステップS5)。そして、現用サーバである場合には、クライアント#1は、TID(TID#1)とデータID(データID#1)をデータID記憶部66に格納し、仮トランIDと紐づける(ステップS6)。
一方、応答電文の送信元が待機サーバである場合には、クライアント#1は、待機応答記憶部65に送信元の識別番号を格納し(ステップS7)、現用サーバの応答を受信済みか否かを判定する(ステップS8)。そして、クライアント#1は、現用サーバの応答を受信済みである場合には、フェーズ#1の処理を終了し、現用サーバの応答を受信済みでない場合には、ステップS4に戻る。
図23は、現用サーバによる初回のデータ操作処理(フェーズ#1)のフローを示すフローチャートである。図23に示すように、現用サーバは、クライアント#1からの要求電文を受信する(ステップS11)。そして、現用サーバは、仮トランIDに含まれるクライアント#1の情報からクライアント#1が前回コミットした情報(コミット状態「1」)をトラン情報記憶部55aから削除する(ステップS12)。
そして、現用サーバは、トランザクション処理を行い(ステップS13)、トランザクション処理が成功か否かを判定する(ステップS14)。ここで、トランザクション処理が成功か否かの判定は排他処理等の成功か否かにより行われる。そして、トランザクション処理が成功しなかった場合には、現用サーバは、ステップS18に進む。
一方、トランザクション処理が成功した場合には、現用サーバは、TID(TID#1)及びデータID(データID#1)を取得する(ステップS15)。そして、現用サーバは、TID(TID#1)、仮トランID、データID(データID#1)及びデータをトラン情報記憶部55aに格納する(ステップS16)。そして、現用サーバは、TID(TID#1)とデータID(データID#1)を応答電文に設定し(ステップS17)、クライアント#1に応答電文を返信する(ステップS18)。
図24は、待機サーバによる初回のデータ操作処理(フェーズ#1)のフローを示すフローチャートである。図24に示すように、待機サーバは、クライアント#1からの要求電文を受信する(ステップS21)。そして、待機サーバは、仮トランIDに含まれるクライアント#1の情報からクライアント#1が前回コミットした情報(コミット状態「1」)をトラン情報記憶部55eから削除する(ステップS22)。
そして、待機サーバは、仮トランID(仮TID#1)とデータをトラン情報記憶部55eに格納する(ステップS23)。そして、待機サーバは、仮TID(仮TID#1)を応答電文に設定し(ステップS24)、クライアント#1に応答電文を返信する(ステップS25)。
図25は、クライアント#1による2回目以降のデータ操作処理(フェーズ#2)のフローを示すフローチャートである。図25に示すように、クライアント#1は、仮トランID(仮TID#1)とデータ#2を要求電文に設定する(ステップS31)。そして、クライアント#1は、データID記憶部66に格納されている前回処理分のデータID(データID#1)とトランID(TID#1)を要求電文に設定する(ステップS32)。
そして、クライアント#1は、要求電文を現用サーバと待機サーバに送信する(ステップS33)。その後、クライアント#1は、応答電文を受信する(ステップS34)と、応答電文の送信元は現用サーバであるか待機サーバであるかを判定する(ステップS35)。そして、現用サーバである場合には、クライアント#1は、TID(TID#1)とデータID(データID#2)をデータID記憶部66に格納し、仮トランIDと紐づける(ステップS36)。
一方、応答電文の送信元が待機サーバである場合には、クライアント#1は、待機応答記憶部65に送信元の識別番号を格納し(ステップS37)、現用サーバの応答を受信済みか否かを判定する(ステップS38)。そして、クライアント#1は、現用サーバの応答を受信済みである場合には、フェーズ#1の処理を終了し、現用サーバの応答を受信済みでない場合には、ステップS34に戻る。
このように、クライアント#1は、待機サーバの応答を待たず(送達確認やリトライ制御を実施せず)に、現用サーバからの応答があった時点で、処理を先に進めるので、処理を高速化することができる。なお、クライアント#1は、コミット依頼までに待機サーバの応答がなければ、ミラーリングコミットフラグを「1」にしてコミット依頼を送信する(通常の処理では、ミラーリングコミットフラグは「0」)ことで、待機サーバの応答確認を非同期で実現している。なお、クライアント#1は、待機サーバに対しても、同期型で待合わせても良い。
図26は、現用サーバによる2回目以降のデータ操作処理(フェーズ#2)のフローを示すフローチャートである。図26に示すように、現用サーバは、クライアント#1からの要求電文を受信する(ステップS41)。そして、現用サーバは、トランザクション処理を行い(ステップS42)、トランザクション処理が成功か否かを判定する(ステップS43)。そして、トランザクション処理が成功しなかった場合には、現用サーバは、ステップS47に進む。
一方、トランザクション処理が成功した場合には、現用サーバは、TID(TID#1)及びデータID(データID#2)を取得する(ステップS44)。そして、現用サーバは、TID(TID#1)、仮トランID、データID(データID#2)及びデータをトラン情報記憶部55aに格納する(ステップS45)。そして、現用サーバは、TID(TID#1)とデータID(データID#2)を応答電文に設定し(ステップS46)、クライアント#1に応答電文を返信する(ステップS47)。
図27は、待機サーバによる2回目以降のデータ操作処理(フェーズ#2)のフローを示すフローチャートである。図27に示すように、待機サーバは、クライアント#1からの要求電文を受信する(ステップS51)。そして、待機サーバは、仮トランID(仮TID#1)とデータ(データ#2)をトラン情報記憶部55eに格納する(ステップS52)。
そして、待機サーバは、仮トランIDを基に、前回処理分のTID(TID#1)とデータID(データID#1)をトラン情報記憶部55eに格納する(ステップS53)。
そして、待機サーバは、仮TID(仮TID#1)を応答電文に設定し(ステップS54)、クライアント#1に応答電文を返信する(ステップS55)。
図28は、クライアント#1によるコミット処理(フェーズ#3)のフローを示すフローチャートである。図28に示すように、クライアント#1は、待機応答記憶部65を確認し、全ての待機サーバから応答を受信したか否かを判定する(ステップS61)。そして、クライアント#1は、全ての待機サーバから応答を受信していれば、ミラーリングコミットフラグを「0」に設定し(ステップS62)、応答を受信していない待機サーバがあれば、ミラーリングコミットフラグを「1」に設定する(ステップS63)。
そして、クライアント#1は、データID記憶部66に格納されている前回処理分のデータID(データID#2)とトランID(TID#1)を要求電文に設定する(ステップS64)。そして、クライアント#1は、仮トランIDを要求電文に設定する(ステップS65)。
そして、クライアント#1は、要求電文を現用サーバと待機サーバに送信する(ステップS66)。その後、クライアント#1は、現用サーバと待機サーバの両方の応答電文を受信する(ステップS67)。
図29は、現用サーバによるコミット処理(フェーズ#3)のフローを示すフローチャートである。図29に示すように、現用サーバは、クライアント#1からの要求電文を受信し(ステップS71)、指定されたTID(TID#1)を持つデータとデータIDをトラン情報記憶部55aからデータ記憶部5bにコミットする(ステップS72)。
そして、現用サーバは、要求電文のミラーリングコミットフラグが「0」であるか否かを判定し(ステップS73)、「0」である場合には、ステップS76へ進む。一方、「0」でない場合には、現用サーバは、コミット対象の全てのデータを全ての待機サーバに送信する(ミラーリング)(ステップS74)。そして、現用サーバは、全ての待機サーバからコミット完了の応答が来るのを待つ(ステップS75)。
そして、現用サーバは、トラン情報記憶部55aのTID#1のコミット状態をコミット済み「1」に変更し(ステップS76)、トランザクションを終了する(ステップS77)。トランザクションの終了処理には排他解除等が含まれる。そして、現用サーバは、コミットしたトランザクションのTID(TID#1)を応答電文に設定し(ステップS78)、クライアント#1に応答電文を返信する(ステップS79)。
図30は、待機サーバによるコミット処理(フェーズ#3)のフローを示すフローチャートである。図30に示すように、待機サーバは、要求電文を受信し(ステップS81)、コミット要求電文の送信元はクライアント#1であるか現用サーバであるかを判定する(ステップS82)。
そして、待機サーバは、コミット要求電文の送信元がクライアント#1である場合には、前回処理分のTID(TID#1)とデータID(データID#2)をトラン情報記憶部55eに格納する(ステップS83)。そして、待機サーバは、要求電文のミラーリングコミットフラグが「0」であるか否かを判定し(ステップS84)、「0」でない場合には処理を終了する。
一方、ミラーリングコミットフラグが「0」である場合には、待機サーバは、指定されたTID(TID#1)を持つデータとデータIDをトラン情報記憶部55eからデータ記憶部5bにコミットする(ステップS85)。
そして、待機サーバは、トラン情報記憶部55eのTID#1のコミット状態をコミット済み「1」に変更する(ステップS86)。そして、待機サーバは、コミットしたトランザクションの仮TID(仮TID#1)を応答電文に設定し(ステップS87)、クライアント#1に応答電文を返信する(ステップS88)。
一方、コミット要求電文の送信元が現用サーバである場合には、待機サーバは、現用サーバから、コミット対象のデータを全て受信する(ステップS89)。すなわち、待機サーバは、現用サーバからミラーリングに用いるデータを受信する。そして、待機サーバは、受信したデータをデータ記憶部5bにコミットする(ステップS90)。そして、待機サーバは、トラン情報記憶部55eのTID#1のコミット状態をコミット済み「1」に変更し(ステップS91)、現用サーバにコミット完了を応答する(ステップS92)。
このように、待機サーバに対して、コミット要求電文(コミット指示)を出すのは、現用サーバとクライアント#1の2種類がある。クライアント#1から直接コミット指示を出すか、現用サーバからコミット指示を出すかは、クライアント#1で決定する(コミット要求電文のミラーリングコミットフラグで切り分ける)。クライアント#1から直接コミット指示が来た場合は、待機サーバに対するトランザクション処理のすべての要求電文及び応答電文を確認できている状態なので、待機サーバは、自身で保有するトラン情報記憶部55eの情報を基に、コミット処理を行う。
次に、クライアント#1と現用サーバ又は待機サーバとの間で通信異常(パケットロス等)が発生した場合の処理のフローについて図31〜図34を用いて説明する。図31は、データ操作依頼時にクライアント#1と現用サーバとの間の通信経路で異常が発生した場合を示し、図32は、データ操作依頼時にクライアント#1と待機サーバとの間の通信経路で異常が発生した場合を示す。図33は、コミット依頼時にクライアント#1と現用サーバとの間の通信経路で異常が発生した場合を示し、図34は、コミット依頼時にクライアント#1と待機サーバとの間の通信経路で異常が発生した場合を示す。
図31は、データ操作依頼に対して現用サーバから応答がない場合のフローを示す図である。図31に示すように、クライアント#1は、仮TID#1を作成し(t61)、データ操作依頼を現用サーバと待機サーバに送信する(t62)。そして、クライアント#1と現用サーバとの間で通信異常が発生する。
データ操作依頼を受信した待機サーバは、トラン情報を記憶し(t63)、クライアント#1に応答する。ここで、トラン情報は、データ#1と仮TID#1である。一方、クライアント#1と現用サーバとの間の通信異常のため、現用サーバからの応答がないので、クライアント#1は、データ操作依頼を現用サーバに送信する(t64)。
そして、データ操作依頼を受信した現用サーバは、トランザクション処理を実施し(t65)、TID#1とデータID#1を含む応答電文をクライアント#1に送信する。このように、データ操作依頼時にクライアント#1と現用サーバとの間で通信異常が発生した場合には、クライアント#1は、リトライを行うことで、一時的な通信異常に対応することができる。
図32は、データ操作依頼に対して待機サーバから応答がない場合のフローを示す図である。図32に示すように、クライアント#1は、仮TID#1を作成し(t71)、データ操作依頼を現用サーバと待機サーバに送信する(t72)。そして、クライアント#1と待機サーバとの間で通信異常が発生する。
データ操作依頼を受信した現用サーバは、トランザクション処理を実施し(t73)、TID#1とデータID#1を含む応答電文をクライアント#1に送信する。クライアント#1は、現用サーバからの応答を受信し(t74)、データID記憶部66にて、データ#1とTID#1を対応付ける。
そして、クライアント#1は、コミット依頼を現用サーバと待機サーバに送信する(t75)。この時、クライアント#1は、MRRを「1」に設定する。そして、現用サーバは、コミット処理を行い(t76)、データのミラーリングを行う。ミラーリング指示を受信した待機サーバは、現用サーバから送信されたコミットデータを反映する(t77)。
このように、データ操作依頼時にクライアント#1と待機サーバとの間で通信異常が発生した場合には、クライアント#1は、MRRを「1」に設定することで、現用サーバにミラーリングを指示することができる。
図33は、コミット依頼に対して現用サーバから応答がない場合のフローを示す図である。図33に示すように、クライアント#1は、仮TID#1を作成し(t81)、データ操作依頼を現用サーバと待機サーバに送信する(t82)。
データ操作依頼を受信した現用サーバは、トランザクション処理を実施し(t83)、TID#1とデータID#1を含む応答電文をクライアント#1に送信する。また、データ操作依頼を受信した待機サーバは、トラン情報を記憶し(t84)、仮TID#1を含む応答電文をクライアント#1に送信する。
クライアント#1は、現用サーバと待機サーバからの応答を受信し、コミット依頼を現用サーバと待機サーバに送信する(t85)。この時、クライアント#1は、MRRを「0」に設定する。そして、クライアント#1と現用サーバとの間で通信異常が発生し、現用サーバはコミット依頼を受信できない。一方、待機サーバは、コミット処理を行い(t86)、応答をクライアント#1に返す。
クライアント#1は、再度コミット依頼を現用サーバに送信する(t87)。そして、現用サーバは、コミット処理を行い(t88)、応答をクライアント#1に返す。
このように、コミット依頼時にクライアント#1と現用サーバとの間で通信異常が発生した場合には、クライアント#1は、リトライを行うことで、一時的な通信異常に対応することができる。
図34は、コミット依頼に対して待機サーバから応答がない場合のフローを示す図である。図34に示すように、クライアント#1は、仮TID#1を作成し(t91)、データ操作依頼を現用サーバと待機サーバに送信する(t92)。
データ操作依頼を受信した現用サーバは、トランザクション処理を実施し(t93)、TID#1とデータID#1を含む応答電文をクライアント#1に送信する。また、データ操作依頼を受信した待機サーバは、トラン情報を記憶し(t94)、仮TID#1を含む応答電文をクライアント#1に送信する。
クライアント#1は、現用サーバと待機サーバからの応答を受信し、コミット依頼を現用サーバと待機サーバに送信する(t95)。この時、クライアント#1は、MRRを「0」に設定する。そして、クライアント#1と待機サーバとの間で通信異常が発生し、待機サーバはコミット依頼を受信できない。一方、現用サーバは、コミット処理を行い(t96)、応答をクライアント#1に返す。
クライアント#1は、再度コミット依頼を待機サーバに送信する(t97)。そして、待機サーバは、コミット処理を行い(t98)、応答をクライアント#1に返す。
このように、コミット依頼時にクライアント#1と待機サーバとの間で通信異常が発生した場合には、クライアント#1は、リトライを行うことで、一時的な通信異常に対応することができる。
次に、図34において、クライアント#1が待機サーバに対してコミット依頼をリトライしているタイミングで、クライアント#2が、クライアント#1と同じデータを操作した場合の処理の流れについて図35〜図38を用いて説明する。クライアント#1とクライアント#2で操作するデータが同一であるかどうかは、現用サーバで採番するデータIDでのみ判定できる。クライアント#2は、現用サーバ及び待機サーバから応答された仮トランIDを比較することで、クライアント#1がコミット中(コミット依頼のリトライ中)であることを検知できる。
図35は、コミット操作依頼に対して待機サーバからの応答がなく、リトライ中に他アプリで同一データを操作した場合のフローを示す図である。図35に示すように、クライアント#1は、仮TID#1を作成し(t101)、データ操作依頼を現用サーバと待機サーバに送信する(t102)。
データ操作依頼でクライアント#1は、インデックスキー値が「IX#1」のデータを「11」に更新する。現用サーバは、データ操作依頼を受信すると、TID#1でデータID#1のデータをロックする。なお、現用サーバのT−INFOはトラン情報記憶部55aを示し、待機サーバのT−INFOはトラン情報記憶部55eを示す。
クライアント#1は、現用サーバと待機サーバからの応答を受信すると、コミット依頼を現用サーバと待機サーバに送信する(t103)。そして、クライアント#1と待機サーバとの間で通信異常が発生し、待機サーバはコミット依頼を受信できない。一方、現用サーバは、コミット処理を行い、応答をクライアント#1に返す。この時、現用サーバは、TID#1で獲得していたデータID#1のロックを解放する。
一方、クライアント#2は、仮TID#2を作成し(t104)、データ操作依頼を現用サーバと待機サーバに送信する(t105)。データ操作依頼でクライアント#2は、インデックスキー値が「IX#1」のデータを「22」に更新する。
現用サーバは、クライアント#2からデータ操作依頼を受信すると、トラン情報記憶部55aの情報に基づいて同一データの更新を検知し、クライアント#2に先行トランの仮TIDを応答電文Aで応答する(t106)。この時、現用サーバは、TID#1のトラン中だが、TID#2でデータID#1のデータをロックしてしまう。
一方、待機サーバは、クライアント#2からデータ操作依頼を受信すると、トラン情報記憶部55eの情報に基づいて、インデックスキー値から同一データの重複更新を予測し、他トランの仮TIDを応答電文Sでクライアント#2に応答する(t107)。
クライアント#2は、応答電文Aと応答電文Sを比較し、待機サーバで、先行トラン(TID#1)がコミット中であることを検知し(t108)、現用サーバと待機サーバにロールバック依頼を行う(t109)。
その後、クライアント#1は、再度コミット依頼を待機サーバに送信し(t110)、待機サーバがコミット依頼を受信してコミット処理を行うと、コミットが完了する。
このように、クライアント#2は、応答電文Aと応答電文Sを比較することで、先行トランがコミット中であることを検知し、ロールバックを行うことができる。
図36は、クライアント#2が先行トランをチェックする処理のフローを示すフローチャートである。図36に示すように、クライアント#2は、仮トランID(仮TID#2)を生成し(ステップS101)、現用サーバと待機サーバにデータ操作依頼を送信する(ステップS102)。データ操作依頼には、仮TID#2が付与されている。
そして、クライアント#2は、現用サーバからの応答(応答電文A)を受信し(ステップS103)、待機サーバからの応答(応答電文S)を受信する(ステップS104)。そして、クライアント#2は、応答電文Sと応答電文Aの仮トランIDが一致しているかを判定する(ステップS105)。クライアント#2は、この判定を応答電文Sに付与されている先行トランの数分繰り返す。
そして、応答電文Sと応答電文Aの仮トランIDが一致している場合には、クライアント#2は、仮TID#2で処理するデータに対して、別トランザクションがコミット中であることを検知する(ステップS106)。そして、クライアント#2は、ロールバック依頼を現用サーバと待機サーバに送信する(ステップS107)。
一方、応答電文Sと応答電文Aの仮トランIDが一致していない場合には、クライアント#2は、仮TID#2のデータに対して、処理継続可能と判断する(ステップS108)。
図37は、現用サーバがクライアント#2からのデータ操作依頼を受けて先行トランをチェックする処理のフローを示すフローチャートである。図37に示すように、現用サーバは、クライアント#2からのデータ操作依頼を受信する(ステップS111)。そして、現用サーバは、トランザクション処理を行い、データID(データID#1)等を取得する(ステップS112)。
そして、現用サーバは、トランザクション処理が成功したか否かを判定し(ステップS113)、成功しなかった場合には、ステップS118に進む。一方、成功した場合には、現用サーバは、TID(TID#2)等を応答電文Aに設定し(ステップS114)、ステップS115〜ステップS117の処理をトラン情報記憶部55aのエントリ数分繰り返す。
現用サーバは、各エントリについて、データID#1に対するトラン情報か否かを判定し(ステップS115)、データID#1に対するトラン情報でない場合には、次のエントリに進む。一方、データID#1に対するトラン情報である場合には、現用サーバは、先行トラン数をカウントアップし(ステップS116)、先行トランの仮TIDを応答電文Aに設定する(ステップS117)。ここで、先行トラン数は、図18に示したPREV−TID数である。
そして、現用サーバは、クライアント#2に応答電文Aを返信する(ステップS118)。
図38は、待機サーバがクライアント#2からのデータ操作依頼を受けて先行トランをチェックする処理のフローを示すフローチャートである。図38に示すように、待機サーバは、クライアント#2からの処理依頼を受信する(ステップS121)。そして、待機サーバは、トラン情報記憶部55eに仮TID(仮TID#2)を保存する(ステップS122)。
そして、待機サーバは、仮TID(仮TID#2)を応答電文Sに設定し(ステップS123)、ステップS124〜ステップS126の処理をトラン情報記憶部55eのエントリ数分繰り返す。
待機サーバは、各エントリについて、データ操作依頼に含まれるデータと同一インデックスキーを持つトラン情報か否かを判定し(ステップS124)、同一インデックスキーを持つトラン情報でない場合には、次のエントリに進む。一方、同一インデックスキーを持つトラン情報である場合には、待機サーバは、先行トラン数をカウントアップし(ステップS125)、先行トランの仮TIDを応答電文Sに設定する(ステップS126)。
そして、待機サーバは、クライアント#2に応答電文Sを返信する(ステップS127)。
上述してきたように、実施例では、クライアント#1の仮トランID生成部67が仮トランIDを生成し、要求送信部68が仮トランIDを付加して第1要求電文を現用サーバと待機サーバに送信する。第1要求電文を現用サーバが受信すると、現用サーバのトランID生成部55cがトランIDを生成し、データID生成部55dがデータIDを生成する。そして、トラン処理部55bがトランIDとデータIDを付加した応答電文をクライアント#1に返信する。そして、要求送信部68は、トランIDとデータIDを付加して第2要求電文を現用サーバと待機サーバに送信する。第1要求電文と第2要求電文を受信した待機サーバのデータ管理部55fが、仮トランIDとトランIDとデータIDを対応付けたトラン情報を管理する。そして、クライアント#1からコミット要求を受信すると、データ管理部55fはトラン情報に基づいてコミット処理を行う。
したがって、情報処理システム1は、ミラーリングをすることなく、現用サーバと待機サーバの整合性を保つことができ、ミラーリングによるトランザクション性能の悪化を防ぐことができる。
また、実施例では、クライアント#1のデータID記憶部66が、仮トランIDとトランIDとデータIDとを対応付けて記憶し、要求送信部68は、データID記憶部66を用いて第2要求電文を作成して送信する。また、現用サーバのトラン情報記憶部55aが、仮トランIDとトランIDとデータIDとを対応付けて記憶し、クライアント#1からコミット要求を受信すると、トラン処理部55bが、トラン情報記憶部55aを用いてコミット処理を行う。また、待機サーバのトラン情報記憶部55eが、仮トランIDとトランIDとデータIDとを対応付けて記憶し、クライアント#1からコミット要求を受信すると、データ管理部55fが、トラン情報記憶部55eを用いてコミット処理を行う。
したがって、クライアント#1、現用サーバ及び待機サーバは、仮トランIDとトランIDとデータIDとを対応づけることができる。
また、実施例では、要求送信部68は、データ操作要求に対する応答を待機サーバから受け取ることなくコミット要求を行う場合には、ミラーリングコミットフラグを「ON」にして現用サーバと待機サーバにコミットを指示する。そして、ミラーリングコミットフラグが「ON」である場合には、トラン処理部55bは、ミラーリング用情報を待機サーバに送信し、データ管理部55fは、現用サーバからミラーリング用情報を受信してコミット処理を行う。
したがって、クライアント#1と待機サーバの間で通信異常が発生した場合にも、情報処理システム1は、現用サーバと待機サーバの整合性を保つことができる。
また、実施例では、トラン処理部55bは、クライアント#1からのトランをコミット処理した後にクライアント#1からデータ操作要求を受信するとコミット処理を行ったトランに関してトラン情報記憶部55aの情報を消去する。一方、クライアント#1からのトランのコミット処理後にクライアント#2からデータIDが同じデータの操作要求を受信すると、トラン処理部55bは、データIDが同じトランの仮TIDを付加して応答をクライアント#2に送信する。また、データ管理部55fは、クライアント#1からのトランをコミット処理した後にクライアント#1からデータ操作要求を受信するとコミット処理を行ったトランに関してトラン情報記憶部55eの情報を消去する。一方、クライアント#1からのトランのコミット処理前にクライアント#2からデータIDが同じと推定されるデータの操作要求を受信すると、データ管理部55fは、データIDが同じと推定されるトランの仮TIDを付加して応答をクライアント#2に送信する。そして、クライアント#2は、現用サーバからの応答に含まれる仮TIDと待機サーバからの応答に含まれると仮TIDが等しい場合には、現用サーバと待機サーバにロールバックを依頼する。
したがって、クライアント#1と待機サーバの間で通信異常が発生した場合にも、情報処理システム1は、現用サーバと待機サーバの整合性を保つことができる。
なお、現用サーバと待機サーバで同一処理を行わせる場合はリソースが倍増する。そこで、本実施例では、待機サーバは、現用サーバでトランザクション順序制御及びデータ特定の結果として採番された情報(トランID、データID)を基にデータを管理するだけとする。したがって、待機サーバは、現用サーバほどのリソースは使用しないですむ。また、本実施例では、現用サーバでトランザクション順序制御及びデータ特定の結果として採番された情報(トランID、データID)を基に、クライアント・サーバ間でトランザクションの整合性や処理順序を保証できる。このため、トランザクションの整合性や処理順序保証のための振り分け用の装置は不要になる。
また、複数サーバでそれぞれトランザクション処理を行った場合(例えば、現用サーバ、待機サーバそれぞれでトランザクション処理を行った場合)、冗長構成を含めた全てのサーバ装置2でトランザクションの処理順序を統一できないことがある。そこで、本実施例では、現用サーバ一箇所でトランザクションに関わる情報(トランID、データID)の採番及び処理順番の決定を行い、これらの情報をクライアント装置3との要求電文と応答電文を介して受け渡す。したがって、冗長構成を含めた全てのサーバ装置2で、トランザクションの一意性を保証することができる。
また、クライアント装置3側で、現用サーバと待機サーバの両方の応答を待合わせると、処理のレスポンスが悪くなる。そこで、本実施例では、現用サーバの応答は同期方式で待合わせ、待機サーバの応答は非同期方式で待合わせるようにすることで、現用サーバで行っている業務処理のレスポンスを維持したまま、現用サーバ及び待機サーバの応答確認を行うことができる。