IP Force 特許公報掲載プロジェクト 2022.1.31 β版

知財求人 - 知財ポータルサイト「IP Force」

▶ 横河電機株式会社の特許一覧

特開2024-52311プライマリマシン及びフォールトトレラントシステム
<>
  • 特開-プライマリマシン及びフォールトトレラントシステム 図1
  • 特開-プライマリマシン及びフォールトトレラントシステム 図2
  • 特開-プライマリマシン及びフォールトトレラントシステム 図3
  • 特開-プライマリマシン及びフォールトトレラントシステム 図4
< >
(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公開特許公報(A)
(11)【公開番号】P2024052311
(43)【公開日】2024-04-11
(54)【発明の名称】プライマリマシン及びフォールトトレラントシステム
(51)【国際特許分類】
   G06F 11/20 20060101AFI20240404BHJP
   G06F 9/455 20180101ALI20240404BHJP
【FI】
G06F11/20 623
G06F9/455 150
【審査請求】有
【請求項の数】7
【出願形態】OL
(21)【出願番号】P 2022158954
(22)【出願日】2022-09-30
(71)【出願人】
【識別番号】000006507
【氏名又は名称】横河電機株式会社
(74)【代理人】
【識別番号】100147485
【弁理士】
【氏名又は名称】杉村 憲司
(74)【代理人】
【識別番号】230118913
【弁護士】
【氏名又は名称】杉村 光嗣
(74)【代理人】
【識別番号】100169823
【弁理士】
【氏名又は名称】吉澤 雄郎
(74)【代理人】
【識別番号】100195534
【弁理士】
【氏名又は名称】内海 一成
(72)【発明者】
【氏名】吉田 善貴
(72)【発明者】
【氏名】戸井永 剛
【テーマコード(参考)】
5B034
【Fターム(参考)】
5B034BB02
(57)【要約】
【課題】障害の種類によって制御の切り替えが判断されるプライマリマシン及びフォールトトレラントシステムを提供する。
【解決手段】プライマリマシン100は、命令と命令の実行結果とに基づく同期情報を生成して出力する同期情報生成部124と、命令の実行時に発生した障害情報がハードウェア障害又はソフトウェア障害のどちらに関する情報であるか判定する障害選択部128とを有するプライマリVM120を備える。プライマリVM120は、障害情報の種類の判定結果によって動作を変更する。
【選択図】図4
【特許請求の範囲】
【請求項1】
命令と前記命令の実行結果とに基づく同期情報を生成して出力する同期情報生成部と、前記命令の実行時に発生した障害情報の種類を判定する障害選択部とを有するプライマリバーチャルマシン
を備え、
前記プライマリバーチャルマシンは、前記障害情報の種類の判定結果に基づいて動作を変更する、プライマリマシン。
【請求項2】
前記障害選択部は、前記障害情報がハードウェア障害又はソフトウェア障害のどちらに関する情報であるか判定し、
前記プライマリバーチャルマシンは、前記障害情報が前記ソフトウェア障害に関する情報である場合、前記プライマリバーチャルマシンで動作させているアプリケーションによるエラー処理の実行の決定、又は、前記アプリケーションに前記エラー処理を実行させる指示の少なくとも1つを実行する、請求項1に記載のプライマリマシン。
【請求項3】
前記障害選択部は、前記障害情報がハードウェア障害又はソフトウェア障害のどちらに関する情報であるかの判定の確度を決定し、
前記プライマリバーチャルマシンは、前記判定の確度に更に基づいて動作を変更する、請求項2に記載のプライマリマシン。
【請求項4】
前記障害選択部は、前記障害情報としてシステムコールの返り値又はエラー内容を取得し、前記システムコールの返り値又はエラー内容にハードウェア障害又はソフトウェア障害のいずれに対応するかを特定するリストに基づいて、前記障害情報がハードウェア障害又はソフトウェア障害のどちらに関する情報であるか判定する、請求項2に記載のプライマリマシン。
【請求項5】
請求項1から4までのいずれか一項に記載のプライマリマシンと、
前記同期情報に基づいて前記命令を実行するセカンダリバーチャルマシンを有するセカンダリマシンと
を備える、フォールトトレラントシステム。
【請求項6】
前記障害選択部は、前記障害情報がハードウェア障害又はソフトウェア障害のどちらに関する情報であるか判定し、
前記プライマリバーチャルマシンは、
前記障害情報が前記ハードウェア障害に関する情報であると判定される場合、前記セカンダリバーチャルマシンに制御を切り替え、
前記障害情報が前記ソフトウェア障害に関する情報であると判定される場合、前記セカンダリバーチャルマシンに制御を切り替えない、
請求項5に記載のフォールトトレラントシステム。
【請求項7】
前記障害選択部は、前記障害情報がハードウェア障害又はソフトウェア障害のどちらに関する情報であるかの判定の確度を決定し、
前記プライマリバーチャルマシンは、前記判定の確度に更に基づいて、前記セカンダリバーチャルマシンに制御を切り替えるか決定する、請求項6に記載のフォールトトレラントシステム。
【発明の詳細な説明】
【技術分野】
【0001】
本開示は、プライマリマシン及びフォールトトレラントシステムに関する。
【背景技術】
【0002】
従来、低負荷で動作できるフォールトトレラントシステムが知られている(例えば、特許文献1参照)。
【先行技術文献】
【特許文献】
【0003】
【特許文献1】特開2021-152802号公報
【発明の概要】
【発明が解決しようとする課題】
【0004】
フォールトトレラントシステムにおいて、プライマリマシンは、プライマリマシンにおいて発生した障害がセカンダリマシンに制御を切り替えても解決しない場合、制御を切り替えずにプライマリマシンで障害を解決する必要がある。障害が発生したときに自動的に制御を切り替えずに必要な場合にだけ制御を切り替えることが求められる。
【0005】
本開示は、上述の点に鑑みてなされたものであり、障害の種類によって制御の切り替えを判断するプライマリマシン及びフォールトトレラントシステムを提供することを目的とする。
【課題を解決するための手段】
【0006】
幾つかの実施形態に係る(1)プライマリマシンは、命令と前記命令の実行結果とに基づく同期情報を生成して出力する同期情報生成部と、命令の実行時に発生した障害情報の種類を判定する障害選択部とを有するプライマリバーチャルマシンを備える。前記プライマリバーチャルマシンは、前記障害情報の種類の判定結果に基づいて動作を変更する。このようにすることで、例えば制御を切り替えても解消しないエラーが発生した場合に不要な切り替えが回避される。その結果、障害の種類によって制御の切り替えが判断される。
【0007】
(2)上記(1)のプライマリマシンにおいて、前記障害選択部は、前記障害情報がハードウェア障害又はソフトウェア障害のどちらに関する情報であるか判定してよい。前記プライマリバーチャルマシンは、前記障害情報が前記ソフトウェア障害に関する情報である場合、前記プライマリバーチャルマシンで動作させているアプリケーションによるエラー処理の実行の決定、前記アプリケーションのエラー処理の実行、又は、前記アプリケーションに対するエラー処理の指示の少なくとも1つを実行してよい。このようにすることで、制御を切り替えずに障害が解消される。その結果、不要な制御の切り替えが回避される。
【0008】
(3)上記(2)のプライマリマシンにおいて、前記障害選択部は、前記障害情報がハードウェア障害又はソフトウェア障害のどちらに関する情報であるかの判定の確度を決定してよい。前記プライマリバーチャルマシンは、前記判定の確度に更に基づいて動作を変更してよい。このようにすることで、制御の切り替えの判断の精度が向上する。その結果、不要な制御の切り替えが回避される。
【0009】
(4)上記(2)又は(3)のプライマリマシンにおいて、前記障害選択部は、前記障害情報としてシステムコールの返り値又はエラー内容を取得してよい。前記障害選択部は、前記システムコールの返り値又はエラー内容にハードウェア障害又はソフトウェア障害のいずれに対応するかを特定するリストに基づいて、前記障害情報がハードウェア障害又はソフトウェア障害のどちらに関する情報であるか判定してよい。このようにすることで、簡便に障害の種別が判定される。その結果、障害の種類によって制御の切り替えが判断される。
【0010】
幾つかの実施形態に係る(5)フォールトトレラントシステムは、上記(1)から(4)までのいずれか1つのプライマリマシンと、前記同期情報に基づいて前記命令を実行するセカンダリバーチャルマシンを有するセカンダリマシンとを備えてよい。このようにすることで、プライマリマシンに障害が発生した場合でもセカンダリマシンで動作が継続される。その結果、フォールトトレラントシステム全体として処理が継続される。
【0011】
(6)上記(5)のフォールトトレラントシステムにおいて、前記障害選択部は、前記障害情報がハードウェア障害又はソフトウェア障害のどちらに関する情報であるか判定してよい。前記プライマリバーチャルマシンは、前記障害情報が前記ハードウェア障害に関する情報であると判定される場合、前記セカンダリバーチャルマシンに制御を切り替えてよい。前記プライマリバーチャルマシンは、前記障害情報が前記ソフトウェア障害に関する情報であると判定される場合、前記セカンダリバーチャルマシンに制御を切り替えなくてよい。このようにすることで、例えば制御を切り替えても解消しないエラーが発生した場合に不要な切り替えが回避される。その結果、障害の種類によって制御の切り替えが判断される。
【0012】
(7)上記(6)のフォールトトレラントシステムにおいて、前記障害選択部は、前記障害情報がハードウェア障害又はソフトウェア障害のどちらに関する情報であるかの判定の確度を決定してよい。前記プライマリバーチャルマシンは、前記判定の確度に更に基づいて、前記セカンダリバーチャルマシンに制御を切り替えるか決定してよい。このようにすることで、制御の切り替えの判断の精度が向上する。その結果、不要な制御の切り替えが回避される。
【発明の効果】
【0013】
本開示によれば、障害の種類によって制御の切り替えが判断されるプライマリマシン及びフォールトトレラントシステムが提供される。
【図面の簡単な説明】
【0014】
図1】比較例に係るフォールトトレラントシステムを示すブロック図である。
図2】一実施形態に係るフォールトトレラントシステムの構成例を示すブロック図である。
図3】バイトコードを実行する手順の一例を示すフローチャートである。
図4】一実施形態に係る制御方法の手順例を示すフローチャートである。
【発明を実施するための形態】
【0015】
(比較例)
図1に示されるように、比較例に係るフォールトトレラントシステム9は、プライマリマシン800と、セカンダリマシン900とを備える。プライマリマシン800及びセカンダリマシン900は、ネットワーク300を介して通信可能に接続される。プライマリマシン800とセカンダリマシン900とは、両方とも同じ処理を実行する。プライマリマシン800に障害が発生した場合、セカンダリマシン900が処理を引き継ぐ。このようにすることで、フォールトトレラントシステム9全体として、処理が継続される。
【0016】
プライマリマシン800は、ハードウェア840を備え、ハードウェア840上でプライマリOS(Operating System)830又はハイパーバイザを動作させる。プライマリマシン800は、プライマリOS830上又はハイパーバイザ上でプライマリVM(Virtual Machine)820を動作させる。プライマリVM820は、同期情報生成部824と、障害検知部826とを含む。プライマリマシン800は、プライマリVM820上でアプリケーション810を動作させる。
【0017】
セカンダリマシン900は、ハードウェア940を備え、ハードウェア940上でセカンダリOS930又はハイパーバイザを動作させる。セカンダリマシン900は、セカンダリOS930上又はハイパーバイザ上でセカンダリVM920を動作させる。セカンダリVM920は、同期実行部924と、障害検知部926とを含む。セカンダリマシン900は、セカンダリVM920上で、アプリケーション910を動作させる。
【0018】
プライマリマシン800及びセカンダリマシン900は、アプリケーション810及びアプリケーション910の処理が同じ処理となるように、アプリケーション810及びアプリケーション910を動作させる。このようにすることで、プライマリマシン800に障害が発生した場合、セカンダリマシン900が処理を引き継ぐことができる。アプリケーション810及び910は、区別されない場合、単にアプリケーションと称される。
【0019】
ハードウェア840は、CPU(Central Processing Unit)と、メモリと、NIC(Network Interface Controller)とを備える。ハードウェア940は、CPUと、メモリと、NICとを備える。ハードウェア840及び940は、区別されない場合、単にハードウェアと称される。
【0020】
CPUは、1つ以上のプロセッサで構成されてよい。プロセッサは、所定のプログラムを実行することによって、種々の機能を実現してよい。プロセッサは、メモリからプログラムを取得してもよいし、ネットワーク300からプログラムを取得してもよい。
【0021】
メモリは、例えば半導体メモリ等で構成されてよいし、磁気ディスク等の記憶媒体で構成されてもよい。メモリは、CPUのワークメモリとして機能してよい。メモリは、CPUに含まれてもよい。
【0022】
NICは、LAN(Local Area Network)等の通信インタフェースを含んで構成されてよい。
【0023】
プライマリVM820は、同期情報生成部824と、障害検知部826とを備える。同期情報生成部824は、プライマリVM820におけるアプリケーション810の実行状況をセカンダリVM920に伝えるための同期情報を生成し、セカンダリVM920に送信する。障害検知部826は、ハードウェア840で発生したハードウェア障害(HW障害)又はプライマリOS830で発生したソフトウェア障害(SW障害)を検知する。
【0024】
セカンダリVM920は、同期実行部924と、障害検知部926とを備える。同期実行部924は、プライマリVM820から同期情報を受信し、プライマリVM820におけるアプリケーション810の実行状況に同期してアプリケーション910を実行する。障害検知部926は、ハードウェア940で発生したハードウェア障害(HW障害)又はプライマリOS930で発生したソフトウェア障害(SW障害)を検知する。
【0025】
プライマリVM820は、プライマリOS830上で動作する。セカンダリVM920は、セカンダリOS930上で動作する。プライマリOS830の機能はハードウェア840によって実現される。セカンダリOS930の機能はハードウェア940によって実現される。プライマリOS830は、プライマリVM820にアプリケーション810の処理を実行させる。セカンダリOS930は、セカンダリVM920にアプリケーション910の処理を実行させる。
【0026】
アプリケーションが命令を実行して動作結果を取得するまでの動作の流れの一例が説明される。プライマリマシン800において、アプリケーション810はプライマリVM820に命令を出力する。プライマリVM820を動作させているプライマリOS830は、プライマリVM820から命令を受け取る。プライマリOS830は、受け取った命令をハードウェア840が実行可能な形式に変換してハードウェア840に命令を実行させ、ハードウェア840の動作結果を取得する。プライマリVM820は、プライマリOS830で取得した動作結果をアプリケーション810に出力する。以上の動作によって、アプリケーション810は命令に応じた動作結果を取得できる。
【0027】
プライマリマシン800において、プライマリVM820の同期情報生成部824は、命令と動作結果とを含む同期情報を生成し、セカンダリマシン900の同期実行部924に出力する。セカンダリマシン900において、同期実行部924が取得した同期情報に基づいてアプリケーション910が命令をセカンダリVM920に出力する。セカンダリVM920を動作させているセカンダリOS930は、セカンダリVM920から命令を受け取る。セカンダリOS930は、受け取った命令をハードウェア940が実行可能な形式に変換してハードウェア940に命令を実行させ、ハードウェア940の動作結果を取得する。セカンダリVM920は、セカンダリOS930で取得した動作結果をアプリケーション910に出力する。以上の動作によって、セカンダリマシン900において、アプリケーション910は同期情報に基づいてプライマリマシン800のアプリケーション810と同じ命令を実行して動作結果を取得できる。
【0028】
プライマリマシン800において、プライマリVM820は、ハードウェア840で発生したハードウェア障害及びプライマリOS830で発生したソフトウェア障害を、障害検知部826によって検知する。同様に、セカンダリマシン900において、セカンダリVM920は、ハードウェア940で発生したハードウェア障害及びセカンダリOS930で発生したソフトウェア障害を、障害検知部926によって検知する。
【0029】
比較例に係るフォールトトレラントシステム9は、プライマリマシン800において障害が発生した場合、発生した障害がハードウェア障害であるかソフトウェア障害であるかにかかわらず、セカンダリマシン900に制御を切り替える。発生した障害がハードウェア障害である場合、セカンダリマシン900で同じハードウェア障害が発生している可能性が低い。したがって、フォールトトレラントシステム9は、セカンダリマシン900に制御を切り替えることによって、プライマリマシン800の障害を回避して全体としての動作を継続できる。
【0030】
一方で、発生した障害がソフトウェア障害である場合、セカンダリマシン900はプライマリマシン800と同じ処理を実行しているので、セカンダリマシン900においても同じソフトウェア障害が発生する可能性が高い。したがって、フォールトトレラントシステム9は、セカンダリマシン900に制御を切り替えた後でも、障害を回避できない可能性がある。ソフトウェア障害が発生した場合、フォールトトレラントシステム9のプライマリマシン800は、制御を切り替えずにアプリケーション810で障害を解決する必要がある。つまり、フォールトトレラントシステム9及びプライマリマシン800において、障害の種類によって制御の切り替えが判断されないことがある。
【0031】
そこで、本開示は、障害の種類によって制御の切り替えが判断されるプライマリマシン100(図2参照)及びフォールトトレラントシステム1(図2参照)について説明する。
【0032】
(実施形態)
図2に示されるように、本開示の一実施形態に係るフォールトトレラントシステム1は、プライマリマシン100と、セカンダリマシン200とを備える。プライマリマシン100とセカンダリマシン200とは、ネットワーク300を介して通信可能に接続される。プライマリマシン100とセカンダリマシン200とは、両方とも同じ処理を実行する。プライマリマシン100に障害が発生した場合、セカンダリマシン200が処理を引き継ぐ。このようにすることで、フォールトトレラントシステム1全体として、処理が継続される。
【0033】
<構成例>
プライマリマシン100は、ハードウェア140を備え、ハードウェア140上でプライマリOS130を動作させる。プライマリマシン100は、プライマリOS130上でプライマリVM120(プライマリバーチャルマシン)を動作させる。プライマリマシン100は、プライマリVM120上でアプリケーション110を動作させる。アプリケーション110は、SW障害検知部116を有する。
【0034】
セカンダリマシン200は、ハードウェア240を備え、ハードウェア240上でセカンダリOS230を動作させる。セカンダリマシン200は、セカンダリOS230上でセカンダリVM220(セカンダリバーチャルマシン)を動作させる。セカンダリマシン200は、セカンダリVM220上で、アプリケーション210を動作させる。アプリケーション210は、SW障害検知部216を有する。
【0035】
プライマリマシン100及びセカンダリマシン200は、アプリケーション110及びアプリケーション210の処理が同じ処理となるように、アプリケーション110及びアプリケーション210を動作させる。このようにすることで、プライマリマシン100に障害が発生した場合、セカンダリマシン200が処理を引き継ぐことができる。アプリケーション110及び210は、区別されない場合、単にアプリケーションと称される。
【0036】
ハードウェア140は、CPUと、メモリと、NICとを備える。ハードウェア240は、CPUと、メモリと、NICとを備える。ハードウェア140及び240は、区別されない場合、単にハードウェアと称される。
【0037】
CPUは、1つ以上のプロセッサで構成されてよい。プロセッサは、所定のプログラムを実行することによって、種々の機能を実現してよい。プロセッサは、メモリからプログラムを取得してもよいし、ネットワーク300からプログラムを取得してもよい。
【0038】
メモリは、例えば半導体メモリ等で構成されてよいし、磁気ディスク等の記憶媒体で構成されてもよい。メモリは、CPUのワークメモリとして機能してよい。メモリは、CPUに含まれてもよい。
【0039】
NICは、LAN等の通信インタフェースを含んで構成されてよい。
【0040】
プライマリVM120は、同期情報生成部124と、HW障害検知部126と、障害選択部128とを備える。同期情報生成部124は、プライマリVM120におけるアプリケーション110の実行状況をセカンダリVM220に伝えるための同期情報を生成し、セカンダリVM220に送信する。HW障害検知部126は、プライマリマシン100で発生したハードウェア障害(HW障害)を検知する。障害選択部128は、ハードウェア140で発生したハードウェア障害に関する情報をHW障害検知部126に出力し、プライマリOS130で発生したソフトウェア障害(SW障害)に関する情報をアプリケーション110に出力する。
【0041】
セカンダリVM220は、同期実行部224と、HW障害検知部226と、障害選択部228とを備える。同期実行部224は、プライマリVM120から同期情報を受信し、プライマリVM120におけるアプリケーション110の実行状況に同期してアプリケーション210を実行する。
【0042】
<アプリケーションの動作例>
プライマリVM120は、プライマリOS130上で動作する。セカンダリVM220は、セカンダリOS230上で動作する。プライマリVM120及びセカンダリVM220は、VMと総称される。プライマリOS130及びセカンダリOS230は、OSと総称される。つまり、VMは、OS上で動作する。OS及びVMの機能は、CPUを含むハードウェアによって実現される。
【0043】
プライマリOS130は、プライマリVM120にアプリケーション110の処理を実行させる。セカンダリOS230は、セカンダリVM220にアプリケーション210の処理を実行させる。つまり、OSは、VMにアプリケーション110及び210の処理を実行させる。
【0044】
アプリケーションが命令を実行して動作結果を取得するまでの動作の流れの一例が説明される。プライマリマシン100において、アプリケーション110はプライマリVM120に命令を出力する。プライマリVM120を動作させているプライマリOS130は、プライマリVM120から命令を受け取る。プライマリOS130は、受け取った命令をハードウェア140が実行可能な形式に変換してハードウェア140に命令を実行させ、ハードウェア140の動作結果を取得する。プライマリVM120は、プライマリOS130で取得した動作結果をアプリケーション110に出力する。以上の動作によって、アプリケーション110は命令に応じた動作結果を取得できる。
【0045】
プライマリマシン100において、プライマリVM120の同期情報生成部124は、命令と動作結果とを含む同期情報を生成し、セカンダリマシン200の同期実行部224に出力する。セカンダリマシン200において、同期実行部224が取得した同期情報に基づいてアプリケーション210が命令をセカンダリVM220に出力する。セカンダリVM220を動作させているセカンダリOS230は、セカンダリVM220から命令を受け取る。セカンダリOS230は、受け取った命令をハードウェア240が実行可能な形式に変換してハードウェア240に命令を実行させ、ハードウェア240の動作結果を取得する。セカンダリVM220は、セカンダリOS230で取得した動作結果をアプリケーション210に出力する。以上の動作によって、セカンダリマシン200において、アプリケーション210は同期情報に基づいてプライマリマシン100のアプリケーション110と同じ命令を実行して動作結果を取得できる。
【0046】
VMは、Java(登録商標)又は.Net等のプログラミング言語において、Runtimeとも呼ばれる。VMは、汎用のプログラミング言語処理系として実現されてよい。汎用のプログラミング言語処理系は、例えば、mruby又はMicro Python等を含んでよい。mrubyは、組み込みシステム向けの軽量なRuby言語処理系であり、省メモリの環境でも動作できる。Rubyの処理系は、主にインタプリタとして実装される。ソースコードは、プログラムの実行時又はプログラムの実行前にバイトコードにコンパイルされる。インタプリタは、バイトコードを1命令ずつ実行する。
【0047】
プライマリVM120及びセカンダリVM220は、各バイトコードを同じ命令アドレスに格納する。プライマリVM120及びセカンダリVM220は、同じ命令アドレスからバイトコードを取得し、バイトコードに対応する動作を実行する。バイトコードに対応する動作を実行することは、バイトコードを実行するともいう。プライマリVM120は、同期情報生成部124にバイトコードを実行させてよい。セカンダリVM220は、同期実行部224にバイトコードを実行させてよい。プライマリVM120及びセカンダリVM220は、1つのバイトコードに対応する動作を実行する毎に同期をとる。プライマリVM120及びセカンダリVM220は、1つのバイトコードに対応する動作を実行して同期をとった後、次のバイトコードに対応する動作を実行する。このようにすることで、プライマリVM120及びセカンダリVM220は、互いに同期をとりながら処理を進めることができる。
【0048】
バイトコードが外部から入力されるデータを取得したり外部にデータを出力したりする動作に対応する場合、プライマリVM120だけが実際に外部との間でデータの入出力を実行する。一方で、セカンダリVM220は、実際に外部との間でデータの入出力を実行しない。
【0049】
バイトコードが外部から入力されるデータを取得する動作に対応する場合、セカンダリVM220は、外部から入力されるデータを取得する代わりに、プライマリVM120に対して外部から入力されたデータを、プライマリVM120から取得する。バイトコードが外部にデータを出力する動作に対応する場合、セカンダリVM220は、そのバイトコードの実行をスキップする。
【0050】
プライマリVM120は、1つのバイトコードを実行する毎に、セカンダリVM220に対して同期情報を送信する。同期情報は、バイトコードが格納されている命令アドレス、又は、プライマリVM120に対して外部から入力されたデータを含んでよい。同期情報は、実行した命令数を表す情報を含んでもよい。同期情報は、プライマリVM120が実行したバイトコードを特定する情報を含んでもよい。
【0051】
セカンダリVM220は、プライマリVM120から同期情報を受信し、同期情報に基づいてバイトコードの処理を進める。セカンダリVM220は、プライマリVM120から受信した命令アドレス又は実行した命令数に一致するバイトコードの処理を進める。セカンダリVM220は、1つのバイトコードの処理の終了後、次の同期情報をプライマリVM120から受信するまで、処理を中断する。
【0052】
プライマリVM120及びセカンダリVM220は、上述のように同期情報を送受信することによって、バイトコードの処理を同期して進めることができる。
【0053】
mrubyは、VMの省メモリ化を実現するために、処理を簡略化してVMのプログラムサイズを小さくしている。処理を簡略化するための機能の一つは、プログラム処理のシングルスレッド化である。シングルスレッド化は、複数の命令を同時に並列で実行しないとともに、外部からの割り込みによって処理を中断しないように構成されることを意味する。外部からの割り込みによって処理が中断されないことによって、複雑なタイミング調整機能が不要になる。その結果、処理が簡略化される。
【0054】
ここで、VMのレベルでは外部からの割り込みが発生しないとしても、OSのレベルでは外部からの割り込みが発生することがある。したがって、VMでバイトコードを実行している間に外部からの割り込みが発生することがある。しかし、外部からの割り込みによってバイトコードの実行結果は変化しない。
【0055】
プライマリVM120の同期情報生成部124は、プライマリVM120におけるバイトコードの実行に伴って、実行したバイトコードの命令アドレス又は実行命令数を取得する。同期情報生成部124は、プライマリVM120が外部から入力されたデータを取得した場合、そのデータを取得する。同期情報生成部124は、取得した命令アドレス若しくは実行命令数又は外部から入力されたデータを含む同期情報を生成し、セカンダリVM220に送信する。外部から入力されたデータを取得する命令は、入力命令とも称される。同期情報生成部124は、バイトコードとして入力命令を実行することによって外部から入力されたデータを同期情報として出力する。
【0056】
また、同期情報生成部124は、セカンダリVM220に同期情報を送信した後、セカンダリVM220から応答通知を受信するまで、プライマリVM120に次のバイトコードを実行させないようにする。言い換えれば、同期情報生成部124は、セカンダリVM220から応答通知を受信した場合、プライマリVM120が次のバイトコードを実行することを許可する。
【0057】
セカンダリVM220の同期実行部224は、プライマリVM120の同期情報生成部124から同期情報を受信する。同期実行部224は、受信した同期情報に基づいて、セカンダリVM220におけるバイトコードの実行を制御する。例えば、同期実行部224は、同期情報に含まれる命令アドレスに格納されているバイトコードをセカンダリVM220に実行させてよい。同期実行部224は、同期情報に含まれる実行命令数に一致するようにバイトコードをセカンダリVM220に実行させてよい。
【0058】
同期実行部224は、セカンダリVM220で次に実行されるバイトコードが外部から入力されるデータを取得する動作に対応する場合、セカンダリVM220にそのバイトコードの実行をスキップさせる。この場合、同期情報は、外部から入力されたデータを含む。セカンダリVM220は、同期情報に含まれる外部から入力されたデータを、スキップしたバイトコードの実行結果として得られたデータとみなして、次のバイトコードの処理に進む。同期情報が外部から入力されたデータを含むことによって、セカンダリマシン200が外部と通信しなくてもよくなる。このようにすることで、フォールトトレラントシステム1の負荷が軽減される。その結果、低負荷で動作できるフォールトトレラントシステム1が実現される。
【0059】
<プログラムの一例>
ここで、mrubyのプログラムとして、外部から文字列を取得し、取得した文字列に別の文字列を連結し、連結した文字列を外部に出力するプログラムが例として説明される。2つの文字列は、X及びYと表されるとする。このプログラムは、以下の4つのバイトコードにコンパイルされてよい。コードA、B、C及びDはそれぞれ1命令に対応する。
コードA:VMは、第1レジスタに文字列定数「X」を代入する。
コードB:VMは、外部から入力されたデータとして文字列を取得し、第2レジスタに代入する。本プログラム例において、文字列として「Y」が取得される。
コードC:VMは、第1レジスタの文字列と第2レジスタの文字列とを連結し、連結した文字列を第1レジスタに代入する。
コードD:VMは、第1レジスタの文字列を外部に出力する。
【0060】
プライマリマシン100及びセカンダリマシン200が上述のバイトコードを同期させながら実行する構成が説明される。
【0061】
プライマリマシン100及びセカンダリマシン200は、ネットワーク300を介して外部機器と通信可能に接続される。プライマリマシン100は、外部機器から入力データを取得する。プライマリマシン100は、外部機器に出力データを出力する。プライマリマシン100は、セカンダリマシン200に同期情報を送信する。プライマリマシン100は、外部機器から入力データを取得した場合、入力データを含む同期情報をセカンダリマシン200に出力する。
【0062】
仮にプライマリマシン100で障害が発生した場合、セカンダリマシン200がバイトコードの実行を継続できる。セカンダリマシン200は、プライマリマシン100が動作している間、外部機器と通信しないものの、プライマリマシン100が障害で停止した場合、外部機器と通信してデータを入出力できる。
【0063】
プライマリVM120及びセカンダリVM220は、図3に示される手順で、上述のバイトコードを実行する。
【0064】
プライマリVM120は、コードAを実行する(ステップS11)。プライマリVM120は、コードAに対応する動作として、第1レジスタに文字列定数「X」を代入する。プライマリVM120は、ステップS11の手順でコードAを実行した後、同期情報AをセカンダリVM220に送信する。なお、文字列定数「X」は、コードAに含まれているので同期情報Aに含まれない。
【0065】
セカンダリVM220は、プライマリVM120から同期情報Aを受信した場合、同期情報Aに基づいてコードAを実行する(ステップS21)。セカンダリVM220は、コードAに対応する動作として、第1レジスタに文字列定数「X」を代入する。セカンダリVM220は、ステップS21の手順でコードAを実行した後、コードAの実行を完了したことを表す応答をプライマリVM120に送信する。
【0066】
プライマリVM120は、セカンダリVM220から応答を受信した場合、次のバイトコードであるコードBを実行する(ステップS12)。プライマリVM120は、コードBに対応する動作として、外部機器から入力データとして文字列「Y」を取得し、第2レジスタに代入する。プライマリVM120は、ステップS12の手順でコードBを実行した後、外部機器からの入力データである文字列「Y」を含む同期情報BをセカンダリVM220に送信する。
【0067】
セカンダリVM220は、プライマリVM120から同期情報Bを受信した場合、同期情報Bに基づいてコードBを実行する(ステップS22)。セカンダリVM220は、コードBに対応する動作として、外部機器から入力データを取得する代わりに、同期情報Bに含まれる文字列「Y」を第2レジスタに代入する。セカンダリVM220は、ステップS22の手順でコードBを実行した後、コードBの実行を完了したことを表す応答をプライマリVM120に送信する。
【0068】
プライマリVM120は、セカンダリVM220から応答を受信した場合、次のバイトコードであるコードCを実行する(ステップS13)。プライマリVM120は、コードCに対応する動作として、第1レジスタの文字列と第2レジスタの文字列とを連結し、連結した文字列を第1レジスタに代入する。この場合、第1レジスタに代入された文字列は「XY」となっている。プライマリVM120は、ステップS13の手順でコードCを実行した後、同期情報CをセカンダリVM220に送信する。
【0069】
セカンダリVM220は、プライマリVM120から同期情報Cを受信した場合、同期情報Cに基づいてコードCを実行する(ステップS23)。セカンダリVM220は、コードCに対応する動作として、第1レジスタの文字列と第2レジスタの文字列とを連結し、連結した文字列を第1レジスタに代入する。この場合、セカンダリVM220においても、第1レジスタに代入された文字列は「XY」となっている。セカンダリVM220は、ステップS23の手順でコードCを実行した後、コードCの実行を完了したことを表す応答をプライマリVM120に送信する。
【0070】
プライマリVM120は、セカンダリVM220から応答を受信した場合、次のバイトコードであるコードDを実行する(ステップS14)。プライマリVM120は、コードDに対応する動作として、第1レジスタの文字列を外部機器に出力する。この場合、外部機器が取得する文字列は「XY」となっている。プライマリVM120は、ステップS14の手順でコードDを実行した後、同期情報DをセカンダリVM220に送信する。
【0071】
セカンダリVM220は、プライマリVM120から同期情報Dを受信した場合、同期情報Dに基づいてコードDを実行する(ステップS24)。セカンダリVM220は、コードDに対応する動作として、外部機器に対して第1レジスタの文字列を出力せず、何も実行しない。つまり、セカンダリVM220は、コードDに対応する動作をスキップする。セカンダリVM220は、ステップS24の手順でコードDの実行として対応する動作をスキップした後、コードDの実行を完了したことを表す応答をプライマリVM120に送信する。
【0072】
セカンダリVM220は、コードDの実行を完了したことを表す応答をプライマリVM120に送信した後、一連のバイトコードの実行を終了する。プライマリVM120は、セカンダリVM220から応答を受信することによって、一連のバイトコードの実行を終了する。
【0073】
以上説明してきたように、プライマリVM120及びセカンダリVM220は、互いに同期をとりながらバイトコードを実行できる。プライマリVM120が一連のバイトコードの実行の途中で障害によって停止した場合でも、セカンダリVM220がバイトコードを引き続き実行できる。セカンダリマシン200は、ネットワーク300を介して外部機器に通信可能に接続されることによって、データを入出力する動作に対応するバイトコードも引き続き実行できる。
【0074】
フォールトトレラントシステム1において、プライマリマシン100及びセカンダリマシン200が両方とも正常に動作している場合、処理の冗長化が実現される。ここで、プライマリマシン100又はセカンダリマシン200が障害によって停止する場合におけるフォールトトレラントシステム1の動作が説明される。
【0075】
<プライマリマシン100の障害が発生する場合>
プライマリマシン100の障害が発生した場合、プライマリVM120は、バイトコードの実行等の制御処理を正常に実行できなくなることがある。ここで、プライマリマシン100で発生した障害がハードウェア障害である場合、セカンダリマシン200で同じハードウェア障害が発生している可能性が低い。したがって、フォールトトレラントシステム1は、セカンダリマシン200に制御を切り替えることによって、プライマリマシン100の障害を回避して全体としての動作を継続できる。
【0076】
一方で、プライマリマシン100で発生した障害がソフトウェア障害である場合、セカンダリマシン200はプライマリマシン100と同じ処理を実行しているので、セカンダリマシン200においても同じソフトウェア障害が発生する可能性が高い。したがって、フォールトトレラントシステム1は、セカンダリマシン200に制御を切り替えたとしても障害を回避できない可能性がある。したがって、フォールトトレラントシステム1は、ハードウェア障害が発生した場合とソフトウェア障害が発生した場合とで異なる動作を実行する。
【0077】
プライマリマシン100において、プライマリVM120は、ハードウェア140で発生したハードウェア障害及びプライマリOS130で発生したソフトウェア障害に関する情報を受け取る。ハードウェア障害に関する情報及びソフトウェア障害に関する情報は障害情報とも総称される。
【0078】
プライマリVM120の障害選択部128は、受け取った障害情報の種類を判定する。障害選択部128は、受け取った障害情報がハードウェア障害に関する情報であるかソフトウェア障害に関する情報であるか判定してよい。障害選択部128は、受け取った障害情報がソフトウェア障害に関する情報であると判定した場合、ソフトウェア障害に関する情報をアプリケーション110に出力する。したがって、プライマリVM120は、命令を実行した動作結果とソフトウェア障害に関する情報とをあわせてアプリケーション110に出力する。アプリケーション110は、SW障害検知部116によってソフトウェア障害に関する情報を検知する。アプリケーション110は、ソフトウェア障害に対してエラー処理によって対応する。プライマリVM120は、アプリケーション110によるエラー処理の実行を決定してよい。プライマリVM120は、アプリケーション110にエラー処理の実行を指示してよい。プライマリVM120は、アプリケーション110によるエラー処理の実行の決定、又は、アプリケーション110にエラー処理を実行させる指示の少なくとも一方を実行してよい。
【0079】
障害選択部128は、受け取った障害情報がハードウェア障害に関する情報であると判定した場合、障害情報をHW障害検知部126に出力する。HW障害検知部126は、ハードウェア障害の発生を検知する。フォールトトレラントシステム1は、ハードウェア障害の発生が検知された場合、バイトコードの実行等の制御処理を、プライマリマシン100のプライマリVM120からセカンダリマシン200のセカンダリVM220に切り替える。フォールトトレラントシステム1は、セカンダリマシン200だけが動作するシングル運転の状態となる。シングル運転の状態において、プライマリVM120の動作を代替するセカンダリVM220は、プライマリVM120との同期処理を停止する。
【0080】
プライマリVM120は、プライマリマシン100のハードウェア障害を検出できた場合、セカンダリVM220への障害通知の送信を試みつつ、プライマリマシン100を停止させたり再起動させたりする。障害通知は、同期情報と同じ通信経路で送信されてよい。プライマリVM120がセカンダリVM220へ障害通知を送信できた場合、セカンダリVM220は、プライマリVM120から障害通知を受信することによってプライマリマシン100でハードウェア障害が発生したことを把握する。プライマリVM120がセカンダリVM220へ障害通知を送信できなかった場合、セカンダリVM220は、プライマリマシン100を監視する手段によってプライマリマシン100で障害が発生したことを把握してよい。セカンダリVM220は、プライマリマシン100で障害が発生したことを把握した場合、バイトコードの実行等の制御処理をプライマリVM120から引き継ぐとともに、プライマリマシン100との同期処理を停止する。また、セカンダリVM220は、セカンダリOS230を介して、プライマリVM120の代わりに外部との間のデータの入出力処理を実行する。
【0081】
プライマリマシン100は、プライマリVM120が障害を検知できず、セカンダリVM220に障害通知を送信せずに停止することがある。セカンダリVM220は、プライマリマシン100を監視する手段によってプライマリマシン100が停止したことを把握し、プライマリマシン100で障害が発生したことを把握してよい。セカンダリVM220は、プライマリマシン100で障害が発生したことを把握した場合、バイトコードの実行等の制御処理をプライマリVM120から引き継ぐとともに、プライマリマシン100との同期処理を停止する。以上述べてきたように、プライマリVM120は、障害情報の種類の判定結果によって動作を変更する。
【0082】
<セカンダリマシン200の障害が発生する場合>
セカンダリマシン200において、セカンダリVM220は、ハードウェア240で発生したハードウェア障害及びセカンダリOS230で発生したソフトウェア障害に関する情報を受け取る。セカンダリVM220の障害選択部228は、受け取った障害情報がハードウェア障害に関する情報であるかソフトウェア障害に関する情報であるか判定する。障害選択部228は、受け取った障害情報がソフトウェア障害に関する情報であると判定した場合、ソフトウェア障害に関する情報をアプリケーション210に出力する。したがって、プライマリVM220は、命令を実行した動作結果とソフトウェア障害に関する情報とをあわせてアプリケーション210に出力する。アプリケーション210は、SW障害検知部216によってソフトウェア障害に関する情報を検知する。アプリケーション210は、ソフトウェア障害に対してエラー処理によって対応する。
【0083】
障害選択部228は、受け取った障害情報がハードウェア障害に関する情報であると判定した場合、障害情報をHW障害検知部226に出力する。HW障害検知部226は、ハードウェア障害の発生を検知する。セカンダリマシン200のハードウェア障害が発生した場合、フォールトトレラントシステム1は、プライマリマシン100だけが動作するシングル運転の状態となる。シングル運転の状態において、プライマリVM120は、セカンダリVM220との同期処理を停止する。
【0084】
セカンダリVM220は、セカンダリマシン200のハードウェア障害を検出できた場合、プライマリVM120への障害通知の送信を試みつつ、セカンダリマシン200を停止させたり再起動させたりする。障害通知は、同期情報と同じ通信経路で送信されてよい。セカンダリVM220がプライマリVM120へ障害通知を送信できた場合、プライマリVM120は、セカンダリVM220から障害通知を受信することによってセカンダリマシン200で障害が発生したことを把握する。セカンダリVM220がプライマリVM120へ障害通知を送信できなかった場合、プライマリVM120は、セカンダリマシン200を監視する手段によってセカンダリマシン200で障害が発生したことを把握してよい。プライマリVM120は、セカンダリマシン200で障害が発生したことを把握した場合、バイトコードの実行等の制御処理におけるセカンダリマシン200との同期処理を停止する。プライマリVM120は、同期情報生成部124の動作を停止することによって同期処理を停止してもよい。
【0085】
セカンダリマシン200は、セカンダリVM220が障害を検知できず、プライマリVM120に障害通知を送信せずに停止することがある。プライマリVM120は、セカンダリマシン200を監視する手段によってセカンダリマシン200が停止したことを把握し、セカンダリマシン200で障害が発生したことを把握してよい。プライマリVM120は、セカンダリマシン200で障害が発生したことを把握した場合、セカンダリマシン200との同期処理を停止する。
【0086】
プライマリVM120がセカンダリマシン200を監視する手段、又は、セカンダリVM220がプライマリマシン100を監視する手段は、例えば以下のようにして実現される。
【0087】
例えば、プライマリVM120とセカンダリVM220とは、互いにハートビート等の死活監視のための定期的な通信を実行してよい。プライマリVM120は、セカンダリVM220からの応答がない場合に、セカンダリマシン200の障害が発生したと判定してよい。セカンダリVM220は、プライマリVM120からの応答がない場合に、プライマリマシン100の障害が発生したと判定してよい。セカンダリVM220は、同期処理におけるプライマリVM120からの同期情報の受信によって、プライマリマシン100に障害が発生していないと判定してもよい。プライマリVM120は、同期処理におけるセカンダリVM220からの応答の受信によって、セカンダリマシン200に障害が発生していないと判定してもよい。
【0088】
例えば、プライマリマシン100及びセカンダリマシン200とは異なる第3のマシンが、プライマリマシン100及びセカンダリマシン200の動作を監視してもよい。第3のマシンは、プライマリマシン100で発生した障害をセカンダリVM220に通知してもよいし、セカンダリマシン200で発生した障害をプライマリVM120に通知してもよい。第3のマシンは、プライマリVM120及びセカンダリVM220との間でハートビート等の死活監視のための定期的な通信を実行してもよい。
【0089】
プライマリVM120及びセカンダリVM220は、死活監視のための通信がネットワーク障害によって途絶することによって、プライマリマシン100及びセカンダリマシン200の障害が発生したと誤って判定することがある。ネットワーク障害によるプライマリマシン100及びセカンダリマシン200の障害の誤検出を避けるために、死活監視のための通信経路が多重化されてもよい。
【0090】
<障害選択部の動作例>
障害選択部は、障害に関する情報を取得した場合に、例えばシステムコールの返り値に基づいて、障害がハードウェア障害であるかソフトウェア障害であるかを判定してよい。
【0091】
障害選択部は、システムコールの返り値がエラーである場合、エラーの内容に基づいて、障害がハードウェア障害であるかソフトウェア障害であるかを判定してよい。障害選択部は、例えば、エラーの内容がストレージ若しくはメモリ、CPU、又は、NIC等のハードウェアの故障を表す場合、障害がハードウェア障害であると判定してよい。障害選択部は、例えば、エラーの内容が通信の接続失敗若しくは送受信失敗、メモリの不足、又は、アプリケーションの操作対象のファイルの不存在等を表す場合、障害がソフトウェア障害であると判定してよい。また、障害選択部は、通信のタイムアウトによって同期情報を受信できない同期通信エラーをハードウェア障害であると判定してよい。
【0092】
障害選択部は、プライマリマシン100又はセカンダリマシン200の単体では障害を検知しない場合であっても、同期情報に基づいてプライマリマシン100における命令の実行結果とセカンダリマシン200における命令の実行結果とを比較してよい。障害選択部は、プライマリマシン100における命令の実行結果とセカンダリマシン200における命令の実行結果とが一致しない場合に、プライマリマシン100又はセカンダリマシン200のいずれかで、ソフトウェア障害又はハードウェア障害が発生したと判定してよい。
【0093】
障害選択部は、ハードウェア障害又はソフトウェア障害のどちらであるか判定する際に判定の確度を決定してよい。例えば、障害選択部は、通信のタイムアウトによって同期情報を受信できない同期通信エラーをハードウェア障害であると判定する場合の確度を高い確度であると決定してよい。また、例えば、障害選択部は、プライマリマシン100における命令の実行結果とセカンダリマシン200における命令の実行結果とが一致しない場合に障害が発生していると判定する場合の確度を低い確度であると決定してよい。
【0094】
プライマリVM120は、障害がハードウェア障害又はソフトウェア障害のいずれであるかの判定の確度に基づいて、制御をセカンダリマシン200に切り替えてプライマリマシン100を停止又は再起動するか決定してよい。例えば、プライマリVM120は、障害がハードウェア障害であると高い確度で判定した場合、制御をセカンダリマシン200に切り替えてプライマリマシン100を停止又は再起動すると決定してよい。プライマリVM120は、障害がソフトウェア障害であると高い確度で判定した場合、アプリケーション110によるエラー処理を実行すると決定してよい。プライマリVM120は、アプリケーション110に対してエラー処理の実行を指示してよい。プライマリVM120は、アプリケーション110によるエラー処理の実行の決定、又は、アプリケーション110にエラー処理を実行させる指示の少なくとも一方を実行してよい。プライマリVM120は、障害がハードウェア障害又はソフトウェア障害であると低い確度で判定した場合、アプリケーション110でエラー処理を試みた後でプライマリマシン100を停止又は再起動するか決定してよい。判定の確度に基づいて動作を決定することによって、制御の切り替えの判定精度が向上する。
【0095】
障害選択部は、システムコールの返り値がハードウェア障害又はソフトウェア障害のいずれに対応するかを特定するリストに基づいて、障害がハードウェア障害であるかソフトウェア障害であるかを判定してよい。障害選択部は、システムコールのエラー内容がハードウェア障害又はソフトウェア障害のいずれに対応するかを特定するリストに基づいて、障害がハードウェア障害であるかソフトウェア障害であるかを判定してよい。リストにおいて、返り値又はエラー内容と障害の種別との対応づけの確度が関連づけられてよい。障害選択部は、リストに基づいて判定の確度を決定してよい。障害選択部は、リストに基づいて障害の種別を判定することによって、簡便に障害の種別を判定できる。
【0096】
例えば、障害選択部は、リストにおいてシステムコールAのエラーXがソフトウェア障害に対応づけられる場合、システムコールAのエラー内容としてエラーXを取得した場合に障害がソフトウェア障害であると判定してよい。障害選択部は、リストにおいてシステムコールAのエラーYがハードウェア障害に対応づけられる場合、システムコールAのエラー内容としてエラーYを取得した場合に障害がハードウェア障害であると判定してよい。システムコールAの他にシステムコールBが存在する場合、障害選択部は、システムコールBに関するリストに基づいて、システムコールBの返り値又はエラー内容にハードウェア障害又はソフトウェア障害のどちらが対応するか判定してよい。
【0097】
<フローチャート例>
ここで、プライマリマシン100の障害が発生した場合のフォールトトレラントシステム1の動作の一例が説明される。プライマリVM120は、例えば図4に示されるフローチャートの手順例を含む制御方法を実行してよい。制御方法は、プライマリVM120の機能を実現するプロセッサに実行させる制御プログラムとして実現されてもよい。制御プログラムは、非一時的なコンピュータ読み取り可能な媒体に格納されてよい。
【0098】
プライマリVM120は、プライマリマシン100におけるハードウェア障害(HW障害)の発生を検出したか判定する(ステップS31)。プライマリVM120は、ハードウェア障害の発生を検出しなかった場合(ステップS31:NO)、ステップS34の手順に進む。プライマリVM120は、ハードウェア障害の発生を検出した場合(ステップS31:YES)、プライマリマシン100でハードウェア障害が発生したことをセカンダリVM220に障害通知を送信する(ステップS32)。プライマリVM120は、プライマリマシン100を停止又は再起動する(ステップS33)。プライマリVM120は、ステップS33の手順の実行後、図4のフローチャートの手順の実行を終了する。
【0099】
プライマリVM120は、ハードウェア障害の発生を検出しなかった場合(ステップS31:NO)、ソフトウェア障害の発生を検出したか判定する(ステップS34)。プライマリVM120は、ソフトウェア障害の発生を検出しなかった場合(ステップS34:NO)、図4のフローチャートの手順の実行を終了する。プライマリVM120は、ソフトウェア障害の発生を検出した場合(ステップS34:YES)、ソフトウェア障害に応じたアプリケーション110のエラー処理を実行する(ステップS35)。プライマリVM120は、アプリケーション110によるエラー処理の実行を決定してよい。プライマリVM120は、アプリケーション110に対してエラー処理の実行を指示してよい。プライマリVM120は、アプリケーション110によるエラー処理の実行の決定、又は、アプリケーション110にエラー処理を実行させる指示の少なくとも一方を実行してよい。プライマリVM120は、ステップS35の手順の実行後、図4のフローチャートの手順の実行を終了する。
【0100】
フォールトトレラントシステム1において、プライマリVM120は、図4に例示したフローチャートの手順を実行することで、障害の種類の判定結果に基づいて動作を変更できる。また、プライマリVM120は、プライマリマシン100に障害が発生したときに、エラー処理で対応すべき場合にセカンダリマシン200に制御を切り替えることを避けることができる。
【0101】
(まとめ)
以上述べてきたように、本開示の一実施形態に係るプライマリマシン100は、障害の種類の判定結果に基づいて動作を変更する。また、本開示の一実施形態に係るフォールトトレラントシステム1は、障害がハードウェア障害又はソフトウェア障害のいずれであるか判定し、プライマリマシン100からセカンダリマシン200に制御を切り替えるか決定する。このようにすることで、例えば制御を切り替えても解消しないエラーが発生した場合に不要な制御の切り替えが回避される。
【0102】
また、本開示の実施形態に係るフォールトトレラントシステム1において、プライマリVM120は、障害情報がソフトウェア障害に関する情報である場合にエラー処理を実行してよい。このようにすることで、制御を切り替えずに障害が解消される。その結果、不要な制御の切り替えが回避される。
【0103】
以上、本開示に係る実施形態について、図面を参照して説明してきたが、具体的な構成はこの実施形態に限定されるものではなく、本開示の趣旨を逸脱しない範囲においての種々の変更も含まれる。
【符号の説明】
【0104】
1 フォールトトレラントシステム
100 プライマリマシン(110:アプリケーション、120:プライマリVM、124:同期情報生成部、126:HW障害検知部、128:障害選択部、130:プライマリOS、140:ハードウェア)
200 セカンダリマシン(210:アプリケーション、220:セカンダリVM、224:同期実行部、226:HW障害検知部、228:障害選択部、230:セカンダリOS、240:ハードウェア)
300 ネットワーク
図1
図2
図3
図4