(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公開特許公報(A)
(11)【公開番号】P2024014546
(43)【公開日】2024-02-01
(54)【発明の名称】データ管理システム、データ管理方法及びデータ管理プログラム
(51)【国際特許分類】
G06F 16/178 20190101AFI20240125BHJP
G06F 11/20 20060101ALI20240125BHJP
【FI】
G06F16/178
G06F11/20 664
【審査請求】未請求
【請求項の数】7
【出願形態】OL
(21)【出願番号】P 2022117451
(22)【出願日】2022-07-22
(71)【出願人】
【識別番号】000005223
【氏名又は名称】富士通株式会社
(74)【代理人】
【識別番号】110002147
【氏名又は名称】弁理士法人酒井国際特許事務所
(72)【発明者】
【氏名】古賀 啓太郎
(72)【発明者】
【氏名】三浦 浩一
(72)【発明者】
【氏名】廣瀬 厚人
(72)【発明者】
【氏名】山田 俊昭
【テーマコード(参考)】
5B034
【Fターム(参考)】
5B034CC02
5B034DD06
(57)【要約】
【課題】システムの信頼性を向上させるデータ管理システム、データ管理方法及びデータ管理プログラムを提供する。
【解決手段】API処理部105は、クライアントアプリケーション300から複数の処理命令を含む一括処理依頼を受信して、一括処理依頼に含まれる各処理命令を順次実行すする。一時格納処理部106は、API処理部105によるそれぞれの処理命令の実行が完了する毎に、各処理命令による処理済データを一時格納領域102に格納する。同期処理部107は、一時格納領域102に格納された処理済データが別クライアントアプリケーションにより参照された場合、一時格納領域102の参照状態に基づいて所定の処理済データをスタンバイノード20へ送信し、API処理部105による一括処理依頼に含まれる全ての処理命令の実行が完了すると、未送信の処理済データをスタンバイノード20に送信してデータ同期を行なう。
【選択図】
図3
【特許請求の範囲】
【請求項1】
運用系ノード及び待機系ノードを有する冗長化構成のデータ管理システムであって、
前記運用系ノードは、
受信した処理依頼の処理を行い、前記処理依頼が複数の処理命令を含む一括処理依頼の場合、前記一括処理依頼に含まれる各前記処理命令を順次実行する命令処理部と、
前記命令処理部によるそれぞれの前記処理命令の実行が完了する毎に、各前記処理命令による処理済データを一時格納領域に格納する一時格納処理部と、
前記一時格納領域に格納された前記処理済データが別の処理依頼の処理において参照された場合、前記一時格納領域の参照状態に基づいて所定の処理済データを前記待機系ノードへ送信し、前記命令処理部による前記一括処理依頼に含まれる全ての前記処理命令の実行が完了すると、未送信の前記処理済データである未送信処理済データを前記待機系ノードに送信してデータ同期を行なう同期処理部と
を備えることを特徴とするデータ管理システム。
【請求項2】
前記待機系ノードは、
自装置が前記運用系ノードに切り替わると前記一時格納領域として使用される待機系一時格納領域と、
前記データ同期時に前記処理済データを格納する同期用格納領域と、
前記同期処理部から、前記所定の処理済データを受信すると、前記待機系一時格納領域に格納し、前記命令処理部による前記一括処理依頼に含まれる全ての前記処理命令の実行の完了後に、前記同期処理部から送信された前記未送信処理済データ及び前記待機系一時格納領域に格納された前記処理済データを、前記同期用格納領域に格納する格納処理部と
を備えたことを特徴とする請求項1に記載のデータ管理システム。
【請求項3】
前記命令処理部は、複数の前記処理命令の実行順序が予め決められた前記一括処理依頼を受信して、前記実行順序にしたがって前記処理命令を順番に実行し、
前記同期処理部は、前記一時格納領域に格納された特定の処理済データが前記別の処理依頼の処理において参照された場合、前記特定の処理済データ及び前記特定の処理済データの前記処理命令よりも前に実行された前記処理命令による前記処理済データを前記待機系ノードへ送信する
ことを特徴とする請求項1に記載のデータ管理システム。
【請求項4】
前記同期処理部は、前記別の処理依頼の処理の完了後に、前記別の処理依頼の処理による処理済データとともに前記所定の処理済データを前記待機系ノードへ送信することを特徴とする請求項1に記載のデータ管理システム。
【請求項5】
前記命令処理部は、前記一括処理依頼のうち前記一時格納領域に格納済みの前記処理済データの前記処理命令を除いた他の処理命令を実行することを特徴とする請求項1に記載のデータ管理システム。
【請求項6】
運用系ノード及び待機系ノードを有する冗長化構成を用いたデータ管理方法であって、
前記運用系ノードに、
受信した処理依頼の処理を行わせ、前記処理依頼が複数の処理命令を含む一括処理依頼を受信させて、前記一括処理依頼に含まれる各処理命令を順次実行させ、
それぞれの前記処理命令の実行が完了する毎に、各前記処理命令による処理済データを一時格納領域に格納させ、
前記一時格納領域に格納された前記処理済データが別の処理依頼の処理において参照された場合、前記一時格納領域の参照状態に基づいて所定の処理済データを前記待機系ノードへ送信させ、
前記一括処理依頼に含まれる全ての前記処理命令の実行の完了後、未送信の前記処理済データである未送信処理済データを前記待機系ノードに送信させてデータ同期を行わせる
ことを特徴とするデータ管理方法。
【請求項7】
運用系コンピュータ及び待機系コンピュータを有する冗長化構成を用いたデータ管理方法であって、
受信した処理依頼の処理を行わせ、前記処理依頼が複数の処理命令を含む一括処理依頼の場合、前記一括処理依頼に含まれる各処理命令を順次実行し、
それぞれの前記処理命令の実行が完了する毎に、各前記処理命令による処理済データを一時格納領域に格納し、
前記一時格納領域に格納された前記処理済データが別の処理依頼において参照された場合、前記一時格納領域の参照状態に基づいて所定の処理済データを前記待機系コンピュータへ送信し、
前記一括処理依頼に含まれる全ての前記処理命令の実行の完了後、未送信の前記処理済データである未送信処理済データを前記待機系コンピュータに送信してデータ同期を行う
処理を前記運用系コンピュータに実行させることを特徴とするデータ管理プログラム。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、データ管理システム、データ管理方法及びデータ管理プログラムに関する。
【背景技術】
【0002】
新型コロナウイルスの感染拡大による巣ごもり需要の高まりなどにより、近年、物販Eコマースの市場規模が急拡大している。物販Eコマースでは、インターネットの販売サイトを通じて、商品の注文を受け付けられると、倉庫やその倉庫で作業する作業担当者に対して商品発送の指示が出される。作業担当者は、商品発送の指示を受けて、指定された商品のピッキング(商品の取り揃え)及びピッキングした商品の梱包を行ったうえで、出荷伝票を貼り付ける。そして、宅配事業者が、出荷伝票が張り付けられた商品の配送の依頼を受けて、その商品を荷物として送り先へ配達する。
【0003】
宅配事業者の配達手順の一例について説明する。宅配事業者へ引き渡された荷物は、幹線輸送によって複数の宅配事業者の中継拠点を経由し、顧客宅の配達地域のベース店に持ち込まれる。ベース店に送られた荷物は、配達を担当する配達店に納入され、担当エリア毎の車に分けて積まれる。最終的に、宅配ドライバーが、荷物である商品を送り先へ配達する。
【0004】
また、近年、宅配事業者に対して、荷物の状態の管理や顧客への情報提供のために、物流過程における荷物の状態の可視化の需要が高まっている。この要望に応えるために、宅配事業者は、入庫、入庫検品、在庫管理、ピッキング、仕分け、出庫、出庫検品、商品管理、位置追跡及び盗難防止等の配送情報の可視化を促進している。例えば、宅配事業者は、物流の各プロセスで、出荷伝票のバーコードを読み取り、宅配システムの出荷伝票の追跡データを更新することで、様々な配送情報の可視化を実現している。
【0005】
宅配システムは、例えば、受付サーバ及び可視化などの処理を行う処理サーバを含む構成を有する。受付サーバは、荷物の検品データやトラッキングデータを作業員が操作する端末装置から受け付けて、処理サーバに処理を依頼する。処理サーバは、受付サーバからの処理の依頼にしたがって、可視化などの処理を行う。受付サーバは、多数のデータが送られてくるため、効率的にデータを処理サーバへ送信して、迅速に処理サーバに処理を行わせることが求められる。処理サーバは、処理の高速化のためにインメモリデータベースなどが用いられる。さらに、物理Eコマースの市場規模の急速拡大に伴い、宅配事業者に配送が依頼される商品も急増したため、宅配システムの処理性能のより一層の高速化が求められている。
【0006】
ここで、例えば宅配システムが停止し直ぐに業務が再開できなければ、宅配事業者は、予定時間通りの配達が困難となる。そこで、宅配システムにおいて処理サーバが故障した場合でも業務を継続可能にするため、処理サーバをクラスタ化してシステムを構成することで、可用性を高めることが行われる。クラスタシステムには、例えば、データを受け付けて実際に処理を行う運用系サーバであるアクティブノード及び待機系サーバであるスタンバイノードが配置されるホットスタンバイと呼ばれる構成を採用することができる。スタンバイノードは複数台配置されてもよく、その中の1台がアクティブノードへと切り替わり、それ以外はスタンバイサーバとして動作を継続する。
【0007】
ここで、ホットスタンバイでデータを保証するクラスタシステムの動作の一例について説明する。アクティブノードとスタンバイノードとは同じデータを保持し、アクティブノードで更新系の処理が確定すると、更新により発生した更新後データと更新前のデータとの差分である更新差分がスタンバイノードに送信されることで、データの同期が行われる。このデータの同期はミラーリングと呼ばれる。ミラーリングを開始するためのデータの更新差分が確定するタイミングには2つの方式がある。1つは、複数処理の結果をコミット実行で更新差分をスタンバイノードに一括反映する「通常コミット」である。また、もう1つは、1つの処理毎に自動で更新差分をスタンバイノードに逐次反映する「オートコミット」とである。
【0008】
オートコミット方式では、アクティブノードが、自己が有するデータ操作領域で操作を行い1つの処理が完了する毎に更新差分をコミットし、コミットの実行を契機としてスタンバイノードへのデータの同期を行なう。アクティブノードは、データ操作領域での操作後に更新差分の情報をスタンバイノードへ送信する。スタンバイノードは、ミラーリングのための一時格納領域であるミラーリングバッファを有する。スタンバイノードは、更新差分をミラーリングバッファに一時的に格納して同期の完了をアクティブノードに通知する。アクティブノードは、同期の完了通知を受けて、更新差分を自己が有するメモリテーブルに反映する。その後、アクティブノードは、クライアントとの間の処理に復帰する。スタンバイノードは、非同期でミラーリングバッファに格納された更新差分を自己が有するメモリテーブルに反映してミラーリングの処理を完了する。
【0009】
さらに、オートコミット方式のミラーリングにおいて、クライアントからアクティブノードのサーバにAPI(Application Programming Interface)を用いて処理を依頼する場合、複数のAPIをまとめて一括処理として依頼することができる。複数のAPIをまとめることで、クライアントとサーバとの間の通信回数を減らし、処理の高速化を図ることが可能となる。以上のような構成を有するクラスタシステムにおいて、さらにアクティブノードとスタンバイノードとの間の処理を効率化して、さらなる処理の高速化を図ることが考えられる。
【0010】
オートコミットを通知するAPIにはそれぞれにコミット処理が付加される。そのため、オートコミット方式では複数のAPIの一括処理が依頼された場合にも、各オートコミットを通知のそれぞれについてコミット処理が行われる。そこで、オートコミットを通知するAPI毎に毎回実行されるコミット処理を、最後以外には実行せずに最後に実行させることで、アクティブノードとスタンバイノードとの間のデータ同期回数を削減する方法が考えられる。
【0011】
なお、DB(Data Base)などについての冗長化の技術として以下のような技術が提案されている。例えば、更新データを累積バッファに格納し、トランザクション終了毎に更新データ反映バッファに更新データを格納し、反映間隔に達すると副系DBに更新データを反映させ、障害発生時には同期点までの累積バッファを破棄する技術が提案されている。また、クエリをトランザクションキューに登録し、クエリがコミットされた場合、未コピークエリを一括して副サイトへ同期コピーし、障害発生時はグレートランザクションを調査して、手動回復を行う技術が提案されている。さらに、処理対象のトランザクションに関するコミット要求を蓄積し、蓄積数が一定の値に達すると一括コミット処理を実行する技術が提案されている。
【先行技術文献】
【特許文献】
【0012】
【特許文献1】特開平2-292641号公報
【特許文献2】特開2004-295540号公報
【特許文献3】特開平7-271643号公報
【発明の概要】
【発明が解決しようとする課題】
【0013】
しかしながら、あるクライアントアプリケーションからの複数のAPIを含む一括処理依頼の処理中は、処理が完了したAPIについての処理済データが存在する場合でも、別クライアントアプリケーションは更新後の新しい状態のデータの参照が禁止される。そのため、多数のAPIを含む一括処理依頼がなされた場合、別クライアントアプリケーションは、更新済データを用いるには、長時間の待ち時間が発生するおそれがある。このように、従来のクラスタシステムでは、システムの信頼性を向上させることが困難である。
【0014】
開示の技術は、上記に鑑みてなされたものであって、システムの信頼性を向上させるデータ管理システム、データ管理方法及びデータ管理プログラムを提供することを目的とする。
【課題を解決するための手段】
【0015】
本願の開示するデータ管理システム、データ管理方法及びデータ管理プログラムの一つの態様において、データ管理システムは、冗長化された運用系ノード及び待機系ノードを有する。前記運用系ノードは、以下の各部を備える。命令処理部は、クライアントアプリケーションから複数の処理命令を含む一括処理依頼を受信して、前記一括処理依頼に含まれる各前記処理命令を順次実行する。一時格納処理部は、前記命令処理部によるそれぞれの前記処理命令の実行が完了する毎に、各前記処理命令による処理済データを一時格納領域に格納する。同期処理部は、前記一時格納領域に格納された前記処理済データが別クライアントアプリケーションにより参照された場合、前記一時格納領域の参照状態に基づいて所定の処理済データを前記待機系ノードへ送信し、前記命令処理部による前記一括処理依頼に含まれる全ての前記処理命令の実行が完了すると、未送信の前記処理済データである未送信処理済データを前記待機系ノードに送信してデータ同期を行なう。
【発明の効果】
【0016】
1つの側面では、本発明は、システムの信頼性を向上させることができる。
【図面の簡単な説明】
【0017】
【
図1】
図1は、実施例に係る情報処理システムのシステム構成図である。
【
図2】
図2は、一括処理依頼の処理を示す図である。
【
図3】
図3は、クラスタシステムの詳細を示すブロック図である。
【
図4】
図4は、データ操作領域に保存されるログのデータ構造を示す図である。
【
図5】
図5は、一時格納領域に保存されるログのデータ構造を示す図である。
【
図6】
図6は、メモリテーブルのレコードの構造を示す図である。
【
図7】
図7は、ミラーリング時にアクティブノードからスタンバイノードへ送信されるデータのデータ構造を示す図である。
【
図8】
図8は、ミラーデータのデータ構造を示す図である。
【
図9】
図9は、一時格納領域に格納された処理済データの参照が行われた場合の動作の概要を示す図である。
【
図10】
図10は、一括処理依頼の処理実行中にアクティブノードの切り替えが発生した場合の動作の概要を示す図である。
【
図11】
図11は、一括処理依頼の処理時のアクティブノードが有するデータの遷移を示す第1の図である。
【
図12】
図12は、一括処理依頼の処理時のアクティブノードが有するデータの遷移を示す第2の図である。
【
図13】
図13は、一括処理依頼の処理中に参照が行われた場合のアクティブノード及びスタンバイノードの状態の遷移の一例を示す図である。
【
図14】
図14は、一括処理依頼を処理中に参照がない場合のクラスタシステムの動作を示すシーケンス図である。
【
図15】
図15は、一括処理依頼で処理中に参照がある場合のクラスタシステムの動作を示すシーケンス図である。
【
図16】
図16は、一括処理依頼で処理中に参照があり且つ切り替えが発生した場合のクラスタシステムの動作を示すシーケンス図である。
【
図17】
図17は、一括処理依頼受信時のアクティブノードの処理のフローチャートである。
【
図18】
図18は、参照依頼受信時のアクティブノードの処理のフローチャートである。
【
図19】
図19は、スタンバイノードによる受信処理のフローチャートである。
【
図20】
図20は、クライアントアプリケーションによる一括処理依頼の送信処理のフローチャートである。
【
図21】
図21は、コンピュータのハードウェア構成図である。
【発明を実施するための形態】
【0018】
以下に、本願の開示するデータ管理システム、データ管理方法及びデータ管理プログラムの実施例を図面に基づいて詳細に説明する。なお、以下の実施例により本願の開示するデータ管理システム、データ管理方法及びデータ管理プログラムが限定されるものではない。
【実施例0019】
図1は、実施例に係る情報処理システムのシステム構成図である。本実施例に係る情報処理システムは、例えば、運用系のサーバの故障から数秒で業務再開が求められている宅配システムである。情報処理システムは、クラスタシステム1及び端末装置30を有する。また、情報処理システムは、受付サーバ40を有してもよい。
【0020】
端末装置30は、クライアントアプリケーションが動作する。端末装置30で動作するクライアントアプリケーションは、クラスタシステム1で動作するアクティブノード10に対して、APIを用いて処理依頼を送信して、その処理依頼に対する応答を受信する。APIを用いた処理依頼には、複数のAPIの処理がまとめられた一括処理依頼も含まれる。例えば、端末装置30は、倉庫の担当作業員が使用するコンピュータである。
【0021】
クラスタシステム1は、運用系のサーバであるアクティブノード10及び待機系のサーバであるスタンバイノード20を有する。クラスタシステム1は、スタンバイノード20を複数有してもよい。クラスタシステム1では、オートコミット方式のミラーリングが採用される。このクラスタシステム1が、「データ管理システム」の一例にあたる。
【0022】
具体的には、アクティブノード10が、端末装置30から送信されたAPIを用いた処理依頼の処理を実行する。その後、アクティブノード10は、処理結果を端末装置30へ送信する。アクティブノード10は、端末装置30から送られたAPIの一括処理依頼も処理する。
【0023】
また、アクティブノード10は、ミラーリングを行い自己が有するデータをスタンバイノード20に送信して、自己が有するデータとスタンバイノード20が有するデータとの間のデータの同期をとる。スタンバイノード20が複数ある場合は、全てのスタンバイノード20とアクティブノード10との間でデータの同期がとられる。また、アクティブノード10に障害が発生するなどしてダウンした場合、スタンバイノード20が新たなアクティブノード10に切り替わる。スタンバイノード20が複数ある場合は、1台のスタンバイノード20が新たなアクティブノード10に切り替わり、残りは新たなアクティブノード10に対するスタンバイノード20となる。
【0024】
図2は、一括処理依頼の処理を示す図である。一括処理依頼には、例えば、
図2に示すように、1番目のデータの書き込み、2番目のデータの書き込み及びデータの書き換えという3つの処理のAPIがまとめて順番に登録された要求リスト11が含まれる。端末装置30は、要求リスト11を含む一括処理依頼をアクティブノード10へ送信する。
図2に示すように、要求リスト11には各APIにインデックスが付されてもよい。もしくは、要求リスト11は、実行する順番にしたがってAPIが区別可能であり、インデックスを割り当てることが可能であるような構造を有してもよい。
【0025】
アクティブノード10は、要求リスト11を含む一括処理依頼を受信する。そして、アクティブノード10は、第1のデータの書き込み、第2のデータの書き込み及びデータの書き換えの3つの処理のAPIを順次処理する。ここで、アクティブノード10は、要求リスト11を含む一括処理依頼を受信した場合、最後のAPIであるデータの書き換えのAPIの処理後に更新差分をコミットして、スタンバイノード20に対してそれまでの更新差分をまとめてミラーリング14を実施する。この場合、アクティブノード10は、第1のデータ書き込みのAPIの処理後及び第2のデータ書き込みのAPIの処理後には更新差分をコミットしない。すなわち、アクティブノード10は、第1データ書き込みのAPIの処理後のミラーリング12及び第2のデータ書き込みのAPIの処理後のミラーリング13は行わない。ただし、本実施例に係るアクティブノード10は、
図2で示したミラーリング以外にも、一括処理依頼の処理中に生成された処理済データが参照されるとその参照に基づいた処理済データをスタンバイノード20へ送信する。クラスタシステム1におけるデータ同期の詳細は後で説明する。
【0026】
図1に戻って説明を続ける。情報処理システムは、
図1に示したように、受付サーバ40を有してもよい。その場合、受付サーバ40は、クライアントアプリケーションが動作する。
【0027】
例えば、受付サーバ40は、一括処理依頼などのAPIを用いた処理依頼を端末装置30から受け付ける。そして、受付サーバ40は、各処理依頼の処理のタイミングなどを調整して、アクティブノード10に対して、端末装置30から受け付けた処理依頼を送信する。その後、受付サーバ40は、処理依頼に対する処理結果を通知する応答をアクティブノード10から受信する。そして、受付サーバ40は、受信した応答を端末装置30へ送信する。このように、受付サーバ40でクライアントアプリケーションを動作させることも可能である。
【0028】
図3は、クラスタシステムの詳細を示すブロック図である。ただし、
図3では、データ同期の実行に関連する機能を示し、他の機能については省略した。また、スタンバイノード20は、代表の1台を記載した。
【0029】
次に、
図3を参照して、クラスタシステム1によるデータ同期の詳細について説明する。以下の説明では、端末装置30においてクライアントアプリケーション300が動作する場合で説明する。ただし、受付サーバ40においてクライアントアプリケーション300が動作する場合でも、クラスタシステム1は同様の動作を行なう。また、以下の説明では、アクティブノード10とスタンバイノード20との機能について説明するが、スタンバイノード20からアクティブノード10に切り替わった場合は、新たなアクティブノード10が切り替え前のアクティブノード10と同様の機能を有する。
【0030】
端末装置30は、クライアントアプリケーション300が動作する。クライアントアプリケーション300は、一括処理依頼を含む各種処理依頼をアクティブノード10へ送信する。その後、クライアントアプリケーション300は、処理依頼に対する応答をアクティブノード10から受信して、処理を継続する。
【0031】
また、一括処理依頼を送信した場合にアクティブノード10の切り替えを検知すると、スタンバイノード20の1つが新たなアクティブノード10に切り替わる。そして、クライアントアプリケーション300は、一括処理依頼の再依頼をアクティブノード10へ送信する。その後、クライアントアプリケーション300は、処理依頼に対する応答をアクティブノード10から受信して、処理を継続する。
【0032】
アクティブノード10は、
図3に示すように、データ操作領域101、一時格納領域102、メモリテーブル103、通信部104、API処理部105、一時格納処理部106及び同期処理部107を有する。
【0033】
通信部104は、クライアントアプリケーション300から送信された一括処理依頼などの各種処理依頼を受信する。処理依頼には、後述するような参照依頼を含む処理依頼が含まれてもよい。そして、通信部104は、受信した処理依頼をAPI処理部105へ出力する。その後、通信部104は、出力した処理依頼の処理結果をAPI処理部105から受信する。そして、通信部104は、出力した処理依頼が正常に処理された場合、処理結果を処理依頼に対する応答としてクライアントアプリケーション300へ送信する。また、通信部104は、処理依頼の処理において異常が発生した場合、異常発生通知を応答としてクライアントアプリケーション300へ送信する。通信部104が、クライアントアプリケーション300へ応答を返すことで、アクティブノード10は、クライアントアプリケーション300との間の処理に復帰する。
【0034】
データ操作領域101は、API処理部105が処理依頼にしたがってAPIの処理を行う際にデータ操作に用いる領域である。データ操作領域101は、API処理部105によるAPIの処理結果として得られる処理済データをコミットログとして格納する。データ操作領域101は、クライアントアプリケーション300から送信された処理依頼に対するスレッド毎に設けられる。各データ操作領域101は、あるスレッドついてのデータ操作領域101に格納されたデータは、別のスレッドの処理では用いられない。例えば、API処理部105は、あるクライアントアプリケーション300の処理依頼に対するデータ操作領域101に格納された処理済データを、別のクライアントアプリケーション300からの処理依頼の処理において参照することは禁止される。以下では、異なるスレッド毎の処理として、2つの異なるクライアントアプリケーション300からの処理依頼を例に説明するが、同じクライアントアプリケーション300であっても異なる処理依頼であれば異なるスレッド毎の処理となる。
【0035】
図4は、データ操作領域に保存されるログのデータ構造を示す図である。データ操作領域101は、
図4に示すように、レコード番号、ログ種別及びレコードデータを含むデータ構造111を有するコミットログを格納する。レコードデータには、処理済データが格納される。また、ログ種別は、その処理済データが生成され際に行われた処理の種別を表す情報である。例えば、ログ種別において、「U」は更新処理を表し、「I」は挿入処理を表し、「D」は削除処理を表す。また、レコード番号は、各レコードデータに割り当てられた識別情報である。
【0036】
一時格納領域102は、複数のAPIを含む一括処理依頼の処理中の更新済データへのアクセスのための長時間待機の解消を目的として設けられる。一時格納領域102は、アクティブノード10における処理済データを格納して蓄積する。これにより、一括処理依頼を行なったクライアントアプリケーション300以外の別のクライアントアプリケーション300は、一時格納領域102上の処理済データを参照して処理を進めることができる。
【0037】
ただし、単に一時格納領域102を追加しただけでは、以下のような問題が発生するおそれがある。ここでは、一括処理依頼を行なったクライアントアプリケーション300以外の別のクライアントアプリケーション300を、単に「別のクライアントアプリケーション300」と呼ぶ。例えば、単に一時格納領域102を設けた場合、一括処理依頼の処理中における一部の処理済データはアクティブノード10に蓄積されており、スタンバイノード20には送られていない。この状態で、別のクライアントアプリケーション300が、一時格納領域内102に格納された処理済データを参照して処理をコミットすると、コミットのタイミングでは参照された処理済データはスタンバイノード10には保持されていない。そのため、このコミットのタイミングから一括処理依頼のコミットまでの間に、アクティブノード10がダウンすると、別のクライアントアプリケーション300が参照した処理済データが消えてしまう。一方、別のクライアントアプリケーション300の当該処理済データを用いた処理がアクティブノード10のダウン前に完了した場合、処理結果はスタンバイノード20に反映される。すなわち、アクティブノード10がダウンしても、スタンバイノード20のメモリテーブル203に別のクライアントアプリケーション300が実行した処理結果が残る。この場合、切り替わり後のアクティブノード10には、存在しないデータを元にした処理結果がメモリテーブル203に残ることになりデータ不整合が発生する。
【0038】
なお、累積バッファ及び更新データ反映バッファを用いてDBを冗長化する技術では、予定されたタイミングでデータの反映が行われる。そのため、この技術を用いても一括処理毎に更新差分を反映するクラスタシステム1におけるアクティブノード10のダウン時のデータ不整合に対処することは困難である。また、トランザクションキューに登録されたクエリをコミット発生時に一括して同期コピーする技術では、クエリを待機系が実行しておりデータの転送は行っていない。そのため、この技術を用いてもアクティブノード10とスタンバイノード20で保持するデータの相違による、アクティブノード10のダウン時のデータ不整合に対処することは困難である。また、コミット要求の蓄積数が一定の値に達すると一括コミット処理を実行する技術では、特定のトランザクションが処理した処理済みデータに対する別のトランザクションによる参照は考慮されていない。そのため、別のクライアントアプリケーション300に参照されたデータの、アクティブノード10のダウン時の不整合に対処することは困難である。
【0039】
このように、単に一時格納領域102を追加した場合、クラスタシステム1の信頼性を向上するにあたって未だ不十分な部分がある。また、従来の技術を用いてもクラスタシステム1の十分な信頼性を得ることは困難である。そこで、アクティブノード10のダウン時のデータの不整合の発生を解消するため、本実施例に係るクラスタシステム1は、以下のような構成を有する。
【0040】
一時格納領域102は、API処理部105が一括処理依頼を処理する際に、各APIの処理完了毎にデータ操作領域101に格納されたそのAPIについての処理済データの複製がログとして一時的に格納される。一時格納領域102に格納された処理済データは、コミット前に別のクライアントアプリケーション300の処理において使用可能である。例えば、API処理部105は、あるクライアントアプリケーション300の処理依頼の処理で生成された処理済データのうち一時格納領域102に格納された処理済データを、他のクライアントアプリケーション300の処理において参照することができる。
【0041】
図5は、一時格納領域に保存されるログのデータ構造を示す図である。一時格納領域102は、
図5に示すように、一時格納番号、レコード番号、ログ種別、レコードデータ及び送信済フラグを含むデータ構造112を有するログを格納する。レコードデータには、処理済データが格納される。レコード番号、ログ種別及びレコードデータは、データ操作領域101のデータ構造111におけるものと同様である。また、一時格納番号は、一括処理依頼に含まれる要求リスト11の各APIのインデックスに対応する値であり、後述するメモリテーブル103のレコードからのポインタが示す先となる。一時格納番号は、API処理部105による特定のAPIの処理結果を含むログが一時格納領域102に既に存在するかどうかの判定に用いられる。送信済フラグは、対応するログがスタンバイノード20に送信済みであるか否かを表す情報である。送信済フラグは、対応するレコードデータが既にスタンバイノード20に送られた場合はONであり、未だ送られていない場合にはOFFである。
【0042】
メモリテーブル103は、要求された処理が完了して最終的な更新差分のコミットが行われた場合に、処理済データが格納される領域である。メモリテーブル103に格納された処理済データは、スタンバイノード20との間で同期が完了したデータである。
【0043】
図6は、メモリテーブルのレコードの構造を示す図である。メモリテーブル103は、
図6に示すように、レコード番号、レコードデータ及び一時格納領域へのポインタを含むデータ構造113を有するレコードを格納する。レコード番号及びレコードデータは、データ操作領域101のデータ構造111におけるものと同様である。一時格納領域へのポインタは、一時格納領域102に同一のレコード番号を有するログが存在する場合、そのログの一時格納番号を示すポインタが格納される。例えば、メモリテーブル103に格納された特定のレコードデータが一括処理依頼に基づいて更新された場合について説明する。その場合、更新差分のコミット前の状態では、一時格納領域102へのポインタが示す一時格納番号に対応する一時格納領域102におけるログに含まれるレコードデータがその特定のレコードデータの更新後のデータである。
【0044】
図3に戻って説明を続ける。API処理部105は、クライアントアプリケーション300から送信された処理依頼の入力を通信部104から受ける。処理依頼が一括処理依頼の場合、API処理部105は、一括処理依頼に含まれるAPIを要求リスト11で指定された処理順序にしたがって順番に処理する。
【0045】
ここで、切り替わりが発生していない状態のアクティブノード10の場合と、切り替わり発生後にスタンバイノード20からアクティブノード10に切り替わった場合とで分けて、API処理部105の動作を説明する。
【0046】
切り替わりが発生していない状態のアクティブノード10の場合、API処理部105は、一括処理依頼に含まれるAPIを順番に処理して、各APIの処理が完了する毎に、処理済データを含むAPIの処理結果をコミットログの形式でデータ操作領域101に格納する。この際、API処理部105は、要求リスト11において各APIにインデックスが付加されていなければ、要求リスト11により指定された処理順序を基に決められたアルゴリズムでAPIにインデックスを割り当てることができる。その場合、API処理部105は、各APIに割り当てた要求リスト11におけるインデックスを一時格納処理部106に通知する。
【0047】
次に、API処理部105は、処理したAPIが一括処理依頼における最後のAPIか否かを判定する。処理したAPIが最後のAPIでなければ、API処理部105は、1つのAPIの処理完了を一時格納処理部106に通知する。その後、API処理部105は、次のAPIの処理に移る。
【0048】
これに対して、処理したAPIが最後のAPIであれば、API処理部105は、一括処理依頼の処理完了を同期処理部107に通知する。その後、API処理部105は、メモリテーブル103への更新差分の反映完了の通知を同期処理部107から受ける。そして、API処理部105は、処理結果を通信部104へ出力する。
【0049】
ただし、一括処理依頼におけるいずれかのAPIの処理が正常に行えなかった場合、API処理部105は、異常発生通知を通信部104へ出力する。この場合、API処理部105は、一括処理依頼の処理を終了する。
【0050】
また、一括処理依頼の処理中にスタンバイノード20がアクティブノード10に切り替わった場合、新たなアクティブノード10は、一括処理依頼の再実行依頼をクライアントアプリケーション300から受ける。この場合、一括処理依頼に含まれるAPIのうち処理結果がログとして既に一時格納領域102に格納されているAPIが存在する場合がある。そこで、スタンバイノード20がアクティブノード10に切り替わった場合は、API処理部105は、以下の動作を行なう。
【0051】
API処理部105は、一括処理依頼に含まれるAPIを順番に処理対象とする。そして、API処理部105は、処理対象としたAPIの要求リスト11におけるインデックスに対応する一時格納番号を有するログが既に一時格納領域102に存在するか否かを判定する。処理対象としたAPIのインデックスに対応する一時格納番号を有するログが既に一時格納領域102に存在する場合、API処理部105は、そのAPIの処理をスキップして、次のAPIを処理対象として次のAPIの処理に移る。
【0052】
これに対して、処理対象としたAPIのインデックスに対応する一時格納番号を有するログが一時格納領域102に存在しない場合、API処理部105は、処理対象としたAPIの処理を実行する。その後、API処理部105は、処理対象としたAPIの処理結果をコミットログの形式でデータ操作領域101に格納する。
【0053】
次に、API処理部105は、処理したAPIが一括処理依頼の最後のAPIか否かを判定する。処理したAPIが最後のAPIでなければ、API処理部105は、1つのAPIの処理完了を一時格納処理部106に通知する。その後、API処理部105は、次のAPIの処理に移る。
【0054】
これに対して、処理したAPIが最後のAPIであれば、API処理部105は、一括処理依頼の処理完了を同期処理部107に通知する。その後、API処理部105は、メモリテーブル103への更新差分の反映完了の通知を同期処理部107から受ける。そして、API処理部105は、処理結果を通信部104へ出力する。ただし、この場合も、いずれかのAPIの処理が正常終了しなければ、API処理部105は、異常発生通知を通信部104へ出力する。
【0055】
また、クライアントアプリケーション300から送信された処理依頼が一括処理依頼でない場合、API処理部105は、その処理依頼で指定されたAPIの処理を実行する。APIの処理完了後、クライアントアプリケーション300は、その処理依頼の処理完了を同期処理部107に通知する。その後、API処理部105は、メモリテーブル103への更新差分の反映完了の通知を同期処理部107から受ける。そして、API処理部105は、処理結果を通信部104へ出力する。ただし、この場合も、APIの処理が正常終了しなければ、API処理部105は、異常発生通知を通信部104へ出力する。
【0056】
ここで、クライアントアプリケーション300からの処理依頼にデータの参照依頼が含まれている場合、API処理部105は、メモリテーブル103の参照依頼で指定されたデータのレコードを参照する。そして、API処理部105は、参照したレコードの一時格納領域へのポインタが初期状態であるか否かを判定する。
【0057】
一時格納領域へのポインタが初期状態であれば、API処理部105は、メモリテーブル103のレコードのレコードデータに含まれるデータを参照する。その後、API処理部105は、参照したデータを用いて処理依頼に含まれるAPIの処理を行なう。処理完了後、API処理部105は、処理依頼の処理完了を同期処理部107に通知する。この場合、参照されたデータは、実行中の一括処理依頼により生成された処理済データではないため、切り替え発生時のデータの不整合については考慮しなくてもよい。
【0058】
これに対して、一時格納領域へのポインタにポインタが格納されている場合、API処理部105は、ポインタで示された一時格納番号を有する一時格納領域102のログを特定する。そして、API処理部105は、特定した一時格納領域102のログのレコードデータである処理済データを参照する。
【0059】
次に、API処理部105は、参照した処理済データを含むログの一時格納番号が、自己が記憶する最大送信番号の値より大きいか否かを判定する。ここで、最大送信番号は、一時格納領域102に格納されたログであってスタンバイノード20への送信が完了したログの一時格納番号のうち最大の番号であり、その初期値は一時格納番号の最小値より小さい値である。API処理部105は、参照した処理済データを含むログの一時格納番号が最大送信番号の値より大きい場合、参照した処理済データを含むログの一時格納番号を最大送信番号として記憶して最大送信番号の値を更新する。
【0060】
その後、API処理部105は、参照した処理済データを用いて参照依頼を含む処理依頼に含まれるAPIの処理を行なう。そして、参照依頼を含む処理依頼の処理完了後、API処理部105は、一時格納領域102における最大送信番号以下のログの送信指示及び参照依頼を含む処理依頼の処理完了を同期処理部107に通知する。その後、API処理部105は、更新差分の反映完了の通知を同期処理部107から受ける。そして、API処理部105は、処理結果を通信部104へ出力する。ただし、この場合も、APIの処理が正常終了しなければ、API処理部105は、異常発生通知を通信部104へ出力する。
【0061】
一時格納処理部106は、一括処理依頼に含まれる各APIの処理が完了する毎に、最後のAPI以外であれば、1つのAPIの処理完了の通知をAPI処理部105から受ける。次に、一時格納処理部106は、通知されたAPIの処理結果が登録されたコミットログをデータ操作領域101から取得する。そして、一時格納処理部106は、取得したコミットログに、そのAPIの要求リスト11におけるインデックスに対応する一時格納番号を付加し、且つ、送信済フラグをOFFにして、一時格納領域102にログとして登録する。さらに、一時格納処理部106は、取得したコミットログをデータ操作領域101から削除する。
【0062】
次に、一時格納処理部106は、メモリテーブル103を参照して、一時格納領域に格納したログに含まれるレコード番号と同様のレコード番号のレコードがメモリテーブル103に存在するか否かを判定する。同様のレコード番号のレコードがメモリテーブル103に存在する場合、一時格納処理部106は、そのレコードの一時格納領域へのポインタに、一時格納領域102に格納したログの一時格納番号へのポインタを格納する。
【0063】
ここで、アクティブノード10のメモリテーブル103に格納された一時格納番号へのポインタの情報は、スタンバイノード20のメモリテーブル203に同期されていない。そこで、一時格納処理部106は、スタンバイノード20がアクティブノード10に切り替わった場合、切り替わりの直後にメモリテーブル103から一時格納領域102の一時格納番号を示すポインタを張り直す。
【0064】
具体的には、新たなアクティブノード10の一時格納処理部106は、一時格納領域102に格納されたログを先頭から順番に参照する。そして、一時格納処理部106は、送信フラグがONのログについては、一時格納領域102のログのレコード番号を検索キーとして、メモリテーブル103からそのレコード番号を有するレコードを検索する。そして、一時格納処理部106は、特定したレコードの一時格納領域へのポインタに、検索元の一時格納領域102のログの一時格納番号を登録する。一方、送信フラグがOFFのログについては、一時格納処理部106は、クライアントアプリケーション300からの一括処理依頼の再依頼による当該一括処理依頼の再実行時にポインタを登録する。
【0065】
同期処理部107は、一括処理依頼に含まれる全てのAPIの処理が完了すると、一括処理依頼の処理完了の通知をAPI処理部105から受ける。次に、同期処理部107は、一括処理依頼の最後のAPIの処理のコミットログをデータ操作領域101から取得する。また、同期処理部107は、一括処理依頼の最後以外のAPIの処理結果のログのうち送信フラグがOFFのログを一時格納領域102から取得する。すなわち、同期処理部107は、一括処理依頼の処理中に他のクライアントアプリケーション300からの参照が行われて既にスタンバイノード20に送られている処理済データのログは取得しない。そして、同期処理部107は、一括処理依頼の各APIの処理結果のログをまとめたミラーリング用の送信データをスタンバイノード20へ送信する。この際、同期処理部107は、一括処理依頼の更新差分のコミットの通知をスタンバイノード20へ送信する。
【0066】
図7は、ミラーリング時にアクティブノードからスタンバイノードへ送信されるデータのデータ構造を示す図である。同期処理部107は、
図7に示すデータ構造114を有するミラーリング用の送信データを作成する。ミラーリング用の送信データは、
図7に示すように、通信ヘッダの後に、APIの処理それぞれのミラーデータが格納される。
【0067】
図8は、ミラーデータのデータ構造を示す図である。各ミラーデータは、
図8に示すようにトランザクション番号、レコード番号、ログ種別、レコードデータ及び一時領域フラグが含まれるデータ構造115を有する。レコード番号、ログ種別及びレコードデータは、データ操作領域101及び一時格納領域102におけるレコード番号、ログ種別及びレコードデータが用いられる。また、一時領域フラグは、スタンバイノード20において一時格納領域201又はミラーリングバッファ202のいずれに格納するデータかを示す情報である。一時領域フラグは、「ON」の場合、一時格納領域201に格納するデータであることを示す。また、一時領域フラグは、「OFF」の場合、ミラーリングバッファ2032に格納するデータであることを表す。同期処理部107は、一括処理依頼に含まれる全てのAPIの処理の完了後に一括処理依頼の各APIの処理結果のログを送信する場合、各ログのミラーデータの一時領域フラグをOFFに設定する。
【0068】
同期処理部107は、ミラーリング用の送信データの送信に対する応答受領の通知をスタンバイノード20から受信する。そして、同期処理部107は、一括処理依頼の最後のAPIの処理結果のコミットログ及び一時格納領域102に格納されたログの情報をそれぞれ含むレコードをメモリテーブル103に格納して更新差分を反映する。さらに、同期処理部107は、メモリテーブル103における更新差分を反映したレコードの一時格納領域へのポインタを初期化する。その後、同期処理部107は、更新差分の反映完了をAPI処理部105に通知する。
【0069】
また、同期処理部107は、参照依頼を含む処理依頼の場合、一時格納領域102における最大送信番号の値以下の一時格納番号を有するログの送信指示及び当該処理依頼の処理完了の通知をAPI処理部105から受ける。そして、同期処理部107は、最大送信番号の値以下の一時格納番号を有するログのうち送信済フラグがOFFのログを一時格納領域102から取得する。すなわち、同期処理部107は、最大送信番号の値以下の一時格納番号を有するログであっても、既にスタンバイノード20へ送信済みのログは取得しない。以下、一時格納領域102における最大送信番号の値以下の一時格納番号を有するログのうち送信済フラグがOFFのログを、「最大送信番号以下の未送信ログ」と呼ぶ。また、同期処理部107は、処理完了の通知を受けた参照依頼を含む処理依頼のコミットログをデータ操作領域101から取得する。
【0070】
そして、同期処理部107は、最大送信番号以下の未送信ログ及び参照依頼を含む処理依頼のコミットログのそれぞれのミラーデータを作成する。ここで、同期処理部107は、最大送信番号以下の未送信ログのミラーデータの場合、一時領域フラグをONに設定する。また、同期処理部107は、参照依頼を含む処理依頼のコミットログのミラーデータの場合、一時領域フラグをOFFに設定する。次に、同期処理部107は、作成した各ミラーデータを含むミラーリング用の送信データを生成する。そして、同期処理部107は、生成したミラーリング用の送信データをスタンバイノード20へ送信する。
【0071】
その後、同期処理部107は、ミラーリング用の送信データの送信に対する応答受領の通知をスタンバイノード20から受信する。そして、同期処理部107は、処理完了の通知を受けた参照依頼を含む処理依頼のコミットログに含まれる情報を登録したレコードをメモリテーブル103に格納して更新差分を反映する。また、同期処理部107は、一時格納領域102における最大送信番号の値以下の未送信ログの送信済フラグをONに設定する。その後、同期処理部107は、更新差分の反映完了をAPI処理部105に通知する。
【0072】
次に、スタンバイノード20について説明する。スタンバイノード20は、一時格納領域201、ミラーリングバッファ202、メモリテーブル203及び格納処理部204を有する。
【0073】
一時格納領域201は、アクティブノード10の一時格納領域102に格納されたログのうち、他のクライアントアプリケーション300からの処理依頼により参照された処理済データを有するログを含むそれ以前に処理されたログを格納する領域である。言い換えれば、一時格納領域201は、アクティブノード10の一時格納領域102に格納されたログのうち、最大送信番号の値以下の一時格納番号を有するログを一時的に格納する領域である。一時格納領域201に格納されるログも、
図5に示したアクティブノード10の一時格納領域102のログと同様のデータ構造112を有する。一時格納領域201は、スタンバイノード20がアクティブノード10に切り替わった場合、アクティブノード10の一時格納領域102の機能を果たす。
【0074】
ミラーリングバッファ202は、処理依頼の処理完了後にコミットされた処理済データをミラーリング実行時に格納する領域である。ミラーリングバッファ202に格納された処理済データは、非同期でメモリテーブル203に映される。
【0075】
メモリテーブル203は、アクティブノード10のメモリテーブル103と同期されて、同じレコードデータを保持する領域である。すなわち、メモリテーブル203は、コミットされた処理済データを保持する。メモリテーブル203に格納されたレコードも、
図6に示したアクティブノード10のメモリテーブル103のレコードと同様のデータ構造113を有する。メモリテーブル203は、スタンバイノード20がアクティブノード10に切り替わった場合、アクティブノード10のメモリテーブル103の機能を果たす。
【0076】
格納処理部204は、アクティブノード10による一括処理依頼の処理完了後に、一括処理依頼に含まれる各APIの処理結果のミラーデータを含むミラーリング用の送信データを同期処理部107から受信する。ただし、このミラーリング用の送信データには、一括処理依頼に含まれる各APIの処理結果のうち既に送信された処理結果のミラーデータは含まれない。また、格納処理部204は、アクティブノード10による参照依頼を含む処理依頼の処理完了後に、最大送信番号の値以下の未送信ログ及び当該処理依頼のコミットログ毎のミラーデータをまとめたミラーリング用の送信データを同期処理部107から受信する。
【0077】
格納処理部204は、受信したミラーリング用の送信データに含まれる各ミラーデータの一時領域フラグを確認する。一時領域フラグがONのミラーデータの場合、格納処理部204は、そのミラーデータに含まれる情報をログとして一時格納領域201に格納する。これに対して、一時領域フラグがOFFのミラーデータの場合、格納処理部204は、そのミラーデータに含まれる情報をレコードとしてミラーリングバッファ202に格納する。
【0078】
さらに、格納処理部204は、一括処理依頼の更新差分のコミットの通知を受領した場合、一時格納領域201のログの情報を含むレコードをミラーリングバッファ202に格納して更新差分を反映させる。そして、格納処理部204は、一時格納領域201のログを削除する。
【0079】
ミラーリング用の送信データに含まれる全てのミラーデータの格納完了後、格納処理部204は、アクティブノード10の同期処理部107へ受領応答を送信する。その後、所定のタイミングが到来すると、格納処理部204は、ミラーリングバッファ202のレコードの情報を全てメモリテーブル203に格納して、更新差分を反映させる。
【0080】
図9は、一時格納領域に格納された処理済データの参照が行われた場合の動作の概要を示す図である。次に、
図9を参照して、本実施例に係るクラスタシステム1における一時格納領域102に格納された処理済データの参照が行われた場合の動作をまとめて説明する。ここでは、クライアントアプリケーション301及び302の2つが存在する場合で説明する。
【0081】
クライアントアプリケーション301は、一括処理依頼をアクティブノード10へ送信する(ステップS1)。一括処理依頼を処理することで、アクティブノード10は、各APIを個別に処理する場合に比べて、スタンバイノード20への同期回数を減らすことができる。
【0082】
アクティブノード10のAPI処理部105は、クライアントアプリケーション301からの一括処理依頼の処理を開始する。例えば、要求リスト11に含まれるAPIのうちAPI[1]~[10]の処理を行なう場合、API処理部105は、データ操作領域101に、API[1]~[10]の処理に関するデータを格納する(ステップS2)。ここで、API[1]~[4]の処理が完了すると、一時格納処理部106は、API[1]~[4]の処理結果のログを一時格納領域102に格納する(ステップS3)。
【0083】
一時格納領域102に格納されたAPI[1]~[4]の処理結果のログは、コミット済み扱いとなり、一括処理依頼を行なったクライアントアプリケーション301以外のクライアントアプリケーション302も参照可能である。より詳しくは、一時格納領域102に格納されたログとメモリテーブル103の対応するレコードとを一時格納領域102へのポインタを用いて紐付けることで、クライアントアプリケーション301は、ポインタを元に一時格納領域102上の新しい状態を参照可能となる。このように、一時格納領域102に処理済データを蓄積することで、一括処理依頼の処理完了を待たずに、クライアントアプリケーション302が処理済データを参照でき、処理の高速化を図ることができる。
【0084】
この時点で、クライアントアプリケーション302からAPI[2]による処理済データの参照依頼を含む処理依頼をアクティブノード10が受信すると、API処理部105は、参照依頼にしたがってAPI[2]のログを参照する(ステップS4)。
【0085】
API[2]のログが参照されると、同期処理部107は、一時格納番号がAPI[2]以下でスタンバイノード20へ未送信のAPI[1]及び[2]の処理結果を含むミラーデータをまとめたミラーリング用の送信データを生成する。そして、同期処理部107は、生成したミラーリング用の送信データをスタンバイノード20へ送信する(ステップS5)。
【0086】
このように、クライアントアプリケーション302が一時格納領域102上の処理済データを参照した際、アクティブノード10は、参照された処理済みデータを含むそれ以前の処理結果のログをスタンバイノード20へ送信する。これにより、クライアントアプリケーション302から参照されたデータがスタンバイノード20にないことによる、アクティブノード10のダウン時のデータのロストを回避することができる。また、参照された処理済データより前の処理結果もまとめてスタンバイノード20へ送信して同期させることで、一括処理依頼に含まれるAPIの処理結果の順序を崩さないようにすることができる。
【0087】
また、ミラーリング用の送信データの送信タイミングとしては、アクティブノード10は、クライアントアプリケーション302からの処理依頼による更新差分のコミット時に送信する。この際、アクティブノード10は、一時格納領域102に格納されたログの送信済フラグにより、各ログのデータがスタンバイノード20へ送信済みか否かを判定する。クライアントアプリケーション302からの処理依頼のコミットと同じタイミングで参照された処理済データ以前の処理結果をスタンバイノード20に送信することで、アクティブノード10は、送信回数を増やすことなくクラスタシステム1の処理を高速化することができる。
【0088】
スタンバイノード20では、API[1]及び[2]の処理結果のログが一時格納領域201に格納される(ステップS6)。ここで、スタンバイノード20は、送られてきたミラーデータの一時領域フラグを用いて、一時格納領域201又はミラーリングバッファ202のいずれに格納するかを判定する。一時格納領域201に格納されたAPIの処理結果は、切り替え発生時の一括処理依頼の再実行時にそのまま使用でき、新たなアクティブノード10は、一時格納領域201に格納されたAPIより後のAPIを処理すればよい。
【0089】
図10は、一括処理依頼の処理実行中にアクティブノードの切り替えが発生した場合の動作の概要を示す図である。次に、
図10を参照して、本実施例に係るクラスタシステム1における一括処理依頼の処理実行中にアクティブノード10の切り替えが発生した場合の動作をまとめて説明する。
【0090】
図9の状態でアクティブノード10がダウンして、アクティブノード10の切り替えが発生する(ステップS7)。この場合、切り替わったスタンバイノード20の一時格納領域201は、新たなアクティブノード10の一時格納領域102となる。すなわち、切り替わった直後の状態で、切り替わり後の新たなアクティブノード10の一時格納領域102には、API[1]及び[2]の処理結果のログが存在する。また、切り替わったスタンバイノード20のメモリテーブル203は、新たなアクティブノード10のメモリテーブル103となる。ただし、切り替わったスタンバイノード20のミラーリングバッファ202は、切り替わり後には使用されない。
【0091】
クライアントアプリケーション301は、送信した一括処理依頼の処理が完了していないため、一括処理依頼の再実行を依頼する(ステップS8)。
【0092】
新たなアクティブノード10は、一括処理依頼の再依頼を受けて、先頭のAPIから処理を開始する。この際、アクティブノード10は、API[1]及び[2]の処理結果がログとして一時格納領域102に既に格納されている。そのため、アクティブノード10は、API[1]及び[2]の処理結果のデータ操作領域101への格納は行わない。そして、アクティブノード10は、API[3]から実際の処理を開始する。
【0093】
このように、スタンバイノード20の一時格納領域201に処理結果を送信しておくことで、切り替え後の新たなアクティブノード10は、データを突き合わせて処理結果が格納済のAPIの処理をスキップでき、二重処理を避けて一括処理依頼を処理できる。このように、新しいアクティブノード10で二重処理を避けて一括処理依頼が処理されることで、クライアントアプリケーション301は処理状態を気にすることなく、一括処理依頼の再実行を依頼できる。
【0094】
次に、一括処理依頼の処理時のアクティブノード10の状態の遷移の一例を説明する。
図11は、一括処理依頼の処理時のアクティブノードが有するデータの遷移を示す第1の図である。
図12は、一括処理依頼の処理時のアクティブノードが有するデータの遷移を示す第2の図である。
図11の最初の状態401から
図12の最後の状態406に向けて時系列で、順番にデータ操作領域101、一時格納領域102及びメモリテーブル103の状態が遷移する。
【0095】
状態401は、アクティブノード10が一括処理依頼を処理する前の状態を表す。この場合、一括処理依頼を処理する前であるため、データ操作領域101及び一時格納領域102には、何も格納されていない。一方、メモリテーブル103には、レコード番号R001~R004のレコードが格納されている。ただし、メモリテーブル103の各レコードの一時格納領域へのポインタは初期状態である。アクティブノード10は、要求リスト11を含む一括処理依頼の処理を開始する。要求リスト11には、API[1]~[5]の処理命令が含まれる。
【0096】
アクティブノード10は、一括処理依頼におけるAPI[1]の処理の完了直前には、状態402に遷移する。API処理部105は、API[1]の処理結果をデータ操作領域101にコミットログとして登録する。API処理部105は、API[1]の処理により、メモリテーブル103に格納されたレコード番号R001のレコードデータである“a1”を“a2”に書き換える。
【0097】
そして、API[1]の処理が完了すると、アクティブノード10は、状態403に遷移する。ここで、
図11及び12では、要求リスト11におけるAPIの処理完了を取り消し線で表す。一時格納処理部106は、データ操作領域101におけるAPI[1]の処理結果のコミットログの情報を含むログを一時格納領域102に格納し、且つ、データ操作領域101からそのコミットログを削除する。この際、一時格納処理部106は、要求リスト11におけるAPI[1]のインデックスに対応する一時格納番号としてS001を割り当て、且つ、送信済みフラグをOFFに設定する。ここでは、一時格納処理部106は、要求リストにおけるAPIの括弧内の番号と、一時格納番号の最下位の番号とを対応させる。さらに、一時格納処理部106は、メモリテーブル103に登録されたレコード番号R001のレコードの一時格納領域へのポインタに、一時格納領域102におけるレコード番号R001のログの一時格納番号であるS001を登録する。
【0098】
次に、アクティブノード10は、一括処理依頼におけるAPI[2]の処理が完了すると、
図12の状態404に遷移する。API処理部105は、API[2]の処理することで、メモリテーブル103に格納されたレコード番号R002のレコードデータである“b1”を“b2”に書き換える。そして、一時格納処理部106は、API[2]の処理結果のレコード番号がR002のログを一時格納領域102に格納する。この際、一時格納処理部106は、要求リスト11におけるAPI[2]のインデックスに対応する一時格納番号としてS002を割り当て、且つ、送信済みフラグをOFFに設定する。さらに、一時格納処理部106は、メモリテーブル103に登録されたレコード番号R002のレコードの一時格納領域へのポインタに、一時格納領域102におけるレコード番号R002のログの一時格納番号であるS002を登録する。
【0099】
次に、要求リスト11の最後のAPI[5]の処理中には、アクティブノード10は、状態405に遷移する。それまでに、API処理部105は、API[3]の処理により新たにレコードデータとして“c1”を挿入し、さらに、API[4]の処理によりメモリテーブル103に登録されたレコード番号がR003のレコードデータである“d1”を削除する。これにより、一時格納処理部106は、状態405に示す一時格納番号S003及びS004のログを一時格納領域102に格納し、且つ、メモリテーブル103に格納されたレコード番号がR003の一時格納領域へのポインタを登録する。さらに、API処理部105は、API[5]の処理結果をデータ操作領域101にコミットログとして登録する。API処理部105は、API[5]の処理により、新たなレコードデータである“e1”を挿入する。
【0100】
そして、一括処理依頼における最後のAPI[5]の処理が完了すると、アクティブノード10は、状態406に遷移する。同期処理部107は、データ操作領域101に格納されたAPI[5]のコミットログ及び一時格納領域102に格納されたAPI[1]~[4]のログについてのそれぞれのミラーデータを含む送信データを生成する。そして、同期処理部107は、生成した送信データをスタンバイノード20へ送信してミラーリングを実行する。その後、同期処理部107は、受領応答を受けると、メモリテーブル103に、データ操作領域101のコミットログ及び一時格納領域102のログの情報を含むレコードをメモリテーブル103に格納して、更新差分を反映する。さらに、同期処理部107は、メモリテーブル103の一時格納領域へのポインタを初期化するとともに、データ操作領域101のコミットログ及び一時格納領域102のログを削除する。
【0101】
次に、一括処理依頼の処理中に別のクライアントアプリケーション300から処理済データの参照が行われた場合のアクティブノード10及びスタンバイノード20の状態の遷移の一例を説明する。
図13は、一括処理依頼の処理中に参照が行われた場合のアクティブノード及びスタンバイノードの状態の遷移の一例を示す図である。ここでは、
図12における状態405の場合に、別のクライアントアプリケーション300からの処理依頼によりAPI[2]の処理結果である処理済データが参照された場合で説明する。
【0102】
図12における状態405の場合に、別のクライアントアプリケーション300からの処理依頼によりAPI[2]の処理結果である処理済データが参照されると、アクティブノード10は、状態411に遷移する。API処理部105は、参照依頼にしたがってメモリテーブル103におけるレコード番号がR002のレコードを参照する。そこで、一時格納領域へのポインタとしてS002が登録されていることから、API処理部105は、一時格納領域102における一時格納番号がS002のログを参照して、レコードデータとして登録された“b2”を取得する。
【0103】
さらに、API処理部105は、参照されたレコードの一時格納番号が、自己が記憶する最大送信番号の値よりも大きいかを判定する。この場合は、初めての参照であるので、API処理部105は、参照したAPI[2]の処理結果のログの一時格納番号であるS002を最大送信番号とする。そして、API処理部105は、S002以下の一時格納番号を有するログの送信を同期処理部107に指示する。ここで、S002以下の一時格納番号とは、一時格納番号がS002であるログに格納された処理結果についての処理以前のAPIの処理による処理結果を含むログの一時格納番号である。同期処理部107は、S002以下の一時格納番号を有し且つ送信済みフラグがOFFであるAPI[1]及び[2]の処理結果のログをスタンバイノード20へ送信する。
【0104】
スタンバイノード20にAPI[1]及び[2]の処理結果のログが送信されると、アクティブノード10及びスタンバイノード20は、状態412に遷移する。すなわち、同期処理部107は、一時格納領域102における一時格納番号がS001及びS002のログの送信済みフラグをONに設定する。さらに、スタンバイノード20の格納処理部204は、API[1]及び[2]の処理結果のログを一時格納領域201に格納する。
【0105】
その後、一括処理依頼の処理が全て完了すると、アクティブノード10及びスタンバイノード20は、状態413に遷移する。すなわち、同期処理部107は、一時格納領域102の全てのログの情報を含むレコードをメモリテーブル103へ格納して、更新差分を反映させ、一時格納領域102の全てのログを削除する。また、同期処理部107は、一時格納領域へのポインタを初期化する。また、スタンバイノード20の格納処理部204は、一時格納領域201に格納された各ログの情報を含むレコードをミラーリングバッファ202へ格納して、更新差分を反映させ、且つ、一時格納領域201に格納された全てのログを削除する。
【0106】
図14は、一括処理依頼を処理中に参照がない場合のクラスタシステムの動作を示すシーケンス図である。次に、
図14を参照して、一括処理依頼を処理中に別のクライアントアプリケーション300から参照がない場合のクラスタシステム1の動作を説明する。
【0107】
クライアントアプリケーション300は、アクティブノード10に一括処理依頼を送信する(ステップS101)。
【0108】
アクティブノード10のAPI処理部105は、一括処理依頼を通信部104から取得する。そして、API処理部105は、データ操作領域101を用いて、一括処理依頼に含まれる各APIの処理を順番に行う(ステップS102)。各APIの処理後、API処理部105は、APIの処理が正常終了したか否かを判定する(ステップS103)。
【0109】
APIの処理が正常終了しなかった場合(ステップS103:否定)、API処理部105は、異常発生の通知をクライアントアプリケーション300へ送信して、クライアントアプリケーション300との間の処理に復帰する(ステップS104)。
【0110】
これに対して、APIの処理が正常終了した場合(ステップS103:肯定)、一時格納処理部106は、一時格納領域102にデータ操作領域101のコミットログに含まれるAPIの処理結果の情報をログとして格納する(ステップS105)。
【0111】
次に、API処理部105は、一括処理依頼に含まれる全てのAPIの処理が完了したか否かを判定する(ステップS106)。処理していないAPIが残っている場合(ステップS106:否定)、API処理部105は、ステップS102へ戻る。
【0112】
これに対して、一括処理依頼に含まれる全てのAPIの処理が完了した場合(ステップS106:肯定)、同期処理部107は、一時格納領域102に格納されたログを用いてそれぞれのミラーデータを作成する。この場合、同期処理部107は、いずれのミラーデータにおいても一時領域フラグをOFFに設定する。その後、同期処理部107は、作成したミラーデータを格納したミラーリング用の送信データをスタンバイノード20へ送信して、ミラーリングを実行する(ステップS107)。
【0113】
スタンバイノード20の格納処理部204は、送信データを取得して、一時領域フラグがOFFであることを確認して、全てのミラーデータに含まれるAPIの処理結果の情報をレコードとしてミラーリングバッファ202に格納して、更新差分を反映する(ステップS108)。
【0114】
その後、格納処理部204は、ミラーリング用の送信データの受領応答をアクティブノード10へ送信する(ステップS109)。
【0115】
アクティブノード10の同期処理部107は、受領応答を受けて、一時格納領域102に格納された各ログの情報を含む複数のレコードをメモリテーブル103に格納して、更新差分を反映する(ステップS110)。さらに、同期処理部107は、一時格納領域102に格納されたログを削除する。
【0116】
その後、API処理部105は、更新差分の反映完了の通知を同期処理部107から受けて、正常終了応答をクライアントアプリケーション300に送信して、クライアントアプリケーション300との間の処理に復帰する(ステップS111)。
【0117】
ここで説明したように、APIの処理が正常終了しない場合には、アクティブノード10は、異常発生通知をクライアントアプリケーション300に通知するが、以下の説明では、異常発生の場合を省略して説明する。
【0118】
図15は、一括処理依頼で処理中に参照がある場合のクラスタシステムの動作を示すシーケンス図である。次に、
図15を参照して、一括処理依頼を処理中に別のクライアントアプリケーション300から参照がある場合のクラスタシステム1の動作を説明する。ここでは、クライアントアプリケーション301及び302が存在し、それぞれからの処理依頼を、アクティブノード10がスレッド#1及び#2として処理する場合で説明する。
【0119】
クライアントアプリケーション300は、アクティブノード10に一括処理依頼を送信する(ステップS201)。
【0120】
アクティブノード10のAPI処理部105は、一括処理依頼を通信部104から取得する。そして、API処理部105は、スレッド#1において、データ操作領域101を用いて括処理依頼に含まれる各APIの処理を順番に行う(ステップS202)。
【0121】
スレッド#1において1つのAPIの処理が終了すると、一時格納処理部106は、一時格納領域102にデータ操作領域101のコミットログに含まれるAPIの処理結果の情報をログとして格納する(ステップS203)。
【0122】
次に、API処理部105は、スレッド#1において、一括処理依頼に含まれる全てのAPIの処理が完了したか否かを判定する(ステップS204)。処理していないAPIが残っている場合(ステップS204:否定)、API処理部105は、ステップS202へ戻る。
【0123】
これに対して、一括処理依頼に含まれる全てのAPIの処理が完了した場合(ステップS204:肯定)、スレッド#1における処理はステップS215へ進む。
【0124】
一方、API処理部105がスレッド#1において一括処理依頼を処理中に、クライアントアプリケーション302が、参照依頼を含む処理依頼をアクティブノード10に送信する(ステップS205)。
【0125】
アクティブノード10のAPI処理部105は、処理依頼を通信部104から取得する。そして、API処理部105は、スレッド#2において、データ操作領域101を用いて、処理依頼に含まれるAPIの処理を実行する(ステップS206)。その処理依頼の中の参照依頼により、API処理部105は、一時格納領域102に格納されたAPIの処理結果のログを参照する(ステップS207)。
【0126】
その後、スレッド#2における処理依頼の処理が完了すると、API処理部105は、参照したログの一時格納番号が最大送信番号の値よりも大きければ、参照したログの一時格納番号を最大送信番号とする。そして、API処理部105は、最大送信番号の値以下の未送信ログの送信指示及びスレッド#2における処理依頼の処理完了を同期処理部107に通知する。同期処理部107は、通知を受けて、更新を含むコミットを実行する(ステップS208)。すなわち、同期処理部107は、一時格納領域102に格納された最大送信番号の値以下の未送信ログ及びデータ操作領域101に格納されたスレッド#2における処理依頼のAPIの処理結果のコミットログを取得する。そして、同期処理部107は、それぞれのミラーデータを生成する。この際、同期処理部107は、一時格納領域102に格納された最大送信番号の値以下の未送信ログのミラーデータの一時領域フラグをONにする。また、同期処理部107は、スレッド#2における処理依頼のAPIの処理結果のコミットログのミラーデータの一時領域フラグをOFFにする。そして、同期処理部107は、作成したミラーデータを格納したミラーリング用の送信データをスタンバイノード20へ送信して、ミラーリングを実行する(ステップS209)。
【0127】
スタンバイノード20の格納処理部204は、ミラーリング用の送信データに含まれるミラーデータのうち一時領域フラグがONのミラーデータに含まれるAPIの処理結果を一時格納領域201に格納する。すなわち、格納処理部204は、アクティブノード10の一時格納領域102に格納された一括処理に含まれるAPIの処理結果のログのうち参照されたログ以前のログを自装置の一時格納領域201に格納して、更新差分を反映する(ステップS210)。
【0128】
また、格納処理部204は、ミラーリング用の送信データに含まれるミラーデータのうち一時領域フラグがOFFのミラーデータに含まれるAPIの処理結果を含むレコードをミラーリングバッファ202に格納する。すなわち、格納処理部204は、スレッド#2における処理依頼のAPIの処理結果をミラーリングバッファ202に格納して、更新差分を反映する(ステップS211)。
【0129】
その後、格納処理部204は、スレッド#2に対するミラーリング用の送信データの受領応答をアクティブノード10へ送信する(ステップS212)。
【0130】
アクティブノード10の同期処理部107は、スレッド#2に対する受領応答を受けて、スレッド#2のデータ操作領域101に格納されたコミットログの情報を含むレコードをメモリテーブル103に格納して、更新差分を反映する(ステップS213)。
【0131】
その後、API処理部105は、スレッド#2における更新差分の反映完了の通知を同期処理部107から受ける。そして、API処理部105は、正常終了応答をクライアントアプリケーション302に送信して、クライアントアプリケーション302との間の処理に復帰する(ステップS214)。
【0132】
一方、スレッド#1において、同期処理部107は、データ操作領域101に存在する最後のAPIの処理結果のコミットログ及び一時格納領域102に格納されたログのうち送信済みフラグがOFFのログのそれぞれのミラーデータを作成する。この場合、同期処理部107は、全てのミラーデータの一時領域フラグをOFFに設定する。その後、同期処理部107は、スレッド#1において、作成したミラーデータを格納したミラーリング用の送信データをスタンバイノード20へ送信して、ミラーリングを実行する(ステップS215)。
【0133】
スタンバイノード20の格納処理部204は、送信データを取得して、全てのミラーデータの一時領域フラグがOFFであることを確認する。そして、格納処理部204は、全てのミラーデータに含まれるAPIの処理結果の情報をレコード及び一時格納領域201に格納されたログの情報を含むレコードをミラーリングバッファ202に格納して、更新差分を反映する(ステップS216)。
【0134】
その後、格納処理部204は、スレッド#1に対するミラーリング用の送信データの受領応答をアクティブノード10へ送信する(ステップS217)。
【0135】
アクティブノード10の同期処理部107は、スレッド#1に対する受領応答を受ける。そして、同期処理部107は、一時格納領域102に格納された各ログの情報を含む複数のレコードをメモリテーブル103に格納して、更新差分を反映する(ステップS218)。さらに、同期処理部107は、一時格納領域102に格納されたログを削除する。
【0136】
その後、API処理部105は、スレッド#1における更新差分の反映完了の通知を同期処理部107から受ける。そして、API処理部105は、正常終了応答をクライアントアプリケーション301に送信して、クライアントアプリケーション301との間の処理に復帰する(ステップS219)。
【0137】
図16は、一括処理依頼で処理中に参照があり且つ切り替えが発生した場合のクラスタシステムの動作を示すシーケンス図である。次に、
図16を参照して、一括処理依頼を処理中に別のクライアントアプリケーション300から参照があり且つアクティブノード10の切り替えが発生した場合のクラスタシステム1の動作を説明する。ここでは、クライアントアプリケーション301及び302が存在し、それぞれからの処理依頼を、アクティブノード10がスレッド#1及び#2として処理する場合で説明する。
【0138】
クライアントアプリケーション300は、アクティブノード10に一括処理依頼を送信する(ステップS301)。
【0139】
アクティブノード10のAPI処理部105は、一括処理依頼を通信部104から取得する。そして、API処理部105は、スレッド#1において、データ操作領域101を用いて括処理依頼に含まれる各APIの処理を順番に行う(ステップS302)。
【0140】
スレッド#1において1つのAPIの処理が終了すると、一時格納処理部106は、一時格納領域102にデータ操作領域101のコミットログに含まれるAPIの処理結果の情報をログとして格納する(ステップS303)。
【0141】
次に、API処理部105は、スレッド#1において、一括処理依頼に含まれる全てのAPIの処理が完了したか否かを判定する(ステップS304)。処理していないAPIが残っている場合(ステップS304:否定)、API処理部105は、ステップS302へ戻る。ここでは一括処理依頼に含まれる全てのAPIの処理が完了する前にアクティブノード10がダウンするので、一括処理依頼に含まれる全てのAPIの処理が完了する場合への分岐は発生しないので、その分岐方向への処理は進まない。
【0142】
一方、API処理部105がスレッド#1において一括処理依頼を処理中に、クライアントアプリケーション302が、参照依頼を含む処理依頼をアクティブノード10に送信する(ステップS305)。
【0143】
アクティブノード10のAPI処理部105は、処理依頼を通信部104から取得する。そして、API処理部105は、スレッド#2において、データ操作領域101を用いて、処理依頼に含まれるAPIの処理を実行する(ステップS306)。その処理依頼の中の参照依頼により、API処理部105は、一時格納領域102に格納されたAPIの処理結果のログを参照する(ステップS307)。
【0144】
その後、スレッド#2における処理依頼の処理が完了すると、API処理部105は、参照したログの一時格納番号が最大送信番号の値よりも大きければ、参照したログの一時格納番号を最大送信番号とする。そして、API処理部105は、最大送信番号の値以下の一時格納番号を有するログの送信指示及びスレッド#2における処理依頼の処理完了を同期処理部107に通知する。同期処理部107は、通知を受けて、更新を含むコミットを実行する(ステップS308)。そして、同期処理部107は、ミラーリング用の送信データをスタンバイノード20へ送信して、ミラーリングを実行する(ステップS309)。
【0145】
スタンバイノード20の格納処理部204は、ミラーリング用の送信データに含まれるミラーデータのうち一時領域フラグがONのミラーデータに含まれるAPIの処理結果を一時格納領域201に格納する。すなわち、格納処理部204は、アクティブノード10の一時格納領域102に格納された一括処理に含まれるAPIの処理結果のログのうち参照されたログ以前のログを自装置の一時格納領域201に格納して、更新差分を反映する(ステップS310)。
【0146】
また、格納処理部204は、ミラーリング用の送信データに含まれるミラーデータのうち一時領域フラグがOFFのミラーデータに含まれるAPIの処理結果を含むレコードをミラーリングバッファ202に格納する。すなわち、格納処理部204は、スレッド#2における処理依頼のAPIの処理結果を含むレコードをミラーリングバッファ202に格納して、更新差分を反映する(ステップS311)。
【0147】
その後、格納処理部204は、スレッド#2に対するミラーリング用の送信データの受領応答をアクティブノード10へ送信する(ステップS312)。
【0148】
アクティブノード10の同期処理部107は、スレッド#2に対する受領応答を受ける。そして、同期処理部107は、スレッド#2におけるデータ操作領域101に格納されたコミットログに含まれるAPIの処理結果の情報を含むレコードをメモリテーブル103に格納して、更新差分を反映する(ステップS313)。
【0149】
その後、API処理部105は、スレッド#2における更新差分の反映完了の通知を同期処理部107から受ける。そして、API処理部105は、正常終了応答をクライアントアプリケーション302に送信して、クライアントアプリケーション302との間の処理に復帰する(ステップS314)。
【0150】
その後、スレッド#1における一括処理依頼を処理中に、アクティブノード10がダウンし、アクティブノード10の切り替えが発生して、スタンバイノード20が新しいアクティブノード10となる(ステップS315)。ただし、
図16では、図示の都合上そのままスタンバイノード20として表している。以下では、スタンバイノード20を新しいアクティブノード10として説明する。
【0151】
新しいアクティブノード10の一時格納処理部106は、切り替わりが発生すると、一時格納領域201へのポインタを作成して、メモリテーブル103の各レコードの一時格納領域へのポインタに登録する(ステップS316)。
【0152】
クライアントアプリケーション301は、一括処理依頼の再依頼を新しいアクティブノード10へ送信して、再実行を依頼する(ステップS317)。
【0153】
新しいアクティブノード10のAPI処理部105は、一括処理依頼の再依頼を受けて、一括処理依頼に含まれるAPIの処理を順番に開始する。API処理部105は、処理対象のAPIの処理結果のログが一時格納領域102に存在するか否かを判定する(ステップS318)。処理対象のAPIの処理結果のログが一時格納領域102に存在する場合(ステップS318:肯定)、API処理部105は、ステップS320へ進む。
【0154】
これに対して、処理対象のAPIの処理結果のログが一時格納領域102に存在しない場合(ステップS318:否定)、API処理部105は、処理対象のAPIの処理を実行する(ステップS319)。この場合、処理対象のAPIが最後のAPIでなければ、一時格納処理部106は、APIの処理結果をログとして一時格納領域102に格納する。
【0155】
その後、API処理部105は、一括処理依頼に含まれる全てのAPIの処理が完了したか否かを判定する(ステップS320)。未処理のAPIが残っている場合(ステップS320:否定)、API処理部105は、ステップS318へ戻る。
【0156】
一方、一括処理依頼に含まれる全てのAPIの処理が完了した場合(ステップS320:肯定)、同期処理部107は、一時格納領域102に格納されたログの情報を含むレコードをメモリテーブル103に格納して、更新差分を反映する(ステップS321)。さらに、同期処理部107は、一時格納領域102に格納されたログを削除する。
【0157】
その後、API処理部105は、スレッド#1における更新差分の反映完了の通知を同期処理部107から受ける。そして、API処理部105は、正常終了応答をクライアントアプリケーション301に送信して、クライアントアプリケーション301との間の処理に復帰する(ステップS322)。
【0158】
図17は、一括処理依頼受信時のアクティブノードの処理のフローチャートである。次に、
図17を参照して、一括処理依頼受信時のアクティブノード10の処理の流れを説明する。
【0159】
API処理部105は、通信部104を介して、クライアントアプリケーション300から送信された一括処理依頼を受信する(ステップS401)。
【0160】
次に、API処理部105は、一括処理依頼に含まれるAPIのうち未処理のAPIの先頭のAPIの処理を開始する(ステップS402)。
【0161】
次に、API処理部105は、処理対象のAPIの要求リストのインデックスに対応する一時格納番号が既に一時格納領域102に存在するか否かを判定する(ステップS403)。処理対象のAPIの要求リストのインデックスに対応する一時格納番号が既に一時格納領域102に存在する場合(ステップS403:肯定)、API処理部105は、ステップS402へ戻る。
【0162】
これに対して、処理対象のAPIの要求リストのインデックスに対応する一時格納番号が一時格納領域102に存在しない場合(ステップS403:否定)、API処理部105は、データ操作領域101を用いてAPIを処理する。そして、API処理部105は、APIの処理結果をコミットログとしてデータ操作領域101に格納する(ステップS404)。
【0163】
そして、API処理部105は、処理したAPIが一括処理依頼に含まれるAPIのうちの最後のAPIか否かを判定する(ステップS405)。最後のAPIでない場合(ステップS405:否定)、一時格納処理部106は、コミットログに含まれるAPIの処理結果の情報をログとして一時格納領域102に格納して、データ操作領域101からコミットログを削除する(ステップS406)。
【0164】
さらに、一時格納処理部106は、格納した一時格納領域102のログへのメモリテーブル103のレコードからのポインタを作成してメモリテーブル103の一時格納領域へのポインタに登録する(ステップS407)。その後、API処理部105は、ステップS402へ戻る。
【0165】
これに対して、処理したAPIが一括処理依頼の最後のAPIの場合(ステップS405:肯定)、同期処理部107は、最後のAPIのコミットログ及び一時格納領域102の送信済みフラグがOFFのログをスタンバイノード20へ送信する。具体的には、同期処理部107は、それぞれのミラーデータを生成し、生成したミラーデータを含むミラーリング用の送信データをスタンバイノード20へ送信する(ステップS408)。
【0166】
その後、受領応答を受信すると、同期処理部107は、最後のAPIのコミットログ及び一時格納領域のログのそれぞれに含まれるAPIの処理結果の情報を含む複数のレコードをメモリテーブル103に格納して、更新結果を反映する(ステップS409)。
【0167】
次に、同期処理部107は、メモリテーブル103の一時格納領域へのポインタを初期化する(ステップS410)。
【0168】
その後、API処理部105は、通信部104を介して正常終了応答をクライアントアプリケーション300へ送信する(ステップS411)。
【0169】
図18は、参照依頼受信時のアクティブノードの処理のフローチャートである。次に、
図18を参照して、参照依頼受信時のアクティブノード10の処理の流れを説明する。
【0170】
API処理部105は、通信部104を介してクライアントアプリケーション300から送信された参照依頼を受信する(ステップS501)。
【0171】
次に、API処理部105は、参照依頼で指定されたメモリテーブル103のレコードを参照する(ステップS502)。
【0172】
そして、API処理部105は、参照したレコードの一時格納領域へのポインタが初期状態か否かを判定する(ステップS503)。
【0173】
参照したレコードの一時格納領域へのポインタが初期状態の場合(ステップS503:肯定)、API処理部105は、メモリテーブル103のレコードデータを参照する(ステップS504)。その後、アクティブノード10の処理は、ステップS508へ進む。
【0174】
これに対して、参照したレコードの一時格納領域へのポインタが初期状態でない場合(ステップS503:否定)、API処理部105は、ポインタで示された一時格納領域102のログのレコードデータを参照する(ステップS505)。
【0175】
次に、API処理部105は、参照したログの一時格納番号が、自己が保持する最大送信番号の値より大きいか否かを判定する(ステップS506)。一時格納番号が最大送信番号の値以下の場合(ステップS506:否定)、アクティブノード10の処理は、ステップS508へ進む。
【0176】
これに対して、一時格納番号が最大送信番号の値より大きい場合(ステップS506:肯定)、API処理部105は、最大送信番号の値を参照したログの一時格納番号に更新する(ステップS507)。
【0177】
その後、同期処理部107は、更新を含むコミットを実行する(ステップS508)。すなわち、一時格納領域102のログが参照されていない場合であれば、同期処理部107は、データ操作領域101に格納されたコミットログをスタンバイノード20へ送信して、ミラーリングを実行する。また、一時格納領域102のログを参照した場合であれば、同期処理部107は、一時格納領域102に格納された最大送信番号以下の未送信ログ及びデータ操作領域101のコミットログをスタンバイノード20へ送信して、ミラーリングを実行する。
【0178】
その後、API処理部105は、通信部104を介して正常応答をクライアントアプリケーション300へ送信する(ステップS509)。
【0179】
図19は、スタンバイノードによる受信処理のフローチャートである。次に、
図19を参照して、スタンバイノード20による受信処理の流れを説明する。
【0180】
格納処理部204は、データをアクティブノード10から受信する(ステップS601)。
【0181】
次に、格納処理部204は、一時領域フラグがONか否かを判定する(ステップS602)。
【0182】
一時領域フラグがONの場合(ステップS602:肯定)、格納処理部204は、APIの処理結果の情報を含むログを一時格納領域201に格納する(ステップS603)。
【0183】
これに対して、一時領域フラグがOFFの場合(ステップS602:否定)、格納処理部204は、APIの処理結果の情報を含むレコードをミラーリングバッファ202に格納する(ステップS604)。
【0184】
その後、格納処理部204は、ミラーリング用の送信データの受領応答をアクティブノード10へ送信する(ステップS605)。
【0185】
図20は、クライアントアプリケーションによる一括処理依頼の送信処理のフローチャートである。次に、
図20を参照して、クライアントアプリケーション300による一括処理依頼の送信処理の流れを説明する。
【0186】
クライアントアプリケーション300は、一括処理依頼をアクティブノード10へ送信して処理を依頼する(ステップS701)。
【0187】
その後、クライアントアプリケーション300は、アクティブノード10の切り替えを検知したか否かを判定する(ステップS702)。アクティブノード10の切り替えを検知しない場合(ステップS702:否定)、クライアントアプリケーション300は、ステップS704へ進む。
【0188】
アクティブノード10の切り替えを検知した場合(ステップS702:肯定)、クライアントアプリケーション300は、一括処理依頼を新たなアクティブノード10へ再送信して再依頼を行なう(ステップS703)。
【0189】
その後、クライアントアプリケーション300は、送信した一括処理に対する応答をアクティブノード10から受信する(ステップS704)。そして、クライアントアプリケーション300は、アクティブノード10との間の通信に復帰する。
【0190】
以上に説明したように、本実施例に係るクラスタシステムのアクティブノードは、一括処理依頼を処理する場合に、各APIの処理完了毎に一時格納領域にログを格納する。これにより、別のクライアントアプリケーションが、一括処理全体の処理完了を待たずに処理済データを用いることができ、クライアントとの間の処理の高速化を図ることができる。また、アクティブノードは、一時格納領域のログが別のクライアントアプリケーションから参照された場合、そのログ及びそのログ以前のログをスタンバイノードに送信する。スタンバイノードは、受信したログを一時格納領域に格納する。これにより、別のクライアントアプリケーションにより参照された処理済データ以前の処理済データを、スタンバイノードが保持することになり、アクティブノードの切り替え後に、データの不整合を回避することができる。また、参照依頼を含む処理依頼のコミットのタイミングで、参照されたログを含む以前のログをスタンバイノードへ送信することで、一括処理依頼に含まれるAPIの処理結果の順序を維持することができる。したがって、システムの信頼性を向上させることが可能となる。
【0191】
さらに、スタンバイノードは、アクティブノードに切り替わった際に、一括処理依頼の再依頼を受けると、すでに一時格納領域に処理結果が格納されたAPIについては処理をスキップして、未処理のAPIの処理を実行する。これにより、一括処理依頼の再実行において、二重処理を回避することができ、一括処理依頼の処理を効率化することができる。また、クライアントアプリケーションは、切り替え前のアクティブノードによる一括処理依頼の処理状態を気にすることなく、再実行を依頼することができる。
【0192】
(ハードウェア構成)
図21は、コンピュータのハードウェア構成図である。アクティブノード10、スタンバイノード20及び端末装置30のいずれも
図21に示すコンピュータ90により実現することができる。
【0193】
コンピュータ90は、
図21に示すように、プロセッサ901、メモリ902、HDD(Hard Disk Drive)903、画像信号処理部904、入力信号処理部905、ディスクドライブ906及び通信インタフェース907を有する。プロセッサ901、メモリ902、HDD(Hard Disk Drive)903、画像信号処理部904、入力信号処理部905、ディスクドライブ906及び通信インタフェース907のそれぞれは、バスに接続され相互に通信することができる。
【0194】
画像信号処理部904は、ディスプレイ91が接続される。画像信号処理部904は、プロセッサ901からの指示を受けて、ディスプレイ91にメッセージや画像を表示させる。利用者は、ディスプレイ91に表示されたメッセージや画像を確認することができる。
【0195】
入力信号処理部905は、キーボードやマウスといった入力デバイス92が接続される。利用者は、入力デバイス92を用いて命令を入力することができる。入力信号処理部905は、入力デバイス92から入力された命令をプロセッサ901へ転送する。
【0196】
ディスクドライブ906は、記憶媒体93に対してデータの読み書きを行なう装置である。例えば、ディスクドライブ906は、記憶媒体93に格納されたプログラムを読み出してプロセッサ901に送信して実行させることができる。
【0197】
通信インタフェース907は、LAN(Local Area Network)やWAN(Wide Area Network)等のネットワーク94に接続される。プロセッサ901は、通信インタフェース907を介してネットワーク94に接続される他の装置と通信を行うことができる。例えば、通信インタフェース907は、アクティブノード10と端末装置30との間の通信やアクティブノード10とスタンバイノード20との間の通信に使用される。例えば、通信インタフェース907は、
図3に例示した、通信部104の機能を実現する。
【0198】
HDD903は、補助記憶装置である。コンピュータ90がアクティブノード10の場合、HDD903は、一時格納領域102及びメモリテーブル103の機能を実現する。また、HDD903は、
図3に例示したAPI処理部105、一時格納処理部106及び同期処理部107の機能を実現するためのプログラムを含む各種プログラムを格納する。また、コンピュータ90がスタンバイノード20の場合、HDD903は、一時格納領域201、ミラーリングバッファ202及びメモリテーブル203の機能を実現する。また、HDD903は、
図3に例示した格納処理部204の機能を実現するためのプログラムを含む各種プログラムを格納する。また、コンピュータ90が端末装置30の場合、HDD903は、クライアントアプリケーション300の機能を実現するためのプログラムを含む各種プログラムを格納する。
【0199】
メモリ902は、主記憶装置である。メモリ902は、例えば、DRAM(Dynamic Random Access Memory)を用いることができる。メモリ902は、コンピュータ90がアクティブノード10の場合、
図3に例示したデータ操作領域101の機能を実現する。
【0200】
プロセッサ901は、HDD903から各種プログラムを読み出して、メモリ902に展開して実行する。これにより、プロセッサ901は、コンピュータ90がアクティブノード10の場合、
図3に例示したAPI処理部105、一時格納処理部106及び同期処理部107の機能を実現する。また、プロセッサ901は、コンピュータ90がスタンバイノード20の場合、格納処理部204の機能を実現する。また、プロセッサ901は、コンピュータ90が端末装置30の場合、クライアントアプリケーション300の機能を実現する。
【0201】
なお、各部の機能を実現するプログラムは、HDD903に記憶される場合に限らず、例えば着脱可能な記憶媒体93に記憶され、ディスクドライブ906を介してプロセッサ901によって読み出されてもよい。あるいは、各部の機能を実現するプログラムモは、ネットワーク94を介して接続された他のコンピュータに記憶されてもよい。そして、各部の機能を実現するプログラムは、他のコンピュータから、通信インタフェース907を介してプロセッサ901によって読み出されてもよい。