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

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

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

<>
  • 特許-フォールトトレラントシステム 図1
  • 特許-フォールトトレラントシステム 図2
  • 特許-フォールトトレラントシステム 図3
  • 特許-フォールトトレラントシステム 図4
  • 特許-フォールトトレラントシステム 図5
  • 特許-フォールトトレラントシステム 図6
  • 特許-フォールトトレラントシステム 図7
< >
(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】
(24)【登録日】2023-08-07
(45)【発行日】2023-08-16
(54)【発明の名称】フォールトトレラントシステム
(51)【国際特許分類】
   G06F 11/16 20060101AFI20230808BHJP
   G06F 9/455 20180101ALI20230808BHJP
   G06F 9/48 20060101ALI20230808BHJP
【FI】
G06F11/16 683
G06F9/455 150
G06F9/48 140Z
【請求項の数】 8
(21)【出願番号】P 2020053258
(22)【出願日】2020-03-24
(65)【公開番号】P2021152802
(43)【公開日】2021-09-30
【審査請求日】2022-03-02
(73)【特許権者】
【識別番号】000006507
【氏名又は名称】横河電機株式会社
(74)【代理人】
【識別番号】100147485
【弁理士】
【氏名又は名称】杉村 憲司
(74)【代理人】
【識別番号】230118913
【弁護士】
【氏名又は名称】杉村 光嗣
(74)【代理人】
【識別番号】100188307
【弁理士】
【氏名又は名称】太田 昌宏
(74)【代理人】
【識別番号】100195534
【弁理士】
【氏名又は名称】内海 一成
(72)【発明者】
【氏名】吉田 善貴
【審査官】漆原 孝治
(56)【参考文献】
【文献】特開2014-059749(JP,A)
【文献】特開2010-026932(JP,A)
(58)【調査した分野】(Int.Cl.,DB名)
G06F 11/16
G06F 9/455
G06F 9/48
(57)【特許請求の範囲】
【請求項1】
プライマリOS上で動作するプライマリバーチャルマシンであって、バイトコードを実行し、実行したバイトコードに関する情報に基づく同期情報を出力する同期情報生成部と、前記プライマリOSに入力される第1の割り込みを遮断する第1割り込み遮断部とを有するプライマリバーチャルマシンと、
セカンダリOS上で動作するセカンダリバーチャルマシンであって、前記同期情報に基づいて前記バイトコードを実行する同期実行部と、前記セカンダリOSに入力される第2の割り込みを遮断する第2割り込み遮断部とを有するセカンダリバーチャルマシンと
を備え、
前記同期情報生成部は、前記第1の割り込みを取得した場合、前記第1の割り込みに基づいて前記バイトコードを実行し、
前記第1割り込み遮断部は、前記バイトコードに含まれる、前記第1の割り込みを受け付ける命令の実行中に入力された前記第1の割り込みを前記同期情報生成部に出力する、
フォールトトレラントシステム。
【請求項2】
前記第2割り込み遮断部は、
前記プライマリバーチャルマシンにおいて、前記第1の割り込みに基づいて前記バイトコードが実行される場合に前記第2の割り込みを捨て、
前記プライマリバーチャルマシンにおいて、前記第1の割り込みに基づいて前記バイトコードが実行されない場合に、前記第2の割り込みを前記同期実行部に出力する、
請求項1に記載のフォールトトレラントシステム。
【請求項3】
前記バイトコードは、実行中に前記割り込みを受け付ける第1命令と実行中に前記割り込みを受け付けない第2命令とを含み、
前記第1割り込み遮断部は、前記同期情報生成部が前記第1命令を実行中に入力された前記割り込みを前記同期情報生成部に出力し、前記同期情報生成部が前記第2命令を実行中に入力された前記割り込みを前記同期情報生成部に出力しない、請求項1又は2に記載のフォールトトレラントシステム。
【請求項4】
前記割り込みは、前記第1命令で受け付けられる第1割り込みと、前記第1命令で受け付けられない第2割り込みとを含み、
前記第1割り込み遮断部は、前記同期情報生成部が実行中の命令にかかわらず前記第2割り込みを遮断し、前記同期情報生成部が前記第2命令を実行中に前記第1割り込みを遮断する、請求項に記載のフォールトトレラントシステム。
【請求項5】
前記同期情報は、前記同期情報生成部が実行したバイトコードを特定する情報を含む、請求項1からまでのいずれか一項に記載のフォールトトレラントシステム。
【請求項6】
前記バイトコードは、外部からデータを取得する入力命令を含み、
前記同期情報生成部は、前記入力命令を実行して取得したデータに関する情報を、前記同期情報として出力する、請求項1からまでのいずれか一項に記載のフォールトトレラントシステム。
【請求項7】
前記割り込みは、タイマー処理を含む、請求項1からまでのいずれか一項に記載のフォールトトレラントシステム。
【請求項8】
前記割り込みは、ネットワーク送受信処理を含む、請求項1からまでのいずれか一項に記載のフォールトトレラントシステム。
【発明の詳細な説明】
【技術分野】
【0001】
本開示は、フォールトトレラントシステムに関する。
【背景技術】
【0002】
従来、プライマリ仮想マシンで入力した擬似割り込みタイミングを正確にセカンダリ仮想マシンに伝達し、セカンダリ仮想マシンにおいて同じタイミングで擬似割り込みを入力できるフォールトトレラントシステムが知られている(例えば、特許文献1参照)。
【先行技術文献】
【特許文献】
【0003】
【文献】特開2014-59749号公報
【発明の概要】
【発明が解決しようとする課題】
【0004】
低負荷で動作するフォールトトレラントシステムが求められる。
【0005】
本開示は、上述の点に鑑みてなされたものであり、低負荷で動作できるフォールトトレラントシステムを提供することを目的とする。
【課題を解決するための手段】
【0006】
幾つかの実施形態に係るフォールトトレラントシステムは、バイトコードを実行し、実行したバイトコードに関する情報に基づく同期情報を出力する同期情報生成部と、外部から入力される割り込みを遮断する第1割り込み遮断部とを有するプライマリバーチャルマシンと、前記同期情報に基づいて前記バイトコードを実行する同期実行部と、前記割り込みを遮断する第2割り込み遮断部とを有するセカンダリバーチャルマシンとを備え、前記同期情報生成部は、前記割り込みを取得した場合、前記割り込みに基づいて前記バイトコードを実行し、前記第1割り込み遮断部は、前記バイトコードが前記割り込みを受け付ける命令を含む場合、前記割り込みを受け付ける命令の実行中に入力された前記割り込みを前記同期情報生成部に出力する。このようにすることで、冗長化のための処理量又はプログラムサイズを小さくすることができる。その結果、低負荷で動作できるフォールトトレラントシステムが実現される。
【0007】
一実施形態に係るフォールトトレラントシステムにおいて、前記バイトコードは、実行中に前記割り込みを受け付ける第1命令と実行中に前記割り込みを受け付けない第2命令とを含んでよい。前記第1割り込み遮断部は、前記同期情報生成部が前記第1命令を実行中に入力された前記割り込みを前記同期情報生成部に出力してよく、前記同期情報生成部が前記第2命令を実行中に入力された前記割り込みを前記同期情報生成部に出力しなくてよい。このようにすることで、複雑なタイミング調整を実行することなく、必要に応じて割り込みを受け付けつつ冗長化を実現することができる。その結果、低負荷で動作できるフォールトトレラントシステムが実現される。
【0008】
一実施形態に係るフォールトトレラントシステムにおいて、前記割り込みは、前記第1命令で受け付けられる第1割り込みと、前記第1命令で受け付けられない第2割り込みとを含んでよい。前記第1割り込み遮断部は、前記同期情報生成部が実行中の命令にかかわらず前記第2割り込みを遮断し、前記同期情報生成部が前記第2命令を実行中に前記第1割り込みを遮断してよい。このようにすることで、第2割り込みの遮断が簡単に実行され得る。つまり、割り込み遮断部の処理負荷が低減される。その結果、低負荷で動作できるフォールトトレラントシステムが実現される。
【0009】
一実施形態に係るフォールトトレラントシステムにおいて、前記同期情報は、前記同期情報生成部が実行したバイトコードを特定する情報を含んでよい。このようにすることで、割り込み遮断部は、同期情報に基づいて第1割り込みを遮断するか判定しやすくなる。つまり、割り込み遮断部の処理負荷が低減される。その結果、低負荷で動作できるフォールトトレラントシステムが実現される。
【0010】
一実施形態に係るフォールトトレラントシステムにおいて、前記バイトコードは、外部からデータを取得する入力命令を含んでよい。前記同期情報生成部は、前記入力命令を実行して取得したデータに関する情報を、前記同期情報として出力してよい。このようにすることで、セカンダリバーチャルマシンは、同期情報に基づいて外部から入力されたデータを取得できる。したがって、セカンダリバーチャルマシンを備えるセカンダリマシンが外部と通信しなくてもよくなる。その結果、フォールトトレラントシステム1の負荷が軽減されるとともに、低負荷で動作できるフォールトトレラントシステム1が実現される。
【0011】
一実施形態に係るフォールトトレラントシステムにおいて、前記割り込みは、タイマー処理を含んでよい。このようにすることで、フォールトトレラントシステムは、割り込みを無条件で遮断するのではなく、必要な割り込みを受け付けることができる。その結果、フォールトトレラントシステムの有用性が向上する。
【0012】
一実施形態に係るフォールトトレラントシステムにおいて、前記割り込みは、ネットワーク送受信処理を含んでよい。このようにすることで、フォールトトレラントシステムは、割り込みを無条件で遮断するのではなく、必要な割り込みを受け付けることができる。その結果、フォールトトレラントシステムの有用性が向上する。
【発明の効果】
【0013】
本開示によれば、低負荷で動作できるフォールトトレラントシステムが提供される。
【図面の簡単な説明】
【0014】
図1】比較例に係るフォールトトレラントシステムを示すブロック図である。
図2】一実施形態に係るフォールトトレラントシステムの構成例を示すブロック図である。
図3】ネットワーク処理部の構成例を示すブロック図である。
図4】バイトコードを実行する構成例を示すブロック図である。
図5】バイトコードを実行する手順の一例を示すフローチャートである。
図6】セカンダリVMがバイトコードを引き続き実行する手順の一例を示すフローチャートである。
図7】他の実施形態に係るフォールトトレラントシステムの構成例を示すブロック図である。
【発明を実施するための形態】
【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は、擬似割り込み生成部822と、同期情報生成部824とを含む。プライマリマシン800は、プライマリVM820上でプライマリゲストOS812及びアプリケーション810を動作させる。
【0017】
セカンダリマシン900は、ハードウェア940を備え、ハードウェア940上でセカンダリOS930又はハイパーバイザを動作させる。セカンダリマシン900は、セカンダリOS930上又はハイパーバイザ上でセカンダリVM920を動作させる。セカンダリVM920は、擬似割り込み入力変換部922と、同期補正部924とを含む。セカンダリマシン900は、セカンダリVM920上で、セカンダリゲストOS912及びアプリケーション910を動作させる。
【0018】
プライマリマシン800及びセカンダリマシン900は、アプリケーション810及びアプリケーション910の処理が同じ処理となるように、アプリケーション810及びアプリケーション910を動作させる。このようにすることで、プライマリマシン800に障害が発生した場合、セカンダリマシン900が処理を引き継ぐことができる。アプリケーション810及び910は、区別されない場合、単にアプリケーションと称される。
【0019】
ハードウェア840は、CPU(Central Processing Unit)842と、メモリ844と、NIC(Network Interface Controller)846とを備える。ハードウェア940は、CPU942と、メモリ944と、NIC946とを備える。ハードウェア840及び940は、区別されない場合、単にハードウェアと称される。
【0020】
CPU842及び942は、互いに同一又は類似の構成であってよい。CPU842及び942は、1つ以上のプロセッサで構成されてよい。プロセッサは、所定のプログラムを実行することによって、種々の機能を実現してよい。プロセッサは、メモリ844及び944からプログラムを取得してもよいし、ネットワーク300からプログラムを取得してもよい。CPU842及び942は、区別されない場合、単にCPUと称される。
【0021】
メモリ844及び944は、互いに同一又は類似の構成であってよい。メモリ844及び944は、例えば半導体メモリ等で構成されてよいし、磁気ディスク等の記憶媒体で構成されてもよい。メモリ844及び944はそれぞれ、CPU842及び942のワークメモリとして機能してよい。メモリ844及び944は、CPU842及び942に含まれてもよい。メモリ844及び944は、区別されない場合、単にメモリと称される。
【0022】
NIC846及び946は、互いに同一又は類似の構成であってよい。NIC846及び946は、LAN(Local Area Network)等の通信インタフェースを含んで構成されてよい。NIC846及び946は、区別されない場合、単にNICと称される。
【0023】
プライマリVM820は、擬似割り込み生成部822と、同期情報生成部824とを備える。擬似割り込み生成部822は、プライマリOS830又はハイパーバイザに対して実際に入力された外部からの割り込みに対して、割り込みの頻度又はタイミングを調整した擬似割り込みを生成し、アプリケーション810に入力する。同期情報生成部824は、プライマリVM820におけるアプリケーション810の実行状況をセカンダリVM920に伝えるための同期情報を生成し、セカンダリVM920に送信する。
【0024】
セカンダリVM920は、擬似割り込み入力変換部922と、同期補正部924とを備える。擬似割り込み入力変換部922は、プライマリVM820の同期情報生成部824から取得した同期情報のタイミングに合わせてアプリケーション910に擬似割り込みを入力する。同期補正部924は、プライマリVM820から同期情報を受信し、プライマリVM820におけるアプリケーション810の実行状況に同期してアプリケーション910を実行する。
【0025】
比較例に係るフォールトトレラントシステム9において、プライマリVM820に対して外部からの割り込みが発生すると、割り込みが発生したタイミングとそのデータとを含む同期情報がセカンダリVM920に送信される。セカンダリVM920は、プライマリVM820より少し遅れて動作し、受信した同期情報と同じタイミングでデータ又は割り込みを擬似的に入力する。これによって、プライマリVM820とセカンダリVM920とは、同期して同じ動作を実行できる。
【0026】
ここで、プライマリVM820とセカンダリVM920との間で外部割り込みを同期させるために、以下の処理が必要となる。まず、プライマリVM820において、割り込みが入力されたタイミングが計測される。具体的には、CPUの機能を利用して、コンピュータ起動時点からの実行命令数等としてタイミングが計測される。次に、セカンダリVM920は、任意のタイミングで割り込みを入力するために、指定した実行命令数で仮想マシンの処理を一時中断し、擬似的な割り込みを入力し、仮想マシンの動作を再開させる。これらの処理による外部割り込みの同期処理は、CPUに過大な処理負荷を与える処理であり、CPUの処理能力に依存する処理となっている。例えば、指定したタイミングで処理を中断できない場合があるため、プライマリVM820の処理を中断するタイミングを調整する機能が必要とされる。タイミング調整は、CPUの機能に依存した複雑な処理を行っているため、組み込みプロセッサで動作させるためには、対象プロセッサに合わせた調整方法が実装される必要がある。
【0027】
また、中間言語プログラムとしてJava(登録商標)等の高機能なプログラミング言語が用いられる場合、マルチスレッドで効率よく動作することが可能であるが、スレッド間の処理の同期が必要である。また、高機能であるために中間言語の実行環境のプログラムサイズが大きくなる。組み込み機器は、メモリサイズが限られるため、シンプルで軽量な実行環境が必要となる。なお、中間言語の実行環境は、一般的に「バーチャルマシン」と呼ばれる。例えば、Java(登録商標)の中間言語の実行環境はJavaVMと呼ばれる。ここで、「JavaVM」は、「VM」という記載を含むものの、プライマリVM820又はセカンダリVM920の「VM」とは異なる。よって、「JavaVM」は、「中間言語の実行環境」と表されるとする。
【0028】
また、特開2003-36101号公報に記載されているように、外部との間のデータの入出力のタイミングで同期をとることも可能である。しかし、入出力のタイミングで同期をとる手法において、フォールトトレラントシステム9で実現する冗長化機能の対象アプリケーションが、例えばIEC61131-3規格等のPLC制御用プログラミング言語に限定される。また、データ等値化のために専用のシステムバスでコントローラが結合される必要がある。
【0029】
以上述べてきたように、比較例に係るフォールトトレラントシステム9において、冗長化の機能を実現するためには、ハードウェアの負荷が過大になっていた。また、汎用コンピュータで汎用プログラミング言語を用いて冗長化の機能を実現することも求められていた。
【0030】
そこで、本開示は、低負荷で動作できるフォールトトレラントシステム1(図2参照)について説明する。
【0031】
(実施形態)
図2に示されるように、本開示の一実施形態に係るフォールトトレラントシステム1は、プライマリマシン100と、セカンダリマシン200とを備える。プライマリマシン100とセカンダリマシン200とは、ネットワーク300を介して通信可能に接続される。プライマリマシン100とセカンダリマシン200とは、両方とも同じ処理を実行する。プライマリマシン100に障害が発生した場合、セカンダリマシン200が処理を引き継ぐ。このようにすることで、フォールトトレラントシステム1全体として、処理が継続される。
【0032】
プライマリマシン100は、ハードウェア140を備え、ハードウェア140上でプライマリOS(Operating System)130を動作させる。プライマリマシン100は、プライマリOS130上でプライマリバーチャルマシン120を動作させる。以下、プライマリバーチャルマシン120は、プライマリVM(Virtual Machine)120と称される。プライマリVM120は、割り込み遮断部122と、同期情報生成部124とを有する。プライマリマシン100は、プライマリVM120上でアプリケーション110を動作させる。
【0033】
セカンダリマシン200は、ハードウェア240を備え、ハードウェア240上でセカンダリOS230を動作させる。セカンダリマシン200は、セカンダリOS230上でセカンダリバーチャルマシン220を動作させる。以下、セカンダリバーチャルマシン220は、セカンダリVM220と称される。セカンダリVM220は、割り込み遮断部222と、同期実行部224とを有する。セカンダリマシン200は、セカンダリVM220上で、アプリケーション210を動作させる。
【0034】
プライマリマシン100及びセカンダリマシン200は、アプリケーション110及びアプリケーション210の処理が同じ処理となるように、アプリケーション110及びアプリケーション210を動作させる。このようにすることで、プライマリマシン100に障害が発生した場合、セカンダリマシン200が処理を引き継ぐことができる。アプリケーション110及び210は、区別されない場合、単にアプリケーションと称される。
【0035】
(構成例)
ハードウェア140は、CPU(Central Processing Unit)142と、メモリ144と、NIC(Network Interface Controller)146とを備える。ハードウェア240は、CPU242と、メモリ244と、NIC246とを備える。ハードウェア140及び240は、区別されない場合、単にハードウェアと称される。
【0036】
CPU142及び242は、互いに同一又は類似の構成であってよい。CPU142及び242は、1つ以上のプロセッサで構成されてよい。プロセッサは、所定のプログラムを実行することによって、種々の機能を実現してよい。プロセッサは、メモリ144及び244からプログラムを取得してもよいし、ネットワーク300からプログラムを取得してもよい。CPU142及び242は、区別されない場合、単にCPUと称される。
【0037】
メモリ144及び244は、互いに同一又は類似の構成であってよい。メモリ144及び244は、例えば半導体メモリ等で構成されてよいし、磁気ディスク等の記憶媒体で構成されてもよい。メモリ144及び244はそれぞれ、CPU142及び242のワークメモリとして機能してよい。メモリ144及び244は、CPU142及び242に含まれてもよい。メモリ144及び244は、区別されない場合、単にメモリと称される。
【0038】
NIC146及び246は、互いに同一又は類似の構成であってよい。NIC146及び246は、LAN(Local Area Network)等の通信インタフェースを含んで構成されてよい。NIC146及び246は、区別されない場合、単にNICと称される。
【0039】
プライマリVM120は、割り込み遮断部122と、同期情報生成部124とを備える。割り込み遮断部122は、プライマリOS130に対して入力される外部からの割り込みを、アプリケーション110の実行処理から遮断する。プライマリVM120の割り込み遮断部122は、第1割り込み遮断部とも称される。同期情報生成部124は、プライマリVM120におけるアプリケーション110の実行状況をセカンダリVM220に伝えるための同期情報を生成し、セカンダリVM220に送信する。
【0040】
セカンダリVM220は、割り込み遮断部222と、同期実行部224とを備える。割り込み遮断部222は、セカンダリOS230に対して入力される外部からの割り込みを、アプリケーション210の実行処理から遮断する。セカンダリVM220の割り込み遮断部222は、第2割り込み遮断部とも称される。同期実行部224は、プライマリVM120から同期情報を受信し、プライマリVM120におけるアプリケーション110の実行状況に同期してアプリケーション210を実行する。
【0041】
プライマリVM120及びセカンダリVM220は、必須ではないが、それぞれネットワーク処理部150及び250を備える。ネットワーク処理部150及び250は、ネットワーク300からデータを受信したり、ネットワーク300にデータを送信したりする。ネットワーク処理部150は、図3に例示されるように、ネットワークプロトコルスタック152と、外部通信用仮想NIC154と、同期通信用仮想NIC156と、仮想L2SW(Layer 2 Switch)158とを備える。ネットワーク処理部150が備える各構成の説明は、後述される。ネットワーク処理部250は、ネットワーク処理部150と同一又は類似に構成される。
【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】
VMは、汎用のプログラミング言語処理系として実現されてよい。汎用のプログラミング言語処理系は、例えば、mruby又はMicro Python等を含んでよい。mrubyは、組み込みシステム向けの軽量なRuby言語処理系であり、省メモリの環境でも動作できる。Rubyの処理系は、主にインタプリタとして実装される。ソースコードは、プログラムの実行時又はプログラムの実行前にバイトコードにコンパイルされる。インタプリタは、バイトコードを1命令ずつ実行する。
【0045】
プライマリVM120及びセカンダリVM220は、各バイトコードを同じ命令アドレスに格納する。プライマリVM120及びセカンダリVM220は、同じ命令アドレスからバイトコードを取得し、バイトコードに対応する動作を実行する。バイトコードに対応する動作を実行することは、バイトコードを実行するともいう。プライマリVM120は、同期情報生成部124にバイトコードを実行させてよい。セカンダリVM220は、同期実行部224にバイトコードを実行させてよい。プライマリVM120及びセカンダリVM220は、1つのバイトコードに対応する動作を実行する毎に同期をとる。プライマリVM120及びセカンダリVM220は、1つのバイトコードに対応する動作を実行して同期をとった後、次のバイトコードに対応する動作を実行する。このようにすることで、プライマリVM120及びセカンダリVM220は、互いに同期をとりながら処理を進めることができる。
【0046】
バイトコードが外部から入力されるデータを取得したり外部にデータを出力したりする動作に対応する場合、プライマリVM120だけが実際に外部との間でデータの入出力を実行する。一方で、セカンダリVM220は、実際に外部との間でデータの入出力を実行しない。
【0047】
バイトコードが外部から入力されるデータを取得する動作に対応する場合、セカンダリVM220は、外部から入力されるデータを取得する代わりに、プライマリVM120に対して外部から入力されたデータを、プライマリVM120から取得する。バイトコードが外部にデータを出力する動作に対応する場合、セカンダリVM220は、そのバイトコードの実行をスキップする。
【0048】
プライマリVM120は、1つのバイトコードを実行する毎に、セカンダリVM220に対して同期情報を送信する。同期情報は、バイトコードが格納されている命令アドレス、又は、プライマリVM120に対して外部から入力されたデータを含んでよい。同期情報は、実行した命令数を表す情報を含んでもよい。同期情報は、プライマリVM120が実行したバイトコードを特定する情報を含んでもよい。
【0049】
セカンダリVM220は、プライマリVM120から同期情報を受信し、同期情報に基づいてバイトコードの処理を進める。セカンダリVM220は、プライマリVM120から受信した命令アドレス又は実行した命令数に一致するバイトコードの処理を進める。セカンダリVM220は、1つのバイトコードの処理の終了後、次の同期情報をプライマリVM120から受信するまで、処理を中断する。
【0050】
プライマリVM120及びセカンダリVM220は、上述のように同期情報を送受信することによって、バイトコードの処理を同期して進めることができる。
【0051】
mrubyは、VMの省メモリ化を実現するために、処理を簡略化してVMのプログラムサイズを小さくしている。処理を簡略化するための機能の一つは、プログラム処理のシングルスレッド化である。シングルスレッド化は、複数の命令を同時に並列で実行しないとともに、外部からの割り込みによって処理を中断しないように構成されることを意味する。外部からの割り込みによって処理が中断されないことによって、複雑なタイミング調整機能が不要になる。その結果、処理が簡略化される。
【0052】
ここで、VMのレベルでは外部からの割り込みが発生しないとしても、OSのレベルでは外部からの割り込みが発生することがある。したがって、VMでバイトコードを実行している間に外部からの割り込みが発生することがある。しかし、外部からの割り込みによってバイトコードの実行結果は変化しない。
【0053】
プライマリVM120の同期情報生成部124は、プライマリVM120におけるバイトコードの実行に伴って、実行したバイトコードの命令アドレス又は実行命令数を取得する。同期情報生成部124は、プライマリVM120が外部から入力されたデータを取得した場合、そのデータを取得する。同期情報生成部124は、取得した命令アドレス若しくは実行命令数又は外部から入力されたデータを含む同期情報を生成し、セカンダリVM220に送信する。外部から入力されたデータを取得する命令は、入力命令とも称される。同期情報生成部124は、バイトコードとして入力命令を実行することによって外部から入力されたデータを同期情報として出力する。
【0054】
また、同期情報生成部124は、セカンダリVM220に同期情報を送信した後、セカンダリVM220から応答通知を受信するまで、プライマリVM120に次のバイトコードを実行させないようにする。言い換えれば、同期情報生成部124は、セカンダリVM220から応答通知を受信した場合、プライマリVM120が次のバイトコードを実行することを許可する。
【0055】
セカンダリVM220の同期実行部224は、プライマリVM120の同期情報生成部124から同期情報を受信する。同期実行部224は、受信した同期情報に基づいて、セカンダリVM220におけるバイトコードの実行を制御する。例えば、同期実行部224は、同期情報に含まれる命令アドレスに格納されているバイトコードをセカンダリVM220に実行させてよい。同期実行部224は、同期情報に含まれる実行命令数に一致するようにバイトコードをセカンダリVM220に実行させてよい。
【0056】
同期実行部224は、セカンダリVM220で次に実行されるバイトコードが外部から入力されるデータを取得する動作に対応する場合、セカンダリVM220にそのバイトコードの実行をスキップさせる。この場合、同期情報は、外部から入力されたデータを含む。セカンダリVM220は、同期情報に含まれる外部から入力されたデータを、スキップしたバイトコードの実行結果として得られたデータとみなして、次のバイトコードの処理に進む。同期情報が外部から入力されたデータを含むことによって、セカンダリマシン200が外部と通信しなくてもよくなる。このようにすることで、フォールトトレラントシステム1の負荷が軽減される。その結果、低負荷で動作できるフォールトトレラントシステム1が実現される。
【0057】
プライマリVM120の割り込み遮断部122及びセカンダリVM220の割り込み遮断部222は、OSに対して外部から入力される割り込みを遮断する。OSに対して外部から入力される割り込みは、外部割り込みとも称される。外部割り込みは、OS及びVMの機能を実現するCPUから見た外部からの割り込みであってよい。CPUから見た外部からの割り込みは、メモリ又はNICからの割り込みを含んでよいし、ハードウェアの外部からの割り込みを含んでもよい。割り込み遮断部122及び222は、外部割り込みがバイトコードを実行している途中のVMに影響を及ぼさないように外部割り込みを遮断する。
【0058】
プライマリVM120は、遮断した外部割り込みがバイトコードの実行に関連しているか判定する。遮断した外部割り込みがバイトコードの実行に関連していない場合、割り込み遮断部122は、その外部割り込みを捨ててよい。遮断した外部割り込みがバイトコードの実行に関連する場合、割り込み遮断部122は、その外部割り込みをプライマリVM120に送信する。言い換えれば、バイトコードが割り込みを受け付けてその割り込みに基づいて実行される命令である場合、割り込み遮断部122は、その命令の実行中に入力された割り込みをプライマリVM120(同期情報生成部124)に送信する。プライマリVM120は、外部割り込みに基づいてバイトコードを実行してよい。セカンダリVM220は、外部割り込みを受け付けてその割り込みに基づいて実行されるバイトコードを実行しない。したがって、セカンダリVM220の割り込み遮断部222は、全ての外部割り込みを捨ててよい。
【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が上述のバイトコードを同期させながら実行する構成が図4及び図5を参照しながら説明される。
【0061】
図4に示されるように、プライマリマシン100及びセカンダリマシン200は、ネットワーク300を介して外部機器500と通信可能に接続される。プライマリマシン100は、外部機器500から入力データを取得する。プライマリマシン100は、外部機器500に出力データを出力する。プライマリマシン100は、セカンダリマシン200に同期情報を送信する。プライマリマシン100は、外部機器500から入力データを取得した場合、入力データを含む同期情報をセカンダリマシン200に出力する。
【0062】
仮にプライマリマシン100で障害が発生した場合、セカンダリマシン200がバイトコードの実行を継続できる。セカンダリマシン200は、プライマリマシン100が動作している間、外部機器500と通信しないものの、プライマリマシン100が障害で停止した場合、外部機器500と通信してデータを入出力できる。
【0063】
プライマリVM120及びセカンダリVM220は、図5に示される手順で、上述のバイトコードを実行する。
【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に対応する動作として、外部機器500から入力データとして文字列「Y」を取得し、第2レジスタに代入する。プライマリVM120は、ステップS12の手順でコードBを実行した後、外部機器500からの入力データである文字列「Y」を含む同期情報BをセカンダリVM220に送信する。
【0067】
セカンダリVM220は、プライマリVM120から同期情報Bを受信した場合、同期情報Bに基づいてコードBを実行する(ステップS22)。セカンダリVM220は、コードBに対応する動作として、外部機器500から入力データを取得する代わりに、同期情報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レジスタの文字列を外部機器500に出力する。この場合、外部機器500が取得する文字列は「XY」となっている。プライマリVM120は、ステップS14の手順でコードDを実行した後、同期情報DをセカンダリVM220に送信する。
【0071】
セカンダリVM220は、プライマリVM120から同期情報Dを受信した場合、同期情報Dに基づいてコードDを実行する(ステップS24)。セカンダリVM220は、コードDに対応する動作として、外部機器500に対して第1レジスタの文字列を出力せず、何も実行しない。つまり、セカンダリVM220は、コードDに対応する動作をスキップする。セカンダリVM220は、ステップS24の手順でコードDの実行として対応する動作をスキップした後、コードDの実行を完了したことを表す応答をプライマリVM120に送信する。
【0072】
セカンダリVM220は、コードDの実行を完了したことを表す応答をプライマリVM120に送信した後、一連のバイトコードの実行を終了する。プライマリVM120は、セカンダリVM220から応答を受信することによって、一連のバイトコードの実行を終了する。
【0073】
図4及び図5を参照して説明してきたように、プライマリVM120及びセカンダリVM220は、互いに同期をとりながらバイトコードを実行できる。プライマリVM120が一連のバイトコードの実行の途中で障害によって停止した場合でも、セカンダリVM220がバイトコードを引き続き実行できる。セカンダリマシン200は、ネットワーク300を介して外部機器500に通信可能に接続されることによって、データを入出力する動作に対応するバイトコードも引き続き実行できる。
【0074】
フォールトトレラントシステム1において、プライマリマシン100及びセカンダリマシン200が両方とも正常に動作している場合、処理の冗長化が実現される。ここで、プライマリマシン100又はセカンダリマシン200が障害によって停止する場合におけるフォールトトレラントシステム1の動作が説明される。
【0075】
<プライマリマシン100の障害が発生する場合>
プライマリマシン100の障害が発生した場合、プライマリVM120は、バイトコードの実行等の制御処理を正常に実行できなくなることがある。フォールトトレラントシステム1は、バイトコードの実行等の制御処理を、プライマリマシン100のプライマリVM120からセカンダリマシン200のセカンダリVM220に切り替える。フォールトトレラントシステム1は、セカンダリマシン200だけが動作するシングル運転の状態となる。シングル運転の状態において、プライマリVM120の動作を代替するセカンダリVM220は、プライマリVM120との同期処理を停止する。
【0076】
プライマリVM120は、プライマリマシン100の障害を検出できた場合、セカンダリVM220への障害通知の送信を試みつつ、プライマリマシン100を停止させたり再起動させたりする。障害通知は、同期情報と同じ通信経路で送信されてよい。プライマリVM120がセカンダリVM220へ障害通知を送信できた場合、セカンダリVM220は、プライマリVM120から障害通知を受信することによってプライマリマシン100で障害が発生したことを把握する。プライマリVM120がセカンダリVM220へ障害通知を送信できなかった場合、セカンダリVM220は、プライマリマシン100を監視する手段によってプライマリマシン100で障害が発生したことを把握してよい。セカンダリVM220は、プライマリマシン100で障害が発生したことを把握した場合、バイトコードの実行等の制御処理をプライマリVM120から引き継ぐとともに、プライマリマシン100との同期処理を停止する。また、セカンダリVM220は、セカンダリOS230を介して、プライマリVM120の代わりに外部との間のデータの入出力処理を実行する。
【0077】
プライマリVM120がプライマリマシン100の障害を検出できなかった場合、プライマリマシン100はそのまま停止する。セカンダリVM220は、プライマリマシン100を監視する手段によってプライマリマシン100で障害が発生したことを把握してよい。セカンダリVM220は、プライマリマシン100で障害が発生したことを把握した場合、バイトコードの実行等の制御処理をプライマリVM120から引き継ぐとともに、プライマリマシン100との同期処理を停止する。
【0078】
<セカンダリマシン200の障害が発生する場合>
セカンダリマシン200の障害が発生した場合、フォールトトレラントシステム1は、プライマリマシン100だけが動作するシングル運転の状態となる。シングル運転の状態において、プライマリVM120は、セカンダリVM220との同期処理を停止する。
【0079】
セカンダリVM220は、セカンダリマシン200の障害を検出できた場合、プライマリVM120への障害通知の送信を試みつつ、セカンダリマシン200を停止させたり再起動させたりする。障害通知は、同期情報と同じ通信経路で送信されてよい。セカンダリVM220がプライマリVM120へ障害通知を送信できた場合、プライマリVM120は、セカンダリVM220から障害通知を受信することによってセカンダリマシン200で障害が発生したことを把握する。セカンダリVM220がプライマリVM120へ障害通知を送信できなかった場合、プライマリVM120は、セカンダリマシン200を監視する手段によってセカンダリマシン200で障害が発生したことを把握してよい。プライマリVM120は、セカンダリマシン200で障害が発生したことを把握した場合、バイトコードの実行等の制御処理におけるセカンダリマシン200との同期処理を停止する。プライマリVM120は、同期情報生成部124の動作を停止することによって同期処理を停止してもよい。
【0080】
セカンダリVM220がセカンダリマシン200の障害を検出できなかった場合、セカンダリマシン200はそのまま停止する。プライマリVM120は、セカンダリマシン200を監視する手段によってセカンダリマシン200で障害が発生したことを把握してよい。プライマリVM120は、セカンダリマシン200で障害が発生したことを把握した場合、バイトコードの実行等の制御処理におけるセカンダリマシン200との同期処理を停止する。
【0081】
プライマリVM120がセカンダリマシン200を監視する手段、又は、セカンダリVM220がプライマリマシン100を監視する手段は、例えば以下のようにして実現され得る。
【0082】
例えば、プライマリVM120とセカンダリVM220とは、互いにハートビート等の死活監視のための定期的な通信を実行してよい。プライマリVM120は、セカンダリVM220からの応答がない場合に、セカンダリマシン200の障害が発生したと判定してよい。セカンダリVM220は、プライマリVM120からの応答がない場合に、プライマリマシン100の障害が発生したと判定してよい。セカンダリVM220は、同期処理におけるプライマリVM120からの同期情報の受信によって、プライマリマシン100に障害が発生していないと判定してもよい。プライマリVM120は、同期処理におけるセカンダリVM220からの応答の受信によって、セカンダリマシン200に障害が発生していないと判定してもよい。
【0083】
例えば、プライマリマシン100及びセカンダリマシン200とは異なる第3のマシンが、プライマリマシン100及びセカンダリマシン200の動作を監視してもよい。第3のマシンは、プライマリマシン100で発生した障害をセカンダリVM220に通知してもよいし、セカンダリマシン200で発生した障害をプライマリVM120に通知してもよい。第3のマシンは、プライマリVM120及びセカンダリVM220との間でハートビート等の死活監視のための定期的な通信を実行してもよい。
【0084】
プライマリVM120及びセカンダリVM220は、死活監視のための通信がネットワーク障害によって途絶することによって、プライマリマシン100及びセカンダリマシン200の障害が発生したと誤って判定することがある。ネットワーク障害によるプライマリマシン100及びセカンダリマシン200の障害の誤検出を避けるために、死活監視のための通信経路が多重化されてもよい。
【0085】
ここで、プライマリマシン100の障害が発生した場合のフォールトトレラントシステム1の動作の一例が説明される。セカンダリVM220は、例えば図6に示されるフローチャートの手順を実行することによって、プライマリVM120が障害によって停止した場合に、バイトコードを引き続き実行してもよい。
【0086】
プライマリマシン100の障害が発生したとする(ステップS31)。プライマリVM120は、プライマリマシン100の障害を検出したか判定する(ステップS32)。
【0087】
プライマリVM120は、プライマリマシン100の障害を検出しなかった場合(ステップS32:NO)、ステップS35の手順に進む。プライマリVM120は、プライマリマシン100の障害を検出した場合(ステップS32:YES)、プライマリマシン100で障害が発生したことをセカンダリVM220に通知可能か判定する(ステップS33)。つまり、プライマリVM120は、セカンダリVM220に障害通知を送信可能か判定する。
【0088】
プライマリVM120は、セカンダリVM220に障害通知を送信可能でない場合(ステップS33:NO)、ステップS35の手順に進む。プライマリVM120は、セカンダリVM220に障害通知を送信可能である場合(ステップS33:YES)、セカンダリVM220に障害通知を送信する(ステップS34)。
【0089】
プライマリVM120は、プライマリマシン100を停止又は再起動する(ステップS35)。プライマリVM120がプライマリマシン100の障害を検出しなかった場合、プライマリマシン100はそのまま停止する。プライマリVM120は、障害通知を送信できないと判定した後、又は、障害通知を送信した後において、プライマリマシン100を停止してもよいし、プライマリマシン100を再起動してもよい。プライマリマシン100が停止又は再起動されることによって、プライマリマシン100とセカンダリマシン200とが両方ともプライマリマシン100として動作することが避けられる。プライマリVM120は、ステップS35の手順の実行後、図6のフローチャートの手順の実行を終了する。
【0090】
セカンダリVM220は、プライマリVM120から障害通知を受信したか判定する(ステップS41)。
【0091】
セカンダリVM220は、プライマリVM120から障害通知を受信した場合(ステップS41:YES)、ステップS45の手順に進む。セカンダリVM220は、プライマリVM120から障害通知を受信していない場合(ステップS41:NO)、プライマリVM120からの応答を受信したか判定する(ステップS42)。セカンダリVM220は、プライマリVM120から応答を受信しない場合(ステップS42:NO)、ステップS45の手順に進む。セカンダリVM220は、プライマリVM120から応答を受信した場合(ステップS42:YES)、プライマリマシン100が正常に動作していると判定する(ステップS43)。セカンダリVM220は、プライマリマシン100が正常に動作している場合、セカンダリVM220としての動作を継続する(ステップS44)。セカンダリVM220は、ステップS44の手順の実行後、図6のフローチャートの手順の実行を終了する。
【0092】
セカンダリVM220は、ステップS41の手順でプライマリVM120から障害通知を受信した場合、又は、ステップS42の手順でプライマリVM120から応答を受信しなかった場合、プライマリマシン100の障害が発生していると判定する(ステップS45)。セカンダリVM220は、プライマリマシン100の障害が発生した場合、プライマリVM120の動作を代替し、バイトコードの実行を継続する(ステップS46)。具体的には、セカンダリVM220の同期実行部224は、プライマリVM120からの同期情報の受信待ちを停止することによって、プライマリVM120との同期処理を停止する。セカンダリVM220は、プライマリVM120が次に実行する予定であったバイトコードを、プライマリVM120の代わりに実行する。例えば、プライマリVM120が外部からのデータ入力を受け付けるバイトコードを実行する予定であった場合、セカンダリVM220は、プライマリVM120の代わりに外部からのデータ入力を受け付ける。セカンダリVM220の割り込み遮断部222は、プライマリVM120の割り込み遮断部122と同様の処理を実行する。セカンダリVM220は、ステップS46の手順の実行後、図6のフローチャートの手順の実行を終了する。
【0093】
フォールトトレラントシステム1は、図6に例示したフローチャートの手順を実行することで、プライマリマシン100に障害が発生しても、セカンダリマシン200でバイトコードの実行等の制御処理を継続できる。図6の手順に続いて、セカンダリマシン200が制御処理を継続している間にプライマリマシン100の障害が解消した場合、フォールトトレラントシステム1は、シングル動作の状態から冗長化処理の状態に戻ることができる。具体的には、セカンダリVM220は、プライマリマシン100の障害が発生する前の動作に戻る。プライマリVM120は、プライマリマシン100の障害が発生していた間にセカンダリVM220が処理した情報を同期情報として受信し、プライマリVM120としての動作をセカンダリVM220から引き継ぐ。または、プライマリVM120とセカンダリVM220が機能を入れ替えて動作してもよい。
【0094】
以上述べてきたように、本実施形態に係るフォールトトレラントシステム1は、複雑なタイミング調整を実行することなく、プライマリマシン100とセカンダリマシン200との間で同期をとりながらバイトコードを実行させることができる。このようにすることで、プライマリマシン100及びセカンダリマシン200の冗長化を実現するための処理負荷が低減される。つまり、冗長化のための処理量又はプログラムサイズが小さくされる。その結果、低負荷で動作できるフォールトトレラントシステム1が実現される。言い換えれば、フォールトトレラントシステム1は、プライマリマシン100及びセカンダリマシン200として処理性能が低いプロセッサを用いた場合であっても冗長化を実現できる。
【0095】
(割り込み処理の例)
バイトコードは、実行中に外部割り込みを受け付ける命令と、実行中に外部割り込みを受け付けない命令とに分類される。実行中に外部割り込みを受け付ける命令は、処理の実行に応じた外部割り込みが発生する命令に対応し、割り込み命令又は第1命令とも称される。実行中に外部割り込みを受け付けない命令は、処理の実行に応じた外部割り込みが発生しない命令に対応し、非割り込み命令又は第2命令とも称される。上述した、バイトコードを特定する情報は、バイトコードが割り込み命令に該当するか非割り込み命令に該当するかを特定してもよい。
【0096】
割り込み命令は、例えば、ネットワーク送受信命令、ストレージ読み書き命令、又は、タイマー処理に関する命令等を含む。VMの機能を実現するCPUは、割り込み命令を処理する場合、処理を開始してから終了するまでに時間がかかる場合がある。また、割り込み命令の処理にCPU以外のメモリ又はNICが利用されることがあるので、CPUは、処理完了がわからないことがある。この場合、CPUは、割り込み命令の処理の完了を、メモリ又はNICからの割り込みによって把握できる。したがって、CPUは、外部割り込みを受信することによって割り込み命令の実行を終了できる。
【0097】
非割り込み命令は、例えば、レジスタへ値を代入する処理、又は、四則演算処理等を含む。CPUは、外部割り込みにかかわらず、非割り込み命令の実行を終了できる。
【0098】
以下、割り込み命令の具体例が説明される。
【0099】
<ネットワーク送受信処理に関する命令>
NICは、ネットワーク300からのデータの受信を完了した場合、又は、ネットワーク300へのデータの送信を完了した場合に、外部割り込みを発行する。OSは、外部割り込みを受け付けると、他の処理を中断して、NICで受信したデータをNICから読み出したり、NICに送信させるデータをNICに書き込んだりする。
【0100】
CPUによって実現されるOS及びVMは、ネットワーク送受信に関する命令を、以下にステップS51からS56までの手順として示される動作で実行する。
S51:VMは、ネットワーク送受信に関する命令に対応するバイトコードの実行を開始する。
S52:VMは、OSのネットワーク送受信に関する命令(システムコール)を実行し、完了するまで待つ。
S53:OSは、NICとの間でデータを送受信し、NICから外部割り込みを受信する。外部割り込みは、NICが外部からデータを受信した場合、又は、NICが外部にデータを送信した場合に発生する。
S54:OSは、VMとの間でデータを送受信し、VMに外部割り込みを通知する。
S55:VMは、外部割り込みによってネットワーク送受信命令の処理が完了したことを把握し、システムコールから復帰する。また、プライマリVM120は、外部割り込みを受けた場合に、外部割り込みを同期情報生成部124に出力し、同期情報生成部124で外部割り込みに関する情報を含む同期情報を生成し、セカンダリVM220に送信する。
S56:VMは、送受信したデータに対して必要な処理を実行し、ネットワーク送受信に関する命令に対応するバイトコードの実行を終了する。
【0101】
上述したステップS51からS56までの手順が実行されることによって、ネットワーク送受信命令に対応するバイトコードをVMが実行している間に発生した外部割り込みは、VM内で処理され、アプリケーションに通知されない。NICが発行する外部割り込みがVM内で処理されることによって、フォールトトレラントシステム1は、割り込みを無条件で遮断するのではなく、必要な割り込みを受け付けることができる。その結果、フォールトトレラントシステム1の有用性が向上する。
【0102】
<タイマー処理に関する命令>
ハードウェアは、タイマーを更に備えるとする。タイマーは、設定された時間に応じて外部割り込みを発行する。タイマーは、一定の周期で外部割り込みを発行するように設定されてよい。タイマーは、1回毎に設定される時間に応じて外部割り込みを発行してもよい。
【0103】
CPUによって実現されるOS及びVMは、タイマー処理に関する命令を、以下にステップS61からS67までの手順として示される動作で実行する。
S61:VMは、タイマー処理に関する命令に対応するバイトコードの実行を開始する。
S62:VMは、OSのタイマー命令(システムコール)を実行し、完了するまで待つ。
S63:OSは、タイマーに待ち時間(インターバル)を設定する。
S64:OSは、タイマーに設定された時間が経過した後にタイマーが発行する外部割り込みを受信する。
S65:OSは、VMに外部割り込みを通知する。
S66:VMは、外部割り込みによってタイマー処理が完了したことを把握し、システムコールから復帰する。また、プライマリVM120は、外部割り込みを受けた場合に、外部割り込みを同期情報生成部124に出力し、同期情報生成部124で外部割り込みに関する情報を含む同期情報を生成し、セカンダリVM220に送信する。
S67:VMは、タイマーに対して必要な処理を実行し、タイマー処理に関する命令に対応するバイトコードの実行を終了する。
【0104】
上述したステップS61からS67までの手順が実行されることによって、タイマー処理に関する命令に対応するバイトコードをVMが実行している間に発生した外部割り込みは、VM内で処理され、アプリケーションに通知されない。タイマーが発行する外部割り込みがVM内で処理されることによって、フォールトトレラントシステム1は、割り込みを無条件で遮断するのではなく、必要な割り込みを受け付けることができる。その結果、フォールトトレラントシステム1の有用性が向上する。
【0105】
以上、ネットワーク送受信命令又はタイマー処理に関する命令を実行する構成について説明してきたとおり、フォールトトレラントシステム1は、複雑なタイミング調整を実行することなく、必要に応じて割り込みを受け付けつつ冗長化を実現することができる。このようにすることで、CPUの処理負荷が低減される。その結果、CPUとして処理性能が低いプロセッサを用いた場合であっても冗長化を実現できる。また、フォールトトレラントシステム1は、アプリケーションの処理に影響を及ぼさずに外部割り込みを処理できる。
【0106】
例示したネットワーク処理に関する命令は、NICが発行する割り込みを受け付けるものの、他の割り込みを受け付けない。また、タイマー処理に関する命令は、タイマーが発行する割り込みを受け付けるものの、他の割り込みを受け付けない。つまり、種々の割り込みは、割り込み命令が受け付ける割り込みと、割り込み命令が受け付けない割り込みとに分類される。割り込み命令が受け付ける割り込みは、第1割り込みとも称される。割り込み命令が受け付けない割り込みは、第2割り込みとも称される。プライマリVM120の割り込み遮断部122は、プライマリVM120(同期情報生成部124)が割り込み命令(第1命令)を実行中か非割り込み命令(第2命令)を実行中かにかかわらず、第2割り込みを遮断する。一方で、割り込み遮断部122は、プライマリVM120(同期情報生成部124)が非割り込み命令(第2命令)を実行中であれば、第1割り込みを遮断する。このようにすることで、第2割り込みの遮断が簡単に実行され得る。つまり、割り込み遮断部122の処理負荷が低減される。その結果、低負荷で動作できるフォールトトレラントシステム1が実現される。また、プライマリVM120が実行したバイトコードを特定する情報が同期情報に含まれることによって、割り込み遮断部122は、同期情報に基づいて割り込みを遮断するか判定しやすくなる。つまり、割り込み遮断部122の処理負荷が低減される。その結果、低負荷で動作できるフォールトトレラントシステム1が実現される。
【0107】
(他の実施形態)
以下、他のいくつかの実施形態が説明される。
【0108】
<同期タイミング>
プライマリVM120及びセカンダリVM220は、外部との間での入出力を伴う動作に対応するバイトコードを実行する場合に、同期情報を送受信してもよい。この場合、プライマリVM120及びセカンダリVM220は、外部との間で入出力が実行されるタイミングのみ、互いに処理を同期させる。
【0109】
具体的には、外部からの入力があるタイミングのみプライマリVM120からセカンダリVM220へ同期情報を送信する。つまり、セカンダリVM220は、外部からの入力に対応するバイトコードを実行する場合のみプライマリVM120からの同期情報を待つ。また、外部への出力があるタイミングのみセカンダリVM220からプライマリVM120へ応答を送信する。つまり、プライマリVM120は、外部への出力に対応するバイトコードを実行する場合のみセカンダリVM220からの応答を待つ。プライマリVM120及びセカンダリVM220は、その他のバイトコードを実行する場合、互いに待たずにバイトコードを実行してよい。
【0110】
以上説明してきたように、外部との間での入出力を伴う場合にのみ同期させることによって、1つのバイトコードを実行する毎に同期情報と応答とを送受信する場合と比べて、処理の遅延が低減される。
【0111】
<同期情報の送受信方法>
プライマリVM120とセカンダリVM220との間における同期情報の送受信は、例えばイーサネット(登録商標)によって実行されてよい。この場合、プライマリマシン100及びセカンダリマシン200それぞれにIPアドレスが割り当てられる必要がある。
【0112】
IPアドレスを割り当てる1つの方法として、例えば、プライマリマシン100及びセカンダリマシン200に同じIPアドレスが割り当てられてよい。このようにすることで、プライマリマシン100が障害で停止してセカンダリマシン200が処理を引き継いだ場合に、外部機器500は、同じIPアドレスでデータ通信を続けることができる。一方で、プライマリマシン100とセカンダリマシン200との間におけるIP通信が実行できない。そこで、プライマリマシン100とセカンダリマシン200との間の通信は、TCP/IP(Transmission Control Protocol/Internet Protocol)又はUDP/IP(User Datagram Protocol/Internet Protocol)を利用せず、MAC(Media Access Control)アドレスを利用したイーサネット(登録商標)フレーム通信によって実現される。
【0113】
また、IPアドレスを割り当てる他の方法として、例えば、プライマリマシン100及びセカンダリマシン200それぞれに異なるIPアドレスが割り当てられてもよい。このようにすることで、プライマリマシン100とセカンダリマシン200との間の通信は、IP通信によって実現される。一方で、プライマリマシン100が障害で停止してセカンダリマシン200が処理を引き継いだ場合に、外部機器500から見てフォールトトレラントシステム1と通信を続けるためにIPアドレスを切り替える必要がある。
【0114】
例示した2つの方法のどちらにおいても、プライマリマシン100及びセカンダリマシン200それぞれのMACアドレスは、互いに異なる。したがって、外部機器500がフォールトトレラントシステム1と通信を継続するために、MACアドレスを変更する必要がある。ここで、UDP/IP通信が用いられている場合、UDP/IP通信は、コネクションが不要であることから通信を継続できる。一方で、TCP/IP通信が用いられている場合、TCP/IP通信は、TCPコネクションを引き継ぐことができないので再接続する必要がある。
【0115】
<TCP/IP通信の継続>
以下、TCP/IP通信の継続の方法の一例が説明される。図2及び図3で例示したように、プライマリマシン100及びセカンダリマシン200はそれぞれ、必須ではないが、ネットワーク処理部150及び250を更に備える。ネットワーク処理部150及び250は、区別されない場合、単にネットワーク処理部と称される。
【0116】
図2及び図3に例示されるプライマリマシン100及びセカンダリマシン200は、TCP/IP又はUDP/IP等のネットワークプロトコル処理をNICとOSとで実行している。NICのMACアドレスは、ハードウェア毎に固定されている。したがって、プライマリマシン100とセカンダリマシン200との間でMACアドレスが引き継がれない。また、ネットワークプロトコル処理がOS内で行われるので、通信に必要な情報、例えばTCPのコネクション情報等がVMの冗長化機能(一方のVMの停止時に他方のVMで処理を引き継ぐ機能)で引き継がれない。したがって、TCP通信は、VMの冗長化の対象外とされることがある。
【0117】
ここで、プライマリVM120内のネットワーク処理部150は、仮想L2SW158と、外部通信用仮想NIC154と、同期通信用仮想NIC156と、ネットワークプロトコルスタック152とを備える。これによって、通信に必要な情報を引き継ぐために必要な処理をVMが管理できる。外部通信用仮想NIC154及び同期通信用仮想NIC156は、仮想NICとも総称される。
【0118】
具体的には、以下に例示される動作が実行される。
【0119】
VMは、NICをプロミスキャスモードで動作させることによって、全ての受信データを仮想NICに転送する。この場合、NICは、一般のネットワークスイッチ(L2スイッチ)と同様の扱いとなり、ハードウェアで固定されているMACアドレスが通信の切り替えに影響を及ぼさない。
【0120】
仮想L2SWは、NICと仮想NICとの間の通信を中継する。
【0121】
仮想NICにソフトウェアでMACアドレスが設定される。ソフトウェアでMACアドレスが設定されることによって、プライマリVM120の仮想NICとセカンダリVM220の仮想NICとで同じMACアドレスが設定される。仮想NICは、外部通信用仮想NIC154と同期通信用仮想NICI156とを含む。外部通信用仮想NIC154及び同期通信用仮想NICI156それぞれにIPアドレスが割り当てられる。外部通信用仮想NIC154は、外部との通信に用いられる。同期通信用仮想NIC156は、プライマリVM120とセカンダリVM220との間の同期情報の送受信に用いられる。
【0122】
ネットワークプロトコルスタック152は、OSが行っていたネットワークプロトコル処理を行う。具体的には、仮想NICが受信した通信データのネットワーク層(IP)及びトランスポート層(TCP又はUDP)の処理を行う。これによって、TCPコネクション情報等がVM内で管理されることができる。
【0123】
プライマリVM120の同期情報生成部124は、生成した同期情報に加えて、仮想NIC又はネットワークプロトコルスタック152の情報を収集してセカンダリVM220に送信する。これによってTCPコネクション情報が等値化される。その結果、TCP/IP通信の継続が可能となる。
【0124】
図7に示されるように、プライマリマシン100は、プライマリVM120として、第1プライマリVM120Aから第NプライマリVM120Nまでを備える。第1プライマリVM120Aから第NプライマリVM120Nまでは、それぞれ第1アプリケーション110Aから第Nアプリケーション110Nまでの処理を実行する。プライマリマシン100は、ネットワーク処理部150を、プライマリVM120から切り離した構成として備える。
セカンダリマシン200は、セカンダリVM220として、第1セカンダリVM220Aから第NセカンダリVM220Nまでを備える。第1セカンダリVM220Aから第NセカンダリVM220Nまでは、それぞれ第1アプリケーション210Aから第Nアプリケーション210Nまでの処理を実行する。セカンダリマシン200は、ネットワーク処理部250を、セカンダリVM220から切り離した構成として備える。
【0125】
この構成において、プライマリマシン100及びセカンダリマシン200は、ネットワーク処理部をVMから切り離した別のプロセスとして動作させることができる。このようにすることで、フォールトトレラントシステム1は、複数のアプリケーションを同時に処理する場合であっても、通信処理をまとめて処理することができる。この場合、プライマリVM120及びセカンダリVM220の動作は、これまで説明してきた実施形態に係る動作と同じであってよい。
【0126】
以上、本開示に係る実施形態について、図面を参照して説明してきたが、具体的な構成はこの実施形態に限定されるものではなく、本開示の趣旨を逸脱しない範囲においての種々の変更も含まれる。
【符号の説明】
【0127】
1 フォールトトレラントシステム
100 プライマリマシン(110:アプリケーション、110A~110N:第1~第Nアプリケーション、120:プライマリVM、120A~120N:第1~第NプライマリVM、122:割り込み遮断部、124:同期情報生成部、130:プライマリOS)
140 ハードウェア(142:CPU、144:メモリ、146:NIC)
150 ネットワーク処理部(152:ネットワークプロトコルスタック、154:外部通信用仮想NIC、156:同期通信用仮想NIC、158:仮想L2SW)
200 セカンダリマシン(210:アプリケーション、210A~210N:第1~第Nアプリケーション、220:セカンダリVM、220A~220N:第1~第NセカンダリVM、222:割り込み遮断部、224:同期実行部、230:セカンダリOS)
240 ハードウェア(242:CPU、244:メモリ、246:NIC)
250 ネットワーク処理部
300 ネットワーク
500 外部機器
図1
図2
図3
図4
図5
図6
図7