(57)【要約】【課題】データのバックアップを効率的に取得すること。【解決手段】記憶部１ａは、情報処理装置１で動作する仮想マシン１ｃに配置されたデータをキーに対応付けて記憶する。演算部１ｂは、データに対応するキーと仮想マシン１ｃ，２ｃで共通に用いられるハッシュ関数とから算出されるハッシュ値に基づいて記憶装置３に対するデータの格納を担当する仮想マシンを特定する。演算部１ｂは、特定した担当の仮想マシンが仮想マシン１ｃと一致する場合は仮想マシン１ｃを用いてデータを記憶装置３に格納する。演算部１ｂは、特定した担当の仮想マシンが仮想マシン１ｃと一致しない場合は仮想マシン１ｃが記憶装置３にデータを格納しないように制御する。【選択図】図１
2014044553.tif 000002
【特許請求の範囲】
【請求項１】
仮想マシンが動作可能な１または複数のコンピュータを備えておりキーと対応付けられたデータを前記キーに応じた複数の仮想マシンに配置するシステムで、前記データを記憶装置に保存するために用いられるプログラムであって、コンピュータに、
前記コンピュータで動作する第１の仮想マシンに配置された前記データに対応する前記キーと前記複数の仮想マシンで共通に用いられるハッシュ関数とから算出されるハッシュ値に基づいて前記記憶装置への前記データの格納を担当する第２の仮想マシンを特定し、
前記第２の仮想マシンが前記第１の仮想マシンと一致する場合は前記第１の仮想マシンを用いて前記記憶装置に前記データを格納し、また、前記第２の仮想マシンが前記第１の仮想マシンと一致しない場合は前記第１の仮想マシンが前記記憶装置に前記データを格納しないように制御する、処理を実行させるプログラム。
【請求項２】
前記第２の仮想マシンが前記第１の仮想マシンと一致しない場合、前記第２の仮想マシンが稼働中であるか否かを判定し、前記第２の仮想マシンが稼働中であれば前記第１の仮想マシンが前記記憶装置に前記データを格納しないように制御し、また、前記第２の仮想マシンが稼働中でなければ前記第２の仮想マシンの代わりに前記記憶装置に前記データを格納可能な第３の仮想マシンを確認する、請求項１記載のプログラム。
【請求項３】
前記第３の仮想マシンがあれば前記第１の仮想マシンが前記記憶装置に前記データを格納しないように制御し、また、前記第３の仮想マシンがなければ前記第１の仮想マシンを用いて前記記憶装置に前記データを格納するように制御する、請求項２記載のプログラム。
【請求項４】
前記複数の仮想マシンの中から前記第２の仮想マシンを特定する、請求項１乃至３の何れか１項に記載のプログラム。
【請求項５】
前記複数の仮想マシンの数に基づいて前記ハッシュ値を算出する、請求項１乃至４の何れか１項に記載のプログラム。
【請求項６】
仮想マシンが動作可能な１または複数の情報処理装置を備えておりキーと対応付けられたデータを前記キーに応じた複数の仮想マシンに配置するシステムに用いられる情報処理装置であって、
自装置で動作する第１の仮想マシンに配置された前記データを前記キーに対応付けて記憶する記憶部と、
前記データに対応する前記キーと前記複数の仮想マシンで共通に用いられるハッシュ関数とから算出されるハッシュ値に基づいて記憶装置に対する前記データの格納を担当する第２の仮想マシンを特定し、前記第２の仮想マシンが前記第１の仮想マシンと一致する場合は前記第１の仮想マシンを用いて前記データを前記記憶装置に格納し、また、前記第２の仮想マシンが前記第１の仮想マシンと一致しない場合は前記第１の仮想マシンが前記記憶装置に前記データを格納しないように制御する演算部と、を有する情報処理装置。
【請求項７】
仮想マシンが動作可能な１または複数の情報処理装置を備えておりキーと対応付けられたデータを前記キーに応じた複数の仮想マシンに配置する情報処理システムであって、
自装置で動作する第１の仮想マシンに配置された前記データに対応する前記キーと前記複数の仮想マシンで共通に用いられるハッシュ関数とから算出されるハッシュ値に基づいて記憶装置に対する前記データの格納を担当する第２の仮想マシンを特定し、前記第２の仮想マシンが前記第１の仮想マシンと一致する場合は前記第１の仮想マシンを用いて前記データを前記記憶装置に格納し、また、前記第２の仮想マシンが前記第１の仮想マシンと一致しない場合は前記第１の仮想マシンが前記記憶装置に前記データを格納しないように制御する情報処理装置、を有する情報処理システム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明はプログラム、情報処理装置および情報処理システムに関する。
【背景技術】
【０００２】
物理的なコンピュータ（物理マシンや物理ホストと呼ぶことがある）上で、複数の仮想的なコンピュータ（仮想マシンや論理ホストと呼ぶことがある）を動作させることがある。各仮想マシン上では、ＯＳ（Operating System）やアプリケーションなどのソフトウェアを実行できる。物理マシンは、複数の仮想マシンを管理するためのソフトウェアを実行する。例えば、ハイパーバイザと呼ばれるソフトウェアが、ＣＰＵ（Central Processing Unit）の処理能力やＲＡＭ（Random Access Memory）の記憶領域を、演算のリソースとして複数の仮想マシンに割り振ることがある。
【０００３】
ところで、複数の仮想マシンにデータを分散配置することがある。データを分散配置することでデータアクセスの高速化を図れる。データの分散化にはＫＶＳ（Key - Value Store）と呼ばれる手法を用いることがある。ＫＶＳではデータ（ｖａｌｕｅ）にキー（ｋｅｙ）を付与し、キーとデータとのペアを何れかのノード（例えば、仮想マシン）に配置する。保存したデータにアクセスする際はキーを指定する。キーに応じて異なるノードにデータを格納することで、データを分散配置する。あるノードに配置したデータの複製を、隣接ノードにも配置して冗長化することで、ノード故障に耐性を持たせる提案もある。
【０００４】
また、実行系装置と複数の待機系装置とを含むシステムにおいて、実行系装置の主記憶装置上にＤＢ（DataBase）データを配置し、システム停止時に、各待機系装置に接続されたストレージ装置のそれぞれにＤＢデータを分配して保持させる提案もある。この提案では、ＤＢデータのうち各ストレージ装置に保持させる範囲は実行系装置により決定され、各待機系装置に指示される。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２００９−５４３２３７号公報
【特許文献２】特開２０１０−１３４５８３号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
ＫＶＳを用いて複数の仮想マシンにデータを分散配置し、当該データの複製を異なる仮想マシンにも配置して冗長化する場合を考える。仮想マシンの運用では、仮想マシンの停止後に、仮想マシンに割り振られていたリソースを解放することがある。解放されたリソースが保持していたデータは消える。このため、データを冗長化したとしても、当該データを消失する可能性は残る。例えば、当該データが配置された全仮想マシンで同時に障害が起こり、当該全仮想マシンを停止して再作成することもあるからである。そこで、データの複製を、記憶装置などにバックアップとして保存しておきたいということがある。
【０００７】
しかし、この場合、データのバックアップをどのようにして効率的に取得するかが問題となる。例えば、同じデータが配置された複数の仮想マシンそれぞれが当該データを複製して記憶装置に格納することも考えられる。しかし、複数の仮想マシンが同じデータを重複して格納すると、データ転送に余計な通信コストや処理コストを伴い非効率的となる。
【０００８】
一側面によれば、本発明は、データのバックアップを効率的に取得できるプログラム、情報処理装置および情報処理システムを提供することを目的とする。
【課題を解決するための手段】
【０００９】
一実施態様によれば、コンピュータによって実行されるプログラムであって、仮想マシンが動作可能な１または複数のコンピュータを備えておりキーと対応付けられたデータをキーに応じた複数の仮想マシンに配置するシステムで、データを記憶装置に保存するために用いられるプログラムが提供される。このプログラムは、コンピュータで動作する第１の仮想マシンに配置されたデータに対応するキーと複数の仮想マシンで共通に用いられるハッシュ関数とから算出されるハッシュ値に基づいて、記憶装置へのデータの格納を担当する第２の仮想マシンを特定し、第２の仮想マシンが第１の仮想マシンと一致する場合は第１の仮想マシンを用いて記憶装置にデータを格納し、また、第２の仮想マシンが第１の仮想マシンと一致しない場合は第１の仮想マシンが記憶装置にデータを格納しないように制御する、処理をコンピュータに実行させる。
【００１０】
また、一実施態様によれば、仮想マシンが動作可能な１または複数の情報処理装置を備えておりキーと対応付けられたデータをキーに応じた複数の仮想マシンに配置するシステムに用いられる情報処理装置が提供される。この情報処理装置は、記憶部と演算部とを有する。記憶部は、自装置で動作する第１の仮想マシンに配置されたデータをキーに対応付けて記憶する。演算部は、データに対応するキーと複数の仮想マシンで共通に用いられるハッシュ関数とから算出されるハッシュ値に基づいて記憶装置に対するデータの格納を担当する第２の仮想マシンを特定し、第２の仮想マシンが第１の仮想マシンと一致する場合は第１の仮想マシンを用いてデータを記憶装置に格納し、また、第２の仮想マシンが第１の仮想マシンと一致しない場合は第１の仮想マシンが記憶装置にデータを格納しないように制御する。
【００１１】
また、一実施態様によれば、仮想マシンが動作可能な１または複数の情報処理装置を備えておりキーと対応付けられたデータをキーに応じた複数の仮想マシンに配置する情報処理システムが提供される。この情報処理システムは、情報処理装置を有する。情報処理装置は、自装置で動作する第１の仮想マシンに配置されたデータに対応するキーと複数の仮想マシンで共通に用いられるハッシュ関数とから算出されるハッシュ値に基づいて記憶装置に対するデータの格納を担当する第２の仮想マシンを特定し、第２の仮想マシンが第１の仮想マシンと一致する場合は第１の仮想マシンを用いてデータを記憶装置に格納し、また、第２の仮想マシンが第１の仮想マシンと一致しない場合は第１の仮想マシンが記憶装置にデータを格納しないように制御する。
【発明の効果】
【００１２】
一実施態様によれば、データのバックアップを効率的に取得できる。
【図面の簡単な説明】
【００１３】
【図１】第１の実施の形態の情報処理システムを示す図である。
【図２】第２の実施の形態の情報処理システムを示す図である。
【図３】第２の実施の形態の実行サーバのハードウェア例を示す図である。
【図４】第２の実施の形態の仮想マシンの実行例を示す図である。
【図５】第２の実施の形態のソフトウェア例を示す図である。
【図６】第２の実施の形態のハッシュ値の担当範囲の例を示す図である。
【図７】第２の実施の形態のＫＶＳの例を示す図である。
【図８】第２の実施の形態の管理テーブルの例を示す図である。
【図９】第２の実施の形態のバックアップテーブルの例を示す図である。
【図１０】第２の実施の形態の通信データの例を示す図である。
【図１１】第２の実施の形態の関数の処理例を示す図である。
【図１２】第２の実施の形態のセッション更新を示すフローチャートである。
【図１３】第２の実施の形態のバックアップ処理を示すフローチャートである。
【発明を実施するための形態】
【００１４】
以下、本実施の形態を図面を参照して説明する。
［第１の実施の形態］
図１は、第１の実施の形態の情報処理システムを示す図である。第１の実施の形態の情報処理システムは、情報処理装置１，２および記憶装置３を有する。情報処理装置１，２および記憶装置３はネットワークを介して接続されている。情報処理装置１，２では仮想マシンが動作可能である。この情報処理システムは、キーと対応付けられたデータを当該キーに応じた複数の仮想マシンに配置する。記憶装置３は、複数の仮想マシンに配置されたデータを格納するための装置である。例えば、記憶装置３は不揮発性の記憶デバイスを備える。例えば、記憶装置３の不揮発性の記憶デバイスに格納されたデータをバックアップとして利用できる。記憶装置３は情報処理装置１，２の何れかに内蔵されてもよい。
【００１５】
情報処理装置１は、記憶部１ａ、演算部１ｂおよび仮想マシン１ｃ，１ｄを有する。
記憶部１ａは、データを保存できる揮発性または不揮発性のメモリである。記憶部１ａはＲＡＭやＨＤＤ（Hard Disk Drive）を含んでもよい。例えば、情報処理装置１で実行されるハイパーバイザが、記憶部１ａの記憶領域の一部を仮想マシン１ｃのリソースとして割り振る。記憶領域の他の一部を仮想マシン１ｄのリソースとして割り振る。
【００１６】
演算部１ｂは、情報処理装置１における情報処理を実行するプロセッサである。演算部１ｂはＣＰＵでもよい。演算部１ｂの処理能力の一部が仮想マシン１ｃ，１ｄの演算のリソースとして割り振られる。例えば、ハイパーバイザが、演算部１ｂの利用可能時間を時分割した複数のタイムスライスの一部を仮想マシン１ｃに割り振る。複数のタイムスライスの他の一部を仮想マシン１ｄに割り振る。
【００１７】
情報処理装置１は、記憶部１ａ（メモリ）と演算部１ｂ（プロセッサ）とを備えたコンピュータでもよい。
仮想マシン１ｃ，１ｄは、記憶部１ａおよび演算部１ｂから割り振られたリソースを用いて動作する仮想的なコンピュータである。仮想マシン１ｃ，１ｄは、ＯＳやアプリケーションなどのソフトウェアを実行し得る。仮想マシン１ｃ，１ｄは当該ソフトウェアの処理に用いるデータをＫＶＳの手法により複数の仮想マシンに分散配置する。例えば、仮想マシン１ｃにはキー（ｋｅｙ）とバリュー（ｖａｌｕｅ）との組として、（キー，バリュー）＝（ｋｅｙＸ，ｖａｌｕｅＸ），（ｋｅｙＹ，ｖａｌｕｅＹ）が配置されている。なお、バリューはデータに相当する。キー・バリューの組をデータと称してもよい。
【００１８】
情報処理装置２は、記憶部２ａ、演算部２ｂおよび仮想マシン２ｃ，２ｄを有する。記憶部２ａの説明は記憶部１ａと同様であるため省略する。演算部２ｂの説明は記憶部１ａと同様であるため省略する。
【００１９】
仮想マシン２ｃ，２ｄは、記憶部２ａおよび演算部２ｂから割り振られたリソースを用いて動作する仮想的なコンピュータである。仮想マシン２ｃ，２ｄも仮想マシン１ｃ，１ｄと同様にＯＳやアプリケーションなどのソフトウェアを実行し得る。仮想マシン２ｃ，２ｄも当該ソフトウェアの処理に用いるデータをＫＶＳの手法により複数の仮想マシンに分散配置する。
【００２０】
第１の実施の形態では、一例として、同じデータを２つの仮想マシンに配置して冗長化しているものとする。例えば、仮想マシン２ｃには、仮想マシン１ｃに配置されたデータの複製も配置される。具体的には、仮想マシン２ｃにも（キー，バリュー）＝（ｋｅｙＸ，ｖａｌｕｅＸ），（ｋｅｙＹ，ｖａｌｕｅＹ）が配置されて、仮想マシン１ｃ，２ｃでデータが冗長化されている。ここで、冗長化されたデータを指して、冗長データと呼ぶことがある。これらの冗長データを記憶装置３に格納するとき、演算部１ｂ，２ｂは次のような処理を実行する。
【００２１】
演算部１ｂは、仮想マシン１ｃに配置されたデータ“ｖａｌｕｅＸ”に対応するキー“ｋｅｙＸ”と、仮想マシン１ｃ，２ｃで共通に用いられるハッシュ関数（例えば、関数Ｈａｓｈとする）とからハッシュ値“Ｈａｓｈ（ｋｅｙＸ）”を算出する。演算部１ｂは、当該ハッシュ値“Ｈａｓｈ（ｋｅｙＸ）”に基づいて、記憶装置３への当該データの格納を担当する仮想マシンを特定する。データ“ｖａｌｕｅＹ”についても同様である。
【００２２】
ここで、ハッシュ関数とは、入力に対して出力する各ハッシュ値の出現確率が、ほぼ一様に分布するようにした関数である。例えば、ハッシュ関数Ｈａｓｈはキーに対して“０”または“１”をそれぞれほぼ１／２の確率で算出する関数であるとする。この場合、キーに応じたハッシュ値“０”または“１”によって、データの格納を担当する仮想マシンを仮想マシン１ｃ，２ｃにほぼ均等に割り当てることができる。
【００２３】
担当の仮想マシンが仮想マシン１ｃと一致する場合、演算部１ｂは仮想マシン１ｃを用いて記憶装置３に該当のデータを格納するように制御する。上記のハッシュ関数Ｈａｓｈの例でいえば、ハッシュ値“０”であれば担当は仮想マシン１ｃであり、ハッシュ値“１”であれば担当は仮想マシン２ｃである、というように予め決定できるようにしておく。この場合、“Ｈａｓｈ（ｋｅｙＸ）＝０”であれば仮想マシン１ｃが担当である。よって、演算部１ｂは仮想マシン１ｃを用いて“ｖａｌｕｅＸ”を記憶装置３に格納する（“ｋｅｙＸ”との組を格納してもよい）。演算部２ｂは、演算部１ｂと同様の処理を行い、仮想マシン２ｃが“ｖａｌｕｅＸ”を記憶装置３に格納しないように制御することになる。
【００２４】
一方、担当の仮想マシンが仮想マシン１ｃと一致しない場合、演算部１ｂは仮想マシン１ｃが記憶装置３に該当のデータを格納しないように制御する。例えば、“Ｈａｓｈ（ｋｅｙＹ）＝１”であれば、仮想マシン２ｃが担当なので、演算部１ｂは、仮想マシン１ｃが“ｖａｌｕｅＹ”を記憶装置３に格納しないように制御する。演算部２ｂは、演算部１ｂと同様の処理を行い、仮想マシン２ｃを用いて“ｖａｌｕｅＹ”を記憶装置３に格納することになる（“ｋｅｙＹ”との組を格納してもよい）。
【００２５】
情報処理装置１によれば、演算部１ｂにより、情報処理装置１で動作する仮想マシン１ｃに配置されたデータに対応するキーと複数の仮想マシンで共通に用いられるハッシュ関数とから算出されるハッシュ値に基づいて記憶装置３に対する当該データの格納を担当する仮想マシンが特定される。担当の仮想マシンが仮想マシン１ｃと一致する場合は、演算部１ｂにより、仮想マシン１ｃを用いて当該データを記憶装置３に格納するように制御される。また、担当の仮想マシンが仮想マシン１ｃと一致しない場合は、演算部１ｂにより、仮想マシン１ｃが記憶装置３にデータを格納しないように制御される。
【００２６】
これにより、データのバックアップを効率的に取得できる。具体的には、冗長化してデータが配置された複数の仮想マシンの何れかに当該データの記憶装置３への格納を担当させるので、同じデータを複数の仮想マシンが重複して格納する場合に比べて、データ転送のための通信コストや処理コストを削減できる。また、記憶装置３で同じデータを２重に書き込むための処理コストも抑えられる。また、当該担当の仮想マシンが自身であるかを各仮想マシンが自律的に判断できる。よって、担当の仮想マシンがどれであるかを指定するような装置を別途設けなくてもよい。更に、複数の仮想マシンに対して、データ格納の責任をほぼ均等に割り振れる。よって、冗長データが配置された複数の仮想マシンの中でデータ格納に伴う処理負荷をほぼ均等に分散できる。
【００２７】
なお、例えば、仮想マシン１ｃ，１ｄに対してデータを冗長に配置する場合も同様の処理により、仮想マシン１ｃ，１ｄの何れにデータ格納を担当させるかを決定できる。すなわち、第１の実施の形態の情報処理は情報処理装置が１台でも有効である。
【００２８】
また、第１の実施の形態の情報処理は、記憶部１ａ，２ａに記憶されたプログラムを演算部１ｂ，２ｂが実行することでも実現できる。その場合、仮想マシン１ｃ，１ｄ，２ｃ，２ｄに割り当てられたリソースを用いて当該プログラムを実行してもよい。その場合、仮想マシン１ｃ，１ｄ，２ｃ，２ｄで当該プログラムを実行可能となるように組み込んでおく。一方、仮想マシン１ｃ，１ｄ，２ｃ，２ｄに割り当てられたリソース以外のリソースを用いて当該プログラムを実行してもよい。例えば、ハイパーバイザが上記の情報処理を実行してもよい。
【００２９】
［第２の実施の形態］
図２は、第２の実施の形態の情報処理システムを示す図である。第２の実施の形態の情報処理システムは、実行サーバ１００，２００，３００、ストレージサーバ４００、管理サーバ５００、負荷分散装置６００およびクライアント７００，７００ａを含む。実行サーバ１００，２００，３００、ストレージサーバ４００および管理サーバ５００はネットワーク１０に接続されている。実行サーバ１００，２００，３００は負荷分散装置６００に接続されている。負荷分散装置６００およびクライアント７００，７００ａはネットワーク２０に接続されている。
【００３０】
ネットワーク１０，２０は例えばＬＡＮ（Local Area Network）である。ネットワーク１０，２０は、インターネットやＷＡＮ（Wide Area Network）などの広域ネットワークでもよい。
【００３１】
実行サーバ１００，２００，３００は、仮想マシンが動作可能なサーバコンピュータである。実行サーバ１００，２００，３００で動作する仮想マシンは、ユーザの業務に用いるアプリケーションを実行する。ユーザは、クライアント７００，７００ａを用いて当該アプリケーションを利用する。仮想マシンはＷｅｂサーバ機能を有し、当該アプリケーションをＷｅｂアプリケーションとしてユーザに提供する。ユーザは、クライアント７００，７００ａが実行するＷｅｂブラウザを操作して、当該Ｗｅｂアプリケーションを利用する。実行サーバ１００，２００，３００上の複数の仮想マシンそれぞれが、あるユーザに対して同一のＷｅｂアプリケーションを提供することで、各仮想マシンにおける負荷を分散することもできる。
【００３２】
ストレージサーバ４００は、仮想マシンで扱うデータのバックアップを保存するためのサーバコンピュータである。ストレージサーバ４００は不揮発性の記憶装置を備える。当該記憶装置にデータを格納しておけば、電源供給が停止してもデータを保持できる。ストレージサーバ４００はＮＡＳ（Network Attached Storage）でもよい。ネットワーク１０をＳＡＮ（Storage Area Network）とし、ＦＣ（Fibre Channel）などで実行サーバ１００，２００，３００と通信するストレージ装置を、ストレージサーバ４００の代わりに用いてもよい。
【００３３】
管理サーバ５００は、実行サーバ１００，２００，３００上で動作する仮想マシンの起動・停止を制御するサーバコンピュータである。例えば、管理者は管理サーバ５００を操作して、実行サーバ１００，２００，３００に仮想マシンを新たに実行開始させることができる。また、仮想マシンを停止させることもできる。
【００３４】
負荷分散装置６００は、複数の仮想マシンに対するリクエストを分散する中継装置である。例えば、実行サーバ１００上の仮想マシンと、実行サーバ２００上の仮想マシンが同一のＷｅｂアプリケーションを提供することがある。この場合、負荷分散装置６００は、当該Ｗｅｂアプリケーションに対応した仮想ＩＰ（Internet Protocol）アドレス宛てのリクエストをクライアント７００，７００ａから受信する。負荷分散装置６００は、実行サーバ１００，２００上の各仮想マシンの何れかに当該リクエストを振り分ける。振り分けの方法は、例えばラウンドロビンである。各仮想マシンで確立されているコネクション数や各仮想マシンの応答時間などに基づいて振り分け先を決定してもよい。
【００３５】
クライアント７００，７００ａは、ユーザが操作するクライアントコンピュータである。クライアント７００，７００ａは、上述したようにＷｅｂブラウザを実行する。例えば、ユーザは、Ｗｅｂアプリケーションが提供するＧＵＩ（Graphical User Interface）をＷｅｂブラウザ上で操作する。これにより、当該Ｗｅｂアプリケーションにリクエストを送信する、リクエストに対するレスポンスを確認するなどが可能である。
【００３６】
ここで、Ｗｅｂアプリケーションには、その機能の実現に、Ｗｅｂブラウザとの間に確立されたセッションを維持できることを前提とするものがある。そのため、例えば負荷分散装置６００は同一クライアントからのリクエストを同一サーバに固定的に割り振り、同一サーバでセッション維持を行えるようにする機能を有する。この機能をスティッキー（Sticky）と呼ぶことがある。
【００３７】
例えば、クライアント７００上のＷｅｂブラウザからのリクエストが、負荷分散装置６００によって実行サーバ１００上の仮想マシンに振り分けられたとする。負荷分散装置６００はクライアント７００についてリクエストの振り分け先を一度決めると、以後もクライアント７００からのリクエストを当該振り分け先の仮想マシンに転送する。以後、クライアント７００のＷｅｂブラウザのリクエストが実行サーバ１００上の同一仮想マシンに転送される限り、セッションは維持され、Ｗｅｂアプリケーションの機能を正常に利用できる。
【００３８】
ところが、負荷分散装置６００では、スティッキーの持続時間が制限されていることがある。例えば、持続時間が１分などの短い時間に制限されていることがある。すると、ユーザがＷｅｂブラウザを閲覧している間にセッションがタイムアウトし、クライアント７００からのリクエストが別の仮想マシンに再振り分けされてしまうことがある。すると、Ｗｅｂアプリケーションを利用するためにセッションを再度確立する処理（例えば、ログインなど）が生じてしまい、Ｗｅｂアプリケーションの利用が不便になるおそれがある。負荷分散装置６００でスティッキー機能を利用できない場合も同様の問題が生じ得る。
【００３９】
そこで、実行サーバ１００，２００，３００の各仮想マシンは、セッションに関する情報（以下、セッション情報という）を保持し、仮想マシン同士で共有する機能を有している。このようにすれば、リクエストが別の仮想マシンに再振り分けされたとしても、何れかの仮想マシンに配置されたセッション情報を取得することで、セッションを維持できる。すなわち、負荷分散装置６００のスティッキー機能によらずに、Ｗｅｂアプリケーションでセッション維持を行える。
【００４０】
第２の実施の形態の情報処理システムでは、ＫＶＳの手法を用いて、実行サーバ１００，２００，３００上の各仮想マシンにセッション情報を分散配置して、セッション情報に対するアクセスの高速化を図っている（詳細は後述する）。
【００４１】
図３は、第２の実施の形態の実行サーバのハードウェア例を示す図である。実行サーバ１００は、プロセッサ１０１、ＲＡＭ１０２、ＨＤＤ１０３、通信部１０４，１０４ａ、画像信号処理部１０５、入力信号処理部１０６、ディスクドライブ１０７および機器接続部１０８を有する。各ユニットが実行サーバ１００のバスに接続されている。実行サーバ２００，３００、ストレージサーバ４００、管理サーバ５００およびクライアント７００，７００ａも実行サーバ１００と同様のユニットを用いて実現できる。
【００４２】
プロセッサ１０１は、実行サーバ１００の情報処理を制御する。プロセッサ１０１はマルチプロセッサであってもよい。プロセッサ１０１は、例えばＣＰＵ、ＭＰＵ（Micro Processing Unit）、ＤＳＰ（Digital Signal Processor）、ＡＳＩＣ（Application Specific Integrated Circuit）、ＦＰＧＡ（Field Programmable Gate Array）またはＰＬＤ（Programmable Logic Device）などである。プロセッサ１０１は、ＣＰＵ、ＭＰＵ、ＤＳＰ、ＡＳＩＣ、ＦＰＧＡ、ＰＬＤのうちの２以上の要素の組み合わせであってもよい。
【００４３】
ＲＡＭ１０２は、実行サーバ１００の主記憶装置である。ＲＡＭ１０２は、プロセッサ１０１に実行させるＯＳのプログラムやアプリケーションプログラムの少なくとも一部を一時的に記憶する。また、ＲＡＭ１０２は、プロセッサ１０１による処理に用いる各種データを記憶する。
【００４４】
ＨＤＤ１０３は、実行サーバ１００の補助記憶装置である。ＨＤＤ１０３は、内蔵した磁気ディスクに対して、磁気的にデータの書き込みおよび読み出しを行う。ＨＤＤ１０３には、ＯＳのプログラム、アプリケーションプログラム、および各種データが格納される。実行サーバ１００は、フラッシュメモリやＳＳＤ（Solid State Drive）などの他の種類の補助記憶装置を備えてもよく、複数の補助記憶装置を備えてもよい。
【００４５】
通信部１０４は、ネットワーク１０を介してストレージサーバ４００および管理サーバ５００と通信を行えるインタフェースである。通信部１０４ａは、負荷分散装置６００を介して実行サーバ２００，３００およびクライアント７００，７００ａと通信を行えるインタフェースである。通信部１０４，１０４ａは有線インタフェースでもよいし、無線インタフェースでもよい。
【００４６】
画像信号処理部１０５は、プロセッサ１０１からの命令に従って、実行サーバ１００に接続されたディスプレイ１１に画像を出力する。ディスプレイ１１としては、ＣＲＴ（Cathode Ray Tube）ディスプレイや液晶ディスプレイなどを用いることができる。
【００４７】
入力信号処理部１０６は、実行サーバ１００に接続された入力デバイス１２から入力信号を取得し、プロセッサ１０１に出力する。入力デバイス１２としては、例えば、マウスやタッチパネルなどのポインティングデバイス、キーボードなどを用いることができる。
【００４８】
ディスクドライブ１０７は、レーザ光などを利用して、光ディスク１３に記録されたプログラムやデータを読み取る駆動装置である。光ディスク１３として、例えば、ＤＶＤ（Digital Versatile Disc）、ＤＶＤ−ＲＡＭ、ＣＤ−ＲＯＭ（Compact Disc Read Only Memory）、ＣＤ−Ｒ（Recordable）／ＲＷ（ReWritable）などを使用できる。ディスクドライブ１０７は、例えば、プロセッサ１０１からの命令に従って、光ディスク１３から読み取ったプログラムやデータをＲＡＭ１０２またはＨＤＤ１０３に格納する。
【００４９】
機器接続部１０８は、実行サーバ１００に周辺機器を接続するための通信インタフェースである。例えば、機器接続部１０８にはメモリ装置１４やリーダライタ装置１５を接続できる。メモリ装置１４は、機器接続部１０８との通信機能を搭載した記録媒体である。リーダライタ装置１５は、メモリカード１６へのデータの書き込み、またはメモリカード１６からのデータの読み出しを行う装置である。メモリカード１６は、カード型の記録媒体である。機器接続部１０８は、例えば、プロセッサ１０１からの命令に従って、メモリ装置１４またはメモリカード１６から読み取ったプログラムやデータをＲＡＭ１０２またはＨＤＤ１０３に格納する。
【００５０】
図４は、第２の実施の形態の仮想マシンの実行例を示す図である。実行サーバ１００は、物理ハードウェア層１１０、ハイパーバイザ１２０および仮想マシン１３０，１４０，１５０を含む。実行サーバ２００，３００も実行サーバ１００と同様にして実現できる。
【００５１】
物理ハードウェア層１１０は、プロセッサ１０１、ＲＡＭ１０２、ＨＤＤ１０３、通信部１０４，１０４ａ、画像信号処理部１０５、入力信号処理部１０６、ディスクドライブ１０７および機器接続部１０８を含む物理的なリソースの集合である。
【００５２】
ハイパーバイザ１２０は、物理ハードウェア層１１０のリソースを用いて仮想マシン１３０，１４０，１５０を動作させるソフトウェアである。ハイパーバイザ１２０は、プロセッサ１０１の処理能力やＲＡＭ１０２の記憶領域を演算のリソースとして仮想マシン１３０，１４０，１５０に割り当てる。例えば、ハイパーバイザ１２０は、プロセッサ１０１を利用可能な時間を複数のタイムスライスに時分割し、各タイムスライスを仮想ＣＰＵとして仮想マシン１３０，１４０，１５０に割り当てる。また、ハイパーバイザ１２０はＲＡＭ１０２の記憶領域を複数の領域に分割し、仮想マシン１３０，１４０，１５０に各領域を割り当てる。ハイパーバイザ１２０は、仮想マシンモニタ（ＶＭＭ：Virtual Machine Monitor）と呼ばれることもある。
【００５３】
また、ハイパーバイザ１２０は仮想バス１２１を有する。仮想バス１２１は仮想マシン１３０，１４０，１５０間の通信路である。
仮想マシン１３０，１４０，１５０は、実行サーバ１００上で動作する仮想マシンである。仮想マシンをインスタンス（instance）と呼んでもよい。仮想マシン１３０，１４０，１５０は個別にＯＳを実行する。同一のＯＳを実行してもよいし、異なるＯＳを実行してもよい。
【００５４】
仮想マシン１３０は、物理ハードウェア層１１０の入出力デバイスに対する操作を管理する。入出力デバイスは、ＨＤＤ１０３、通信部１０４，１０４ａ、画像信号処理部１０５、入力信号処理部１０６、ディスクドライブ１０７および機器接続部１０８を含む。仮想マシン１３０を親パーティションと呼ぶことがある。仮想マシン１３０は、管理ＯＳ１３１およびデバイスドライバ１３２を含む。
【００５５】
管理ＯＳ１３１は、仮想マシン１３０上で動作するＯＳである。管理ＯＳ１３１は、仮想バス１２１を介して、デバイスドライバ１３２の利用環境を仮想マシン１４０，１５０に提供する。デバイスドライバ１３２は、物理ハードウェア層１１０の入出力デバイスを利用するためのドライバソフトウェアである。
【００５６】
仮想マシン１４０，１５０は、仮想マシン１３０上のデバイスドライバ１３２を利用して物理ハードウェア層１１０の入出力デバイスを操作する。仮想マシン１４０，１５０を子パーティションと呼ぶことがある。仮想マシン１４０は、ゲストＯＳ１４１およびＡＰ（APplication）サーバ１４２を含む。
【００５７】
ゲストＯＳ１４１は、仮想バス１２１を介して仮想マシン１３０と通信し、デバイスドライバ１３２を用いて物理ハードウェア層１１０の入出力デバイスを操作する。例えば、実行サーバ２００，３００上の他の仮想マシンとネットワーク２０を介して通信する。また、例えば、仮想マシン１４０に割り当てられたＨＤＤ１０３上のリソース（記憶領域）にデータを書き込んだり読み出したりする。
【００５８】
ＡＰサーバ１４２は、ユーザが利用するＷｅｂアプリケーションである。ＡＰサーバ１４２はＷｅｂサーバ機能を有する。例えば、ＡＰサーバ１４２はクライアント７００からリクエストを受信する。ＡＰサーバ１４２は、リクエストに応じた業務処理を実行してクライアント７００に実行結果を応答する（レスポンス）。
【００５９】
ＡＰサーバ１４２は、クライアント７００のＷｅｂブラウザとの間でログイン処理などによってセッションを新たに確立すると、クライアント７００に対してセッションＩＤ（IDentifier）を付与する。そして、セッションＩＤに対応付けて、セッション情報を生成する。セッション情報にはユーザＩＤ、パスワードおよび業務処理に用いる情報が含まれ得る。また、セッション情報には、業務処理に応じた情報を適宜追加することもできる。
【００６０】
仮想マシン１５０は、ゲストＯＳ１５１およびＡＰサーバ１５２を有する。ゲストＯＳ１５１の説明はゲストＯＳ１４１と同様であるため省略する。ＡＰサーバ１５２の説明はＡＰサーバ１４２と同様であるため省略する。
【００６１】
このように、仮想マシン１４０，１５０は、仮想マシン１３０が提供するデバイスドライバ１３２を利用して入出力デバイスを操作する。ハイパーバイザ１２０の当該実装方法をマイクロカーネル（micro kernel）型と呼ぶことがある。ただし、モノリシックカーネル（monolithic kernel）型でもよい。
【００６２】
図５は、第２の実施の形態のソフトウェア例を示す図である。実行サーバ１００は前述のように仮想マシン１４０，１５０を含む。更に、実行サーバ２００は仮想マシン２４０を含む。仮想マシン１４０，１５０，２４０はクラスタと呼ばれる１つの仮想マシン群を形成している。当該クラスタ内でセッション情報を共有可能である。例えば、仮想マシン１４０は、仮想マシン１４０に該当のセッション情報がなくても、仮想マシン１５０，２４０に配置された該当のセッション情報を利用できる。仮想マシン１４０，１５０，２４０上の各ＡＰサーバは、当該クラスタ内の何れかの仮想マシンにセッション情報を分散して配置する。
【００６３】
なお、図５ではネットワーク１０に接続される装置のうち、実行サーバ３００および管理サーバ５００の図示を省略している。物理ハードウェア層１１０および仮想マシン１３０の図示を省略している。
【００６４】
仮想マシン１４０は、記憶部１４３および処理部１４４を有する。
記憶部１４３は、処理部１４４の処理に用いる各種の情報を記憶する。記憶部１４３は、ＫＶＳの手法を用いて作成されたセッション情報を記憶する。具体的には、上述したように（キー，バリュー）＝（セッションＩＤ，セッション情報の本体）の組を記憶する。１つの組を１つのレコードと称することがある。１つの仮想マシンに配置される（キー，バリュー）の複数の組の集合を指して、ＫＶＳと称することがある。また、記憶部１４３はバックアップ対象のセッション情報を管理するための情報を記憶する。
【００６５】
処理部１４４は、ＡＰサーバ１４２と連携して、ＡＰサーバ１４２がＷｅｂブラウザとの間で確立したときに生成されるセッション情報をＫＶＳに格納する。具体的には、処理部１４４は、ＡＰサーバ１４２が新たにセッションを確立すると、セッションＩＤおよびセッション情報をＡＰサーバ１４２から取得する。処理部１４４は、ＫＶＳの手法を用いて、取得したセッションＩＤとセッション情報とを何れかの仮想マシンに分散配置する。キーはセッションＩＤである。バリューはセッション情報である。
【００６６】
処理部１４４は、仮想マシン１４０，１５０，２４０上のＡＰサーバがセッション情報を操作すると、当該操作内容を取得して、ＫＶＳに反映させる。また、処理部１４４は、ＡＰサーバからのキーを指定した要求に応じて、ＫＶＳからセッション情報を抽出し、当該ＡＰサーバに提供する。
【００６７】
また、処理部１４４は、記憶部１４３に記憶された情報に基づいて、ストレージサーバ４００に対するセッション情報のバックアップを制御する。
仮想マシン１５０は、記憶部１５３および処理部１５４を有する。仮想マシン２４０は記憶部２４３および処理部２４４を有する。記憶部１５３，２４３の説明は記憶部１４３の説明と同様であるため省略する。処理部１５４，２４４の説明は処理部１４４の説明と同様であるため省略する。
【００６８】
ここで、仮想マシン１４０，１５０，２４０にはクラスタ内で一意の仮想マシンＩＤ（図５では単にＩＤと表記している）が付与されている。仮想マシン１４０の仮想マシンＩＤは“１”である。仮想マシン１５０の仮想マシンＩＤは“２”である。仮想マシン２４０の仮想マシンＩＤは“３”である。
【００６９】
図６は、第２の実施の形態のハッシュ値の担当範囲の例を示す図である。第２の実施の形態の情報処理システムでは、一例として、キー・バリューの配置先を決定するためにコンシステントハッシング（consistent hashing）と呼ばれる方法を用いる。コンシステントハッシングでは、キーから算出されるハッシュ値の全範囲を複数の範囲に分割して複数のノードに割り当てる。各ノードは自身が担当するハッシュ値の範囲において、キー・バリューを保持する責任を負う。なお、コンシステントハッシングのために用いるハッシュ関数は、“キー・バリューの配置先を決定するためのハッシュ関数”である。
【００７０】
第２の実施の形態では、ハッシュ値の全範囲を、一例として“０〜９９”とする。“９９”の次の値は“０”である。ハッシュ値の全範囲は、ハッシュ値範囲Ｒ１，Ｒ２，Ｒ３に分割されている。ハッシュ値範囲Ｒ１は“０〜３０”および“９１〜９９”である。ハッシュ値範囲Ｒ１は仮想マシン１４０の担当である。ハッシュ値範囲Ｒ２は“３１〜６０”である。ハッシュ値範囲Ｒ２は仮想マシン１５０の担当である。ハッシュ値範囲Ｒ３は“６１〜９０”である。ハッシュ値範囲Ｒ３は仮想マシン２４０の担当である。
【００７１】
また、処理部１４４，１５４，２４４は、仮想マシン１４０，１５０，２４０に配置された各キー・バリューを複製し、もう１つの別の仮想マシンにも配置する。すなわち、合計２つの仮想マシンで同じデータを保持する。これにより、キー・バリューの冗長化を図る。
【００７２】
例えば、処理部１４４，１５４，２４４は、あるキー・バリューの複製先の仮想マシンを仮想マシンＩＤに基づいて決定する。具体的には、隣接する仮想マシンのうち、仮想マシンＩＤの小さい方の仮想マシンが担当するハッシュ値範囲のキー・バリューの複製を、仮想マシンＩＤの大きい方の仮想マシンに配置する。ただし、最大の仮想マシンＩＤである仮想マシンが担当するハッシュ値範囲のキー・バリューの複製を、最小の仮想マシンＩＤである仮想マシンに配置する。ここで、「隣接する」とは、担当のハッシュ値範囲が隣り合っていることを意味する。
【００７３】
より具体的には、仮想マシン１４０（仮想マシンＩＤ：１）が担当するキー・バリューの複製先は仮想マシン１５０（仮想マシンＩＤ：２）である。仮想マシン１５０（仮想マシンＩＤ：２）が担当するキー・バリューの複製先は仮想マシン２４０（仮想マシンＩＤ：３）である。仮想マシン２４０（仮想マシンＩＤ：３）が担当するキー・バリューの複製先は仮想マシン１４０（仮想マシンＩＤ：１）である。すなわち、キーに応じてキー・バリューの配置先が決まれば、複製先も決まることになる。
【００７４】
このようにすれば、例えば、仮想マシン１５０が障害などで停止したとしても、仮想マシン１４０は、仮想マシン１５０に配置されていたキー・バリューの複製を仮想マシン２４０から取得することで、Ｗｅｂアプリケーションのセッションを維持できる。
【００７５】
キー・バリューの複製は、例えば、キー・バリューが新たに追加・更新されるたびに行われる。また、あるＫＶＳからあるキー・バリューが削除されれば、複製先のＫＶＳからも当該キー・バリューが削除されることになる。
【００７６】
なお、ハッシュ関数や、どのハッシュ値範囲がどの仮想マシンの担当であるかを示す情報は、仮想マシン１４０，１５０，２４０に予め与えられ、記憶部１４３，１５３，２４３に保持される。また、自身のハッシュ値範囲の複製先の仮想マシンがどの仮想マシンであるかを示す情報も、仮想マシン１４０，１５０，２４０に予め与えられ、記憶部１４３，１５３，２４３に保持される。
【００７７】
また、キー・バリューの配置先を決定するために、キーを用いた、コンシステントハッシング以外の方法を適用してもよい。また、キー・バリューの複製先を決定するための方法についても、キーを用いた上記以外の方法を適用してもよい。
【００７８】
図７は、第２の実施の形態のＫＶＳの例を示す図である。図７（Ａ）はＫＶＳ１４３ａを例示している。ＫＶＳ１４３ａは記憶部１４３に格納される。図７（Ｂ）はＫＶＳ１５３ａを例示している。ＫＶＳ１５３ａは記憶部１５３に格納される。図７（Ｃ）はＫＶＳ２４３ａを例示している。ＫＶＳ２４３ａは記憶部２４３に格納される。
【００７９】
ＫＶＳ１４３ａ，１５３ａ，２４３ａのキーはセッションＩＤである。バリューはセッション情報の本体である。例えば、ＫＶＳ１４３ａには（キー，バリュー）＝（ｋｅｙＡ，ｖａｌｕｅＡ），（ｋｅｙＢ，ｖａｌｕｅＢ），（ｋｅｙＤ，ｖａｌｕｅＤ）という情報が登録されている。ＫＶＳ１５３ａには（キー，バリュー）＝（ｋｅｙＡ，ｖａｌｕｅＡ），（ｋｅｙＢ，ｖａｌｕｅＢ），（ｋｅｙＣ，ｖａｌｕｅＣ）という情報が登録されている。ＫＶＳ２４３ａには（キー，バリュー）＝（ｋｅｙＣ，ｖａｌｕｅＣ），（ｋｅｙＤ，ｖａｌｕｅＤ）という情報が登録されている。
【００８０】
ＫＶＳ１４３ａにおいて、“ｋｅｙＡ”および“ｋｅｙＢ”のハッシュ値は仮想マシン１４０が担当するハッシュ値範囲Ｒ１に含まれる。“ｋｅｙＤ”のハッシュ値はハッシュ値範囲Ｒ３に含まれる。すなわち、（キー，バリュー）＝（ｋｅｙＤ，ｖａｌｕｅＤ）は仮想マシン２４０に配置されたキー・バリューの複製である。
【００８１】
ＫＶＳ１５３ａにおいて、“ｋｅｙＣ”のハッシュ値は仮想マシン１５０が担当するハッシュ値範囲Ｒ２に含まれる。“ｋｅｙＡ”および“ｋｅｙＢ”のハッシュ値はハッシュ値範囲Ｒ１に含まれる。すなわち、（キー，バリュー）＝（ｋｅｙＡ，ｖａｌｕｅＡ），（ｋｅｙＢ，ｖａｌｕｅＢ）は仮想マシン１４０に配置されたキー・バリューの複製である。
【００８２】
ＫＶＳ２４３ａにおいて、“ｋｅｙＤ”のハッシュ値は仮想マシン２４０が担当するハッシュ値範囲Ｒ３に含まれる。“ｋｅｙＣ”のハッシュ値はハッシュ値範囲Ｒ２に含まれる。すなわち、（キー，バリュー）＝（ｋｅｙＣ，ｖａｌｕｅＣ）は仮想マシン１５０に配置されたキー・バリューの複製である。
【００８３】
図８は、第２の実施の形態の管理テーブルの例を示す図である。図８（Ａ）は管理テーブル１４３ｂを例示している。管理テーブル１４３ｂは記憶部１４３に格納される。図８（Ｂ）は管理テーブル１５３ｂを例示している。管理テーブル１５３ｂは記憶部１５３に格納される。図８（Ｃ）は管理テーブル２４３ｂを例示している。管理テーブル２４３ｂは記憶部２４３に格納される。
【００８４】
管理テーブル１４３ｂ，１５３ｂ，２４３ｂは、それぞれＫＶＳ１４３ａ，１５３ａ，２４３ａに対する前回のバックアップ完了時点からの操作内容を記録した履歴である。管理テーブル１４３ｂ，１５３ｂ，２４３ｂは、セッションＩＤおよび操作の項目を含む。セッションＩＤの項目にはセッションＩＤが登録される。操作の項目には追加や削除などのキー・バリューに対する操作内容が登録される。
【００８５】
例えば、管理テーブル１４３ｂには、セッションＩＤが“ｋｅｙＡ”、操作が“ＡＤＤ”という情報が登録されている。これは、ＫＶＳ１４３ａ，１５３ａで、前回のバックアップ完了時点からキー“ｋｅｙＡ”のキー・バリューの追加または更新が発生したことを示す。すなわち、操作“ＡＤＤ”は当該キー・バリューについてのバックアップの追加または更新を行うべきことを示す。
【００８６】
また、管理テーブル１４３ｂには、セッションＩＤが“ｋｅｙＤ”、操作が“ＤＥＬＥＴＥ”という情報が登録されている。これは、ＫＶＳ１４３ａ，２４３ａで前回のバックアップ完了時点からキー“ｋｅｙＤ”のキー・バリューの削除が発生したことを示す。すなわち、操作“ＤＥＬＥＴＥ”は当該キー・バリューについてのストレージサーバ４００に格納されたバックアップの削除を行うべきことを示す。
【００８７】
このように、仮想マシン１４０，１５０，２４０は、自身に割り当てられたハッシュ値範囲（複製元が担当するハッシュ値範囲を含む）に対応するキーについて、前回のバックアップ完了時点からの操作内容を保持する。
【００８８】
図９は、第２の実施の形態のバックアップテーブルの例を示す図である。バックアップテーブル４１０は、ストレージサーバ４００に格納される。バックアップテーブル４１０は、ＫＶＳ１４３ａ，１５３ａ，２４３ａに格納されたキー・バリューのバックアップデータである。バックアップテーブル４１０は、キー、バリューおよび仮想マシンＩＤの項目を含む。
【００８９】
キーの項目には、セッションＩＤが登録される。バリューの項目には、セッション情報が登録される。仮想マシンＩＤの項目には、バックアップ元の仮想マシンの仮想マシンＩＤが登録される。バックアップ元の仮想マシンは、バックアップをリストアするリストア先の仮想マシンということもできる。
【００９０】
例えば、バックアップテーブル４１０には、キーが“ｋｅｙＡ”、バリューが“ｖａｌｕｅＡ”、仮想マシンＩＤが“１，２”という情報が登録されている。これは、仮想マシン１４０，１５０に冗長で配置された（キー，バリュー）＝（ｋｅｙＡ，ｖａｌｕｅＡ）のバックアップである。
【００９１】
ここで、バックアップテーブル４１０に格納されたデータは、何れかの仮想マシンで障害が発生した場合の復旧時のリストアに用いられる。すなわち、バックアップされたデータはリストアの必要性がなくなり次第削除してよい。例えば、バックアップ元のＫＶＳからログアウトなどによりセッション情報が削除されれば、リストアの必要性はなくなる。よって、この場合はバックアップテーブル４１０からも該当のバックアップの情報を削除してよい。
【００９２】
図１０は、第２の実施の形態の通信データの例を示す図である。図１０（Ａ）は、仮想マシン１４０（または仮想マシン１５０）がストレージサーバ４００に送信する通信データ８１０を例示している。通信データ８１０は、バックアップを実行する際に、処理部１４４（または処理部１５４）によって生成されストレージサーバ４００に送信される。仮想マシン２４０も通信データ８１０と同様のフォーマットの通信データをストレージサーバ４００に送信する。
【００９３】
通信データ８１０は、キー、バリューおよび仮想マシンＩＤのフィールドを含む。キーのフィールドにはセッションＩＤが設定される。バリューのフィールドにはセッション情報が設定される。仮想マシンＩＤの項目にはバックアップ元の仮想マシンの仮想マシンＩＤが設定される。
【００９４】
例えば、通信データ８１０には、キーが“ｋｅｙＡ”、バリューが“ｖａｌｕｅＡ”、仮想マシンＩＤが“１，２”という情報が設定されている。これは、バックアップテーブル４１０の第一段目のレコードに対応するものである。ストレージサーバ４００は通信データ８１０を受信すると、バックアップテーブル４１０に当該レコードを登録することになる。
【００９５】
なお、バックアップテーブル４１０からレコードを削除したい場合は、キーを指定して削除する旨の指示をストレージサーバ４００に送信すればよい。
図１０（Ｂ）は、仮想マシン１４０，１５０間の通信データ８２０を例示している。仮想マシン１４０，２４０および仮想マシン１５０，２４０の間も同様のフォーマットの通信データが送受信される。通信データ８２０は、セッションＩＤおよび操作のフィールドを含む。
【００９６】
セッションＩＤのフィールドには、次回バックアップ時にバックアップ対象とするセッションＩＤ（キー）が設定される。操作のフィールドには、当該セッションＩＤ（キー）で示されるキー・バリューに対する、前回バックアップ完了時点からの操作内容が設定される。
【００９７】
例えば、処理部１４４は、キー“ｋｅｙＡ”のキー・バリューをＫＶＳ１４３ａに追加したとする。すると、処理部１４４は、複製先である仮想マシン１５０にも当該追加を通知し、当該キー・バリューを仮想マシン１５０にも配置する。このとき、例えば、処理部１４４は通信データ８２０を生成して複製されたセッション情報とともに仮想マシン１５０に送信する。複製されたセッション情報を送信するタイミングとは別のタイミングで通信データ８２０を仮想マシン１５０に送信してもよい。また、処理部１４４は当該キー“ｋｅｙＡ”に関する通信データ８２０を複製先以外の仮想マシン２４０には送信しない。
【００９８】
図１１は、第２の実施の形態の関数の処理例を示す図である。図１１（Ａ）は関数Ｓｅｌｅｃｔを例示している。関数Ｓｅｌｅｃｔの引数はＫ（Ｋは文字、文字列、数値、数値列など）である。Ｋはキー・バリューのキーである。関数Ｓｅｌｅｃｔはキーに対してＭ（Ｍは文字、文字列、数値、数値列など）を返す関数である。Ｍは仮想マシンＩＤである。例えば、関数Ｓｅｌｅｃｔは次のようにしてＭを求める。
【００９９】
まず、ハッシュ関数Ｈａｓｈを用いて、ハッシュ値Ｈ＝Ｈａｓｈ（Ｋ）を算出する。例えば、Ｈは０以上の整数である。次に、ハッシュ値Ｈを、キー・バリューの冗長度Ｎ（Ｎは２以上の整数）で割った剰余Ｄ（Ｄは０以上の整数）を求める。すなわち、Ｄ＝Ｈ  ｍｏｄ  Ｎの演算を行う。そして、キーＫを担当する仮想マシンのうち、Ｄ番目の仮想マシンの仮想マシンＩＤをＭとして返す。
【０１００】
ここで、“Ｄ番目”という場合、仮想マシンＩＤの昇順に何番目かを表している。例えば、仮想マシン１４０，１５０，２４０の例でいえば、それぞれの仮想マシンＩＤは“１”、“２”、“３”である。
【０１０１】
仮想マシン１４０，１５０に冗長度Ｎ＝２で配置されたキー・バリューに着目すると、Ｄの取り得る値は“０”、“１”である。この場合、“０番目”の仮想マシンは仮想マシン１４０（仮想マシンＩＤ：１）である。“１番目”の仮想マシンは仮想マシン１５０（仮想マシンＩＤ：２）である。
【０１０２】
一方、仮想マシン１４０，２４０に冗長度Ｎ＝２で配置されたキー・バリューに着目すると、Ｄの取り得る値は“０”、“１”である。この場合、“０番目”の仮想マシンは仮想マシン１４０（仮想マシンＩＤ：１）である。“１番目”の仮想マシンは仮想マシン２４０（仮想マシンＩＤ：３）である。
【０１０３】
なお、ハッシュ関数Ｈａｓｈによる演算と剰余Ｄを算出するまでの演算とを併せて、ハッシュ値Ｄを算出するためのハッシュ関数と呼ぶこともできる。また、ハッシュ関数Ｈａｓｈは前述の“キー・バリューの配置先を決定するためのハッシュ関数”と同一でもよい。
【０１０４】
図１１（Ｂ）は関数Ｎｅｘｔを例示している。関数Ｎｅｘｔの引数はＫ，Ｍである。ここで、Ｋは関数Ｓｅｌｅｃｔの入力であり、Ｍは関数Ｓｅｌｅｃｔの出力である。関数Ｎｅｘｔは、仮想マシンＩＤが“Ｍ”である仮想マシンの次（Ｄ＋１番目）の仮想マシンの仮想マシンＩＤ（これをＰとする）を返す関数である。Ｐは文字、文字列、数値、数値列などである。また、Ｄ＋１がＤの取り得る最大値よりも大きい場合は、“０番目”の仮想マシンの仮想マシンＩＤを返す。
【０１０５】
例えば、仮想マシン１４０，１５０に着目すれば、仮想マシン１４０（仮想マシンＩＤ：１）の次の仮想マシン１５０の仮想マシンＩＤ“２”を返す。また、仮想マシン１４０，１５０に着目したとき、仮想マシン１５０の次は仮想マシン１４０であり、仮想マシンＩＤ“１”を返すこともある。
【０１０６】
一方、仮想マシン１４０，２４０に着目すれば、仮想マシン１４０（仮想マシンＩＤ：１）の次の仮想マシン２４０の仮想マシンＩＤ“３”を返す。また、仮想マシン１４０，２４０に着目したとき、仮想マシン２４０の次は仮想マシン１４０であり、仮想マシンＩＤ“１”を返すこともある。
【０１０７】
次に、第２の実施の形態におけるＫＶＳに格納されたセッション情報を更新するための手順を説明する。以下では、処理部１４４を例示して説明するが、処理部１５４および処理部２４４についても同様の手順である。
【０１０８】
図１２は、第２の実施の形態のセッション更新を示すフローチャートである。以下、図１２に示す処理をステップ番号に沿って説明する。
（ステップＳ１１）ＡＰサーバ１４２は、クライアント７００のＷｅｂブラウザからのアクセスを受け付ける。例えば、Ｗｅｂアプリケーションに対して新規にログイン認証が行われた場合には、新たにセッションＩＤを発行してセッション情報を追加する。また、業務処理によりセッション情報に変更が生じた場合には、セッション情報を更新する。更に、Ｗｅｂアプリケーションからのログアウトが行われた場合には、該当するセッションＩＤおよびセッション情報を削除する。処理部１４４は、ＡＰサーバ１４２からセッションＩＤ（キー）を指定したキー・バリューの追加、更新、削除の何れかの操作を受け付ける。
【０１０９】
（ステップＳ１２）処理部１４４は、受け付けたセッションＩＤの保持担当が仮想マシン１４０（自身）であるか否かを判定する。自身が担当するセッションＩＤである場合、処理をステップＳ１３に進める。自身が担当しないセッションＩＤである場合、処理をステップＳ１６に進める。処理部１４４は当該判定を次のようにして行える。すなわち、処理部１４４はセッションＩＤ（キー）に応じたハッシュ値を算出する。ここで用いるハッシュ関数は、“キー・バリューの配置先を決定するためのハッシュ関数”である。そして、当該ハッシュ値が仮想マシン１４０の担当するハッシュ値範囲Ｒ１に含まれる場合、当該セッションＩＤは自身が担当するものである。一方、当該ハッシュ値がハッシュ値範囲Ｒ１に含まれない場合、当該セッションＩＤは自身が担当するものではない。
【０１１０】
（ステップＳ１３）処理部１４４は、ＫＶＳ１４３ａに格納されたキー・バリューを操作する。キー・バリューの追加であれば、指定されたセッションＩＤ（キー）と対応付けたセッション情報（バリュー）をＫＶＳ１４３ａに追加する。キー・バリューの更新であれば、指定されたセッションＩＤ（キー）に対応するレコードをＫＶＳ１４３ａから検索し、セッション情報（バリュー）の更新内容を当該レコードに反映させる。キー・バリューの削除であれば、指定されたセッションＩＤ（キー）に対応するレコードをＫＶＳ１４３ａから検索し、当該レコードをＫＶＳ１４３ａから削除する。
【０１１１】
（ステップＳ１４）処理部１４４は、キー・バリューに対する操作内容を管理テーブル１４３ｂに登録する。追加・更新した場合、操作の項目は“ＡＤＤ”である。削除した場合、操作の項目は“ＤＥＬＥＴＥ”である。また、当該キーに対する操作内容が管理テーブル１４３ｂに既に存在する場合もある。この場合は、既存のレコードを上書きで更新すればよい。バックアップ時には、最新の操作内容が記録されていれば足りるからである。
【０１１２】
（ステップＳ１５）処理部１４４は、キー・バリューの複製先の仮想マシン１５０が保持するＫＶＳ１５３ａにも、当該操作を反映させる。処理部１５４は、処理部１４４の指示に基づいて、ＫＶＳ１５３ａに対するキー・バリューの追加・更新・削除などを実行する。このとき、処理部１４４は、通信データ８２０を用いて処理部１５４にキー・バリューの操作内容を通知してもよい。処理部１５４は、キー・バリューに対する操作内容を管理テーブル１５３ｂに登録する。そして、処理を終了する。
【０１１３】
（ステップＳ１６）処理部１４４は、指定されたセッションＩＤを担当する仮想マシンにキー・バリューの操作を依頼する。このとき、処理部１４４は通信データ８２０を用いて操作内容を通知してもよい。例えば、仮想マシン１５０が当該依頼を受け付けたとする。この場合、処理部１５４がステップＳ１３〜Ｓ１５に相当する処理を実行することになる。具体的には、処理部１５４はＫＶＳ１５３ａのキー・バリューを操作する。また、処理部１５４は操作内容を管理テーブル１５３ｂに登録する。更に、処理部１５４は、複製先（例えば、仮想マシン２４０）にも当該操作内容を反映させ、操作内容を（例えば、管理テーブル２４３ｂに）記録させる。そして、処理を終了する。
【０１１４】
このようにして、キー・バリューに対する操作が行われる。具体的なキー・バリューを挙げて処理を例示すると次のようになる。
まず、例えば処理部１４４が（キー，バリュー）＝（ｋｅｙＡ，ｖａｌｕｅＡ）の追加を受け付けた場合を考える。キー“ｋｅｙＡ”のハッシュ値は、ハッシュ値範囲Ｒ１に含まれる。よって、当該キー・バリューは仮想マシン１４０の担当である。このため、処理部１４４は（キー，バリュー）＝（ｋｅｙＡ，ｖａｌｕｅＡ）をＫＶＳ１４３ａに追加する。処理部１４４は、セッションＩＤ“ｋｅｙＡ”、操作“ＡＤＤ”のレコードを管理テーブル１４３ｂに登録する。
【０１１５】
また、処理部１４４はハッシュ値範囲Ｒ１の複製先である仮想マシン１５０にも当該操作内容を通知する。当該通知を受けて、処理部１５４は（キー，バリュー）＝（ｋｅｙＡ，ｖａｌｕｅＡ）をＫＶＳ１５３ａに追加する。処理部１５４は、セッションＩＤ“ｋｅｙＡ”、操作“ＡＤＤ”のレコードを管理テーブル１５３ｂに登録する。
【０１１６】
次に、例えば処理部１４４が（キー，バリュー）＝（ｋｅｙＣ，ｖａｌｕｅＣ）の更新を受け付けた場合を考える。キー“ｋｅｙＣ”のハッシュ値は、ハッシュ値範囲Ｒ２に含まれる。よって、当該キー・バリューは仮想マシン１５０の担当であり、仮想マシン１４０の担当ではない。このため、処理部１４４は、キー・バリューの操作を仮想マシン１５０に依頼する。このとき、処理部１４４は、当該キー“ｋｅｙＣ”に関する操作内容を管理テーブル１４３ｂに記録しなくてよい。
【０１１７】
依頼を受けた処理部１５４は、処理部１４４と同様にして、（キー，バリュー）＝（ｋｅｙＣ，ｖａｌｕｅＣ）の更新内容をＫＶＳ１５３ａに反映させる。ただし、この場合は既存のキー・バリューを検索して更新することになる。また、当該更新内容を管理テーブル１５３ｂに反映させる。処理部１５４は、ハッシュ値範囲Ｒ２の複製先である仮想マシン２４０にも当該操作内容を通知する。当該通知を受けた処理部２４４は、同様にＫＶＳ２４３ａおよび管理テーブル２４３ｂに操作内容を反映させる。このようにして、キー・バリューが更新されるとともに、当該キー・バリューが更新対象として記録される。
【０１１８】
次に、第２の実施の形態のバックアップ処理の手順を説明する。以下に示す処理は、仮想マシン１４０，１５０，２４０で個別に管理されるタイミングで実行される。例えば、仮想マシン１４０，１５０，２４０は次の何れかのタイミングでバックアップ処理を開始することが考えられる。
【０１１９】
（１）一定時間が経過するたびに行う。
（２）自身のＫＶＳにおいてキー・バリューの更新が一定回数行われるたびに行う。
ただし、（１）、（２）以外のタイミングでバックアップ処理を開始してもよい。以下では、処理部１４４を例示して説明するが、処理部１５４および処理部２４４についても同様の手順である。
【０１２０】
図１３は、第２の実施の形態のバックアップ処理を示すフローチャートである。以下、図１３に示す処理をステップ番号に沿って説明する。
（ステップＳ２１）処理部１４４は、バックアップ対象のキーを取得する。具体的には、管理テーブル１４３ｂに登録されたセッションＩＤがバックアップ対象のキーである。
【０１２１】
（ステップＳ２２）処理部１４４は、未処理のキーがあるか否かを判定する。未処理のキーがある場合、処理をステップＳ２３に進める。未処理のキーがない場合、処理を終了する。未処理のキーとは、以降の処理（ステップＳ２３〜Ｓ２８）が未処理であるキーを指す。具体的には、管理テーブル１４３ｂに１以上のセッションＩＤ（キー）が含まれていれば、未処理のキーがあると判定する。管理テーブル１４３ｂにセッションＩＤ（キー）が含まれていなければ、未処理のキーがないと判定する。
【０１２２】
（ステップＳ２３）処理部１４４は、ステップＳ２２で未処理であると判定されたキーのうちから１つを抽出して変数Ｋに代入する。例えば、未処理のキーが複数ある場合は、最小キーを抽出する、または、最大キーを抽出する、などが考えられる。
【０１２３】
（ステップＳ２４）処理部１４４は、Ｍ＝Ｓｅｌｅｃｔ（Ｋ）を算出する。
（ステップＳ２５）処理部１４４は、算出されたＭが仮想マシン１４０（自身）の仮想マシンＩＤ“１”に一致するか否かを判定する。一致する場合、処理をステップＳ２６に進める。一致しない場合、処理をステップＳ２７に進める。例えば、Ｍ＝Ｓｅｌｅｃｔ（ｋｅｙＡ）＝１であるとする。この場合、仮想マシンＩＤ“１”に一致する。また、例えば、Ｍ＝Ｓｅｌｅｃｔ（ｋｅｙＣ）＝３であるとする。この場合、仮想マシンＩＤ“１”に一致しない。
【０１２４】
（ステップＳ２６）処理部１４４は、管理テーブル１４３ｂを参照して、ステップＳ２３で抽出されたキー（例えば、“ｋｅｙＡ”）に対する操作（“ＡＤＤ”または“ＤＥＬＥＴＥ”）を判断する。操作が“ＡＤＤ”であれば、当該キーに対応するバリュー（例えば、“ｖａｌｕｅＡ”）をＫＶＳ１４３ａから抽出する。また、当該キーを担当する仮想マシン１４０の仮想マシンＩＤ“１”および複製先の仮想マシン１５０の仮想マシンＩＤ“２”を記憶部１４３から取得する。処理部１４４は、抽出したキー・バリューと仮想マシンＩＤ“１”、“２”とを含む通信データ８１０をストレージサーバ４００に送信する。なお、ストレージサーバ４００は通信データ８１０を受信すると、通信データ８１０に含まれるキー・バリューや担当の仮想マシンＩＤの情報をＨＤＤなどの記憶部に格納する。操作が“ＤＥＬＥＴＥ”であれば、当該キーに対応するバックアップのレコードを削除するようにストレージサーバ４００に指示する。ストレージサーバ４００は、当該指示に応じてバックアップテーブル４１０から該当のレコードを削除する。そして、処理をステップＳ２８に進める。
【０１２５】
（ステップＳ２７）処理部１４４は、仮想マシンＩＤがＭ（例えば、“３”）の仮想マシン（例えば、仮想マシン２４０）は稼働中であるか否かを判定する。稼働中である場合、処理をステップＳ２８に進める。稼働中でない場合、処理をステップＳ２９に進める。例えば、処理部１４４は自身以外の仮想マシンが稼働中であるか否かを、ＩＣＭＰ（Internet Control Message Protocol）エコーなどを用いて確認できる。具体的には、当該エコーを相手の仮想マシンに送り、その応答があれば稼働中であると判定し、その応答がなければ稼働中でないと判定する。
【０１２６】
（ステップＳ２８）処理部１４４は、管理テーブル１４３ｂからステップＳ２３で抽出したセッションＩＤ（キー）を削除する。そして、処理をステップＳ２１に進める。
（ステップＳ２９）処理部１４４は、Ｐ＝Ｎｅｘｔ（Ｋ，Ｍ）を算出する。処理部１４４は、算出したＰをＭに代入する。例えば、Ｐ＝Ｎｅｘｔ（ｋｅｙＣ，３）＝１である。すなわち、本ステップＳ２９の直前でＭ＝３であったとしても、本ステップＳ２９の直後にはＭ＝１に書き換わることになる。そして、処理をステップＳ２５に進める。
【０１２７】
このようにして、仮想マシン１４０，１５０，２４０は、自身が各キー・バリューのバックアップ処理担当であるか否かを判定する。そして、１つのキー・バリューが仮想マシン１４０，１５０，２４０のうちの何れか１つによってストレージサーバ４００に送信されるようにする。これにより、複数の仮想マシンが１つのキー・バリューを重複してストレージサーバ４００に送信しないようにする。その結果、重複した通信を行う場合に比べて、処理コストや通信コストを抑えることができる。
【０１２８】
ここで、ある仮想マシンが、自身のＫＶＳ上に保持されていないキー・バリューのバックアップを担当することも考えられる。しかし、この場合、当該仮想マシンはそのキー・バリューを保持する他の仮想マシンにストレージサーバ４００への当該キー・バリューの転送を依頼することになる。すると、当該依頼を行うための余分な処理コストや通信コストが生じ得る。
【０１２９】
そこで、仮想マシン１４０，１５０，２４０は、バックアップ処理の担当を、バックアップ対象のキー・バリューが配置された仮想マシンの中から選択する。例えば、（キー，バリュー）＝（ｋｅｙＡ，ｖａｌｕｅＡ）であれば、仮想マシン１４０，１５０の何れか一方を当該キー・バリューのバックアップ担当として選択する。これによって、例えば、仮想マシン２４０が自身で保持していない（キー，バリュー）＝（ｋｅｙＡ，ｖａｌｕｅＡ）のバックアップを担当する場合よりも、処理コストや通信コストを抑えることができる。
【０１３０】
また、仮想マシン１４０，１５０，２４０が自律して上記の情報処理を実行するので、各キーにつきバックアップ処理担当の仮想マシンがどれであるかを指定するような装置を別途設けなくてもよい。
【０１３１】
また、ハッシュ関数を用いることで、入力に対するハッシュ値を一様に分布させることができる。例えば、ハッシュ関数Ｈａｓｈが算出するハッシュ値はある数値範囲で連続した値の何れかとなる。したがって、当該ハッシュ値をキー・バリューの冗長度Ｎで除した剰余Ｄの出現確率も一様に分布することが期待される。このため、複数の仮想マシンに対して、データ格納の責任をほぼ均等に割り振れる。よって、同じデータが配置された複数の仮想マシンの中でデータ格納に伴う処理負荷をほぼ均等に分散することができる。前述したように、この場合には当該剰余Ｄもハッシュ値と呼ぶことができる。
【０１３２】
更に、仮想マシン１４０，１５０，２４０は、自身がバックアップ処理担当ではない場合でも、担当の仮想マシンが稼働中であるか否かを判定することで、該当のキー・バリューのバックアップが行えるかを確認する。そして、バックアップ処理を担当できる仮想マシンが他にない場合には、自身がバックアップ処理を代替で実行する。このようにして、管理テーブル１４３ｂに登録されたセッションＩＤ（キー）について、バックアップの実行漏れを抑止できる。
【０１３３】
なお、第２の実施の形態では以下の（１）〜（９）に示す例外も考え得る。何れの場合にも、バックアップ漏れなどは生じない。具体的には次の通りである。
（１）バックアップ処理中に新たなキー・バリューがＫＶＳに追加されることがある。当該キー・バリューは今回のバックアップ処理の対象とならない可能性もあるが、次回のバックアップ処理の対象となり、バックアップ漏れは生じない。
【０１３４】
（２）バックアップ処理中に対象のキー・バリューがＫＶＳから削除されることがある。当該削除のタイミングによっては、バックアップ処理において当該キー・バリューの読み出しに失敗することになる。その場合は当該キー・バリューの送信は行われない（行わなくても支障はない）。また、その場合もバックアップ処理を継続するようにする。
【０１３５】
（３）あるキーのバックアップ処理担当の仮想マシンが稼働中であると判定した後で、当該仮想マシンが故障することがある。その場合、今回のバックアップ処理ではバックアップされないことになる。そして、次回のバックアップ処理で別の仮想マシンが当該キーのバックアップを代替で実行することになる。
【０１３６】
（４）あるキーのバックアップ処理担当の仮想マシンが稼働中でないと判定して、別の仮想マシンがバックアップを代替した後に、稼働中でないと判定された仮想マシンが復旧することがある。その場合は復旧した担当の仮想マシンにより当該キーについて次回以降のバックアップが行われることになる。このとき、今回バックアップ時点と次回バックアップ時点の時間間隔が短くなることもある。バックアップのタイミングは個々の仮想マシンで管理されるからである。ただし、多重にバックアップされるわけではない。
【０１３７】
（５）復旧した仮想マシンが、復旧の直後にバックアップ処理を開始することがある。この場合、バックアップ対象のキー・バリューが当該仮想マシン内のＫＶＳに存在しない。このため、当該仮想マシンはバックアップ処理を行えない。そこで、復旧した仮想マシンにはストレージサーバ４００からキー・バリューをリストアする。また、当該リストアが完了するまで、他の仮想マシンからの稼働確認に対して、稼働中でない旨の応答を返す。これにより、復旧直後の仮想マシンで担当すべきキー・バリューのバックアップを他の仮想マシンに委譲できる。
【０１３８】
（６）クラスタに仮想マシンが追加されることがある。その場合、クラスタ内で、ハッシュ値の担当範囲が変更され得る。このとき、追加された仮想マシンに既存の仮想マシンから追加された仮想マシンが担当するハッシュ値範囲のキー・バリューが転送されることになる。そこで、追加された仮想マシンは当該転送が完了するまで、他の仮想マシンからの稼働確認に対して稼働中でない旨の応答を返す。これにより、追加直後の仮想マシンで担当すべきキー・バリューのバックアップを他の仮想マシンに委譲できる。
【０１３９】
（７）バックアップ処理中にクラスタの仮想マシンが増減することがある。すると、Ｓｅｌｅｃｔ関数やＮｅｘｔ関数の結果が変化し得る。仮想マシンの増減のタイミングによっては、あるキーについて次回のバックアップに先送りになったり、複数の仮想マシンで短時間に連続してバックアップが行われたりする。しかし、バックアップ漏れが生じるわけではない。
【０１４０】
（８）バックアップ処理中に仮想マシンが追加されることがある。すると、追加された仮想マシンへキー・バリューの移動が行われる。移動元の仮想マシンからは当該キー・バリューは削除されることになる。すると、そのキーのバックアップ処理担当の仮想マシンにおいて、当該キーのバックアップを試みても当該キーが存在しないということになる。その場合はキーの読み出しに失敗して当該キーのバックアップは行われない。また、移動元の仮想マシンからキー・バリューが削除されるが、ストレージサーバ４００のバックアップテーブル４１０にはバックアップデータを残すようにする。当該キー・バリューは追加された仮想マシンに移動されて保持されるからである。以後、当該キー・バリューのバックアップは追加された仮想マシンにより実行され得る。
【０１４１】
（９）バックアップ処理中に仮想マシンが削除されることがある。削除された仮想マシンのＫＶＳに存在していたキー・バリューは、他の仮想マシンに移動されることになる。この場合、当該キー・バリューは今回のバックアップ処理の対象とならないことがあるが、次回のバックアップ処理の対象となる。よって、バックアップ漏れが生じるわけではない。
【０１４２】
また、第２の実施の形態では、２つの仮想マシンに冗長でキー・バリューを配置する場合を例示した。一方、３以上の仮想マシンに冗長でキー・バリューを配置する場合も同様にして、重複したバックアップを抑止できる。クラスタを形成する仮想マシンも２つでもよいし、４つ以上でもよい。
【０１４３】
また、前述のように、第１の実施の形態の情報処理は、情報処理装置１，２にプログラムを実行させることで実現できる。また、第２の実施の形態の情報処理は、実行サーバ１００，２００，３００にプログラムを実行させることで実現できる。プログラムは、コンピュータ読み取り可能な記録媒体（例えば、光ディスク１３、メモリ装置１４およびメモリカード１６など）に記録できる。
【０１４４】
プログラムを流通させる場合、例えば、当該プログラムを記録した可搬記録媒体が提供される。また、プログラムを他のコンピュータの記憶装置に格納しておき、ネットワーク経由でプログラムを配布することもできる。コンピュータは、例えば、可搬記録媒体に記録されたプログラムまたは他のコンピュータから受信したプログラムを、記憶装置に格納し、当該記憶装置からプログラムを読み込んで実行する。ただし、可搬記録媒体から読み込んだプログラムを直接実行してもよく、他のコンピュータからネットワークを介して受信したプログラムを直接実行してもよい。
【０１４５】
また、上記の情報処理の少なくとも一部を、ＤＳＰ、ＡＳＩＣ、ＰＬＤなどの電子回路で実現することもできる。
【符号の説明】
【０１４６】
１，２  情報処理装置
１ａ，２ａ  記憶部
１ｂ，２ｂ  演算部
１ｃ，１ｄ，２ｃ，２ｄ  仮想マシン
３  記憶装置
【図１】
2014044553.tif 000003
【図２】
2014044553.tif 000004
【図３】
2014044553.tif 000005
【図４】
2014044553.tif 000006
【図５】
2014044553.tif 000007
【図６】
2014044553.tif 000008
【図７】
2014044553.tif 000009
【図８】
2014044553.tif 000010
【図９】
2014044553.tif 000011
【図１０】
2014044553.tif 000012
【図１１】
2014044553.tif 000013
【図１２】
2014044553.tif 000014
【図１３】
2014044553.tif 000015