(57)【特許請求の範囲】
【請求項１】
ホスト計算機からのデータが書き込まれる第一の論理ボリュームと、
前記第一の論理ボリュームのバックアップ用の論理ボリュームである第二の論理ボリュームと、
前記ホスト計算機からの書込みコマンドに従うデータを前記第一の論理ボリュームに書込むコントローラと
を備え、
前記コントローラが、
（Ａ）スナップショット取得時点におけるスナップショットの世代であるスナップショット世代を、スナップショット取得時点が発生する都度に更新し、
（Ｂ）スナップショット取得時点の後から次のスナップショット取得時点までに、前記第一の論理ボリュームに新たなデータが書かれる都度、
（ｂ１）前記新たなデータの書込み先が、前記スナップショット取得時点の後に初めて書込み先となった場所か否かを判別し、初めて書込み先となった場所であれば、前記書込み先に記憶されている旧いデータを、前記第一の論理ボリュームの前記書込み先から前記第二の論理ボリュームに退避させて、前記書込み先に前記新たなデータを書き込み、
（ｂ２）前記新たなデータの複製である更新差分データを、前記第二の論理ボリュームに追記し、その際、前記第一の論理ボリュームにおける、前記新たなデータの書込み先が、前記スナップショット取得時点の後から前記次のスナップショット取得時点までに書込み先となった場所と同じ場所である場合、その場所に書き込まれたデータの複製としての更新差分データが、ｓｙｎｃコマンドの取得無しに前記第二の論理ボリュームに既に書き込まれているデータであるならば、その書き込まれている更新差分データを解放し、ｓｙｎｃコマンドを取得して前記第二の論理ボリュームに既に書き込まれているデータであるならば、その書き込まれている更新差分データを解放せず、
（ｂ３）ｓｙｎｃコマンドを取得したときに、前記（ｂ１）の前記更新差分データの確定した時点における、前記更新差分データの世代である更新差分世代を更新し、
（Ｃ）スナップショット取得時点が発生する都度に、前記第二の論理ボリュームの使用量が所定の基準値以上か否かを判断し、その判断の結果が肯定的であれば、最新のスナップショットの世代の二世代前の世代以前に前記第二の論理ボリュームに書かれた更新差分データを前記第二の論理ボリュームから削除し、
（Ｄ）障害発生時点に最も近い更新差分世代より前且つ直近のスナップショット世代を特定し、前記第二の論理ボリュームにおける、前記特定したスナップショット世代に対応する旧いデータと、前記第二の論理ボリュームにおける、前記障害発生時点に最も近い更新差分世代に対応する前記更新差分データとにより、前記第一の論理ボリュームのリカバリを行い、
前記ｓｙｎｃコマンドは、前記ホスト計算機のユーザの操作によらないで発生し、前記第一の論理ボリュームと前記ホスト計算機のアプリケーションプログラムとの間でのデータの整合性の取れることを意味し、且つ、前記ホスト計算機のオペレーティングシステムから定期的又は不定期的に発行されたコマンドである、
ストレージシステム。
【請求項２】
（Ａ）ホスト計算機からの書込みコマンドに従うデータを第一の論理ボリュームに書込み、
（Ｂ）各スナップショット取得時点におけるスナップショットの世代であるスナップショット世代を、スナップショット取得時点が発生する都度に更新し、
（Ｃ）スナップショット取得時点の後から次のスナップショット取得時点までに、前記第一の論理ボリュームに新たなデータが書かれる都度、
（ｃ１）前記新たなデータの書込み先が、前記スナップショット取得時点の後に初めて書込み先となった場所か否かを判別し、初めて書込み先となった場所であれば、前記書込み先に記憶されている旧いデータを、前記第一の論理ボリュームの前記書込み先から前記第二の論理ボリュームに退避させて、前記書込み先に前記新たなデータを書き込み、
（ｃ２）前記新たなデータの複製である更新差分データを、前記第二の論理ボリュームに追記し、その際、前記第一の論理ボリュームにおける、前記新たなデータの書込み先が、前記スナップショット取得時点の後から前記次のスナップショット取得時点までに書込み先となった場所である場合、その場所に書き込まれたデータの複製としての更新差分データが、ｓｙｎｃコマンドの取得無しに前記第二の論理ボリュームに既に書き込まれているデータであるならば、その書き込まれている更新差分データを解放し、ｓｙｎｃコマンドを取得して前記第二の論理ボリュームに既に書き込まれているデータであるならば、その書き込まれている更新差分データを解放せず、
（ｃ３）ｓｙｎｃコマンドを取得したときに、前記（ｃ１）の前記更新差分データの確定した時点における、前記更新差分データの世代である更新差分世代を更新し、
（Ｄ）スナップショット取得時点が発生する都度に、前記第二の論理ボリュームの使用量が所定の基準値以上か否かを判断し、その判断の結果が肯定的であれば、最新のスナップショットの世代の二世代前の世代以前に前記第二の論理ボリュームに書かれた更新差分データを前記第二の論理ボリュームから削除し、
（Ｅ）障害発生時点に最も近い更新差分世代より前且つ直近のスナップショット世代を特定し、前記第二の論理ボリュームにおける、前記特定したスナップショット世代に対応する旧いデータと、前記第二の論理ボリュームにおける、前記障害発生時点に最も近い更新差分世代に対応する前記更新差分データとにより、前記第一の論理ボリュームのリカバリを行い、
前記ｓｙｎｃコマンドは、前記ホスト計算機のユーザの操作によらないで発生し、前記第一の論理ボリュームと前記ホスト計算機のアプリケーションプログラムとの間でのデータの整合性の取れることを意味し、且つ、前記ホスト計算機のオペレーティングシステムから定期的又は不定期的に発行されたコマンドである、
記憶制御方法。
【請求項３】
（Ａ）ホスト計算機からの書込みコマンドに従うデータを第一の論理ボリュームに書込み、
（Ｂ）各スナップショット取得時点におけるスナップショットの世代であるスナップショット世代を、スナップショット取得時点が発生する都度に更新し、
（Ｃ）スナップショット取得時点の後から次のスナップショット取得時点までに、前記第一の論理ボリュームに新たなデータが書かれる都度、
（ｃ１）前記新たなデータの書込み先が、前記スナップショット取得時点の後に初めて書込み先となった場所か否かを判別し、初めて書込み先となった場所であれば、前記書込み先に記憶されている旧いデータを、前記第一の論理ボリュームの前記書込み先から前記第二の論理ボリュームに退避させて、前記書込み先に前記新たなデータを書き込み、
（ｃ２）前記新たなデータの複製である更新差分データを、前記第二の論理ボリュームに追記し、その際、前記第一の論理ボリュームにおける、前記新たなデータの書込み先が、前記スナップショット取得時点の後から前記次のスナップショット取得時点までに書込み先となった場所である場合、その場所に書き込まれたデータの複製としての更新差分データが、ｓｙｎｃコマンドの取得無しに前記第二の論理ボリュームに既に書き込まれているデータであるならば、その書き込まれている更新差分データを解放し、ｓｙｎｃコマンドを取得して前記第二の論理ボリュームに既に書き込まれているデータであるならば、その書き込まれている更新差分データを解放せず、
（ｃ３）ｓｙｎｃコマンドを取得したときに、前記（ｃ１）の前記更新差分データの確定した時点における、前記更新差分データの世代である更新差分世代を更新し、
（Ｄ）スナップショット取得時点が発生する都度に、前記第二の論理ボリュームの使用量が所定の基準値以上か否かを判断し、その判断の結果が肯定的であれば、最新のスナップショットの世代の二世代前の世代以前に前記第二の論理ボリュームに書かれた更新差分データを前記第二の論理ボリュームから削除し、
（Ｅ）障害発生時点に最も近い更新差分世代より前且つ直近のスナップショット世代を特定し、前記第二の論理ボリュームにおける、前記特定したスナップショット世代に対応する旧いデータと、前記第二の論理ボリュームにおける、前記障害発生時点に最も近い更新差分世代に対応する前記更新差分データとにより、前記第一の論理ボリュームのリカバリを行う、
ことをコンピュータに実行させ、
前記ｓｙｎｃコマンドは、前記ホスト計算機のユーザの操作によらないで発生し、前記第一の論理ボリュームと前記ホスト計算機のアプリケーションプログラムとの間でのデータの整合性の取れることを意味し、且つ、前記ホスト計算機のオペレーティングシステムから定期的又は不定期的に発行されたコマンドである、
コンピュータプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、記憶制御技術に関し、特に、バックアップおよびリカバリに関する。
【背景技術】
【０００２】
配列された複数のディスク型記憶装置（例えばハードディスクドライブ）を備えるディスクアレイ装置が知られている。複数のディスク型記憶装置には、二以上の論理ボリュームが用意される。ディスクアレイ装置は、ホスト計算機から送信されたコマンドを受け、そのコマンドに従って、ホスト計算機から受信したデータを論理ボリュームに書き込んだり、論理ボリュームからデータを読み出してホスト計算機に送信したりする。
【０００３】
ディスクアレイ装置では、一般に、ＲＡＩＤ（Redundant Array of Independent Disks）技術が採用される。また、ディスクアレイ装置には、データの損失を防止するため、データのバックアップを取るいくつかの技術がある。
【０００４】
その一つに、スナップショットと呼ばれる技術（以下、スナップショット技術）がある。スナップショット技術とは、或る時点における第一の論理ボリュームのイメージ（スナップショット）を保存しておく技術である。スナップショットは、例えば、ユーザが指定した契機が発生した時点（つまりユーザ所望の時点）のデータをリカバリできるよう、その時点から第一の論理ボリュームに新たなデータが書き込まれる際に、更新される前の旧いデータ（以下、旧データ）を第一の論理ボリュームから第二の論理ボリュームへ退避することで取得することができる。この処理は、コピー・オン・ライト（以下、「ＣｏＷ」と略記）と呼ばれることがある。スナップショット技術において、データをリカバリする際には、ディスクアレイ装置が、ユーザ所望の時点にあったＣｏＷデータを第二の論理ボリュームから第一の論理ボリュームに書き戻すことによって行うことができる。このようなスナップショット技術は、ユーザが指定した時点にしかリカバリできないことから、ＰＩＴ（Point In Time）技術と呼ばれることがある。
【０００５】
データのバックアップのための別の技術として、例えば、ジャーナリングという技術（以下、ジャーナリング技術）がある。ジャーナリング技術では、ディスクアレイ装置は、書込みコマンドとそれによって新たに書かれるデータとを含んだログ（以下、これを「ジャーナルログ」と呼ぶ）を、書込みコマンド及びデータを受信する都度に所定の記録領域（例えば論理ボリューム）に記録していくことができる。ジャーナリング技術によれば、ディスクアレイ装置は、受信した全ての書込みコマンドとデータとをジャーナルログとして備えるため、書込みコマンドを受信した複数の時点のうちの任意の時点にリカバリすることが可能である。このため、この技術は、ＣＤＰ（Continuous Data Protection）技術と呼ばれることがある。しかし、この技術では、ユーザが利用したコンピュータプログラム（例えば、ホスト計算機のＯＳ上で動作するアプリケーションプログラム）にとって整合性のとれたデータに戻すためには、スナップショットと同様に、ユーザから、チェックポイントと呼ばれる時点（整合性のとれている時点）を、ディスクアレイ装置に与える必要がある。
【０００６】
この他に、例えば、特許文献１（特開２００５−１８７３８号公報）に開示されている技術がある。この技術は、論理ボリュームのスナップショットとその論理ボリュームへの書込みの履歴とを組み合わせて任意時点のデータをリカバリするという技術である。
【０００７】
【特許文献１】特開２００５−１８７３８号公報
【発明の開示】
【発明が解決しようとする課題】
【０００８】
しかしながら、従来のいずれの技術も、データの整合性がとれた過去の時点へリカバリするためには、ユーザ所望の時点をユーザが指定する必要がある。そのため、頻繁にスナップショットを取得しようとすれば、ユーザは、頻繁に、スナップショットの指示、すなわち、リカバリポイントの時点を指定しなければならない。これは、ユーザが使用するホスト計算機の負荷を増大させることにつながると考えられる。また、スナップショットは、ＣｏＷによって実現されるため、頻度を上げればそれだけ、ＣｏＷが多発し、アクセス性能を低下させる（例えば、書込みコマンドを受けてからデータの書込みを完了させるまでの時間長が長くなってしまう）ことにもなると考えられる。
【０００９】
一方、ジャーナリング技術によれば、ジャーナルログを、ホスト計算機からの書込みコマンドに従ってデータが書かれる第一の論理ボリュームとは別の第二の論理ボリュームに記録することで、第一の論理ボリュームへのアクセスの性能を低下することを抑止することができる。しかし、書き込みコマンド及びデータを受信する都度に、書込みコマンドとデータとを含んだジャーナルログを保存しておかなければならず、大量の記憶容量を要すると考えられる。また、データのリカバリのために、書込みコマンドを処理した順序とは逆の順序で順次にデータをリカバリしていかなければならないため、リカバリに長い時間を要すると考えられる。これを軽減するための方法として、ユーザがチェックポイントの指示を頻繁にディスクアレイ装置に与える方法が考えられるが、これでは、スナップショット技術と同様に、ホスト計算機の負荷を増大させてしまうことになると考えられる。
【００１０】
また、特許文献１では、書込み履歴とスナップショットを併用する技術を開示している。しかし、この技術においても、スナップショットが取得された時点を基準に書き込み履歴に従って順次にデータを再生していかなければならないことに変わりがない。また、データの再生量を減らすには、頻繁にスナップショットを取る必要があるので、先に述べたホスト計算機の負荷増大の問題を解決するものではない。
【００１１】
本発明の一つの目的は、ホストの負荷を増大させることなく、整合性のとれた時点にデータをリカバリできるようにすることにある。
【００１２】
本発明の更なる目的は、データのバックアップのために必要とする記憶容量を削減できるようにすることにある。
【００１３】
本発明の他の目的は、後の説明から明らかになるであろう。
【課題を解決するための手段】
【００１４】
本発明に従うストレージシステムは、ホスト計算機からのデータが書き込まれる第一の論理ボリュームと、前記第一の論理ボリュームのバックアップ用の論理ボリュームである第二の論理ボリュームと、前記ホスト計算機からの書込みコマンドに従うデータを前記第一の論理ボリュームに書込むコントローラとを備える。前記コントローラは、各スナップショット取得時点におけるスナップショットの世代であるスナップショット世代を管理する。また、前記コントローラは、スナップショット取得時点が発生する都度に、前記スナップショット世代を更新する。また、前記コントローラは、スナップショット取得時点の後から次のスナップショット取得時点までに、前記第一の論理ボリュームに新たなデータが書かれる場合、前記新たなデータの書込み先が、前記スナップショット取得時点の後に初めて書込み先となった場所か否かを判別し、初めて書込み先となった場所であれば、前記書込み先に記憶されている旧いデータを、前記第一の論理ボリュームの前記書込み先から前記第二の論理ボリュームに退避させて、前記書込み先に前記新たなデータを書き込む。また、前記コントローラは、前記第一の論理ボリュームに新たなデータを書込む都度に、前記新たなデータの複製である更新差分データを、前記第二の論理ボリュームに書込む。また、前記コントローラは、前記ホスト計算機のユーザの操作によらないで発生した、前記第一の論理ボリュームの整合性の取れる契機を取得する（例えば、前記ホスト計算機のオペレーティングシステムから発行されたｓｙｎｃコマンドを受信する）。また、前記コントローラは、前記更新差分データの確定した各時点における前記更新差分データの世代である更新差分世代を管理する。また、前記コントローラは、前記契機を取得する都度に前記更新差分世代を更新する。また、前記コントローラは、前記管理されている更新差分世代とスナップショット世代とに基づいて、前記第一の論理ボリュームのリカバリを行う。
【００１５】
本発明の第一の態様では、前記コントローラは、前記スナップショット世代と前記更新差分世代の更新された順序を管理することができる。また、前記コントローラは、前記退避された各旧いデータはどのスナップショット世代で退避されたものであるかを管理することができる。また、前記コントローラは、前記書込まれた各更新差分データはどの更新差分世代で書かれたものであるかを管理することができる。また、前記コントローラは、管理されている複数の更新差分世代の中からリカバリ対象となる更新差分世代を選択することができる。また、前記コントローラは、前記選択された更新差分世代よりも前の直近のスナップショット世代を、前記管理されている一以上のスナップショット世代の中から選択することができる。また、前記コントローラは、前記選択されたスナップショット世代で退避された前記旧いデータを判別することができる。また、前記コントローラは、前記選択された更新差分世代で書込まれた前記更新差分データを判別することができる。また、前記コントローラは、前記判別された旧いデータを前記第二の論理ボリュームから前記第一の論理ボリュームに移し、その後に、前記判別された更新差分データを前記第二の論理ボリュームから前記第一の論理ボリュームに移すことで、前記選択された更新差分世代に更新された時点での前記第一の論理ボリュームにおけるデータをリカバリすることができる。この第一の態様では、前記コントローラは、前記ホスト計算機又は別種の計算機からリカバリ指示を受け、前記リカバリ対象を、前記リカバリ指示を受けた時点に最も近い時点で更新された後の更新差分世代とすることができる。
【００１６】
本発明の第二の態様では、前記コントローラは、前記第二の論理ボリュームに存在する前記旧いデータと前記更新差分データとが同一か否かを判別し、同一であれば、一方のデータを前記第二の論理ボリュームから削除することができる。この第三の態様では、前記コントローラは、前記同一の場合、更新差分データを削除することができる。
【００１７】
本発明の第三の態様では、前記コントローラは、手動によって前記ホスト計算機又は別種の計算機からスナップショット取得指示（例えば、ユーザからの明示的な契機指示（ＰＩＴ契機の指示）を受け、前記スナップショット取得指示を受けた時点を、前記スナップショット取得時点とすることができる。
【００１８】
前記コントローラが行う前述した各処理は、各手段によって実行することができる。また、前記コントローラが行う各処理は、ハードウェア回路、又は、コンピュータプログラムを読み込んだプロセッサが実行することができる。前記コントローラが行う複数の処理は、一又は複数のプロセッサで行われても良いし、プロセッサとハードウェア回路とが分担して行っても良い。
【発明の効果】
【００１９】
本発明によれば、ホストの負荷を増大させることなく、整合性のとれた時点にデータをリカバリすることができる。
【発明を実施するための最良の形態】
【００２０】
以下、図面を参照して、本発明の一実施形態を説明する。
【００２１】
図１は、本発明の一実施形態に係るストレージシステムが適用されたディスクアレイ装置の概略構成例を示す説明図である。図２Ａは、図１のディスクアレイ装置の外観図の一例を示す。図２Ｂは、ディスアレイコントローラの構成例を示す。
【００２２】
ディスクアレイ装置１は、ディスクアレイコントローラ１１、１２、接続インターフェース１３０、１３１、１３２、および、複数のディスク型記憶装置（以下、ディスク装置）Ｄ００〜Ｄ２Ｎを備えている。複数のディスク装置Ｄ００〜Ｄ２Ｎは、例えば、図２Ａに示すように、ディスクアレイ装置１の各ディスク筐体Ｅ００〜Ｅ８０に備えられると共に、所定のＲＡＩＤレベルに従うＲＡＩＤグループを構成している。
【００２３】
ディスクアレイコントローラ１１、１２は、例えば、制御プログラム１１８、１１９を実行することによって、ディスクアレイ装置１における各種制御を実行することができる制御回路である。ディスクアレイコントローラ１１は（１２も実質的に同様）、例えば、図２Ｂに示すように、制御プログラム１１８を読み込んで実行するプロセッサ（例えばＣＰＵ）４や、ホスト計算機（以下、単に「ホスト」と言う）２０〜２１とディスク装置Ｄ００〜Ｄ２Ｎとの間で通信されるデータを一時的に記憶することができるキャッシュメモリ６や、データ転送用のＬＳＩ（Large Scale Integration）８や、後述する種々のテーブルやリストを記憶することができるメモリ（以下、制御メモリ）９や、制御プラグラム１１８、１１９の処理を高速にするためのハードウェアアクセラレータチップ（図示せず）や、これらに付随する種々の部品（図示せず）を備えることができる。本実施形態においては、２つのディスクアレイコントローラ１１、１２が備えられているが、１つまたは３つ以上のディスクアレイコントローラが備えられていてもよい。
【００２４】
ディスクアレイコントローラ１１、１２は、信号線１０１を介して相互に通信可能に接続されている。また、ディスクアレイコントローラ１１、１２は、ストレージネットワーク４０を介して各ホスト２０、２１、２２と接続され、且つ、管理用ネットワーク３０を介して管理端末３１と接続されている。ストレージネットワーク４０は、例えば、ファイバチャネルによるＦＣ−ＳＡＮ（Storage Area Network）やＴＣＰ／ＩＰネットワークを利用したＩＰ−ＳＡＮなどである。管理用ネットワーク３０は、例えば、ＴＣＰ／ＩＰネットワークを利用したＬＡＮ（Local Area Network）やシリアルケーブルによるPoint to Pointネットワークである。
【００２５】
ディスクアレイコントローラ１１、１２は、接続インターフェース１３０、１３１、１３２を介して複数のディスク装置Ｄ００〜Ｄ２Ｎと接続されている。具体的には、例えば、接続インターフェース１３０は、ディスクアレイコントローラ１１，１２と信号線１０２を介して接続されており、定期的な通信を行うことができる。また、各接続インターフェース１３０、１３１、１３２は、互いに信号線１０３を介して接続されている。従って、接続インターフェース１３１は、接続インターフェース１３０を介して、接続インターフェース１３２は、接続インターフェース１３０、１３１を介して、ディスクアレイコントローラ１１、１２と接続されている。接続インターフェース１３０は、複数のディスク装置Ｄ００〜Ｄ０Ｎと接続され、接続インターフェース１３１は複数のディスク装置Ｄ１０〜Ｄ１Ｎと接続され、接続インターフェース１３２は複数のディスク装置Ｄ２０〜Ｄ２Ｎと接続されている。
【００２６】
ディスクアレイコントローラ１１、１２を含む接続インターフェース１３０及び複数のディスク装置Ｄ００〜Ｄ０Ｎのグループは、例えば、基本筐体と呼ばれる。接続インターフェース１３１及び複数のディスク装置Ｄ１０〜Ｄ１Ｎのグループ、及び接続インターフェース１３２及び複数のディスク装置Ｄ２０〜Ｄ２Ｎのグループは、例えば、増設筐体と呼ばれる。なお、図１からも明らかなように、増設筐体は０ないし１つであってもよく、あるいは、３つ以上あってもよい。なお、本実施形態では、基本筐体を、ディスクアレイコントローラ１１、１２および接続インターフェース１３０、複数のディスク装置Ｄ００〜Ｄ０Ｎから成るグループとして記載しているが、基本筐体に複数のディスク装置Ｄ００〜Ｄ０Ｎを含まない形態でも良い。
【００２７】
ホスト２０、２１、２２は、例えば、各種データを入力することができる計算機であり、例えば、コンピュータプログラムを実行することができるプロセッサ（例えばＣＰＵ）や、コンピュータプログラムやデータを記憶することができるメモリ等を備える。ホスト２０、２１、２２は、１つであっても良いし、４つ以上であってもよい。ホスト２０、２１、２２上では、各種アプリケーションプログラム（以下、アプリケーション）２０１、２１１、２２１、例えば、データベースソフトウェア、文書作成ソフトウェア或いはメールサーバソフトウェアなどが稼動している。アプリケーションは、１つのホストで複数稼動していても良いし、１つのアプリケーションが複数のホストに跨って稼動しても良い。ホスト２０、２１、２２において処理されたデータは、ディスクアレイ装置１とのデータの授受を行うドライバ２０３、２１３、２２３を経由し、逐次、ディスクアレイ装置１に対し送出され、ディスクアレイ装置１に格納される。ドライバ２０３、２１３、２２３は、例えば、ホストバスアダプタ（図示せず）の制御ドライバやマルチパス切替ドライバなどがある。
【００２８】
また、ホスト２０、２１、２２上では、スナップショットマネージャ２０２も、アプリケーション２０１、２１１、２２１と同様に稼動することができる。スナップショットマネージャ２０２は、コンピュータプログラムであり、ユーザの設定に基づいて、ディスクアレイ装置１に対して、割り当てられている論理ボリュームのスナップショットを取るよう指示することができる。
【００２９】
各ディスク装置Ｄ００〜Ｄ２Ｎは、例えばハードディスクドライブである。ハードディスクドライブとしては、例えば、ＦＣ（Fibre Channel）規格、ＡＴＡ（AT Attachment）規格或いはＳＡＳ(Serial Attached SCSI)規格のハードディスクドライブを採用することができる。
【００３０】
管理端末３１は、ディスクアレイ装置１に対する保守管理を実行するために用いられる端末装置（例えばパーソナルコンピュータ）である。管理端末３１は、例えば、ＣＰＵ、メモリ及び管理画面（例えば表示装置）３２を備えることができる。管理者は、管理画面３２を通じて、ディスクアレイ装置１の状態を管理することができる。
【００３１】
図３は、ディスク装置と論理ボリュームの関係例を表す概念図である。
【００３２】
ディスクアレイ装置１は、複数のディスク装置によるＲＡＩＤ構成を有し、複数のディスク装置によって提供される記憶領域を論理ボリューム（以下、単に「ＶＯＬ」と略記することがある）という単位で管理することができる。論理ボリューム３０１、３０２、３０３、３１１は、いずれも、複数のディスク装置を用いて構成されたRAID上に構築される。管理者は、管理端末３１を通じて、論理ボリュームを確認したり設定したりすることができる。ディスクアレイコントローラ１１、１２によって、論理ボリュームの構成に関する情報が保持される。
【００３３】
ＶＯＬ３０１、３０２、３０３は、プライマリの論理ボリューム（以下、単に「プライマリボリューム」或いは「ＰＶＯＬ」と言う）であり、ホスト２０、２１、２２との間でやり取りされるデータを記憶することができる。以下、ＰＶＯＬ１、ＰＶＯＬ２及びＰＶＯＬ３の３つのＰＶＯＬがあるとする。
【００３４】
論理ボリューム３１１は、差分管理ボリューム（以下、「ＤＶＯＬ」と言う）である。本実施形態では、一つのＤＶＯＬ１があるとするが、複数のＤＶＯＬがあってもよい。ＤＶＯＬ１は、動的に使用したり解放したりすることができる記憶領域（以下、プール領域）から成る論理ボリュームである。ＤＶＯＬ１は、ＣｏＷデータ等の部分的な差分データブロックを記憶するための論理ボリュームであり、任意のＰＶＯＬ１、ＰＶＯＬ２又はＰＶＯＬ３と関連付けられて利用される。なお、ＣｏＷデータとは、ＰＶＯＬ１、ＰＶＯＬ２又はＰＶＯＬ３における更新前のデータ（つまり旧データ）であって、ＣｏＷ（コピー・オン・ライト）によって、ＰＶＯＬからＤＶＯＬへ退避されたデータである。また、ブロックとは、ホスト計算機のＯＳ（オペレーティングシステム）が出すコマンドの単位である。
【００３５】
図４Ａは、ＶＯＬ構成管理テーブルの構成例を示す。
【００３６】
ＶＯＬ構成管理テーブルＴｂ４は、論理ボリュームの構成に関する情報（以下、ＶＯＬ構成情報）を管理するためのテーブルである。ＶＯＬ構成情報には、各ＶＯＬ毎に、論理ボリュームＩＤ（例えば名称又は番号）、記憶容量、ディスク装置ＩＤ（そのＶＯＬを備えたディスク装置の名称又は番号）及びRAIDレベル等が含まれる（ディスク装置ＩＤ及びＲＡＩＤレベルについては図示せず）。例えば、ＰＶＯＬ１ ３０１は、ボリューム名が「ＰＶＯＬ１」であり、記憶容量は１０００GBであり、ディスク装置Ｄ００、Ｄ０１、Ｄ０２、Ｄ０３、Ｄ０４上に構成されたＲＡＩＤレベルは「６」である。
【００３７】
図４Ｂは、ＶＯＬ対応管理テーブルの構成例を示す。
【００３８】
ＶＯＬ対応管理テーブルＴｂ２は、ＰＶＯＬとＤＶＯＬとの関係を管理するためのテーブルである。制御プログラム１１８、１１９を実行するプロセッサ４は（以下、単に「制御プログラム１１８、１１９は」と言う）、このテーブルＴｂ２を参照すれば、どのＰＶＯＬから出るＣｏＷデータをどのＤＶＯＬに退避すればよいかを使えばよいかを判別することができる。図４Ｂに例示されているテーブルＴｂ２によれば、ＰＶＯＬ１及びＰＶＯＬ２にＤＶＯＬ１が対応しており、ＰＶＯＬ３にはどのＤＶＯＬも対応していないことがわかる。
【００３９】
図５は、本実施例におけるＰＶＯＬ１、ＰＶＯＬ２、ＤＶＯＬ１との関連を模式的に示したものである。
【００４０】
ＰＶＯＬ１、２上のデータはブロック単位で管理されている。ＰＶＯＬ１、２でデータが更新される場合には、制御プログラム１１８によって、上書きされてしまう旧データを含むブロック６０１、６０３が、ＰＶＯＬ１、２から、それに対応付けられているＤＶＯＬ１に退避される。また、制御プログラム１１８によって、ＰＶＯＬ１、２に新たに記録されるデータ（以下、新データ）を含むブロック６０２、６０４の複製６１２、６１４が用意され（例えばキャッシュメモリ６上で当該ブロックが二重化され）、その複製６１２、６１４が、ＤＶＯＬ１に記録される。制御プログラム１１８は、ＰＶＯＬ１，２とのアドレス関係を管理しており、ＰＶＯＬ１，２のデータを、ＤＶＯＬ１上の空きブロック（データの存在しない未使用のブロック）に格納することができる。
【００４１】
図６Ａを参照して、ＤＶＯＬ１における空きブロックの管理について説明する。参照符号Ｌｓｔ７は、ＤＶＯＬ１の空きブロック管理リストの一例を示している（なお、他のＤＶＯＬについても同様に管理することができる）。空きブロックリストＬｓｔ７は、空きブロックの開始アドレス（アドレスは、例えば論理ブロックアドレス（ＬＢＡ））と、次のブロックへのポインタから成る線形リストになっている。具体的には、たとえば、最初の空きブロックの開始アドレスは、１００００であり、次の空きブロックの開始アドレスとして、１００６４が、ポインタで示されている。
【００４２】
解放され再び使用することができるようになったブロック（つまり前述したプール領域）についても、この線形リストに加えることができる。たとえば、開始アドレス１１０８０のブロックは、以前使用されていたが、解放されたため、リストの最後に追加されている。開始アドレス１１０８０のブロックに続く空きブロックがない場合には、図６Ａに示すように、ポインタは未使用となる。本実施形態では、ブロックのアドレスを６４バイト置きに表記しているが、ブロックの管理サイズは任意のサイズにすることができる（例えば５１２バイト置きにすることができる）。
【００４３】
ＤＶＯＬ１の空き容量は、図６Ｂに例示するブロック使用量管理テーブルＴｂ８によって管理されている。テーブル８ｂには、例えば、全ブロック数、空きブロック数、各ＰＶＯＬの差分データ管理に要するブロック数が記録されている。空き容量は、１ブロックあたりのサイズ×空きブロック数で求めることができる。同テーブル８ｂにより、管理者は、ＤＶＯＬ１の空きブロック数及び空き容量について、管理端末３１の管理画面３２を通じて確認することができる。
【００４４】
以上、ＤＶＯＬ１の空きブロックリストＬｓｔ７及びブロック使用量管理テーブルＴｂ８について説明したが、同様のリストやテーブルは、各ＤＶＯＬ毎に用意することができる。
【００４５】
図７Ａは、ＰＶＯＬ１のスナップショットの管理のために用いられるＣｏＷ管理ビットマップの構成例を示す。各ビットは、ＰＶＯＬ１上のブロックのアドレスと対応している。新データの上書きの際にＣｏＷが実施されたブロックに対応するビットは、制御プログラム１１８、１１９によって、ＯＮ（図中で黒色）にされ、それ以外のブロックに対応するビットは、ＯＦＦ（図中で白色）にされる。なお、他のＰＶＯＬのスナップショットについても、同様のビットマップを用いることにより管理することができる。
【００４６】
図７Ｂを参照して、ＰＶＯＬ１のスナップショット世代管理リストについて説明する。Ｌｓｔ１０は、ＰＶＯＬ１のスナップショット世代を管理するリストの一例である。リストＬｓｔ１０は、ＰＶＯＬ１とＤＶＯＬ１上のブロックのアドレスの対応関係と、各世代のＣｏＷデータがＤＶＯＬ１のどのブロックのアドレスに格納されているかをポインタによって示している。各ノード（リストの要素）は、ＤＶＯＬ１上でデータが格納されているブロックのアドレス、どの世代のデータかを示すビット群（以下、世代ビット）、および、次のノードへのポインタとなっている。
【００４７】
図８を参照して、ＰＶＯＬ１の更新差分データ管理リストについて説明する。Ｌｓｔ１１は、ＰＶＯＬ１の更新差分データ、すなわち、新データの複製を管理するためのリストである。各ノードは、例えば、図７Ｂと実質的に同様に、ＤＶＯＬ１におけるコピー先のブロックのアドレス、どの世代のデータかを示す世代ビット、次のノードへのポインタとなる。
【００４８】
図９Ａは、各ＰＶＯＬ１，２におけるスナップショットおよび更新差分データの世代管理を行うためのテーブルである世代カウンタ管理テーブルの構成例を示す。
【００４９】
世代カウンタ管理テーブルＴｂ１２における各カウンタ値の初期値はゼロとなっている。このテーブルＴｂ１２において、スナップショットのカウンタ値は、制御プログラム１１８、１１９によって、ホスト２０〜２２から指示があるたびに１増加され、更新差分データのカウンタ値は、ｓｙｎｃコマンドなどホスト２０〜２２から整合性の取れる契機を取得するたびに１増加される。ここで言う「整合性」とは、ホストのアプリケーションとＰＶＯＬ１との間でのデータの整合性のことを意味する。また、ｓｙｎｃコマンドとは、リナックス（商標）やWｉｎｄｏｗｓ（商標）などのオペレーティングシステム（ＯＳ）から発行されるコマンドであって、より具体的には、ＳＣＳＩプロトコルであればＳＹＮＣＲＯＮＩＺＥ ＣＡＣＨＥコマンドやSCSIヘッダ中のFUA（Force Unit Access）ビットをONにしたWRITEコマンド、ＡＴＡプロトコルであればＦＬＵＳＨ ＣＡＣＨＥコマンドとしてディスクアレイ装置に発行され、キャッシュに残っているデータをディスク装置に移す命令である。制御プログラム１１８は、例えば、ｓｙｎｃコマンドを受けた場合、ディスクアレイコントローラ１１のキャッシュメモリ６に存在する、ＰＶＯＬ１に書いていないデータを、キャッシュメモリ６からＰＶＯＬ１に移すことができる。
【００５０】
なお、ｓｙｎｃコマンドは、ユーザからの明示的な指示によらずに、種々のタイミングで発行することができる。例えば、上記例のように書き込みコマンドとして発行することもできる。また、例えば、ＯＳ上で動作するコンピュータプログラムであって、同一のアクセス先（例えばＰＶＯＬ１）までの複数のＩ／Ｏパスを制御するマルチパス切替ドライバが、コマンドを流すＩ／Ｏパスを切り替えるときに、コマンドの順序性を保証するために、同期指示として、ｓｙｎｃコマンドを発行することができる。また、例えば、アプリケーションが、定期的に又は不定期的に、データの整合性が取れている時点を表すチェックポイントを知らせるために、ＯＳのｓｙｎｃコマンドを呼び出してＯＳから発行させることもできる。
【００５１】
図９Ｂは、ＰＶＯＬ１のスナップショット・更新差分履歴テーブルの構成例を示す。
【００５２】
この図９Ｂに例示するスナップショット・更新差分履歴テーブル（以下、単に「履歴テーブル」と言う）Ｔｂ１３は、ＰＶＯＬ１のスナップショット及び更新差分データ（新データの複製）の世代更新履歴を時間軸順に管理するためのテーブルである。いずれかの世代が更新されると、制御プログラム１１８，１１９によって、当該テーブルＴｂ１３に、更新された時刻（更新時刻）とともに更新後の世代が記録される。具体的には、例えば、「状態」の欄において、「スナップショット」や「更新差分」は、更新されたものがスナップショットと更新差分データのどちらであるかを示し、「＃」の後の番号は、通し番号を示す。更新時刻は、ディスクアレイ装置１ないしディスクアレイコントローラ１１，１２内に設けられるタイマ等の値を利用することができるが、時間軸に沿った順序を保証することができれば、ディスクアレイ装置１の内外を問わず、他の時刻取得方法を採用することもできる。
【００５３】
以上の図７Ａ、図７Ｂ、図８及び図９Ｂに例示したビットマップやリストは、各ＰＶＯＬ毎に用意することができる。
【００５４】
以下、ディスクアレイ装置１が行う種々の処理の流れの一例について説明する。
【００５５】
図１０は、ホストからコマンドを受信した際に行われる処理のフローチャートの一例を示す。なお、以下の説明では、読出しコマンドを受けた場合に行われる処理の流れの説明については省略し、書込みコマンド、もしくは、チェックポイントを示すコマンドが来た際に行われる処理について説明する。この図１０に示すフローチャートは、ホストからコマンドを受信し、そのホストに応答を返すまでの処理を示しており、ホストからコマンドを受信する毎に実行される。また、以下の説明を分かり易くするため、コマンドを送信するのはホスト２０であるとし、ディスクアレイ装置１が受信したコマンドを処理するのは、制御プログラム１１８であるとし、書込みコマンドの書込み先は、ＰＶＯＬ１であるとする。
【００５６】
制御プログラム１１８は、ホスト２０からコマンドを受信すると（ステップＳ１０００）、受信したコマンドが整合性の取れるチェックポイントを示すコマンドか否かを判別する（ステップＳ１０１０）。
【００５７】
ステップＳ１０１０の判別の結果、コマンドが整合性の取れるチェックポイントを示すコマンドでなかった場合（ステップＳ１０１０：Ｎｏ）、制御プログラム１１８は、そのコマンドが書込みコマンドか否かを判別する（ステップＳ１０１５）。
【００５８】
ステップＳ１０１５の判別の結果、書き込みコマンドであった場合には（ステップＳ１０１５：No）、制御プログラム１１８は、スナップショットが有効で、かつ、データの書き込み先となるブロックがＣｏＷで退避済みかどうかを判断する（ステップＳ１０２０）。ＰＶＯＬ１のスナップショットが有効か否かは、例えば、世代カウンタ管理テーブルＴｂ１２を参照し、ＰＶＯＬ１に対応したスナップショットのカウンタ値が１以上か否かで判別することができる（１以上であれば有効であるとわかる）。ＣｏＷで退避済みかどうかは、例えば、ＣｏＷ管理ビットマップＭｐ９を参照し、書込み先ブロックに対応するビットがＯＮかＯＦＦかで判別することができる（ＯＮになっている場合には、ＣｏＷで退避済みということがわかる）。
【００５９】
スナップショットが有効でＣｏＷで退避が済んでいると判断できた場合、或いは、スナップショットが無効（スナップショットのカウンタ値がゼロ）でＣｏＷ処理が不要と判断できた場合（ステップＳ１０２０：Ｎｏ）、制御プログラム１１８は、書込み対象である新データを、ＰＶＯＬ１上の該当アドレス（書き込みコマンドで指定されている書込み先アドレス）に書き込む（ステップＳ１０３０）。その後、制御プログラム１１８は、更新差分データをＤＶＯＬ１に書き込む処理に移行する。
【００６０】
すなわち、制御プログラム１１８は、ＤＶＯＬ１に更新差分データ（新データの複製）を書き込むために、空きブロック管理リストＬｓｔ７（図６Ａ参照）を参照して、更新差分データの書込み先とするブロックを確保する（ステップＳ１０４０）。そして、制御プログラム１１８は、ブロック使用量管理テーブルＴｂ８の値を更新する（ステップＳ１０５０）。具体的には、制御プログラム１１８は、空きブロック数を減じ、ＰＶＯＬ１用差分管理ブロック数を増加させる。
【００６１】
次に、制御プログラム１１８は、ステップＳ１０４０で確保したＤＶＯＬ１上のブロックに、更新差分データを書き込む（ステップＳ１０６０）。そして、制御プログラム１１８は、更新差分データの書込み先となったブロックに対応したノード（以下、最新ノード）を、更新差分データ管理リストＬｓｔ１１に接続する（ステップＳ１０７０）。具体的には、例えば、制御プログラム１１８は、図８に示すように、ＰＶＯＬ１のアドレス５００１のデータを更新した場合、そこからポインタで接続されている、ノードを順に探索し、最後のノードに、最新ノードを接続することができる。
【００６２】
制御プログラム１１８は、ステップＳ１０８０において、世代カウンタ管理テーブルＴｂ１３を参照し、ＰＶＯＬ１の更新差分データの現世代が何世代目かを得る（つまり、更新差分のカウンタ値を得る）。そして、制御プログラム１１８は、ＰＶＯＬ１の更新差分データ管理リストＬｓｔ１１において、ステップＳ１０７０で接続した最新ノードの直前ノードの世代ビットにつき、現世代以降に当たるビットをすべてＯＦＦにする。一方、制御プログラム１１８は、ステップＳ１０７０で接続した最新ノードの世代ビットにつき、現世代以降に当たるビットをすべてＯＮにする。このＳ１０８０の処理により、接続された最新ノードに対応したブロックの世代を現世代にすることができる。
【００６３】
制御プログラム１１８は、直前ノードの世代ビットを構成するビット群が全てOFFとなっているか否かをチェックし（ステップＳ１０９０）、ＯＦＦとなっていない場合（ステップＳ１０９０：Ｎｏ）には、ホスト２０に応答を返して終了する。
【００６４】
ところで、ステップＳ１０１０で、ホスト２０からのコマンドが整合性の取れる契機を示すものであった場合には（ステップＳ１０１０：Ｙｅｓ）、制御プログラム１１８は、世代カウンタ管理テーブルＴｂ１２における、ＰＶＯＬ１の更新差分に対応した世代カウンタ値を１増加させ（ステップＳ１１００）、ＰＶＯＬ１に対応した履歴テーブルＴｂ１３に、ＰＶＯＬ１の更新差分データの世代が変わったこととその時刻とを記録する。ステップＳ１０１５以降の処理は、先に説明した通りである。
【００６５】
また、ステップＳ１０２０で、スナップショットが有効であるがＣｏＷによるデータの退避が済んでいないと判別された場合には（ステップＳ１０２０：Ｙｅｓ）、制御プログラム１１８は、ＤＶＯＬ１の空ブロック管理リストＬｓＴ７から、ＣｏＷデータの書込み先とするブロックを確保する（ステップＳ１２００）。そして、制御プログラム１１８は、ステップ１０５０と同様に、ＤＶＯＬ１のブロック使用量管理テーブルＴｂ８を更新し（ステップＳ１２１０）、その後、ＣｏＷデータをＰＶＯＬ１からＤＶＯＬ１内の確保した空きブロックへ退避する（つまり移動する）（ステップＳ１２２０）。次に、制御プログラム１１８は、当該ＣｏＷデータの書込み先となったブロックのノードを、ＰＶＯＬ１における更新予定ブロックのアドレス（書込みコマンドで指定されているアドレス）と対応関係をとる最後のノードとして、ＰＶＯＬ１のスナップショット世代管理リストＬｓｔ１０に接続する（ステップＳ１２３０）。制御プログラム１１８は、世代カウンタ管理テーブルＴｂ１２と、接続した最新ノードの直前ノードの世代ビットとを参照し、最新ノードの世代ビットのビット群において、直前ノードの世代を表すビットの１つ後ろのビットから現世代のビットまでをＯＮにする（ステップＳ１２４０）。これにより、ＰＶＯＬ１における更新予定ブロックの世代を現世代にすることができる。また、制御プログラム１１８は、ＰＶＯＬ１のＣｏＷ管理ビットマップＭｐ９において、ＰＶＯＬ１における更新予定ブロックに対応するビットをＯＮ（＝退避済み）とする。ステップＳ１０３０以降の処理は先に説明した通りである。
【００６６】
また、ステップＳ１０９０で、接続された最新ノードの直前ノードの世代ビットがすべてＯＦＦとなってしまった場合（ステップＳ１０９０：Ｙｅｓ）、このことは、整合性が取れないまま新データが上書きされてしまったことを意味している。このため、直前ノードは不要なので、制御プログラム１１８は、次の手順により、直前のノードを解放することができる。すなわち、制御プログラム１１８は、直前ノードをリストから外し、直前ノードの前のノードのポインタを、最新ノードを指すように変更する（ステップＳ１３００）。つまり、外された直前ノードの前のノードに、最新ノードが接続される。制御プログラム１１８は、外された直前ノードが持つブロックのアドレスを、空きブロック管理リストＬｓｔ７に追加する（ステップＳ１３１０）。そして、制御プログラム１１８は、ブロック使用量管理テーブルＴｂ８において、ＰＶＯＬ１用差分管理ブロック数を減じ、減じた分、空きブロック数を増加させる（ステップＳ１３２０）。以上の処理によって、不要ブロックが解放され、再び利用できるようにされる。
【００６７】
また、ステップＳ１０１５で、書込みコマンド以外のコマンドであれば、そのコマンドに従う処理が行われる（ステップＳ１４００）。
【００６８】
以上が、図１０についての説明である。以下、ステップＳ１０９０でＹｅｓの場合についての説明を、図１４Ａ及び図１４Ｂを参照して補足する。なお、図１４Ａ及び図１４Ｂにおいて、各ノードは、更新差分データ管理リストＬｓｔ１１におけるノードを表し、そのノード内で配列された枠は、世代ビットを構成するビットを表し、枠内の数字は、世代を表している。
【００６９】
例えば、ライトコマンド間で整合性契機を示すコマンドがあった場合（例えば、或るライトコマンドもその次に受けたライトコマンドもｓｙｎｃコマンドであった場合）、ステップＳ１０１０において、更新差分世代カウンタはインクリメントされる。この結果、図１４Ａに例示するように、最新ノードにおける世代は、直前ノードにおける世代（例えば２）の次の世代（例えば３）となる。
【００７０】
しかし、ライトコマンド間で整合性契機を示すコマンドがなかった場合（例えば、或るライトコマンドはｓｙｎｃコマンドではなかったがその次に受けたライトコマンドがｓｙｎｃコマンドであった場合）、換言すれば、整合性が取れないまま新たにデータがライトされた場合、ステップＳ１０１０において、更新差分世代カウンタはインクリメントされない。つまり、図１４Ｂに例示するように、直前ノードにおける世代（例えば２）と最新ノードにおける世代は同じ（例えば２）となってしまう。
【００７１】
このとき、ステップＳ１０８０の処理において、制御プログラム１１８は、直前ノードの現世代以降（=2,3,4…）のビットを全てOFFにし、最新ノードの現世代以降（=2,3,4,…)のビットを全てONにするので、図１４Ｂに例示するように、直前ノードは、すべてのビットがOFFという状態になる。この結果、更新差分データとしては、有効（つまりビットがON）な２世代目のデータと、上書きされてしまった無効な（つまりビットがOFF)の２世代目のデータとを持っている状態となる。このため、ステップ１０９０でＹｅｓ以降のＳ１３００〜Ｓ１３２０の処理を行うことで、無効な直前ノードを解放することができる。
【００７２】
図１１Ａは、ホスト２０のスナップショットマネージャ２０２からスナップショット指示を受けた際に行われる処理のフローチャートの一例を示す。
【００７３】
例えば、制御プログラム１１８は、ホスト２０のスナップショットマネージャ２０２から、ＰＶＯＬ１のスナップショットの取得指示を受け取ると（ステップＳ２０００）、世代カウンタ管理テーブルＴｂ１２において、ＰＶＯＬ１のスナップショット世代に対応するカウンタ値を１増加させ（ステップＳ２０１０）。そして、制御プログラム１１８は、ＰＶＯＬ１の履歴テーブルＴｂ１３において、その更新時刻とともに、スナップショットを更新したことを記録する（ステップＳ２０２０）。次に、制御プログラム１１８は、ＰＶＯＬ１のＣｏＷ管理ビットマップＭｐ９をすべてクリア（すべてＯＦＦ）にする（ステップＳ２０３０）。
【００７４】
図１１Ｂは、更新差分データとＣｏＷデータとで重複する部分を削除することでＤＶＯＬの使用量を削減する処理のフローチャートの一例を示す。
【００７５】
このフローチャートは、例えば、ホスト２０からスナップショット指示を受信した際に、制御プログラム１１８によって実行される。すなわち、制御プログラム１１８は、スナップショット指示を受信すると、ＤＶＯＬ１のブロック使用量管理テーブルＴｂ８を参照し、ＤＶＯＬ１の使用量が、所定の基準値以上か否かのチェックを行う（ステップＳ３０００）。この基準値は、例えば、ディスクコントローラ１１のメモリに記憶させておくことができる。この基準値は、管理端末３１を通じてユーザによって設定することができる。なお、この基準値は、ユーザによって設定されていなくてもよい。その場合、制御プログラム１１８が、初期値として予め用意された基準値を用いる形態としてもよいし、定期的にこの図１１Ｂに例示するフローを実行し、なるべく重複データを削除する形態としても良い。
【００７６】
上記使用量が基準値以上であった場合（ステップＳ３０００：Ｙｅｓ）、制御プログラム１１８は、直前回に取得されたスナップショットの世代（ステップＳ２０１０でインクリメント後のカウンタ値が表す世代）以前の世代の更新差分データを解放する（ステップＳ３０１０）。すなわち、制御プログラム１１８は、この図１１Ｂの処理を行う契機となったスナップショットの二世代前のスナップショットの基準時刻よりも以前にＤＶＯＬ１に書かれた更新差分データをＤＶＯＬ１から解放する。具体的には、例えば、制御プログラム１１８は、履歴テーブルＴｂ１３を参照し、解放する更新差分データの世代を特定する。例えば、図９Ｂに例示した履歴テーブルＴｂ１３において、本処理の開始のきっかけとなったのが、３世代目のスナップショットとすると、２世代前のスナップショットは「スナップショット＃１」となる。「スナップショット＃１」より以前に取得された更新差分は「更新差分＃１」である。従って、１世代目の更新差分データがＤＶＯＬ１からの解放対象であることがわかる。
【００７７】
当該世代（最新のスナップショットの世代の２世代前）の更新差分データをＤＶＯＬ１から解放した後、制御プログラム１１８は、履歴テーブルから解放した「更新差分＃１」の項目を解放し（ステップＳ３０２０）、且つ、解放された更新差分データのノードもリストＬｓｔ１１（図８参照）から解放し、ブロック使用量管理テーブルを更新する（ステップＳ３０３０）。
【００７８】
図１２は、図１０、図１１Ａ及び図１１Ｂで示した処理流れの理解を助けるために、ＰＶＯＬ１およびＤＶＯＬ１上での時間経過に伴うデータの変化を模式的に示した図である。
【００７９】
図１２において、縦軸ｔ０、ｔ１、・・・は、各時点での時刻を表し、横軸「ＰＶＯＬ１上のデータ」は、ブロックアドレス５００１，５００２，５００３におけるデータを示している。同様に、横軸「ＤＶＯＬ１上のデータ」は、更新差分データとＣｏＷデータの様子を示している。
【００８０】
時刻ｔ０において、ＰＶＯＬ１上のブロックアドレス５００１，５００２，５００３に、それぞれ、データ"１"、"Ａ"、"ａ"が書き込まれると、図１０の処理によって、ＤＶＯＬ１上に更新差分データ"１"、"Ａ"、"ａ"がそれぞれ書かれる（参照：ステップＳ１０３０〜１０８０）。また、それと同時刻に、整合性を取る契機の１つである"Ｓｙｎｃ"コマンドが発行されたため、更新差分の世代が１つ上がり（つまり、ＰＶＯＬ１に対応した更新差分のカウンタ値が０から１に変わり）、１世代目の更新差分データが確定する（参照：ステップＳ１０１０、Ｓ１１００、Ｓ１１１０）。
【００８１】
次に、時刻ｔ１の前に、スナップショット指示を受信すると、図１１Ａの処理によって、時刻ｔ０におけるＰＶＯＬ１のデータが、スナップショットで保護されるようになる。
【００８２】
次に、時刻ｔ１において、ブロックアドレス５００１、５００３に、それぞれ"２"と"ｂ"をそれぞれ書き込むための書込みコマンドが発行されると、図１０の処理（参照：ステップＳ１０００〜１０９０）の繰り返しによって、ＣｏＷデータとして、"１"と"ａ"が退避され、更新差分データとして、"２"及び"ｂ"が記録される。また、ＰＶＯＬ１上のデータも、図１２に示す通りに更新される。
【００８３】
次に、時刻ｔ２において、ブロックアドレス５００２，５００３に、それぞれ"Ｂ"、"ｃ"に書き換える書込みコマンドが発行されると、図１０の処理によって、ＣｏＷデータとして、"Ａ"が退避される。また、時刻ｔ２の直前の時刻ｔ１で"Ｓｙｎｃコマンド"がなかったことから、この時刻ｔ２では、ステップＳ１０９０およびＳ１３００〜１３２０の処理によって、更新差分データ"ｂ"が解放され、"ｃ"、"Ｂ"が更新差分データとして記録される。別の言い方をすれば、データの整合性を取れる契機か直前時刻でなかった場合には、制御プログラム１１８は、今回の時刻ｔ２でＰＶＯＬ１に上書きされる前のデータ"ｂ"と同じ更新差分データ"ｂ"を、ＤＶＯＬ１から解放し、且つ、ＰＶＯＬ１上のデータ"ｂ"を、ＣｏＷデータとしてＤＶＯＬ１に退避しないようにする。この時刻ｔ２では、"Ｓｙｎｃコマンド"の発行によって、２世代目の更新差分データが確定される。
【００８４】
次に、時刻ｔ３において、ブロック５００１，５００３にそれぞれ"３"、"ｄ"を書き込むための書込みコマンドが発行されると、更新差分データとして"３"、"ｄ"がＤＶＯＬ１上に記録される。一方、それらのブロック５００１，５００３について、既に、ＣｏＷデータの退避が行われているため（つまり時刻ｔ１でＣｏＷが行われているため）、この時刻ｔ３において、ＣｏＷは起こらない。時刻３で、"Ｓｙｎｃコマンド"の発行によって、３世代目の更新差分データが確定される。
【００８５】
時刻ｔ４の前に、２回目のスナップショット指示により、時刻ｔ３におけるＰＶＯＬ１のイメージがスナップショットとして保護される。そして、これにより、ＰＶＯＬ１のＣｏＷ管理ビットマップＭｐ９の全ビットはＯＦＦにされる。
【００８６】
時刻ｔ４において、ブロック５００３にデータ"ｅ"を書き込むためのコマンドが発行されると、ＣｏＷデータとして"ｄ"がＰＶＯＬ１から退避され、更新差分データとして"ｅ"がＤＶＯＬ１上に記録され、ＰＶＯＬ１のデータが更新される。また、同時刻４の"Ｓｙｎｃコマンド"により、４世代目の更新差分データが確定する。
【００８７】
図１３を参照して、リカバリ制御について説明する。図１３は、障害が発生し不整合となったデータをリカバリするために、最近の整合性のとれた状態へデータをリカバリさせる処理のフローチャートの一例を示す。なお、この処理は、ユーザから指示があった場合に実行することができる。指示は、ホスト２０、２１、２２もしくは管理端末３１から出すことができる。
【００８８】
例えば、制御プログラム１１８は、ホスト２０からＰＶＯＬ１のリカバリ指示を受け取ると（ステップＳ４０００）、ＰＶＯＬ１に対応した履歴テーブルＴｂ１３を参照し、整合性の取れる更新差分最終世代よりも前の直近のスナップショット世代を探して見つける（ステップＳ４０１０、Ｓ４０２０）。なお、「更新差分最終世代」とは、更新差分データの整合性が取れた最近の時点における更新差分データの世代のことである。
【００８９】
次に、制御プログラム１１８は、そのスナップショット世代を表す世代ビットに対応したＤＶＯＬ１上のアドレスをスナップショット世代管理リストＬｓｔ１０から特定し、特定されたアドレスのブロックに存在するＣｏＷデータを、ＤＶＯＬ１からＰＶＯＬ１へと戻す（ステップＳ４０３０）。
【００９０】
スナップショットのリカバリが完了した後、制御プログラム１１８は、上記の更新差分最終世代を表す世代ビットに対応したＤＶＯＬ１上のアドレスを、更新差分データ管理リストＬｓｔ１１から特定し、特定されたアドレスのブロックに存在する更新差分データを、ＤＶＯＬ１からＰＶＯＬ１へと戻す（ステップＳ４０４０）。
【００９１】
以上の処理により、リカバリが完了する。図１２を参照して説明すると、例えば、ＰＶＯＬ１にデータ"４"、"Ｃ"、"ｆ"が存在する状態で、時刻ｔ５においてＰＶＯＬ１に障害が生じた場合に、リカバリ指示を受けたとする。このため、上記のステップＳ４０１０及びＳ４０２０の処理が行われることにより、更新差分最終世代は四世代目ということがわかり、それと直近のスナップショット世代は二世代目ということがわかる。制御プログラム１１８は、スナップショット世代として二世代目を表す世代ビットのＤＶＯＬ１のアドレスをスナップショット世代管理リストＬｓｔ１０から探し、そのアドレスに存在するＣｏＷデータ"３"、"Ｂ"、"ｄ"を、ＤＶＯＬ１からＰＶＯＬ１に戻す。次に、制御プログラム１１８は、更新差分最終世代として四世代目を表す世代ビットのＤＶＯＬ１のアドレスを更新差分データ管理リストＬｓｔ１１から探し、そのアドレスに存在する更新差分データ"ｅ"を、ＤＶＯＬ１からＰＶＯＬ１に戻す。これにより、更新差分最終世代が四世代目の時点のデータ"３"、"Ｂ""、ｅ"が、ＰＶＯＬ１にリカバリされることになる。
【００９２】
以上、上述した実施形態によれば、ユーザからの明示的な指示（つまり、ユーザの手動による指示）のほかに、データの整合性の取れる契機を取得し、その契機で、更新差分データを確定するので、ホストの負荷を増大させずに、時間粒度の細かいデータ保護が可能になる。
【００９３】
また、上述した実施形態によれば、ＤＶＯＬに存在する複数のデータのうち、更新差分最終世代よりも前の直近のスナップショット世代のＣｏＷデータをＰＶＯＬに戻す第一のステップと、その後に、更新差分最終世代の更新差分データをＰＶＯＬに戻す第二のステップで、更新差分最終世代の時点、つまり、最後に整合性が取れた時点のＰＶＯＬがリカバリされる。これにより、例えば、従来のジャーナリング技術のように順次にデータを再生していくことよりも高速なリカバリが期待できる。
【００９４】
また、上述した実施形態によれば、新データの複製が生成されそれが更新差分データとしてＤＶＯＬに書き込まれる。ＣｏＷでは、ＰＶＯＬからデータを読出すという、ＰＶＯＬへのアクセスが発生するが、上記実施形態では、新データがＰＶＯＬに書かれる都度に、新データの複製を用意してＤＶＯＬに書くようになっているので、ＰＶＯＬへのアクセス負荷を発生させることなく（つまりＰＶＯＬへのアクセス性能を落とすことなく）、時間粒度の細かいデータ保護が可能になる。
【００９５】
また、上述した実施形態によれば、ＤＶＯＬ内で更新差分データとＣｏＷデータとが重複したか否かが所定のタイミングで判別され、重複したと判別された場合には、一方が削除されて他方が残される。これにより、ＤＶＯＬの消費量を節約することができる。
【００９６】
以上、本発明の好適な実施形態を説明したが、これは本発明の説明のための例示であって、本発明の範囲をこの実施形態にのみ限定する趣旨ではない。本発明は、他の種々の形態でも実施することが可能である。
【００９７】
例えば、ＤＶＯＬは、ディスク装置に代えて又は加えて、ディスクアレイコントローラ１１のメモリ上に用意されても良い。この場合、更新差分データ及びＣｏＷデータの両方が、メモリに書き込まれても良いし、一方がメモリに書き込まれ他方がディスク装置に書き込まれても良い。
【００９８】
また、例えば、ＤＶＯＬは、更新差分データを記憶するための領域と、ＣｏＷデータを記憶するための領域とに区分されていてもよい。
【図面の簡単な説明】
【００９９】
【図１】図１は、本発明の一実施形態に係るディスクアレイ装置の概略構成例を示す説明図である。
【図２】図２Ａは、図１のディスクアレイ装置の外観図である。図２Ｂは、ディスクアレイコントローラの構成例を示す。
【図３】図３は、ディスク装置と論理ボリュームの関係例を表す概念図である。
【図４】図４Ａは、ＶＯＬ構成管理テーブルの構成例を示す。図４Ｂは、ＶＯＬ対応管理テーブルの構成例を示す。
【図５】図５は、本実施例におけるＰＶＯＬ１、ＰＶＯＬ２、ＤＶＯＬ１との関連を模式的に示したものである。
【図６】図６Ａは、ＤＶＯＬ１の空きブロック管理リストの構成例を示す。図６Ｂは、ＤＶＯＬ１のブロック使用量管理テーブルの構成例を示す。
【図７】図７Ａは、ＰＶＯＬ１のスナップショットの管理のために用いられるＣｏＷ管理ビットマップの構成例を示す。図７Ｂは、ＰＶＯＬ１のスナップショット世代管理リストの一例を示す。
【図８】図８は、ＰＶＯＬ１の更新差分データ管理リストの一例を示す。
【図９】図９Ａは、世代カウンタ管理テーブルの一例を示す。図９Ｂは、スナップショット・更新差分履歴テーブルの構成例を示す。
【図１０】図１０は、ホストからコマンドを受信した際に行われる処理のフローチャートの一例を示す。
【図１１】図１１Ａは、ホスト２０のスナップショットマネージャ２０２からスナップショット指示を受けた際に行われる処理のフローチャートの一例を示す。図１１Ｂは、更新差分データとＣｏＷデータとで重複する部分を削除することでＤＶＯＬの使用量を削減する処理のフローチャートの一例を示す。
【図１２】図１２は、ＰＶＯＬ１およびＤＶＯＬ１上での時間経過に伴うデータの変化を模式的に示した図である。
【図１３】図１３は、データをリカバリさせる処理のフローチャートの一例を示す。
【図１４】図１４Ａは、２つのライトコマンド間に整合性契機があった場合の各ノードの世代ビットの様子の一例を示す図。図１４Ｂは、２つのライトコマンド間に整合性契機がなかった場合の各ノードの世代ビットの様子の一例を示す図。
【符号の説明】
【０１００】
１…ディスクアレイ装置  １１、１２…ディスクアレイコントローラ  １０１、１０２、１０３…信号線  １１８…データバッファ領域  １１９…制御プログラム  １３０、１３１、１３２…接続インターフェース  Ｄ００〜Ｄ２Ｎ…ディスク装置  Ｅ００〜Ｅ８０…ディスク筐体  ２０、２１、２２…ホスト  ３０…管理用ネットワーク  ３１…管理端末  ３２…管理画面  ４０…ストレージネットワーク  Ｌｓｔ７…管理テーブル  Ｌｓｔ１０…スナップショット世代管理リスト  Ｌｓｔ１１…更新差分データ管理リスト  Ｍｐ９…ＣｏＷ管理ビットマップ  Ｔｂ４…ＶＯＬ構成管理テーブル  Ｔｂ５…ＶＯＬ対応管理テーブル  Ｔｂ８…ブロック使用量管理テーブル  Ｔｂ１２…世代カウンタ管理テーブル  Ｔｂ１３…スナップショット・更新差分履歴テーブル
【図１】
0004749112.tif 000002
【図２】
0004749112.tif 000003
【図３】
0004749112.tif 000004
【図４】
0004749112.tif 000005
【図５】
0004749112.tif 000006
【図６】
0004749112.tif 000007
【図７】
0004749112.tif 000008
【図８】
0004749112.tif 000009
【図９】
0004749112.tif 000010
【図１０】
0004749112.tif 000011
【図１１】
0004749112.tif 000012
【図１２】
0004749112.tif 000013
【図１３】
0004749112.tif 000014
【図１４】
0004749112.tif 000015