以下、幾つかの実施例を、図面を参照して説明する。なお、以下に説明するいずれの実施例も請求の範囲にかかる発明を限定するものではなく、また実施例の中で説明されている諸要素及びその組み合わせの全てが発明の解決手段に必須であるとは限らない。
なお、以後の説明では「aaaテーブル」等の表現にて情報を説明するが、これら情報は、テーブル等のデータ構造以外で表現されていてもよい。そのため、データ構造に依存しないことを示すために「aaaテーブル」等の情報を「aaa情報」と呼ぶことができる。
また、以後の説明では「プログラム」を主語として説明を行う場合があるが、プログラムはプロセッサによって実行されることで定められた処理を行うため、プロセッサを主語とした説明としてもよい。また、プログラムを主語として開示された処理は、そのプログラムを実行するプロセッサ又はそれを有する装置(例えば、制御デバイス、コントローラ、ストレージシステム)が行う処理としてもよい。また、プロセッサがプログラムを実行することにより行われる処理の一部または全ては、プロセッサに代えて又は加えてハードウェア回路によって行われても良い。また、各種プログラムはプログラム配布サーバや、計算機が読み取り可能な記憶メディアによって各計算機にインストールされてもよい。
まず、従来例における課題及び実施例1の概要を説明する。
図1は、従来例に係るジャーナルボリュームにおけるジャーナルの管理方法を説明する図である。
従来例に係るジャーナル管理方法においては、主ストレージシステム200Aでは、JNL(Journal)を一時的に格納するためのバッファ領域として利用されるJVOL(Journal Volume)252をラップアラウンド方法により利用する。すなわち、生成されたJNLは、JVOL252の先頭のアドレスから順次格納され、JNLが最後のアドレスまで格納された後に、再び先頭のアドレスから格納される。一方、JVOL252の先頭のアドレスのJNLから、順次取り出されて副ストレージシステム200Bに送信される。
図2は、従来例に係るジャーナルボリュームにおけるジャーナルを管理する管理情報の一例を示す図である。
図1に示すジャーナル管理方法を実現するために、管理情報1000が管理されている。管理情報1000は、種別1000aと、JVOL番号(#)1000bと、アドレス1000cとのフィールドを有するレコードを格納する。
種別1000aは、アドレスの種別を格納する。この例では、JNLを格納すべき空き領域の先頭のアドレスを示す先頭アドレスと、送信済みのJNLが格納されている終端のアドレスを示す終端アドレスが格納される。JVOL#1000bは、JVOLのボリューム番号を格納する。アドレス1000cは、対応するアドレスを格納する。ボリューム番号とは、ストレージシステム200内で、ボリュームを一意に識別するための番号である。
ジャーナル管理方法においては、先頭アドレス、終端アドレスを用いて、副ストレージシステム200Bへ転送されていないJNLが格納されている領域が上書きされないように管理される。
図3は、従来例における第1の課題を説明する図である。なお、同図においては、ボリューム252、キャッシュ部223内の矩形は、JNLが格納される領域を示し、JNLが実際に格納されている領域については、実線で示し、実際に格納されていない領域については、破線で示している。
図3の状態1に示すように、JVOL252の先頭に格納させるJNLが発生すると、JNLは、JVOL252の対応するアドレスの領域に格納されずに、当該アドレスに割当てられたキャッシュ部223の領域に格納される。
JNLがキャッシュ部223に格納された後に、所定の時間が経過すると、状態2に示すように、キャッシュ部223のデータがJVOL252に格納される、すなわち、デステージされる。
ここで、デステージされたJNLが、既に副ストレージシステム200Bに転送されている可能性がある。副ストレージシステム200Bに転送されているJNLは、JVOL252に格納させる必要のないデータであり、このようなデータについて、デステージする処理を行うことにより、デステージ処理に関わるプロセッサ資源やHDD240資源等を無駄にしてしまうこととなり、利用効率を低減させてしまうという課題(第1の課題)がある。
図4は、従来例における第2の課題を説明する図である。
図4の状態1に示すように、新たなJNLが逐次発生すると、キャッシュ部223の全ての領域に対して、JVOL252の領域が割当てられるようになる。
この後、さらに新たなJNLが発生すると、状態2に示すように、キャッシュ部223の領域が解放されて、当該領域が、JVOL252の新たな領域に割当てられて、当該領域に対してJNLが格納される。この際に、キャッシュ部223の解放される領域に格納されているJNLがダーティデータ(JVOL252にデステージされていないデータ)である場合には、JNLをJVOL252にデステージした後に、当該領域が解放されて利用される一方、クリーンデータである場合には、当該領域が直ちに解放されて利用される。キャッシュ部223上のデータと、HDD240に格納されているデータが同一である場合に、当該キャッシュ部223上のデータが、「クリーンデータ」である。また、未だHDD240に書き込まれていない、キャッシュ部223上のデータが、「ダーティデータ」である。
この場合においては、キャッシュ部223の領域の解放や、JVOL252の新たな領域に対するキャッシュ部223の領域の割当て処理が行われることとなり、これら処理を行うプロセッサ資源への負荷があり、プロセッサ資源の利用効率を低減させてしまうという課題(第2の課題)がある。
図5は、課題を解決する第1の解決方法を説明する図である。図6は、課題を解決する第1の解決方法におけるキャッシュ部の状態を説明する図である。
第1の解決方法においては、図5に示すように、例えば、プロセッサ211が、JVOL252に格納されたJNLのうち、副ストレージシステム200Bに転送したJNL、すなわち転送済のJNLが格納されるJVOL252の領域に割当てられているキャッシュ部223の領域を解放する。ここで、転送済のJNLの格納されているJVOL252の領域は、管理情報1000の先頭アドレスと、終端アドレスとにより特定することができ、これらのデータを格納しているキャッシュ部223の領域は、JVOL252と、キャッシュ部223の領域との割当て関係に基づいて特定することができる。
この解決方法によると、図6の状態1に示すように、JVOL252の領域に、キャッシュ部223の領域が割当てられている場合において、転送済みとなったJNLを格納するJVOL252の領域に割当てられていたキャッシュ部223の領域が解放されて状態2に示すようになる。このように、転送済みのJNLがキャッシュ部223の領域に存在しないこととなるので、当該JNLについてのデステージが行われなくなり、プロセッサ資源やHDD資源に対する無駄な負荷を軽減することができる。
図7は、課題を解決する第2の解決方法を説明する図である。図8は、課題を解決する第2の解決方法におけるキャッシュ部の状態を説明する図である。
ここで、第2の解決方法は、回線障害等が発生しない場合は、JNLを作成して、JVOL252(又はキャッシュ部223)に格納するとともに、JVOL252(又はキャッシュ部223)に格納されたJNLを副ストレージシステム200Bに送信するので、JVOL252の全容量に対して十分に小さい容量のみにしか、JNLが滞留していないことに着目してなされたものである。
すなわち、第2の解決方法は、図7に示すように、JNLを格納させるJVOL252の領域として、次のアドレスの空き領域を逐次利用していくのではなく、転送済みの領域を利用するようにして、JVOL252において利用される領域を、比較的小さい容量とするようにしたものである。このように、比較的小さい容量とするので、これらJVOL252の領域に、キャッシュ部223の領域が割当てられている可能性が高い。
この解決方法によると、図8の状態1に示すように、JVOL252の領域に、キャッシュ部223の領域が割当てられている場合において、新たに生成されたJNLは、JVOL252の転送済みのJNLが格納される領域に対して格納されることとなり、当該領域に対してキャッシュ部223の領域を新たに割当てるための処理をすることなく、当該JNLをキャッシュ部223に格納させることができる。このように、JVOL252に対して、キャッシュ部223の領域を割当てる処理を行う必要がなくなるので、プロセッサ資源に対する負荷を軽減することができる。この解決方法によると、キャッシュ部223に転送済みのJNLが滞留してしまう可能性を低減することができるので、デステージの発生を低減でき、第1の課題についても解消できる。
図9は、実施例1の概要を説明する図である。図10は、実施例1におけるジャーナルボリュームの状態を説明する図である。
実施例1においては、図9に示すように、JNLを格納させるJVOL252の領域として、次のアドレスの空き領域を逐次利用していくのではなく、転送済みの領域を利用するようにして、JVOL252における利用される領域を、比較的小さい容量とするようにしている。このように、利用するJVOL252の領域を、転送済みのJNLが格納されていた比較的小さい容量となるようにできるので、JVOL252の領域に、キャッシュ部223の領域が割当てられている可能性が高く、キャッシュ部223の領域の割当てを実行しなくて済む可能性が高い。
ここで、例えば、図9に示す状態において、転送済みの領域にJNLを格納させるようにしていくと、例えば、回線障害が発生すると、JNLを格納させる領域を示す先頭アドレスが、終端アドレスに追いついてしまい、JNLを格納する領域がなくなってしまうこととなる。そこで、実施例1では、このような場合であってもJVOL252の領域を適切に使用できるようにしている。
本実施例では、図10の状態1に示すように、JVOL252において、JNCB2523を格納するJNCB領域2524については、固定の容量を割当て、JNL中のJNLデータ2524について、所定のサイズ(本例では、固定サイズ)の複数のブロックBKを用いて管理する。JNCB2523とは、JNLデータのJVOL252における格納アドレスなどを管理する制御データである。JNLデータとJNCB2523を合わせて単に「JNL」と呼ぶ。当該ブロックBKには、一つ以上のJNLデータ2524が格納できる。ここで、同図においては、JNCB2523を矩形で示し、その矩形中に当該JNCBに対応するシーケンス番号を示し、JNLデータ2524を円形で示し、その円形中に当該JNLデータ2524に対応するシーケンス番号を示している。また、ブロックBKについては、破線の矩形で示し、その矩形中にブロック番号(例えば、(1))を示す。なお、他の同様な図においても同様に記載することとする。
まず、状態1に示すように、発生したJNLデータ2524を、先頭のブロック(ブロック番号1)に、先頭から順次格納する。そして、先頭のブロックBKにJNLデータ2524を書き込む空きがなくなった場合には、状態2に示すように、空いているブロックBK(同図では、ブロック番号2のブロック)を探し、当該ブロックBKに対してJNLデータ2524を書き込む。
一方、ブロックBK内の全てのJNLデータ2524が副ストレージシステム200Bに転送された場合には、状態3に示すように、当該ブロックBK(ここでは、ブロック番号1のブロック)を空きブロックとする。
そして、以降にJNLデータ2524が発生した場合において、空ブロックを探す場合には、状態4に示すように、次のブロックBK(ブロック番号3のブロック)ではなく、使用されていたブロックBKであって、最近空ブロックになったブロック(ブロック番号1のブロック)をJNLデータ2524の格納先のブロックBKとして、JNLデータ2524を格納させる。ここで、最近空ブロックとなったブロックに対しては、キャッシュ部223の領域が割当てられている可能性が高いので、当該ブロックBKにJNLデータ2524を格納する際に、当該ブロックBKに対してキャッシュ部223の領域を割当てる処理が必要なくなる可能性が高い。したがって、キャッシュ部223の領域が割当てられている記憶領域に対して、JNLデータ2524が格納される傾向が高くなる。したがって、プロセッサへの負荷を低減し、プロセッサの利用効率を向上することができる。
次に、実施例1に係る計算機システムについて詳細に説明する。
図11は、実施例1に係る計算機システムの全体構成図である。
計算機システム10は、正ホスト計算機(正ホスト)100Aと、正ストレージシステム200Aと、副ストレージシステム200Bと、副ホスト計算機(副ホスト)100Bとを有する。なお、正ストレージシステム200Aは、或るボリュームに対して正側(コピー元)となるストレージシステムであり、別のボリュームに対しては、副側(コピー先)のストレージシステムとなることもある。同様に、副ストレージシステム200Bも、或るボリュームに対して副側のストレージシステムであるが、別のボリュームに対しては、正側のストレージシステムとなることもある。
正ホスト100Aと、正ストレージシステム200Aとは、ネットワークを介して接続されている。正ストレージシステム200Aと、副ストレージシステム200Bとは、ネットワークを介して接続されている。副ストレージシステム200Bと、副ホスト100Bとはネットワークを介して接続されている。副ホスト100Bは、必ずしも予め設置する必要はない。副ストレージシステム200Bを用いて業務処理を実行するまでに、設置すればよい。
正ホスト100Aは、メモリ101と、CPU(Central Processing Unit)102と、インターフェース(I/F)103とを有する。メモリ101には、業務処理を実行するソフトウェアであるアプリケーション(データベースアプリケーション等)104を格納する。アプリケーション104は、業務処理に利用するデータを、正ストレージシステム200Aに格納する。
副ストレージシステム200Bは、例えば、ディザスタリカバリのために、正ストレージシステム200Aに格納されているデータの複製を記憶するために使用される。
副ホスト100Bは、正ホスト100A、正ストレージシステム200Aに障害があった時に、副ストレージシステム200Bのデータを用いて、業務処理の実行を行うホストであり、メモリ101と、CPU(Central Processing Unit)102と、インターフェース(I/F)103とを有する。メモリ101には、業務処理を実行するソフトウェアであるアプリケーション104を格納する。アプリケーション104は、業務処理に利用するデータを、副ストレージシステム200Bに格納する。
図12は、実施例1に係るストレージシステムを中心とした計算機システムの一部の構成図である。
ストレージシステム200(200A、200B)は、1以上のマイクロプロセッサパッケージ(MPPK)210と、メモリパッケージ220と、バックエンドパッケージ(BEパッケージ)230と、フロントエンドパッケージ(FEパッケージ)260とを有する。MPPK210と、メモリパッケージ220と、BEパッケージ230と、FEパッケージ260とは、内部バス280を介して接続されている。
FEパッケージ260は、ポート261と、メモリ262とを有する。ポート261は、ネットワーク110を介して、ホスト100(100A、100B)と接続され、ホスト100との間の通信を仲介する。メモリ262は、FEパッケージ260の処理に必要な各種データを記憶する。たとえば、メモリ262は、正ホスト100Aから転送されたデータや、正ホスト100Aへ転送するデータを一時的に格納するために使用される。
メモリパッケージ220は、例えば、1以上のメモリデバイスにより構成され、制御情報を記憶する制御情報部221と、プログラムを記憶するプログラム部222と、データをキャッシュするキャッシュメモリの一例としてのキャッシュ部223とを有する。なお、キャッシュ部223の容量は、一般的には、ボリューム250の容量よりも小さくなっている。
MPPK210は、プロセッサ211と、ローカルメモリ212と、保守ポート213とを有する。プロセッサ211と、ローカルメモリ212と、保守ポート213とは、内部バス214を介して接続されている。ローカルメモリ212は、MPPK210において必要な各種データを記憶する。保守ポート213は、保守端末270との通信を仲介する。プロセッサ211は、各種処理を実行する。プロセッサ211は、メモリパッケージ220のプログラム部222に格納された各種プログラムを実行することにより各種処理を実行する。また、プロセッサ211は、メモリパッケージ220の制御情報部221に格納されている各種情報を用いて各種処理を実行する。
BEパッケージ230は、ポート231と、メモリ232とを有する。ポート231は、1以上の物理記憶デバイスの一例としてのHDD240と、バス283を介して接続されている。例えば、データを管理するボリューム250は、1以上のHDD240の記憶領域により構成される。なお、物理記憶デバイスとしては、HDDに限らず、例えば、SSD(Solid State Drive)やDVDなどであってもよい。また、1つ以上のHDD240をパリティグループという単位でまとめて、RAID(Redundant Arrays of Independent Disks)のような高信頼化技術を使用してもよい。
ストレージシステム200には、例えば、バス280を介して、ストレージシステム200を保守するための保守端末270が接続される。保守端末270は、CPU271と、メモリ272と、入出力部274と、保守ポート275とを有する。メモリ272は、保守用のプログラム(保守プログラム)273を記憶する。CPU271は、保守プログラム273を実行して保守処理を実行する。入出力部274は、例えば、マウス、キーボード、ディスプレイ等により構成され、保守を行うオペレータによる各種指示入力を受け付けるとともに、各種情報をディスプレイに表示させる。保守ポート275は、ストレージステム200との間の通信を仲介する。
図13は、実施例1に係るボリュームのコピー及びジャーナルボリュームを説明する図である。
正ストレージシステム200Aには、正ホスト100Aによる業務処理に係る業務データを格納する記憶領域としてPVOL(Primary Volume:正ボリューム)251が管理される。副ストレージシステム200Bには、PVOL251に格納された業務データの複製を格納するためのSVOL(Secondary Volume:副ボリューム)254が管理されている。ここで、PVOL251と、SVOL254とは、コピーペアと呼ばれる。
また、正ストレージシステム200Aには、PVOL251に対する書込みの履歴を示す1以上のJNL(Journal)を一時的に格納するためのバッファ領域(バッファ部)として利用されるJVOL(Journal Volume)252を記憶する。JNLは、JNCB(journal Control Block)2523と、JNLデータ2524とを含む。JNCB2523は、JNLデータのJVOL252における格納アドレス、PVOL251における書込みアドレス、当該JNLの発生順序、すなわち、PVOL251へのデータのライト順序を示すシーケンス番号等の制御情報を含む。JNLデータ2524は、正ホスト100AからPVOL251に書き込まれたデータ(ライトデータ)と同じデータである。
JVOL252は、JNBC2523を格納するJNBC領域2521と、JNLデータ2524を格納するJNLデータ領域2522とを有する。なお、JVOL252は、複数のボリュームにより構成されていてもよく、また、複数のPVOL251に対するJNLを格納するようにしてもよい。
副ストレージシステム200Bは、正ストレージシステム200AのJVOL252に格納されるJNLを、受信した際に一時的に格納するJVOL253を記憶する。JVOL253の構成は、JVOL252と同様である。なお、正ストレージシステム200AのJVOL252と、副ストレージシステム200BのJVOL253との数は、異なっていてもよい。
計算機システム10における非同期コピー処理の動作概要を説明する。
正ホスト100AからPVOL251に対するデータの書き込みが発生すると、正ストレージシステム200Aは、PVOL251に書き込まれたデータを格納するとともに、書き込みデータに関するJNLを生成し、JNLをJVOL252に格納する。
そして、以降において、正ストレージシステム200Aは、JVOL252からJNLを取得し、副ストレージシステム200Bに送信し、副ストレージシステム200Bでは、受信したJNLを、JVOL253に格納する。
次いで、副ストレージシステム200Bは、正ホスト100AからPVOL251に書き込んだ順番に従って、JVOL253のJNL中のJNLデータ2524を取得し、当該JNLデータ2524をSVOL254へ書き込むことにより、PVOL251の複製をSVOL254に生成する。PVOL251に書き込まれた順番は、シーケンス番号によって実現できる。
ここで、JVOL252の容量について説明する。例えば、正ストレージシステム200Aと、副ストレージシステム200Bとの間で回線障害が発生すると、JVOL252には、JNLが滞留し始め、その後、回線障害が解消されると、JVOL252のJNLが副ストレージシステム200BのJVOL253に送信されることとなる。したがって、JVOL252が生成されたJNLを蓄積するために十分な容量を有していれば、リモートコピーを停止することなく継続しておくことができる。そこで、JVOL252の容量は、回線障害に対してどれだけの時間耐えるようにするかにより設計されることとなる。一般的には、JVOL252の容量は、大容量となり、例えば、メモリパッケージ220のキャッシュ部223の容量よりもかなり大きい容量となる。例えば、キャッシュ部223の容量を1TBとした場合に、JVOL252の容量は、例えば、数十TBである。
図14は、実施例1に係るデータライト時の動作の概要を説明する図である。
ホスト100Aから正ストレージシステム200Aのボリューム250に対するライト要求が送信された場合には、正ストレージシステム200Aは、ホスト100Aからのライトデータをストレージシステム200Aのキャッシュ部223に格納する。その後、ストレージシステム200Aは、ライト要求と非同期で、キャッシュ部223のライトデータをボリューム250(PVOL251)へと格納する。なお、JNLについても、ホスト100Aから取得したデータと同様に、キャッシュ部223に格納され、その後、ボリューム(JVOL252)に格納される。
図15は、実施例1に係るメモリパッケージの詳細構成図である。
メモリパッケージ220の制御情報部221は、シーケンス番号情報2210と、JNLポインタ情報2211と、ブロック管理ビットマップ2212と、カレントブロック情報2213と、カレントアドレス情報2214と、ブロック内最大シーケンス番号情報2215とを記憶する。
プログラム部222は、ライトプログラム2221と、JNL作成プログラム2222と、JNLデータ格納アドレス決定プログラム2223と、ブロック解放プログラム(正)2224と、ブロック解放プログラム(副)2225と、JNLリードプログラム(正)2226と、JNLリードプログラム(副)2227と、リストアプログラム2228とを記憶する。なお、本実施例では、一つのストレージシステムが、正ストレージシステム200Aとして動作する場合と、副ストレージシステム200Bとして動作する場合とを考慮して、一つのストレージシステムに、いずれとしても動作できるようにするために必要なプログラムを記憶している。なお、いずれか一方の動作しかしない場合であれば、全てのプログラムを備える必要はない。
図16は、実施例1に係るシーケンス番号情報の一例を示す図である。
シーケンス番号情報2210は、正ホスト100Aからストレージシステム200がライトを受領した順番を示すシーケンス番号を記憶する。このシーケンス番号は、例えば、最近に発生したJNLのシーケンス番号である。図17から図19は、JVOL252の使用状況を管理するための情報である。
図17は、実施例1に係るブロック管理ビットマップの一例を示す図である。図18は、実施例1に係るカレントブロック情報の一例を示す図である。図19は、実施例1に係るカレントアドレス情報の一例を示す図である。図20は、実施例1に係るブロック管理ビットマップ、カレントブロック、カレントアドレスを説明する図である。
ブロック管理ビットマップ2212は、図17に示すように、JVOL252の各ブロックが使用中であるか、未使用であるかの値を記憶する。本実施例では、対応するブロックBKが使用中である場合には、ビット値“1”が設定され、未使用である場合には、ビット値“0”が設定される。ここで、本実施例においては、JVOL252は、所定の共通の固定サイズの複数のブロックに区分されて管理されている。各ブロックは、複数のJNLデータが格納可能なサイズであるとともに、キャッシュ部223の容量よりも十分に小さいサイズとなっている。より具体的には、例えば、キャッシュ部223の容量が1TBであるとすると、ブロックのサイズは、10MBとしてもよい。なお、JVOL252のサイズは、例えば、数十TBとしてもよい。
なお、各ブロックを共通の固定サイズとした例を示しているので、ブロック管理ビットマップ2212においては、各ブロックに対して、1ビットのフラグを管理しているが、例えば、各ブロックを異なるサイズとする場合には、各ブロックの開始アドレスと、終了アドレスと、フラグとを対応付けて管理するようにすればよい。
カレントブロック情報2213は、図18に示すように、カレントブロックのブロック番号を格納する。ここで、カレントブロックは、図20に示すように、現在JNL(本例では、JNLデータ2524)を格納する対象のブロックBK(同図では、ブロック番号1のブロック)である。
カレントアドレス情報2214は、図19に示すように、カレントブロックにおけるカレントアドレスを格納する。ここで、カレントアドレスは、図20に示すように、カレントブロック内における使用済み範囲、すなわち、JNLデータ2524を格納した範囲を示すアドレスである。
図21は、実施例1に係るブロック内最大シーケンス番号情報の一例を示す図である。図21に示す情報は、図24などに説明するブロックの解放処理で用いる情報である。
ブロック内最大シーケンス番号情報2215は、ブロック番号(#)2215aと、ブロック内最大シーケンス番号2215bとのフィールドを対応付けたレコードを格納する。ブロック#2215aは、JVOL252におけるブロックの番号(ブロック#)を格納する。ブロック内最大シーケンス番号2215bは、対応するブロック内に格納されているJNLの最大のシーケンス番号(ブロック内最大シーケンス番号)を格納する。図21に示すブロック内最大シーケンス番号情報2215においては、例えば、ブロック#“3”のブロックに格納されているJNL(JNLデータ2524)の最大のシーケンス番号は、“350”であることがわかる。
次に、実施例1に係る計算機システムにおける動作について説明する。
図22は、実施例1に係るライト時処理のフローチャートである。
ライトプログラム2221は、ホスト100AからPVOL251へのライト要求を受領すると(ステップS101)、ライト対象のデータ(ライトデータ)をボリューム250(例えば、PVOL251)にライトする(ステップS102)。次いで、ライトプログラム2221は、ジャーナル作成プログラムをコールし(ステップS103)、ジャーナル(JNL)作成プログラム2222の完了を待つ(ステップS104)。
ジャーナル作成プログラム2222は、コールされると、作成するJNLのシーケンス番号を確保し(ステップS201)、JNLデータ格納アドレス決定プログラム2223をコールする(ステップS202)。これにより、JNLデータ格納アドレス決定処理(図23参照)が実行され、JNLデータを格納するJVOLのアドレスが決定され、ジャーナル作成プログラム2222に通知される。
次いで、ジャーナル作成プログラム2222は、JNLデータ2524をJVOL252の通知されたアドレスに対して格納させるデータとして、キャッシュ部223に格納させる(ステップS203)。
次いで、ジャーナル作成プログラム2222は、JNCB2523を格納するJVOL252のアドレスを決定し(ステップS204)、JNCB2523をJVOL252の決定したアドレスに対して格納させるデータとして、キャッシュ部223に格納させる(ステップS205)。ここで、JNBC2523を格納するアドレスは、既に格納しているJNBC2523の次のアドレス、又は、JNCB領域2521の最後までJNBC2523を格納している場合には、JNCB領域2521の先頭のアドレスに決定する。
次いで、ジャーナル作成プログラム2222は、処理の完了をライトプログラム2221に通知し(ステップS206)、通知を受けたライトプログラム2221は、ホスト100Aにライトの完了報告を通知し(ステップS105)、処理を終了する。
図23は、実施例1に係るJNLデータ格納アドレス決定処理のフローチャートである。
JNLデータ格納アドレス決定プログラム2223は、カレントブロックのブロック番号を、カレントブロック情報2213から取得し(ステップS301)、当該カレントブロックに新たなJNLデータ2524が格納可能であるか否か、すなわち、カレントブロックに空きがあるか否かを判定する(ステップS302)。
この結果、カレントブロックに空きがある場合(ステップS302でYes)には、JNLデータ格納アドレス決定プログラム2223は、ステップS305に処理を進める。一方、カレントブロックに空きがない場合(ステップS302でNo)には、JNLデータ格納アドレス決定プログラム2223は、空ブロックを探す(ステップS303)。本実施例では、JNLデータ格納アドレス決定プログラム2223は、ブロック管理ビットマップ2212の先頭からビット値が“0”のブロックを探す。
次いで、JNLデータ格納アドレス決定プログラム2223は、特定したブロックを、JNLデータ2524を格納するブロックとして割り当て、処理をステップS305に進める(ステップS304)。すなわち、JNLデータ格納アドレス決定プログラム2223は、特定したブロックに対するブロック管理ビットマップ2212のビット値を“1”に変更し、カレントブロック情報2213のブロック番号を特定したブロックのブロック番号に変更する。
ステップS305では、JNLデータ格納アドレス決定プログラム2223は、対応するブロックにおけるJNLデータ2524を格納するアドレスを決定する。次いで、JNLデータ格納アドレス決定プログラム2223は、カレントアドレス情報2214のカレントアドレスを決定したアドレスに更新し(ステップS306)、ブロック内最大シーケンス番号情報2215の当該ブロックに対する最大シーケンス番号を当該JNLデータ2524のシーケンス番号に更新し(ステップS307)、処理を終了する。
上記JNLデータ格納アドレス決定処理によると、JVOL252の先頭に近く、且つ空の有るブロックであり、キャッシュ部223の領域が割り当てられている可能性の高い領域に対して、優先的にJNLデータ2524を格納させるようにすることができる。これにより、JNLデータ2524が格納される領域を比較的狭い範囲に集約することができ、JNLデータを格納する際に、新たにキャッシュ部の領域を割当てる処理の発生を低減することができる。なお、JNLデータを格納するブロックの割当方法はこれに限られず、例えば、最も最近に利用されていた空きブロックを、JNLデータ2524を格納するブロックとして割り当てるようにしてもよく、このようにすると、当該空きブロックの領域に対応する領域がキャッシュ部223で管理されている可能性がより高く、当該空きブロックへデータを格納する際に、当該領域へキャッシュ部の領域を割当てる処理を実行することなく、キャッシュ部223の領域を利用できる可能性が高い。なお、最も最近に利用された空ブロックを取得する方法としては、当該空きブロックをスタックにより管理するようにすればよい。
図24は、実施例1に係るブロック解放処理のフローチャートである。
ブロック解放処理は、正ストレージシステム200Aにおいて、例えば、ブロック解放プログラム(正)2224により、定期的に実行される、又は、図25のJNLリード処理において呼び出されて実行される。
ブロック解放プログラム(正)2224は、転送済みのJNLのシーケンス番号(転送済みシーケンス番号)を参照する(ステップS401)。なお、転送済みのJNLのシーケンス番号は、例えば、正ストレージシステム200Aが制御情報部221に記憶している。
次いで、ブロック解放プログラム(正)2224は、ブロック管理ビットマップ2212がON(ビット値が“1”)であり、且つカレントブロックではないブロックを特定する(ステップS402)。
次いで、ブロック解放プログラム(正)2224は、ブロック内最大シーケンス番号情報2215から特定した各ブロックのブロック内最大シーケンス番号を取得し(ステップS403)、各ブロックについて、取得したブロック内最大シーケンス番号が、参照した転送済みシーケンス番号より小さいか否かを判定する(ステップS404)。
この結果、取得したブロック内最大シーケンス番号が、参照した転送済みシーケンス番号より小さい場合(ステップS404でYes)には、当該ブロックの全てのJNLを副ストレージシステム200Bに転送したことを意味しているので、ブロック解放プログラム(正)2224は、ブロック管理ビットマップ2212の当該ブロックに対応するビット値をOFF(“0”)にして、当該ブロックを空ブロックとする(ステップS405)。一方、取得したブロック内最大シーケンス番号が、参照した転送済みシーケンス番号より小さくない場合(ステップS404でNo)には、副ストレージシステム200Bに、当該ブロックのJNLのすべてを転送していないことを示しているので、そのまま処理を終了する。
ブロック解放処理によると、全てのJNLデータが送信されたブロックについて、空きブロックにすることができ、以降のJNLデータの格納に利用できるようになる。
図25は、実施例1に係るJNLリード処理のフローチャートである。
副ストレージシステム200BのJNLリードプログラム(副)2227が、正ストレージシステム200Aに対して、JNLリードコマンドを発行し(ステップS601)、正ストレージシステム200Aからの応答を待つ(ステップS602)。JNLリードコマンドには、副ストレージシステム200Bに転送されたJNLのシーケンス番号(転送済みシーケンス番号)が含まれている。
正ストレージシステム200Aでは、JNLリードプログラム(正)2226が、JNLリードコマンドを受け取ると、未転送のJNCB2523をリードする(ステップS501)。ここで、未転送のJNCB2523は、正ストレージシステム200A自身が管理している情報に基づいて特定される。本実施例では、JNCB2523がシーケンス番号順にならんでいるので、ポインタを用いて未転送のJNCB2523を管理することにより、容易に未転送のJNCB2523を特定することができる。
次いで、JNLリードプログラム(正)2226が、リードしたJNCB2523から対応するJNLデータ2524のアドレスを取得することにより、JNLデータ2524の格納位置を特定し(ステップS502)、対応する格納位置のJNLデータをリードする(ステップS503)。ここで、対応するJNLデータ2524がキャッシュ部223に格納されている場合は、JNLリードプログラム(正)2226が、キャッシュ部223からリードし、キャッシュ部223に格納されていない場合には、JVOL252からリードする。
次いで、JNLリードプログラム(正)2226が、リードしたJNL(JNCB2523及びJNLデータ2524)を、副ストレージシステム200Bに転送する(ステップS504)。次いで、JNLリードプログラム(正)2226は、転送済みシーケンス番号を制御情報部221に記録し(ステップS505)、ブロック解放プログラム(正)2224をコールし(ステップS506)、処理を終了する。これにより、ブロック解放処理(図24)が実行されることとなる。
一方、副ストレージシステム200Bでは、JNLを正ストレージシステム200Aから受領すると(ステップS603)、JNLリードプログラム(副)2227が、JNLデータ格納アドレス決定プログラム2223をコールする(ステップS604)。副ストレージシステム200Bでは、図23と同様なJNLデータ格納アドレス決定処理が実行され、JNLデータ2524を格納するJVOL253のブロック及びアドレスが決定される。
次いで、JNLリードプログラム(副)2227が、JVOL253の決定されたブロックのアドレスに格納するデータとして、JNLデータ2524をキャッシュ部223に格納する(ステップS605)。
次いで、JNLリードプログラム(副)2227は、JNCB2523を格納するJVOL253のアドレスを決定し(ステップS606)、JNCB2523をJVOL253の決定したアドレスに対して格納させるデータとして、キャッシュ部223に格納させ(ステップS607)、処理を終了する。ここで、JNBC2523を格納するアドレスは、既に格納しているJNBC2523の次のアドレス、又は、JNCB領域2521の最後までJNBC2523を格納している場合には、JNCB領域2521の先頭のアドレスに決定する。
上記JNLリード処理によると、JVOL253の先頭に近く、且つ空の有るブロックであり、キャッシュ部223の領域が割り当てられている可能性の高い領域に対して優先的にJNLデータ2524を格納させるようにすることができる。これにより、JNLデータ2524が格納される領域を比較的狭い範囲に集約することができ、JNLデータ2524を格納する際に、新たにキャッシュを割当てる処理の発生を低減することができる。なお、ブロックの割当方法はこれに限られず、例えば、最も最近に利用されていた空きブロックを、JNLデータを格納するブロックとして割り当てるようにしてもよく、このようにすると、当該空きブロックの領域に対応する領域がキャッシュ部223で管理されている可能性がより高く、当該空きブロックへデータを格納する際に、当該領域へキャッシュ部223の領域を割当てる処理を実行することなく、キャッシュ部223の領域を利用できる可能性が高い。
図26は、実施例1に係るリストア処理のフローチャートである。
リストア処理は、JNLに基づいて、SVOL254に書込みを行う処理であり、副ストレージシステム200Bにおいて、例えば、定期的に実行される。
リストアプログラム2228は、JVOL253に格納されたJNCBをチェックし(ステップS701)、抜けがなく副ストレージシステム200Bに到着しているJNLの範囲を特定する(ステップS702)。ここで、到着していないJNLのJNCB2523は、全て0であるので、到着しているJNLの範囲を適切に特定することができる。
次いで、リストアプログラム2228は、特定した範囲のJNLの最大シーケンス番号を特定し(ステップS703)、転送済みシーケンス番号として制御情報部221に記録する(ステップS704)。
次いで、リストアプログラム2228は、転送済みシーケンス番号までのJNLをJVOL253から取得して、シーケンス番号の順番にSVOL254に書き込む、すなわち、リストアする(ステップS705)。JVOL253からの取得において、対応するJNLデータ2524がキャッシュ部223に格納されている場合は、リストアプログラム2228が、キャッシュ部223からリードし、キャッシュ部223に格納されていない場合には、JVOL253からリードする。さらに、SVOL254への書込みにおいて、リストアプログラム2228は、SVOL254の書込みアドレスのデータとして、JNLデータ2524をキャッシュ部223に格納する。
次いで、リストアプログラム2228は、リストアした最大のシーケンス番号をリストア済みシーケンス番号として制御情報部221に記録し(ステップS706)、ブロック解放プログラム(副)2225をコールする(ステップS707)。ブロック解放プログラム(副)2225は、ブロック解放処理を実行する。
すなわち、ブロック解放プログラム(副)2225は、リストア済みシーケンス番号を参照し(ステップS801)、ブロック管理ビットマップ2212がON(ビット値が“1”)であり、且つカレントブロックではないブロックを特定する(ステップS802)。
次いで、ブロック解放プログラム(副)2225は、ブロック内最大シーケンス番号情報2215から、特定した各ブロックのブロック内最大シーケンス番号を取得し(ステップS803)、各ブロックについて、取得したブロック内最大シーケンス番号が、参照したリストア済みシーケンス番号より小さいか否かを判定する(ステップS804)。
この結果、取得したブロック内最大シーケンス番号が、参照したリストア済みシーケンス番号より小さい場合(ステップS804でYes)には、当該ブロックの全てのJNLをSVOL254にリストアしたことを意味しているので、ブロック解放プログラム(副)2225は、ブロック管理ビットマップ2212の当該ブロックに対応するビット値をOFF(“0”)にして、当該ブロックを空ブロックとし(ステップS805)、処理を終了し(ステップS806)、その旨をリストアプログラム2228に通知する。一方、取得したブロック内最大シーケンス番号が、参照したリストア済みシーケンス番号より小さくない場合(ステップS804でNo)には、SVOL254に当該ブロックのJNLのすべてをリストアしていないことを示しているので、ブロック解放プログラム(副)2225は、そのまま処理を終了し(ステップS806)、その旨をリストアプログラム2228に通知する。なお、リストアプログラム2228は、ブロック解放プログラム(副)2225から処理を終了した旨の通知を受け取ると、リストア処理を終了する。
このブロック解放処理によると、全てのJNLデータによるリストアが行われたブロックについて、空きブロックにすることができ、以降のJNLデータの格納に利用できるようになる。
次に、実施例2に係る計算機システムについて説明する。
実施例2に係る計算機システムは、実施例1に係る計算機システムでは、JNLのJNLデータ2524について、ブロックによる管理をするようにしていたものを、JNLのJNCB2523についても同様なブロックによる管理をするようにしたものである。なお、実施例1に係る計算機システムと同様な箇所には、同一の符号を付し、異なる点を中心に説明することとする。
図27は、実施例2に係る制御情報部の詳細図である。図28は、実施例2に係るプログラム部の詳細図である。
実施例2に係る制御情報部221は、実施例1に係る制御情報部221に対して、さらに、JNCBブロック管理情報2216と、カレントライトブロック情報2217と、カレントリードブロック情報2218と、カレントライトアドレス情報2219と、カレントリードアドレス情報221Aとを格納する。
また、実施例2に係るプログラム部222は、実施例1に係るプログラム部222に対して、さらに、JNCB格納アドレス決定プログラム2229を格納する。
図29は、実施例2に係るJNCBブロック管理情報の一例を示す図である。図30は、実施例2に係るJNCBカレントライトブロック情報の一例を示す図である。図31は、実施例2に係るJNCBカレントリードブロック情報の一例を示す図である。図32は、実施例2に係るJNCBカレントライトアドレス情報の一例を示す図である。図33は、実施例2に係るJNCBカレントリードアドレス情報の一例を示す図である。図34は、実施例2に係るブロック及びアドレスを説明する図である。
JNCBブロック管理情報2216は、JNCB2523が格納されるブロックの順番を管理する情報である。具体的には、JNCB2523が格納されるブロックのブロック番号と、次の順番のブロック、すなわち、後続のJNCB2523が格納されているブロックのブロック番号とを対応付けて管理している。このJNCBブロック管理情報2216によると、図34に示すように、JNCB2523が格納される次の順番のブロックを特定することができる。
JNCBカレントライトブロック情報2217は、図30に示すように、カレントライトブロックのブロック番号を格納する。カレントライトブロックは、図34に示すように、新規のJNCB2523を格納する対象となるブロックである。
JNCBカレントリードブロック情報2218は、図31に示すように、カレントリードブロックのブロック番号を格納する。カレントリードブロックは、図34に示すように、次に転送されるJNCB2523を格納するブロックである。
JNCBカレントライトアドレス情報2219は、図32に示すように、カレントライトブロックにおけるカレントライトアドレスを格納する。カレントライトアドレスは、図34に示すように、新規のJNCB2523を格納するブロック内のアドレスである。
JNCBカレントリードアドレス情報221Aは、図33に示すように、カレントリードブロックにおけるカレントリードアドレスを格納する。カレントリードアドレスは、図34に示すように、次に転送するJNCB2523を格納するブロック内のアドレスである。
次に、実施例2に係る計算機システムにおける動作について説明する。実施例2に係る計算機システムの動作は、実施例1に係る計算機システムの動作と、正ストレージシステム200AにおけるJNCBの格納アドレスを決定する処理と、副ストレージシステム200BにおけるJNCBの格納アドレスを決定する処理と、正ストレージシステム200AのJVOL252からJNCBをリードする処理と、副ストレージシステム200BのJVOL253からJNCBをリードする処理とが異なる。なお、ブロック解放処理については、JNCB2523が格納されたブロックについても、JNLデータ2524が格納されたブロックと同様な処理により実行可能である。
図35は、実施例2に係るJNCB格納アドレス決定処理のフローチャートである。
JNCB格納アドレス決定処理は、正ストレージシステム200A及び副ストレージシステム200Bのそれぞれで実行される。正ストレージシステム200Aでは、ジャーナル作成プログラム2222のS204でコールされる。
JNCB格納アドレス決定プログラム2229は、カレントライトブロックのブロック番号を、カレントライトブロック情報2217から取得し(ステップS901)、カレントライトアドレスを、カレントライトアドレス情報2219から取得し(ステップS902)、当該カレントライトブロックにJNCB2523が格納可能であるか否か、すなわち、カレントライトブロックに空きがあるか否かを判定する(ステップS903)。
この結果、カレントライトブロックに空きがある場合(ステップS903でYes)には、JNCB格納アドレス決定プログラム2229は、ステップS906に処理を進める。一方、カレントライトブロックに空きがない場合(ステップS903でNo)には、JNCB格納アドレス決定プログラム2229は、空ブロックを探す(ステップS904)。本実施例では、JNCB格納アドレス決定プログラム2229は、ブロック管理ビットマップ2212の先頭からビット値が“0”のブロックを探す。
次いで、JNCB格納アドレス決定プログラム2229は、特定したブロックを、JNCB2523を格納するブロックとして割り当て、処理をステップS906に進める(ステップS905)。すなわち、JNCB格納アドレス決定プログラム2229は、特定したブロックに対するブロック管理ビットマップ2212のビット値を“1”に変更し、カレントライトブロック情報2217のブロック番号を特定したブロックのブロック番号に変更する。
ステップS906では、JNCB格納アドレス決定プログラム2229は、対応するブロックにおけるJNCB2523を格納するアドレスを決定する。次いで、JNCB格納アドレス決定プログラム2229は、カレントライトアドレス情報2219のカレントライトアドレスを決定したアドレスに更新し(ステップS907)、ブロック内最大シーケンス番号情報2215の当該ブロックに対する最大シーケンス番号を当該JNCB2523のシーケンス番号に更新し(ステップS908)、処理を終了する。
上記JNCB格納アドレス決定処理によると、JVOL252の先頭に近く、且つ空の有るブロックであり、キャッシュ部223の領域が割り当てられている可能性の高い領域に対して優先的にJNCB2523を格納させるようにすることができる。これにより、JNCBが格納される領域を比較的狭い範囲に集約することができ、JNCB2523を格納する際に、新たにキャッシュを割当てる処理の発生を低減することができる。なお、ブロックの割当方法はこれに限られず、例えば、最も最近に利用されていた空きブロックを、JNCB2523を格納するブロックとして割り当てるようにしてもよく、このようにすると、当該空きブロックの領域に対応する領域がキャッシュ部223で管理されている可能性がより高く、当該空きブロックへデータを格納する際に、当該領域へキャッシュ部223の領域を割当てる処理を実行することなく、キャッシュ部223の領域を利用できる可能性が高い。なお、最近に利用された空ブロックを取得する方法としては、当該空きブロックをスタックにより管理するようにすればよい。
図36は、実施例2に係るJNLリード処理のフローチャートである。なお、実施例1に係るJNLリード処理(図25)と同様な部分には、同一の符号を付し、ここでは、異なる点について説明する。
正ストレージシステム200Aでは、JNLリードプログラム(正)2226が、JNLリードコマンドを受け取ると、カレントリードブロック情報2218からカレントリードブロック番号を取得し(ステップS1001)、カレントリードアドレス情報221Aからカレントリードアドレスを取得する(ステップS1002)。次いで、JNLリードプログラム(正)2226は、カレントリードブロックと、カレントライトブロックとが同じであるか否かを判定する(ステップS1003)。
この結果、カレントリードブロックと、カレントライトブロックとが同じでない場合(ステップS1003でNo)には、JNLリードプログラム(正)2226が、カレントリードアドレスからカレントリードブロックの終端までのJNCB2523をリードし(ステップS1004)、JNCBブロック管理情報2216に基づいて、次のブロックを特定し、当該ブロックをカレントリードブロックとし(ステップS1005)、カレントリードアドレス情報221Aのカレントリードアドレスを0に設定し(ステップS1006)、処理をステップS1009に進める。これにより、以降において、JNLリード処理が実行されると、後続のブロックからJNCB2523が適切に読み出されることとなる。
一方、カレントリードブロックと、カレントライトブロックとが同じである場合(ステップS1003でYes)には、JNLリードプログラム(正)2226が、カレントリードアドレスからカレントライトアドレスまでのJNCB2523をリードし(ステップS1007)、カレントリードアドレスをリードしたアドレス(カレントライトアドレスと同じアドレス)に設定し(ステップS1008)、処理をステップS1009に進める。
ステップS1009では、JNLリードプログラム(正)2226が、リードしたJNCB2523からJNLデータ2524の格納位置を特定する(ステップS1009)。この後、JNLリードプログラム(正)2226は、ステップS503以降の処理を実行する。
一方、JNLリードプログラム(副)2227は、JVOL253の決定されたブロックのアドレスに格納するデータとして、JNLデータ2524をキャッシュ部223に格納した後(ステップS605)、JNCB格納アドレス決定プログラム2229をコールする(ステップS1101)。この後、JNLリードプログラム(副)2227は、JNCB格納アドレス決定プログラム2229から、JNCB2523を格納するJVOL253のブロック及びアドレスを取得することとなる。
図37は、実施例2に係るリストア処理のフローチャートである。なお、実施例1に係るリストア処理(図26)と同様な部分には、同一の符号を付し、ここでは、異なる点について説明する。
リストア処理は、副ストレージシステム200Bにおいて、例えば、定期的に実行される。
リストアプログラム2228は、カレントリードブロック情報2218からカレントリードブロック番号を取得し(ステップS1201)、カレントリードアドレス情報221Aからカレントリードアドレスを取得する(ステップS1202)。次いで、リストアプログラム2228は、カレントリードブロックのブロック終端までのJNCB2523をリードし(ステップS1203)、抜けがなく副ストレージシステム200Bに到着しているJNLの範囲を特定する(ステップS1204)。ここで、到着していないJNLのJNCB2523は、全て0であるので、到着しているJNL2523の範囲を適切に特定することができる。
次いで、リストアプログラム2228は、特定した範囲の終端は、カレントリードブロックの終端であるか否かを判定する(ステップS1205)。この結果、特定した範囲の終端がカレントリードブロックの終端である場合(ステップS1205でYes)には、リストアプログラム2228は、カレントリードアドレス情報221Aのカレントリードアドレスを0に設定し、JNCBブロック管理情報2216に基づいて、次のブロックを特定し、当該ブロックをカレントリードブロックに設定し(ステップS1206)、処理をステップS703に進める。これにより、以降において、リストア処理が実行されると、JNCB2523が格納されている後続のブロックからJNCB2523が適切に読み出されることとなる。
一方、特定した範囲の終端がカレントリードブロックの終端でない場合(ステップS1205でNo)には、リストアプログラム2228は、カレントリードアドレス情報221Aのカレントリードアドレスを、特定した範囲の終端のアドレスに設定し(ステップS1207)、処理をステップS703に進める。
上記実施例2によると、JVOL253の先頭に近く、且つ空の有るブロックであり、キャッシュ部223の領域が割り当てられている可能性の高い領域に対して優先的にJNCB2523を格納させるようにすることができる。これにより、JNCB2523が格納される領域を比較的狭い範囲に集約することができ、JNCB2523を格納する際に、新たにキャッシュ部223の領域を割当てる処理の発生を低減することができる。
次に、実施例3に係る計算機システムについて説明する。
実施例3に係る計算機システムは、実施例2に係る計算機システムでは、JVOL252、253を、共通の固定長の複数のブロックで管理するようにしていたものを、サイズの異なる2種類のブロックで管理することにより、JVOL252、253におけるブロック数を低減して、ブロック管理に必要な情報を低減するようにしたものである。
図38は、実施例3の概要を説明する図である。
本実施例においては、JVOL252(253)を、複数(同図では、4つ)の小サイズ(小容量)のブロック(小サイズブロック)SBKと、1つの大サイズ(大容量)のブロック(大サイズブロック)LBKと、に分割して管理している。これにより、上記した実施例1、2の効果に加えて、ブロックを管理するための制御情報量、例えば、ブロック管理ビットマップ2212の情報や、ブロック内最大シーケンス番号情報2215等の情報量を低減することができる。
ここで、ホスト100Aからのライト量が一時的に急増し、JVOL252の小サイズブロックが解放されるペースを超える可能性がある。このような場合には、大サイズブロックLBKにJNLが格納される。ライト量の減少後は、実施例1で述べたように小サイズブロックを使用することでプロセッサ負荷を低減できる。しかし、実施例1に説明した論理では、大サイズブロックLBKの全領域を使い切るまで、JNLが大サイズブロックLBKに格納されることとなる。
このように、大サイズブロックLBKの全領域を使い切るまで、JNLを大サイズブロックに格納する場合には、転送済みのJNLをデステージする処理や、キャッシュ部223の領域の割当て、キャッシュ部223の領域の解放等の処理が行われることとなり、プロセッサへの負荷を増加させてしまう。
そこで、実施例3においては、大サイズブロックLBKの全領域を使い切る前であっても、小サイズブロックSBKにJNLを格納できるように制御している。
図39は、実施例3に係る制御情報部の詳細図である。
実施例3に係る制御情報部221は、実施例2に係る制御情報部221に対して、さらに、カレントブロックサイズ情報221Bを格納する。カレントブロックサイズ情報221Bには、カレントブロックのサイズが大サイズであるか、または小サイズであるかを示す情報が格納される。
図40は、実施例3に係るJNLデータ格納アドレス決定処理のフローチャートである。なお、実施例1に係るJNLデータ格納アドレス決定処理(図23)と同様な部分には、同一の符号を付し、ここでは、異なる点について説明する。
ステップS302で、カレントブロックに空きがあると判定された場合(ステップS302でYes)には、JNLデータ格納アドレス決定プログラム2223は、カレントブロックは、大サイズであり、且つ所定の復帰条件を満たすか否かを判定する(ステップS308)。ここで、所定の復帰条件とは、現在のJNLデータ2524の滞留量が継続したとして、小サイズのブロックのみで動作可能であるか否かを判断するための条件であり、例えば、「小サイズブロックに空きがある」に加え、「現在のJVOL252に滞留している平均のJNLデータ量<小サイズブロックの合計空き容量」である条件としてもよい。また、以降におけるJNLデータ2524の発生の変動を考慮して、「現在のJVOL252に滞留している平均のJNLデータ量」に変えて、「現在のJVOL252に滞留している平均のJNLデータ量+A」(Aは、所定のデータ量)としてもよい。
この結果、カレントブロックは大サイズであり、且つ所定の復帰条件を満たす場合(ステップS308でYes)には、JNLデータ格納アドレス決定プログラム2223は、処理をステップS303に進めて以降の処理を行う。これにより、大サイズブロックが空いている状態から、小サイズブロックにJNLデータ2524を格納するようにすることができ、転送済みのJNLデータをデステージする処理や、キャッシュ部223の領域の割当て、キャッシュ部223の領域の解放等の処理が行われることを適切に低減することができる。なお、カレントブロックが小サイズである、又は、所定の復帰条件を満たさない場合(ステップS308でNo)には、JNLデータ格納アドレス決定プログラム2223は、処理をステップS305に進める。
ここでは、JNLデータ格納アドレス決定処理を説明したが、JNCB2523についての格納アドレスを決定する処理(JNCB格納アドレス決定処理)についても、実施例2のJNCB格納アドレス決定処理(図35)において、上記ステップS308と同様なステップを追加することにより実現できる。
図41は、実施例3に係る変形例を説明する図である。
上記した例では、JVOL252(253)において、大サイズブロックLBKを1つとしていた。この場合には、状態1に示すように、大サイズブロックLBKに空き領域LSがあるときに、小サイズブロックSBKにJNLデータ2524を格納するようにすると、大サイズブロックLBKは、格納している全てのJNLデータ2524を転送する前においては、使用中のブロックとして管理されることとなるので、JNLデータ2524の発生が急増した場合にあっても空き領域LSが使用されないという状況が発生する。
これに対して、例えば、状態2に示すように、JVOL252に、複数の大サイズブロックLBKを備えるようにすることが考えられる。例えば、大サイズブロックLBKのサイズは、共通のサイズであってもよい。このように、大サイズブロックLBKを複数備えると、他の大サイズブロックLBKを使用することができるので、無駄な空き領域の容量を低減することができる。
次に、実施例4に係る計算機システムについて説明する。
実施例4に係る計算機システムは、上記した実施例において、容量仮想化機能(Thin Provisioning)を用いて、JVOL252、253を仮想ボリューム(仮想VOL)により構成するようにしたものである。
図42は、実施例4に係る仮想ボリュームを説明する図である。
ストレージシステム200(200A、200B)において、複数のHDD240の記憶領域から構成された容量プール(プール)290が設けられる。プール290には、HDD240の物理的な記憶領域から構成されるプールボリューム(プールVOL)291が含まれる。プールVOL291には、仮想VOL293の割当単位となる物理領域であるページが含まれる。ページの容量は、例えば、数KB〜数十MBである。
仮想VOL293は、所定の領域に対して、データの書き込みがあると、その領域に対して、プールVOL291のページ292が割当てられる。本実施例においては、JVOL252、253を、仮想VOL293として構成している。したがって、JVOL252、253の使用されていない領域については、ページ292が割り当てられていないので、HDD240の記憶領域を有効に利用することができる。特に、本実施例では、従来のように、JVOL252、253をラップアラウンド方式で使用しないので、ページの割当量を低減することができる。
図43は、実施例4に係るプールテーブルの一例を示す図である。
プールテーブル224は、プール290における各ページ292を管理するテーブルであり、例えば、メモリパッケージ220の制御情報部221に格納される。
プールテーブル224は、ページ番号224aと、開始アドレス224bと、終了アドレス224cと、状態224dと、割当先224eとのフィールドを対応付けたレコードを管理する。ページ番号224aには、プール290におけるページ292を識別するページ番号を格納する。開始アドレス224bには、対応するページの開始アドレスが格納される。終了アドレス224cには、対応するページ292の終了アドレスが格納される。状態224dには、対応するページ292が仮想ボリューム293に割当て済みか、未割当てかを示す情報が格納される。割当先224eには、対応するページ292が割当てられた仮想ボリューム番号が格納される。プールテーブル224の一番上のレコードによると、ページ番号が“1”のページは、開始アドレスが“0”であり、終了アドレスが“99”であり、仮想ボリューム1に割当て済みであることがわかる。
図44は、実施例4に係る仮想ボリュームテーブルの一例を示す図である。
仮想ボリュームテーブル225は、仮想ボリューム293に対するページ292の割当てを管理するテーブルであり、例えば、メモリパッケージ220の制御情報部221に格納される。
仮想ボリュームテーブル225は、仮想ボリューム番号225aと、アドレス225bと、ページ割当て状態225cと、ページ番号225dとのフィールドを含むレコードを管理する。仮想ボリューム番号225aには、仮想ボリューム293を識別する仮想ボリューム番号が格納される。アドレス225bには、対応する仮想ボリューム293のアドレスの範囲が格納される。ページ割当て状態225cには、対応するアドレスの範囲の領域に対してページ292が割当て済みか否かを示す情報が格納される。ページ番号225dには、対応する領域に割当てられたページ番号が格納される。仮想ボリュームテーブル225の一番上のレコードによると、仮想ボリューム番号が“1”の仮想ボリュームの0〜99のアドレスの領域には、ページ番号“2”のページ292が割当てられていることがわかる。
図45から図48を用いて、ブロック解放により、未使用ブロックのみに対応するページを解放する処理について説明する。図45は、実施例4に係るブロック解放処理のフローチャートである。図24に示したブロック解放プログラム(正)2224のステップS405の直後に、ページ解放プログラムをコールするステップS406が追加されている。
図46は、図45に示したブロック解放プログラム(正)2224のステップS406からコールされるページ解放プログラムの一例を示す図である。図47は、実施例4に係るブロックとページの対応関係の一例を示す図である。図48は、ページ解放プログラムの別の一例を示す図である。
図46の処理について説明する。ページ解放プログラムは、ブロックBKに対応する1以上のページ292を特定する(ステップS1501)。例えば、図47の例では、ブロック番号が1のブロックに対応するページは、ページAである。また、ブロック番号が2のブロックに対応するページは、ページA,ページBである。次いで、ページ解放プログラムは、未処理のページを処理対象ページとする(ステップS1502)。例えば、図47の例で、処理対象ブロックのブロック番号が2の場合、最初にページAが処理対象とされる。ページAに対してステップS1503からS1505を実行した後、ページBに対して、ステップS1503からS1505を実行する。
次いで、ページ解放プログラムは、ページに対応する1以上のブロックを特定する(ステップS1503)。例えば、図47に示すページAが処理対象である場合には、ブロック1、ブロック2が特定される。
次いで、ページ解放プログラムは、ブロック管理ビットマップ2212を参照し、特定したすべてのブロックが空きであるか否かを判定する(ステップS1504)。この結果、全てのブロックが空きである場合(ステップS1504でYes)には、ページ解放プログラムは、当該ページを解放し(ステップS1505)、処理をステップS1506に進める。すなわち、ページ解放プログラムは、プールテーブル224、仮想ボリュームテーブル225から対応するページ292の割当て情報を削除し、処理をステップS1506に進める。一方、全てのブロックが空きでない場合(ステップS1504でNo)には、ページ解放プログラムは、処理をステップS1506に進める。
ステップS1506では、ページ解放プログラムは、未処理のページ292があるか否かを判定し、未処理のページ292があれば(ステップS1506でYes)、ステップS1502からの処理を実行する一方、未処理のページ292がなければ(ステップS1506でNo)、当該ページ解放処理を終了する。
このページ解放処理により、転送したJNLデータ2524を格納しているブロックBKに割当てられていたページ292を適切に開放し、他の領域への割当てに利用できるようになる。
図46に示すページ解放処理では、空となったブロックに割当てられていたページ292を解放するようにしていたが、小サイズブロックSBKは、以降において、データが書き込まれて、新たなページ292が割当てられる可能性が高い。そこで、図48に示すように、小サイズブロックSBKに割当てられたページ292について解放しないようにして、小サイズブロックSBKに対するページ292の再割り当てに要する負荷を低減するようにすることができる。
図48は、実施例4の変形例に係るページ解放処理のフローチャートである。なお、ページ解放処理(図46)と同様な部分には、同一の符号を付し、ここでは、異なる点について説明する。
全てのブロックが空きである場合(ステップS1504でYes)には、ページ解放プログラムは、特定したすべてのブロックが大サイズブロックLBKであるか否かを判定する(ステップS1507)。この結果、特定したすべてのブロックが大サイズブロックLBKである場合(ステップS1507でYes)には、ステップS1505に進んでページ292を解放する一方、特定したすべてのブロックが大サイズブロックLBKでない場合(ステップS1507でNo)には、ページ292を解放することなく、処理をステップS1506に進める。
このページ解放処理によると、小サイズブロックSBKに割当てられているパージ292が解放されないので、以降において、当該小サイズブロックSBKに対してJNLデータ2524が格納される際に、ページ292の再割当てに要する処理を行わずに済み、処理負荷を低減するようにすることができる。
仮想ボリューム293は、作成した後に、容量を拡張できるという特徴がある。ここで、仮想ボリューム293の容量を拡張した場合の処理について説明する。
図49は、実施例4に係るジャーナルボリュームの拡張を説明する第1の図である。
例えば、拡張前に示すJVOL252(253)の容量を拡張する場合には、拡張後に示すように、JVOL252の最終ブロック(同図では、ブロック番号5のブロック)の容量のみを拡大するようにすればよい。この場合には、JVOL252の容量の拡張に伴って、ブロック数が変更しないので、ブロック管理ビットマップ2212や、ブロック内最大シーケンス番号情報2215等の情報量は変更されない。ここで、最終ブロックは、(小サイズブロックのブロックサイズ×小サイズブロック数)+(大サイズブロックのブロックサイズ×(大サイズブロック数−1))により算出される開始アドレスから、JVOL252の拡張後の終端のアドレスまでの範囲として把握できる。
図50は、実施例4に係るジャーナルボリュームの拡張を説明する第2の図である。
また、例えば、拡張前に示すJVOL252の容量を拡張する場合には、拡張後に示すように、JVOL252の拡張された容量を複数(例えば、32個)のブロック(追加ブロック)ABKに分割して管理するようにしてもよい。この場合には、ブロック管理ビットマップ2212や、ブロック内最大シーケンス番号情報2215等に対して、増加したブロックABKに対応するレコードを追加する必要がある。このような、方法を採ることで、図41の状態1で説明したJVOLの利用効率が低下する問題を回避できる。
次に、実施例5に係る計算機システムについて説明する。
実施例5に係る計算機システムは、上記した実施例において、JNLデータ2524及び/又は、JNCB2523を、ブロックを使って格納する管理を行うようにしていたものを、ブロックを用いずに管理するようにしたものである。
図51は、実施例5の概要を説明する図である。
本実施例においては、状態1に示すように、JVOL252(253)における未転送のJNLデータ2524の格納先の先頭のアドレスを示す先頭ポインタ(1)と、未転送のJNLデータ2524の終端のアドレス(転送済みのJNLデータの格納先の先頭のアドレス)を示す終端ポインタ(1)とのポインタの組(領域特定情報)を管理することにより、未転送のJNLデータ2524の格納されている領域を管理することができる。
ここで、例えば、転送済みのJNLデータ2524の領域(転送済領域)に、新たなJNLデータ2524を格納するようにする、すなわち、転送済みのJNLデータ2524が格納されている領域を再利用する場合には、状態2に示すように、再利用している領域に対する未転送のJNLデータの格納されている領域(第2領域)を管理するために、もう一つのポインタの組(先頭ポインタ(2)及び終端ポインタ(2):第2領域特定情報)を用いることにより、再利用している領域における未転送のJNLデータ2524の領域を管理する。
さらに、再利用している領域の全てに対してJNLデータ2524を格納した場合には、状態3に示すように、先頭ポインタ(1)よりも後ろの未使用領域にJNLデータ2524を格納するようにし、別のポインタの組(先頭ポインタ(3)及び終端ポインタ(3))を用いて未転送のJNLデータの領域(第3領域)を管理する。
このように、複数のポインタの組(先頭ポインタ及び終端ポインタ)を用いることにより、未転送のJNLデータ2524が格納されている領域を管理することができる。ここで、作成されたポインタの組の順番に従って、それらポインタにより示される領域の各JNLデータ2524が並んでいる。これにより、前に作成されたポインタの組が示す領域のJNLデータ2524は、後で作成されたポインタの組が示す領域のJNLデータ2524よりも前に作成されたJNLデータ2524であることが特定できる。したがって、JNLデータ2524の発生順番を適切に把握することができる。
図52は、実施例5に係る制御情報部の詳細図である。
実施例5に係る制御情報部221は、実施例4に係る制御情報部221に対して、さらに、1以上の先頭ポインタ221C及び終端ポインタ221Dの組(例えば、先頭ポインタ(1)及び終端ポインタ(1)等)を格納する。
次に、実施例5に係る計算機システムにおける動作について説明する。ここでは、実施例4と異なる動作について説明する。
図53は、実施例5に係るJNLデータ格納アドレス決定処理のフローチャートである。
JNLデータ格納アドレス決定プログラム2223は、使用中の先頭ポインタ、すなわち、最後に作成された先頭のポインタを取得し(ステップS1601)、当該ポインタが示すアドレス以前に所定サイズ以上の空き領域(転送済領域)があるか否かを判定する(ステップS1602)。
この結果、所定サイズ以上の空き領域がない場合(ステップS1602でNo)には、JNLデータ格納アドレス決定プログラム2223は、使用中の先頭ポインタが示すアドレスの直後にJNLデータ2524を格納可能であるか否かを判定する(ステップS1603)。使用中の先頭ポインタが示すアドレスの直後にJNLデータ2524を格納可能である場合(ステップS1603でYes)には、先頭ポインタが示すアドレスの直後の領域をJNLデータ2524の格納先と決定し(ステップS1608)、使用中の先頭ポインタを更新する(ステップS1609)。
一方、使用中の先頭ポインタが示すアドレスの直後にJNLデータ2524を格納可能でない場合(ステップS1603でNo)には、JNLデータ格納アドレス決定プログラム2223は、先頭ポインタよりも後ろの領域で空き領域を探し(ステップS1604)、ステップS1605へ処理を進める。
また、ステップS1602で、所定サイズ以上の空き領域があると判定した場合(ステップS1602でYes)には、JNLデータ格納アドレス決定プログラム2223は、ステップS1605へ処理を進める。
ステップS1605では、JNLデータ格納アドレス決定プログラム2223は、制御情報部220に、新しいポインタの組(終端ポインタ及び先頭ポインタ)の領域を確保し、確保したポインタを使用中のポインタとし(ステップS1606)、空き領域の先頭のアドレスを示すように終端ポインタを設定する(ステップS1607)。次いで、終端ポインタが示すアドレスの直後の領域をJNLデータ2524の格納先と決定し(ステップS1608)、使用中の先頭ポインタを更新する(ステップS1609)。これにより、使用中の先頭ポインタよりも前の領域に所定サイズ以上の空き領域がある場合に、JNLデータ2524をその空き領域に格納させることができる。ここで、本実施例では、空き領域のサイズを所定サイズ以上とすることで、未転送のJNLデータ2524を格納する領域を管理するためのポインタの組の数を低減することができる。なお、空き領域のサイズによらず、空き領域があれば使用するようにしてもよい。なお、ステップS1604で、空き領域が見つけられない場合、JVOL252には、空き領域が存在しないため、異常終了する。
図54は、実施例5に係るJNLリード処理のフローチャートである。なお、JNLリード処理(図25)と同様な部分には、同一の符号を付し、ここでは、異なる点について説明する。
正ストレージシステム200Aでは、JNLリードプログラム(正)2226が、リードしたJNL(JNCB2523及びJNLデータ2524)を、副ストレージシステム200Bに転送した後(ステップS504)、転送したデータが格納されていた領域を全て特定する(ステップS1701)。ここで、転送したデータが格納されていた領域とは、一組のポインタによって示される領域のことをいう。次に、特定された一つ以上の領域から一つ処理対象を決める(ステップS1702)。
次いで、JNLリードプログラム(正)2226は、決定した領域内の全てのJNLデータ2524を転送したか否かを判定する(ステップS1703)。ここで、領域内の全てのJNLデータ2524を転送したか否かは、対応する一組のポインタにより示される領域が、ステップS1701で特定したデータ領域に含まれているか否かにより判定することができる。
この結果、領域内の全てのJNLデータ2524を転送した場合(ステップS1703でYes)には、JNLリードプログラム(正)2226は、対応する一組のポインタを解放し(ステップS1704)、処理をステップS1706に進める。
一方、領域内の全てのJNLデータを転送していない場合(ステップS1703でNo)には、JNLリードプログラム(正)2226は、対応するポインタの組の終端ポインタを、転送したJNLデータ2524の位置まで進め(ステップS1705)、処理をステップS1706に進める。
ステップS1706では、JNLリードプログラム(正)2226は、転送した全てのJNLデータ2524の領域をチェックしたか否かを判定し、全てのJNLデータ2524の領域をチェックしていない場合(ステップS1706でNo)には、処理をステップS1702に進める一方、全てのJNLデータ2524の領域をチェックしている場合(ステップS1706でYes)には、処理を終了する。
副ストレージシステム200Bでは、JNLを正ストレージシステム200Aから受領すると(ステップS603)、JNLリードプログラム(副)2227が、JNLデータ格納アドレス決定プログラム2223をコールする(ステップS1801)。副ストレージシステム200Bでは、図53に示すJNLデータ格納アドレス決定処理が実行され、JNLデータ2524を格納するJVOL253のブロック及びアドレスが決定される。
図55は、実施例5に係るリストア処理のフローチャートである。なお、リストア処理(図26)と同様な部分には、同一の符号を付し、ここでは、異なる点について説明する。
副ストレージシステム200Bでは、リストアプログラム2228が、リストアした最大のシーケンス番号をリストア済みシーケンス番号とした後(ステップS706)、リストアしたデータが格納されていた領域を全て特定する(ステップS1901)。ここで、転送したデータが格納されていた領域とは、一組のポインタによって示される領域のことをいう。次に、特定された一つ以上の領域から一つ処理対象を決める(ステップS1902)。
次いで、リストアプログラム2228は、決定した領域内の全てのJNLデータ2524をリストアをしたか否かを判定する(ステップS1903)。ここで、領域内の全てのJNLデータ2524をリストアしたか否かは、対応する一組のポインタにより示される領域が、ステップS1901で特定したデータ領域に含まれているか否かにより判定することができる。
この結果、領域内の全てのJNLデータ2524をリストアした場合(ステップS1903でYes)には、リストアプログラム2228は、対応する一組のポインタを解放し(ステップS1904)、処理をステップS1906に進める。
一方、領域内の全てのJNLデータ2524をリストアしていない場合(ステップS1903でNo)には、リストアプログラム2228は、対応するポインタの組の終端ポインタを、リストアしたJNLデータ2524の位置まで進め(ステップS1905)、処理をステップS1906に進める。
ステップS1906では、リストアプログラム2228は、リストアした全てのJNLデータ2524の領域をチェックしたか否かを判定し、全てのJNLデータ2524の領域をチェックしていない場合(ステップS1906でNo)には、処理をステップS1902に進める一方、全てのJNLデータ2524の領域をチェックしている場合(ステップS1906でYes)には、処理を終了する。
以上、幾つかの実施例を説明したが、本発明はそれらの実施例に限られず、他の様々な態様に適用可能である。
例えば、上記した実施例では、JNLを一時的に格納するJVOL252におけるJNLの管理に対して本発明を適用していたが、本発明はこれに限られず、例えば、計算機システム10におけるIO(入出力)に関するモニタデータを、当該モニタデータを利用する装置に送信する場合において、モニタデータを一時的に格納するバッファとして利用されるバッファ領域(例えば、ボリューム)におけるモニタデータの管理に対しても適用することができ、要は、或るデータを一時的に格納するバッファとして利用される領域におけるデータの管理に対して適用することができる。