以下図面について、本発明の一実施の形態を詳述する。
(1)本実施の形態による計算機システム
図1において、1は全体として本実施の形態による計算機システムを示す。この計算機システム1は、1又は複数のネットワーク2を介して接続されたホスト計算機3及びディスクアレイ装置4を備えて構成される。
ネットワーク2は、例えばSAN(Storage Area Network)、LAN、インターネット、公衆回線又は専用回線などから構成される。このネットワーク2を介したホスト計算機3及びディスクアレイ装置4間の通信は、例えばネットワーク2がSANである場合にはファイバーチャネルプロトコルに従って行われ、ネットワーク2がLANである場合にはTCP/IP(Transmission Control Protocol/Internet Protocol)プロトコルに従って行われる。
ホスト計算機3は、CPU(Central Processing Unit)及びメモリ等の情報処理資源を備えたコンピュータ装置であり、例えばパーソナルコンピュータや、ワークステーション、メインフレームなどから構成される。ホスト計算機3は、キーボード、スイッチやポインティングデバイス、マイクロフォン等の情報入力装置(図示せず)と、モニタディスプレイやスピーカ等の情報出力装置(図示せず)とを備える。
ディスクアレイ装置4は、複数の記憶デバイス10と、これら複数の記憶デバイス10に対するデータの入出力を制御するコントローラ11とを備えて構成される。
記憶デバイス10は、例えばSCSI(Small Computer System Interface)ディスク等の高価なディスクデバイス、又はSATA(Serial AT Attachment)ディスクや光ディスク等の安価なディスクデバイスなどから構成される。
これらの記憶デバイス10は、コントローラ11によりRAID(Redundant Arrays of Inexpensive Disks)方式で運用される。1又は複数の記憶デバイス10により提供される物理的な記憶領域上に、1又は複数の論理ボリュームVOLが設定される。そしてデータは、この論理ボリュームVOL内に所定大きさ(以下、64〔KB〕とする)のブロック(以下、これを論理ブロックと呼ぶ)を単位として記憶される。
各論理ボリュームVOLには、それぞれ固有の識別番号(以下、これをLUN(Logical Unit number)と呼ぶ)が付与されると共に、各論理ブロックには、それぞれ対応する論理ボリューム内で固有の識別番号(以下、これをLBA(Logical Block Address)と呼ぶ)が付与される。本実施の形態の場合、データの入出力は、これらLUN及びLBAを組み合わせたものをアドレスとして、当該アドレスを指定して行われる。
コントローラ11は、それぞれフロントエンドインタフェース12、データ転送コントローラ13、バックエンドインタフェース14、キャッシュメモリ15、ローカルメモリ16及びCPU17を備えて構成される。
フロントエンドインタフェース12は、ネットワーク2と接続される1又は複数の通信ポートを備える。通信ポートには、例えばIP(Internet Protocol)アドレスやWWN(World Wide Name)などの固有のネットワークアドレスがそれぞれ割り当てられる。このフロントエンドインタフェース12は、ネットワーク2を介したホスト計算機3との通信時におけるプロトコル制御を行う機能を有しており、このフロントエンドインタフェース12のプロトコル制御機能により、ホスト計算機3及びディスクアレイ装置4間においてFCプロトコルやiSCSIプロトコル等に従ったデータやコマンドの送受が行われる。
データ転送コントローラ13は、コントローラ11の制御のもとに、フロントエンドインタフェース12、キャッシュメモリ15、バックエンドインタフェース14及びコントローラ17間の接続関係を切り替える機能を有するもので、例えばPCIe(PCI(peripheral component interconnect)Express)スイッチから構成される。
バックエンドインタフェース14は、記憶デバイス10に対するインタフェースであり、CPU及びメモリなどの情報処理資源を備える。このバックエンドインタフェース14は、フロントエンドインタフェース12から与えられるホスト計算機3からのライトコマンドやリードコマンドに応じて対応する記憶デバイス10を制御することにより、リードデータやライトデータをリードコマンドやライトコマンドにおいて指定された論理ボリュームVOL内の当該リードコマンド又はライトコマンドにおいて指定されたアドレス位置に読み書きする。
キャッシュメモリ15は、例えばSDRAM(Synchronous Dynamic Random Access Memory)等の揮発メモリから構成され、主として記憶デバイス10に読み書きするデータを一時的に記憶するために用いられる。スナップショットを管理するために利用される後述の管理情報も、記憶デバイス10から読み出されてこのキャッシュメモリ15に格納されて保持される。
ローカルメモリ16は、各種制御プログラムを格納するために用いられるほか、ホスト計算機3から与えられるリードコマンドやライトコマンド等の各種コマンドを一時的に保持するために用いられる。CPU17は、このローカルメモリ16に保持されたリードコマンドやライトコマンドを、当該ローカルメモリ16に保持された順番で処理する。後述するスナップショット制御プログラムは、このローカルメモリ16に格納されて保持される。
CPU17は、ディスクアレイ装置4全体の動作制御を司るプロセッサである。CPU17は、複数のコアを備える。各コアは適切なソフトウェア環境において複数のソフトウェア・スレッドを並列に実行する。各コアには、それぞれ1又は2以上の論理ボリュームVOLが割り当てられる。そして各コアは、自己に割り当てられた論理ボリュームVOLに対するデータのリード/ライト処理の制御等を担当する。
(2)本実施の形態によるスナップショット機能
次に、かかるディスクアレイ装置に搭載された本実施の形態によるスナップショット機能について説明する。
(2−1)スナップショットの論理構成
図2は、本ディスクアレイ装置におけるスナップショットの論理構成を示す。本ディスクアレイ装置4の場合、スナップショットは、プライマリボリュームPVOL、スナップショットボリュームSSVOL及びデータプールDPの3つのボリュームから構成される。
プライマリボリュームPVOLは、ホスト計算機3に提供される論理ボリュームVOLであり、ホスト計算機3からのデータが読み書きされる。このプライマリボリュームPVOLは、通常の実体を有する論理ボリュームVOL及び実体を有さない仮想的な論理ボリュームVOLのいずれであってもかまわない。
スナップショットボリュームSSVOLは、スナップショットのデータを保持する仮想的な論理ボリュームであり、プライマリボリュームPVOLとコピーペアに設定される。このコピーペアの状態(ペア状態)としては、「ペアード(paired)」、「スプリット(split)」及び「シンプレックス(simplex)」などがある。
「ペアード」は、プライマリボリュームPVOL及びスナップショットボリュームSSVOLがミラーになっている状態を指し、「スプリット」は、プライマリボリュームPVOLからスナップショットボリュームSSVOLへのデータライトが行われない状態を指す。従って、コピーペアのペア状態を「ペアード」から「スプリット」に切り替えることによって、その時点におけるプライマリボリュームPVOLの静的なデータイメージ(つまりスナップショット)がそのコピーペアを形成するスナップショットボリュームSSVOLによって保持されることになる。以下においては、かかるコピーペアのペア状態を「ペアード」から「スプリット」に切り替えることを、「スナップショットボリュームSSVOLをプライマリボリュームPVOLから分割する」又は「スナップショットを取得する」と呼ぶものとする。また「シンプレックス」は、スナップショットボリュームSSVOLにおいてスナップショットを保持しておらず、かつ、プライマリボリュームPVOLと、スナップショットボリュームSSVOLとが「ペアード」でもない状態を指す。
データプールDPは、スナップショットの管理情報と、プライマリボリュームPVOLから退避された旧データとが格納される論理ボリュームVOLである。スナップショットが取得された場合、その後にプライマリボリュームPVOLを対象とするライトコマンドがディスクアレイ装置4に与えられると、そのライトコマンドに基づくライト処理により更新される直前のプライマリボリュームPVOL内のデータ(旧データ)がデータプールDPに退避される。これにより、データプールDPに退避されたデータと、プライマリボリュームPVOLに残存するデータ(更新されていないデータ)とを組み合わせることで、かかるライト処理によりデータが更新される直前のプライマリボリュームPVOLのデータイメージ(スナップショット)を復元することができる。
なお本実施の形態の場合、ディスクアレイ装置4では、同一のプライマリボリュームPVOLに対して最大1024個のスナップショットボリュームSSVOLを設定することができる。従って、本実施の形態の場合、ディスクアレイ装置4は、同一のプライマリボリュームPVOLに対して最大1024個のスナップショットを取得することができる。
(2−2)ディスクアレイ装置におけるデータプールへのデータ格納方式
上述のように、本ディスクアレイ装置4においては、プライマリボリュームPVOLから退避させた旧データに加えて、各スナップショットの管理情報をもデータプールDP内に保持している。そして、これらスナップショットの管理情報は必要となったタイミングでデータプールDPからキャッシュメモリ15に読み込まれ、不要となった段階でデータプールDPに戻される。
図3は、ディスクアレイ装置4における各スナップショットの管理情報と、プライマリボリュームPVOLから退避された旧データとのデータプールDPへの格納方式を示す。
この図3に示すように、本ディスクアレイ装置4では、データプールDPの記憶領域を、所定サイズ(例えば1〔GB〕)の複数の領域単位(以下、これをチャンクと呼ぶ)に区分し、これらチャンク単位で管理している。そしてプライマリボリュームPVOLが作成されるごとに、そのプライマリボリュームPVOLに対して、当該プライマリボリュームPVOLについて取得されたスナップショットの管理情報を格納するためのチャンク(以下、これを管理情報格納用チャンクと呼ぶ)CK1と、そのプライマリボリュームPVOLから退避された旧データを格納するためのチャンク(以下、これを旧データ退避用チャンクと呼ぶ)CK2とをそれぞれ割り当てるようになされている。
従って、本ディスクアレイ装置4の場合、プライマリボリュームPVOLごとに異なる管理情報格納用チャンクCK1及び旧データ退避用チャンクCK2が割り当てられることとなり、異なるプライマリボリュームPVOLについて取得されたスナップショットの管理情報が同一の管理情報格納用チャンクCK1に格納されたり、異なるプライマリボリュームPVOLから退避された旧データが同一の旧データ退避用チャンクCK2に格納されることはない。
これにより本ディスクアレイ装置4においては、例えばプライマリボリュームPVOLが削除された場合など、1つのプライマリボリュームPVOLに対して割り当てられた管理情報格納用チャンクCK1及び又は旧データ退避用チャンクCK2が不要となったときに、他のプライマリボリュームPVOLの状況に関わりなく、その管理情報格納用チャンクCK1及び又は旧データ退避用チャンクCK2を解放することができる。
なお、本ディスクアレイ装置4の場合、図4に示すように、データプールDP内の個々のチャンク(管理情報格納用チャンクCK1及び旧データ退避用チャンクCK2を含む)がそれぞれ何に使用されているかを表すデータプールDPごとのチャンク管理情報17と、各プライマリボリュームPVOLにそれぞれ割り当てた個々のチャンクを特定するためのチャンク特定情報18からなるボリューム割当てチャンク特定情報19とをキャッシュメモリ15内に保持しており、これらチャンク管理情報17及びボリューム割当てチャンク特定情報19に基づいて、プライマリボリュームPVOLに対するチャンクの割当て処理などを行っている。
従って、「チャンクの解放」とは、チャンク管理情報17におけるそのチャンクのステータスを、そのチャンクが未使用であることを表す「未割当て」に変更し、さらに対応するボリューム割当てチャンク特定情報19における対応するプライマリボリュームと対応付けられたそのチャンクのチャンク特定情報18を削除することを意味する。
プライマリボリュームPVOLに対する管理情報格納用チャンクCK1の割り当ては、プライマリボリュームPVOLが作成されたタイミングで行われる。そして、この後、プライマリボリュームPVOL及びスナップショットボリュームSSVOLから構成されるコピーペアが分割された後(スナップショットが取得された後)、プライマリボリュームPVOLに対する最初のリードアクセス又はライトアクセスがあったタイミングで、そのスナップショットに対して管理情報格納用チャンクCK1内の記憶領域SA1が所定大きさ単位(例えば128〔MB〕単位)で割り当てられ、その記憶領域SA1内にそのスナップショットの管理情報が格納される。
またプライマリボリュームPVOLに対する旧データ退避用チャンクCK2の対応付けは、プライマリボリュームPVOLに格納されたデータをデータプールDPに退避させる必要が生じたタイミングで行われる。そして、この後、そのプライマリボリュームPVOLから退避された旧データがその旧データ退避用チャンクCK2に順次格納される。なお、プライマリボリュームPVOLからの旧データの退避は論理ブロック単位(64〔KB〕単位)で行われる。従って、プライマリボリュームPVOLの1つの論理ブロックから旧データが退避される場合に旧データ退避用チャンクCK2から当該データの格納先として割り当てられる記憶領域SA2のサイズは論理ブロックと同じ64〔KB〕となる。
(2−3)スナップショット管理情報
次に、スナップショットに関する各種管理情報(以下、適宜、これをスナップショット管理情報と呼ぶ)の具体的な内容について説明する。本ディスクアレイ装置4の場合、かかるスナップショット管理情報として、図5に示すように、ペア管理テーブル20及び分割順番号−世代番号マッピングテーブル27がキャッシュメモリ15に格納され、スナップショット差分ビットマップ21、プライマリボリューム差分ビットマップ22、スナップショット差分集約ビットマップ23、旧データ退避アドレステーブル24、旧データ退避領域空きビットマップ25、旧データ退避未反映ビットマップ26及びスナップショットライト差分ビットマップ28がデータプールDPの管理情報格納用チャンクCK1に格納されている。
(2−3−1)ペア管理テーブル
ペア管理テーブル20は、プライマリボリュームPVOL及びスナップショットボリュームSSVOLから構成される各コピーペアのペア状態等を管理するために用いられるテーブルであり、プライマリボリュームPVOLごとにそれぞれ作成される。
このペア管理テーブル20は、図6に示すように、同一のプライマリボリュームPVOLに対して設定可能なコピーペアのペア数の最大値と同じ数のエントリ(列)20Aを備えて構成される。本実施の形態の場合、上述のように同一のプライマリボリュームPVOLに対して設定可能なコピーペアの最大ペア数は1024個であるため、これと同じ数のエントリ20Aがペア管理テーブル20に用意されていることになる。
各エントリ20Aは、それぞれペア番号欄20B、ペア状態欄20C、LUN欄20D及び世代番号欄20Eを含む複数の欄に区分されている。そしてペア番号欄20Bには、対応するコピーペアに対して付与された識別番号(以下、これをペア番号と呼ぶ)が格納される。またペア状態欄20Cには、そのコピーペアのペア状態が格納され、LUN欄20Dには、そのコピーペアを構成するスナップショットボリュームSSVOLに付与されたLUNが格納される。さらに世代番号欄20Eには、そのスナップショットボリュームSSVOLにより保持されているスナップショットの世代番号が格納される。なお、世代番号の詳細については後述する。
従って、例えば図6では、「PN0」というペア番号のコピーペアは、このペア管理テーブル20と対応付けられたプライマリボリュームPVOLと、「2」というLUNが付与されたスナップショットボリュームSSVOLとから構成され、そのコピーペアの現在のペア状態が「スプリット(Split)」であり、世代番号が「2」のスナップショットが当該スナップショットボリュームSSVOLにより保持されていることが示されている。
このペア管理テーブル20は、新たなコピーペアの作成時やコピーペアの操作時などに更新される。例えば、スナップショットボリュームSSVOLが新たに作成された場合、そのスナップショットボリュームSSVOLに対して1つのエントリ20Aが割り当てられ、そのエントリ20Aのペア番号欄20Bに、そのスナップショットボリュームSSVOLと、プライマリボリュームPVOLとで構成されるコピーペアに対して付与されたペア番号が格納される。また、そのエントリ20Aのペア状態欄20Cには、そのコピーペアのペア状態として「シンプレックス」が格納され、当該エントリ20AのLUN欄20Dには、そのスナップショットボリュームSSVOLのLUNが格納される。さらに、この後、そのスナップショットボリュームSSVOLがプライマリボリュームPVOLから分割されて新たなスナップショットが取得された場合、ペア管理テーブル20における対応するペア状態欄20Cが「ペアード」から「スプリット」に更新される。
(2−3−2)スナップショット差分ビットマップ
スナップショット差分ビットマップ21は、各スナップショット内の個々の論理ブロックのデータをデータプールDPに退避済みであるか否かを管理するために用いられるビットマップであり、プライマリボリュームPVOLごとに作成される。なお、以下の説明においては、同一のプライマリボリュームPVOLについて取得された個々のスナップショットを区別するため、「世代」及び「世代番号」という用語を用いる。本明細書における「世代」及び個々の「世代」に対して付与された識別番号である「世代番号」は、後述するように、取得されたスナップショットに対して任意に付与された「0」から始まる番号にすぎず、そのスナップショットが取得された順番(そのスナップショットを保持するスナップショットボリュームSSVOLがプライマリボリュームPVOLから分割された順番)を表すものではない。
スナップショット差分ビットマップ21は、図7に示すように、第1のエントリ(列)21Aと、同一のプライマリボリュームPVOLについて取得可能な最大数のスナップショットの世代数と同じ数の第2のエントリ(列)21Bとを備えて構成される。本実施の形態の場合、上述のように同一のプライマリボリュームPVOLについて最大1024個のスナップショットを取得可能であるため、これと同じ数の第2のエントリ21Bが予めスナップショット差分ビットマップ21に設けられている。
第1のエントリ21Aは、プライマリボリュームPVOL内の各論理ブロックとそれぞれ対応付けられた複数のLBA欄21AAに区分されている。そして、これらLBA欄21AAには、それぞれ対応する論理ブロックのLBAが順番に格納されている。
また各第2のエントリ21Bは、それぞれプライマリボリュームPVOL内の各論理ブロックとそれぞれ対応付けられた複数の差分ビット欄21BAに区分されている。そして各差分ビット欄21BAには、それぞれ対応する世代のスナップショット内の対応する論理ブロックのデータをデータプールDPに退避済みであるか否かを表す差分ビットが格納されている。
実際上、この差分ビットは、初期時は「0」に設定されており、対応する世代のスナップショットにおける対応する論理ブロックのデータがデータプールDPに退避される際に「1」に更新される。従って、差分ビットの「1」は、対応する世代のスナップショットにおける対応する論理ブロックのデータがデータプールDPに退避されていることを表し、差分ビットの「0」は、対応する世代のスナップショットにおける対応する論理ブロックのデータがデータプールDPに退避されていないことを表している。
(2−3−3)プライマリボリューム差分ビットマップ
プライマリボリューム差分ビットマップ22は、同一のプライマリボリュームPVOLについて取得されたすべての世代のスナップショットにおいて、同じLBAの論理ブロック内のデータをデータプールDPに退避済みであるか否かを管理するために利用されるビットマップであり、プライマリボリュームPVOLごとに作成される。
このプライマリボリューム差分ビットマップ22は、図8に示すように、第1及び第2のエントリ(列)22A,22Bを備えて構成される。そして第1のエントリ22Aは、対応するプライマリボリュームPVOL内の各論理ブロックとそれぞれ対応付けられた複数のLBA欄21AAに区分されており、これらLBA欄21AAに、それぞれ対応する論理ブロックのLBAが格納されている。
また第2のエントリ22Bは、第1のエントリの各LBA欄21AAとそれぞれ対応させて設けられた複数の差分ビット欄22BAに区分されている。そして各差分ビット欄22BAには、それぞれそのプライマリボリュームPVOLについて取得されたすべての世代のスナップショットにおいて、対応するLBAの論理ブロックのデータがすべてデータプールDPに退避済みであるか否かを表す差分ビットが格納されている。
具体的に、差分ビットは、対応するプライマリボリュームPVOLについて取得されたすべての世代のスナップショットにおいて、対応するLBAの論理ブロックのデータがデータプールDPに退避されている場合には「1」に設定され、いずれかの世代のスナップショットにおいて、対応するLBAの論理ブロックのデータがデータプールDPに退避されていない(未退避)の場合には「0」に設定される。
このプライマリボリューム差分ビットマップ22は、対応するプライマリボリュームPVOLにデータが書き込まれた場合に、プライマリボリュームPVOLにおけるそのデータが書き込まれた論理ブロックと対応付けられた差分ビット欄22BAの差分ビットが「1」に設定される。これは、後述のように、プライマリボリュームPVOLにデータが書き込まれた場合、そのデータが書き込まれた論理ブロックのうちの未だデータ退避が行われていないすべての世代のスナップショットについてデータの退避が行われ、結果的にそのとき取得されているすべての世代のスナップショットにおいて、その論理ブロックのデータが旧データとしてデータプールDPに退避されることになるからである。
またこのプライマリボリューム差分ビットマップ22は、新しい世代のスナップショットが取得されると、すべての差分ビット欄22BAの差分ビットが「0」に設定される。これは、取得直後のスナップショットでは、いずれの論理ブロックのデータもデータプールDPに退避されていないからである。
(2−3−4)スナップショット差分集約ビットマップ
一方、スナップショット差分集約ビットマップ23は、スナップショット差分ビットマップ21における個々の差分ビットにより表される情報を、スナップショットごとに、かつ、所定個数の論理ブロックごとの情報に集約したビットマップであり、プライマリボリュームPVOLごとに作成される。
実際上、スナップショット差分集約ビットマップ23は、図9に示すように、第1のエントリ(列)23Aと、同一のプライマリボリュームPVOLについて取得可能な最大数のスナップショットの世代数と同じ数の第2のエントリ(列)23Bとを備えて構成される。本実施の形態の場合、上述のように同一のプライマリボリュームPVOLについて取得可能なスナップショットの世代数の最大値は1024であるため、これと同じ数の第2のエントリ23Bがスナップショット差分集約ビットマップ23に設けられている。
第1のエントリ23Aは、プライマリボリュームPVOL内のLBAが連続する所定個数(図9では16個)の論理ブロックを1つの論理ブロック群として、各論理ブロック群とそれぞれ対応付けられた複数の集約LBA欄23AAに区分されている。そして各集約LBA欄23AAには、それぞれ対応する論理ブロック群を構成する各論理ブロックのLBAが格納されている。
また各第2のエントリ23Bは、第1のエントリ23Aと同様に、それぞれ上述の各論理ブロック群とそれぞれ対応付けられた複数の差分ビット欄(以下、これを差分集約ビット欄と呼ぶ)23BAに区分されている。そして各差分集約ビット欄23BAには、それぞれ対応する世代のスナップショットにおける、対応する論理ブロック群のデータの退避状態を表す差分集約ビットが格納される。
具体的に、差分集約ビットは、スナップショット差分ビットマップ21(図7)における対応する論理ブロック群を構成する各論理ブロックとそれぞれ対応付けられたすべての差分ビットがすべて「0」である場合には「0」に設定され、これ以外の場合には「1」に設定される。また差分集約ビットは、対応するプライマリボリュームPVOL又はスナップショットの対応する論理ブロックにデータの書き込み(ライト)があった場合に、必要に応じて「0」から「1」に変更される。
このスナップショット差分集約ビットマップ23は、プライマリボリュームPVOL及びスナップショットボリュームSSVOLのペアを削除(つまり、そのスナップショットボリュームSSVOLに保持されたスナップショットを削除)するペア削除処理において、そのスナップショットの旧データをデータプールDPから削除する際に使用される。
すなわち、削除対象のスナップショットの旧データをデータプールDPから削除する場合、どの論理ブロックの旧データがデータプールDPに退避されているかをチェックする必要があるが、スナップショット差分ビットマップ21を用いて論理ブロックごとにチェックを行っていては時間がかかり過ぎる。
そこで、このような場合には、まず、スナップショット差分集約ビットマップ23をチェックし、差分集約ビット欄23BAに格納された差分集約ビットが「1」の論理ブロック群については、その論理ブロック群を構成する各論理ブロックのうちのどの論理ブロックの旧データがデータプールDPに退避されているかをスナップショット差分ビットマップ21によりチェックし、差分集約ビット欄23BAに格納された差分集約ビットが「0」の論理ブロック群については、かかるスナップショット差分ビットマップ21のチェックを行わない。このような処理により、かかるペア削除処理を高速化することができる。なお、このペア削除処理の詳細については後述する(図27A及び図27B参照)。
(2−3−5)旧データ退避アドレステーブル
旧データ退避アドレステーブル24は、各世代のスナップショットについて、個々の論理ブロックに格納されていたデータがデータプールDP内のどこに退避されているかを管理するためのテーブルであり、プライマリボリュームPVOLごとに作成される。
この旧データ退避アドレステーブル24は、図10に示すように、第1のエントリ(列)24Aと、同一のプライマリボリュームPVOLについて取得可能な最大数のスナップショットの世代数と同じ数の第2のエントリ(列)24Bとを備えて構成される。本実施の形態の場合、上述のように同一のプライマリボリュームPVOLについて取得可能なスナップショットの世代数は最大1024個であるため、これと同じ数の第2のエントリ24Bが旧データ退避アドレステーブル24に予め設けられている。
第1のエントリ24Aは、プライマリボリュームPVOL内の各論理ブロックとそれぞれ対応付けられた複数のLBA欄24AAに区分されており、これらLBA欄24AAに、それぞれ対応する論理ブロックのLBAが格納されている。
また第2のエントリ24Bは、それぞれ第1のエントリ24Aの各LBA欄24AAとそれぞれ対応付けられた複数のアドレス欄24BAに区分されている。そして各アドレス欄24BAには、それぞれ対応する世代のスナップショット内の対応する論理ブロックの旧データがデータプールDPに退避済みである場合には、そのデータを退避したデータプールDP内の記憶領域SA2(図3)のアドレスが格納される。
実際上、各アドレス欄24BAには、作成当初は初期値(「0」)が格納されている。そして、対応するプライマリボリュームPVOL又はスナップショットに対してデータをライトする際、データライト前の旧データをデータプールDPに退避するときに、そのデータプールDPにおけるそのデータの退避先のアドレスが、対応するアドレス欄24BAに格納される。
この旧データ退避アドレステーブル24は、スナップショットをリード先とするリードコマンドがホスト計算機3から与えられたときに参照される。そしてリード先となるスナップショットと対応付けられた第2のエントリ24Bのアドレス欄24BAに初期値が格納されている論理ブロックについてはプライマリボリュームPVOLからデータが読み出され、かかるアドレス欄24BAにデータプールDP内のアドレスが格納されている論理ブロックについては、データプールDPにおけるそのアドレスから1論理ブロック分のデータが読み出される。そして、これらプライマリボリュームPVOLから読み出されたデータと、データプールDPから読み出されたデータとが組み合わされてスナップショットが復元され、復元されたスナップショットがホスト計算機3に提供される。
また、旧データ退避アドレステーブル24は、スナップショットへのデータライト時や、スナップショットの削除時に、データライト先又は削除対象のスナップショットが他の世代のスナップショットとデータを共有しているか否かをチェックする際にも使用される。
すなわち、2つのスナップショットがデータを共有している場合、同じ論理ブロックと対応付けられたアドレス欄24BAにはデータプールDP上の同じアドレスが格納される。そこで、かかるチェックは、データのライト先のスナップショットについては、そのスナップショットにおけるデータライト先の論理ブロックと対応付けられたアドレス欄24BAについて、そのアドレス欄24BAに格納されているアドレスと同じアドレスが他の第2のエントリ24Bのいずれのアドレス欄24BAにも格納されていないか否かを判断することにより行われる。
そして、データライト先のスナップショットにおけるデータライト先の論理ブロックと対応付けられたアドレス欄24BAに格納されているアドレスと同じアドレスが他のいずれかの第2のエントリ24Bのアドレス欄24BAに格納されている場合、そのスナップショットにおけるその論理ブロックのデータは、他の世代のスナップショットと共有されていることになる。
かくして、この場合には、データプールDP上の対応する旧データ退避用チャンクCK2(図3)内に新たな記憶領域SA2(図3)が確保され、データライト先のスナップショットにおけるそのデータが書き込まれる前のデータ(旧データ)がこの記憶領域SA2に退避される。また、この際、旧データ退避アドレステーブル24上のデータライト先のスナップショットと対応付けられた第2のエントリ24Bにおける、データライト先の論理ブロックと対応付けられたアドレス欄24BAに、上述の記憶領域SA2のアドレスが格納される。
また、削除対象のスナップショットに対するかかるチェックは、旧データ退避アドレステーブル24上のそのスナップショットと対応付けられた第2のエントリ24Bの各アドレス欄24BAについて、そのアドレス欄24BAに格納されたアドレスが、旧データ退避アドレステーブル24上の他のいずれのアドレス欄24BAに格納されているアドレスと一致するか否かを判断することにより行われる。
そして、旧データ退避アドレステーブル24上の削除対象のスナップショットに対する各アドレス欄24BAにそれぞれ格納されたアドレスが、いずれの他のアドレス欄24BAに格納されているアドレスとも一致しない場合にはそのデータは削除され、旧データ退避アドレステーブル24上の削除対象のスナップショットに対する各アドレス欄24BAに格納されたアドレスが、いずれかの他のアドレス欄24BAに格納されているアドレスと一致した場合には、そのデータを削除することなく、データプールDP上に残しておく。
(2−3−6)旧データ退避領域空きビットマップ
旧データ退避領域空きビットマップ25は、データプールDP内に定義された旧データ退避用チャンクCK2(図3)内の記憶領域SA2(図3)のうち、旧データが退避されていない記憶領域(以下、これを空き記憶領域と呼ぶ)SA2を管理するために利用されるテーブルであり、データプールDPごとに作成される。なお、本実施の形態においては、データプールDPは1つだけであるので、旧データ退避領域空きビットマップ25も1つだけ作成される。
旧データ退避領域空きビットマップ25は、図11に示すように、データプールDP内の旧データ退避用チャンクCK2数と同じ数のエントリ25Aを備えて構成される。各エントリ25Aは、それぞれデータプールDP内のいずれかの旧データ退避用チャンクCK2と対応付けられており、当該旧データ退避用チャンクCK2内の1論理ブロック分の旧データが退避される各記憶領域SA2とそれぞれ1対1に対応付けられた複数の空きビット欄25AAに区分されている。
そして、各空きビット欄25AAには、それぞれ対応する旧データ退避用チャンクCK2内の対応する記憶領域SA2に旧データが退避されているか否かを表す空きビットがそれぞれ格納される。具体的に、空きビットは、対応する旧データ退避用チャンクCK2内の対応する記憶領域SA2が空き記憶領域である場合には「0」に設定され、当該記憶領域SA2が空き記憶領域でない場合には「1」に設定される。
この旧データ退避領域空きビットマップ25は、プライマリボリュームPVOLやスナップショットにデータを書き込むに際し、旧データをデータプールDP内の対応する旧データ退避用チャンクCK2に退避させる場合に、その旧データ退避用チャンクCK2内の空き記憶領域SA2を検索するときに利用される。そしてプライマリボリュームPVOLやスナップショットのデータをその旧データ退避用チャンクCK2内の記憶領域SA2に退避させた場合、対応する空きビット欄25AAに格納された空きビットが「0」から「1」に更新される。
また旧データ退避領域空きビットマップ25は、スナップショットが削除され、これに伴いデータプールDP内の旧データ退避用チャンクCK2からそのスナップショットの旧データが削除された場合に、対応する空きビット欄25AAの空きビットが「1」から「0」に更新される。そして旧データ退避領域空きビットマップ25内の各エントリ25Aにおいて、そのエントリ25Aに含まれる各空きビット欄25AAに格納された空きビットがすべて「0」となった場合に、その旧データ退避領域空きビットマップ25と対応付けられた旧データ退避用チャンクCK2が解放される。
(2−3−7)旧データ退避未反映ビットマップ
スナップショットの複数世代に渡って更新が行われなかった論理ブロック内のデータが更新された場合、そのデータはかかる更新に伴って旧データとしてデータプールDPに退避される。この場合、データプールDPに退避された旧データは、かかる複数世代のスナップショット間で共有されることになるため、これに応じてスナップショット差分ビットマップ21や、スナップショット差分集約ビットマップ23及び旧データ退避アドレステーブル24などの管理情報をかかる複数世代のスナップショット分だけ更新する必要がある。
例えば、図12(A)〜(C)に示すように、プライマリボリュームPVOL内のLBAが「0」の論理ブロックが更新されないまま第0〜第1023世代(世代番号は「0」〜「1023」)のスナップショットが取得されている状態において、その論理ブロックに格納されたデータが更新された場合、図13(A)〜(C)に示すように、データプールDPへの旧データの退避に伴って、スナップショット差分ビットマップ21における当該論理ブロックと対応付けられた各差分ビット欄21BAにそれぞれ格納されているすべての差分ビット(破線K1Aで囲まれたすべての差分ビット)と、スナップショット差分集約ビットマップ23におけるかかる論理ブロックと対応付けられた各差分集約ビット欄23BAにそれぞれ格納されているすべての差分集約ビット(破線K2Aで囲まれたすべての差分集約ビット)と、旧データ退避アドレステーブル24におけるかかる論理ブロックと対応付けられた各アドレス欄24BAにそれぞれ格納されているすべてのアドレス(破線K3Aで囲まれたすべてのアドレス)とを更新しなければならない。
しかしながら、このような処理は更新すべき世代数が多いほど負荷が大きく、このような処理をプライマリボリュームPVOLへのデータライト時に実行することは、当該プライマリボリュームPVOLに対するデータのライト性能に悪影響を及ぼすおそれがある。
そこで、本実施の形態によるディスクアレイ装置4においては、プライマリボリュームPVOLへのデータライト時には、旧データを共有する複数世代のスナップショットのうち、最新世代のスナップショットの管理情報のみを更新する。そして、残りの世代のスナップショットの管理情報は、その残りのスナップショットへのアクセス(リードアクセス又はライトアクセス)があったときや、その残りのスナップショットを削除する際(そのスナップショットを保持するスナップショットボリュームSSVOLとプライマリボリュームPVOLとの間のコピーペアを削除する際)に更新する。
例えば、図12(A)〜(C)について上述した例の場合、図14(A)〜(C)に示すように、プライマリボリュームPVOLへのデータライト時には、旧データを共有する複数世代のスナップショットのうち、最新世代である第1023世代(世代番号は「1023」)のスナップショットに関する管理情報(破線K1C〜K3Cで囲んだ管理情報)のみを更新する。そして、残りの世代のスナップショットの管理情報(破線K1B〜K3Bで囲んだ管理情報)は、その残りのスナップショットへのリードアクセス又はライトアクセスがあったときや、その残りのスナップショットを削除する際に更新する。
このように本ディスクアレイ装置4では、頻繁に発生するプライマリボリュームPVOLへのデータライト時の処理負荷を、あまり発生しないスナップショットへのアクセス時に移すことで、上述のような管理情報の更新処理に起因するプライマリボリュームPVOLへのデータライト性能が低下するのを有効に防止している。
以上のような動作を実行するため、本ディスクアレイ装置4では、旧データを共有する複数世代のスナップショットのうち、最新世代以外の世代のスナップショットの管理情報を更新済か否かを、旧データ退避未反映ビットマップ26を用いて管理している。この旧データ退避未反映ビットマップ26は、プライマリボリュームPVOLごとに作成される。
旧データ退避未反映ビットマップ26は、図15に示すように、第1及び第2のエントリ(列)26A,26Bを備えて構成される。そして第1のエントリ26Aは、プライマリボリュームPVOL内の各論理ブロックとそれぞれ対応付けられた複数のLBA欄26AAに区分されており、これらLBA欄26AAに、それぞれ対応する論理ブロックのLBAが格納されている。
また第2のエントリ26Bは、対応するプライマリボリュームPVOLの各論理ブロックにそれぞれ対応させて設けられた複数の未反映ビット欄26BAを備えて構成される。そして、これらの未反映ビット欄26BAには、それぞれプライマリボリュームPVOLへのデータライトがあった場合に、最新世代以外の世代のスナップショットの管理情報を更新済であるか否かを表す未反映ビットが格納されている。
具体的に、未反映ビットは、プライマリボリュームPVOLへのデータライトにより、対応する論理ブロック内の旧データがデータプールDPに退避された場合に初期値「0」から「1」に更新され、この後、最新世代以外の世代のスナップショットの管理情報が更新されると、「0」に戻される。
つまり、かかる未反映ビットが「1」であることは最新世代以外の世代のスナップショットの管理情報の更新が行われていないことを表し、かかる未反映ビットが「0」であることは最新世代以外の世代のスナップショットの管理情報が更新済であることを表す。
なお、データプールDPに退避された旧データを共有するスナップショットの世代間でどの世代が最新であるかという判断は、後述する分割順番号−世代番号マッピングテーブル27に基づいて行われる。
(2−3−8)分割順番号−世代番号マッピングテーブル
図12〜図15について上述したように、本ディスクアレイ装置4では、プライマリボリュームPVOLへのデータライト時には、旧データを共有する複数世代のスナップショットのうち、最新世代のスナップショットの管理情報のみを更新し、残りの世代のスナップショットの管理情報は、その残りのスナップショットへのリードアクセス又はライトアクセスがあったときや、その残りのスナップショットを削除する際に更新する。
ここで、図16(A−1)は、このような機能を有する本ディスクアレイ装置4におけるスナップショット差分ビットマップ21の状態例を示し、図16(A−2)は、図16(A−1)と同じ時点における旧データ退避アドレステーブル24の状態例を示す。これら図16(A−1)及び(A−2)は、いずれもスナップショット差分ビットマップ21や、旧データ退避アドレステーブル24におけるLBAが「0」の論理ブロックに対応する部分のみを抜き出したものである。また図16(A−2)において、「A1」〜「A3」は、いずれもデータプールDP上のアドレスを示す。後述する図16(B−1)及び(B−2)についても同様である。
図16(A−1)では、第3世代(世代番号は「3」)のスナップショットが取得された後、第4世代(世代番号は「4」)のスナップショットが取得されるまでの間にプライマリボリュームPVOLのLBAが「0」の論理ブロックのデータが更新されたため、スナップショット差分ビットマップ21におけるLBAが「0」の論理ブロックと対応付けられた差分ビットがデータライト時の最新世代として「1」に更新されたことが示されている。またこの図16(A−1)では、この際、第2世代(世代番号は「2」)のスナップショットの管理情報の更新が行われず、LBAが「0」の論理ブロックと対応付けられた差分ビットが「0」のままとなっていることも示されている。
また図16(A−1)では、その後、第7世代(世代番号は「7」)のスナップショットが取得されるまでの間はプライマリボリュームPVOLのLBAが「0」の論理ブロックのデータが更新されず、第7世代のスナップショットの取得後にLBAが「0」の論理ブロックのデータが更新されたため、スナップショット差分ビットマップ21における当該論理ブロックと対応付けられた差分ビットがデータライト時の最新世代として「1」に更新されたことが示されている。またこの図では、この際、第4〜6世代(世代番号は「4」〜「6」)のスナップショットの管理情報の更新が行われず、当該論理ブロックと対応付けられた第4〜6世代の差分ビットがいずれも「0」のままとなっていることも示されている。
この場合において、例えば、取得された順番が早いスナップショットほど、そのスナップショットに若い世代番号を割り当てる制御が行われる場合には、その後行われる「最新世代」のスナップショットの管理情報を「残りの世代」のスナップショットの管理情報に反映させる処理(以下、これを差分反映処理と呼ぶ)の実行時において、例えば、第2世代のスナップショットについては、第3世代のスナップショットの管理情報を反映させ、第4〜第6世代のスナップショットについては、第7世代のスナップショットの管理情報を反映させれば良い。
具体的には、第2世代のスナップショットについては、図16(B−1)に示すように、スナップショット差分ビットマップ21のエントリのうち、第2世代のスナップショットと対応付けられたエントリ21Bにおける当該論理ブロックと対応付けられた差分ビット欄21BAの差分ビットを「1」に更新する。また図16(B−2)に示すように、旧データ退避アドレステーブル24のエントリ24Bのうち、第3世代のスナップショットと対応付けられたエントリ24BにおけるプライマリボリュームPVOLのLBAが「0」の論理ブロックと対応付けられたアドレス欄24BAに格納されたアドレスを、第2世代のスナップショットと対応付けられたエントリ24Bにおける当該論理ブロックと対応付けられたアドレス欄24BAにコピーする。さらに、スナップショット差分集約ビットマップ23(図9)のエントリ23B(図9)のうち、第2世代のスナップショットと対応付けられたエントリ23Bにおけるかかる論理ブロックと対応付けられた差分集約ビット欄23BA(図3)に格納されている差分集約ビットも必要に応じて更新する。
同様に、第4〜第6世代のスナップショットについては、図16(B−1)に示すように、スナップショット差分ビットマップ21のエントリ21Bのうち、第4〜第6世代のスナップショットとそれぞれ対応付けられた各エントリ21Bにおける当該論理ブロックと対応付けられた差分ビット欄21BAの差分ビットを「1」にそれぞれ更新する。また図16(B−2)に示すように、旧データ退避アドレステーブル24のエントリ24Bのうち、第7世代のスナップショットと対応付けられたエントリ24BにおけるプライマリボリュームPVOLのLBAが「0」の論理ブロックと対応付けられたアドレス欄24BAに格納されたアドレスを、第4〜第6世代のスナップショットとそれぞれ対応付けられた各エントリ24Bにおける当該論理ブロックと対応付けられた各アドレス欄24BAにそれぞれコピーする。さらに、スナップショット差分集約ビットマップ23(図9)のエントリ23B(図9)のうち、第4〜第6世代のスナップショットとそれぞれ対応付けられた各エントリ23Bにおけるかかる論理ブロックと対応付けられた差分集約ビット欄23BAに格納されている差分集約ビットも必要に応じて更新する。
さらに、この後、旧データ退避未反映ビットマップ26(図15)における、プライマリボリュームPVOLのかかる論理ブロックと対応付けられた第2及び第4〜第6世代のスナップショットと対応する未反映ビット欄26BA(図15)に格納されている未反映ビットを「1」から「0」に更新する。
以上のような差分反映処理により、第3世代のスナップショットの管理情報を第2世代のスナップショットの管理情報に反映することができると共に、第7世代のスナップショットの管理情報を第4〜第6世代のスナップショットの管理情報に反映することができる。
しかしながら、本ディスクアレイ装置4の場合、後述のように世代番号は、スナップショットボリュームSSVOLをプライマリボリュームPVOLから分割することによりスナップショットを取得したときに、そのスナップショットに対して任意に割り当てられる番号であって、そのスナップショットが取得された順番を表すものではない。
従って、例えば図16(A−1)〜(B−2)の例において、例えば第2世代のスナップショットが第3世代のスナップショットよりも後に取得されたものである場合に上述のような差分反映処理を実行すると、先に取得されたスナップショットの管理情報が後から取得されたスナップショットの管理情報に反映されることとなり、不具合が生じることとになる。
そこで、本ディスクアレイ装置4は、スナップショットを保持するスナップショットボリュームSSVOLをプライマリボリュームから分割することによりスナップショットを取得した順番と、そのスナップショットに割り当てられた世代番号との関係を分割順番号−世代番号マッピングテーブル27を用いて管理している。この分割順番号−世代番号マッピングテーブル27は、プライマリボリュームPVOLごとに作成される。
分割順番号−世代番号マッピングテーブル27は、図17に示すように、第1及び第2のエントリ(行)27A,27Bを備えて構成される。そして第1のエントリ27Aは、同一のプライマリボリュームPVOLに対して設定可能なコピーペアのペア数の最大値と同じ数の分割順番号欄27AAに区分され、これら分割順番号欄27AAにそれぞれ分割順番号が格納されている。なお、分割順番号は、左端の分割順番号欄27AAに「0」、その右隣の分割順番号欄27AAに「1」、さらにその右隣の分割順番号欄27AAに「2」……というように、右の分割順番号欄27AAほど1ずつ数値が大きくなるように分割順番号欄27AAに格納されている。
また第2のエントリ27Bは、上述の分割順番号欄27AAにそれぞれ対応させて複数の世代番号欄27Bに区分され、これらの世代番号欄27Bに、対応するスナップショットの世代番号が格納されている。なお、ここでいう「対応するスナップショットの世代番号」とは、同一のプライマリボリュームPVOLとコピーペアに設定されたスナップショットボリュームSSVOLのうち、当該プライマリボリュームPVOLから分割された順番が、対応する分割順番号欄27AAに格納された分割順番号と同じスナップショットボリュームSSVOLにより保持されているスナップショットを指す。
この分割順番号−世代番号マッピングテーブル27は、第1に、プライマリボリュームPVOLに対するデータライトがあったときに、最新世代のスナップショットを検出するために利用され、第2に、上述の差分反映処理時にスナップショットボリュームSSVOLのプライマリボリュームPVOLからの分割順番号を検出するために利用される。
具体的に、ディスクアレイ装置4は、例えば、スナップショット差分ビットマップ21が図18(C)に示す状態であり、分割順番号−世代番号マッピングテーブル27が図18(B)に示す状態である場合、分割順番号−世代番号マッピングテーブル27を利用して、スナップショット差分ビットマップ21における各スナップショットとそれぞれ対応するエントリ21Bの並び順を、図18(A)に示すように、スナップショットの取得順に並び変える。同様に、このときの旧データ退避アドレステーブル24が図19(C)に示す状態の場合、分割順番号−世代番号マッピングテーブル27(図19(B))を利用して、旧データ退避アドレステーブル24における各スナップショットとそれぞれ対応するエントリ21Bの並び順を、図19(A)に示すように、その取得順に並び替える。
例えば図18(C)の例では、図18(B)を参照すると、第0世代(世代番号は「0」)のスナップショットが分割順番号が「0」のスナップショットボリュームSSVOLにより保持されたスナップショットであり、その後、第2世代、第3世代、第4世代、第6世代、第7世代、第1世代及び第5世代のスナップショットがこの順番で取得されていることが分かる。そこで、差分反映処理時には、図18(A)に示すように、各スナップショットとそれぞれ対応するエントリ21Bがこの世代番号の順番で並ぶように、スナップショット差分ビットマップ21における各エントリ21Bを並び替え、図18(A)に示すように、各スナップショットと対応するエントリ24Bがこの世代番号の順番で並ぶように、旧データ退避アドレステーブル24における各エントリ24Bを並び替える。
そして、差分反映処理では、このようにしてエントリ21A,24Bの並び順を対応するスナップショットボリュームSSVOLの分割順(スナップショットの取得順)に並び替えたスナップショット差分ビットマップ21を利用して、まず、プライマリボリュームPVOLの1つの論理ブロックに注目し、各エントリ21Bのその論理ブロックと対応付けられた差分ビットのうち、値が「1」の差分ビットで挟まれた値が「0」の差分ビットを検出する。
例えば図18(A)の例では、LBAが「0」の論理ブロックと対応付けられた各エントリ21Bの差分ビットのうち、分割順番号が「1」のスナップショットボリュームSSVOLにより保持されるスナップショット(第2世代のスナップショット)と対応付けられた差分ビットと、分割順番号が「3」〜「5」のスナップショットボリュームSSVOLによりそれぞれ保持されるスナップショット(それぞれ第4世代、第6世代又は第7世代のスナップショット)とそれぞれ対応付けられた差分ビットとが、検出すべき差分ビットとなる。
そして、差分反映処理では、このようにして検出した値が「0」の差分ビットと対応付けられた各スナップショット(以下、これを未反映スナップショットと呼ぶ)について、その未反映スナップショットの取得後、最も早く取得されたスナップショットであって、かかる論理ブロックと対応付けられた差分ビットの値が「1」のスナップショットを検出し、当該スナップショットの管理情報のうちのかかる論理ブロックに関する管理情報を、対応する未反映スナップショットの管理情報のうちのかかる論理ブロックに関する管理情報に反映する。
例えば図18及び図19の例の場合、プライマリボリュームPVOLのそのとき注目している論理ブロックのLBAが「0」であるものとすると、分割順番号が「1」のスナップショットボリュームSSVOLにより保持されているスナップショット(第2世代のスナップショット)については、そのスナップショットの取得後、最も早く取得されたスナップショットであって、かかる論理ブロックと対応付けられた差分ビットの値が「1」のスナップショットは、分割順番号が「2」のスナップショットボリュームSSVOLにより保持されている世代番号が「3」のスナップショット(第3世代のスナップショット)である。よって、この場合には、第3世代のスナップショットの管理情報のうち、かかる論理ブロックに関する管理情報を、第2世代のスナップショットの管理情報のうちの、当該論理ブロックに関する管理情報に反映する。
具体的には、図19(A)に示す旧データ退避アドレステーブル24のエントリ24Bのうち、第3世代のスナップショットと対応付けられたエントリ24B内のかかる論理ブロックと対応付けられたアドレス欄24BAに格納されているアドレスを、当該旧データ退避アドレステーブル24のエントリ24Bのうち、第2世代のスナップショットと対応付けられたエントリ24B内のかかる論理ブロックと対応付けられたアドレス欄24BAにコピーする。また図18(A)に示すスナップショット差分ビットマップ21のエントリのうち、第2世代のスナップショットと対応付けられたエントリ21B内のかかる論理ブロックと対応付けられた差分ビット欄21BAに格納されている差分ビットを「1」に更新する。
同様に、分割順番号が「3」〜「5」のスナップショットボリュームSSVOLに保持されている第4世代、第6世代及び第7世代のスナップショットについては、これらのスナップショットの取得後、最も早く取得されたスナップショットであって、かかる論理ブロックと対応付けられた差分ビットの値が「1」のスナップショットは、分割順番号が「6」のスナップショットボリュームSSVOLに保持されている第1世代のスナップショットである。よって、この場合には、第1世代のスナップショットの管理情報のうち、かかる論理ブロックに関する管理情報を、分割順番号が「3」〜「5」のスナップショットボリュームSSVOLに保持されている第4世代、第6世代及び第7世代のスナップショットの管理情報のうちの、当該論理ブロックに関する管理情報に反映する。
具体的には、図19(A)に示す旧データ退避アドレステーブル24のエントリ24Bのうち、第1世代のスナップショットと対応付けられたエントリ24B内のかかる論理ブロックと対応付けられたアドレス欄24BAに格納されているアドレスを、当該旧データ退避アドレステーブル24のエントリ24Bのうち、分割順番号が「3」〜「5」のスナップショットボリュームSSVOLに保持されている第4世代、第6世代及び第7世代のスナップショットとそれぞれ対応付けられた各エントリ24B内のかかる論理ブロックと対応付けられたアドレス欄24BAにそれぞれコピーする。また図18(A)に示すスナップショット差分ビットマップ21のエントリ21Bのうち、第4世代、第6世代及び第7世代のスナップショットとそれぞれ対応付けられた各エントリ21B内のかかる論理ブロックと対応付けられた差分ビット欄21BAに格納されている差分ビットをそれぞれ「1」に更新する。
そして、この後、旧データ退避未反映ビットマップ26(図15)上の未反映ビット欄26BA(図15)のうち、かかる論理ブロックと対応付けられた未反映ビット欄26BAに格納されている未反映ビットを「1」から「0」に変更する。
また差分反映処理では、以上の処理をプライマリボリュームPVOLのすべての論理ブロックについて実行する。このような処理により、各未反映スナップショットについて、対応するスナップショットの管理情報がその未反映スナップショットの管理情報に反映されることになる。
(2−3−9)スナップショットライト差分ビットマップ
上述のように、差分反映処理では、後から取得されたスナップショットの管理情報を反映すべき世代をスナップショット差分ビットマップ21及び分割順番号−世代番号マッピングテーブル27を利用して判断する。
ところで、かかる差分反映処理が実行される前に、差分反映処理が行われていない世代(以下、これを未反映世代と呼ぶ)のスナップショットに対してデータライトが行われた場合、スナップショット差分ビットマップ21におけるそのデータライトが行われた未反映世代のスナップショットと対応付けられたエントリ21Bのうち、かかるデータライトが行われた論理ブロックと対応付けられた差分ビットが「1」に更新される。しかしながら、このような処理が行われると、その後実行される差分反映処理が正しく行われなくなる問題がある。
例えば、プライマリボリュームPVOLからのスナップショットボリュームSSVOLの分割順と、それらのスナップショットボリュームSSVOLに保持されるスナップショットの世代番号とが一致する場合において、スナップショット差分ビットマップ21が図20(A−1)、旧データ退避アドレステーブル24が図20(A−2)のような状態にそれぞれある場合において、第5世代のスナップショットのアドレス「0」にデータライトがあった場合を考える。
この場合、スナップショット差分ビットマップ21は、図20(B−1)に示すように、第5世代と対応するエントリ21BにおけるLBAが「0」の論理ブロックと対応する差分ビット欄21BAに格納された差分ビットが「1」に更新され、旧データ退避アドレステーブル24は、図20(B−2)に示すように、第5世代のスナップショットのデータライトがあった「0」の論理ブロックのデータを退避させたデータプールDP内のアドレス(図20(B−2)では「A4」)が格納される。
そして、この後、差分反映処理が行われた場合、図20(B−1)及び(B−2)において破線の矢印で示すように、第7世代のスナップショットの管理情報が第6世代のスナップショットの管理情報に反映され、第5世代のスナップショットの管理情報が第4世代のスナップショットの管理情報に反映されることになる。つまり、本来的には、図20(A−1)及び(A−2)において破線の矢印で示すように、第4世代のスナップショットの管理情報は、第5世代のスナップショットではなく、第7世代のスナップショットの管理情報に基づいて更新されるべきであるにも関わらず、第5世代のスナップショットに対してデータライトがあったために、第4世代のスナップショットに対する差分反映処理が正しく行われなくなる。
そこで、本ディスクアレイ装置4においては、スナップショットに対するデータライトがあったか否かを、スナップショットライト差分ビットマップ28を用いて管理している。
スナップショットライト差分ビットマップ28は、プライマリボリュームPVOLごとに作成されるビットマップであり、図21に示すように、第1のエントリ(列)28Aと、同一のプライマリボリュームPVOLについて取得可能な最大数のスナップショットの世代数と同じ数の第2のエントリ(列)28Bを備えて構成される。本実施の形態の場合、上述のように同一のプライマリボリュームPVOLについて取得可能なスナップショットの世代数は最大1024個であり、これと同じ数の第2のエントリ28Bが予めスナップショットライト差分ビットマップ28に設けられている。
第1のエントリ28Aは、プライマリボリュームPVOL内の各論理ブロックとそれぞれ対応付けられた複数のLBA欄28AAに区分されている。そして、これらLBA欄28AAには、それぞれ対応する論理ブロックのLBAが格納されている。
また各第2のエントリ28Bは、それぞれプライマリボリュームPVOL内の各論理ブロックとそれぞれ対応付けられた複数のライト差分ビット欄28BAに区分されている。そして各ライト差分ビット欄28BAには、それぞれ対応する世代のスナップショットの対応する論理ブロック内のデータにデータライトがあったか否かを表すライト差分ビットが格納される。
実際上、ライト差分ビットは、初期時は「0」に設定されており、対応する世代のスナップショットにおける対応する論理ブロックにデータが書き込まれた場合に「1」に更新される。従って、ライト差分ビットの「0」は、対応する世代のスナップショットにおける対応する論理ブロックに対するデータライトが発生していない(対応するプライマリボリュームPVOLの論理ブロックにライトが発生している場合を除き、その論理ブロックに格納されていたデータがデータプールDPに退避されていない)ことを表し、ライト差分ビットの「1」は、対応する世代のスナップショットにおける対応する論理ブロックに対するデータライトが発生した(その論理ブロックに格納されていたデータがデータプールDPに退避された)ことを表している。
(2−4)各種処理の処理手順
次に、かかる本ディスクアレイ装置4に搭載されたスナップショット機能に関連してディスクアレイ装置4のCPU17(図1)により実行される各種処理の具体的な処理内容について説明する。なお、CPU17は、以下の各種処理をローカルメモリ16(図1)に格納された図示しない制御プログラムに基づいて実行する。
(2−4−1)リード処理
図22は、ホスト計算機3から送信されたプライマリボリュームPVOLを対象とするリードコマンドをディスクアレイ装置4が受信した場合にCPU17により実行されるリード処理の処理手順を示す。
CPU17は、かかるリードコマンドを受信すると、この図22に示すリード処理を開始し、かかるリードコマンドに基づいてバックエンドインタフェース14(図1)を制御することにより、当該リードコマンドにおいて指定されたプライマリボリュームPVOL内の当該リードコマンドにおいて指定された論理ブロックからデータをリードする。またCPU17は、リードしたデータをキャッシュメモリ15を経由してそのリードコマンドの発行元のホスト計算機3に転送させる(SP1)。そしてCPU17は、この後、このリード処理を終了する。
(2−4−2)ライト処理
また図23は、ホスト計算機3から送信されたプライマリボリュームPVOLを対象とするライトコマンドをディスクアレイ装置34が受信した場合にCPU17により実行されるライト処理の処理手順を示す。
CPU17は、かかるライトコマンドを受信すると、この図23に示すライト処理を開始し、まず、データプールDPに格納されているスナップショット管理情報(スナップショット差分ビットマップ21、プライマリボリューム差分ビットマップ22、スナップショット差分集約ビットマップ23、旧データ退避アドレステーブル24、旧データ退避領域空きビットマップ25、旧データ退避未反映ビットマップ26及びスナップショットライト差分ビットマップ28)のうちの処理に必要な一部の管理情報を、バックエンドインタフェース14を介してキャッシュメモリ15に読み出す(SP10)。従って、この後、ライト処理におけるこれらの管理情報の参照及び更新等は、キャッシュメモリ15上に読み出された管理情報に対して行われることになる。
続いて、CPU17は、データのライト先のプライマリボリュームPVOLと対応するプライマリボリューム差分ビットマップ22(図8)を参照して、かかるライトコマンドにおいてデータのライト先として指定されたプライマリボリューム(以下、これをライト先プライマリボリュームと呼ぶ)PVOL上の、当該ライトコマンドにおいてデータのライト先として指定された論理ブロック(以下、これをライト先論理ブロックと呼ぶ)に格納されているデータがデータプールDPに退避されているか否かを判断する(SP11)。この判断は、かかるプライマリボリューム差分ビットマップ22におけるライト先論理ブロックと対応付けられた差分ビットが「0」であるか否かを判断することにより行われる。
そしてCPU17は、この判断で否定結果を得ると、ステップSP21に進む。これに対してCPU17は、この判断で肯定結果を得ると、スナップショット差分ビットマップ21(図7)、分割順番号−世代番号マッピングテーブル27(図17)及びスナップショットライト差分ビットマップ28(図21)を参照して、かかるライト先論理ブロックのデータが未だ退避されていないスナップショットの世代のうちの最新世代の世代番号を検出する(SP12)。
次いで、CPU17は、旧データ退避領域空きビットマップ25(図11)を参照して、かかるライト先論理ブロックに格納されているデータの退避先を決定する(SP13)。具体的に、CPU17は、データプールDP内のライト先プライマリボリュームPVOLと対応付けられた旧データ退避用チャンクCK2(図3)内に、かかるライト先論理ブロック内のデータ(旧データ)を退避するだけの記憶領域SA2(図3)の空きがあるか否かを判定する。そしてCPU17は、かかる空きがあると判定した場合には、当該データを退避できる分の記憶領域SA2をその旧データ退避用チャンクCK2内に確保し、確保した記憶領域SA2をかかるデータの退避先として決定する。またCPU17は、データプールDP内のライト先プライマリボリュームPVOLと対応付けられた旧データ退避用チャンクCK2内に、かかる空きがないと判定した場合には、データプールDP上にそのライト先プライマリボリュームPVOLと対応付けた新たな旧データ退避用チャンクCK2を作成し、その旧データ退避用チャンクCK2内にかかるライト先論理ブロックのデータを退避可能な分の記憶領域SA2を確保し、確保した記憶領域SA2をかかるデータの退避先として決定する。
さらに、CPU17は、ライト先プライマリボリュームPVOL内のライト先論理ブロックに格納されているデータ(旧データ)の退避先を旧データ退避アドレステーブル24(図10)に登録する(SP14)。具体的に、CPU17は、旧データ退避アドレステーブル24の第2のエントリ24B(図10)のうち、ステップSP12において検出した最新世代のスナップショットと対応付けられた第2のエントリ24Bにおけるライト先論理ブロックと対応付けられたアドレス欄24BAに、ステップSP13においてデータの退避先として決定したデータプールDP上の記憶領域SA2のアドレスを格納する。
さらにCPU17は、旧データ退避領域空きビットマップ25(図11)内の各空きビット欄25AA(図11)のうち、ステップSP13においてデータの退避先として決定した記憶領域SA2と対応する空きビット欄25AAに格納されている空きビットを「0」から「1」に変更し(SP15)、この後、ライト先プライマリボリュームPVOL内のライト先論理ブロックに格納されているデータ(旧データ)を、データプールDP内のステップSP13において決定した記憶領域SA2に退避させる(SP16)。
続いて、CPU17は、ライト先プライマリボリュームPVOL上のライト先論理ブロックと対応する旧データ退避未反映ビットマップ26(図15)上の未反映ビット欄26BAに格納された未反映ビットを「0」から「1」に変更する(SP17)。またCPU17は、スナップショット差分集約ビットマップ23(図9)上の差分集約ビット欄23BAのうち、ステップSP16においてデータの退避が行われたライト先論理ブロックと対応付けられた差分集約ビット欄23BAに格納されている差分集約ビットを「0」から「1」に変更する(SP18)。
次いで、CPU17は、スナップショット差分ビットマップ21(図7)の差分ビット欄21BA(図7)のうち、ステップSP16においてデータの退避を行ったライト先論理ブロックと対応する差分ビット欄21BA(最新世代のスナップショットと対応する第1のエントリ21B内のライト先論理ブロックと対応する差分ビット欄21BA)に格納されている差分ビットを「0」から「1」に更新する(SP19)。またCPU17は、プライマリボリューム差分ビットマップ22(図8)の差分ビット欄22BA(図8)のうち、かかるライト先論理ブロックと対応する差分ビット欄22BAに格納されている差分ビットを「0」から「1」に更新する(SP20)。
さらにCPU17は、この後、ライトコマンドと共にホスト計算機3から送られてきたライトデータをキャッシュメモリ15(図1)を経由してライト先プライマリボリュームPVOL内のライト先論理ブロックにライトする(SP21)。そしてCPU17は、この後、このライト処理を終了する。
(2−4−3)第1のスナップショットリード処理
図24は、ホスト計算機3から送信されたスナップショットを対象とするリードコマンド(以下、これをスナップショットリードコマンドと呼ぶ)をディスクアレイ装置4が受信した場合にCPU17により実行される第1のスナップショットリード処理の処理手順を示す。
CPU17は、かかるスナップショットリードコマンドを受信すると、この図24に示す第1のスナップショットリード処理を開始し、まず、データプールDPに格納されている管理情報のうちの処理に必要な一部の管理情報を、バックエンドインタフェース14(図1)を介してキャッシュメモリ15(図1)に読み出す(SP30)。従って、この後、第1のスナップショットリード処理における管理情報の参照及び更新等は、キャッシュメモリ15上に読み出された管理情報に対して行われることになる。
続いて、CPU17は、対応する旧データ退避未反映ビットマップ26(図15)を参照して、スナップショットリードコマンドにおいてデータのリード先として指定された世代のスナップショット(以下、これをリード先スナップショットと呼ぶ)内の当該スナップショットリードコマンドにおいてデータのリード先として指定された論理ブロック(以下、これをリード先論理ブロックと呼ぶ)に対する差分反映処理が未実行であるか否かを判断する(SP31)。この判断は、かかる旧データ退避未反映ビットマップ26の未反映ビット欄26BAのうち、リード先スナップショットと対応付けられた第2のエントリ26B内のリード先論理ブロックと対応付けられた未反映ビット欄26BAに格納されている未反映ビットが「1」であるか否かを判断することにより行われる。
そしてCPU17は、この判断で否定結果を得るとステップSP34に進む。これに対してCPU17は、ステップSP31の判断で肯定結果を得ると、スナップショット差分ビットマップ21(図7)、スナップショット差分集約ビットマップ23(図9)及び旧データ退避アドレステーブル24(図10)を参照して、差分反映処理を実行する(SP32)。なお、このとき差分反映処理の対象とするのは、リード先スナップショットのリード先論理ブロックに対応する全世代のスナップショットの論理ブロック(つまりすべての世代のスナップショットにおけるリード先論理ブロックと同じLABの論理ブロック)である。ただし、このステップSP32において、差分反映処理を実行すべきすべての世代のスナップショットのすべての論理ブロックに対して差分反映処理を実行するようにしても良い。
次いで、CPU17は、旧データ退避未反映ビットマップ26(図15)の未反映ビット欄26BAのうち、ステップSP32においてすべての世代のスナップショットにおいて差分反映処理を実行した論理ブロックに対応する未反映ビット欄26BAに格納されている未反映ビットを「1」から「0」に変更する(SP33)。
そしてCPU17は、この後、スナップショット差分ビットマップ21内の差分ビット欄21BAのうち、リード先スナップショットにおけるリード先論理ブロックと対応する差分ビット欄21BAに格納されている差分ビットが「0」であるか否かを判断する(SP34)。
この判断で肯定結果を得ることは、リード先スナップショットのリード先論理ブロックのデータが未だデータプールDPには退避されておらず、そのデータがプライマリボリュームPVOL内に存在することを意味する。かくして、このときCPU17は、プライマリボリュームPVOL内のリード先論理ブロックと同じLBAの論理ブロックからデータを読み出し、これをキャッシュメモリ15を介してかかるスナップショットリードコマンドの送信元のホスト計算機3に転送する(SP35)。そしてCPU17は、この後、この第1のスナップショットリード処理を終了する。
これに対して、ステップSP34の判断で否定結果を得ることは、リード先スナップショットのリード先論理ブロックのデータは既にデータプールDPに退避されており、そのデータがプライマリボリュームPVOL内に存在しないことを意味する。かくして、このときCPU17は、旧データ退避アドレステーブル24(図10)の各アドレス欄24BAのうち、リード先スナップショットのリード先論理ブロックと対応するアドレス欄24BAに格納されているアドレス(つまりリード先論理ブロックに格納されていたデータの退避先のアドレス)を読み出す(SP36)。
そしてCPU17は、データプールDP内の対応する旧データ退避用チャンクCK2(図3)におけるステップSP36において取得したアドレスが付与された記憶領域SA2(図3)から、リード先論理ブロックから退避したデータを読み出し、これをキャッシュメモリ15を介してかかるスナップショットリードコマンドの送信元のホスト計算機3に転送する(SP37)。そしてCPU17は、この後、この第1のスナップショットリード処理を終了する。
(2−4−4)第2のスナップショットリード処理
一方、図25は、ホスト計算機3から送信されたスナップショットリードコマンドをディスクアレイ装置4が受信した場合にCPU17により実行される第2のスナップショットリード処理の処理手順を示す。
図24について上述した第1のスナップショットリード処理は、旧データ退避未反映ビットマップ26をスナップショット差分ビットマップ21よりも先にチェック(図24のステップSP31及びステップSP34参照)するバージョンであり、この第2のスナップショットリード処理は、スナップショット差分ビットマップ21を旧データ退避未反映ビットマップ26よりも先にチェック(図25のステップSP41及びステップSP44参照)するバージョンである。
CPU17は、かかるスナップショットリードコマンドを受信すると、この図25に示す第2のスナップショットリード処理を開始し、まず、データプールDPに格納されている管理情報のうちの処理に必要な一部の管理情報を、バックエンドインタフェース14(図1)を介してキャッシュメモリ15(図1)に読み出す(SP40)。従って、この後、第2のスナップショットリード処理における管理情報の参照及び更新等は、キャッシュメモリ15上に読み出された管理情報に対して行われることになる。
続いて、CPU17は、スナップショット差分ビットマップ21内の差分ビット欄21BAのうち、リード先スナップショットにおけるリード先論理ブロックと対応する差分ビット欄21BAに格納されている差分ビットが「0」であるか否かを判断する(SP41)。
この判断で否定結果を得ることは、リード先スナップショットのリード先論理ブロックのデータは既にデータプールDPに退避されており、そのデータがプライマリボリュームPVOL内に存在しないことを意味する。かくして、このときCPU17は、旧データ退避アドレステーブル24(図10)の各アドレス欄24BAのうち、リード先スナップショットのリード先論理ブロックと対応するアドレス欄24BAに格納されているアドレス(つまりリード先論理ブロックに格納されていたデータの退避先のアドレス)を読み出す(SP42)。
そしてCPU17は、データプールDP内のステップSP42において取得したアドレスが付与された記憶領域SA2(図3)から、リード先論理ブロックから退避したデータを読み出し、これをキャッシュメモリ15を介してかかるスナップショットリードコマンドの送信元のホスト計算機3に転送する(SP43)。そしてCPU17は、この後、この第2のスナップショットリード処理を終了する。
これに対して、ステップSP41の判断で肯定結果を得ることは、リード先スナップショットのリード先論理ブロックのデータが未だデータプールDPには退避されておらず、そのデータがプライマリボリュームPVOL内に存在するか、又は、リード先スナップショットのリード先論理ブロックに対する差分反映処理が未だ行われていない可能性があることを意味する。かくして、このときCPU17は、リード先スナップショット内のリード先論理ブロックに対する差分反映処理が未実行であるか否かを判断する(SP44)。具体的に、CPU17は、旧データ退避未反映ビットマップ26(図15)内の未反映ビット欄26BA(図15)のうち、リード先スナップショットと対応付けられた第2のエントリ26B内のリード先論理ブロックと対応付けられた未反映ビット欄26BAに格納されている未反映ビットが「1」となっているか否かを判断する。
この判断で肯定結果を得ることは、リード先スナップショットのリード先論理ブロックに対する差分反映処理が未だ行われていない可能性があることを意味する。かくして、このときCPU17は、図24のステップSP32と同様の差分反映処理を実行する(SP45)。
次いで、CPU17は、旧データ退避未反映ビットマップ26の未反映ビット欄26BAのうち、ステップSP45においてすべての世代のスナップショットにおいて差分反映処理を実行した論理ブロックに対応する未反映ビット欄26BAに格納されている未反映ビットを「1」から「0」に変更し(SP46)、この後、ステップSP41に戻る。
これに対して、ステップSP44の判断で否定結果を得ることは、リード先スナップショットのリード先論理ブロックのデータが未だデータプールDPには退避されておらず、そのデータがプライマリボリュームPVOL内に存在することを意味する。かくして、このときCPU17は、プライマリボリュームPVOL内のリード先論理ブロックと同じLBAの論理ブロックからデータを読み出し、これをキャッシュメモリ15を介してかかるスナップショットリードコマンドの送信元のホスト計算機3に転送する(SP47)。そしてCPU17は、この後、この第2のスナップショットリード処理を終了する。
(2−4−5)スナップショットライト処理
図26は、ホスト計算機3から送信されたスナップショットを対象とするライトコマンド(以下、これをスナップショットライトコマンドと呼ぶ)をディスクアレイ装置4が受信した場合にCPU17により実行されるスナップショットライト処理の処理手順を示す。
CPU17は、かかるスナップショットライトコマンドを受信すると、この図26に示すスナップショットライト処理を開始し、まず、データプールDPに格納されている管理情報のうちの処理に必要な一部の管理情報を、バックエンドインタフェース14(図1)を介してキャッシュメモリ15(図1)に読み出す(SP50)。従って、この後、スナップショットライト処理における管理情報の参照及び更新等は、キャッシュメモリ15上に読み出されたこれら管理情報に対して行われることになる。
続いてCPU17は、ライト先スナップショットと対応する旧データ退避未反映ビットマップ26(図15)を参照して、かかるスナップショットライトコマンドにおいてデータのライト先として指定されたスナップショット(以下、これをライト先スナップショットと呼ぶ)上の、当該スナップショットライトコマンドにおいてデータのライト先として指定された論理ブロック(ライト先論理ブロック)に対する差分反映処理が未実行であるか否かを判断する(SP51)。この判断は、かかる旧データ退避未反映ビットマップ26内の未反映ビット欄26BA(図15)のうち、ライト先スナップショットと対応付けられた第2のエントリ26B内のライト先論理ブロックと対応付けられた未反映ビット欄26BAに格納されている未反映ビットが「1」であるか否かを判断することにより行われる。
そしてCPU17は、この判断で否定結果を得るとステップSP54に進む。これに対してCPU17は、この判断で肯定結果を得ると、ススナップショット差分ビットマップ21(図7)、旧データ退避アドレステーブル24(図10)及びスナップショット差分集約ビットマップ23(図9)を参照して差分反映処理を実行する(SP52)。なお、このとき差分反映処理の対象とするのは、ライト先スナップショットのライト先論理ブロックに対応する全世代のスナップショットの論理ブロック(つまりすべての世代のスナップショットにおけるライト先論理ブロックと同じLABの論理ブロック)である。ただし、このステップSP52において、差分反映処理を実行すべきすべての世代のスナップショットのすべての論理ブロックに対して差分反映処理を実行するようにしても良い。
次いで、CPU17は、旧データ退避未反映ビットマップ26(図15)の未反映ビット欄26BA(図15)のうち、ステップSP52においてすべての世代のスナップショットにおいて差分反映処理を実行した論理ブロックに対応する未反映ビット欄26BAに格納されている未反映ビットを「1」から「0」に変更する(SP53)。
続いて、CPU17は、スナップショットのライト先論理ブロックと対応付けられたプライマリボリュームPVOL内の論理ブロック(以下、これをライト先対応論理ブロックと呼ぶ)に格納されていたデータがデータプールDPに未退避(未だ退避されていない)であるか否かを判断する(SP54)。この判断は、スナップショット差分ビットマップ21上のライト先対応論理ブロックと対応する差分ビット欄21BAに格納された差分ビットが「0」であるか否かを判断することにより行われる。
そしてCPU17は、この判断で否定結果を得るとステップSP62に進む。これに対してCPU17は、この判断で肯定結果を得ると、旧データ退避領域空きビットマップ25(図11)を参照して、かかるライト先対応論理ブロックに格納されているデータの退避先を決定する(SP55)。
具体的に、CPU17は、データプールDP内の対応するプライマリボリュームPVOLと対応付けられた旧データ退避用チャンクCK2(図3)内に、かかるライト先対応論理ブロックに格納されているデータ(旧データ)を退避するだけの記憶領域SA2(図3)の空きがあるか否かを判定する。そしてCPU17は、空きがあると判定した場合には、当該データを退避できる分の記憶領域SA2をその旧データ退避用チャンクCK2内に確保し、確保した記憶領域SA2をかかるデータの退避先として決定する。またCPU17は、データプールDP内のライト先プライマリボリュームPVOLと対応付けられた旧データ退避用チャンクCK2内に、かかる空きがないと判定した場合には、データプールDP上にそのライト先プライマリボリュームPVOLと対応付けた新たな旧データ退避用チャンクCK2を作成し、その旧データ退避用チャンクCK2内にかかるライト先対応論理ブロックのデータを退避可能な分の記憶領域SA2を確保し、確保した記憶領域SA2をかかるデータの退避先として決定する。
この後、CPU17は、ライト先プライマリボリュームPVOL内のライト先対応論理ブロックに格納されているデータ(旧データ)の退避先を旧データ退避アドレステーブル24(図10)に登録する(SP56)。具体的に、CPU17は、旧データ退避アドレステーブル24の第2のエントリ24Bのうち、ライト先対応論理ブロックと対応付けられたアドレス欄24BAに、ステップSP55においてデータの退避先として決定したデータプールDP上の記憶領域SA2のアドレスを格納する。
またCPU17は、旧データ退避領域空きビットマップ25(図11)内の各空きビット欄25AAのうち、ステップSP55においてデータの退避先として決定した記憶領域SA2と対応する空きビット欄25AAに格納されている空きビットを「0」から「1」に変更する(SP57)。
続いて、CPU17は、ライト先プライマリボリュームPVOL内のライト先対応論理ブロックに格納されているデータ(旧データ)を、ライト先プライマリボリュームPVOLから読み出し、これをライトデータとマージする。そしてCPU17は、かかるマージにより得られたマージデータを、データプールDP内のステップSP55において決定した記憶領域SA2に退避させる(SP58)。
次いで、CPU17は、スナップショット差分集約ビットマップ23(図9)上のライト先プライマリボリュームPVOLのライト先対応論理ブロックと対応付けられた差分集約ビット欄23BAに格納されている差分集約ビットを「0」から「1」に変更すると共に(SP59)、スナップショットライト差分ビットマップ28(図21)上のライト先論理ブロックと対応付けられたライト差分ビット欄28BA(図21)に格納されているライト差分ビットを「0」から「1」に変更する(SP60)。またCPU17は、スナップショット差分ビットマップ21におけるライト先論理ブロックと対応付けられた差分ビット欄21BAに格納されている差分ビットを「0」から「1」に変更する(SP61)。
この後、CPU17は、プライマリボリュームPVOLのライト先対応論理ブロックからデータプールDPに退避されているデータ(旧データ)は、ライト先スナップショットと異なる世代のスナップショットと共有されているか否かを判断する(SP62)。この判断は、旧データ退避アドレステーブル24(図10)におけるライト先論理ブロックと対応するアドレス欄24BAに格納されたアドレスと同じアドレスが、当該旧データ退避アドレステーブル24における他のアドレス欄24BAに格納されているか否かを判定することにより行われる。
そしてCPU17は、この判断で肯定結果を得ると、ステップSP55に戻り、この後、ステップSP55〜ステップSP62を上述のように順次処理する。これによりCPU17は、データプールDP内の対応する旧データ退避用チャンクCK2からライト先スナップショットのライト先論理ブロックのデータの退避先(既にデータプールDPに退避されている旧データのコピー先)となる記憶領域SA2を決定し、決定した記憶領域SA2のアドレスを旧データ退避アドレステーブル24の対応するアドレス欄24BAに登録する。
そしてCPU17は、やがてステップSP62において肯定結果を得ると、旧データ退避アドレステーブル24のアドレス欄24BAのうち、ライト先スナップショットのライト先論理ブロックと対応付けられたアドレス欄24BAに格納されているアドレスを取得し(SP63)、ライトデータをデータプールDP内のステップSP63において取得したアドレス位置に上書きする(SP64)。
そしてCPU17は、この後、このスナップショットライト処理を終了する。
(2−4−6)ペア削除処理
図27A及び図27Bは、ホスト計算機3から送信された、プライマリボリュームPVOL及びスナップショットボリュームSSVOLのコピーペアを削除すべき旨のコマンド(つまり、そのスナップショットボリュームSSVOLに保持されたスナップショットを削除すべき旨のコマンドであり、以下、これをペア削除コマンドと呼ぶ)をディスクアレイ装置4が受信した場合にCPU17により実行されるペア削除処理の処理手順を示す。
CPU17は、かかるペア削除コマンドを受信すると、この図27A及び図27Bに示すペア削除処理を開始し、まず、データプールDPに格納されている管理情報のうちの処理に必要な一部の管理情報を、バックエンドインタフェース14(図1)を介してキャッシュメモリ15(図1)に読み出す(SP70)。従って、この後、ペア削除処理における管理情報の参照及び更新等は、キャッシュメモリ15上に読み出されたこれら管理情報に対して行われることになる。
続いてCPU17は、スナップショット差分ビットマップ21(図7)、スナップショット差分集約ビットマップ23(図9)及び旧データ退避アドレステーブル24(図10)を参照して、すべてのスナップショット内のすべての論理ブロックに対する差分反映処理を実行する(SP71)。またCPU17は、この後、旧データ退避未反映ビットマップ26(図15)の各未反映ビット欄26BA(図15)にそれぞれ格納されているすべての未反映ビットを「1」から「0」に変更する(SP72)。
次いで、CPU17は、スナップショット差分集約ビットマップ23(図9)内の第2のエントリ23Bのうち、ペア削除コマンドにおいてペア削除処理の対象として指定されたスナップショットボリュームSSVOLにより保持されているスナップショット(以下、これを対象スナップショットと呼ぶ)と対応付けられた第2のエントリ23B内の差分集約ビット欄23BAを1つ選択し(SP73)、その差分集約ビット欄23BAに格納された差分集約ビットが「1」となっているか否かを判断する(SP74)。
この判断で否定結果を得ることは、スナップショット差分ビットマップ21上のその差分集約ビットと対応付けられた各差分ビットがすべて「0」であり、従って、これら差分ビットとそれぞれ対応付けられた対象スナップショット上の各論理ブロックにそれぞれ格納されたデータのいずれもがデータプールDPに退避されていないことを意味する。かくして、このときCPU17は、ステップSP86に進む。
これに対して、ステップSP74の判断で肯定結果を得ることは、スナップショット差分ビットマップ21上のその差分集約ビットと対応付けられた各差分ビットのうちの少なくとも1つの差分ビットが「1」であり、その差分ビットと対応付けられた対象スナップショット上の論理ブロックに格納されたデータがデータプールDPに退避されていることを意味する。かくして、このときCPU17は、かかるデータプールDPに退避されたかかるデータが他の世代のスナップショットと共有されていない場合には、そのデータをデータプールDP上から削除すべく、以下の処理を実行する。
すなわちCPU17は、まず、スナップショット差分ビットマップ21上の差分ビットのうち、ステップSP73において選択した差分集約ビットと対応付けられた差分ビットを1つ選択し(SP75)、その差分ビットが「1」であるか否かを判断する(SP76)。そしてCPU17は、この判断で否定結果を得るとステップSP84に進む。
これに対してCPU17は、ステップSP76の判断で肯定結果を得ると、スナップショットライト差分ビットマップ28上のライト差分ビットのうち、かかる差分ビットと対応するライト差分ビットが「1」である場合には、そのライト差分ビットを「0」に変更すると共に(SP77)、ステップSP75において選択したスナップショット差分ビットマップ21上の差分ビットを「1」から「0」に変更する(SP78)。
またCPU17は、旧データ退避アドレステーブル24(図10)上のその差分ビットと対応するアドレス欄24BA(図10)を初期化(そのアドレス欄24BAに格納されているアドレスを初期値「0」に変更)する(SP79)。
さらにCPU17は、対象スナップショットの各論理ブロックのうち、ステップSP75において選択した差分ビットと対応する論理ブロックからデータプールDPに退避した旧データが、対象スナップショット以外のスナップショットと共有されているか否かを、図26について上述したスナップショットライト処理のステップSP62と同様に判断する(SP80)。
この判断で肯定結果を得ることは、対象スナップショット内のステップSP75において選択した差分ビットと対応する論理ブロックからデータプールDPに退避された旧データは他のスナップショットと共有されており、従って、その旧データをデータプールDPから削除できないことを意味する。かくして、このときCPU17はステップSP84に進む。
これに対してステップSP80の判断で否定結果を得ることは、対象スナップショット内のステップSP75において選択した差分ビットと対応する論理ブロックからデータプールDPに退避された旧データは他のスナップショットと共有されておらず、従って、そのデータをデータプールDPから削除できることを意味する。かくして、このときCPU17は、旧データ退避領域空きビットマップ25(図11)内の空きビット欄25AAに格納されている空きビットのうち、その旧データが格納されているデータプールDP内の記憶領域SA2(図3)に対応する空きビット欄25AAに格納されている空きビットを「1」から「0」に変更する(SP81)。
続いてCPU17は、ステップSP81の処理によりデータプールDP内の対応する旧データ退避用チャンクCK2(図3)から完全に旧データ(プライマリボリュームPVOLから退避された旧データ)を削除し終えたか否かを判断する(SP82)。
そしてCPU17は、この判断で否定結果を得るとステップSP84に進み、これに対して肯定結果を得ると、かかる旧データ退避用チャンクCK2を解放する(SP83)。
次いで、CPU17は、スナップショット差分ビットマップ21(図7)上の差分ビットのうち、ステップSP73において選択した差分集約ビットに対応するすべての差分ビットについて、ステップSP74〜ステップSP83の処理を実行し終えたか否かを判断する(SP84)。
そしてCPU17は、この判断で否定結果を得ると、ステップSP75に戻り、この後、ステップSP75において選択する差分ビットを他の差分ビットに変更しながら、ステップSP76〜ステップSP84の処理を繰り返す。
そしてCPU17は、やがてステップSP73において選択した差分集約ビットと対応付けられたすべての差分ビットについてステップSP74〜ステップSP83の処理を実行し終えることによりステップSP84において肯定結果を得ると、ステップSP73において選択した差分集約ビットを「1」から「0」に変更する(SP85)。
この後、CPU17は、スナップショット差分集約ビットマップ23内の第2のエントリ23Bのうち、対象スナップショットと対応付けられた第2のエントリ23B内のすべての差分集約ビットについて、ステップSP73〜ステップSP85の処理を実行し終えたか否かを判断する(SP86)。
そしてCPU17は、この判断で否定結果を得るとステップSP73に戻り、この後、ステップSP73において選択する差分集約ビットを対象スナップショットと対応付けられた第2のエントリ23B内の他の差分集約ビットに順次切り替えながら、ステップSP73〜ステップSP86の処理を繰り返す。
そしてCPU17は、やがて対象スナップショットと対応付けられた第2のエントリ23B内のすべての差分集約ビットについてステップSP73〜ステップSP85の処理を実行し終えることによりステップSP86で肯定結果を得ると、このペア削除処理を終了する。
なお、上述のペア削除処理により、同一のプライマリボリュームPVOLとコピーペアに設定されたすべてのスナップショットボリュームSSVOLのペア設定が解除された場合(つまり同一のプライマリボリュームPVOLについて取得されたすべてのスナップショットが削除された場合)、そのタイミングでそのプライマリボリュームPVOLが使用していた管理情報が格納されていた管理情報格納用チャンクCK1(図3)が解放される。
(3)本実施の形態による管理情報へのアクセス方式
(3−1)世代塊
次に、本実施の形態によるディスクアレイ装置4において、データプールDPから必要なスナップショットの管理情報をキャッシュメモリ15に読み出す際や、キャッシュメモリ15に読み出した管理情報にCPU17がアクセスする際のアクセス方式について説明する。
上述のように本ディスクアレイ装置4では、同一のプライマリボリュームPVOLに対して最大1024個のスナップショットを取得することが可能であるため、これら1024個分のスナップショットの管理情報も莫大なデータ量となる。そこで、本ディスクアレイ装置4では、スナップショットの管理情報のうち、ペア管理テーブル20(図6)及び分割順番号−世代番号マッピングテーブル27(図17)についてはコントローラ11のキャッシュメモリ15に駐在させておくものの、これ以外のスナップショット差分ビットマップ21(図7)、プライマリボリューム差分ビットマップ22(図8)、スナップショット差分集約ビットマップ23(図9)、旧データ退避アドレステーブル24(図10)、旧データ退避領域空きビットマップ25(図11)、旧データ退避未反映ビットマップ26(図15)及びスナップショットライト差分ビットマップ28(図21)については、データプールに保持しておき、必要時に必要な管理情報のみをデータプールDPからキャッシュメモリ15に読み出す(ステージング)方式を採用している。
この場合において、本ディスクアレイ装置4は、データ量の少ないプライマリボリューム差分ビットマップ22、旧データ退避領域空きビットマップ25、旧データ退避未反映ビットマップ26については必要なビットのみをキャッシュメモリ15に読み出す一方、スナップショット差分ビットマップ21、スナップショット差分集約ビットマップ23、旧データ退避アドレステーブル24及びスナップショットライト差分ビットマップ28については、そのとき存在するスナップショットの世代数に応じて、データプールDPからキャッシュメモリ15に読み出す世代数及びLBAの範囲を変えている点を特徴としている。
実際上、本実施の形態においては、図28に示すように、世代番号が「0」〜「2」の3つ世代については、これら3世代のスナップショットの管理情報をすべてまとめたものを1つの塊(以下、これを3世代塊と呼ぶ)として、必要時にこの3世代塊単位でデータプールDPからキャッシュメモリ15に管理情報を読み出している。
また世代番号が「3」〜「63」の61世代については、これら61世代分のスナップショットの管理情報のうち、LBAが小さい半数分の論理ブロックの管理情報をすべてまとめて1つの塊とし、LBAが大きい半数分の論理ブロックの管理情報をすべてまとめて1つの塊として、必要時にこの塊(以下、これらの塊をそれぞれ61世代塊と呼ぶ)単位でデータプールDPからキャッシュメモリ15に管理情報を読み出している。つまり、61世代塊は3世代塊と比較して、狭い範囲のLBA論理ブロックと対応する管理情報であり、多くの世代数と対応する管理情報である。
さらに、世代番号が「125」以降の世代については、世代を243世代ごとに区切り、個々の243世代分のスナップショットの管理情報を、論理ブロックのLBAに応じて所定個数の論理ブロック単位で分け、243世代分のスナップショットの管理情報のうちの所定個数の論理ブロック分の管理情報をそれぞれ別個の塊(以下、これらをそれぞれ243世代と呼ぶ)として、必要時にこの243世代塊単位でデータプールDPからキャッシュメモリ15に管理情報を読み出している。つまり、243世代塊は61世代塊と比較して、狭い範囲のLBA論理ブロックと対応する管理情報であり、多くの世代数と対応する管理情報である。
つまり「世代塊」とは、複数世代のスナップショットの管理情報にCPU17がアクセスする際のデータ単位を意味し、CPU17がデータプールDPからキャッシュメモリ15に一度に読み出したり、キャッシュメモリ15上でCPU17がアクセスするスナップショットの管理情報の単位である。
そして、本ディスクアレイ装置4においては、このように世代塊の範囲を定めることにより、同一のプライマリボリュームPVOLについて取得されたスナップショットの世代が少ない場合には、世代数は少ないものの広い範囲の論理ブロックの管理情報をキャッシュヒットさせることができ、同一のプライマリボリュームPVOLについて取得されたスナップショットの世代が多い場合には、多くの世代の管理情報をキャッシュヒットさせることができるようになされている。
なお、本実施の形態の場合、図28からも明らかなように、スナップショットの世代として、外部仕様の1024世代に対して内部的に1097世代分の管理情報を保持することができ、73世代分のスナップショットの管理情報を外部仕様よりも多く保持できるようになされている。これは、スナップショットの再同期、削除及びリストアが管理情報の初期化やデータプールDPに退避されたデータ(旧データ)のバックグランド処理に多くの時間を要し、その間データプールDP上のその世代のスナップショットの管理情報を格納する記憶領域が使用できなくなることに起因する。すなわち、本ディスクアレイ装置4においては、上述のように73世代分のマージンを確保することにより、仮に1024世代のスナップショットをすべて一度に削除する操作が行われた場合においても、少なくとも73世代分のスナップショットを即座に生成できることとしている。
(3−2)スナップショットに対する世代番号の割り当て
次に、本ディスクアレイ装置4においてスナップショットに世代番号を割り当てる際の割当て方式について説明する。
(3−2−1)原則
本ディスクアレイ装置4の場合、原則として、プライマリボリュームPVOLから分割された順番が早いスナップショットボリュームSSVOLにより保持されているスナップショットに対してより若い世代番号を割り当てる。そしてスナップショットボリュームSSVOLの削除が行われるなどして使用可能な世代番号が発生した場合には、その使用可能な世代番号を若い方から順番に前詰めで新しいスナップショットに割り当てる。
例えば、図29A(A−1)及び(A−2)に示すように、プライマリボリュームPVOLとコピーペアに設定されたいずれのスナップショットボリュームSSVOLについて、当該プライマリボリュームとコピーペアが削除されていない初期状態では、スナップショットボリュームSSVOL0〜SSVOL2がプライマリボリュームPVOLから分割されてスナップショットが取得されるごとに、そのスナップショットに対して若い世代番号が順番に割り当てられる。
なお、図29A(A−1)及び(A−2)は、スナップショットボリュームSSVL0〜3がプライマリボリュームPVOLから順次分割され、これにより各スナップショットボリュームSSVL0〜3にそれぞれ保持されることになった各スナップショットにそれぞれ世代番号として「0」〜「3」が付与された状態を示している。また、この例では、プライマリボリュームPVOL及びスナップショットボリュームSSVOL4のコピーペアのペア状態は「ペアード」の状態にあるものとする。
この後、スナップショットボリュームSSVOL1が、当該スナップショットボリュームSSVOL1の内容を再びプライマリボリュームPVOLと一致させる再同期状態(ペア状態は「ペアード」)となると、図29A(B−1)及び(B−2)に示すように、スナップショットボリュームSSVOL1が保持するスナップショットが削除され、これに伴い「1」という世代番号が未使用となる。また、かかるスナップショットボリュームSSVOL1が保持するスナップショットの削除に伴い、当該スナップショットの管理情報の初期化が実行される。
そして、この後、例えば、第1世代(世代番号は「1」)のスナップショットの管理情報の初期化処理が完了する前に、スナップショットボリュームSSVOL1が再度プライマリボリュームPVOLから分割されると、図29B(A−1)及び(A−2)に示すように、スナップショットSSVOL1が保持するスナップショットに対して「4」という世代番号が付与される。
さらに、この後、第1世代(世代番号は「1」)のスナップショットの管理情報の初期化処理が完了し、「1」という世代番号が使用可能になった後に、スナップショットボリュームSSVOL4がプライマリボリュームPVOLから分割されると、図29B(B−1)及び(B−2)に示すように、そのとき空いている最も若い世代番号である「1」がスナップショットボリュームSSVOL4により保持されたスナップショットに対して付与される。
なお、以上のようなスナップショットに対する世代番号の割り当ては、スナップショットの取得後、プライマリボリュームPVOLに対して最初のアクセス(ライトアクセス又はリードアクセス)が発生したタイミングで行われ、そのタイミングでそのスナップショットに割り当てる世代番号が決定される。
(3−2−2)例外
上述のように、本ディスクアレイ装置4では、プライマリボリュームPVOLについて取得された最初のスナップショットに世代番号を割り当てる際は、図30(A)に示すように、3世代塊を構成する世代の中から最も若い世代の世代番号(つまり第0世代)を割り当て、その後、スナップショットが取得されるごとに、残存する最も若い世代の世代番号をそのスナップショットに順次割り当てることを原則としている。
一方で、本ディスクアレイ装置4は、図30(B)に示すように、3世代塊を構成する世代(第0世代〜第3世代)の世代番号をすべてスナップショットに割り当て終え、1つ目の61世代塊を構成する世代番号をスナップショットに割り当て始めた以降(つまり第4世代の世代番号をスナップショットに割り当てた以降)は、スナップショットの削除などにより3世代塊に使用可能な世代番号(図30(B)の第1世代)があったとしても、新規には3世代塊から世代番号を割り当てず、それ以降の世代塊を構成する世代の世代番号を割り当てる点をも特徴の1つとしている。
これはデータプールDPからキャッシュメモリ15に管理情報(スナップショット差分ビットマップ21、スナップショット差分集約ビットマップ23、旧データ退避アドレステーブル24及び又はスナップショットライト差分ビットマップ28)を読み出す回数を抑えることにより性能の向上を図るためである。
すなわち、同一のプライマリボリュームPVOLについて取得されたスナップショット数が3世代塊に収まるような程度であれば(つまり3世代までであれば)、3世代塊に管理情報を割り当てることにより良い性能が得られる。しかしながら、同一のプライマリボリュームPVOLについて取得されたスナップショット数がこれ以上になると、管理情報の更新の度に複数世代塊のデータプールDPからキャッシュメモリ15への管理情報の読み出しが必要となり、性能が低下する。
そこで、本ディスクアレイ装置4の場合、初期導入の際は3世代塊を構成する世代番号を使用し、これ以降はできるだけ61世代塊を構成する世代番号以降の世代番号をスナップショットに割り当てることにより、3世代塊を構成する世代の世代番号が割り当てられたスナップショットの管理情報をデータプールDPからキャッシュメモリ15に読み出す必要性をなくし、性能を向上させ得るようにしている。
例えば図30(A)及び(B)の例では、61世代塊に属する世代番号のスナップショットを処理する場合、3世代塊に属する各世代番号のスナップショットの管理情報と、61世代塊に属する各世代番号のスナップショットの管理情報とをデータプールDPからキャッシュメモリ15に読み出さなければならず、スナップショットの管理情報の読出し処理が2回必要となる。しかしながら、この後、上述のような世代番号の割当て処理を行うことによって、3世代塊に属する各世代番号のスナップショットが削除された場合に、図30(C)に示すように、61世代塊に属する世代番号のスナップショットの管理情報のみを読み出せば良いため、かかる読出し処理を1回で済ませることができる。
(3−2−3)世代番号割当て処理
図31は、スナップショットに世代番号を割り当てる世代番号割当て処理の具体的な処理手順を示す。CPU17は、この図31に示す処理手順に従って、新たに取得されたスナップショットに世代番号を割り当てる。
すなわちCPU17は、プライマリボリュームPVOL及びスナップショットボリュームSSVOLから構成されるコピーペアの分割をすべき旨のペア分割コマンドが与えられると、この世代番号割当て処理を開始し、まず、ペア管理テーブル20(図6)に登録されたそのペアのペア状態を検索し、当該コピーペアを分割(スナップショットを取得)できる状態にあるか否かを判断する(SP90)。
この場合において、例えば対象とするコピーペア(以下、これを対象ペアと呼ぶ)のペア状態が既に「スプリット」となっている(既にスナップショットが取得されている)場合や、かかるペア状態が「シンプレックス」である場合などのときには、そのコピーペアを分割することはできない。かくして、CPU17は、ステップSP90の判断で否定結果を得ると、かかるペア分割コマンドの送信元のホスト計算機3にエラーを通知し(SP91)、この後、この世代番号割当て処理を終了する。
これに対してCPU17は、ステップSP90の判断で肯定結果を得ると、対象ペアを分割する(SP92)。具体的に、CPU17は、ペア管理テーブル20における対象ペアと対応するエントリ20A(図6)のペア状態欄20Cに格納されているペア状態を「スプリット」に変更する。
続いてCPU17は、ステップSP92のペア分割により取得したスナップショットに対するアクセスコマンドを受信するなどして、そのスナップショットの管理情報が必要となるのを待ち受ける(SP93)。
そしてCPU17は、やがてかかるスナップショットの管理情報が必要となると、対応するプライマリボリュームPVOLについて現在取得されているスナップショットの世代数が3よりも大きいか否かを判断する(SP94)。
CPU17は、この判断で肯定結果を得ると、3世代塊以外の世代塊に属する世代番号の中から最も若い世代番号を選択し、その世代番号をそのスナップショットに割り当てる(SP95)。そしてCPU17は、この後、この世代番号割当て処理を終了する。
これに対してCPU17は、ステップSP94の判断で否定結果を得ると、3世代塊を含むすべての世代塊にそれぞれ属するすべての世代番号のうち、最も若い世代番号を選択し、その世代番号をそのスナップショットに割り当てる(SP96)。そしてCPU17は、この後、この世代番号割当て処理を終了する。
(3−2−4)管理情報取得処理
図32は、ライトコマンドやリードコマンド又はコピーペアを操作するペア操作コマンドなど、対応する処理を実行するために対応するスナップショットの管理情報が必要となるコマンドがホスト計算機3からディスクアレイ装置4に与えられた場合にCPU17により実行される管理情報取得処理の処理手順を示す。なお、通常、この種のコマンドでは、対象となる論理ボリュームVOL(プライマリボリュームPVOL及び又はスナップショットボリュームSSVOL等)のLUN及び当該論理ボリュームVOL内の対象となるLBAが指定されるため、以下においてはこれを前提として説明する。
CPU17は、かかるコマンドを受信すると、この図32に示す管理情報取得処理を開始し、まず、ペア管理テーブル20(図6)を参照して、かかるコマンドの対象となるスナップショットの世代番号を取得する(SP100)。例えば、CPU17は、LUNが「1」のスナップショットボリュームSSVOLを対象とするライトコマンドを受信した場合、ペア管理テーブル20のエントリ20A(図6)のうち、LUN欄20D(図6)に「1」が格納されているエントリ20Aを検索し、そのエントリ20Aの世代番号欄20E(図6)に格納されている世代番号(図6では「1」)を取得する。この世代番号は、かかるスナップショットボリュームSSVOLにより保持されているスナップショットの世代番号である。
続いて、CPU17は、ステップSP100において取得した対象とするスナップショットの世代番号と、かかるコマンドから認識される処理対象となるLBAの範囲とに基づいて、コマンドに応じた処理を実行するのに必要なスナップショットの管理情報がどの世代塊に属するかを特定する(SP101)。
次いで、CPU17は、ステップSP101において特定した世代塊の管理情報がキャッシュメモリ15(図1)上に存在するか否かを判断する(SP102)。この場合、CPU17は、キャッシュメモリ15上に存在する世代塊を管理情報ステージング情報として常に管理している。従って、この判断はかかる管理情報ステージング情報に基づいて行われる。
そしてCPU17は、この判断で肯定結果を得ると、ステップSP101において特定した世代塊の管理情報をキャッシュメモリ15から読み出し(SP103)、この後、この管理情報取得処理を終了する。またCPU17は、ステップSP104の判断で否定結果を得ると、ステップSP102において特定した世代塊の管理情報をデータプールDPからキャッシュメモリ15に読み出し(SP104)、この後、この管理情報取得処理を終了する。
かくしてCPU17は、この後、ステップSP103又はステップSP104において取得した世代塊の管理情報に基づいて、上述のコマンドに応じた処理を実行する。
(4)本実施の形態の効果
以上のように本実施の形態によるディスクアレイ装置4では、スナップショットの管理情報をデータプールDP内に保持し、必要時に必要な管理情報のみをコントローラ11内のキャッシュメモリ15に読み出すようにしているため、キャッシュメモリ15のメモリ容量によって取得可能なスナップショットの数が制限されることがない。従って、本ディスクアレイ装置に4によれば、キャッシュメモリのメモリ容量によってスナップショットの取得数が制限されていた従来のディスクアレイ装置と比して、より多くのスナップショットを取得することができる。
また本ディスクアレイ装置4では、プライマリボリュームPVOLへのデータライト時には、旧データを共有する複数世代のスナップショットのうち、最新世代のスナップショットの管理情報のみを更新し、残りの世代のスナップショットの管理情報については、その残りのスナップショットへのアクセスがあったときや、その残りのスナップショットを削除する際に更新するため、スナップショット管理情報の更新処理の処理負荷がプライマリボリュームPVOLへのライト性能に悪影響を及ぼすのを未然かつ有効に防止することができる。かくするにつき、ディスクアレイ装置4全体としての信頼性を向上させることができる。
(5)他の実施の形態
なお上述の実施の形態においては、本発明を図1のように構成されたディスクアレイ装置に適用するようにした場合について述べたが、本発明はこれに限らず、この他種々の構成を有するストレージ装置に広く適用することができる。
また上述の実施の形態においては、差分反映処理を、差分反映処理すべきスナップショットへのアクセスがあったときや、そのスナップショットを削除する際に実行するようにした場合について述べたが、本発明はこれに限らず、これ以外のタイミングでかかる差分反映処理を実行するようにしても良い。
さらに上述の実施の形態においては、データプールDPに保持したスナップショットの管理情報を読み出すメモリとしてキャッシュメモリ15を適用するようにした場合について述べたが、本発明はこれに限らず、かかる管理情報を例えばローカルメモリ16に読み出すようにしても良く、さらには、かかる管理情報を読み出すための専用のメモリを設けるようにしても良い。
さらに上述の実施の形態においては、データプールDPからスナップショットの管理情報を読み出す単位である世代塊を図28について上述したように定義するようにした場合について述べたが、本発明はこれに限らず、個々の世代塊をこれ以外の内容で定義するようにしても良い。