(57)【要約】【課題】リモートディスクへデータを書き込む際にエラーが発生した場合にアプリケーションの中断を防ぐこと。【解決手段】リモートディスクにデータを書き込む際にエラーが発生すると、ドライバ３１は、書き込み処理を保留してデーモン３３にエラーの発生を通知する。そして、デーモン３３は、エラー発生スライスの情報をファイルに記録し、一時記録完了をドライバ３１に応答する。そして、ドライバ３１は、書き込み処理を再開して書き込み完了をａｐｐに応答してユーザＩ／Ｏ復帰を行う。また、デーモン３３は、エラー発生スライスの情報をファイルに記録した後、エラー発生スライスの切離しを行う。【選択図】図２
2019082897.tif 000002
【特許請求の範囲】
【請求項１】
自身の不揮発性記憶装置へのデータの書き込み時に他の情報処理装置の不揮発性記憶装置に該データを書き込む情報処理装置において、
アプリケーションからデータの書き込み要求を受け付けて自身の不揮発性記憶装置への該データの書き込みに成功する一方で前記他の情報処理装置の不揮発性記憶装置へ該データを書き込む際にエラーが発生すると該書き込み要求に関する書き込み処理を保留する保留部と、
前記保留部による前記書き込み処理の保留後、前記他の情報処理装置の不揮発性記憶装置へのデータ書き込みのエラーを示すエラー情報を記録する記録部と、
前記記録部による前記エラー情報の記録後、前記書き込み処理を再開して前記書き込み処理の完了をアプリケーションに通知する通知部と、
前記通知部による前記書き込み処理の完了の通知後、前記他の情報処理装置の不揮発性記憶装置の前記アプリケーションで使用される領域を切離す切離部と
を有することを特徴とする情報処理装置。
【請求項２】
当該情報処理装置の起動時に、前記他の情報処理装置が正常に動作している場合に、前記エラー情報に基づいて、自身の不揮発性記憶装置と前記他の情報処理装置の不揮発性記憶装置との間でデータの整合をとる複写部
をさらに有することを特徴とする請求項１に記載の情報処理装置。
【請求項３】
前記複写部により自身の不揮発性記憶装置と前記他の情報処理装置の不揮発性記憶装置との間でデータの整合がとられると、前記エラー情報を削除する削除部
をさらに有することを特徴とする請求項２に記載の情報処理装置。
【請求項４】
アプリケーションで使用される領域毎に切離しが行われているか否かを示す情報を構成情報として記憶する構成情報記憶部をさらに有し、
前記切離部は、前記他の情報処理装置との間での排他制御に用いられるロックを取得し、前記構成情報のうち前記エラーが発生した領域に対応する箇所を、切離しが行われていることを示す情報に更新することを自身及び前記他の情報処理装置に対して行うことを特徴とする請求項１、２又は３に記載の情報処理装置。
【請求項５】
当該情報処理装置の起動時に、前記他の情報処理装置が正常に動作している場合に、前記エラー情報に基づいて、当該情報処理装置及び前記他の情報処理装置の前記構成情報を更新する起動制御部
をさらに有することを特徴とする請求項４に記載の情報処理装置。
【請求項６】
前記記録部は、前記エラー情報の記録に失敗した場合に、前記構成情報の更新後に、前記エラー情報の記録を再度試みることを特徴とする請求項５に記載の情報処理装置。
【請求項７】
前記記録部は、前記エラー情報として、自身の不揮発性記憶装置と前記他の情報処理装置の不揮発性記憶装置の組を識別するクラス識別子と、前記アプリケーションで使用される領域を識別するボリューム識別子と、自身の不揮発性記憶装置と前記他の情報処理装置の不揮発性記憶装置のいずれであるかを識別するＳＣＳＩ識別子を記録することを特徴とする請求項１〜６のいずれか１つに記載の情報処理装置。
【請求項８】
不揮発性記憶装置をそれぞれ備える第１の情報処理装置と第２の情報処理装置を有し、一方の不揮発性記憶装置にデータを書き込む際に他方の不揮発性記憶装置に該データを書き込む情報処理システムにおいて、
前記第１の情報処理装置は、
アプリケーションからデータの書き込み要求を受け付けて自身の不揮発性記憶装置への該データの書き込みに成功する一方で前記第２の情報処理装置の不揮発性記憶装置へ該データを書き込む際にエラーが発生すると該書き込み要求に関する書き込み処理を保留する保留部と、
前記保留部による前記書き込み処理の保留後、前記第２の情報処理装置の不揮発性記憶装置へのデータ書き込みのエラーを示すエラー情報を記録する記録部と、
前記記録部による前記エラー情報の記録後、前記書き込み処理を再開して前記書き込み処理の完了をアプリケーションに通知する通知部と、
前記通知部による前記書き込み処理の完了の通知後、前記第２の情報処理装置の不揮発性記憶装置の前記アプリケーションで使用される領域を切離す切離部と
を有することを特徴とする情報処理システム。
【請求項９】
自身の不揮発性記憶装置へのデータの書き込み時に他の情報処理装置の不揮発性記憶装置に該データを書き込む情報処理装置で実行されるプログラムにおいて、
アプリケーションからデータの書き込み要求を受け付けて自装置の不揮発性記憶装置への該データの書き込みに成功する一方で前記他の情報処理装置の不揮発性記憶装置へ該データを書き込む際にエラーが発生すると該書き込み要求に関する書き込み処理を保留し、
前記書き込み処理の保留後、前記他の情報処理装置の不揮発性記憶装置へのデータ書き込みのエラーを示すエラー情報を記録し、
前記エラー情報の記録後、前記書き込み処理を再開して前記書き込み処理の完了をアプリケーションに通知し、
前記書き込み処理の完了を通知後、前記他の情報処理装置の不揮発性記憶装置の前記アプリケーションで使用される領域を切離す
処理を前記情報処理装置に実行させることを特徴とするプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報処理装置、情報処理システム及びプログラムに関する。
【背景技術】
【０００２】
近年、ローカルディスク装置に記憶したデータを他の情報処理装置のローカルディスク装置にミラーリングすることでデータの可用性を向上する情報処理装置が利用されている。このようなローカルディスク装置を用いた情報処理装置間のミラーリングには、共用ストレージなしでクラスタシステムを構築できる、遠隔地へのフェイルオーバが可能である、ストレージ筐体が単一障害点となることがない等の利点がある。ここで、クラスタシステムとは、複数の情報処理装置を連携して１つのシステムとして運用されるシステムである。
【０００３】
なお、故障ノードが検出されると、管理対象のスライスに対応付けられ、他のストレージノードが管理するスライスに、故障ノードのスライスが含まれているかどうかを判定し、故障ノードのスライスが含まれているときはミラーリングを行わない技術がある。この技術によれば、故障ノードの切離しなしでストレージサービスを継続できるので、故障ノードの切離しを行う制御ノードが停止している場合にもストレージサービスを継続することができる。
【０００４】
また、現用系ノードのディスクをオリジナルとし、ネットワークを介して接続される待機系ノードのディスクをシャドウとするミラーリング構成を採るときに、障害発生に適切に対処する二重化システムがある。この二重化システムは、現用系ノードのディスクに障害が発生すると、待機系として動作しているノードを運用状態にするとともに、それまで現用系として動作していたノードを停止させることで、二重化システムとしての動作を停止させるように処理する。また、この二重化システムは、待機系ノードのディスクに障害が発生すると、待機系として動作しているノードを停止させることで、二重化システムとしての動作を停止させるように処理する。また、この二重化システムは、シャドウディスクへのアクセス用に用意されるネットワークに障害が発生すると、待機系として動作しているノードを停止させることで、二重化システムとしての動作を停止させるように処理する。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２０１０−１２８８８６号公報
【特許文献２】特開２００２−１２３４０６号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
ローカルディスク装置を用いた情報処理装置間のミラーリングには、アプリケーションからのデータ書き込み要求に関して他の情報処理装置のローカルディスク装置へのデータの書き込みでエラーが発生すると、アプリケーションへの応答が行われない。したがって、アプリケーションの処理が中断されるという問題がある。
【０００７】
図１４は、従来の書き込み処理の問題を説明するための図である。図１４において、情報処理システム９は、ノード＃１１及びノード＃１２で表されるノード９１を有する。ノード９１は、情報処理装置である。ノード＃１１及びノード＃１２は、クラスタシステムを構築し、ネットワーク３で接続される。ネットワーク３は、リモートディスクへのアクセス、ハートビート、ノード９１の停止確認の全てに用いられる。ここで、リモートディスクとは、クラスタシステムを構築する他のノード９１が有するディスク装置２３である。
【０００８】
ノード９１ではａｐｐ２１で表されるアプリケーションが動作する。ａｐｐ２１は、クラスタ制御部９２を介してディスク装置２３へのデータの書き込み及びディスク装置２３からのデータの読み出しを行う。クラスタ制御部９２は、クラスタシステムに関する処理を行い、ディスク制御部９０を有する。
【０００９】
ディスク制御部９０は、ディスク装置２３へのデータの書き込み及びディスク装置２３からのデータの読み出しを制御する。ノード＃１１のディスク制御部９０は、自装置のディスク装置２３にデータを書き込む際に、ノード＃１２のディスク装置２３にもデータを書き込む。すなわち、ディスク制御部９０は、ミラーリングを行う。
【００１０】
ノード＃１１のディスク制御部９０は、ａｐｐ２１からデータの書き込み要求を受け付けると（ｔ９１）、ローカルディスクにデータの書き込み（ＷＲＩＴＥ）を行う（ｔ９２）とともに、ネットワーク３を介してリモートディスクへもデータの書き込み（ＷＲＩＴＥ）を行う（ｔ９３）。
【００１１】
そして、ノード＃１１のディスク制御部９０は、ローカルディスクから書き込み完了の応答を受け取る（ｔ９４）。一方、ネットワーク３及びノード＃１２に異常がある場合、ノード＃１２との通信が行えないため、ノード＃１１のディスク制御部９０は、ＥＲＲＯＲを受け取る（ｔ９５）。例えば、情報処理システム９が災害対策用に構築されている場合、災害発生によりネットワーク３及びノード＃１２に異常が発生する。
【００１２】
ＥＲＲＯＲを受け取ると、ノード＃１１のディスク制御部９０は、リモートスライスの切離しを行う。ここで、スライスとは、ノード＃１１のａｐｐ２１が使用するデータの部分データである。ノード＃１１のディスク制御部９０は、リモートスライスの切離しを行うため、クラスタロックを取得しようとする（ｔ９６）。ここで、クラスタロックとは、クラスタシステムを構築するノード９１間の排他制御で使用される鍵である。
【００１３】
ノード＃１１のディスク制御部９０は、ノード＃１２との通信が行えないため、クラスタロックを取得することができない。また、ネットワーク３は、リモートディスクへのアクセス及びハートビートに用いられるため、ノード＃１１のディスク制御部９０は、ノード＃１２の生存確認ができない。さらに、ネットワーク３は、ノード＃１２の停止確認にも用いられるため、ノード＃１１のディスク制御部９０は、ノード＃１２の停止確認を行うことができない。したがって、ノード＃１１のディスク制御部９０は、ノード＃１２の停止確定待ちとなり、ａｐｐ２１への応答を行うことができない。
【００１４】
オペレータによりノード＃１２の停止確認が行われ、ノード＃１１にノード＃１２の停止確認が伝えられると、ノード＃１１のディスク制御部９０は、ローカルディスクの構成情報の書き換えを行う（ｔ９７）とともに、リモートディスクの構成情報の書き換えを行う（ｔ９８）。
【００１５】
ここで、構成情報は、クラスタシステムの構成に関する情報であり、スライス毎の状態に関する情報を含む。スライスの状態としては、例えば、正常、切離し等がある。構成情報の変更には、ノード９１間で排他をとる必要がある。このため、ノード＃１１のディスク制御部９０は、ｔ９６において、クラスタロックを取得しようとする。
【００１６】
そして、ノード＃１１のディスク制御部９０は、ローカルディスクから書き込み完了の応答を受け取る（ｔ９９）。一方、ネットワーク３に異常があるため、ノード＃１１のディスク制御部９０は、ＥＲＲＯＲを受け取る（ｔ１００）。そして、ノード＃１１のディスク制御部９０は、ａｐｐ２１に書き込み完了を応答することでユーザＩ／Ｏ復帰を行う（ｔ１０１）。この場合、ａｐｐ２１への応答が行われるが、応答までに要する時間が長い。
【００１７】
本発明は、１つの側面では、アプリケーションの中断を防ぐことを目的とする。
【課題を解決するための手段】
【００１８】
１つの態様では、情報処理装置は、自身の不揮発性記憶装置へのデータの書き込み時に他の情報処理装置の不揮発性記憶装置に該データを書き込む。情報処理装置は、保留部と、記録部と、通知部と、切離部とを有する。保留部は、アプリケーションからデータの書き込み要求を受け付けて自身の不揮発性記憶装置へのデータの書き込みに成功する一方で他の情報処理装置の不揮発性記憶装置へデータを書き込む際にエラーが発生すると該書き込み要求に関する書き込み処理を保留する。記録部は、保留部による前記書き込み処理の保留後、他の情報処理装置の不揮発性記憶装置へのデータ書き込みのエラーを示すエラー情報を記録する。通知部は、記録部によるエラー情報の記録後、書き込み処理を再開して書き込み処理の完了をアプリケーションに通知する。切離部は、通知部による書き込み処理の完了の通知後、他の情報処理装置の不揮発性記憶装置の前記アプリケーションで使用される領域を切離す。
【発明の効果】
【００１９】
１つの側面では、本発明は、アプリケーションの中断を防ぐことができる。
【図面の簡単な説明】
【００２０】
【図１Ａ】図１Ａは、実施例に係る情報処理システムによる書き込み処理を説明するための第１の図である。
【図１Ｂ】図１Ｂは、実施例に係る情報処理システムによる書き込み処理を説明するための第２の図である。
【図１Ｃ】図１Ｃは、実施例に係る情報処理システムによる書き込み処理を説明するための第３の図である。
【図１Ｄ】図１Ｄは、実施例に係る情報処理システムによる書き込み処理を説明するための第４の図である。
【図１Ｅ】図１Ｅは、実施例に係る情報処理システムによる書き込み処理を説明するための第５の図である。
【図１Ｆ】図１Ｆは、実施例に係る情報処理システムによる書き込み処理を説明するための第６の図である。
【図１Ｇ】図１Ｇは、実施例に係る情報処理システムによる書き込み処理を説明するための第７の図である。
【図１Ｈ】図１Ｈは、実施例に係る情報処理システムによる書き込み処理を説明するための第８の図である。
【図１Ｉ】図１Ｉは、実施例に係る情報処理システムによる書き込み処理を説明するための第９の図である。
【図２】図２は、ディスク制御部の機能構成を示す図である。
【図３Ａ】図３Ａは、故障情報記憶部の一例を示す図である。
【図３Ｂ】図３Ｂは、クラス、ボリューム、スライスの関係を示す図である。
【図４】図４は、リモートディスクにおいて書き込みエラーが発生する場合のシーケンス図である。
【図５】図５は、ドライバによる書き込処理のフローを示すフローチャートである。
【図６】図６は、書き込み完了時の割込み処理のフローを示すフローチャートである。
【図７】図７は、Ｉ／Ｏエラーイベントに関してデーモンが行う処理のフローを示すフローチャートである。
【図８】図８は、エラー発生スライスの情報を一時記録する処理のフローを示すフローチャートである。
【図９】図９は、切離し処理のフローを示すフローチャートである。
【図１０】図１０は、構成情報を更新する処理のフローを示すフローチャートである。
【図１１】図１１は、ボリューム起動時の処理のフローを示すフローチャートである。
【図１２】図１２は、コピー完了時の故障ディスク情報の削除処理のフローを示すフローチャートである。
【図１３】図１３は、実施例に係るディスク制御プログラムを実行するコンピュータのハードウェア構成を示す図である。
【図１４】図１４は、従来の書き込み処理の問題を説明するための図である。
【発明を実施するための形態】
【００２１】
以下に、本願の開示する情報処理装置、情報処理システム及びプログラムの実施例を図面に基づいて詳細に説明する。なお、この実施例は開示の技術を限定するものではない。
【実施例】
【００２２】
まず、実施例に係る情報処理システムによる書き込み処理について説明する。図１Ａ〜図１Ｉは、実施例に係る情報処理システムによる書き込み処理を説明するための図である。図１Ａ〜図１Ｉにおいて、情報処理システム１は、ノード＃１及びノード＃２で表されるノード２を有する。ノード２は、情報処理装置である。ノード＃１及びノード＃２は、クラスタシステムを構築し、ネットワーク３で接続される。ネットワーク３は、リモートディスクへのアクセス、ハートビート、ノード２の停止確認の全てに用いられる。なお、情報処理システム１は、３台以上のノード２を用いてクラスタシステムを構築してもよい。
【００２３】
ノード２ではａｐｐ２１で表されるアプリケーションが動作する。ａｐｐ２１は、クラスタ制御部２２を介してディスク装置２３へのデータの書き込み及びディスク装置２３からのデータの読み出しを行う。クラスタ制御部２２は、クラスタシステムに関する処理を行い、ディスク制御部３０を有する。
【００２４】
ディスク制御部３０は、ディスク装置２３へのデータの書き込み及びディスク装置２３からのデータの読み出しを制御する。ノード＃１のディスク制御部３０は、自装置のディスク装置２３にデータを書き込む際に、ノード＃２のディスク装置２３にもデータを書き込む。すなわち、ディスク制御部３０は、ミラーリングを行う。
【００２５】
図１Ａに示すように、ノード＃１のディスク制御部３０は、ａｐｐ２１からデータの書き込み要求を受け付けると（ｔ１）、ローカルディスクにデータの書き込み（ＷＲＩＴＥ）を行う（ｔ２）とともに、ネットワーク３を介してリモートディスクへもデータの書き込み（ＷＲＩＴＥ）を行う（ｔ３）。
【００２６】
そして、図１Ｂに示すように、ノード＃１のディスク制御部３０は、ローカルディスクから書き込み完了の応答を受け取る（ｔ４）。一方、ネットワーク３及びノード＃２に異常がある場合、ノード＃２との通信が行えないため、ノード＃１のディスク制御部３０は、ＥＲＲＯＲを受け取る（ｔ５）。
【００２７】
すると、図１Ｃに示すように、ノード＃１のディスク制御部３０は、書き込み処理を保留し、故障ディスク情報を他のノード２からもアクセス可能な所定の領域に記録する（ｔ６）。そして、図１Ｄに示すように、ノード＃１のディスク制御部３０は、書き込み処理を再開し、ａｐｐ２１に書き込み完了を応答することでユーザＩ／Ｏ復帰を行う（ｔ７）。
【００２８】
そして、ノード＃１のディスク制御部３０は、図１Ｅに示すように、リモートスライスの切離しを行う。ノード＃１のディスク制御部３０は、リモートスライスの切離しを行うため、クラスタロックを取得しようとする（ｔ８）。
【００２９】
ノード＃１のディスク制御部３０は、ノード＃２との通信が行えないため、クラスタロックを取得することができない。また、ネットワーク３は、リモートディスクへのアクセス及びハートビートに用いられるため、ノード＃１のディスク制御部３０は、ノード＃２の生存確認ができない。さらに、ネットワーク３は、ノード＃２の停止確認にも用いられるため、ノード＃１のディスク制御部３０は、ノード＃２の停止確認を行うことができない。したがって、ノード＃１のディスク制御部３０は、図１Ｆに示すように、ノード＃２の停止確定待ちとなる。
【００３０】
その後、オペレータによりノード＃２の停止確認が行われ、ノード＃１にノード＃２の停止確認が伝えられると、ノード＃１のディスク制御部３０は、図１Ｇに示すように、ローカルディスクの構成情報の書き換えを行う（ｔ９）。
【００３１】
そして、ノード＃１のディスク制御部３０は、図１Ｈに示すように、リモートディスクの構成情報の書き換えを行う（ｔ１０）。そして、ノード＃１のディスク制御部３０は、ローカルディスクから書き込み完了の応答を受け取る（ｔ１１）。一方、ネットワーク３及びノード＃２に異常があるため、ノード＃１のディスク制御部３０は、ＥＲＲＯＲを受け取る（ｔ１２）。そして、図１Ｉに示すように、ノード＃１のディスク制御部３０は、スライス切離しを完了する。
【００３２】
このように、ノード＃１のディスク制御部３０は、ネットワーク３に異常がある場合、故障ディスク情報を他のノード２からもアクセス可能な所定の領域に記録し、ａｐｐ２１に書き込み完了を応答してユーザＩ／Ｏ復帰を行う。したがって、ノード＃１のディスク制御部３０は、アプリケーションの中断を防ぐことができる。
【００３３】
次に、ディスク制御部３０の機能構成について説明する。図２は、ディスク制御部３０の機能構成を示す図である。図２に示すように、ディスク制御部３０は、ドライバ３１と、イニシエータ３２と、デーモン３３と、故障情報記憶部３４ａと、構成情報記憶部３４ｂとを有する。
【００３４】
ドライバ３１は、ディスク装置２３からのデータの読み出し及びディスク装置２３へのデータの書き込みを制御する。ドライバ３１は、ａｐｐ２１からデータの書き込み要求を受け付けて、ローカルディスク及びリモートディスクへのデータの書き込みを制御する。イニシエータ３２は、ドライバ３１の指示に基づいて、リモートディスクへのデータの書き込みを行う。ドライバ３１は、エラー通知部３１ａと、完了通知部３１ｂと、コピー部３１ｃを有する。
【００３５】
エラー通知部３１ａは、イニシエータ３２からリモートディスクへのデータの書き込みでＩ／Ｏエラーの発生を通知されると、書き込み処理を保留し、デーモン３３にＩ／Ｏエラーを通知する。
【００３６】
完了通知部３１ｂは、Ｉ／Ｏエラーの発生を通知されたデーモン３３から、故障ディスク情報の書き込み完了を通知されると、書き込み処理を再開して書き込み完了をａｐｐ２１に通知する。
【００３７】
コピー部３１ｃは、例えば、ノード２の起動時に、他のノード２が正常に動作している場合、故障ディスク情報を用いてローカルディスクとリモートディスクの間で整合をとる処理を行う。
【００３８】
デーモン３３は、イベントを受信すると、イベントに対応する処理を行う。イベントには、Ｉ／Ｏエラーの他、ボリューム起動要求、コピー完了通知等がある。
【００３９】
故障情報記憶部３４ａは、故障ディスク情報を記憶する。故障情報記憶部３４ａの情報は、他のノード２からのアクセス可能である。図３Ａは、故障情報記憶部３４ａの一例を示す図である。図３Ａに示すように、故障情報記憶部３４ａは、故障ディスク情報として、Ｉ／Ｏエラーが発生したスライス毎に、クラスＩＤ、ボリュームＩＤ、ＳＣＳＩＩＤを記憶する。
【００４０】
クラスＩＤは、クラスを識別する識別子であり、ボリュームＩＤは、ボリュームを識別する識別子であり、ＳＣＳＩＩＤは、ミラーリングペアのいずれであるかを識別する識別子である。図３Ｂは、クラス、ボリューム、スライスの関係を示す図である。図３Ｂに示すように、ミラーリングペアのディスク装置２３はクラスとして管理され、クラスには複数のボリュームが含まれる。ボリュームはミラーリングペアのスライスで構成される。したがって、クラスＩＤ、ボリュームＩＤ、ＳＣＳＩＩＤによりスライスが特定される。
【００４１】
構成情報記憶部３４ｂは、構成情報を記憶する。すなわち、構成情報記憶部３４ｂは、クラスタシステムの構成に関する情報を記憶する。構成情報記憶部３４ｂは、スライス毎の状態を記憶する。
【００４２】
デーモン３３は、故障情報書込部３５と、切離部３６と、起動制御部３７と、故障情報削除部３８とを有する。故障情報書込部３５は、リモートディスクへのデータの書き込みが失敗した場合に、故障ディスク情報を故障情報記憶部３４ａに書き込む。そして、故障情報書込部３５は、故障ディスク情報を故障情報記憶部３４ａに書き込んだことをドライバ３１に通知する。
【００４３】
切離部３６は、リモートディスクへのデータの書き込みが失敗した場合に、リモートスライスの切離しを行う。具体的には、切離部３６は、クラスタロックを取得し、構成情報の変更を行う。
【００４４】
起動制御部３７は、ボリュームの起動時に、自ノード２に記録された故障ディスク情報とリモートノード２に記録された故障ディスク情報を取得し、取得した故障情報に基づいて、構成情報を更新する。
【００４５】
故障情報削除部３８は、ミラーリングペアのスライスの間でコピー処理により整合がとられると、整合がとれたスライスについて故障ディスク情報から情報を削除し、構成情報の当該スライスの状態を正常に変更する。
【００４６】
次に、リモートディスクにおいて書き込みエラーが発生する場合のシーケンスについて説明する。図４は、リモートディスクにおいて書き込みエラーが発生する場合のシーケンス図である。
【００４７】
図４に示すように、ノード＃１のドライバ３１は、ａｐｐ２１からデータの書き込み要求を受け付けると（ｔ２１）、ローカルディスクにデータの書き込み（ＷＲＩＴＥ）を行う（ｔ２２）。そして、ノード＃１のドライバ３１は、イニシエータ３２にリモートディスクへのデータの書き込みを依頼する（ｔ２３）。
【００４８】
イニシエータ３２は、ネットワーク３を介してリモートディスクへデータの書き込みを行う（ｔ２４）が、ネットワーク３及びノード＃２に異常があるため、データの書き込みに失敗してエラーを通知される（ｔ２５）。
【００４９】
そして、ドライバ３１は、ローカルディスクから書き込み完了の応答を受け取り（ｔ２６）、イニシエータ３２からＥＲＲＯＲを受け取る（ｔ２７）。すると、ドライバ３１は、書き込み処理を保留し、デーモン３３にＥＲＲＯＲ通知を行う（ｔ２８）。すると、デーモン３３は、エラー発生スライスの情報をファイルに記録する（ｔ２９）。エラー発生スライスの情報の記録は、故障ディスク情報の記録に対応し、デーモン３３は、クラスＩＤ、ボリュームＩＤ及びＳＣＳＩＩＤをファイルに書き込む。また、ファイルは故障情報記憶部３４ａに対応する。
【００５０】
そして、デーモン３３は、クラスＩＤ、ボリュームＩＤ及びＳＣＳＩＩＤの書き込みの応答を受け取ると（ｔ３０）、一時記録完了をドライバ３１に通知する（ｔ３１）。ここで、一時記録とは、エラー発生スライスの情報をファイルに記録することである。そして、ドライバ３１は、書き込み処理を再開し、ａｐｐ２１に書き込み完了を応答することでユーザＩ／Ｏ復帰を行う（ｔ３２）。
【００５１】
また、デーモン３３は、一時記録完了をドライバ３１に通知後、エラー発生スライスの切離しを行う。デーモン３３は、エラー発生スライスの切離しとして、クラスタロックを取得しようとする（ｔ３３）が、ノード＃２との通信が行えないため、クラスタロックを取得することができない。
【００５２】
また、ネットワーク３は、リモートディスクへのアクセス及びハートビートに用いられるため、ノード＃１は、ノード＃２の生存確認ができない。さらに、ネットワーク３は、ノード＃２の停止確認にも用いられるため、ノード＃１は、ノード＃２の停止確認を行うことができない。したがって、デーモン３３は、ノード＃２の停止確定待ちとなる。
【００５３】
その後、オペレータによりノード＃２の停止確認が行われ、ノード＃１にノード＃２の停止確認が伝えられると、デーモン３３は、占有域の情報を更新する（ｔ３４）。ここで、占有域とは、構成情報が記憶される領域である。そして、デーモン３３は、イニシエータ３２にリモートディスクの占有域の情報更新を依頼する（ｔ３５）。
【００５４】
イニシエータ３２は、ネットワーク３を介してリモートディスクの占有域の情報を更新を行う（ｔ３６）が、ネットワーク３及びノード＃２に異常があるため、更新に失敗してエラーを通知される（ｔ３７）。
【００５５】
そして、デーモン３３は、ローカルディスクから応答を受け取り（ｔ３８）、イニシエータ３２からＥＲＲＯＲを受け取る（ｔ３９）。そして、デーモン３３は、占有域（リモート）の切離しを行い、エラー発生スライスの切離しを完了する。そして、デーモン３３は、リカバリ処理完了をドライバ３１に通知する（ｔ４０）。
【００５６】
次に、ドライバ３１及びデーモン３３による処理のフローについて図５〜図１２を用いて説明する。図５は、ドライバ３１による書き込み処理のフローを示すフローチャートである。図５に示すように、ドライバ３１は、Ｉ／Ｏカウンタをインクリメントする（ステップＳ１）。ここで、Ｉ／Ｏカウンタは、発行したＷＲＩＴＥの数をカウントするカウンタである。
【００５７】
そして、ドライバ３１は、ローカルディスクにＷＲＩＴＥを発行し（ステップＳ２）、Ｉ／Ｏカウンタをインクリメントする（ステップＳ３）。そして、ドライバ３１は、リモートディスクにＷＲＩＴＥを発行する（ステップＳ４）。
【００５８】
このように、ドライバ３１は、ＷＲＩＴＥを発行する毎にＩ／Ｏカウンタをインクリメントすることで、発行したＷＲＩＴＥに対する応答の有無を判定することができる。
【００５９】
図６は、書き込み完了時の割込み処理のフローを示すフローチャートである。ドライバ３１により発行されたＷＲＩＴＥが完了すると割込みが発生する。したがって、ドライバ３１がローカルディスクとリモートディスクにＷＲＩＴＥを発行すると、図６の処理は２回実行される。
【００６０】
図６に示すように、ドライバ３１は、割込み処理において、Ｉ／Ｏ結果を判定する（ステップＳ１１）。そして、Ｉ／Ｏ結果が失敗である場合には、ドライバ３１は、デーモン３３にＩ／Ｏエラーイベントを発行する（ステップＳ１２）。そして、ドライバ３１は、デーモン３３から一時記録完了通知を受信する（ステップＳ１３）。一方、Ｉ／Ｏ結果が成功である場合には、ドライバ３１は、ステップＳ１４へ進む。
【００６１】
そして、ドライバ３１は、Ｉ／Ｏカウンタをデクリメントし（ステップＳ１４）、Ｉ／Ｏカウンタ数を判定する（ステップＳ１５）。そして、Ｉ／Ｏカウンタ数が１以上である場合には、２つのＷＲＩＴＥ発行後の１回目の割込み処理なので、ドライバ３１は、割込み処理を終了する。
【００６２】
一方、Ｉ／Ｏカウンタ数が１未満である場合には、２つのＷＲＩＴＥ発行後の２回目の割込み処理なので、ドライバ３１は、Ｉ／Ｏ成功数を判定する（ステップＳ１６）。ここで、Ｉ／Ｏ成功数は、ディスク装置２３へのＩ／Ｏが成功した数である。そして、ドライバ３１は、Ｉ／Ｏ成功数が１未満である場合には、失敗でユーザＩ／Ｏ復帰を行い（ステップＳ１７）、１以上である場合には、成功でユーザＩ／Ｏ復帰を行う（ステップＳ１８）。
【００６３】
このように、ドライバ３１は、発行したＷＲＩＴＥが失敗した場合にデーモン３３にＩ／Ｏエラーイベントを発行することで、Ｉ／Ｏエラーの発生を記録することができる。
【００６４】
図７は、Ｉ／Ｏエラーイベントに関してデーモン３３が行う処理のフローを示すフローチャートである。図７に示すように、デーモン３３は、Ｉ／Ｏエラーイベントを受信する（ステップＳ２１）と、ファイルにエラー発生スライスの情報を記録する（ステップＳ２２）。
【００６５】
そして、デーモン３３は、記録結果を判定し（ステップＳ２３）、記録が成功である場合には、ドライバ３１に一時記録完了を通知し（ステップＳ２４）、メモリに一時記録結果として成功を格納する（ステップＳ２５）。一方、記録が失敗である場合には、デーモン３３は、メモリに一時記録結果として失敗を格納する（ステップＳ２６）。
【００６６】
そして、デーモン３３は、自分がマスターノード２か否かを判定する（ステップＳ２７）。ここで、マスターノード２とは、クラスタシステムにおいてマスタとして動作するノード２であり、構成情報の更新等を行うノード２である。そして、自分がマスターノード２である場合には、デーモン３３は、構成情報の更新を行う切離し処理を実行する（ステップＳ２８）。そして、デーモン３３は、ドライバ３１にリカバリ処理完了を通知する（ステップＳ２９）。
【００６７】
一方、自分がマスターノード２でない場合には、デーモン３３は、リモートノード２へ切離し処理を依頼し（ステップＳ３０）、通信に失敗したか否か判定する（ステップＳ３１）。そして、デーモン３３は、通信に失敗した場合には、ステップＳ３０へ戻り、通信に成功した場合には、リモートノード２から切離し処理の完了通知を受信する（ステップ３２）。そして、デーモン３３は、ドライバ３１にリカバリ処理完了を通知する（ステップＳ２９）。
【００６８】
このように、デーモン３３が、Ｉ／Ｏエラーイベントを受信すると、ファイルにエラー発生スライスの情報を記録し、ドライバ３１に一時記録完了を通知することで、ドライバ３１は、切離し処理の前にａｐｐ２１に書き込み処理の完了を通知することができる。
【００６９】
図８は、エラー発生スライスの情報を一時記録する処理のフローを示すフローチャートである。なお、図８の処理は、図７に示したステップＳ２２の処理に対応する。図８に示すように、デーモン３３は、エラー発生スライスとして指定されたクラスＩＤとボリュームＩＤに一致する情報が既にあるか否かを判定し（ステップＳ４１）、既にある場合には、ステップＳ４５へ進む。
【００７０】
一方、エラー発生スライスとして指定されたクラスＩＤとボリュームＩＤに一致する情報がない場合には、デーモン３３は、指定されたクラスＩＤ、ボリュームＩＤ及びＳＣＳＩＩＤをファイルに書き込む（ステップＳ４２）。そして、デーモン３３は、書き込み結果を判定し（ステップＳ４３）、失敗した場合には失敗を返し（ステップＳ４４）、成功した場合には、成功を返す（ステップＳ４５）。
【００７１】
このように、デーモン３３は、クラスＩＤ、ボリュームＩＤ及びＳＣＳＩＩＤをファイルに書き込むことで、エラー発生スライスを特定できる情報を記録することができる。
【００７２】
図９は、切離し処理のフローを示すフローチャートである。図９に示すように、デーモン３３は、クラスタロックを取得し（ステップＳ５１）、クラスタロックが取れたか否かを判定する（ステップＳ５２）。そして、クラスタロックが取れない場合には、デーモン３３は、ステップＳ５１へ戻る。
【００７３】
一方、クラスタロックが取れた場合には、デーモン３３は、メモリ上の構成情報でエラー発生スライスの状態を切離し状態に変更し（ステップＳ５３）、ディスク装置２３の構成情報を更新する（ステップＳ５４）。そして、デーモン３３は、更新結果を判定し（ステップＳ５５）、更新に成功した場合には、メモリの一時記録結果を判定する（ステップＳ５６）。
【００７４】
そして、一時記録結果が失敗である場合には、デーモン３３は、ファイルにエラー発生スライスの情報を記録し（ステップＳ５７）、記録結果を判定する（ステップＳ５８）。そして、記録が失敗である場合には、デーモン３３は、ボリュームを強制停止する（ステップＳ５９）。そして、デーモン３３は、リモートノード２に切離し完了を通知する（ステップＳ６０）。なお、図７のステップＳ２８において、自身がマスターノード２で切離し処理を行った場合には、リモートノード２に切離し完了を通知することなく処理を終了する。
【００７５】
また、ステップＳ５８において記録結果が成功の場合、ステップＳ５６においてメモリの一時記録結果が成功の場合、又はステップＳ５５において更新に失敗した場合には、デーモン３３は、ステップＳ６０へ進む。
【００７６】
このように、デーモン３３は、エラー発生スライスの状態を切離し状態に変更して構成情報を更新することで、ディスク制御部３０がエラー発生スライスにアクセスすることを防ぐことができる。なお、図７のステップＳ３０において、リモートノード２に構成情報更新を依頼した場合には、ステップＳ５６〜ステップ５９の処理は、ステップＳ３０を実行したノード２で行われる。
【００７７】
図１０は、構成情報を更新する処理のフローを示すフローチャートである。図１０の処理は、図９に示したステップＳ５４の処理に対応する。図１０に示すように、デーモン３３は、ローカルディスクに構成情報をＷＲＩＴＥし（ステップＳ７１）、リモートディスクに構成情報をＷＲＩＴＥする（ステップＳ７２）。なお、ステップＳ７１とステップＳ７２の順序は逆でもよい。
【００７８】
そして、デーモン３３は、Ｉ／Ｏ成功数を判定し（ステップＳ７３）、１未満である場合には、ボリュームを強制停止し（ステップＳ７４）、失敗を返す（ステップＳ７５）。一方、Ｉ／Ｏ成功数が１以上である場合には、デーモン３３は、Ｉ／Ｏ成功数を判定し（ステップＳ７６）、１である場合には、エラーの占有域を切離し（ステップＳ７７）、成功を返す（ステップＳ７８）。また、Ｉ／Ｏ成功数が１より大きい場合には、デーモン３３は、成功を返す（ステップＳ７８）。
【００７９】
このように、デーモン３３は、構成情報を更新する際に、ローカルディスクとリモートディスクの両方を更新することで、クラスタシステムを構築するノード２間で構成情報の整合をとることができる。
【００８０】
図１１は、ボリューム起動時の処理のフローを示すフローチャートである。図１１に示すように、デーモン３３は、ボリューム起動処理要求を受信する（ステップＳ８１）と、自ノード２の故障ディスク情報をファイルから取得する（ステップＳ８２）。そして、デーモン３３は、取得結果を判定し（ステップＳ８３）、失敗である場合には、ボリューム起動失敗を応答する（ステップＳ８４）。
【００８１】
一方、自ノード２の故障ディスク情報の取得に成功した場合には、デーモン３３は、他ノード２の故障ディスク情報をファイルから取得する（ステップＳ８５）。そして、デーモン３３は、取得結果を判定し（ステップＳ８６）、失敗である場合には、ボリューム起動失敗を応答する（ステップＳ８７）。
【００８２】
一方、他ノード２の故障ディスク情報の取得に成功した場合には、デーモン３３は、エラー発生スライスがないか否かを判定し（ステップＳ８８）、ない場合にはボリュームを起動する（ステップＳ８９）。一方、エラー発生スライスがある場合には、デーモン３３は、エラー発生スライス情報が片ノード２だけにあるか否かを判定する（ステップＳ９０）。
【００８３】
そして、エラー発生スライス情報が片ノード２だけにある場合には、デーモン３３は、エラー発生スライス情報があるスライスの構成情報における状態が正常であるか否かを判定する（ステップＳ９１）。そして、エラー発生スライス情報があるスライスの構成情報における状態が正常である場合には、デーモン３３は、エラー発生スライスの状態をメモリ上の構成情報で切離しに変更する（ステップＳ９２）。そしてデーモン３３は、非エラー発生スライスの状態をメモリ上の構成情報で正常に変更する（ステップＳ９３）。
【００８４】
そして、デーモン３３は、ディスク装置２３の構成情報を更新し（ステップＳ９４）、更新結果を判定する（ステップＳ９５）。そして、デーモン３３は、更新に失敗した場合には、ボリューム起動失敗を応答し（ステップＳ９６）、更新に成功した場合には、ボリュームを起動する（ステップＳ９７）。
【００８５】
また、ステップＳ９０においてエラー発生スライス情報が両ノード２にある場合には、デーモン３３は、エラー発生スライス情報が両ノード２で一致するか否かを判定し（ステップＳ９８）、一致する場合には、ステップＳ９１へ移動する。一方、エラー発生スライス情報が両ノード２で一致しない場合には、デーモン３３は、ボリューム起動失敗を応答する（ステップＳ９９）。
【００８６】
このように、デーモン３３は、ボリューム起動時に故障ディスク情報に基づいて構成情報を更新することにより、構成情報に最新の状態を反映することができる。
【００８７】
図１２は、コピー完了時の故障ディスク情報の削除処理のフローを示すフローチャートである。図１２に示すように、デーモン３３は、ドライバ３１からコピー完了通知を受領する（ステップＳ１０１）と、コピーが完了したスライスの状態を判定し（ステップＳ１０２）、切離し状態である場合には、処理を終了する。
【００８８】
一方、コピーが完了したスライスの状態がコピー中である場合には、デーモン３３は、コピー結果を判定し（ステップＳ１０３）、成功である場合には、ファイルのエラー発生スライス情報を削除し（ステップＳ１０４）、削除結果を判定する（ステップＳ１０５）。そして、デーモン３３は、削除結果が成功である場合には、メモリ上の構成情報でスライスの状態をコピー中から正常に変更する（ステップＳ１０６）。一方、デーモン３３は、削除結果が失敗である場合には、メモリ上の構成情報でスライスの状態をコピー中から切離しに変更する（ステップＳ１０７）。そして、デーモン３３は、ディスク装置２３の構成情報を更新する（ステップＳ１０８）。
【００８９】
また、ステップＳ１０３においてコピー結果が失敗である場合には、デーモン３３は、メモリ上の構成情報でスライスの状態をコピー中から切離しに変更し（ステップＳ１０９）、ディスク装置２３の構成情報を更新する（ステップＳ１０８）。
【００９０】
このように、デーモン３３は、コピー完了時にエラー発生スライス情報を削除することで、故障ディスク情報が誤って用いられることを防ぐことができる。
【００９１】
上述してきたように、実施例では、リモートディスクにデータを書き込む際にエラーが発生すると、ドライバ３１は、書き込み処理を保留してデーモン３３にエラーの発生を通知する。そして、デーモン３３は、エラー発生スライスの情報をファイルに記録し、一時記録完了をドライバ３１に応答する。そして、ドライバ３１は、書き込み処理を再開して書き込み完了をａｐｐ２１に応答してユーザＩ／Ｏ復帰を行う。また、デーモン３３は、エラー発生スライスの情報をファイルに記録した後、エラー発生スライスの切離しを行う。したがって、ディスク制御部３０は、リモートディスクにデータを書き込む際にエラーが発生した場合にａｐｐ２１へ応答することができ、ａｐｐ２１の中断を防ぐことができる。
【００９２】
また、実施例では、スライスの状態を示す情報を構成情報として各ノード２に記憶し、デーモン３３は、クラスタロックを取得し、エラー発生スライスの状態を構成情報において切離し状態に更新するので、エラー発生スライスを切離すことができる。
【００９３】
また、実施例では、デーモン３３は、エラー発生スライスの情報をファイルに記録する処理で失敗した場合に、切離し処理後にエラー発生スライスの情報をファイルに記録する処理を再実行する。したがって、デーモン３３は、エラー発生スライスの情報をファイルに記録する可能性を高くすることができる。
【００９４】
また、実施例では、コピー部３１ｃが、ノード２の起動時に、他のノード２が正常に動作している場合、故障ディスク情報を用いてローカルディスクとリモートディスクの間で整合をとる処理を行う。したがって、リモートディスクへデータを書き込む際にエラーが発生した場合でも、整合のとれていないデータが用いられることを防ぐことができる。
【００９５】
また、実施例では、故障ディスク情報を用いてローカルディスクとリモートディスクの間で整合がとられると、故障情報削除部３８が故障ディスク情報を削除するので、故障ディスク情報が誤って利用されることを防ぐことができる。
【００９６】
また、実施例では、起動制御部３７が、ノード２の起動時に、他のノード２が正常に動作している場合、故障ディスク情報を用いて自ノード２及び他ノード２の構成情報を更新するので、自ノード２及び他ノード２の間で構成情報の整合をとることができる。
【００９７】
また、実施例では、故障情報書込部３５は、故障ディスク情報としてクラスＩＤ、ボリュームＩＤ及びＳＣＳＩＩＤをファイルに書き込むので、デーモン３３は、故障ディスク情報に基づいて、エラーが発生したスライスを特定することができる。
【００９８】
なお、実施例では、ディスク制御部３０について説明したが、ディスク制御部３０が有する構成をソフトウェアによって実現することで、同様の機能を有するディスク制御プログラムを得ることができる。そこで、ディスク制御プログラムを実行するコンピュータについて説明する。
【００９９】
図１３は、実施例に係るディスク制御プログラムを実行するコンピュータのハードウェア構成を示す図である。図１３に示すように、コンピュータ５０は、メインメモリ５１と、ＣＰＵ（Central  Processing  Unit）５２と、ＬＡＮ（Local  Area  Network）インタフェース５３と、ＨＤＤ（Hard  Disk  Drive）５４とを有する。また、コンピュータ５０は、スーパーＩＯ（Input  Output）５５と、ＤＶＩ（Digital  Visual  Interface）５６と、ＯＤＤ（Optical  Disk  Drive）５７とを有する。
【０１００】
メインメモリ５１は、プログラムやプログラムの実行途中結果などを記憶するメモリである。ＣＰＵ５２は、メインメモリ５１からプログラムを読み出して実行する中央処理装置である。ＣＰＵ５２は、メモリコントローラを有するチップセットを含む。
【０１０１】
ＬＡＮインタフェース５３は、コンピュータ５０をＬＡＮ経由で他のコンピュータに接続するためのインタフェースである。ＨＤＤ５４は、プログラムやデータを格納するディスク装置であり、スーパーＩＯ５５は、マウスやキーボードなどの入力装置を接続するためのインタフェースである。ＤＶＩ５６は、液晶表示装置を接続するインタフェースであり、ＯＤＤ５７は、ＤＶＤの読み書きを行う装置である。
【０１０２】
ＬＡＮインタフェース５３は、ＰＣＩエクスプレス（ＰＣＩｅ）によりＣＰＵ５２に接続され、ＨＤＤ５４及びＯＤＤ５７は、ＳＡＴＡ（Serial  Advanced  Technology  Attachment）によりＣＰＵ５２に接続される。スーパーＩＯ５５は、ＬＰＣ（Low  Pin  Count）によりＣＰＵ５２に接続される。
【０１０３】
そして、コンピュータ５０において実行されるディスク制御プログラムは、コンピュータ５０により読み出し可能な記録媒体の一例であるＤＶＤに記憶され、ＯＤＤ５７によってＤＶＤから読み出されてコンピュータ５０にインストールされる。あるいは、ディスク制御プログラムは、ＬＡＮインタフェース５３を介して接続された他のコンピュータシステムのデータベースなどに記憶され、これらのデータベースから読み出されてコンピュータ５０にインストールされる。そして、インストールされたディスク制御プログラムは、ＨＤＤ５４に記憶され、メインメモリ５１に読み出されてＣＰＵ５２によって実行される。
【０１０４】
また、実施例では、データを記憶する装置としてディスク装置２３を用いる場合について説明したが、ノード２は、例えばＳＳＤ（Solid  State  Drive）のように他の不揮発性記憶装置を用いてもよい。
【符号の説明】
【０１０５】
１，９    情報処理システム
２，９１    ノード
３    ネットワーク
２１    ａｐｐ
２２，９２    クラスタ制御部
２３    ディスク装置
３０，９０    ディスク制御部
３１    ドライバ
３１ａ    エラー通知部
３１ｂ    完了通知部
３１ｃ    コピー部
３２    イニシエータ
３３    デーモン
３４ａ    故障情報記憶部
３４ｂ    構成情報記憶部
３５    故障情報書込部
３６    切離部
３７    起動制御部
３８    故障情報削除部
５０    コンピュータ
５１    メインメモリ
５２    ＣＰＵ
５３    ＬＡＮインタフェース
５４    ＨＤＤ
５５    スーパーＩＯ
５６    ＤＶＩ
５７    ＯＤＤ
【図１Ａ】
2019082897.tif 000003
【図１Ｂ】
2019082897.tif 000004
【図１Ｃ】
2019082897.tif 000005
【図１Ｄ】
2019082897.tif 000006
【図１Ｅ】
2019082897.tif 000007
【図１Ｆ】
2019082897.tif 000008
【図１Ｇ】
2019082897.tif 000009
【図１Ｈ】
2019082897.tif 000010
【図１Ｉ】
2019082897.tif 000011
【図２】
2019082897.tif 000012
【図３Ａ】
2019082897.tif 000013
【図３Ｂ】
2019082897.tif 000014
【図４】
2019082897.tif 000015
【図５】
2019082897.tif 000016
【図６】
2019082897.tif 000017
【図７】
2019082897.tif 000018
【図８】
2019082897.tif 000019
【図９】
2019082897.tif 000020
【図１０】
2019082897.tif 000021
【図１１】
2019082897.tif 000022
【図１２】
2019082897.tif 000023
【図１３】
2019082897.tif 000024
【図１４】
2019082897.tif 000025