以下、実施の形態について図面を参照して詳細に説明する。
〔第1の実施の形態〕
図1は、第1の実施の形態に係るストレージシステムの構成例を示す図である。
図1に示すストレージシステム1は、記憶装置10と、複数の制御装置とを有する。図1のストレージシステム1は、例として2つの制御装置20a,20bを有しているが、3つ以上の制御装置を有していてもよい。
記憶装置10は、データを記憶する装置であり、例えば、複数のHDDなどの記録媒体を内部に備える。制御装置20a,20bは、記憶装置10へのアクセス処理を制御する。制御装置20a,20bは、例えば、図示しない上位装置からの記憶装置10に対するアクセス要求に応じて、記憶装置10にアクセスする。
ストレージシステム1内の各制御装置は、同じ構成を有している。制御装置20aは、アクセス制御部21a、キャッシュメモリ22a、再起動制御部23a,24aおよび不揮発性記憶部25aを備えている。また、制御装置20bは、アクセス制御部21b、キャッシュメモリ22b、再起動制御部23b,24bおよび不揮発性記憶部25bを備えている。アクセス制御部21aとアクセス制御部21b、再起動制御部23aと再起動制御部23b、再起動制御部24aと再起動制御部24bは、それぞれ同じ処理を実行する。ここでは、制御装置20aが備える処理機能について説明し、制御装置20bが備える処理機能の説明については省略する。
アクセス制御部21aは、記憶装置10に記憶されたデータを制御装置20a内のキャッシュメモリ22aに記憶しながら、上位装置からのアクセス要求に応じて記憶装置10にアクセスする。例えば、アクセス制御部21aは、記憶装置10に記憶されたデータの読み出し要求を上位装置から受け付けると、読み出しを要求されたデータを記憶装置10から読み出し、上位装置に送信する。このとき、読み出しを要求されたデータがキャッシュメモリ22aに記憶されている場合には、読み出しを要求されたデータを記憶装置10の代わりにキャッシュメモリ22aから読み出す。また、アクセス制御部21aは、記憶装置10へのデータの書き込み要求を上位装置から受け付けると、書き込みを要求されたデータをキャッシュメモリ22aと記憶装置10とに書き込む。
さらに、アクセス制御部21aは、キャッシュメモリ22aに記憶したデータと同じデータを、他方の制御装置20bが備えるキャッシュメモリ22bにも記録する。アクセス制御部21aは、例えば、キャッシュメモリ22aに記憶したデータと同じデータを、制御装置20bのアクセス制御部21bを通じてキャッシュメモリ22bに記録する。また、他方の制御装置20bのアクセス制御部21bも同様に、制御装置20bが備えるキャッシュメモリ22bに記憶したデータと同じデータを、制御装置20aのキャッシュメモリ22aにも記録する。これにより、制御装置20a,20bのそれぞれにおけるキャッシュデータが二重化される。
再起動制御部23aは、他方の制御装置20bにおけるアクセス制御部21bの処理が、異常の発生などによって停止したことを検知する機能を備える。再起動制御部23aは、例えば、他方の制御装置20bとの通信が途絶えた場合に、他方の制御装置20bにおけるアクセス制御部21bの処理が停止したと判定する。再起動制御部23aは、アクセス制御部21bの処理が停止したことを検知すると、制御装置20bを再起動させる。これとともに、再起動制御部23aは、他方の制御装置20b内の不揮発性記憶部25bに対して、自装置(すなわち制御装置20b)以外の制御装置から再起動が指示されたことを示す起動情報26bを記録する。
なお、起動情報26bは、例えば、フラグ情報のように不揮発性記憶部25bに常時記憶されている情報でもよい。この場合には、再起動制御部23aは、制御装置20bを再起動させるとき、起動情報26bを、自装置以外の制御装置から再起動が指示されたことを指示するように更新する。
さらに、再起動制御部23aは、アクセス制御部21bの処理停止を検知したことを契機として制御装置20bを再起動させるとき、自装置(すなわち制御装置20a)のキャッシュメモリ22aに最新のキャッシュデータが記憶されていることを示すキャッシュ識別情報27aを、自装置の不揮発性記憶部25aに記録してもよい。
このキャッシュ識別情報27aは、例えば、起動情報26aと同様に、フラグ情報のように不揮発性記憶部25aに常時記憶されている情報でもよい。この場合には、再起動制御部24aは、制御装置20bを再起動させたときに、キャッシュ識別情報27aを、キャッシュメモリ22aに最新のキャッシュデータが記憶されていることを示すように更新する。
再起動制御部24aは、自装置(すなわち制御装置20a)が起動したとき、他方の制御装置20bにおけるアクセス制御部21bの処理が停止しているか否かを判定する機能を備える。再起動制御部24aは、自装置が起動したとき、制御装置20bのアクセス制御部21bの処理が停止しており、かつ、自装置以外の制御装置から再起動が指示されたことを示す起動情報26aが不揮発性記憶部25aに記憶されていた場合に、少なくとも制御装置20bを、キャッシュメモリ22bに記憶されたデータを保持した状態のまま再起動させる。
ここで、例として、制御装置20aのアクセス制御部21aの処理が停止した後、さらに制御装置20bのアクセス制御部21bの処理が停止した場合のストレージシステム1の動作について説明する。図2,図3は、制御装置の処理が連続的に停止した場合の動作を示す図である。
図2上段に示す状態1では、制御装置20aのアクセス制御部21a、および制御装置20bのアクセス制御部21bは、ともに記憶装置10に対するアクセス制御を正常に実行しているものとする。この状態から、制御装置20bのアクセス制御部21bの処理が異常発生などによって停止したものとする。このとき、図2下段の状態2に示すように、制御装置20aの再起動制御部23aは、アクセス制御部21bの処理が停止したことを検知する。
再起動制御部23aは、アクセス制御部21bの処理が停止したことを検知すると、制御装置20bを再起動させる。これとともに、再起動制御部23aは、制御装置20b内の不揮発性記憶部25bに対して、自装置(すなわち制御装置20b)以外の制御装置から再起動が指示されたことを示す起動情報26bを記録する。さらに、再起動制御部23aは、制御装置20a内の不揮発性記憶部25aに対して、キャッシュメモリ22aに最新のキャッシュデータが記憶されていることを示すキャッシュ識別情報27aを記録してもよい。
制御装置20bは、再起動制御部23aからの指示に応じて再起動する。このとき例えば、制御装置20aのキャッシュメモリ22aに最新のキャッシュデータが記憶されていることから、制御装置20bのキャッシュメモリ22bに記憶されたデータは破棄されるものとする。
ここで、制御装置20bが再起動したとき、他方の制御装置20aにおけるアクセス制御部21aの処理が正常に実行されているならば、制御装置20bの再起動前にアクセス制御部21bがキャッシュメモリ22bに記憶したデータと同じデータ(以下、「ミラーキャッシュデータ」と呼ぶ)が、制御装置20aのキャッシュメモリ22aにも記憶されている。このため、制御装置20bのアクセス制御部21bは、制御装置20aのキャッシュメモリ22aからミラーキャッシュデータを読み込んでキャッシュメモリ22bに格納することで、アクセス制御を再開することができる。
しかしながら、制御装置20bが再起動してアクセス制御を開始できるようになるまでの間に、他方の制御装置20aにおけるアクセス制御部21aの処理が停止した場合には、制御装置20aのキャッシュメモリ22aに記憶されたミラーキャッシュデータを、制御装置20bのアクセス制御部21bが読み出すことができなくなってしまうという問題がある。
これに対して、図3上段に示す状態3のように、制御装置20bの再起動制御部24bは、制御装置20bが再起動したとき、他方の制御装置20aにおけるアクセス制御部21aの処理が停止しており、かつ、制御装置20b内の不揮発性記憶部25bに起動情報26bが記憶されていた場合には、少なくとも制御装置20aを、キャッシュメモリ22aに記憶されたデータを保持した状態のまま再起動させる。
図3下段に示す状態4のように、制御装置20aは、再起動制御部24bによる再起動指示を契機として再起動する。このとき、制御装置20aのキャッシュメモリ22aには、制御装置20aの再起動前に記憶されていたデータが残ったままである。従って、制御装置20bのアクセス制御部21bは、制御装置20aのキャッシュメモリ22aからミラーキャッシュデータを読み込んでキャッシュメモリ22bに格納することで、アクセス制御を再開することができる。あるいは、制御装置20aのアクセス制御部21aは、例えば、キャッシュメモリ22aに記憶されたミラーキャッシュデータをキャッシュデータとして用いて、記憶装置10へのアクセス制御を単独で再開してもよい。
以上の処理によれば、制御装置20bにおけるアクセス制御部21bの処理が停止した後、制御装置20bが再起動してアクセス制御部21bの処理を再開できる状態になる前に、制御装置20aにおけるアクセス制御部21aの処理が停止した場合でも、制御装置20aのキャッシュメモリ22aに記憶されていた最新のミラーキャッシュデータが失われるという事態を回避することができる。
なお、図3下段の状態4において、制御装置20aが再起動したとき、アクセス制御部21aまたはアクセス制御部21bは、例えば、キャッシュメモリ22a,22bのうちキャッシュメモリ22aに最新のキャッシュデータが記憶されていることを、再起動した制御装置20aの不揮発性記憶部25aにキャッシュ識別情報27aが記憶されていることを基に判定できる。
また、各制御装置20a,20bは、例えば、自装置におけるアクセス制御部の処理、他の制御装置におけるアクセス制御部の処理の両方が停止したことを検出すると、アクセス制御部の処理が停止した両方の制御装置を、各制御装置内のキャッシュメモリに記憶されたデータを保持したまま再起動させる「両装置復旧機能」を備えていてもよい。この場合、図3上段の状態3において、制御装置20bの再起動制御部24bは、次のような処理によって制御装置20a,20bを再起動させてもよい。
再起動制御部24bは、制御装置20bが再起動したとき、他方の制御装置20aにおけるアクセス制御部21aの処理が停止しており、かつ、制御装置20b内の不揮発性記憶部25bに起動情報26bが記録されていた場合に、制御装置20bのアクセス制御部21bの処理を停止させる。すなわち、再起動制御部24bは、制御装置20bのアクセス制御部21bの処理を停止させることで、制御装置20aがキャッシュメモリ22aの内容を保持したまま再起動するような環境を整える。
アクセス制御部21bの処理が停止すると、制御装置20aまたは制御装置20bが備える「両装置復旧機能」によってアクセス制御部21a,21bの両方の処理が停止したことが検出され、制御装置20a,20bは、それぞれキャッシュメモリ22a,22bのデータを保持したまま再起動する。従って、制御装置20aのキャッシュメモリ22aに記憶された最新のミラーキャッシュデータが失われるという事態が回避される。
ところで、上記の第1の実施の形態では、アクセス制御部21a,21bがともにアクセス制御を正常に実行しているとき、アクセス制御部21bの処理が停止すると、制御装置20bは、キャッシュメモリ22bのデータを保持せずに再起動したが、キャッシュメモリ22bのデータを保持したまま制御装置20bを再起動させる方法も考えられる。しかしながら、キャッシュメモリ22bのデータを保持したまま制御装置20bが再起動したとしても、制御装置20bが再起動するまでのアクセス制御部21aの処理の仕方によっては、キャッシュメモリ22bのキャッシュデータが最新でなくなる場合があり得る。例えば、制御装置20bが再起動されるまでの間、アクセス制御部21bが処理停止前まで実行していたアクセス制御を、キャッシュメモリ22aに記憶されたミラーキャッシュデータを利用してアクセス制御部21aが単独で実行する場合には、キャッシュメモリ22bのキャッシュデータが最新でなくなることがあり得る。
そこで、次の第2の実施の形態では、一方の制御装置におけるアクセス制御が停止した場合に、アクセス制御を他方の制御装置が単独で実行することが可能なストレージシステムの例について説明する。
〔第2の実施の形態〕
図4は、第2の実施の形態に係るストレージシステムの全体構成例を示す図である。
図4に示すストレージシステム100は、ストレージ装置として複数のHDDを備える。ストレージシステム100内のDE(Drive Enclosure)200のそれぞれには、ストレージ装置を構成する複数のHDDが格納されている。また、ストレージシステム100は、DE200内のHDDに対するアクセスを制御する2つのCM(Controller Module)300a,300bを備えている。さらに、ストレージシステム100は、DE200およびCM300a,300bに対して電源を供給するPSU(Power Supply Unit)211,212を備えている。なお、DE200およびPSU211,212は、例えば、ストレージシステム100の外部に設けられていてもよい。また、ストレージ装置としては、HDDに限らず、例えばSSD(Solid State Drive)などの他の種類のストレージ装置が使用されてもよい。
ストレージシステム100には、ホスト装置120と管理端末130とが接続されている。ホスト装置120は、ユーザの操作に応じて、ストレージシステム100内のCM300aまたはCM300bに対して、DE200内のHDDへのアクセスを要求する。なお、ホスト装置120とCM300a,300bとは、例えば、ファイバチャネルを介して接続されている。
管理端末130は、管理者の操作に応じて、ストレージシステム100の動作を管理する。例えば、管理者は、管理端末130を操作することで、CM300a,300bに対する動作設定を行うことができる。なお、管理端末130とCM300a,300bとは、例えば、LAN(Local Area Network)ケーブルを介して接続されている。
CM300a,300bは、それぞれ、ホスト装置120からのアクセス要求に応じてDE200内のHDDへのアクセスを制御する。例えば、CM300a,300bは、それぞれ、HDDに記憶されたデータの読み出し要求をホスト装置120から受け付けると、読み出しを要求されたデータをHDDから読み出し、ホスト装置120に送信する。あるいは、CM300a,300bは、それぞれ、HDDへのデータの書き込み要求をホスト装置120から受け付けると、書き込みを要求されたデータをHDDに書き込む。
また、CM300a,300bは、DE200内のHDDに記憶されたデータをキャッシュする機能を備える。また、CM300aとCM300bとは互いにデータを送受信でき、CM300a,300bは、例えば、他方のCMが保持するキャッシュデータのミラーデータを互いに保持する。また、CM300a,300bは、他方のCMの動作を監視し、必要に応じて他方のCMを再起動させることも可能になっている。
図5は、ストレージシステム内のCMのハードウェア構成例を示す図である。
CM300aは、RoC(RAID on Chip,RAID:Redundant Arrays of Inexpensive Disks)301a、RAM(Random Access Memory)302a、SSD(Solid State Drive)303a、LANインタフェース304a、CA(Channel Adapter)305a,306a、SAS(Serial Attached SCSI,SCSI:Small Computer System Interface)エクスパンダ307a、FPGA(Field Programmable Gate Array)308a、NVRAM(Non Volatile RAM)309aおよび電源回路310aを備えている。
また、CM300bは、CM300aと同じハードウェア構成によって実現される。すなわち、CM300b内のRoC301b、RAM302b、SSD303b、LANインタフェース304b、CA305b,306b、SASエクスパンダ307b、FPGA308b、NVRAM309bおよび電源回路310bは、CM300a内のRoC301a、RAM302a、SSD303a、LANインタフェース304a、CA305a,306a、SASエクスパンダ307a、FPGA308a、NVRAM309aおよび電源回路310aにそれぞれ対応する。そこで、ここでは基本的に、CM300aのハードウェア構成について説明し、CM300bのハードウェア構成の説明については省略する。
RoC301aは、CM300a全体を統括的に制御するCPU(Central Processing Unit)、このCPUとSASエクスパンダ307a,307bとの間をインタフェースするSASコントローラなどを備える。また、RoC301a内のCPUは、他方のCM300bのRoC301a内のCPUと通信する機能も備えている。以下、RoC301a内のCPUとRoC301b内のCPUとの間の通信経路を「通信経路P1」と呼ぶ。
RAM302aは、CM300aの主記憶装置として使用され、RoC301a内のCPUに実行させるプログラムの少なくとも一部や、このプログラムによる処理に必要な各種データを一時的に記憶する。また、RAM302aは、DE200内のHDDに記憶されたデータのキャッシュ領域としても使用される。
SSD303aは、CM300aの二次記憶装置として使用され、RoC301aにより実行されるプログラムやその実行に必要な各種のデータなどを記憶する。なお、二次記憶装置としては、例えば、HDDなどの他の種類の不揮発性記憶装置が使用されてもよい。
LANインタフェース304aは、LANケーブルを介して管理端末130と接続し、管理端末130との間でデータを送受信する。
CA305a,306aは、ホスト装置120とCM300aとの間でデータを送受信するインタフェース処理を実行する。なお、CA305a,306aを、それぞれ個別の光ファイバケーブルを介してホスト装置120に接続することにより、CM300aとホスト装置120との間の通信経路が冗長化され、通信の信頼性を向上させることができる。
SASエクスパンダ307aは、RoC内のSASコントローラとSASデバイスとの間でデータを中継する。また、SASエクスパンダ307aは、内部にCPUや不揮発性メモリを備える。SASエクスパンダ307aのCPUは、SASエクスパンダ307a内部の不揮発性メモリに記憶されたファームウェアプログラムを実行することにより、例えば、CM300aのRoC301aおよびCM300bのRoC301bの両方をRAM302aに記憶されたキャッシュデータを保持したまま再起動させる「両CM復旧処理」を実行する。なお、SASエクスパンダ307a内のCPUは、RoC301a内のCPUとは独立して動作する。例えば、RoC301aにおける処理が異常の発生などによって停止した場合でも、SASエクスパンダ307aに電源が供給されていれば、SASエクスパンダ307aのCPUは引き続き動作する。
なお、図5の例では、CM300aのRoC301aは、CM300a内のSASエクスパンダ307aを通じてDE200と接続されているとともに、CM300b内のSASエクスパンダ307bを通じてDE200と接続されている。このように、RoC301aとDE200とが2つのSASエクスパンダ307a,307bを通じて接続されることで、RoC301aからDE200へのアクセス経路が冗長化されている。
同様に、CM300bのRoC301bは、CM300bのSASエクスパンダ307bを通じてDE200と接続されているとともに、CM300a内のSASエクスパンダ307aを通じてDE200と接続されている。このように、RoC301bとDE200とが2つのSASエクスパンダ307a,307bを通じて接続されることで、RoC301bからDE200へのアクセス経路も冗長化されている。
FPGA308aは、CM300aのRoC301aが正常に動作しているかを監視する機能を備える。一方、CM300b内のFPGA308bも、CM300b内のRoC301bが正常に動作しているかを監視する機能を備える。FPGA307a,308aは、互いに通信することで、他方のCMが正常に動作しているかを監視することができる。
FPGA308aは、CM300aのRoC301aとCM300bのRoC301bの両方の動作が異常発生により停止したことを検知すると、その旨をSASエクスパンダ307aに通知する。SASエクスパンダ307aのCPUは、RoC301a,301bの両方の動作が停止したことを示す通知をFPGA308aから受け付けたとき、前述の「両CM復旧処理」を実行する。
また、FPGA308aは、RoC301a、SASエクスパンダ307a、CM300bのFPGA308bからの要求に応じて、CM300aのRoC301aを再起動させる機能を備える。FPGA308aは、「通常モード」と「復旧モード」の2種類のモードによってRoC301aを再起動させることができる。通常モードの再起動では、FPGA308aは、電源回路310aからRoC301aおよびRAM302aのそれぞれに対する電源供給を一時的に停止させることで、RAM302aに記憶されたデータをクリアした状態でRoC301aを再起動させる。復旧モードの再起動では、FPGA308aは、電源回路310aからRAM302aへの電源供給を継続して、RAM302aに記憶したデータを維持したまま、電源回路310aからRoC301aへの電源供給を一時的に停止させることで、RoC301aを再起動させる。なお、復旧モードの再起動では、RAM302a内のキャッシュ領域のデータのみが保持された状態でRoC301aが再起動してもよい。
さらに、FPGA308aは、他方のCM300bのFPGA308bに対して、CM300bのRoC301bを再起動させるように要求することもできる。FPGA308aは、FPGA308bに対してRoC301bの再起動を要求する際に、RoC301bを通常モードあるいは復旧モードのどちらで再起動させるかを指定できる。
また、FPGA308aは、RoC301a、SASエクスパンダ307a、CM300bのFPGA308bからの要求に応じて、NVRAM309aにデータを記録したり、NVRAM309aからデータを読み出す機能を備えている。
なお、FPGA308aは、SASエクスパンダ307aのCPUと同様に、RoC301a内のCPUとは独立して動作する。例えば、RoC301aにおける処理が異常の発生などによって停止した場合でも、FPGA308aは引き続き動作する。
NVRAM309aは、FPGA308aやRoC301aでの処理に利用される各種データを記憶する不揮発性メモリである。
電源回路310aは、FPGA308aの制御の下で、PSU211,212からの電源をCM300aの内部に供給する電源回路である。
図6は、管理端末のハードウェア構成例を示す図である。
管理端末130は、図6に示すようなコンピュータとして実現される。このコンピュータは、CPU131によって装置全体が制御されている。CPU131には、バス138を介して、RAM132と複数の周辺機器が接続されている。
RAM132は、コンピュータの主記憶装置として使用される。RAM132には、CPU131に実行させるプログラムの少なくとも一部が一時的に格納される。また、RAM132には、CPU131による処理に必要な各種データが格納される。
バス138に接続されている周辺機器としては、HDD133、グラフィック処理装置134、入力インタフェース135、光学ドライブ装置136および通信インタフェース137がある。
HDD133は、コンピュータの二次記憶装置として使用される。HDD133には、CPU131が実行するプログラムや、各種データが格納される。なお、二次記憶装置としては、フラッシュメモリなどの半導体記憶装置を使用することもできる。
グラフィック処理装置134には、モニタ134aが接続されている。グラフィック処理装置134は、CPU131からの命令に従って、画像をモニタ134aの画面に表示させる。モニタ134aとしては、CRT(Cathode Ray Tube)を用いた表示装置や液晶表示装置などがある。
入力インタフェース135には、例えば、キーボード135aとマウス135bとが接続されている。入力インタフェース135は、キーボード135aやマウス135bから送られてくる信号をCPU131に送信する。マウス135bは、ポインティングデバイスの一例であり、他のポインティングデバイスを使用することもできる。他のポインティングデバイスとしては、タッチパネル、タブレット、タッチパッド、トラックボールなどがある。
光学ドライブ装置136は、レーザ光などを利用して、光ディスク136aに記録されたデータの読み取りを行う。光ディスク136aは、光の反射によって読み取り可能なようにデータが記録された可搬型の記録媒体である。光ディスク136aには、DVD(Digital Versatile Disc)、DVD−RAM、CD−ROM(Compact Disc Read Only Memory)、CD−R(Recordable)/RW(ReWritable)などがある。
通信インタフェース137は、CM300a,300bとの間でLANケーブルを介してデータを送受信する。
なお、ホスト装置120についても、図6と同様のハードウェア構成によって実現できる。ただし、ホスト装置120が備える通信インタフェースは、CM300a,300bとの間で光ファイバを介してデータを送受信する。
図7は、CMが備える処理機能の例を示すブロック図である。
CM300aは、I/O(In/Out)アクセス制御部321a、復旧制御部322a、監視部323aおよび起動制御部324aを備えている。これらのうち、I/Oアクセス制御部321aの処理は、RoC301aのCPUによって所定のプログラムが実行されることで実現される。また、復旧制御部322aの処理は、SASエクスパンダ307aのCPUによって所定のファームウェアが実行されることで実現される。また、監視部323aおよび起動制御部324aの処理は、FPGA308aによって実現される。
CM300bは、CM300aと同様の処理機能を備える。すなわち、CM300bが備えるI/Oアクセス制御部321b、復旧制御部322b、監視部323bおよび起動制御部324bは、CM300aが備えるI/Oアクセス制御部321a、復旧制御部322a、監視部323aおよび起動制御部324aにそれぞれ対応する。そこで、ここでは基本的に、CM300aが備える処理機能について説明し、CM300bが備える処理機能の説明については省略する。
なお、CM300a内の処理機能と同様に、CM300b内のI/Oアクセス制御部321bの処理は、RoC301bのCPUによって所定のプログラムが実行されることで実現される。また、CM300b内の復旧制御部322bの処理は、SASエクスパンダ307bのCPUによって所定のファームウェアが実行されることで実現される。また、CM300b内の監視部323bおよび起動制御部324bの処理は、FPGA308bによって実現される。
I/Oアクセス制御部321aは、DE200内のHDDに対するアクセスを制御するとともに、DE200内のHDDの記憶領域をRAIDによって管理する。I/Oアクセス制御部321aは、ホスト装置120から発せられた、DE200内のHDDに対するアクセス要求を、CA305aまたはCA306aから受け付け、SASエクスパンダ307aまたはSASエクスパンダ307bを通じて、DE200内のHDDにアクセスする。
また、I/Oアクセス制御部321aは、DE200内のHDDに記憶されたデータをRAM302aにキャッシュしながら、DE200内のHDDに対するアクセスを制御する。さらに、I/Oアクセス制御部321aは、RAM302aにキャッシュしたキャッシュデータを、他方のCM300bのRAM302bにミラーリングする機能を備える。
また、I/Oアクセス制御部321aは、他方のCM300bにおけるRoC301bの動作が異常発生によって停止したことを通信経路P1を通じて検知する機能を備える。I/Oアクセス制御部321aは、CM300bのRoC301aの動作が停止したことを検知すると、起動制御部324aを通じて、CM300bのRoC301bを復旧モードで再起動させるようにCM300bに要求する。なお、CM300bのRoC301bを復旧モードで再起動させることにより、RoC301bの動作が再開されるまでの期間にCM300aが保持するキャッシュデータが更新されなかった場合、RoC301bは最新のキャッシュデータを他方のCM300bから読み込むことなく、I/Oアクセス制御を再開することができる。
CM300bのNVRAM309bには、起動フラグ332bが記憶されている。起動フラグ332bは、「1」であるとき、自CMが他方のCMからの要求に応じて再起動したことを示す。I/Oアクセス制御部321aは、CM300bのRoC301bを復旧モードで再起動させるようにCM300bに要求したとき、起動制御部324aを通じて、CM300b内のNVRAM309bに記憶された起動フラグ332bを「0」から「1」に更新するように、CM300bに要求する。起動フラグ332bは、CM300bのRoC301bが起動し、I/Oアクセス制御部321bによるHDDのアクセス制御が開始される前に、I/Oアクセス制御部321bによって参照される。
また、I/Oアクセス制御部321aは、CM300bのRoC301aを復旧モードで再起動させるようにCM300bに要求したとき、CM300aのNVRAM309aに記憶された構成情報更新回数331aをカウントアップする。後述するように、構成情報更新回数331aは、I/Oアクセス制御部321aが処理を実行する際に参照する制御データが設定された構成情報テーブルが更新されるたびに、カウントアップされる情報である。構成情報テーブルの更新に応じて構成情報更新回数331aがカウントアップされる場合には、他方のCM300b内のNVRAM309bに記憶された構成情報更新回数331bもカウントアップされる。これにより構成情報更新回数331a,331bは、通常は同じ値となるように同期される。
しかし、CM300b内のRoC301aを復旧モードで再起動させるようにCM300bに要求したときに、CM300a内の構成情報更新回数331aがカウントアップされた場合には、CM300bが再起動処理中となることから、CM300b内の構成情報更新回数331bはカウントアップされない。この場合、構成情報更新回数331a,331bの各値は異なる値となる。そして、構成情報更新回数331a,331bの各値が異なる状態で、前述の両CM復旧処理が実行されてCM300a,300bのRoC301a,301bが再起動したとき、I/Oアクセス制御部321a,321bは、構成情報更新回数331a,331bのうち値が大きい方に対応するCM300a内のキャッシュデータがより新しいデータであると判定することができる。
なお、I/Oアクセス制御部321aは、NVRAM309aに記憶された構成情報更新回数331bおよび起動フラグ332aの読み書きを、FPGA308aを通じて行う。
復旧制御部322aは、監視部323aによって、CM300aのRoC301aとCM300bのRoC301bの両方の動作が異常発生などにより停止したことを検知すると、CM300aのRoC301aおよびCM300bのRoC301bの両方を復旧モードで再起動させる両CM復旧処理を実行する。復旧制御部322aは、CM300aの起動制御部324aに対して、CM300aのRoC301aを復旧モードで再起動させるように要求するとともに、起動制御部324aを通じてCM300bの起動制御部324bに対して、CM300bのRoC301bを復旧モードで再起動させるように要求する。
監視部323aは、CM300aのRoC301aが正常に動作しているかを監視する。また、監視部323aは、CM300bの監視部323bを通じて、CM300bのRoC301bが正常に動作しているかを監視する。監視部323aは、CM300aのRoC301aとCM300bのRoC301bの両方の動作が異常発生などにより停止したことを検知すると、その旨を復旧制御部322aに通知する。
起動制御部324aは、CM300aのI/Oアクセス制御部321a、CM300aの復旧制御部322a、CM300bの起動制御部324bのいずれかからの要求に応じて、RoC301aを通常モードまたは復旧モードで再起動させる。通常モードの再起動では、起動制御部324aは、電源回路310aからRoC301aおよびRAM302aのそれぞれに対する電源供給を一時的に停止させることで、RAM302aに記憶されたデータをクリアした状態でRoC301aを再起動させる。復旧モードの再起動では、起動制御部324aは、電源回路310aからRAM302aへの電源供給を継続して、RAM302aに記憶したデータを維持したまま、電源回路310aからRoC301aへの電源供給を一時的に停止させることで、RoC301aを再起動させる。なお、復旧モードの再起動では、RAM302a内のキャッシュ領域のデータのみが保持された状態でRoC301aが再起動してもよい。
また、起動制御部324aは、I/Oアクセス制御部321aまたは復旧制御部322aからの要求に応じて、他方のCM300bの起動制御部324bに対して、CM300bのRoC301bを通常モードまたは復旧モードで再起動させるように要求することもできる。
さらに、起動制御部324aは、I/Oアクセス制御部321aからの要求に応じて、CM300bの起動制御部324bに対して、NVRAM309b内の起動フラグ332bの更新を要求する機能を備える。また、起動制御部324aは、CM300bの起動制御部324bからの要求に応じて、NVRAM309a内の起動フラグ332aを更新する機能も備える。
次に、CM300a,300bが実行する処理についてより詳しく説明する。まず、I/Oアクセス制御部321a,321bによる、DE200内のHDDへのアクセス制御について説明する。DE200内のHDDへのアクセス制御の状態には、I/Oアクセス制御部321a,321bの両方がアクセス制御を実行する「冗長運用状態」と、I/Oアクセス制御部321a,321bの一方のみによってアクセス制御が実行される「単独運用状態」とがある。
図8は、冗長運用状態におけるアクセス制御について示す図である。
I/Oアクセス制御部321a,321bの両方が正常に動作しているとき、I/Oアクセス制御部321a,321bは、DE200内のHDDの記憶領域のうち、それぞれ個別のボリューム(記憶領域)に対するアクセス制御を行う。図8の例では、CM300aのI/Oアクセス制御部321aは、DE200内のHDDの記憶領域のうちボリュームVol#0に対するアクセス制御を行う。また、CM300bのI/Oアクセス制御部321bは、DE200内のHDDの記憶領域のうち、ボリュームVol#0とは別の領域であるボリュームVol#1に対するアクセス制御を行う。
また、冗長運用状態において、I/Oアクセス制御部321aは、ボリュームVol#0に記憶されたデータを、RAM302a内のローカルキャッシュ領域341aにキャッシュする。同様に、I/Oアクセス制御部321bは、ボリュームVol#1に記憶されたデータを、RAM302b内のローカルキャッシュ領域341bにキャッシュする。
例えば、I/Oアクセス制御部321aは、ホスト装置120からボリュームVol#0内のデータのリード要求を受けたとき、リードが要求されたデータがローカルキャッシュ領域341aに存在する場合には、リードが要求されたデータをローカルキャッシュ領域341aから読み出し、ホスト装置120に返信する。また、I/Oアクセス制御部321aは、ホスト装置120から、ローカルキャッシュ領域341aに存在するデータのライト要求を受けたとき、ローカルキャッシュ領域341a内のライト対象のデータをホスト装置120から受信したライトデータによって更新する。その後、I/Oアクセス制御部321aは、DE200内のHDDにおけるライト対象データをライトデータによって更新する。
さらに、ローカルキャッシュ領域に記憶されたキャッシュデータは、他方のCMのRAMに二重化される。図8において、CM300bのRAM302bに生成されたミラーキャッシュ領域342bには、CM300aのローカルキャッシュ領域341aに記憶されたものと同じキャッシュデータが格納される。また、CM300aのRAM302aに生成されたミラーキャッシュ領域342aには、CM300bのローカルキャッシュ領域341bに記憶されたものと同じキャッシュデータが格納される。
I/Oアクセス制御部321aは、ローカルキャッシュ領域341aのデータを更新するたびに、CM300bのI/Oアクセス制御部321bに対して、ミラーキャッシュ領域342bのデータをローカルキャッシュ領域341aと同様に更新するように要求する。また、I/Oアクセス制御部321bは、ローカルキャッシュ領域341bのデータを更新するたびに、CM300aのI/Oアクセス制御部321aに対して、ミラーキャッシュ領域342aのデータをローカルキャッシュ領域341bと同様に更新するように要求する。
図9は、単独運用状態におけるアクセス制御について示す図である。
I/Oアクセス制御部は、他方のCM内のRoCの動作が異常発生などによって停止すると、他方のCM内のRoCを復旧モードで再起動させるとともに、他方のCM内のRoCが復旧するまでの間、他方のCM内のI/Oアクセス制御部が実行していたアクセス制御を、自装置内のミラーキャッシュ領域に記憶されたデータを用いて引き継ぐ。
図9では、CM300bのRoC301bの動作が停止した場合の例を示している。この場合、CM300aのI/Oアクセス制御部321aは、起動制御部324aを通じて、CM300bの起動制御部324bに対して、RoC301bを復旧モードで再起動させるように要求する。これとともに、I/Oアクセス制御部321aは、単独運用状態に遷移する。単独運用状態では、I/Oアクセス制御部321aは、ボリュームVol#0に対するアクセス制御だけでなく、ボリュームVol#1に対するアクセス制御も実行する。I/Oアクセス制御部321aは、RAM302a内のミラーキャッシュ領域342aのデータをキャッシュデータとして使用して、ボリュームVol#1に対するアクセス制御を継続して実行する。
なお、CM300bのRoC301bが正常に再起動し、CM300bのI/Oアクセス制御部321bとの通信が回復すると、I/Oアクセス制御部321aは、I/Oアクセス制御部321bを通じて、ローカルキャッシュ領域341aおよびミラーキャッシュ領域342aにそれぞれ記憶されたデータをCM300b内のミラーキャッシュ領域342bおよびローカルキャッシュ領域341bに二重化する処理を行う。そして、I/Oアクセス制御部321a,321bは、冗長運用状態でのアクセス制御を開始する。ただし、CM300aが単独運用状態であった期間にローカルキャッシュ領域341aおよびミラーキャッシュ領域342aにおけるデータの更新がなかった場合には、CM300bのI/Oアクセス制御部321bは、ローカルキャッシュ領域341bおよびミラーキャッシュ領域342bのデータを更新することなく、ボリュームVol#1に対するアクセス制御を再開することが可能である。
ところで、I/Oアクセス制御部は、次の図10に示すように、構成情報テーブルに設定された制御データに基づいてアクセス制御を行う。また、構成情報テーブルに設定された制御データが更新されるたびに、構成情報更新回数がカウントアップされる。
図10は、構成情報テーブルおよび構成情報更新回数の更新処理について示す図である。
構成情報テーブル351aは、例えば、CM300aのSSD303aに記憶され、構成情報テーブル351bは、例えば、CM300bのSSD303bに記憶される。構成情報テーブル351a,351bには、I/Oアクセス制御部321a,321bがDE200内のHDDに対するアクセス制御を行う上で必要な制御データが設定されている。例えば、構成情報テーブル351a,351bには、RAIDレベルを示す情報、RAIDグループを構成する物理ボリュームに関する情報などが設定される。I/Oアクセス制御部321aは、構成情報テーブル351aに設定された制御データに基づいてアクセス制御を行い、I/Oアクセス制御部321bは、構成情報テーブル351bに設定された制御データに基づいてアクセス制御を行う。
また、I/Oアクセス制御部321a,321bは、CM300a,300bに格納された構成情報テーブル351a,351bの内容が同一になるように制御する。例えば、図10に示すように、管理端末130からCM300aに対して、構成情報テーブル351aの設定変更が要求される。CM300aのI/Oアクセス制御部321aは、管理端末130からの要求に従って、構成情報テーブル351aの設定変更を行う。これとともに、I/Oアクセス制御部321aは、NVRAM309aに記憶された構成情報更新回数331aをカウントアップする。
さらに、I/Oアクセス制御部321aは、CM300bのI/Oアクセス制御部321bを通じて、構成情報テーブル351aに対して行った設定変更を、CM300b内の構成情報テーブル351bにも反映して、構成情報テーブルを二重化する。CM300bのI/Oアクセス制御部321bは、CM300aのI/Oアクセス制御部321aからの要求に応じて構成情報テーブル351bの設定変更を行うと、NVRAM309bに記憶された構成情報更新回数331bをカウントアップする。これにより、CM300a内の構成情報更新回数331aとCM300b内の構成情報更新回数331bとが常に同じ値となるように同期がとられる。
以上のように、CM300a内の構成情報テーブル351aとCM300b内の構成情報テーブル351bとが常に同じ内容になるように制御されることで、例えば、冗長運用状態から一方のCMが単独運用状態に移行した場合でも、単独運用状態に移行したCMに記憶された構成情報テーブルの制御データを利用して、HDDのアクセス制御を即座に開始できるようになる。
次に、図11は、両CM復旧処理について示す図である。
両CM復旧処理は、CM300a内のRoC301aの動作とCM300b内のRoC301bの動作とが同時に停止した場合に、各CM300a,300b内に記憶されたキャッシュデータを失うことなく、各CM300a,300bによるHDDへのアクセス制御を短時間で復旧させるものである。各CMの復旧制御部は、自CM内のRoCの動作と他方のCM内のRoCの動作がともに停止したことを検知すると、両CM復旧処理を開始する。
図11では例として、CM300a内の復旧制御部322aの制御による両CM復旧処理について示している。CM300aの監視部323aは、CM300a内のRoC301aが正常に動作しているか否かを監視し、RoC301aの動作が停止すると、その旨を復旧制御部322aに通知する。また、CM300bの監視部323bは、CM300b内のRoC301bが正常に動作しているか否かを監視する。CM300aの監視部323aは、CM323bを通じて、CM300b内のRoC301bが正常に動作しているかを検知でき、RoC301bの動作が停止したことを検知すると、その旨を復旧制御部322aに通知する。
復旧制御部322aは、監視部323aからの通知に基づき、RoC301a,301bの両方の動作が停止したことを検知すると、CM300aのRoC301aおよびCM300bのRoC301bの両方を復旧モードで再起動させる。復旧制御部322aは、CM300aの起動制御部324aに対して、CM300aのRoC301aを復旧モードで再起動させるように要求するとともに、起動制御部324aを通じてCM300bの起動制御部324bに対して、CM300bのRoC301bを復旧モードで再起動させるように要求する。
復旧制御部322aからの要求に応じて、CM300aのRoC301aおよびCM300bのRoC301bはともに再起動し、RoC301aとRoC301bとの通信が再開される。このとき、CM300aのRAM302aには、RoC301aの動作が停止した際に記憶されていたキャッシュデータが保持されており、CM300bのRAM302bには、RoC301bの動作が停止した際に記憶されていたキャッシュデータが保持されている。従って、RoC301aが再起動すると、I/Oアクセス制御部321aは、RAM302aに記憶されたキャッシュデータを用いてボリュームVol#0に対するアクセス制御を即座に再開できる。同様に、RoC301bが再起動すると、I/Oアクセス制御部321bは、RAM302bに記憶されたキャッシュデータを用いてボリュームVol#1に対するアクセス制御を即座に再開できる。
ところで、上記の両CM復旧処理は、2つのRoC301a,301bの動作が同時に停止してしまった場合に、キャッシュデータを失うことなくHDDへのアクセス制御を復旧させるものであった。しかしながら、2つのRoCの動作が間隔を空けて連続的に停止した場合には、次の図12に示すように、最新のキャッシュデータが失われてしまうことがあった。
図12は、2つのRoCの動作が間隔を空けて連続的に停止した場合の動作の参考例を示すタイムチャートである。図12では例として、CM300b内のRoC301bの動作が先に停止し、その後にCM300a内のRoC301aの動作が停止した場合の例を示す。
図12の初期状態では、CM300aのRoC301aおよびCM300bのRoC301bが、冗長運用状態で動作しているものとする。この状態から、CM300bのRoC301bの動作が異常発生などによって停止すると(タイミングT11)、CM300aのI/Oアクセス制御部321aは、RoC301bの動作停止を検知し、RoC301bを復旧モードで再起動させるようにCM300bの起動制御部324bに要求する(タイミングT12)。
CM300bのRoC301bは、復旧モードでの再起動処理を開始する。この再起動処理では、RoC301bがリセットされるものの、RAM302b内のローカルキャッシュ領域341bおよびミラーキャッシュ領域342bの各データは保持されたままになる。
一方、CM300aのI/Oアクセス制御部321aは、単独運用状態に遷移し、ローカルキャッシュ領域341aおよびミラーキャッシュ領域342aをキャッシュ領域として用いて、ボリュームVol#0,Vol#1に対するアクセス制御を継続する。また、I/Oアクセス制御部321aは、ホスト装置120からボリュームVol#0またはボリュームVol#1へのライト要求を受け付けると、RAM302a内のキャッシュデータを更新する(タイミングT13)。RAM302a内のキャッシュデータが更新された場合、CM300bのRAM302bに記憶されたキャッシュデータは、使用不可能な古いキャッシュデータとなる。
ここで、CM300bのRoC301bの再起動処理が完了する前に、CM300aのRoC301aの動作が異常発生などによって停止したとする(タイミングT14)。CM300bのRoC301bの再起動処理が完了すると、CM300bのI/Oアクセス制御部321bは、CM300aのRoC301aとの接続確認を行う(タイミングT15)。しかし、CM300aのRoC301aは停止状態であるので、CM300bのI/Oアクセス制御部321bは、接続不能と判定する。
I/Oアクセス制御部321bは、他方のRoC301aとの接続が不能であった場合、単独運用状態でアクセス制御を行うべきと判定し、CM300aの起動制御部324aに対して、CM300aをFault状態(電源切断状態)に遷移させるように要求する。これとともに、I/Oアクセス制御部321bは、単独運用状態でアクセス制御を行うための初期設定処理を実行する(タイミングT16)。I/Oアクセス制御部321bは、初期設定処理として、例えば、CM300b内のローカルキャッシュ領域341bおよびミラーキャッシュ領域342bをともにキャッシュ領域として使用するための設定や、ボリュームVol#0,Vol#1をアクセス制御の対象とするための設定などを行う。I/Oアクセス制御部321bは、初期設定処理を完了すると、単独運用状態でのアクセス制御を開始する(タイミングT17)。
以上の図12の処理において、例えば、タイミングT12〜T14の期間にCM300aのRAM309a内のキャッシュデータが更新されなかった場合には、CM300bのRoC301bが再起動した後も、CM300bのRAM309bに記憶されたキャッシュデータは最新のものとなる。従って、タイミングT17において、CM300bのRoC301bは、RAM309bのローカルキャッシュ領域341bおよびミラーキャッシュ領域342bの各データをキャッシュデータとして用いて、単独運用状態でのアクセス制御を問題なく実行できる。
しかしながら、タイミングT12〜T14の期間にCM300aのRAM309a内のキャッシュデータが更新された場合には、CM300bのRAM309b内のキャッシュデータは古いキャッシュデータとなる。この状態で、CM300aのRoC301aの動作が停止して(タイミングT14)、CM300bのI/Oアクセス制御部321bが単独運用状態でのアクセス制御を開始(タイミングT17)すると、CM300aのRoC301aが動作停止状態になることから、CM300aのRAM302aに記憶されていた最新のキャッシュデータが失われてしまう。タイミングT12〜T14の期間にI/Oアクセス制御部321aが受け付けたライトデータがDE200のHDDに書き込まれる前に、CM300aのRoC301aの動作が停止した場合には、HDDに書き込まれていないライトデータが失われてしまう。
もし、ライトデータが失われた状態でアクセス制御が再開されてしまうと、各CM300a,300bにおけるログを調査して発生事象を突き止め、失ったライトデータを復旧するといった管理者による作業が必要となる。このため、アクセス制御を再開するまでに長い時間を要してしまう。
そこで、本実施の形態のストレージシステム100では、RoCが他方のCMからの要求に応じて起動したとき、他方のCMと接続できない場合には、他方のCMを復旧モードで再起動させることで、他方のCMに保持された最新のキャッシュデータが失われないようにする。
図13,図14は、第2の実施の形態において、2つのRoCの動作が間隔を空けて連続的に停止した場合の動作例を示すタイムチャートである。なお、図13,図14では例として、CM300b内のRoC301bの動作が先に停止し、その後にCM300a内のRoC301aの動作が停止した場合の例を示す。
図13の初期状態では、CM300aのRoC301aおよびCM300bのRoC301bが、冗長運用状態で動作しているものとする。この状態から、CM300bのRoC301bの動作が異常発生などによって停止すると(タイミングT21)、CM300aのI/Oアクセス制御部321aは、RoC301bの動作停止を検知する(タイミングT22)。
RoC301bの動作停止を検知したI/Oアクセス制御部321aは、起動制御部324aを通じて、CM300bの起動制御部324bに対して、CM300bのNVRAM309bに記憶された起動フラグ332bを「0」から「1」にするように要求する。また、I/Oアクセス制御部321aは、CM300bの起動制御部324bに対して、CM300bのRoC301bを復旧モードで再起動させるように要求する。
さらに、I/Oアクセス制御部321aは、CM300aのNVRAM309aに記憶された構成情報更新回数331aをカウントアップする。図10で説明したように、RoC301a,301bがともに正常動作中であれば、CM300a内の構成情報更新回数331aとCM300b内の構成情報更新回数331bとは同じ値とされる。しかしながら、タイミングT22では、CM300bのRoC301bは動作停止状態であるので、CM300a内の構成情報更新回数331aのみがカウントアップされる。
CM300bのRoC301bは、CM300aのI/Oアクセス制御部321aからの要求に応じて、復旧モードでの再起動処理を開始する。この再起動処理では、RoC301bは、電源回路310bからの電源供給が一時的に停止されることでリセットされた後、SSD303aからプログラムを読み込んで、プログラムに従った最初の処理である接続確認処理を実行可能な状態になる。また、RoC301bの再起動処理の間、RAM302b内のローカルキャッシュ領域341bおよびミラーキャッシュ領域342bの各データは保持される。
一方、CM300aのI/Oアクセス制御部321aは、単独運用状態に遷移し、ローカルキャッシュ領域341aおよびミラーキャッシュ領域342aをキャッシュ領域として用いて、ボリュームVol#0,Vol#1に対するアクセス制御を継続する。また、I/Oアクセス制御部321aは、ホスト装置120からボリュームVol#0またはボリュームVol#1へのライト要求を受け付けると、RAM302a内のキャッシュデータを更新する(タイミングT23)。
ここで、CM300bのRoC301bの再起動処理が完了する前に、CM300aのRoC301aの動作が異常発生などによって停止したとする(タイミングT24)。CM300bのRoC301bの再起動処理が完了すると、CM300bのI/Oアクセス制御部321bは、CM300aのRoC301aとの接続確認を行う(タイミングT25)。しかし、CM300aのRoC301aは停止状態であるので、CM300bのI/Oアクセス制御部321bは、接続不能と判定する。
I/Oアクセス制御部321bは、他方のRoC301aとの接続が不能であった場合、CM300bのNVRAM309bに記憶された起動フラグ332bを参照し、起動フラグ332bの値に応じた処理を実行する。I/Oアクセス制御部321bは、起動フラグ332bが「1」であった場合には、CM300b内のRoC301bの動作を停止させる(タイミングT26)。
なお、I/Oアクセス制御部321bは、他方のRoC301aとの接続が不能であり、かつ、起動フラグ332bが「0」であった場合には、単独運用状態でアクセス制御を行うための初期設定処理を実行し、初期設定処理の後、ボリュームVol#0,Vol#1に対するアクセス制御を単独で実行する。
タイミングT26においてCM300bのRoC301bが動作停止状態になると、図14に示すように、CM300aの復旧制御部322aまたはCM300bの復旧制御部322bが、RoC301a,301bの両方の動作が停止したことを検知する。ここで例えば、CM300aの復旧制御部322aがRoC301a,301bの動作停止を検知したものとすると、復旧制御部322aは、RoC301a,301bの両方を復旧モードで再起動させる両CM復旧処理を実行する(タイミングT27)。復旧制御部322aは、CM300aの起動制御部324aに対して、CM300aのRoC301aを復旧モードで再起動させるように要求するとともに、CM300bの起動制御部324bに対して、CM300bのRoC301bを復旧モードで再起動させるように、起動制御部324aを通じて要求する。
復旧制御部322aからの要求に応じて、CM300aのRoC301aおよびCM300bのRoC301bは、ともにキャッシュデータを保持した状態のまま再起動処理を開始する。RoC301a,301bのそれぞれによる再起動処理が完了すると、CM300aのI/Oアクセス制御部321aとCM300bのI/Oアクセス制御部321bとの間で、通信経路P1を通じた接続確認が行われる(タイミングT28)。このとき、I/Oアクセス制御部321a,321bは、CM300a内のNVRAM309aに記憶された構成情報更新回数331aと、CM300b内のNVRAM309bに記憶された構成情報更新回数331bとを比較する。
I/Oアクセス制御部321a,321bは、CM300a内の構成情報更新回数331aの方がCM300b内の構成情報更新回数331bより大きいことから、CM300a内のキャッシュデータが有効である(すなわち最新のものである)と判定する。I/Oアクセス制御部321a,321bは、冗長運用状態でアクセス制御を行うための初期設定処理を実行する(タイミングT29)。なお、この初期設定処理の開始段階において、CM300b内の構成情報更新回数331bがカウントアップされ、構成情報更新回数331a,331bが同期した状態にされる。
タイミングT29からの初期設定処理の過程で、I/Oアクセス制御部321a,321bは、CM300a内に保持されたキャッシュデータを二重化する処理を行う。I/Oアクセス制御部321aは、RAM302a内のローカルキャッシュ領域341aおよびミラーキャッシュ領域342aに記憶されたデータを、他方のCM300bのI/Oアクセス制御部321bに転送する。I/Oアクセス制御部321bは、RAM302b内のローカルキャッシュ領域341bおよびミラーキャッシュ領域342bに記憶されたデータを破棄する。そして、ローカルキャッシュ領域341aから転送されたデータをミラーキャッシュ領域342bに格納するとともに、ミラーキャッシュ領域342aから転送されたデータをローカルキャッシュ領域341bに格納する。
I/Oアクセス制御部321a,321bのそれぞれの初期設定処理が完了すると、I/Oアクセス制御部321a,321bは、冗長運用状態でのアクセス制御を開始する(タイミングT30)。
以上の図13,図14の処理では、CM300bのI/Oアクセス制御部321bは、起動したとき、他方のCM300aからの要求に応じて再起動したのか否かを、起動フラグ332bに基づいて判定することができる。CM300bのRoC301bは、他方のCM300aからの要求に応じて再起動したと判定したとき、他方のCM300aのRoC301aが動作停止状態である場合には、CM300bのRoC301b自身の動作を停止させる。RoC301bは、RoC301b自身の動作を停止させて、両CM復旧処理が実行される状態を意図的につくり出すことで、有効なキャッシュデータが保持された他方のRoC301aを復旧モードで再起動させる。これにより、RoC301a,301bは、RoC301aに保持された有効なキャッシュデータを利用して、DE200のHDDに対するアクセス制御を再開することができる。
従って、上記処理により、CM300bのRoC301bの動作と、CM300aのRoC301aの動作が間隔を置いて連続的に停止した場合でも、最新のキャッシュデータを失うことなく、アクセス制御を再開することができる。また、CM300bのRoC301bの動作と、CM300aのRoC301aの動作が間隔を置いて連続的に停止した場合でも、管理者が何ら作業を行うことなく、アクセス制御を短時間で自動的に再開させることができる。
また、両CM復旧処理が実行され、CM300aのI/Oアクセス制御部321aとCM300bのI/Oアクセス制御部321bとの間で接続確認が行われたとき(タイミングT28)、I/Oアクセス制御部321a,321bは、構成情報更新回数331a,331bを比較することで、有効なキャッシュデータがCM300a,300bのどちらにあるかを判定する。このように、有効なキャッシュデータがCM300a,300bのどちらにあるかを、他の目的で使用されている情報である構成情報更新回数331a,331bを使って判定することで、判定に必要な情報を減らすことができる。
なお、構成情報テーブル351a,351bには、RoC301a,301bの動作が停止するなどの異常事象の発生履歴が記述されてもよい。この場合、例えば、CM300aのI/Oアクセス制御部321aは、図13のタイミングT22においてCM300b内のRoC301bの動作停止を検知した際に、構成情報テーブル351a内の異常事象発生履歴にRoC301bの動作が停止したことを記述し、このような構成情報テーブル351a内の異常事象発生履歴の更新に伴って、構成情報更新回数331aをカウントアップしてもよい。CM300aのI/Oアクセス制御部321aは、その後、CM300aのRoC301aが再起動してアクセス制御のための初期設定を開始する際(図14のタイミングT29、および後述する図17のステップS35に対応)に、構成情報テーブル351aの内容をCM300b内の構成情報テーブル351bに反映する二重化処理を行う。
次に、第2の実施の形態に係るCMの処理を、フローチャートを用いて説明する。ここでは例として、CM300aにおける処理について説明するが、CM300bも同様の処理を実行可能である。
図15は、I/Oアクセス制御部による他方のRoCの動作監視処理を示すフローチャートである。この図15の処理は、CM300aのI/Oアクセス制御部321aが冗長運用状態でアクセス制御を行っている際に、I/Oアクセス制御部321aが実行するものである。
[ステップS11]I/Oアクセス制御部321aは、他方のCM300b内のRoC301bの動作が停止していないかを監視する。I/Oアクセス制御部321aは、例えば、CM300bのRoC301bとの間で、通信経路P1を通じて生存確認用の通信を定期的に行うことで、RoC301bの動作が停止しているか否かを判定する。I/Oアクセス制御部321aは、RoC301bの動作が停止したと判定すると(S11:Yes)、ステップS12の処理を実行する。
[ステップS12]I/Oアクセス制御部321aは、他方のCM300b内の起動フラグ332bを「0」から「1」に更新するように、起動制御部324aを通じてCM300b内の起動制御部324bに要求する。要求を受けたCM300b内の起動制御部324bは、I/Oアクセス制御部321aからの要求に応じて、NVRAM309bに記憶した起動フラグ332bの値を「1」に更新する。
[ステップS13]I/Oアクセス制御部321aは、CM300bのRoC301bを復旧モードで再起動させるように、起動制御部324aを通じてCM300b内の起動制御部324bに要求する。CM300b内の起動制御部324bは、I/Oアクセス制御部321aからの要求に応じて、RAM302bへの電源供給を継続したまま、RoC301bへの電源供給を一時的に停止してRoC301bをリセットした後、RoC301bを起動させる。
[ステップS14]I/Oアクセス制御部321aは、CM300aのNVRAM309aに記憶した構成情報更新回数331aをカウントアップする。
図16は、復旧制御部の処理を示すフローチャートである。
[ステップS21]CM300aの監視部323aは、CM300a内のRoC301aが正常に動作しているか否かを監視し、RoC301aの動作が停止すると、その旨を復旧制御部322aに通知する。また、CM300bの監視部323bは、CM300b内のRoC301bが正常に動作しているか否かを監視する。CM300aの監視部323aは、CM323bを通じて、CM300b内のRoC301bが正常に動作しているかを検知でき、RoC301bの動作が停止したことを検知すると、その旨を復旧制御部322aに通知する。
復旧制御部322aは、監視部323aからの、RoC301a,301bの各動作が停止したことの通知を監視する。復旧制御部322aは、監視部323aからの通知に基づき、RoC301a,301bの動作がともに停止したことを検知すると(S21:Yes)、ステップS22の処理を実行する。
[ステップS22]復旧制御部322aは、両CM復旧処理を実行する。復旧制御部322aは、起動制御部324aに対して、CM300aのRoC301aを復旧モードで再起動させるように要求するとともに、起動制御部324aを通じてCM300bの起動制御部324bに対して、CM300bのRoC301bを復旧モードで再起動させるように要求する。CM300aのRoC301aおよびCM300bのRoC301bは、復旧制御部322aからの要求に応じて、それぞれキャッシュデータを保持した状態のまま再起動する。
図17,図18は、RoCの起動時の処理を示すフローチャートである。なお、図17のフローチャートの処理は、CM300aが電源切断状態から起動する場合や、CM300aが自身または他方のCM300bからの要求に応じて再起動する場合に、開始される。
[ステップS31]RoC301aの起動処理が実行される。この起動処理では、例えば、RoC301a内のハードウェアの初期化や、SSD303aからRoC301aへのアクセス制御プログラムの読み込みなどが実行される。RoC301aのCPUがアクセス制御プログラムの実行を開始することにより、I/Oアクセス制御部321aが起動する。
[ステップS32]I/Oアクセス制御部321aは、通信経路P1を通じて、他方のRoC301bと接続可能であるか否かを判定する。I/Oアクセス制御部321aは、RoC301bと接続できた場合(S32:Yes)には、ステップS33の処理を実行し、RoC301bと接続できなかった場合(S32:No)には、ステップS39の処理を実行する。
[ステップS33]I/Oアクセス制御部321aは、起動制御部324aを通じて、NVRAM309aに記憶された構成情報更新回数331aを読み込む。これとともに、I/Oアクセス制御部321aは、CM300bのI/Oアクセス制御部321bを通じて、CM300bのNVRAM309bに記憶された構成情報更新回数331bを読み込む。
I/Oアクセス制御部321aは、読み込んだ構成情報更新回数331a,331bの各値を比較する。I/Oアクセス制御部321aは、構成情報更新回数331a,331bの各値が一致した場合には、ステップS34の処理を実行する。また、I/Oアクセス制御部321aは、CM300bから読み込んだ構成情報更新回数331bより、CM300a内の構成情報更新回数331aの方が大きい場合には、ステップS35の処理を実行する。また、I/Oアクセス制御部321aは、CM300bから読み込んだ構成情報更新回数331bより、CM300a内の構成情報更新回数331aの方が小さい場合には、ステップS37の処理を実行する。
[ステップS34]I/Oアクセス制御部321aは、冗長運用状態でアクセス制御を実行するための初期設定処理を実行する。このとき、RAM302a内のローカルキャッシュ領域341aおよびミラーキャッシュ領域342aに記憶されたデータの転送や更新は、行われない。I/Oアクセス制御部321aは、初期設定処理を完了すると、冗長運用状態でのアクセス制御を開始する。
このステップS34の処理は、例えば、I/Oアクセス制御部321a,321bが冗長運用状態でアクセス制御を正常に行っているときに、RoC301a,301bの各動作が同時に停止することで両CM復旧処理が実行され、両CM復旧処理に伴ってRoC301aが起動した場合に、実行される。この場合、CM300a,300bのどちらが保持するキャッシュデータも最新であるので、I/Oアクセス制御部321aは、キャッシュデータの二重化処理をあらためて行うことなく、冗長運用状態でのアクセス制御を再開する。
[ステップS35]CM300b内の構成情報更新回数331bよりCM300a内の構成情報更新回数331aの方が大きい場合、I/Oアクセス制御部321aは、冗長運用状態でアクセス制御を実行するための初期設定処理を実行する。この初期設定処理の過程で、I/Oアクセス制御部321aは、ローカルキャッシュ領域341aおよびミラーキャッシュ領域342aに記憶されたデータを、CM300bのI/Oアクセス制御部321bに送信して、キャッシュデータの更新を要求する。CM300bのアクセス制御部321bは、RAM302b内のキャッシュデータを破棄した後、CM300a内のローカルキャッシュ領域341aおよびミラーキャッシュ領域342aから送信されたデータを、CM300b内のミラーキャッシュ領域342bおよびローカルキャッシュ領域341bにそれぞれ格納する。
[ステップS36]I/Oアクセス制御部321aは、上記の初期設定処理の過程で、CM300b内の構成情報更新回数331bを構成情報更新回数331aの値に更新するように、CM300bのI/Oアクセス制御部321bに要求する。CM300bのI/Oアクセス制御部321bは、例えば、NVRAM309bに記憶された構成情報更新回数331bをカウントアップすることで、構成情報更新回数331bの値を構成情報更新回数331aの値と一致させる。
I/Oアクセス制御部321aは、以上の初期設定処理を完了すると、冗長運用状態でのアクセス制御を再開する。
なお、ステップS31〜S33,S35,S36と進行する処理は、例えば、図14のタイミングT27で再起動した後のCM300aの処理に対応する。
[ステップS37]I/Oアクセス制御部321bは、冗長運用状態でアクセス制御を実行するための初期設定処理を実行する。この初期設定処理の過程で、I/Oアクセス制御部321aは、RAM302a内のキャッシュデータを破棄した後、他方のCM300bのI/Oアクセス制御部321bから、ローカルキャッシュ領域341bおよびミラーキャッシュ領域342bに記憶されたデータを受信する。I/Oアクセス制御部321aは、ローカルキャッシュ領域341bおよびミラーキャッシュ領域342bから送信されたデータを、ミラーキャッシュ領域342aおよびローカルキャッシュ領域341aにそれぞれ格納する。
[ステップS38]I/Oアクセス制御部321aは、上記の初期設定処理の過程で、CM300bのI/Oアクセス制御部321bから、CM300a内の構成情報更新回数331aについての更新要求を受け付ける。更新要求を受けたI/Oアクセス制御部321aは、例えば、NVRAM309aに記憶された構成情報更新回数331aをカウントアップすることで、構成情報更新回数331aの値を構成情報更新回数331bの値と一致させる。
I/Oアクセス制御部321bは、以上の初期設定処理を完了すると、冗長運用状態でのアクセス制御を再開する。
なお、ステップS31〜S33,S37,S38と進行する処理は、例えば、図14のタイミングT27で再起動した後のCM300bの処理に対応する。
[ステップS39]I/Oアクセス制御部321aは、他方のRoC301bと接続できなかった場合、NVRAM309aに記憶された起動フラグ332aを参照する。I/Oアクセス制御部321aは、起動フラグ332aの値が「1」である場合には、ステップS40の処理を実行し、起動フラグ332aの値が「0」である場合には、ステップS42の処理を実行する。
[ステップS40]I/Oアクセス制御部321aは、起動フラグ332aの値を「0」に更新する。
[ステップS41]I/Oアクセス制御部321aは、RoC301aの動作を停止させ、RoC301aの動作が異常発生により停止した場合と同じ状態を意図的につくり出す。
なお、ステップS31,S32,S39〜S41と進行する処理は、例えば、図13のタイミングT22で再起動してからタイミングT26でRoC301bの動作を停止するまでのCM300bの処理に対応する。従って、ステップS41の処理の後、両CM復旧処理が実行されることで、RoC301aは復旧モードで再起動する。
[ステップS42]起動フラグ332aが0であった場合、I/Oアクセス制御部321aは、単独運用状態でアクセス制御を実行するための初期設定処理を実行する。I/Oアクセス制御部321aは、初期設定処理において、例えば、アクセス制御の対象としてボリュームVol#0,Vol#1を設定する処理や、ローカルキャッシュ領域341aおよびミラーキャッシュ領域342aのそれぞれに記憶されたデータをキャッシュデータとして利用するための設定処理などを行う。I/Oアクセス制御部321aは、初期設定処理を完了すると、単独運用状態で、ボリュームVol#0,Vol#1に対するアクセス制御を開始する。
なお、ステップS31,S32,S39,S42と進行する処理は、例えば、図14のタイミングT27において両CM復旧処理が開始されて、CM300bのRoC301bが再起動したときに、他方のCM300aのRoC301aが正常に起動できなかった場合の処理に対応する。この場合、CM300bのI/Oアクセス制御部321bは、他方のCM300aのRoC301aとの接続ができず(ステップS32のNo)、起動フラグ332bが「0」である(ステップS39)ことから、単独運用状態でアクセス制御を行うための初期設定(ステップS42)を行った後、単独運用状態でのアクセス制御を開始する。
なお、図14で説明した処理では、タイミングT28においてRoC301aとRoC301bとの接続確認が行われた後、タイミングT29において、有効なキャッシュデータを保持していないCM300bのRoC301bに初期設定処理を開始させた。しかしながら、他の処理手順として、例えば、タイミングT29において、CM300aのI/Oアクセス制御部301aは、他方のRoC301bを通常モードで再起動させてもよい。この場合、RoC301bは、RAM302bに保持されたキャッシュデータを破棄して再起動する。I/Oアクセス制御部301aは、例えば、RoC301bが再起動してRoC301bとの接続が確認されるまでの間、単独運用状態でボリュームVol#0,Vol#1に対するアクセス制御を実行する。I/Oアクセス制御部321aは、再起動したRoC301bとの接続を確認した後、I/Oアクセス制御部301bが初期設定処理を実行する過程で、RAM302aに記憶されたキャッシュデータを他方のCM300bのRAM302bに二重化する処理を行う。I/Oアクセス制御部301bによる初期設定処理が完了すると、I/Oアクセス制御部301a,301bによる冗長運用状態でのアクセス制御が再開される。
また、別の処理手順として、例えば、タイミングT29において、CM300aのI/Oアクセス制御部301aは、他方のCM300bをFault状態(電源切断状態)に遷移させ、単独運用状態でボリュームVol#0,Vol#1に対するアクセス制御を実行してもよい。この場合、図17のフローチャートでは、I/Oアクセス制御部は、ステップS33において自CM内の構成情報更新回数の方が他方のCM内の構成情報更新回数より大きい場合、ステップS35の処理で、キャッシュデータの二重化処理を行わない代わりに、他方のCM内のRoCをFault状態に遷移させる。なお、ステップS36の処理は実行されなくてよい。また、I/Oアクセス制御部は、ステップS33において自CM内の構成情報更新回数の方が他方のCM内の構成情報更新回数より小さい場合、ステップS37,S38を実行せずに、他方のCMからFault状態への遷移が要求されるのを待機する。
このように、図14のタイミングT29で小さい構成情報更新回数を保持するCM300bをFault状態に遷移させるようにした場合には、タイミングT29からCM300aのI/Oアクセス制御部301aによる初期設定処理が行われる間にキャッシュデータの二重化処理が行われない。従って、図14のタイミングT29で小さい構成情報更新回数を保持するCM300bをFault状態に遷移させる場合には、CM300aによってアクセス制御を短時間で再開できるというメリットがある。
また、以上の第2の実施の形態では、I/Oアクセス制御部は、他方のCM内のRoCの動作が停止したことを検知したとき、他方のCMのRoCを復旧モードで再起動させた。しかしながら、I/Oアクセス制御部は、他方のCM内のRoCの動作が停止したことを検知したとき、他方のCMのRoCをキャッシュデータを維持しない通常モードで再起動させてもよい。この場合の処理を図13の処理に適用した場合を考えると、タイミングT22において、CM300aのI/Oアクセス制御部301aは、CM300bのRoC301bを通常モードで再起動させる。RoC301bが再起動する過程で、CM300bのRAM302bに記憶されたキャッシュデータは失われる。このため、タイミングT22〜T24の期間でCM300a内のキャッシュデータが更新されたか否かにかかわらず、CM300b内のキャッシュデータは無効なデータとなる。従って、タイミングT24以降で図13と同様の処理が実行されることで、CM300aに記憶された最新のキャッシュデータを利用して、CM300a,300bによるアクセス制御を再開することができる。
〔第3の実施の形態〕
次に、第3の実施の形態に係るストレージシステムとして、第2の実施の形態に係るストレージシステムのCM300a,300bに対して、キャッシュデータの更新回数をカウントする機能を追加したシステムについて説明する。第3の実施の形態におけるCM300aのI/Oアクセス制御部321aおよびCM300bのI/Oアクセス制御部321bは、両CM復旧処理によって再起動した際に、各CMが保持する、キャッシュデータの更新回数を比較する。そして、I/Oアクセス制御部321a,321bは、更新回数の比較結果に応じて、キャッシュデータの二重化処理を行ってからアクセス制御を開始するか、あるいはキャッシュデータをそのまま使用してアクセス制御を開始するかを判定する。
図19は、キャッシュ更新回数のカウント動作を示す図である。
CM300aのNVRAM309aには、キャッシュ更新回数343a,344aが記憶される。キャッシュ更新回数343aは、ローカルキャッシュ領域341aにおけるデータの更新回数を示し、キャッシュ更新回数344aは、ミラーキャッシュ領域342aにおけるデータの更新回数を示す。一方、CM300bのNVRAM309bには、キャッシュ更新回数343b,344bが記憶される。キャッシュ更新回数343bは、ローカルキャッシュ領域341bにおけるデータの更新回数を示し、キャッシュ更新回数344bは、ミラーキャッシュ領域342bにおけるデータの更新回数を示す。
CM300aのI/Oアクセス制御部321aとCM300bのI/Oアクセス制御部321aとが冗長運用状態でアクセス制御を行うとき、キャッシュ更新回数343aとキャッシュ更新回数343bとが同じ値になるように制御されるとともに、キャッシュ更新回数344aとキャッシュ更新回数344bとが同じ値になるように制御される。
例えば、CM300aのI/Oアクセス制御部321aは、ライトデータなどによってローカルキャッシュ領域341aのデータを更新すると、キャッシュ更新回数343aをカウントアップする。I/Oアクセス制御部321aは、ローカルキャッシュ領域341aのデータを更新するたびに、CM300bのI/Oアクセス制御部321bに対して、更新したキャッシュデータを転送し、ミラーキャッシュ領域342bのデータをローカルキャッシュ領域341aと同様に更新するように要求する。これとともに、I/Oアクセス制御部321aは、キャッシュ更新回数343aをカウントアップするたびに、CM300bのI/Oアクセス制御部321bに対して、キャッシュ更新回数344bをキャッシュ更新回数343aと同じ値に更新するように要求する。なお、更新を要求されたI/Oアクセス制御部321bは、例えば、キャッシュ更新回数344bをカウントアップするか、あるいは、他方のI/Oアクセス制御部321aから受信したキャッシュ更新回数343aによってキャッシュ更新回数343bを書き替えることにより、キャッシュ更新回数を同期化する。
CM300aのI/Oアクセス制御部321aからの更新要求を受けたCM300bのI/Oアクセス制御部321bは、I/Oアクセス制御部321aから転送されたキャッシュデータによってミラーキャッシュ領域342bを更新する。これとともに、I/Oアクセス制御部321bは、例えばキャッシュ更新回数344bをカウントアップすることで、キャッシュ更新回数344bの値をキャッシュ更新回数343aと同じ値に更新する。
同様に、CM300bのI/Oアクセス制御部321bは、ライトデータなどによってローカルキャッシュ領域341bのデータを更新すると、キャッシュ更新回数343bをカウントアップする。I/Oアクセス制御部321bは、ローカルキャッシュ領域341bのデータを更新するたびに、CM300aのI/Oアクセス制御部321aに対して、更新したキャッシュデータを転送し、ミラーキャッシュ領域342aのデータをローカルキャッシュ領域341bと同様に更新するように要求する。これとともに、I/Oアクセス制御部321bは、キャッシュ更新回数343bをカウントアップするたびに、CM300aのI/Oアクセス制御部321aに対して、キャッシュ更新回数344aをキャッシュ更新回数343bと同じ値に更新するように要求する。
CM300bのI/Oアクセス制御部321bからの更新要求を受けたCM300aのI/Oアクセス制御部321aは、I/Oアクセス制御部321bから転送されたキャッシュデータによってミラーキャッシュ領域342aを更新する。これとともに、I/Oアクセス制御部321aは、例えばキャッシュ更新回数344aをカウントアップすることで、キャッシュ更新回数344aの値をキャッシュ更新回数343bと同じ値に更新する。
図20は、単独運用状態におけるキャッシュ更新回数のカウント動作を示す図である。
前述のように、I/Oアクセス制御部は、他方のCM内のRoCの動作が異常発生などによって停止すると、他方のCM内のRoCを復旧モードで再起動させる。これとともに、I/Oアクセス制御部は、他方のCM内のRoCが復旧するまでの間、他方のCM内のI/Oアクセス制御部が実行していたアクセス制御を、自装置内のミラーキャッシュ領域に記憶されたデータを用いて引き継ぐ。
図20では、CM300bのRoC301bの動作が停止した場合の例を示している。この場合、CM300aのI/Oアクセス制御部321aは、CM300bのRoC301bを復旧モードで再起動させるとともに、単独運用状態に遷移する。単独運用状態では、I/Oアクセス制御部321aは、ボリュームVol#0に対するアクセス制御だけでなく、ボリュームVol#1に対するアクセス制御も実行する。I/Oアクセス制御部321aは、RAM302a内のミラーキャッシュ領域342aのデータをキャッシュデータとして使用して、ボリュームVol#1に対するアクセス制御を継続して実行する。
このような単独運用状態において、I/Oアクセス制御部321aは、ローカルキャッシュ領域341aのデータを更新するたびに、キャッシュ更新回数343aをカウントアップする。また、I/Oアクセス制御部321aは、ミラーキャッシュ領域342aのデータを更新するたびに、キャッシュ更新回数344aをカウントアップする。
図21,図22は、第3の実施の形態において、2つのRoCの動作が間隔を空けて連続的に停止した場合の動作例を示すタイムチャートである。なお、図21,図22では例として、CM300b内のRoC301bの動作が先に停止し、その後にCM300a内のRoC301aの動作が停止した場合の例を示す。
図21の初期状態では、CM300aのRoC301aおよびCM300bのRoC301bが、冗長運用状態で動作しているものとする。この状態から、CM300bのRoC301bの動作が異常発生などによって停止すると(タイミングT41)、CM300aのI/Oアクセス制御部321aは、RoC301bの動作停止を検知する(タイミングT42)。
RoC301bの動作停止を検知したI/Oアクセス制御部321aは、CM300bのNVRAM309bに記憶された起動フラグ332bを「0」から「1」に更新させるとともに、CM300bのRoC301bを復旧モードで再起動させる。さらに、I/Oアクセス制御部321aは、CM300aのNVRAM309aに記憶された構成情報更新回数331aをカウントアップする。
CM300bのRoC301bは、CM300aのI/Oアクセス制御部321aからの要求に応じて、復旧モードでの再起動処理を開始する。この再起動処理では、CM300bのRAM302b内のローカルキャッシュ領域341bおよびミラーキャッシュ領域342bの各データは保持される。
一方、CM300aのI/Oアクセス制御部321aは、単独運用状態に遷移し、ローカルキャッシュ領域341aおよびミラーキャッシュ領域342aをキャッシュ領域として用いて、ボリュームVol#0,Vol#1に対するアクセス制御を継続する。また、I/Oアクセス制御部321aは、ホスト装置120からボリュームVol#0またはボリュームVol#1へのライト要求を受け付けると、RAM302a内のキャッシュデータを更新するとともに、更新したキャッシュ領域に対応するキャッシュ更新回数をカウントアップする(タイミングT43)。このとき、I/Oアクセス制御部321aは、CM300bのRoC301bと通信できない状態であるので、CM300a内に記憶されたキャッシュ更新回数のみカウントアップし、CM300b内の記憶されたキャッシュ更新回数をカウントアップさせない。
ここで、CM300bのRoC301bの再起動処理が完了する前に、CM300aのRoC301aの動作が異常発生などによって停止したとする(タイミングT44)。CM300bのRoC301bの再起動処理が完了すると、CM300bのI/Oアクセス制御部321bは、CM300aのRoC301aとの接続確認を行う(タイミングT45)。しかし、CM300aのRoC301aは停止状態であるので、CM300bのI/Oアクセス制御部321bは、接続不能と判定する。
I/Oアクセス制御部321bは、第2の実施の形態と同様に、他方のRoC301aとの接続が不能であった場合、CM300bのNVRAM309bに記憶された起動フラグ332bを参照し、起動フラグ332bの値に応じた処理を実行する。I/Oアクセス制御部321bは、起動フラグ332bが「1」であった場合には、CM300b内のRoC301bの動作を停止させる(タイミングT46)。
タイミングT46においてCM300bのRoC301bが動作停止状態になると、図22に示すように、CM300aの復旧制御部322aまたはCM300bの復旧制御部322bが、RoC301a,301bの両方の動作が停止したことを検知する。ここで例えば、CM300aの復旧制御部322aがRoC301a,301bの動作停止を検知したものとすると、復旧制御部322aは、RoC301a,301bの両方を復旧モードで再起動させる両CM復旧処理を実行する(タイミングT47)。復旧制御部322aは、CM300aのRoC301aを復旧モードで再起動させるとともに、CM300bのRoC301bも復旧モードで再起動させる。
RoC301a,301bのそれぞれによる再起動処理が完了すると、CM300aのI/Oアクセス制御部321aとCM300bのI/Oアクセス制御部321bとの間で、通信経路P1を通じた接続確認が行われる(タイミングT48)。このとき、I/Oアクセス制御部321a,321bは、第2の実施の形態と同様に、CM300a内のNVRAM309aに記憶された構成情報更新回数331aと、CM300b内のNVRAM309bに記憶された構成情報更新回数331bとを比較する。
I/Oアクセス制御部321a,321bは、CM300a内の構成情報更新回数331aの方がCM300b内の構成情報更新回数331bより大きい場合には、次に、CM300a内のNVRAM309aに記憶されたキャッシュ更新回数と、CM300bのNVRAM309bに記憶されたキャッシュ更新回数とを比較する。
I/Oアクセス制御部321a,321bは、キャッシュ更新回数344bよりキャッシュ更新回数343aの方が大きい場合、または、キャッシュ更新回数343bよりキャッシュ更新回数344aの方が大きい場合という条件のうち少なくとも一方の条件に合致する場合には、図14に示したように、キャッシュデータの二重化処理を行った後、冗長運用状態でのアクセス制御を再開する。ただし、本実施の形態では、キャッシュ更新回数が一致しないキャッシュ領域に記憶されたデータのみ、二重化処理が行われればよい。
一方、図21のタイミングT42〜T44の期間において、CM300a内のキャッシュデータが更新されなかった場合には、タイミングT48において、CM300aが保持するキャッシュ更新回数とCM300bが保持するキャッシュ更新回数とは同じ値になる。I/Oアクセス制御部321a,321bは、キャッシュ更新回数344bとキャッシュ更新回数343a、キャッシュ更新回数343bとキャッシュ更新回数344aがいずれも一致する場合には、キャッシュデータの二重化処理を行わずに、冗長運用状態でのアクセス制御を再開する。従って、本実施の形態では、図21のタイミングT42〜T44の期間において、CM300a内のキャッシュデータが更新されなかった場合には、第2の実施の形態と比較して短時間で冗長運用状態でのアクセス制御を再開することができる。
図23は、第3の実施の形態におけるRoCの起動時の処理を示すフローチャートである。
本実施の形態におけるRoCの起動時の処理手順は、図17,図18に示したRoCの処理手順において、ステップS35,S36の処理を図23のステップS51〜S53に置き換え、ステップS37,S38の処理を図23のステップS54〜S56に置き換えたものである。そこで、ここでは、図17,図18とは異なる処理についてのみ説明する。
[ステップS51]CM300aのI/Oアクセス制御部321aは、他方のCM300b内のRoC301bと接続可能であり(ステップS32の「Yes」)、かつ、CM300b内の構成情報更新回数331bよりCM300a内の構成情報更新回数331aの方が大きい場合(ステップS33)には、CM300aに保持されたキャッシュ更新回数とCM300bに保持されたキャッシュ更新回数とを比較する。
I/Oアクセス制御部321aは、起動制御部324aを通じて、NVRAM309aに記憶されたキャッシュ更新回数343a,344aを読み込む。これとともに、I/Oアクセス制御部321aは、CM300bのI/Oアクセス制御部321bを通じて、CM300bのNVRAM309bに記憶されたキャッシュ更新回数343b,344bを読み込む。I/Oアクセス制御部321aは、キャッシュ更新回数344bよりキャッシュ更新回数343aの方が大きい場合、または、キャッシュ更新回数343bよりキャッシュ更新回数344aの方が大きい場合という条件のうち少なくとも一方の条件に合致する場合には、ステップS52の処理を実行する。
一方、I/Oアクセス制御部321aは、キャッシュ更新回数344bとキャッシュ更新回数343a、キャッシュ更新回数343bとキャッシュ更新回数344aがいずれも一致する場合には、ステップS34の処理を実行する。この場合、I/Oアクセス制御部321aは、アクセス制御のための初期設定処理(ステップS34)の過程において、キャッシュデータの二重化処理を行わない。
[ステップS52]I/Oアクセス制御部321aは、冗長運用状態でアクセス制御を実行するための初期設定処理を実行する。この初期設定処理の過程で、I/Oアクセス制御部321aは、他方のCM300b内のローカルキャッシュ領域341bおよびミラーキャッシュ領域342bに記憶されたデータを、CM300a内のミラーキャッシュ領域342aおよびローカルキャッシュ領域341aに記憶されたデータによって更新する処理を行う。
ステップS51の比較処理において、キャッシュ更新回数344bよりキャッシュ更新回数343aの方が大きかった場合、I/Oアクセス制御部321aは、ローカルキャッシュ領域341aに記憶されたデータをCM300bのI/Oアクセス制御部321bに転送し、CM300bのミラーキャッシュ領域342bの更新を要求する。CM300bのI/Oアクセス制御部321bは、ミラーキャッシュ領域342b内のキャッシュデータを破棄した後、I/Oアクセス制御部321aから受信したキャッシュデータを、ミラーキャッシュ領域342bに格納する。
また、ステップS51の比較処理において、キャッシュ更新回数343bよりキャッシュ更新回数344aの方が大きかった場合、I/Oアクセス制御部321aは、ミラーキャッシュ領域342aに記憶されたデータをCM300bのI/Oアクセス制御部321bに転送し、CM300bのローカルキャッシュ領域341bの更新を要求する。CM300bのI/Oアクセス制御部321bは、ローカルキャッシュ領域341b内のキャッシュデータを破棄した後、I/Oアクセス制御部321aから受信したキャッシュデータを、ローカルキャッシュ領域341bに格納する。
[ステップS53]I/Oアクセス制御部321aは、上記の初期設定処理の過程で、CM300b内の構成情報更新回数331bを構成情報更新回数331aの値に更新するように、CM300bのI/Oアクセス制御部321bに要求する。CM300bのI/Oアクセス制御部321bは、例えば、NVRAM309bに記憶された構成情報更新回数331bをカウントアップすることで、構成情報更新回数331bの値を構成情報更新回数331aの値と一致させる。
さらに、I/Oアクセス制御部321aは、CM300bのI/Oアクセス制御部321bに対して、CM300b内のキャッシュ更新回数を更新するように要求する。ここで、ステップS51の比較処理において、キャッシュ更新回数344bよりキャッシュ更新回数343aの方が大きかった場合、I/Oアクセス制御部321aは、キャッシュ更新回数343aの値をCM300bのI/Oアクセス制御部321bに転送し、キャッシュ更新回数344bの更新を要求する。CM300bのI/Oアクセス制御部321bは、受信したキャッシュ更新回数343aの値によって、キャッシュ更新回数344bを更新する。
また、ステップS51の比較処理において、キャッシュ更新回数343bよりキャッシュ更新回数344aの方が大きかった場合、I/Oアクセス制御部321aは、キャッシュ更新回数344aの値をCM300bのI/Oアクセス制御部321bに転送し、キャッシュ更新回数343bの更新を要求する。CM300bのI/Oアクセス制御部321bは、受信したキャッシュ更新回数344aの値によって、キャッシュ更新回数343bを更新する。
I/Oアクセス制御部321aは、以上の初期設定処理を完了すると、冗長運用状態でのアクセス制御を再開する。
なお、ステップS31〜S33,S51〜S53と進行する処理は、例えば、図22のタイミングT47で再起動した後、他方のCM300b内のRoC301bと接続できた場合のCM300aの処理に対応する。
[ステップS54]CM300aのI/Oアクセス制御部321aは、他方のCM300b内のRoC301bと接続可能であり(ステップS32の「Yes」)、かつ、CM300b内の構成情報更新回数331bよりCM300a内の構成情報更新回数331aの方が小さい場合(ステップS33)には、CM300aに保持されたキャッシュ更新回数とCM300bに保持されたキャッシュ更新回数とを比較する。
I/Oアクセス制御部321aは、起動制御部324aを通じて、NVRAM309aに記憶されたキャッシュ更新回数343a,344aを読み込む。これとともに、I/Oアクセス制御部321aは、CM300bのI/Oアクセス制御部321bを通じて、CM300bのNVRAM309bに記憶されたキャッシュ更新回数343b,344bを読み込む。I/Oアクセス制御部321aは、キャッシュ更新回数344bよりキャッシュ更新回数343aの方が小さい場合、または、キャッシュ更新回数343bよりキャッシュ更新回数344aの方が小さい場合という条件のうち少なくとも一方の条件に合致する場合には、ステップS55の処理を実行する。
一方、I/Oアクセス制御部321aは、キャッシュ更新回数344bとキャッシュ更新回数343a、キャッシュ更新回数343bとキャッシュ更新回数344aがいずれも一致する場合には、ステップS34の処理を実行する。この場合、I/Oアクセス制御部321aは、アクセス制御のための初期設定処理(ステップS34)の過程において、キャッシュデータの二重化処理を行わない。
[ステップS55]I/Oアクセス制御部321aは、冗長運用状態でアクセス制御を実行するための初期設定処理を実行する。この初期設定処理の過程で、I/Oアクセス制御部321aは、RAM302a内のローカルキャッシュ領域341aまたはミラーキャッシュ領域342aの少なくとも一方を、CM300bのI/Oアクセス制御部321bから転送されたキャッシュデータによって更新する処理を行う。
ステップS51の比較処理において、キャッシュ更新回数344bよりキャッシュ更新回数343aの方が小さかった場合、I/Oアクセス制御部321aは、ローカルキャッシュ領域341a内のキャッシュデータを破棄した後、I/Oアクセス制御部321bから受信したミラーキャッシュ領域342b内のキャッシュデータを、ローカルキャッシュ領域341aに格納する。また、ステップS51の比較処理において、キャッシュ更新回数343bよりキャッシュ更新回数344aの方が小さかった場合、I/Oアクセス制御部321aは、ミラーキャッシュ領域342a内のキャッシュデータを破棄した後、I/Oアクセス制御部321bから受信したローカルキャッシュ領域341b内のキャッシュデータを、ミラーキャッシュ領域342aに格納する。
[ステップS56]I/Oアクセス制御部321aは、上記の初期設定処理の過程で、CM300bのI/Oアクセス制御部321bから、CM300a内の構成情報更新回数331aについての更新要求を受け付ける。更新要求を受けたI/Oアクセス制御部321aは、例えば、NVRAM309aに記憶された構成情報更新回数331aをカウントアップすることで、構成情報更新回数331aの値を構成情報更新回数331bの値と一致させる。
I/Oアクセス制御部321aは、さらに、NVRAM309aに記憶されたキャッシュ更新回数343a,344aの少なくとも一方を更新する。ここで、ステップS51の比較処理において、キャッシュ更新回数344bよりキャッシュ更新回数343aの方が小さかった場合、I/Oアクセス制御部321aは、キャッシュ更新回数344bの値をCM300bのI/Oアクセス制御部321bから受信し、受信した値によってキャッシュ更新回数343aを更新する。また、ステップS51の比較処理において、キャッシュ更新回数343bよりキャッシュ更新回数344aの方が小さかった場合、I/Oアクセス制御部321aは、キャッシュ更新回数343bの値をCM300bのI/Oアクセス制御部321bから受信し、受信した値によって、キャッシュ更新回数344aを更新する。
I/Oアクセス制御部321aは、以上の初期設定処理を完了すると、冗長運用状態でのアクセス制御を再開する。
なお、ステップS31〜S33,S54〜S56と進行する処理は、例えば、図22のタイミングT47で再起動した後、他方のCM300a内のRoC301aと接続できた場合のCM300bの処理に対応する。
〔第4の実施の形態〕
上記の第3の実施の形態では、構成情報更新回数とキャッシュ更新回数の両方に基づいて、アクセス制御を開始するまでの処理手順が決定された。これに対して、以下の第4の実施の形態では、CMが起動した後、I/Oアクセス制御部は、キャッシュ更新回数を参照するものの、構成情報更新回数を参照せずに、アクセス制御を開始するまでの処理手順を決定する。
図24は、第4の実施の形態におけるRoCの起動時の処理を示すフローチャートである。
本実施の形態におけるRoCの起動時の処理手順は、図17,図18に示したRoCの処理手順において、ステップS33,S35,S36,S37,S38の処理を、図24のステップS61,S62,S63,S64,S65にそれぞれ置き換えたものである。そこで、ここでは、図17,図18とは異なる処理についてのみ説明する。
[ステップS61]CM300aのI/Oアクセス制御部321aは、他方のCM300b内のRoC301bと接続可能であった場合(ステップS32の「Yes」)には、CM300aに保持されたキャッシュ更新回数とCM300bに保持されたキャッシュ更新回数とを比較する。
I/Oアクセス制御部321aは、起動制御部324aを通じて、NVRAM309aに記憶されたキャッシュ更新回数343a,344aを読み込む。これとともに、I/Oアクセス制御部321aは、CM300bのI/Oアクセス制御部321bを通じて、CM300bのNVRAM309bに記憶されたキャッシュ更新回数343b,344bを読み込む。
I/Oアクセス制御部321aは、キャッシュ更新回数344bよりキャッシュ更新回数343aの方が大きい場合、または、キャッシュ更新回数343bよりキャッシュ更新回数344aの方が大きい場合という条件のうち少なくとも一方の条件に合致する場合には、ステップS62の処理を実行する。
また、I/Oアクセス制御部321aは、キャッシュ更新回数344bよりキャッシュ更新回数343aの方が小さい場合、または、キャッシュ更新回数343bよりキャッシュ更新回数344aの方が小さい場合という条件のうち少なくとも一方の条件に合致する場合には、ステップS64の処理を実行する。
また、I/Oアクセス制御部321aは、キャッシュ更新回数344bとキャッシュ更新回数343a、キャッシュ更新回数343bとキャッシュ更新回数344aがいずれも一致する場合には、ステップS34の処理を実行する。この場合、I/Oアクセス制御部321aは、アクセス制御のための初期設定処理(ステップS34)の過程において、キャッシュデータの二重化処理を行わない。
[ステップS62]I/Oアクセス制御部321aは、冗長運用状態でアクセス制御を実行するための初期設定処理を実行する。この初期設定処理の過程で、I/Oアクセス制御部321aは、他方のCM300b内のローカルキャッシュ領域341bおよびミラーキャッシュ領域342bに記憶されたデータを、CM300a内のミラーキャッシュ領域342aおよびローカルキャッシュ領域341aに記憶されたデータによって更新する処理を行う。
ステップS61の比較処理において、キャッシュ更新回数344bよりキャッシュ更新回数343aの方が大きかった場合、I/Oアクセス制御部321aは、ローカルキャッシュ領域341aに記憶されたデータをCM300bのI/Oアクセス制御部321bに転送し、CM300bのミラーキャッシュ領域342bの更新を要求する。CM300bのI/Oアクセス制御部321bは、ミラーキャッシュ領域342b内のキャッシュデータを破棄した後、I/Oアクセス制御部321aから受信したキャッシュデータを、ミラーキャッシュ領域342bに格納する。
また、ステップS61の比較処理において、キャッシュ更新回数343bよりキャッシュ更新回数344aの方が大きかった場合、I/Oアクセス制御部321aは、ミラーキャッシュ領域342aに記憶されたデータをCM300bのI/Oアクセス制御部321bに転送し、CM300bのローカルキャッシュ領域341bの更新を要求する。CM300bのI/Oアクセス制御部321bは、ローカルキャッシュ領域341b内のキャッシュデータを破棄した後、I/Oアクセス制御部321aから受信したキャッシュデータを、ローカルキャッシュ領域341bに格納する。
[ステップS63]I/Oアクセス制御部321aは、上記の初期設定処理の過程で、CM300bのI/Oアクセス制御部321bに対して、CM300b内のキャッシュ更新回数を更新するように要求する。ここで、ステップS61の比較処理において、キャッシュ更新回数344bよりキャッシュ更新回数343aの方が大きかった場合、I/Oアクセス制御部321aは、キャッシュ更新回数343aの値をCM300bのI/Oアクセス制御部321bに転送し、キャッシュ更新回数344bの更新を要求する。CM300bのI/Oアクセス制御部321bは、受信したキャッシュ更新回数343aの値によって、キャッシュ更新回数344bを更新する。
また、ステップS61の比較処理において、キャッシュ更新回数343bよりキャッシュ更新回数344aの方が大きかった場合、I/Oアクセス制御部321aは、キャッシュ更新回数344aの値をCM300bのI/Oアクセス制御部321bに転送し、キャッシュ更新回数343bの更新を要求する。CM300bのI/Oアクセス制御部321bは、受信したキャッシュ更新回数344aの値によって、キャッシュ更新回数343bを更新する。
I/Oアクセス制御部321aは、以上の初期設定処理を完了すると、冗長運用状態でのアクセス制御を再開する。
[ステップS64]I/Oアクセス制御部321aは、冗長運用状態でアクセス制御を実行するための初期設定処理を実行する。この初期設定処理の過程で、I/Oアクセス制御部321aは、RAM302a内のローカルキャッシュ領域341aまたはミラーキャッシュ領域342aの少なくとも一方を、CM300bのI/Oアクセス制御部321bから転送されたキャッシュデータによって更新する処理を行う。
ステップS61の比較処理において、キャッシュ更新回数344bよりキャッシュ更新回数343aの方が小さかった場合、I/Oアクセス制御部321aは、ローカルキャッシュ領域341a内のキャッシュデータを破棄した後、I/Oアクセス制御部321bから受信したミラーキャッシュ領域342b内のキャッシュデータを、ローカルキャッシュ領域341aに格納する。また、ステップS61の比較処理において、キャッシュ更新回数343bよりキャッシュ更新回数344aの方が小さかった場合、I/Oアクセス制御部321aは、ミラーキャッシュ領域342a内のキャッシュデータを破棄した後、I/Oアクセス制御部321bから受信したローカルキャッシュ領域341b内のキャッシュデータを、ミラーキャッシュ領域342aに格納する。
[ステップS65]I/Oアクセス制御部321aは、上記の初期設定処理の過程で、NVRAM309aに記憶されたキャッシュ更新回数343a,344aの少なくとも一方を更新する。ここで、ステップS61の比較処理において、キャッシュ更新回数344bよりキャッシュ更新回数343aの方が小さかった場合、I/Oアクセス制御部321aは、キャッシュ更新回数344bの値をCM300bのI/Oアクセス制御部321bから受信し、受信した値によってキャッシュ更新回数343aを更新する。また、ステップS61の比較処理において、キャッシュ更新回数343bよりキャッシュ更新回数344aの方が小さかった場合、I/Oアクセス制御部321aは、キャッシュ更新回数343bの値をCM300bのI/Oアクセス制御部321bから受信し、受信した値によって、キャッシュ更新回数344aを更新する。
I/Oアクセス制御部321aは、以上の初期設定処理を完了すると、冗長運用状態でのアクセス制御を再開する。
以上説明した第4の実施の形態によれば、CMが起動した後、I/Oアクセス制御部は、キャッシュ更新回数を参照するものの、構成情報更新回数を参照せずに、アクセス制御を開始するまでの処理手順を決定する。このため、第3の実施の形態と比較して、処理手順が簡略化され、処理効率を高めることができる。
〔第5の実施の形態〕
上記の第3,第4の実施の形態では、キャッシュ更新回数に基づいて、アクセス制御を開始するまでの処理手順が決定された。これに対して、以下の第4の実施の形態では、キャッシュ更新回数の代わりに、単独運用状態である期間においてキャッシュデータが更新されたか否かを示すキャッシュ更新フラグに基づいて、アクセス制御を開始するまでの処理手順を決定する。
図25は、キャッシュ更新フラグの設定動作を示す図である。
CM300aのNVRAM309aには、キャッシュ更新フラグ345a,346aが記憶される。キャッシュ更新フラグ345aは、CM300aのI/Oアクセス制御部321aが単独運用状態でアクセス制御を行った期間において、ローカルキャッシュ領域341aのデータが更新されたか否かを示す。キャッシュ更新フラグ346aは、CM300aのI/Oアクセス制御部321aが単独運用状態でアクセス制御を行った期間において、ミラーキャッシュ領域342aのデータが更新されたか否かを示す。キャッシュ更新フラグ345a,346aのそれぞれの初期値は「0」である。
一方、CM300bのNVRAM309bには、キャッシュ更新フラグ345b,346bが記憶される。キャッシュ更新フラグ345bは、CM300bのI/Oアクセス制御部321bが単独運用状態でアクセス制御を行った期間において、ローカルキャッシュ領域341bのデータが更新されたか否かを示す。キャッシュ更新フラグ346bは、CM300bのI/Oアクセス制御部321bが単独運用状態でアクセス制御を行った期間において、ミラーキャッシュ領域342bのデータが更新されたか否かを示す。キャッシュ更新フラグ345b,346bのそれぞれの初期値は「0」である。
図26は、キャッシュ更新フラグがセットされる際の処理手順を示すフローチャートである。なお、この図26では、例としてCM300aのI/Oアクセス制御部321aの処理について示すが、CM300bのI/Oアクセス制御部321bも同様の処理を実行可能である。
[ステップS81]図26の初期状態では、CM300aが保持するキャッシュ更新フラグ345a,346aは、ともに「0」である。この状態において、I/Oアクセス制御部321aは、自身が単独運用状態でのアクセス制御を開始した場合(S81:Yes)に、ステップS82の処理を実行する。
このステップS81においてI/Oアクセス制御部321aが単独運用状態でのアクセス制御を開始する場合とは、例えば、図13のタイミングT22、図21のタイミングT42など、他方のCM300b内のRoC301bの動作が停止したことをI/Oアクセス制御部321aが検知した場合である。
[ステップS82]I/Oアクセス制御部321aは、ボリュームVol#0に対するライト要求などに応じて、ローカルキャッシュ領域341aを更新したか否かを、一定時間ごとに判定する。I/Oアクセス制御部321aは、ローカルキャッシュ領域341aを更新した場合(S82:Yes)にはステップS84の処理を実行し、ローカルキャッシュ領域341aを一定時間内に更新しなかった場合(S82:No)には、ステップS83の処理を実行する。
[ステップS83]I/Oアクセス制御部321aは、ボリュームVol#1に対するライト要求などに応じて、ミラーキャッシュ領域342aを更新したか否かを、一定時間ごとに判定する。I/Oアクセス制御部321aは、ミラーキャッシュ領域342aを更新した場合(S83:Yes)にはステップS87の処理を実行し、ミラーキャッシュ領域342aを一定時間内に更新しなかった場合(S83:No)には、ステップS82の処理を再度実行する。
[ステップS84]ステップS82でローカルキャッシュ領域341aを更新したと判定した場合、I/Oアクセス制御部321aは、NVRAM309a内のキャッシュ更新フラグ345aを、「0」から「1」に更新する。
[ステップS85]I/Oアクセス制御部321aは、ボリュームVol#1に対するライト要求などに応じて、ミラーキャッシュ領域342aを更新したか否かを監視する。I/Oアクセス制御部321aは、ミラーキャッシュ領域342aを更新した場合(S85:Yes)に、ステップS86の処理を実行する。
[ステップS86]I/Oアクセス制御部321aは、NVRAM309a内のキャッシュ更新フラグ346aを、「0」から「1」に更新する。
[ステップS87]ステップS83でミラーキャッシュ領域342aを更新したと判定した場合、I/Oアクセス制御部321aは、NVRAM309a内のキャッシュ更新フラグ346aを、「0」から「1」に更新する。
[ステップS88]I/Oアクセス制御部321aは、ボリュームVol#0に対するライト要求などに応じて、ローカルキャッシュ領域341aを更新したか否かを監視する。I/Oアクセス制御部321aは、ローカルキャッシュ領域341aを更新した場合(S88:Yes)に、ステップS89の処理を実行する。
[ステップS89]I/Oアクセス制御部321aは、NVRAM309a内のキャッシュ更新フラグ345aを、「0」から「1」に更新する。
以上の図26の処理によれば、I/Oアクセス制御部321aが単独運用状態でアクセス制御を開始した後、ローカルキャッシュ領域341aが最初に更新されたとき、キャッシュ更新フラグ345aが「1」に更新される。また、I/Oアクセス制御部321aが単独運用状態でアクセス制御を開始した後、ミラーキャッシュ領域342aが最初に更新されたとき、キャッシュ更新フラグ346aが「1」に更新される。
図27は、第5の実施の形態におけるRoCの起動時の処理を示すフローチャートである。
本実施の形態におけるRoCの起動時の処理手順は、図24に示したRoCの処理手順において、ステップS61,S62,S63の処理を、図27のステップS101,S102,S103にそれぞれ置き換え、ステップS64,S65の処理を、図27のステップS104に置き換えたものである。そこで、ここでは、図24とは異なる処理についてのみ説明する。
[ステップS101]CM300aのI/Oアクセス制御部321aは、他方のCM300b内のRoC301bと接続可能であった場合(ステップS32の「Yes」)には、CM300aに保持されたキャッシュ更新フラグとCM300bに保持されたキャッシュ更新フラグとを比較する。
I/Oアクセス制御部321aは、起動制御部324aを通じて、NVRAM309aに記憶されたキャッシュ更新フラグ345a,346aを読み込む。これとともに、I/Oアクセス制御部321aは、CM300bのI/Oアクセス制御部321bを通じて、CM300bのNVRAM309bに記憶されたキャッシュ更新フラグ345b、346bを読み込む。
I/Oアクセス制御部321aは、CM300b側のキャッシュ更新フラグ345b、346bがともに「0」であり、CM300a側のキャッシュ更新フラグ345a,346aの少なくとも一方が「1」である場合には、ステップS102の処理を実行する。
また、I/Oアクセス制御部321aは、CM300a側のキャッシュ更新フラグ345a,346aがともに「0」であり、CM300b側のキャッシュ更新フラグ345b、346bの少なくとも一方が「1」である場合には、ステップS104の処理を実行する。
また、I/Oアクセス制御部321aは、キャッシュ更新フラグ345a,345b,346a,346bのすべてが「0」である場合には、ステップS34の処理を実行する。この場合、I/Oアクセス制御部321aは、アクセス制御のための初期設定処理(ステップS34)の過程において、キャッシュデータの二重化処理を行わない。
[ステップS102]I/Oアクセス制御部321aは、冗長運用状態でアクセス制御を実行するための初期設定処理を実行する。この初期設定処理の過程で、I/Oアクセス制御部321aは、他方のCM300b内のローカルキャッシュ領域341bおよびミラーキャッシュ領域342bに記憶されたデータを、CM300a内のミラーキャッシュ領域342aおよびローカルキャッシュ領域341aに記憶されたデータによって更新する処理を行う。
ステップS101の比較処理において、キャッシュ更新フラグ345aが「1」であった場合、I/Oアクセス制御部321aは、ローカルキャッシュ領域341aに記憶されたデータをCM300bのI/Oアクセス制御部321bに転送し、CM300bのミラーキャッシュ領域342bの更新を要求する。CM300bのI/Oアクセス制御部321bは、ミラーキャッシュ領域342b内のキャッシュデータを破棄した後、I/Oアクセス制御部321aから受信したキャッシュデータを、ミラーキャッシュ領域342bに格納する。
また、ステップS101の比較処理において、キャッシュ更新フラグ346aが「1」であった場合、I/Oアクセス制御部321aは、ミラーキャッシュ領域342aに記憶されたデータをCM300bのI/Oアクセス制御部321bに転送し、CM300bのローカルキャッシュ領域341bの更新を要求する。CM300bのI/Oアクセス制御部321bは、ローカルキャッシュ領域341b内のキャッシュデータを破棄した後、I/Oアクセス制御部321aから受信したキャッシュデータを、ローカルキャッシュ領域341bに格納する。
[ステップS103]I/Oアクセス制御部321aは、上記の初期設定処理の過程で、ステップS101で「1」であったCM300a側のキャッシュ更新フラグを「0」にクリアする。
I/Oアクセス制御部321aは、以上の初期設定処理を完了すると、冗長運用状態でのアクセス制御を再開する。
[ステップS104]I/Oアクセス制御部321aは、冗長運用状態でアクセス制御を実行するための初期設定処理を実行する。この初期設定処理の過程で、I/Oアクセス制御部321aは、RAM302a内のローカルキャッシュ領域341aまたはミラーキャッシュ領域342aの少なくとも一方を、CM300bのI/Oアクセス制御部321bから転送されたキャッシュデータによって更新する処理を行う。
ステップS101の比較処理において、キャッシュ更新フラグ346bが「1」であった場合、I/Oアクセス制御部321aは、ローカルキャッシュ領域341a内のキャッシュデータを破棄した後、I/Oアクセス制御部321bから受信したミラーキャッシュ領域342b内のキャッシュデータを、ローカルキャッシュ領域341aに格納する。また、ステップS101の比較処理において、キャッシュ更新フラグ345bが「1」であった場合、I/Oアクセス制御部321aは、ミラーキャッシュ領域342a内のキャッシュデータを破棄した後、I/Oアクセス制御部321bから受信したローカルキャッシュ領域341b内のキャッシュデータを、ミラーキャッシュ領域342aに格納する。
I/Oアクセス制御部321aは、以上の初期設定処理を完了すると、冗長運用状態でのアクセス制御を再開する。
以上説明した第5の実施の形態によれば、CMが起動した後、I/Oアクセス制御部は、キャッシュ更新フラグを参照して、アクセス制御を開始するまでの処理手順を決定する。キャッシュ更新フラグはそれぞれ1ビットのデータであればよいので、第4の実施の形態と比較して、アクセス制御を開始するまでの処理手順を決定するために用意すべき情報の記憶領域を小さくすることができる。また、第4の実施の形態におけるキャッシュ更新回数と比較して、キャッシュ更新フラグの更新頻度は明らかに少ない。このことから、キャッシュ更新フラグをNVRAMのようなアクセス速度が比較的低速な不揮発性記録媒体に記憶した場合でも、キャッシュ更新フラグの更新に要する時間が全体の処理時間に与える影響が小さくなり、CM全体の処理効率が向上する。
〔第6の実施の形態〕
上記の第2の実施の形態では、冗長運用状態において例えばCM300bのRoC301bの動作が停止した後、RoC301bが起動処理を行っている間にCM300aのRoC301aの動作が停止した場合には、CM300bのRoC301bの動作を停止させることで両CM復旧処理を実行させた。これに対して、以下の第6の実施の形態では、両CM復旧処理を実行させる代わりに、CM300bのRoC301bから、動作停止したCM300aのRoC301aを復旧モードで再起動させる。
図28,図29は、第6の実施の形態において2つのRoCの動作が間隔を空けて連続的に停止した場合の動作例を示すタイムチャートである。なお、図28,図29では例として、CM300b内のRoC301bの動作が先に停止し、その後にCM300a内のRoC301aの動作が停止した場合の例を示す。
図28の初期状態では、CM300aのRoC301aおよびCM300bのRoC301bが、冗長運用状態で動作しているものとする。この状態から、CM300bのRoC301bの動作が異常発生などによって停止すると(タイミングT61)、CM300aのI/Oアクセス制御部321aは、RoC301bの動作停止を検知する(タイミングT62)。
RoC301bの動作停止を検知したI/Oアクセス制御部321aは、CM300bのNVRAM309bに記憶された起動フラグ332bを「0」から「1」に更新させるとともに、CM300bのRoC301bを復旧モードで再起動させる。さらに、I/Oアクセス制御部321aは、CM300aのNVRAM309aに記憶された構成情報更新回数331aをカウントアップする。
CM300bのRoC301bは、CM300aのI/Oアクセス制御部321aからの要求に応じて、復旧モードでの再起動処理を開始する。この再起動処理では、CM300bのRAM302b内のローカルキャッシュ領域341bおよびミラーキャッシュ領域342bの各データは保持される。
一方、CM300aのI/Oアクセス制御部321aは、単独運用状態に遷移し、ローカルキャッシュ領域341aおよびミラーキャッシュ領域342aをキャッシュ領域として用いて、ボリュームVol#0,Vol#1に対するアクセス制御を継続する。また、I/Oアクセス制御部321aは、ホスト装置120からボリュームVol#0またはボリュームVol#1へのライト要求を受け付けた場合には、RAM302a内のキャッシュデータを更新する(タイミングT63)。
ここで、CM300bのRoC301bの再起動処理が完了する前に、CM300aのRoC301aの動作が異常発生などによって停止したとする(タイミングT64)。CM300bのRoC301bの再起動処理が完了すると、CM300bのI/Oアクセス制御部321bは、CM300aのRoC301aとの接続確認を行う(タイミングT65)。しかし、CM300aのRoC301aは停止状態であるので、CM300bのI/Oアクセス制御部321bは、接続不能と判定する。
I/Oアクセス制御部321bは、他方のRoC301aとの接続が不能であった場合、CM300bのNVRAM309bに記憶された起動フラグ332bを参照し、起動フラグ332bの値に応じた処理を実行する。I/Oアクセス制御部321bは、起動フラグ332bが「1」であった場合には、CM300aのRoC301aを復旧モードで再起動させ(タイミングT66)、それ以後、CM300aのI/Oアクセス制御部321aとの接続が回復するまで待機する。
CM300bのRoC301bからの指示に応じたCM300aのRoC301aの再起動処理が完了すると、CM300aのI/Oアクセス制御部321aとCM300bのI/Oアクセス制御部321bとの間で、通信経路P1を通じた接続確認が行われる(タイミングT67)。このとき、I/Oアクセス制御部321a,321bは、CM300a内のNVRAM309aに記憶された構成情報更新回数331aと、CM300b内のNVRAM309bに記憶された構成情報更新回数331bとを比較する。
I/Oアクセス制御部321a,321bは、CM300a内の構成情報更新回数331aの方がCM300b内の構成情報更新回数331bより大きいことから、CM300a内のキャッシュデータが有効である(すなわち最新のものである)と判定する。I/Oアクセス制御部321a,321bは、冗長運用状態でアクセス制御を行うための初期設定処理を実行する(タイミングT68)。なお、この初期設定処理の開始段階において、CM300b内の構成情報更新回数331bがカウントアップされ、構成情報更新回数331a,331bが同期した状態にされる。
タイミングT68からの初期設定処理の過程で、I/Oアクセス制御部321a,321bは、CM300a内に保持されたキャッシュデータを二重化する処理を行う。I/Oアクセス制御部321aは、RAM302a内のローカルキャッシュ領域341aおよびミラーキャッシュ領域342aに記憶されたデータを、他方のCM300bのI/Oアクセス制御部321bに転送する。I/Oアクセス制御部321bは、RAM302b内のローカルキャッシュ領域341bおよびミラーキャッシュ領域342bに記憶されたデータを破棄する。そして、ローカルキャッシュ領域341aから転送されたデータをミラーキャッシュ領域342bに格納するとともに、ミラーキャッシュ領域342aから転送されたデータをローカルキャッシュ領域341bに格納する。
I/Oアクセス制御部321a,321bのそれぞれの初期設定処理が完了すると、I/Oアクセス制御部321a,321bは、冗長運用状態でのアクセス制御を開始する(タイミングT69)。
以上の動作では、CM300bのI/Oアクセス制御部321bは、タイミングT65においてCM300aのRoC301aと接続できず、なおかつCM300b内の起動フラグ332bが「1」であった場合には、両CM復帰処理を実行させずに、CM300aのRoC301aを復旧モードで再起動させる。このような処理により、第2の実施の形態と比較して、I/Oアクセス制御部321a,321bによるアクセス制御をより短時間で再開させることができる。
図30は、第6の実施の形態におけるRoCの起動時の処理を示すフローチャートである。
本実施の形態におけるRoCの起動時の処理手順は、図17,図18に示したRoCの処理手順において、ステップS41の処理を図30のステップS111,S112の処理に置き換えたものである。そこで、ここでは図17,図18とは異なる処理についてのみ説明する。
[ステップS111]I/Oアクセス制御部321aは、起動後にCM300bのRoC301bと接続不能であり(ステップS32のYes)、CM300a内の起動フラグ332aが「1」である(ステップS39)場合には、起動フラグ332aを「0」にした(ステップS40)後、起動制御部324aを通じて、CM300bのRoC301bを復旧モードで再起動させる。なお、ステップS40,S111の処理順は逆であってもよい。
[ステップS112]I/Oアクセス制御部321aは、再起動させたCM300bのRoC301bと接続が可能になるかを、ステップS111の実行から所定時間だけ監視する。このステップS112でCM300bのRoC301bと接続が可能になるかを監視する時間は、RoC301bが復旧モードで再起動処理を行い、他方のRoC301aと接続可能になるまでに要する時間と同じか、それより少し長い時間とされる。
I/Oアクセス制御部321aは、ステップS111の実行から所定時間以内にCM300bのRoC301bとの接続が回復した場合には、図17のステップS33を起点として処理を継続する。なお、ステップS40,S111,S112,S33と進行する処理は、例えば、図28のタイミングT65以後の処理に対応する。
一方、I/Oアクセス制御部321aは、ステップS111の実行から所定時間以内にCM300bのRoC301bとの接続が回復しなかった場合(すなわち、RoC301bの再起動処理が完了しなかった場合)には、ステップS42の処理を実行する。ステップS112からステップS42へ進行する処理は、例えば、図29のタイミングT67においてCM300bのI/Oアクセス制御部321bがCM300aのRoC301aと接続できなかった場合に対応する。この場合、I/Oアクセス制御部321bは、単独運用状態で、ボリュームVol#0,Vol#1に対するアクセス制御を開始する。
なお、以上の図30の処理は、第2の実施の形態を基礎として、図18のステップS41の処理を変形したものであった。しかしながら、第2の実施の形態の代わりに、第3〜第5の実施の形態のいずれかを基礎として処理が変形されてもよい。すなわち、図30のステップS112で、他方のRoCと所定時間以内に接続できた場合には、次に、図17のステップS33の代わりに、図23のステップS33、図24のステップS61、図27のステップS101のいずれかの処理が実行されてもよい。
以上の各実施の形態に関し、さらに以下の付記を開示する。
(付記1) データを記憶する記憶装置と、
前記記憶装置のデータを自装置内のキャッシュメモリにキャッシュしながら、上位装置からのアクセス要求に応じて前記記憶装置にアクセスするとともに、自装置内のキャッシュメモリにキャッシュしたデータと同じデータを、他方の制御装置内のキャッシュメモリにも記録するアクセス制御部をそれぞれ備える第1の制御装置および第2の制御装置と、
を有し、
前記第1の制御装置は、前記第2の制御装置におけるアクセス制御部の処理が停止したことを検知すると、前記第2の制御装置を再起動させるとともに、前記第2の制御装置内の不揮発性記憶部に対して、前記第2の制御装置以外の制御装置から再起動が指示されたことを示す起動情報を記録する第1の再起動制御部を有し、
前記第2の制御装置は、自装置が起動したときに、前記第1の制御装置におけるアクセス制御部の処理が停止しており、かつ、自装置以外の制御装置から再起動が指示されたことを示す起動情報が自装置内の不揮発性記憶部に記憶されていた場合に、前記第1の制御装置を、前記第1の制御装置内のキャッシュメモリに記憶されたデータを保持したまま再起動させる第2の再起動制御部を有する、
ことを特徴とするストレージシステム。
(付記2) 前記第1の再起動制御部は、前記第2の制御装置を再起動させたときに、自装置内のキャッシュメモリに最新のキャッシュデータが保持されていることを示すキャッシュ識別情報を、自装置内の不揮発性記憶部に記録し、
前記第1の制御装置のアクセス制御部は、自装置が再起動したとき、自装置内のキャッシュメモリに最新のキャッシュデータが保持されていることを示すキャッシュ識別情報が自装置内の不揮発性記憶部に記憶されていた場合に、前記第2の制御装置内のキャッシュメモリに記憶されたキャッシュデータが、自装置内のキャッシュメモリに記憶されたキャッシュデータと同一になるように制御する、
ことを特徴とする付記1記載のストレージシステム。
(付記3) 前記第1の再起動制御部は、前記第2の制御装置を再起動させたときに、自装置内のキャッシュメモリに最新のキャッシュデータが保持されていることを示すキャッシュ識別情報を、自装置内の不揮発性記憶部に記録し、
前記第1の制御装置のアクセス制御部は、自装置が再起動したとき、自装置内のキャッシュメモリに最新のキャッシュデータが保持されていることを示すキャッシュ識別情報が自装置内の不揮発性記憶部に記憶されていた場合に、自装置内のキャッシュメモリに記憶されたデータをキャッシュデータとして用いて前記記憶装置に対するアクセス処理を再開する、
ことを特徴とする付記1記載のストレージシステム。
(付記4) 前記第1の再起動制御部は、前記第2の制御装置におけるアクセス制御部の処理が停止したことを検知すると、前記第2の制御装置を、前記第2の制御装置内のキャッシュメモリに記憶されたデータを保持したまま再起動させ、前記第2の制御装置を再起動させた後に自装置のキャッシュメモリ内のデータが更新されたときに、自装置内のキャッシュメモリに最新のキャッシュデータが保持されていることを示すキャッシュ識別情報を、自装置内の不揮発性記憶部に記憶し、
前記第1の制御装置のアクセス制御部は、自装置が再起動したとき、自装置内のキャッシュメモリに最新のキャッシュデータが保持されていることを示すキャッシュ識別情報が自装置内の不揮発性記憶部に記憶されていた場合に、前記第2の制御装置内のキャッシュメモリに記憶されたキャッシュデータが、自装置内のキャッシュメモリに記憶されたキャッシュデータと同一になるように制御する、
ことを特徴とする付記1記載のストレージシステム。
(付記5) 前記第1の制御装置および前記第2の制御装置は、それぞれ、前記キャッシュ識別情報として、自装置内のキャッシュメモリに記憶されたデータが更新された回数を示す更新回数情報を、自装置内の不揮発性記憶部に記憶し、
前記第1の制御装置および前記第2の制御装置のアクセス制御部は、それぞれ、自装置内のキャッシュメモリに記憶されたデータを更新するたびに、自装置内の不揮発性記憶部に記憶された更新回数情報をカウントアップするとともに、他方の制御装置のアクセス制御部を通じて、他方の制御装置の不揮発性記憶部に記憶された更新回数情報が自装置内の不揮発性記憶部に記憶された更新回数情報と一致するように制御し、
前記第1の制御装置のアクセス制御部は、自装置が再起動したとき、自装置および前記第2の制御装置のそれぞれの不揮発性記憶部に記憶された更新回数情報を比較し、各更新回数情報の比較結果に基づいて自装置内のキャッシュメモリに最新のキャッシュデータが保持されていると判定した場合に、前記第2の制御装置内のキャッシュメモリに記憶されたキャッシュデータが、自装置内のキャッシュメモリに記憶されたキャッシュデータと同一になるように制御する、
ことを特徴とする付記4記載のストレージシステム。
(付記6) 前記第1の制御装置のアクセス制御部は、自装置が再起動したとき、自装置および前記第2の制御装置のそれぞれの不揮発性記憶部に記憶された更新回数情報を比較し、各更新回数情報が同一である場合には、前記第2の制御装置のアクセス制御部とともに前記記憶装置に対するアクセス処理を再開することを特徴とする付記5記載のストレージシステム。
(付記7) 前記第1の制御装置は、前記キャッシュ識別情報として、自装置内のキャッシュメモリに記憶されたデータが更新されたか否かを示す更新識別情報を、自装置内の不揮発性記憶部に記憶し、
前記第1の制御装置のアクセス制御部は、
自装置内の前記第1の再起動制御部によって前記第2の制御装置におけるアクセス制御部の処理が停止したことが検知された後、自装置内のキャッシュメモリが少なくとも1回更新された場合に、自装置内の不揮発性記憶部に記憶された更新識別情報を初期値から別の値に更新し、
自装置が再起動したとき、自装置内の不揮発性記憶部に記憶された更新識別情報が初期値でなかった場合に、前記第2の制御装置内のキャッシュメモリに記憶されたキャッシュデータが、自装置内のキャッシュメモリに記憶されたキャッシュデータと同一になるように制御する、
ことを特徴とする付記4記載のストレージシステム。
(付記8) 前記第1の再起動制御部は、前記第2の制御装置におけるアクセス制御部の処理が停止したことを検知すると、前記第2の制御装置を、前記第2の制御装置内のキャッシュメモリに記憶されたデータを保持したまま再起動させ、前記第2の制御装置を再起動させた後に自装置のキャッシュメモリ内のデータが更新されたときに、自装置内のキャッシュメモリに最新のキャッシュデータが保持されていることを示すキャッシュ識別情報を、自装置内の不揮発性記憶部に記憶し、
前記第1の制御装置のアクセス制御部は、自装置が再起動したとき、自装置内のキャッシュメモリに最新のキャッシュデータが保持されていることを示すキャッシュ識別情報が自装置内の不揮発性記憶部に記憶されていた場合に、自装置内のキャッシュメモリに記憶されたデータをキャッシュデータとして用いて前記記憶装置に対するアクセス処理を再開する、
ことを特徴とする付記1記載のストレージシステム。
(付記9) 前記第1の制御装置および前記第2の制御装置は、それぞれ、自装置におけるアクセス制御部の処理と、他方の制御装置におけるアクセス制御部の処理の両方が停止したことを検出すると、アクセス制御部の処理が停止した両方の制御装置を、各制御装置内のキャッシュメモリに記憶されたデータを保持したまま再起動させる第3の再起動制御部をさらに有し、
前記第2の再起動制御部は、自装置が再起動したとき、前記第1の制御装置におけるアクセス制御部の処理が停止しており、かつ、自装置以外の制御装置から再起動が指示されたことを示す起動情報が自装置内の不揮発性記憶部に記憶されていた場合に、自装置におけるアクセス制御部の処理を停止して、自装置内または前記第1の制御装置内の第3の再起動制御部に、自装置および前記第1の制御装置の両方におけるアクセス制御部の処理の停止を検出させる、
ことを特徴とする付記1記載のストレージシステム。
(付記10) データを記憶する記憶装置へのアクセス処理を制御する制御装置において、
前記記憶装置のデータを自装置内のキャッシュメモリにキャッシュしながら、上位装置からのアクセス要求に応じて前記記憶装置にアクセスするとともに、自装置内のキャッシュメモリにキャッシュしたデータと同じデータを他の制御装置内のキャッシュメモリにも記録するアクセス制御部と、
前記他の制御装置におけるアクセス制御部の処理が停止したことを検知すると、前記他の制御装置を再起動させるとともに、前記他の制御装置内の不揮発性記憶部に対して、前記他の制御装置以外の制御装置から再起動が指示されたことを示す起動情報を記録する第1の再起動制御部と、
自装置が起動したとき、前記他の制御装置におけるアクセス制御部の処理が停止しており、かつ、自装置以外の制御装置から再起動が指示されたことを示す起動情報が自装置内の不揮発性記憶部に記憶されていた場合に、前記他の制御装置を、前記他の制御装置内のキャッシュメモリに記憶されたデータを保持したまま再起動させる第2の再起動制御部と、
を有することを特徴とする制御装置。
(付記11) データを記憶する記憶装置と、前記記憶装置へのアクセス処理をそれぞれ制御する第1の制御装置および第2の制御装置とを有し、前記各制御装置が、前記記憶装置のデータを自装置内のキャッシュメモリにキャッシュするとともに、自装置内のキャッシュメモリにキャッシュしたデータを他方の制御装置内のキャッシュメモリにも記録する機能を備えたストレージシステムにおける制御方法であって、
前記第1の制御装置が、前記第2の制御装置における前記記憶装置へのアクセス処理が停止したことを検知すると、前記第2の制御装置を再起動させるとともに、前記第2の制御装置内の不揮発性記憶部に対して、前記第2の制御装置以外の制御装置から再起動が指示されたことを示す起動情報を記録し、
前記第2の制御装置が、自装置が起動したとき、前記第1の制御装置における前記記憶装置へのアクセス処理が停止しており、かつ、自装置以外の制御装置から再起動が指示されたことを示す起動情報が自装置内の不揮発性記憶部に記憶されていた場合に、前記第1の制御装置を、前記第1の制御装置内のキャッシュメモリに記憶されたデータを保持したまま再起動させる、
ことを特徴とする制御方法。