(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公開特許公報(A)
(11)【公開番号】P2023174221
(43)【公開日】2023-12-07
(54)【発明の名称】フォールトトレラントシステム及びデータ処理方法
(51)【国際特許分類】
G06F 9/52 20060101AFI20231130BHJP
G06F 11/20 20060101ALI20231130BHJP
【FI】
G06F9/52 150Z
G06F11/20 620
【審査請求】未請求
【請求項の数】8
【出願形態】OL
(21)【出願番号】P 2022086961
(22)【出願日】2022-05-27
(71)【出願人】
【識別番号】000005108
【氏名又は名称】株式会社日立製作所
(74)【代理人】
【識別番号】110002365
【氏名又は名称】弁理士法人サンネクスト国際特許事務所
(72)【発明者】
【氏名】河合 英宏
【テーマコード(参考)】
5B034
【Fターム(参考)】
5B034AA05
5B034DD06
(57)【要約】 (修正有)
【課題】同期による負荷を抑制しながらノード間の振る舞いを一致化できる、低遅延でスケーラブルなフォールトトレラントシステム及びデータ処理方法を提供する。
【解決手段】多重化された複数のノード10が通信ネットワーク2を介して接続されるフォールトトレラントシステム1において、各ノード10で動作するアプリケーションは、入力に対して決定論的に出力を生成する1以上のタスク20から構成され、複数のノード10のうちの1つがリーダノードとなり、それ以外がフォロワノードとなり、リーダノードとフォロワノードは、それぞれ同一のタスクを実行するように構成され、タスク20が複数のメッセージ送信元を持つ送信先タスクにメッセージを送信するとき、複数のノード10のプロセッサは、送信先タスクに対するメッセージの配送順について複数のノード間で合意形成し、合意形成された配送順に従ってメッセージを送信する。
【選択図】
図3
【特許請求の範囲】
【請求項1】
多重化された複数のノードが通信ネットワークを介して接続されるフォールトトレラントシステムであって、
前記複数のノードは、それぞれプロセッサ、メモリ、及び記憶領域を有し、
各前記ノードにおいて前記プロセッサが前記記憶領域からプログラムを前記メモリに読み出して実行することによって動作するアプリケーションは、入力に対して決定論的に出力を生成する1以上のタスクから構成され、
前記複数のノードのうちの1つがリーダノードとなり、リーダノード以外のノードがフォロワノードとなり、前記リーダノードと前記フォロワノードは、それぞれ同一のタスクを実行するように構成され、
各前記タスクは、自タスクの状態を示すローカルステートに1対1で紐付けられ、
前記タスクの入力は、システム外部または他のタスクから受信したメッセージ、及び当該タスクに紐付けられた前記ローカルステートへのアクセスを含み、
前記タスクの出力は、当該タスクがシステム外部または他のタスクに送信するメッセージ、及び当該タスクに紐付けられた前記ローカルステートの更新を含み、
前記タスクが複数のメッセージ送信元を持つ送信先タスクにメッセージを送信するとき、前記複数のノードのプロセッサは、前記送信先タスクに対するメッセージの配送順について前記複数のノード間で合意形成し、合意形成された配送順に従って前記メッセージを配送、及び処理する
ことを特徴とするフォールトトレラントシステム。
【請求項2】
前記タスクが複数のメッセージ送信元を持つ送信先タスクにメッセージを送信するとき、前記送信先タスクに対するメッセージの配送順について前記複数のノード間で合意形成がなされるまでは、前記送信先タスクに対するメッセージの送信を一時的に保留する
ことを特徴とする請求項1に記載のフォールトトレラントシステム。
【請求項3】
1以上の第1のタスクから既存の第1のメッセージパスが生成されている第2のタスクに対して、前記第1のタスクとは異なる第3のタスクから新規に第2のメッセージパスを追加するとき、前記プロセッサが、当該第2のメッセージパスが追加されることについて前記複数のノード間で認識合わせを行う
ことを特徴とする請求項2に記載のフォールトトレラントシステム。
【請求項4】
追加しようとする前記第2のメッセージパスが前記第2のタスクに対する2番目のメッセージパスである場合、
前記プロセッサは、前記第1のメッセージパス上で何番目のメッセージまでをディスパッチした後に前記第2のメッセージパスを追加するかについて、前記複数のノード間で合意形成し、当該合意形成が得られるまでは前記第1のメッセージパス上のメッセージの送信を一時的に保留する
ことを特徴とする請求項3に記載のフォールトトレラントシステム。
【請求項5】
追加しようとする前記第2のメッセージパスが前記第2のタスクに対する2番目のメッセージパスである場合に、
前記リーダノードのプロセッサは、各ノードにおいて前記第1のメッセージパス上でディスパッチ済みのメッセージの通番の最大値を判別し、前記第1のメッセージパス上で前記最大値の通番のメッセージがディスパッチされた後に前記第2のメッセージパスを追加することを前記複数のノード間で合意形成する
ことを特徴とする請求項4に記載のフォールトトレラントシステム。
【請求項6】
各前記ノードのプロセッサは、前記第2のメッセージパスとして前記第2のタスクに対する2番目のメッセージパスを追加しようとするときに、当該第2のメッセージパスの追加に関するメッセージパス情報を他のノードにブロードキャストし、
前記メッセージパス情報には、当該ノードにおいて前記第1のメッセージパス上でディスパッチ済みのメッセージの通番が示され、
前記メッセージパス情報を受信した前記他のノードのプロセッサは、前記第1のメッセージパス上で何番目のメッセージまでをディスパッチした後に前記第2のメッセージパスを追加するかについて前記複数のノード間で合意形成することに先行して、当該メッセージパス情報に示される通番の最大値まで自ノードにおける前記第1のメッセージパス上のメッセージをディスパッチする
ことを特徴とする請求項4に記載のフォールトトレラントシステム。
【請求項7】
前記フォロワノードのプロセッサは、前記第2のメッセージパスとして前記第2のタスクに対する2番目のメッセージパスを追加しようとするとき、当該第2のメッセージパスの追加に関するメッセージパス情報を他のノードにブロードキャストし、
前記リーダノードが全てのノードから前記第2のメッセージパスの追加に関するメッセージパス情報を受信していく途中において、前記リーダノードが何れかのノードから受信したメッセージパス情報に示される前記第1のメッセージパス上でディスパッチ済みのメッセージの通番の最大値が、前記リーダノードにおいて前記第1のメッセージパス上でディスパッチ済みのメッセージの通番の最大値を超えた時点で、当該メッセージパス情報に示される通番の最大値まで自ノードにおける前記第1のメッセージパス上のメッセージをディスパッチすることについてノード間で合意形成する
ことを特徴とする請求項4に記載のフォールトトレラントシステム。
【請求項8】
多重化された複数のノードが通信ネットワークを介して接続されるフォールトトレラントシステムによるデータ処理方法であって、
前記複数のノードは、それぞれプロセッサ、メモリ、及び記憶領域を有し、
各前記ノードにおいて前記プロセッサが前記記憶領域からプログラムを前記メモリに読み出して実行することによって動作するアプリケーションは、入力に対して決定論的に出力を生成する1以上のタスクから構成され、
前記複数のノードのうちの1つがリーダノードとなり、リーダノード以外のノードがフォロワノードとなり、前記リーダノードと前記フォロワノードは、それぞれ同一のタスクを実行するように構成され、
各前記タスクは、自タスクの状態を示すローカルステートに1対1で紐付けられ、
前記タスクの入力は、システム外部または他のタスクから受信したメッセージ、及び当該タスクに紐付けられた前記ローカルステートへのアクセスを含み、
前記タスクの出力は、当該タスクがシステム外部または他のタスクに送信するメッセージ、及び当該タスクに紐付けられた前記ローカルステートの更新を含み、
前記タスクが複数のメッセージ送信元を持つ送信先タスクにメッセージを送信するとき、前記複数のノードのプロセッサは、前記送信先タスクに対するメッセージの配送順について前記複数のノード間で合意形成し、合意形成された配送順に従って前記メッセージを送信する
ことを特徴とするデータ処理方法。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、フォールトトレラントシステムの技術を適用する多重系処理システムに関する。
【背景技術】
【0002】
多重化された計算機(ノード)間で同じ処理を実施し、その何れかの計算機上で障害が発生しても無停止で業務を継続可能とする計算機システムとして、フォールトトレラントシステムが知られている。
【0003】
フォールトトレラントシステムを実現するアプローチの1つとして、ステートマシンレプリケーションが知られている。ステートマシンレプリケーションでは、同一のステートを持つ各複製ノードに対して同一の入力を与え、その入力とステートを用いて決定論的に処理を行う。結果として各ノードは同一の出力をして、同一のステートに更新される。これにより、一部のノードに障害が発生したとしても、残りのノードで不整合が生じることなく、業務を継続することができる。
【0004】
ここで、複数のタスクを並列実行するよう構成されたアプリケーションの場合、全体としての振る舞いをノード間で一致化させるには、共有ステートへのアクセス順を一致化させればよい。
【0005】
例えば特許文献1に開示されたデータ処理方法では、リーダノードが、共有データへアクセスを行う都度、そのアクセス順をフォロワノードに伝達し、一方でフォロワノードは、共有データにアクセスを行う都度、リーダノードからのアクセス順の指示を待ち、その順に従って処理する。これにより、特許文献1のデータ処理方法は、複製ノード間の振る舞いを一致化している。
【先行技術文献】
【特許文献】
【0006】
【発明の概要】
【発明が解決しようとする課題】
【0007】
しかし、上述した特許文献1では、タスク間の共有データへのアクセスの順序を、アクセスの都度、ノード間で一致化することによって決定性を保証している。すなわち、特許文献1のデータ処理方法においては、タスク間で共有されるデータへのアクセス要求が発生する都度、リーダノードとフォロワノード間で通信が発生するため、ワークロードによっては同期のための負荷が増大するおそれがあった。
【0008】
本発明は以上の点を考慮してなされたもので、同期による負荷を抑制しながらノード間の振る舞いを一致化できる、低遅延でスケーラブルなフォールトトレラントシステム及びデータ処理方法を提供しようとするものである。
【課題を解決するための手段】
【0009】
かかる課題を解決するため本発明においては、多重化された複数のノードが通信ネットワークを介して接続されるフォールトトレラントシステムであって、前記複数のノードは、それぞれプロセッサ、メモリ、及び記憶領域を有し、各前記ノードにおいて前記プロセッサが前記記憶領域からプログラムを前記メモリに読み出して実行することによって動作するアプリケーションは、入力に対して決定論的に出力を生成する1以上のタスクから構成され、前記複数のノードのうちの1つがリーダノードとなり、リーダノード以外のノードがフォロワノードとなり、前記リーダノードと前記フォロワノードは、それぞれ同一のタスクを実行するように構成され、各前記タスクは、自タスクの状態を示すローカルステートに1対1で紐付けられ、前記タスクの入力は、システム外部または他のタスクから受信したメッセージ、及び当該タスクに紐付けられた前記ローカルステートへのアクセスを含み、前記タスクの出力は、当該タスクがシステム外部または他のタスクに送信するメッセージ、及び当該タスクに紐付けられた前記ローカルステートの更新を含み、前記タスクが複数のメッセージ送信元を持つ送信先タスクにメッセージを送信するとき、前記複数のノードのプロセッサは、前記送信先タスクに対するメッセージの配送順について前記複数のノード間で合意形成し、合意形成された配送順に従って前記メッセージを送信することを特徴とするフォールトトレラントシステムが提供される。
【0010】
また、かかる課題を解決するため本発明においては、多重化された複数のノードが通信ネットワークを介して接続されるフォールトトレラントシステムによるデータ処理方法であって、前記複数のノードは、それぞれプロセッサ、メモリ、及び記憶領域を有し、各前記ノードにおいて前記プロセッサが前記記憶領域からプログラムを前記メモリに読み出して実行することによって動作するアプリケーションは、入力に対して決定論的に出力を生成する1以上のタスクから構成され、前記複数のノードのうちの1つがリーダノードとなり、リーダノード以外のノードがフォロワノードとなり、前記リーダノードと前記フォロワノードは、それぞれ同一のタスクを実行するように構成され、各前記タスクは、自タスクの状態を示すローカルステートに1対1で紐付けられ、前記タスクの入力は、システム外部または他のタスクから受信したメッセージ、及び当該タスクに紐付けられた前記ローカルステートへのアクセスを含み、前記タスクの出力は、当該タスクがシステム外部または他のタスクに送信するメッセージ、及び当該タスクに紐付けられた前記ローカルステートの更新を含み、前記タスクが複数のメッセージ送信元を持つ送信先タスクにメッセージを送信するとき、前記複数のノードのプロセッサは、前記送信先タスクに対するメッセージの配送順について前記複数のノード間で合意形成し、合意形成された配送順に従って前記メッセージを送信することを特徴とするデータ処理方法が提供される。
【発明の効果】
【0011】
本発明によれば、同期による負荷を抑制しながらノード間の振る舞いを一致化できる、低遅延でスケーラブルなフォールトトレラントシステム及びデータ処理方法を提供することができる。
【図面の簡単な説明】
【0012】
【
図1】本発明の一実施形態に係るフォールトトレラントシステム(FTシステム)1の構成例を示すブロック図である。
【
図2】FTシステム1におけるイベント発生時の全体的な処理の特徴を示すイメージ図である。
【
図3】ノード間の相関関係を説明するイメージ図である。
【
図4】メッセージの特徴を説明するための図である。
【
図5】タスク20の動作例を示すイメージ図である。
【
図6】メッセージパス管理テーブル35の一例を示す図である。
【
図7】ノード間におけるイベントログの合意形成の特徴を説明するための図である。
【
図8】イベントログの合意形成におけるリーダの処理手順の一例を示すフローチャートである。
【
図9】イベントログの合意形成におけるフォロワの処理手順の一例を示すフローチャートである。
【
図10】リーダの入力処理部31による受信処理の処理手順例を示すフローチャートである。
【
図11】イベントログ34に保持される外部入力タイプのログエントリのデータ構成例を示す図である。
【
図12】メッセージ要求受付処理の処理手順例を示すフローチャートである。
【
図13】メッセージ配送タイプのログエントリの具体例を示す図である。
【
図14】メッセージパスを追加するときのノード間の関係を説明するためのモデル図である。
【
図15】メッセージパス追加処理の処理手順例を示すフローチャートである。
【
図16】メッセージパス追加タイプのログエントリの一例を示す図である。
【
図17】メッセージパス追加タイプのログエントリの別例を示す図である。
【
図18】メッセージパス情報の一例を示す図である。
【
図19】メッセージパス情報受信処理の処理手順例を示すフローチャートである。
【
図20】メッセージパス管理テーブル35の具体例を示す図である。
【
図21】メッセージパス情報タイプのログエントリの一例を示す図である。
【
図22】第2の改善方法によるメッセージパス追加の処理手順例を示すシーケンス図である。
【
図23】第2の改善方法によるメッセージパス追加処理の処理手順例を示すフローチャートである。
【
図24】第2の改善方法によるメッセージパス情報受信処理の処理手順例を示すフローチャートである。
【
図25】外部出力の順序保証を説明するイメージ図である。
【
図26】複数のノードからの外部出力を調整して出力する構成を説明するイメージ図である。
【発明を実施するための形態】
【0013】
以下、図面を参照して、本発明の実施形態を詳述する。
【0014】
なお、以下の記載及び図面は、本発明を説明するための例示であって、説明の明確化のため、適宜、省略及び簡略化がなされている。また、実施形態の中で説明されている特徴の組み合わせの全てが発明の解決手段に必須であるとは限らない。本発明が実施形態に制限されることは無く、本発明の思想に合致するあらゆる応用例が本発明の技術的範囲に含まれる。本発明は、当業者であれば本発明の範囲内で様々な追加や変更等を行うことができる。本発明は、他の種々の形態でも実施する事が可能である。特に限定しない限り、各構成要素は複数でも単数でも構わない。
【0015】
以下の説明では、「テーブル」、「表」、「リスト」、「キュー」等の表現にて各種情報を説明することがあるが、各種情報は、これら以外のデータ構造で表現されていてもよい。データ構造に依存しないことを示すために「XXテーブル」、「XXリスト」等を「XX情報」と呼ぶことがある。各情報の内容を説明する際に、「識別情報」、「識別子」、「名」、「ID」、「番号」等の表現を用いるが、これらについてはお互いに置換が可能である。
【0016】
また、以下の説明では、同種の要素を区別しないで説明する場合には、参照符号又は参照符号における共通番号を使用し、同種の要素を区別して説明する場合は、その要素の参照符号を使用又は参照符号に代えてその要素に割り振られたIDを使用することがある。
【0017】
また、以下の説明では、プログラムを実行して行う処理を説明する場合があるが、プログラムは、少なくとも1以上のプロセッサ(例えばCPU)によって実行されることで、定められた処理を、適宜に記憶資源(例えばメモリ)及び/又はインターフェースデバイス(例えば通信ポート)等を用いながら行うため、処理の主体がプロセッサとされてもよい。同様に、プログラムを実行して行う処理の主体が、プロセッサを有するコントローラ、装置、システム、計算機、ノード、ストレージシステム、ストレージ装置、サーバ、管理計算機、クライアント、又は、ホストであってもよい。プログラムを実行して行う処理の主体(例えばプロセッサ)は、処理の一部又は全部を行うハードウェア回路を含んでもよい。例えば、プログラムを実行して行う処理の主体は、暗号化及び復号化、又は圧縮及び伸張を実行するハードウェア回路を含んでもよい。プロセッサは、プログラムに従って動作することによって、所定の機能を実現する機能部として動作する。プロセッサを含む装置及びシステムは、これらの機能部を含む装置及びシステムである。
【0018】
プログラムは、プログラムソースから計算機のような装置にインストールされてもよい。プログラムソースは、例えば、プログラム配布サーバ又は計算機が読み取り可能な記憶メディアであってもよい。プログラムソースがプログラム配布サーバの場合、プログラム配布サーバはプロセッサ(例えばCPU)と記憶資源を含み、記憶資源はさらに配布プログラムと配布対象であるプログラムとを記憶してよい。そして、プログラム配布サーバのプロセッサが配布プログラムを実行することで、プログラム配布サーバのプロセッサは配布対象のプログラムを他の計算機に配布してよい。また、以下の説明において、2以上のプログラムが1つのプログラムとして実現されてもよいし、1つのプログラムが2以上のプログラムとして実現されてもよい。
【0019】
(1)構成
図1は、本発明の一実施形態に係るフォールトトレラントシステム(FTシステム)1の構成例を示すブロック図である。
図1に示すように、FTシステム1は、通信ネットワーク2を介して接続される複数の計算機(ノード10)から構成される計算機システムである。
【0020】
本実施形態に係るFTシステム1は、いわゆるリーダ-フォロワ型分散システムであって、複数のノード10のうちの1台がリーダノード(リーダとも呼ぶ)となり、リーダノード以外のノードがフォロワノード(フォロワとも呼ぶ)となる。具体的には例えば、分散合意アルゴリズムのRAFTにおけるリーダ及びフォロワを想定する。FTシステム1では、複数のノード10上に複製されたイベント駆動型のアプリケーションに対して同じ入力が与えられ、同じ出力を得る。イベント駆動型のアプリケーションは、独立動作可能な複数の処理モジュールであるタスク20から構成される。すなわち、FTシステム1は、イベントの発生時に、リーダノードとフォロワノードとで、それぞれ同一のタスク20が実行されるように構成される。
【0021】
なお、FTシステム1が正常に稼働している間は、リーダのノード10とフォロワのノード10が入れ替わることはないが、例えばリーダのノード10に何らかの障害が発生した可能性があるときは、当該ノード10はFTシステム1から切り離され、フォロワのノード10のうちの1台が新たにリーダとなってFTシステム1は処理を継続する。このような構成により、スケーラブルなFTシステム1が実現される。
【0022】
また、FTシステム1は、通信ネットワーク2を介して1台以上の端末3と接続され、端末3とデータの送受信を行う。通信ネットワーク2は、例えばLAN(Local Area Network)であるが、これに限定されない。端末3は、ユーザが使用する計算機であって、例えば、クライアントとしてFTシステム1にイベントを送信したり、イベントの処理結果をFTシステム1から受信したりする。なお、後述する
図2に示すように、FTシステム1ではリーダノードがイベントを最初に受け取る。
【0023】
ノード10は、CPU(Central Processing Unit)等のプロセッサ、メモリ、記憶装置(記憶領域)、及び通信インタフェース等を備えた計算機である。記憶装置には、ノード10で実行されるイベント処理基盤30及びタスク20等の各種プログラム及びデータが記憶される。そして、プロセッサが、記憶装置からこれらの各種プログラムを読み出してメモリに展開し、実行する。
【0024】
タスク20は、1以上のノード10の複数のタスク群でアプリケーションを構成する、独立動作可能なイベント駆動型の処理モジュール(プログラム)である。タスク20は、具体的には例えば、マイクロサービスや、FaaS(Function as a Service)上のFunctionや、OS(Operating System)上のプロセス等である。
【0025】
本実施形態において、アプリケーションのステートは、タスク20ごとに独立してステート(ローカルステート)21によって管理される。ステート21は、排他的にアクセスされる。各タスク20は、自タスクの状態を示すステート21と1対1で紐付けられ、他のタスク20と疎結合に連係動作する。すなわち、各タスク20は、直接的な共有のアプリデータを持たず、他のタスク20が管理するアプリデータ(ステート21)にアクセスする際には、処理を要求する一方向性のメッセージ(以後は、単にメッセージと記載する)によって排他的に実施される。そして、各タスク20は決定論的に振る舞うように構成される。すなわち、入力と現在のステートが決定すれば、出力と処理後のステートの組み合わせが一意に定まる。
【0026】
イベント処理基盤30は、イベントを処理するオペレーションシステムである。イベント処理基盤30は、マルチタスク処理が可能で、複数のタスク20を並列に実行することができる。イベント処理基盤30は、入力処理部31、メッセージ処理部32、出力処理部33、イベントログ34、メッセージパス管理テーブル35、及びメッセージ待機キュー36を有する。
【0027】
入力処理部31は、発生したイベントを外部(端末3)あるいはリーダノードから受け付け、イベント発生順に当該イベントを処理する適切なタスクを呼び出す。
【0028】
メッセージ処理部32は、タスク20からのメッセージ要求を受け付け、対象のタスク20へのメッセージを実施する。このとき、メッセージ処理部32は、システム全体の決定性保証に必要なメッセージパス管理テーブル35の管理やノード間同期処理を行う。
【0029】
出力処理部33は、必要に応じて各ノード10の処理結果の調停を行い、最終的にそれを外部に送信する。処理結果の調停は、例えば、多数決により選ばれた結果を送信する方法、または、先着優先で送信する方法等を採用することができる。
【0030】
イベントログ34は、ノード10間で合意形成する(または合意形成した)情報を管理するデータ構造である。具体的には例えば、分散合意アルゴリズムのRAFTにおけるログを想定する。イベントログ34は、ログエントリの集合によって構成される。ログエントリは、合意形成する情報の単位であり、最初にリーダがログに追記し、それをフォロワに複製する。リーダが過半数のフォロワからログエントリの複製完了の報告を受けたとき、古いログエントリから順に、ログエントリがコミットされる。そしてリーダは、ログエントリをどこまでコミットしたかをフォロワに通知する。各ノード10は、コミット済みのログエントリを、古いものから順に適用する。どのように適用するかは、ログエントリのタイプによって異なる。
【0031】
メッセージパス管理テーブル35は、メッセージパスを管理するデータである。メッセージパスは、メッセージの送信元とメッセージの送信先とを結ぶ経路である。詳細は後述するが、メッセージパス管理テーブル35は、自ノードを含む各ノードから受信するメッセージパス情報に基づいて登録される。
【0032】
メッセージ待機キュー36は、メッセージパスごとに用意される。メッセージ要求が発生した場合に、メッセージ要求はメッセージ待機キュー36に順にキューイングされる。メッセージ待機キュー36がブロック状態ではない場合、所定のタイミングでメッセージ待機キュー36の先頭からメッセージ要求がデキューされ、メッセージ送信先に送信される。
【0033】
(2)イベント処理の概要
図2は、FTシステム1におけるイベント発生時の全体的な処理の特徴を示すイメージ図である。
図2に示した外部入力38は、イベントの外部入力またはフォロワノード10B,10Cへの転送、及び外部入力されたイベントに関するノード間の合意形成を行う。外部入力38は、具体的には
図1に示した入力処理部31に相当する。外部出力39は、ノード10における処理結果をリーダノード10Aまたは外部に出力する。外部出力39は、具体的には
図1に示した出力処理部33に相当する。
【0034】
図2に示すように、本実施形態に係るFTシステム1では、リーダノード10Aの外部入力38が最初にイベントを受け取り、受け取ったイベントをフォロワノード10B,10Cの外部入力38に転送し、ノード間で合意形成を行う。そして各ノード10A,10B,10Cは、受け取ったイベントに対して、リーダノード10Aが決定した順に、適切なタスク20を呼び出して処理を行う。
【0035】
図2において各タスク20は受信メッセージに対し逐次的、かつ決定論的に処理を行う。例えばタスクAがメッセージMa1、Ma2を順に受信した場合、まずメッセージMa1を処理し、その結果としてメッセージMb1をタスクBに送信し、次にメッセージMa2を処理し、その結果としてメッセージMb2をタスクBに送信する。このとき、タスクBは単一のメッセージ送信元しか持たないため、どのノードにおいてもメッセージMb1、Mb2の順に逐次的、かつ決定論的に処理する。このように、FTシステム1において、単一パスのメッセージ配送については、同期を取ることなく決定性が維持される。
【0036】
また、
図2においてタスクDからタスクBに破線で示したように、1のタスクから別の1のタスクに対して初回にメッセージパスが追加されるときは、当該メッセージがあったことについて、ノード間で合意形成する。これにより、パスに複数のメッセージ送信元が生じた場合、以降はメッセージ処理順の合意形成を行うようにする。
【0037】
また、
図2においてタスクB,またはDからのメッセージ受信によりタスクCが動作するといったように、複数パスからのメッセージ配送がある場合については、メッセージ処理順をノード間で合意形成する。これにより、複数パスを持つタスク(例えばタスクC)の振る舞いがノード間で一致する。
【0038】
そして、各ノード10A,10B,10Cでタスク20の処理が行われた後は、外部出力39が、必要に応じて多数決等の調停を行い、処理結果を外部(端末3)に出力する。
【0039】
(3)タスク動作の決定性保証
図3は、ノード間の相関関係を説明するイメージ図である。
図3では、図面の左半分にリーダノード(リーダ)10Aを示し、図面の右半分に1つのフォロワノード(フォロワ)10Bを示し、それらの相関関係を表している。なお、詳細は後述するが、外部出力は様々な方法を採用できることから、出力処理部33は、リーダ10A,フォロワ10Bの区別を付けずに図示している。
図3に示すように、ノード間では、外部入力、メッセージパス追加、及びメッセージ配送順(タスクの呼び出し順)の3種類の合意形成が行われる。
【0040】
図4は、メッセージ配送の特徴を説明するための図である。
図4に示すように、タスク間及び外部入出力とタスク間は、メッセージ101によって情報交換及び連係動作をする。なお、本実施形態で扱うメッセージは一方向性であり、例えばタスクAからタスクBに向けたメッセージに対する応答は、タスクBからタスクAへのメッセージとみなして扱う。
【0041】
1つのメッセージパス上に流れるメッセージは、そのパス上で順序が入れ替わることはない。それぞれのメッセージ101には、メッセージパスごとに、送信順を示す通番が付与される。本説明では、同一のメッセージパス内でのメッセージの通番(メッセージ通番)を、送信順に#1,#2,・・・と表記する。メッセージ通番は、メッセージパス管理テーブル35で管理される。
【0042】
例えば
図4に示すように、タスクBからタスクCに向かうメッセージパスにおいて、タスクBから#1、#2の順にメッセージが送信された場合、タスクCは#1、#2の順にメッセージを受信する。一方、タスクBから外部出力に向かうメッセージ「B→外 #2」とタスクBからタスクCに向かうメッセージ「B→C #1」のように、送信元が同じで送信先が異なるメッセージパス上のメッセージでは、どちらのメッセージが先に送信先に届くかはその送信順に関係しない。
【0043】
また、前述したように、タスク20は、メッセージ101の受信を契機に動作するイベント駆動型タスクである。各タスク20は決定論的に振る舞うものとし、入力に対して一意の処理結果を出力する。ここで、タスク20への入力は、外部入力38や他のタスク20から受信したメッセージ101の内容または自身のローカルステート21の内容である。また、タスク20からの出力は、他のタスク20や外部出力39に送信するメッセージ101または自身のローカルステート21への更新内容である。各タスク20は、同時に1つのメッセージ101を処理する。複数のメッセージ101を受信した場合には、逐次的に1つずつメッセージ101を処理する。ローカルステート21は、タスク20単位で独立しており、他のタスク20から直接アクセスされない。あるタスク20が他のタスク20のローカルステート21にアクセスしたい場合には、当該他のタスク20にアクセス要求を依頼するメッセージ101を発行することで実現される。
【0044】
図5は、タスク20の動作例を示すイメージ図である。
図5(A)はメッセージ送信元が複数である場合の構成例を示しており、
図5(B)はメッセージ送信元が単一である場合の構成例を示している。
図5を参照しながら、本実施形態において各ノード10によるアプリケーション(具体的にはタスク動作)の決定性が保証される原理について説明する。
【0045】
図5(A)において、タスクCは、タスクA,Bからのメッセージ101A,101Bの内容と、ローカルステート21Cの内容をもとに処理を行い、ローカルステート21Cを更新し、処理結果を外部出力39に出力する。このとき、ノード10間でメッセージ配送順(処理順)について合意形成を行わないと、タスクAからのメッセージ101Aを先に処理した場合と、タスクBからのメッセージ101Bを先に処理した場合とで、タスクCの出力内容や最終的なローカルステート21Cに差異が生じることがある。具体的には、例えばタスクAからのメッセージ101Aを先に処理する場合、タスクCはメッセージ101AによってタスクCのローカルステート21Cを更新し、その更新後のローカルステート21Cの内容を、タスクBからのメッセージ101Bの処理において入力として利用するためである。
【0046】
上記のような問題を解消してシステム全体として処理結果の決定性を保証する(言い換えれば、ノード10間で同じ処理結果を得る)ために、本実施形態では、タスク単体が決定論的に振る舞うことに加えて、複数のメッセージ送信元を持つタスク20について、どの順番でメッセージをディスパッチするかをノード10間で合意を形成する。合意形成の詳細は後述する。
【0047】
一方、
図5(B)のタスクCのように、単一のメッセージ送信元(タスクA)しか持たない場合には、前述した通り、タスクCにおいてメッセージ101Aがどの処理順でディスパッチされるかは一意に決定される。具体的には、タスクCにおいてメッセージ101Aは#3,#4の処理順でディスパッチされる。したがって、単一のメッセージ送信元しか持たない単一パスの場合には、
図5(A)の場合のような合意形成は不要である。
【0048】
図6は、メッセージパス管理テーブル35の一例を示す図である。
図6に示したメッセージパス管理テーブル110は、
図1に示したメッセージパス管理テーブル35の一例であって、メッセージパスごとに、当該メッセージパスにおいてディスパッチ済みのメッセージ通番を管理する。メッセージパス管理テーブル110は、メッセージパス111、状態112,及びディスパッチ済みメッセージ通番113の項目を有して構成される。
【0049】
メッセージパス111は、当該レコードで管理するメッセージパスの送信元及び送信先を示す。
【0050】
状態112は、各メッセージパスについて、「ブロック状態」か否かの状態を示す。具体的には例えば、当該レコードのメッセージパスが「ブロック状態」とされている場合に、状態112に「ブロック」が設定される。詳細はメッセージ処理部による処理の説明で後述するが、あるメッセージ配送先タスクについて1番目のメッセージパスが存在するときに新たに2番目のメッセージパスが追加されるとき、2番目のメッセージパスに関する合意形成が完了するまで、1番目のメッセージパスは「ブロック状態」とされ、1番目のメッセージパス上のメッセージのディスパッチが保留される。この1番目のメッセージパスのブロック状態は、2番目のメッセージパスの追加に関する「メッセージパス追加」のログエントリについて合意形成が完了し、このログエントリが適用されるタイミングで、解除される。
【0051】
ディスパッチ済みメッセージ通番113は、当該レコードのメッセージパスにおいて、何番目のメッセージまでがディスパッチ済みであるかをメッセージ通番で示す。メッセージ通番は、メッセージパスごとにカウントされ、そのメッセージパス上でメッセージが発生するごとに1ずつカウントアップされて、その値が当該メッセージに付与される。この結果、メッセージパスとメッセージ通番は、各メッセージを一意に識別するために用いることができる。
【0052】
なお、メッセージパス管理テーブル110にメッセージ送信先とメッセージ送信元のペアが存在しない場合、新規メッセージパスとして扱い、メッセージパス管理テーブル110に新たなレコードを追加登録する。メッセージパス管理テーブル110への新規メッセージパスの追加は、新規メッセージパス追加に伴う合意形成後に行われる。すなわち、合意形成中に当該新規メッセージパスへのメッセージが再び発生した場合も、新規メッセージパスとして扱われる。
【0053】
また、メッセージパス管理テーブル110への登録は、FTシステム1の実運用時に、メッセージが発生するごとに各メッセージパスを新規に登録することが想定されるが、変形例として、事前にある程度のメッセージパスを登録しておくようにしてもよい。すなわち、システムのテスト時に構築したメッセージパス管理テーブルの内容をファイル出力し、実運用時にはファイル出力した内容をメッセージパス管理テーブル110にロードしておくことで、ある程度のメッセージパスが構築された状態で実運用を開始するようにしてもよい。このようにすることで、実運用時のメッセージパスの登録処理に掛かる負荷を低減することができる。
【0054】
(4)合意形成処理
以下では、本実施形態に係るFTシステム1におけるノード10間の合意形成について説明する。
【0055】
FTシステム1において、ノード10間で各種の合意形成をするにあたり、イベントログ34(あるいは単にログ)が、その合意形成の過程や結果を管理する。合意形成プロトコルとしてはRAFTが知られており、本実施形態に係るFTシステム1は、基本的な点ではRAFTを用いて、ノード10間の合意形成を行う。但し、説明の簡略のため、本実施形態の説明では、RAFTを単純化して表現しており、例えばRAFTのリーダ再選出プロトコル等は記載を省略する。RAFTにおけるログエントリの適用は、ログエントリの内容をステートマシンに反映させることを意味する。そして本実施形態におけるログエントリの適用は、ログエントリのタイプによって処理内容が異なる。
【0056】
本実施形態で取扱うログエントリのタイプは、「外部入力」、「メッセージ配送」、「メッセージパス追加」の3種類に大別することができる。
【0057】
「外部入力」のログエントリは、リーダが受信した外部からのイベントをフォロワに対して複製し、各ノードで同じ順にディスパッチすることを保証する、ことを目的とする。「外部入力」のログエントリを適用するときの具体的な動作としては、メッセージ処理部32が、外部入力イベントの内容に応じて、これを処理する適切なタスクに、イベント内容をディスパッチする。外部入力のログエントリのデータ構成例は、
図11に示される。
【0058】
「メッセージ配送」のログエントリは、複数のメッセージ送信元を持つケースにおいて、どの順番でメッセージをディスパッチするかをノード間で一致化する、ことを目的とする。このようなログエントリの適用により、各メッセージは、メッセージパスとメッセージ通番の組合せによって一意に識別される。「メッセージ配送」のログエントリを適用するときの具体的な動作としては、メッセージ処理部32が当該メッセージをディスパッチする。メッセージ配送のログエントリの具体例は、
図13に示される。
【0059】
「メッセージパス追加」のログエントリは、どのようなメッセージパスが存在するかをノード間で認識合わせをする、ことを目的とする。特に、1番目のメッセージパスが存在するときに新たに2番目のメッセージパスが追加されるときには、1番目のメッセージパスにおいて何番のメッセージ通番までディスパッチした後に2番目のメッセージパスを追加するか、についても併せてノード間で認識合わせする。「メッセージパス追加」のログエントリを適用するときの具体的な動作としては、メッセージ処理部32が、メッセージパス管理テーブル35(
図5のメッセージパス管理テーブル110)に当該メッセージパスを追加する。さらに、1番目のメッセージパスの追加である場合、メッセージ処理部32は、当該メッセージパスのメッセージ待機キュー36上のメッセージを順にディスパッチする。また、2番目のメッセージパスの追加である場合、メッセージ処理部32は、1番目のメッセージパスのメッセージ待機キュー36上のメッセージを、合意したメッセージ通番まで順にディスパッチした後で、1番目のメッセージパスの「ブロック状態」を解除した上で、2番目のメッセージパスをメッセージパス管理テーブル35(
図5のメッセージパス管理テーブル110)に追加する。メッセージ追加パスのログエントリの具体例は、
図17,
図18に示される。
【0060】
図7は、ノード間におけるイベントログの合意形成の特徴を説明するための図である。
図7には、異なるノード10(リーダ、フォロワ1、フォロワ2)におけるログエントリの進行例が示されている。
【0061】
上記した3種類のログエントリに共通して、本実施形態におけるノード間のイベントログ34の合意形成は、
図7の場合、以下のように行われる。
【0062】
図7において、フォロワ1は#5までログエントリの追記が完了しており、フォロワ2は#6までログエントリの追記が完了している。このとき、リーダがフォロワ1,2からそれぞれの追記完了の通知を受信している場合、リーダは、自ノードを含む過半数のノードにおいて#6まで追記が完了していることから、リーダは#6までログエントリをコミットし、どこまでコミット済みかをフォロワ1,2に通知する。そして各ノードは、コミット済み、かつ未適用のログエントリがあれば、順に適用する。
【0063】
このようなイベントログ34の合意形成の詳細な処理手順について、
図8及び
図9を参照しながら説明する。
【0064】
図8は、イベントログの合意形成におけるリーダの処理手順の一例を示すフローチャートである。
図9は、イベントログの合意形成におけるフォロワの処理手順の一例を示すフローチャートである。なお、
図8及び
図9に示す処理は、ログエントリが「外部入力」タイプの場合は入力処理部31によって実行され、「メッセージ配送」タイプや「メッセージパス追加」タイプの場合はメッセージ処理部32によって実行されるが、以下の説明では簡略化して、メッセージ処理部32が実行するものとして記載する。
【0065】
図8によればまず、リーダのメッセージ処理部32が、ログエントリをログ(イベントログ34)に追記する(ステップS11)。次に、リーダのメッセージ処理部32は、フォロワに、ログエントリの追記を要求する(ステップS12)。
【0066】
ここで、
図9に示すように、フォロワのメッセージ処理部32は、
図8のステップS12の要求を受け取ると(ステップS21)、当該ログエントリをメッセージパス上の送信順にログ(イベントログ34)に追記する(ステップS22)。そして、ログエントリの追記成功をリーダに通知する(ステップS23)。
【0067】
次に
図8では、リーダのメッセージ処理部32が、FTシステム1を構成する複数のフォロワのうちの過半数のフォロワから、ステップS23の追記成功の通知を受け取ったか否かを判定する(ステップS13)。ステップS13では、自身を含めて過半数のノードが追記成功したかどうかを判定する。そして、過半数のフォロワから追記成功の通知を受け取った場合は(ステップS13のYES)、ステップS14に進む。一方、過半数のフォロワから追記成功の通知を受け取っていない場合(ステップS13のNO)、リーダは
図8の処理を終了し、過半数のフォロワから追記成功の通知を受け取るまで待機する。
【0068】
ステップS14では、リーダのメッセージ処理部32は、ステップS13で過半数の通知があったログエントリを追記順が古いほうから順にコミットする。次に、リーダのメッセージ処理部32は、フォロワに対して、どのログエントリまで(どのログエントリ通番まで)コミットしたかを通知する(ステップS15)。そして最後に、リーダのメッセージ処理部32は、コミット済みかつ未適用のログエントリを古いものから順に適用し(ステップS16)、合意形成の処理を終了する。
【0069】
一方、フォロワでは、ステップS23でログエントリの追記成功をリーダに通知した後、メッセージ処理部32が、リーダからステップS15のコミット通知を受信したか否かを判定する(ステップS24)。コミット通知を受信した場合は(ステップS24のYES)、コミット済みかつ未適用のログエントリを古いものから順に適用し(ステップS25)、合意形成の処理を終了する。また、コミット通知を受信していない場合は(ステップS24のNO)、特段の処理を行わずに処理を終了する。
【0070】
以上の
図8及び
図9の処理は、説明を簡便にするために、逐次的に処理が行われるフローチャートであったが、本実施形態はこれに限定されるものではなく、例えば、他のノードからの各種メッセージを待機する処理を挟む等、合意形成の処理を非同期に実施するようにしてもよい。また、以降の説明において「ログエントリのイベントログへの追記」が示される場合には、そのバックグラウンドにおいて
図8及び
図9に示した合意形成処理が動作するものとする(個々の説明を省略する)。
【0071】
(5)入力処理部31
以下では、入力処理部31による処理について詳しく説明する。より具体的には、外部入力されたイベントに対する入力処理部31の受信処理について説明する。
【0072】
図10は、リーダの入力処理部31による受信処理の処理手順例を示すフローチャートである。
図10に示す処理は、リーダの入力処理部31によって例えば定期的に実行される。
【0073】
図10に示すように、リーダの入力処理部31は、外部入力イベントを受信したか否かを判定する(ステップS31)。外部入力イベントを受信していない場合(ステップS31のNO)、入力処理部31は次の周期でステップS31の処理を繰り返す。外部入力イベントを受信した場合(ステップS31のYES)、入力処理部31は、受信した外部入力イベントのログエントリをログ(イベントログ34)に追記する(ステップS32)。
【0074】
図11は、イベントログ34に保持される外部入力タイプのログエントリのデータ構成例を示す図である。
図11に示したように、外部入力タイプのログエントリ120は、タイプ121及び外部入力122を有して構成される。タイプ121には、ログエントリの種類が示され、外部入力122には、外部入力の内容が示される。すなわち、外部入力タイプのログエントリは、外部から受信したイベントがそのまま、イベントログ34に保持される。
【0075】
ステップS32において入力処理部31が外部入力イベントのログエントリをイベントログ34に追記することで、
図8及び
図9を参照しながら説明した通り、合意形成処理が動作し、結果として、当該外部入力イベントの内容がリーダからフォロワに転送される。したがって、フォロワは、
図10のような外部入力イベントを直接受信する処理を持たない。
【0076】
以上のような受信処理を行うことにより、入力処理部31は、どのノード10でも同じイベントを同じ順番でディスパッチすることを保証する。
【0077】
その後、入力処理部31は、外部入力イベントの内容に応じて、それを処理する適切なタスク20に対してメッセージを行うことにより、当該イベントを処理させる。具体的には、入力処理部31は、メッセージ処理部22に対してタスク20の動作を要求するメッセージ要求を送信し、このメッセージ要求を受信したメッセージ処理部22が、後述する
図12のメッセージ要求受付処理を行うことにより、タスク20にメッセージを送信する。
【0078】
なお、後述するように、タスク間のメッセージにおいては、当該メッセージのディスパッチ順をノード間で一致させるための合意形成(メッセージ配送順の合意形成)が行われるが、外部入力イベントについてのメッセージは、当該メッセージを行う時点でノード間におけるディスパッチ順が一致していることから、メッセージ配送順の合意形成の対象外である。
【0079】
(6)メッセージ処理部32
以下では、メッセージ処理部32による各種の処理について詳しく説明する。
【0080】
(6-1)メッセージ要求受付処理
図12は、メッセージ要求受付処理の処理手順例を示すフローチャートである。
図12に示すメッセージ要求受付処理は、メッセージ処理部22がタスク20からのメッセージ要求を受理したときに実行される。
【0081】
図12によればまず、メッセージ処理部22は、受理したメッセージ要求が新規のメッセージパス上のメッセージ配送を要求するものであるか否かを判定する(ステップS41)。具体的には、メッセージ処理部22は、メッセージ要求が示すメッセージ送信先とメッセージ送信元との組み合わせがメッセージパス管理テーブル110に登録されているかを確認し、メッセージパス管理テーブル110にメッセージ送信先とメッセージ送信元のペアが存在しない場合に新規メッセージパスと判定することができる。
【0082】
ステップS41において新規のメッセージパスである場合(ステップS41のYES)、メッセージ処理部22は、新規のメッセージパスを追加するメッセージパス追加処理を行う(ステップS42)。詳細は
図15等を参照しながら後述するが、ステップS42のメッセージパス追加処理では、「メッセージパス追加」タイプのログエントリがログ(イベントログ34)に追記される。このとき、前述した通り、ログエントリのログへの追記に伴って、
図8及び
図9に示した合意形成処理が動作する。そしてステップS42の処理後、メッセージ処理部22は、受理したメッセージ要求をメッセージ待機キュー36に追加し(ステップS43)、処理を終了する。
【0083】
ステップS41において新規のメッセージパスではない場合(ステップS41のNO)、メッセージ処理部22は、受理したメッセージ要求によるメッセージが、複数のメッセージ送信元を持つタスク20に対するメッセージであるか否かを判定する(ステップS44)。
【0084】
ステップS44において複数のメッセージ送信元を持つタスク20に対するメッセージであった場合(ステップS44のYES)、メッセージ処理部22は、「メッセージ配送」タイプのログエントリをログ(イベントログ34)に追記する(ステップS45)。その後は、ノード間で合意形成するまでメッセージを実行できないため、前述したステップS43に進み、受理したメッセージ要求をメッセージ待機キュー36に追加して処理を終了する。
【0085】
ステップS44において複数のメッセージ送信元を持たない(すなわち単一パスで繋がれた)タスク20に対するメッセージであった場合(ステップS44のNO)、メッセージ処理部22は、当該メッセージパスがブロック状態とされているか否かを確認する(ステップS46)。当該メッセージパスがブロック状態である場合(ステップS46のYES)、ノード間で合意形成するまでメッセージを実行できないため、前述したステップS43に進み、受理したメッセージ要求をメッセージ待機キュー36に追加して処理を終了する。一方、当該メッセージパスがブロック状態ではない場合には(ステップS46のNO)、合意形成は不要であることから、メッセージ処理部22は、受理したメッセージ要求による当該メッセージを実行し(ステップS47)、処理を終了する。
【0086】
以上のように
図12に示すメッセージ要求受付処理によれば、新規のメッセージパスによるメッセージの場合、及び複数のメッセージ送信元を持つタスクへのメッセージの場合には、ノード間で合意形成するまでは当該メッセージを実行しないため、メッセージ待機キュー36にメッセージ要求を一時保留させる。また、既存の単一メッセージパスに対する要求については、当該メッセージパスがブロック状態でない限りは、合意形成することなしにメッセージを実行することができる。また、送信先のタスクに対する2番目のメッセージパスの追加中(ノード間で合意形成中)は、1番目のメッセージパスによるメッセージはブロックされる。
【0087】
図13は、メッセージ配送タイプのログエントリの具体例を示す図である。
図13に示したように、メッセージ配送タイプのログエントリ130は、タイプ131及びメッセージ132を有して構成される。タイプ131には、当該ログエントリが有する情報のタイプとして、メッセージパスとメッセージ通番が示される。そしてメッセージ132には、タイプ131に示された各タイプの情報の内容が示される。
【0088】
複数のメッセージ送信元を持つメッセージ送信先へのメッセージについては、
図13に示したログエントリ130のような「メッセージ配送」タイプのログエントリをログ(イベントログ34)に追記し、どの順番でメッセージをディスパッチするかをノード間で合意形成する。具体的には、
図13に示したログエントリ130が適用される場合、タスクAからタスクCへのメッセージパス「A→C」上のメッセージ通番「3」のメッセージが、タスクCに対してディスパッチされる。
【0089】
(6-2)メッセージパス追加処理
以下では、新規のメッセージパスが追加されるときの処理について詳しく説明する。
【0090】
前述したように、FTシステム1では、複数のメッセージ送信元を持つメッセージ送信先へのメッセージについては、ノード10間においてメッセージのディスパッチ順の一致化が必要となる。しかし、複数のメッセージ送信元が存在するか否かは、事前に容易に把握できないことがある。そこで、本実施形態では、イベント発生に基づくタスク20の実行時に、新規のメッセージパスを追加できるようにする。そしてこのときに不整合が起きないよう、各ノード10が同じ状態(ディスパッチするメッセージ通番を揃えた状態)で新規のメッセージパスを追加するように合意形成する。
【0091】
図14は、メッセージパスを追加するときのノード間の関係を説明するためのモデル図である。
図14を参照しながら、新規のメッセージパスを追加するときの合意形成の必要性について、より具体的に説明する。
【0092】
図14には、既存のメッセージパス「A→B」が存在する状況で、新規のメッセージパス「D→B」を追加するというケースが例示されている。なお、
図14において着色済みのメッセージ101は、ディスパッチ済みのメッセージを表している。具体的には、
図14の場合、ノード1(リーダ)は#5までディスパッチ済みであり、ノード2(フォロワ1)は#6までディスパッチ済みである。
【0093】
図14において、新規のメッセージパス「D→B」を追加するまでは、タスクBをメッセージ送信先とするメッセージパスは「A→B」の単一のメッセージパスしか存在しないため、「A→B」上のメッセージについてノード間の同期が行われない。したがって、「D→B」のメッセージパスを追加しようとした時点で、何番までメッセージをディスパッチ済みかはノード間で一致しないことがある。
【0094】
図14のケースを用いて具体的に説明すると、仮に、ノード間で合意形成を行わずに、各ノードが各自のタイミングで新規のメッセージパス「D→B」を追加してメッセージのディスパッチを行うとした場合、ノード1では、「A→B」上の#5のメッセージがディスパッチされた後に、新規のメッセージパス「D→B」が追加され、「D→B」上の#1のメッセージがディスパッチされ、その後に「A→B」上の#6,#7のメッセージが順にディスパッチされることになる。このとき、ノード1(リーダ)のイベントログ34には、「A→B #5」、「D→B 追加」、「D→B #1」、「A→B #6」、「A→B #7」の順でログエントリが記録される。新規のメッセージパスの追加とその直前のメッセージ(上記の1番目と2番目)は、不可分な1つのログエントリとして記録されてもよい。
【0095】
一方、ノード2では、新規のメッセージパス「D→B」が追加される前に、「A→B」上の#6のメッセージがディスパッチ済みであることから、「A→B」上の#6のメッセージがディスパッチされた後に、「D→B」上の#1のメッセージがディスパッチされ、その後に「A→B」上の#7のメッセージがディスパッチされることになる。このとき、ノード2(フォロワ)のイベントログ34には、「A→B #6」、「D→B 追加」、「D→B #1」、「A→B #7」の順でログエントリが記録される。ノード1の場合と同様、新規のメッセージパスの追加とその直前のメッセージ(上記の1番目と2番目)は、不可分な1つのログエントリとして記録されてもよい。
【0096】
上記したノード1及びノード2の処理結果を比較すると、イベントログ34には異なるログエントリが記録され、ノード1とノード2との間では同期を維持できなくなることが分かる。
【0097】
そこで、本実施形態では、「D→B」のメッセージパスを追加した後、「A→B」上のメッセージと「D→B」上のメッセージについて、どのような順にディスパッチするか、ノード間で一致化させる必要がある。すなわち、「A→Bのメッセージパス上のメッセージをX番までディスパッチしたところで、D→Bのメッセージパスを追加する」ということを、ノード間で合意形成する必要がある。
【0098】
具体的には、まず、RAFTには規定されていない本実施形態固有のプロトコルとして、各ノードは、新規のメッセージパスを追加した場合に、
図14の右側に示したように、そのメッセージパス追加に関するメッセージパス情報102を他のノードにブロードキャストする。例えば、
図14に示された(ノード1,A→B,5)というメッセージパス情報102は、「ノード1」において、「A→B」のメッセージパス上で「#5」のメッセージがディスパッチ済みとなったタイミングで、新たなメッセージパスが追加されたことを表している。次に、リーダが、各ノードからブロードキャストされたメッセージパス情報102に基づいて、各ノードにおいて既存のメッセージパス「A→B」上でディスパッチ済みのメッセージ通番の最大値(例えば#6)を判別する。そして、以上の処理を踏まえて、各ノードが、「「A→B」上のディスパッチ済みのメッセージ通番の最大値(#6)の後に、「D→B」のメッセージパスを追加すること」をノード間で合意形成することにより、全てのノードで同期をとることができる。
【0099】
以下に、上記の合意形成の契機となる、メッセージパスを追加する処理(メッセージパス追加処理)について詳しく説明する。
【0100】
図15は、メッセージパス追加処理の処理手順例を示すフローチャートである。
図15に示すメッセージパス追加処理は、
図12のステップS42に相当する処理であって、メッセージ送信要求の受理によって新規のメッセージパスの追加が必要となる場合に、各ノード10のメッセージ処理部22によって実行される。
【0101】
図15によればまず、メッセージ処理部22は、新規に追加するメッセージパス(以後、新規メッセージパス)が、メッセージ送信先にとって2番目のパスであるか否かを判定する(ステップS51)。
【0102】
ステップS51において新規メッセージパスが2番目のメッセージパスである場合(ステップS51のYES)、メッセージ処理部22は、1番目のメッセージパスをブロック状態に設定する(ステップS52)。次いで、メッセージ処理部22は、既存のメッセージパスのメッセージパス情報(
図14及び
図18を参照)を、他ノードにブロードキャストし(ステップS53)、メッセージパス追加処理を終了する。
【0103】
なお、ステップS53のブロードキャストを受信した各ノードでは、後述する
図19のメッセージパス情報受信処理が行われることにより、受信したメッセージパス情報がメッセージパス管理テーブル35に登録され、リーダノードが、ノード間で一致化させるディスパッチ順を決定する。
【0104】
ステップS51において新規メッセージパスが2番目のメッセージパスではない、すなわち、1番目または3番目以降のメッセージパスである場合(ステップS51のNO)、メッセージ処理部22は、自ノードがリーダであるか否かを確認する(ステップS54)。自ノードがリーダである場合(ステップS54のYES)、メッセージ処理部22は、「メッセージパス追加」タイプのログエントリをログ(イベントログ34)に追記し(ステップS55)、メッセージパス追加処理を終了する。自ノードがフォロワである場合(ステップS54のNO)、メッセージ処理部22は、特段の処理を行うことなくメッセージパス追加処理を終了する。
【0105】
図16は、メッセージパス追加タイプのログエントリの一例を示す図である。
図16に示したログエントリ140は、新規メッセージパスが1番目または3番目以降のメッセージパスである場合に、
図15のステップS55でログ(イベントログ34)に追記されるログエントリの一例である。
【0106】
ログエントリ140は、新規メッセージパスの追加を単位として管理されるデータであって、既存のメッセージパスを示す既存メッセージパス141と、新規メッセージパスを示す追加メッセージパス142と、新規メッセージパスの追加時に既存のメッセージパス上でディスパッチ済みのメッセージの通番を示すディスパッチ済み通番143とを有する。
【0107】
図16のログエントリ140の場合は、新規メッセージパスがメッセージ送信先にとって2番目のメッセージパスではないため、既存メッセージパスのメッセージパス情報をブロードキャストする処理(
図15のステップS53)は行われない。さらに、
図15のステップS53を受けて各ノードで実行される
図19のメッセージパス情報追加処理も実行されないので、ディスパッチ通番を参照する必要もない(
図19のステップS64が行われない)。したがって、
図16のログエントリ140では、既存メッセージパス141及びディスパッチ済み通番143に値を指定しなくてよく、追加メッセージパス142に、新規メッセージパスがタスクAからタスクBに向けたメッセージパスであることを示す「A→B」が指定される。
【0108】
図17は、メッセージパス追加タイプのログエントリの別例を示す図である。
図17に示したログエントリ150は、新規メッセージパスが1番目または3番目以降のメッセージパスである場合に、後述する
図19のステップS64でログ(イベントログ34)に追記されるログエントリの一例である。
【0109】
ログエントリ150は、
図16のログエントリ140と同様に、新規メッセージパスの追加を単位として管理されるデータであって、既存のメッセージパスを示す既存メッセージパス151と、新規メッセージパスを示す追加メッセージパス152と、新規メッセージパスの追加時に既存のメッセージパス上でディスパッチ済みのメッセージの通番を示すディスパッチ済み通番153とを有する。
【0110】
具体的には、
図17のログエントリ150を適用した場合には、既存の「A→B」のメッセージパス上でメッセージ通番「5」番までをディスパッチした後、「D→B」のメッセージパスがメッセージパス管理テーブル35に追加される。
【0111】
図18は、メッセージパス情報の一例を示す図である。メッセージパス情報は、あるメッセージ送信先に対する2番目のメッセージパスが追加される際に、1番目のメッセージパス上でどこまでメッセージがディスパッチされたかをノード間で共有するためのデータである。また、メッセージパス情報は、どのタイミングでメッセージパスの追加を行うか、リーダが判断するためのヒントとして用いられる。
【0112】
図18に示すメッセージパス情報160は、ノードID161、既存メッセージパス162、追加メッセージパス163、及びディスパッチ済み通番164を有する。ノードID161は、当該メッセージパス情報160の送信元のノード10の識別子を示す。既存メッセージパス162は、既存の1番目のメッセージパスの送信元及び送信先を示す。追加メッセージパス163は、追加しようとしているメッセージパス(すなわち、既存メッセージパスと同じメッセージ送信先を持つ2番目のメッセージパス)の送信元及び送信先を示す。ディスパッチ済み通番164は、既存メッセージパス162に示される1番目のメッセージパスにおいてディスパッチ済みのメッセージ通番の最大値を示す。
【0113】
図19は、メッセージパス情報受信処理の処理手順例を示すフローチャートである。
図19に示すメッセージパス情報受信処理は、
図15のステップS53で既存のメッセージパスのメッセージパス情報がブロードキャストされたときに、このメッセージパス情報を受信した各ノード10においてメッセージ処理部22が実行する処理である。すなわち、メッセージパス情報受信処理は、新規メッセージパスがメッセージ送信先にとって2番目のパスである場合に実行される。
【0114】
図19によればまず、メッセージ処理部22は、受信したメッセージパス情報をメッセージパス管理テーブル35に登録する(ステップS61)。メッセージパス管理テーブル35の具体例は、後述する
図20に示される。
【0115】
次に、メッセージ処理部22は、自ノードがリーダであるか否かを確認する(ステップS62)。自ノードがリーダである場合は(ステップS62のYES)、ステップS63に進み、自ノードがリーダではない、すなわちフォロワである場合は(ステップS62のNO)、メッセージパス情報受信処理を終了する。
【0116】
ステップS63では、リーダのメッセージ処理部22は、他の全ノードから、当該新規メッセージパスの追加に関するメッセージパス情報を受信済みであるか否かを判定する。他の全ノードから上記メッセージパス情報を受信済みである場合(ステップS63のYES)、ステップS64に進み、他の全ノードからの上記メッセージパス情報が揃っていない場合は(ステップS63のNO)、メッセージパス情報受信処理を終了する。
【0117】
ステップS64では、リーダのメッセージ処理部22は、自ノードを含むの全てのノードからのメッセージパス情報に基づいて、既存のメッセージパス上のディスパッチ済みのメッセージ通番の最大値を判別する。そして、判別した最大値のメッセージ通番をディスパッチ済み通番とした「メッセージパス追加」タイプのログエントリをログ(イベントログ34)に追記し、メッセージパス情報受信処理を終了する。
【0118】
図20は、メッセージパス管理テーブル35の具体例を示す図である。
図20に示したメッセージパス管理テーブル170は、メッセージパス171及びディスパッチ済みメッセージ通番172を有する。メッセージパス171は、既存のメッセージパスの送信元及び送信先を示し、ディスパッチ済みメッセージ通番172は、既存メッセージパス上のディスパッチ済みのメッセージ通番を示す。
【0119】
ここで、
図20のメッセージパス管理テーブル170は、「A→B」のメッセージパス171におけるディスパッチ済みメッセージ通番172が「5,8」となっている。これは例えば、他ノードからのメッセージパス情報の受信(
図19のステップS61)において、メッセージパス「A→B」上のディスパッチ済み通番が「5」であることを示すメッセージパス情報(例えば
図18に示したノードID「2」からのメッセージパス情報160)とは別に、メッセージパス「A→B」上のディスパッチ済み通番が「8」であることを示すメッセージパス情報を受信したことを意味する。このようなメッセージパス管理テーブル170がリーダノード10Aのメッセージパス管理テーブル35である場合、
図19のステップS64において、リーダのメッセージ処理部22は、メッセージパス「A→B」上のディスパッチ済みのメッセージ通番の最大値が「8」であると判別する。したがって、ステップS64においてリーダのメッセージ処理部22は、既存メッセージパス151を「A→B」、追加メッセージパス152を「D→B」、ディスパッチ済み通番153を「8」とした「メッセージパス追加」タイプのログエントリを、ログ(イベントログ34)に追記することになる。
【0120】
以上に説明した
図15のメッセージパス追加処理及び
図19のメッセージパス情報受信処理は、以下のような特徴を備える。
【0121】
メッセージ送信先のタスク等にとって新規メッセージパスが2番目のメッセージパスである場合に、メッセージパス情報受信処理において「メッセージパス追加」タイプのログエントリがログに追記される(
図19のステップS64)ことに伴って、ノード間でメッセージパス追加の合意形成が行われる。このとき、新規メッセージパスの追加に関する合意形成が完了するまで、当該メッセージ送信先へのメッセージのディスパッチが保留される(
図15のステップS52)。
【0122】
また、メッセージパス追加の合意形成が完了し、当該ログエントリがコミット及び適用されることで、当該メッセージパスがメッセージパス管理テーブル35に追加される(
図15のステップS55,
図19のステップS61)。
【0123】
新規メッセージパスが1番目のメッセージパスである場合、メッセージパス管理テーブル35に当該メッセージパスが追加されるまで、1番目のメッセージパス上のメッセージのディスパッチを保留する。
【0124】
新規メッセージパスが3番目以降のメッセージパスである場合、当該新規メッセージパスの追加以降に発生するメッセージ送信先へのメッセージについては、当該新規メッセージパスの追加に相当する「メッセージパス追加」タイプのログエントリの後に、ログに追記されることから、結果として、新規メッセージパスの追加が完了するまでディスパッチが保留されることになる。
【0125】
(6-3)メッセージパス追加時のメッセージ待機時間の改善
前述した通り、2番目のメッセージパスを追記する際には、「メッセージパス追加」タイプのログエントリについてノード間の合意形成が完了し、メッセージパス管理テーブルに当該メッセージパスが追加されるまで、1番目のメッセージパス上のメッセージは、一時的にディスパッチが保留される。このとき、FTシステム1では、ディスパッチが保留されている時間(メッセージ待機時間)だけ、処理が停滞する。
【0126】
このような処理の停滞を抑制するために、例えば、システムテストの段階でメッセージパス管理テーブル35の内容をある程度構築してその内容を退避させ、実運用時に当該内容を復元することが考えられる。この方法によれば、動的なメッセージパスの追加の発生頻度をある程度抑制することができるが、さらなる抑制ができるとより好ましい。
【0127】
そこで、本実施形態では、メッセージ待機時間をさらに改善する方法として、例えば以下の2つの改善方法を採用することができる。
【0128】
(6-3-1)第1の改善方法
第1の改善方法は、ノードが、2番目のメッセージパスの追加に関するメッセージパス情報を他ノードから受信した時点で、メッセージパス管理テーブル35へのメッセージパス情報の追記(
図19のステップS61)に先行して、当該メッセージパス情報に記載されたディスパッチ済みメッセージ通番の最大値まで、1番目のメッセージパス上のメッセージをディスパッチするものである。
【0129】
第1の改善方法は、ノードの増減が殆どない状況に適しており、最大限、ディスパッチの保留による遅延を抑制することができる。
【0130】
但し、第1の改善方法は、ノードの増減頻度が高い状況では、次のようなリスクを有する。メッセージパス情報でディスパッチ済みメッセージ通番の最大値Mを報告したノードが、当該メッセージパス情報をリーダに伝える前に障害停止した場合、リーダはN<MとなるNをディスパッチ済みメッセージ通番として、「メッセージパス追加」タイプのログエントリをログに追記する。このとき既にMまでディスパッチ済みのノードが存在した場合、そのノードはリーダから指示された通りにログエントリを適用することができず、クラスタから除外する必要がある。したがって、ノードの増減頻度が高いほど、FTシステム1におけるノード10の多重系を維持できなくなるリスクが上昇する。
【0131】
(6-3-2)第2の改善方法
第2の改善方法は、メッセージパス追加の合意形成において、上述した方法のようにリーダが全てのノードから2番目のメッセージパスの追加に関するメッセージパス情報を受信してからノード間で合意形成するのではなく、リーダが全てのノードから2番目のメッセージパスの追加に関するメッセージパス情報を受信していく途中で、メッセージ済み通番の最大値が更新された場合に都度、RAFTなどの合意形成プロトコルに基づきノード間でメッセージパス追加の合意形成を行い、合意形成できた段階までメッセージをディスパッチするものである。以下に、第2の改善方法を実現するための構成及び処理について詳しく説明する。
【0132】
第2の改善方法を採用する場合、FTシステム1は、新たな種類のログエントリとして、「メッセージパス情報」タイプのログエントリを導入する。
【0133】
「メッセージパス情報」のログエントリは、あるメッセージ送信先に2本目のメッセージパスを追加する際に、既存のメッセージパス上のディスパッチ済みメッセージ通番について、「少なくともN番までディスパッチした後に新規メッセージパスを追加する」ことについてノード間で合意をとる、ことを目的とする。合意形成は過半数のノードからの応答があれば可能であるため、このような「メッセージパス情報」のログエントリを利用することにより、リーダが全てのフォロワからメッセージパス情報を受信する前に、先行的に、N番までのメッセージ要求をディスパッチすることができる。「メッセージパス情報」のログエントリを適用するときの具体的な動作としては、「ブロック状態」が設定された既存のメッセージパス上で滞留しているメッセージ要求について、当該「メッセージパス情報」のログエントリに示されるディスパッチ済みメッセージ通番に対応するメッセージ要求までを、順にディスパッチする。
【0134】
図21は、メッセージパス情報タイプのログエントリの一例を示す図である。
図21に示したように、メッセージパス情報タイプのログエントリ180は、タイプ181及びメッセージパス情報182を有して構成される。タイプ181には、当該ログエントリが有する情報のタイプとして、ノードID、既存メッセージパス、追加メッセージパス、及びディスパッチ済み通番が示される。そしてメッセージパス情報182には、タイプ181に示された各タイプの情報の内容が示される。
【0135】
図22は、第2の改善方法によるメッセージパス追加の処理手順例を示すシーケンス図である。
図22では、説明のために簡略化したノード構成として、1つのリーダ(ノードID=1)と2つのフォロワ(ノードID=2,3)とが示されている。また、後述する各ステップの処理は、対応するノードのメッセージ処理部32が実行する。
【0136】
図22において、ログエントリ191,193は、ステップS71,S73でログ(イベントログ34)に追記される「メッセージパス情報」タイプのログエントリの一例であり、ログエントリ195は、ステップS75でログ(イベントログ34)に追記される「メッセージパス追加」タイプのログエントリの一例である。また、メッセージパス情報192,194は、ステップS72,S74でブロードキャストされるメッセージパス情報の一例である。メッセージパス情報192,194は、RAFTには規定されていない本実施形態固有のプロトコルによって、あるノードから他ノードにブロードキャストされる通知である。
【0137】
図22によればまず、リーダノードであるノード1が、自ノードの「メッセージパス情報」のログエントリ191をログに追記する(ステップS71)。このログへの追記の結果、RAFTプロトコルに従って、当該ログの複製がフォロワノード(ノード2,3)にブロードキャストされる。そして各ノードは、ログエントリ191のコミットを完了し次第、これを適用する。この結果、各ノードは、具体的には、メッセージ通番「5」まで、メッセージパス「A→B」上でブロックされていたメッセージ要求をディスパッチする。
【0138】
その後、フォロワノードであるノード3から、メッセージ通番「6」をディスパッチ済みとするメッセージパス情報192がブロードキャストされたとする(ステップS72)。
【0139】
この場合、メッセージパス情報192を受信したノード1は、メッセージパス情報192におけるメッセージパス「A→B」上のディスパッチ済みメッセージ通番が「6」となっており、ステップS71でログに追記したログエントリ191に示されるディスパッチ済みメッセージ通番の「5」よりも大きいことから、メッセージパス情報192の内容を示す「メッセージパス情報」タイプのログエントリ193をログに追記する(ステップS73)。この追記により、「メッセージパス情報」タイプのログエントリにおけるディスパッチ済みメッセージ通番が「6」に更新される。そして、ステップS71におけるログへの追記と同様、ノード1は、RAFTプロトコルに従って、当該ログの複製をフォロワノード(ノード2,3)にブロードキャストし、各ノードはコミットが完了し次第、これを適用する。
【0140】
またその後、フォロワノードであるノード2から、メッセージ通番「4」をディスパッチ済みとするメッセージパス情報194がブロードキャストされたとする(ステップS74)。この場合、メッセージパス情報194を受信したノード1は、メッセージパス情報194におけるメッセージパス「A→B」上のディスパッチ済みメッセージ通番が「4」であり、これまでのディスパッチ済みメッセージ通番の最大値である「6」よりも小さいので、特段の処理を行わない。
【0141】
そして、リーダノードであるノード1は、全てのノードからのメッセージパス情報を受信すると、最終的にログに追記された「メッセージパス情報」タイプのログエントリに基づいて、「メッセージパス追加」タイプのログエントリを生成し、これをログ(イベントログ34)に追記する(ステップS75)。具体的には、メッセージパス「A→B」上のディスパッチ済みメッセージ通番を「6」とし、追加メッセージパスを「D→B」とする「メッセージパス追加」タイプのログエントリ195をログに追記する。なお、このログ追記以降の適用処理等は、
図12で説明した処理と同様である。
【0142】
上記のように、第2の改善方法では、メッセージパスを追加する際に「メッセージパス情報」のログエントリを利用して合意形成を行うため、
図15に示したメッセージパス追加処理と、
図19に示したメッセージパス情報受信処理の処理手順が、以下のように一部変更される。
【0143】
図23は、第2の改善方法によるメッセージパス追加処理の処理手順例を示すフローチャートである。
図23のフローチャートについて、
図15に示したメッセージパス追加処理との相違点を中心に説明し、共通する処理の説明は省略する。
【0144】
図23によれば、ステップS52において1番目のメッセージパスをブロック状態に設定した後、メッセージ処理部22が、自ノードがリーダであるか否かを確認する(ステップS81)。そして、自ノードがリーダである場合に(ステップS81のYES)、メッセージ処理部22は、自ノードの「メッセージパス情報」のログエントリをログに追記する(ステップS82)。このステップS82の処理は、RAFTプロトコルにおけるログ追記によって実現され、
図22のステップS71で説明したように、ログへの追記の結果、RAFTプロトコルに従って、当該ログの複製がフォロワにブロードキャストされる。一方、自ノードがリーダではない、すなわちフォロワであった場合は(ステップS81のNO)、
図22のステップS72,S74で説明したように、メッセージ処理部22が、RAFTプロトコルから独立した本実施形態固有のメッセージ送信によって、既存のメッセージパスのメッセージパス情報を他ノードにブロードキャストする(ステップS53)。
【0145】
図24は、第2の改善方法によるメッセージパス情報受信処理の処理手順例を示すフローチャートである。
図24のフローチャートについて、
図19に示したメッセージパス情報受信処理との相違点を中心に説明し、共通する処理の説明は省略する。
【0146】
図24によれば、メッセージパス情報を受信したノードのメッセージ処理部22が当該メッセージパス情報をメッセージパス管理テーブル35に登録し(ステップS61)、当該ノードがリーダノードであった場合に(ステップS62のYES)、新規メッセージパスの追加に関するメッセージパス情報を他の全てのノードから受信済みであるか否かを判定する(ステップS63)。
【0147】
そして、ステップS63においてリーダが新規メッセージパスの追加に関するメッセージパス情報を他の全てのノードから受信済みでない場合に(ステップS63のNO)、リーダのメッセージ処理部22は、ステップS61におけるメッセージパス情報のメッセージパス管理テーブル35への登録によってディスパッチ済みメッセージ通番の最大値が更新されたか否かを確認する(ステップS91)。
【0148】
ステップS91においてディスパッチ済みメッセージ通番の最大値が更新されていた場合(ステップS91のYES)、リーダのメッセージ処理部22は、ステップS61で受信したメッセージパス情報に基づいて、「メッセージパス情報」タイプのログエントリをログに追記し(ステップS92)、メッセージパス情報受信処理を終了する。ステップS92の処理は、
図22のステップS71の処理に相当する。すなわち、リーダのメッセージ処理部22は、既存のメッセージパス上のディスパッチ済みメッセージ通番について、現時点で他ノードから受信したメッセージパス情報のなかで自ノード分も含めた「最大値」が更新された場合に、すべてのノードからメッセージパス情報を受信する前の途中でも、「メッセージパス情報」タイプのログエントリをログに追記する。
【0149】
一方、ステップS91においてディスパッチ済みメッセージ通番の最大値が更新されていなかった場合(ステップS91のNO)、リーダのメッセージ処理部22は特段の処理を行わずにメッセージパス情報受信処理を終了する。この処理手順は、
図22のステップS74においてフォロワ(ノード2)からメッセージパス情報194がブロードキャストされた場合に、このメッセージパス情報194を受け取ったリーダ(ノード1)が特段の処理を行わないことに対応している。
【0150】
以上の説明をまとめると、メッセージパス追加時の第2の改善方法は、(6-2)で説明したメッセージパス追加処理の方法と比べたときに、次のような特徴を有する。
【0151】
第2の改善方法における(6-2)のメッセージパス追加処理との相違点として、まず、「メッセージパス情報」タイプのログエントリが導入される。そして、リーダノードは、メッセージパス情報をフォロワノードにブロードキャストする代わりに、「メッセージパス情報」タイプのログエントリをログに追記する。その結果、RAFTプロトコルに従って、当該ログの複製がフォロワノードにブロードキャストされる。
【0152】
また、リーダノードがフォロワノードからメッセージパス情報を受信したとき、既存メッセージパスにおけるディスパッチ済みメッセージ通番の最大値が更新される場合には、リーダノードは、受信した上記メッセージパスに対応する「メッセージパス情報」タイプのログエントリをログに追記する。
【0153】
また、「メッセージパス情報」タイプのログエントリがコミットされ、このコミットを受けて各ノードが当該ログエントリの内容を適用する際には、当該ログエントリ(メッセージパス情報)に示されるディスパッチ済みメッセージ通番まで、既存メッセージパス上でブロックされているメッセージ要求がディスパッチされる。
【0154】
一方、第2の改善方法における(6-2)のメッセージパス追加処理との共通点としては、例えば、フォロワはメッセージパス情報を他のノードにブロードキャストすることが挙げられる。このような構成とする理由は、メッセージパス追加処理の最中にリーダが障害等によって停止し、新しくリーダとなったフォロワが当該メッセージパス追加処理を継続して実施する際には、各フォロワからブロードキャストされた情報が必要になるためである。また、リーダは、全てのノードからメッセージパス情報を受信したとき、「メッセージパス追加」タイプのログエントリをログに追記する。さらに、この「メッセージパス追加」タイプのログエントリを適用する際の処理も、(6-2)のメッセージパス追加処理と共通である。
【0155】
第2の改善方法は、上記のような特徴を備えることにより、リーダが全てのノードからメッセージパス情報を受信し終わる前に、ブロックされているメッセージ要求の一部を、安全にディスパッチすることができる。ここでの「安全」とは、処理途中で障害等によって一部のノードが離脱しても、
図14を参照しながら説明したような、ノード間で同期を維持できなくなる状況には陥らない、ことを意味する。第2の改善方法は、FTシステム1において、他のノードに比べてメッセージパス情報の通知が遅いノードが存在し、かつ、ノードの離脱が起こりやすい構成である場合に、特に有効である。
【0156】
(7)出力処理部33
以下では、出力処理部33による処理について詳しく説明する。
【0157】
出力処理部33は、各タスク20の処理結果として外部出力要求を受け取り、所定のポリシーに従って外部出力する内容を決定し、決定した内容を外部(クライアント等の端末3)に送信する。
【0158】
これまで述べてきたように、本実施形態において各ノード10のタスク群は、決定論的に振る舞うことが保証される。したがって、あるタスク20に着目したとき、基本的にどのノード10からも同じ内容の外部出力要求が、同じ順で送信される。
【0159】
一方、異なるタスク20からの外部出力要求については、その要求順序はノード間で一致する補償はなく、実際に外部出力する順序も決定論的に決まらない(
図25(A)参照)。しかし、一般的にはこれらの外部出力内容は互いに独立しており、外部出力の順序はシステムとしての結果に影響を与えないと想定される。もし、異なるタスク20からの外部出力要求についてその順序性が重要である場合は、それぞれの外部出力内容を中継する共通のタスク(
図25(B)のタスクC)を置くことにより、出力順をノード間で一致化させることが可能である(
図25(B)参照)。
【0160】
図25は、外部出力の順序保証を説明するイメージ図である。
図25(A),(B)では何れも、異なるタスク20A,20B(タスクA,B)からの外部出力要求が外部出力39に送信される。外部出力39は出力処理部33と読み替えることができる。
【0161】
図25(A)の構成では、タスクAから外部出力39に対して「A→外 #2」,「A→外 #3」の外部出力要求のメッセージ101Aが送信され、タスクBから外部出力39に対して「B→外 #4」の外部出力要求のメッセージ101Bが送信される。ここで、同一のタスクAからの外部出力要求については、「A→外 #2」の後に「A→外 #3」が外部出力されることは保証される。一方、異なるタスクA,Bからの外部出力要求については、「A→外 #2」と「B→外 #4」の何れが先に外部出力されるかの保証はなく、外部出力39(出力処理部33)に到着する順序もノード間で異なる場合がある。
【0162】
図25(B)の構成は、
図25(A)の構成に、それぞれの外部出力内容を集約して中継する共通のタスクCを置いたものである。前述した通り、異なるタスクA,Bからの外部出力要求をタスクCが受け取ることにより、タスクCから外部出力39(出力処理部33)への外部出力の出力順をノード間で一致化させることができる。
【0163】
なお、出力処理部33が外部出力する内容を決定する際に従う「所定のポリシー」は、例えば、先着優先のポリシーや多数決のポリシーが考えられる。
【0164】
先着優先のポリシーでは、各複製ノード(各ノード10)から届いた外部出力要求のうち、最初に届いたものを外部出力し、残りは破棄する。多数決のポリシーでは、各複製ノード(各ノード10)から届いた同一と考えられる外部出力要求に対して多数決を実施し、確からしい内容を選択して外部出力し、残りは破棄する。
【0165】
また、本実施形態のFTシステム1では、ノード10における処理結果を外部装置(例えば端末3)に出力するために、専用の外部出力装置を備えるようにしてもよいが、以下の
図26に示すように構成することで、専用の外部出力装置がなくても各ノード10の外部出力を調整して外部装置に出力することができる。
【0166】
図26は、複数のノードからの外部出力を調整して出力する構成を説明するイメージ図である。
図26において、各ノードのタスクAは、外部出力要求を送信する際に、各ノードの外部出力39(出力処理部33)にブロードキャストする。そして、外部出力39(出力処理部33)は、各ノードのタスクAから受信した外部出力要求の内容を比較し、例えば多数決によって、正しいと判定されるものを外部装置(端末3)に送信する。
図26の場合は拡大図に示したように、ノード1及びノード2からの外部出力要求の内容が「α」であり、多数派となることから、「α」が外部出力される。
【0167】
また、
図26において、外部出力と39と外部装置(端末3)との間の通信に、冪等なメッセージングプロトコルを用いるようにすれば、重複送信されたメッセージは外部装置側で破棄することができる。例えばセッション単位で送信メッセージに通番を付与し、受信側で通番順に1つずつ取り込むようにする。こうすることで、外部送信の前にノードが障害停止した場合であっても、外部装置は滞りなく処理結果を受信することができる。
【符号の説明】
【0168】
1 フォールトトレラント(FT)システム
2 通信ネットワーク
3 端末
10 ノード
10A リーダノード(リーダ)
10B,10C フォロワノード(フォロワ)
20 タスク
21 ステート(ローカルステート)
30 イベント処理基盤
31 入力処理部
32 メッセージ処理部
33 出力処理部
34 イベントログ
35 メッセージパス管理テーブル
36 メッセージ待機キュー
38 外部入力
39 外部出力