以下、本発明の実施形態について、図面を参照して説明する。なお、以下に説明する実施形態は特許請求の範囲に係る発明を限定するものではなく、また実施形態の中で説明されている諸要素及びその組み合わせの全てが発明の解決手段に必須であるとは限らない。また、発明の構成に必須だが周知である構成については、図示及び説明を省略する場合がある。
以下の説明において、「xxxテーブル」といった表現により、入力に対して出力が得られる情報を説明することがあるが、この情報は、どのような構造のデータでもよい。従って、「xxxテーブル」を「xxx情報」と言うことができる。
また、以下の説明において、各テーブルの構成は一例であり、1つのテーブルは、2以上のテーブルに分割されてもよいし、2以上のテーブルの全部又は一部が1つのテーブルであってもよい。
また、以下の説明において、「プログラム」を主語として処理を説明する場合がある。プログラムは、プロセッサ部によって実行されることで、定められた処理を、適宜に記憶部及び/又はインターフェース部などを用いながら行うため、処理の主語が、プロセッサ部(或いは、そのプロセッサ部を有するコントローラのようなデバイス)とされてもよい。
プログラムは、計算機のような装置にインストールされてもよいし、例えば、プログラム配布サーバ又は計算機が読み取り可能な(例えば非一時的な)記録媒体にあってもよい。また、以下の説明において、2以上のプログラムが1つのプログラムとして実現されてもよいし、1つのプログラムが2以上のプログラムとして実現されてもよい。
また、「プロセッサ部」は、1又は複数のプロセッサである。プロセッサは、典型的には、CPU(Central Processing Unit)のようなマイクロプロセッサであるが、GPU(Graphics Processing Unit)のような他種のプロセッサでもよい。また、プロセッサは、シングルコアでもよいしマルチコアでもよい。また、プロセッサは、処理の一部又は全部を行うハードウェア回路(例えばFPGA(Field-Programmable Gate Array)又はASIC(Application Specific Integrated Circuit))といった広義のプロセッサでもよい。
また、以下の説明において、種々の対象の識別情報として、識別番号が使用されるが、識別番号以外の種類の識別情報(例えば、英字や符号を含んだ識別子)が採用されてもよい。以下の説明において、“#”は番号を表し、例えば“xxx#”は、番号で識別されるxxxを表す。
また、以下の説明において、同種の要素を区別しないで説明する場合には、参照符号(又は、参照符号のうちの共通符号)を使用し、同種の要素を区別して説明する場合は、要素の識別番号(又は参照符号)を使用することがある。また各図に示す各要素の数は一例であって、図示に限られるものではない。
図1は、実施例に係るストレージシステム201の論理構成の概要の説明図である。ストレージシステム201は、Snapshotを作成する際、RoW(Redirect on Write)方式を用いるストレージシステムである。図1に示すように、ストレージシステム201は、論理構成として、PVOL(Primary Volume)100、Snapshot101、DSVOL(Data Store Volume)102、及びPool107を有する。
PVOL100は、ホスト装置に提供される論理ボリュームである。Snapshot101は、RoW方式により作成されたPVOL100の複製ボリュームであり、ホスト装置に提供される。
Pool107は、物理ドライブ(不図示)から物理記憶領域が割り当てられている。DSVOL102は、Pool107から切り出される論理記憶領域で、複数のDSVOL102-i(i=0,1,・・・,n-1(nはPool107毎に固定のDSVOL数))を含む論理記憶領域である。DSVOL102-iは、全て同一容量である。
DSVOL102には、PVOL100の管理情報(メタ情報)を保存するPVOL用のディレクトリテーブル103が、DSVOL102-iのそれぞれに、ディレクトリテーブル103-i(i=0,1,・・・,n-1)として分散配置される。PVOL100の管理情報は、2段階層のツリー構成のマッピング情報であり、PVOL用のディレクトリテーブル103は第1階層のマッピング情報に該当する。
PVOL用のディレクトリテーブル103は、ディレクトリテーブル103-i(i=0,1,・・・,n-1)のグループであり、PVOL100毎に設けられる。ディレクトリテーブル103にはディレクトリ#が付与される。PVOLの容量によって複数のディレクトリテーブル103が1つのPVOLに割り当てられることがある。その場合、ディレクトリ#も複数割り当てられる。
PVOL用のディレクトリテーブル103は、PVOL100上のデータ111-j(j=0,1,2)のPVOL内アドレスを、マッピングテーブル105が格納されるDSVOL102内のアドレスへ変換するテーブルである。
またDSVOL102には、Snapshot101の管理情報(メタ情報)を保存するSS(SnapShot)用のディレクトリテーブル104が、DSVOL102-iのそれぞれに、ディレクトリテーブル104-i(i=0,1,・・・,n-1)として分散配置される。SS用のディレクトリテーブル104のうちのディレクトリテーブル104-iは、PVOL用のディレクトリテーブル103のうちのディレクトリテーブル103-iのコピーである。
SS用のディレクトリテーブル104は、ディレクトリテーブル104-i(i=0,1,・・・,n-1)のグループであり、Snapshot101毎に設けられる。ディレクトリテーブル104にはディレクトリ#が付与される。Snapshotの容量によって複数のディレクトリテーブル104が1つのSnapshotに割り当てられることがある。その場合、ディレクトリ#も複数割り当てられる。SS用のディレクトリテーブル104は、PVOL用のディレクトリテーブル103と同一のテーブル構成である。
SS用のディレクトリテーブル104は、Snapshot101上のデータ111-j(j=1,2,3)のSnapshot内アドレスを、マッピングテーブル105が格納されるDSVOL102内のアドレスへ変換するテーブルである。
またDSVOL102には、PVOL100及びSnapshot101の管理情報(メタ情報)を保存するマッピングテーブル105が、DSVOL102-iのそれぞれに、マッピングテーブル105-i(i=0,1,・・・,n-1)として分散配置される。マッピングテーブル105は、上述の2段階層のツリー構成のマッピング情報のうちの第2階層のマッピング情報に該当する。
マッピングテーブル105は、マッピングテーブル105-i(i=0,1,・・・,n-1)のグループであり、PVOL100毎に設けられる。複数のマッピングテーブル105を、マッピング#のように番号で区別する。マッピング#は、Snapshotツリー(あるPVOLをRootとしたSnapshotのグループ)毎に割り当てられ、PVOL又はSnapshotへのライトによるデータ容量の増加に応じて増える。
マッピングテーブル105は、データ111-j(j=0,1,2,3)のPVOL/Snapshot内アドレスを、追記領域106内アドレスへ変換するテーブルである。
またDSVOL102には、PVOL100及びSnapshot101のデータを格納する追記領域106が、DSVOL102-iのそれぞれに、追記領域106-i(i=0,1,・・・,n-1)として分散配置される。
以上のように、各DSVOL102-iには、1つ以上の(PVOL用の)ディレクトリテーブル103-i、1つ以上の(SS用の)ディレクトリテーブル104-i、1つ以上のマッピングテーブル105-i、及び追記領域106-iが配置される。
図2は、実施例1に係る計算機システム100のハードウェア構成の説明図である。計算機システム100は、ストレージシステム201、サーバシステム202、及び管理システム203を備える。ストレージシステム201とサーバシステム202とは、FC(Fiber Channel)ネットワーク204を介して接続される。ストレージシステム201と管理システム203とは、IP(Internet Protocol)ネットワーク205を介して接続される。なお、FCネットワーク204及びIPネットワーク205は、同一の通信ネットワークであってもよい。
ストレージシステム201は、複数のストレージコントローラ210と、複数のPDEV220とを備える。ストレージコントローラ210には、物理ドライブであるPDEV220が接続されている。1つのストレージコントローラ210に対して、1又は複数のDSVOL102-i(i=0,1,・・・,n-1)が割り当てられている。
ストレージコントローラ210は、1つ以上のプロセッサ211と、1つ以上のメモリ212と、P-I/F213と、S-I/F214と、M-I/F215とを備える。
プロセッサ211は、プロセッサ部の一例である。プロセッサ211は、圧縮及び伸張を行うハードウェア回路を含んでいてもよい。本実施例では、プロセッサ211は、Snapshot作成、リストア、リシンク、圧縮、及び伸張に係る制御等を行う。
メモリ212は、記憶部の一例である。メモリ212は、プロセッサ211が実行するプログラム、プロセッサ211が使用するデータ等を記憶する。プロセッサ211は、メモリ212に格納されているプログラムを実行する。なお、本実施例では、例えば、メモリ212及びプロセッサ211の組でメモリが二重化されている。
P-I/F213、S-I/F214及びM-I/F215は、インターフェース部の一例である。
P-I/F213は、PDEV220とストレージコントローラ210との間のデータのやり取りを仲介する通信インターフェースデバイスである。P-I/F213には、複数のPDEV220が接続される。
S-I/F214は、サーバシステム202とストレージコントローラ210との間のデータのやり取りを仲介する通信インターフェースデバイスである。S-I/F214に、FCネットワーク204を介して、サーバシステム202が接続される。
M-I/F215は、管理システム203とストレージコントローラ210の間のデータのやり取りを仲介する通信インターフェースデバイスである。M-I/F215に、IPネットワーク205を介して、管理システム203が接続される。
サーバシステム202は、1つ以上のホスト装置を含んで構成される。サーバシステム202は、ストレージコントローラ210に対して、I/O先を指定したI/O要求(ライト要求又はリード要求)を送信する。I/O先は、例えば、LUN(Logical Unit Number)のような論理ボリューム番号、LBA(Logical Block Address)のような論理アドレス等である。
管理システム203は、1つ以上の管理装置を含んで構成される。管理システム203は、ストレージシステム201を管理する。
図3は、ストレージシステム201が使用するプログラム及び情報の説明図である。メモリ212は、ローカルメモリ300、キャッシュメモリ301、共有メモリ302等のメモリ領域を含む。これらのメモリ領域のうちの少なくとも1つは、独立したメモリであってもよい。ローカルメモリ300は、このローカルメモリ300を含むメモリ212と同一組に属するプロセッサ211により使用される。
ローカルメモリ300には、ボリューム作成プログラム303、Snapshot作成プログラム304、リードプログラム305、フロントエンドライトプログラム306、バックエンドライトプログラム307、リストアプログラム308、リシンクプログラム309、及びPVOL/Snapshot削除プログラム310が格納される。これらのプログラムは、複数のストレージコントローラ210毎に設けられ、互いに協働して目的の処理を行う。これらのプログラムについては後述する。
キャッシュメモリ301には、PDEV220に対してライト又はリードされるデータセットが一時的に格納される。
共有メモリ302は、この共有メモリ302を含むメモリ212と同一組に属するプロセッサ211、及び異なる組に属するプロセッサ211の両方により使用される。共有メモリ302には、管理情報が格納される。
管理情報は、ボリューム管理テーブル311、ディレクトリ領域管理テーブル312、マッピング領域管理テーブル313、ディレクトリ領域割り当てテーブル314、マッピング領域割り当てテーブル315、及びSnapshot世代管理テーブル316を含む。これらのテーブルについては、図を参照して後述する。
図4は、ディレクトリテーブル103-i,104-i(i=0,1,・・・,n-1)の構成の説明図である。PVOL用のディレクトリテーブル103-iとSS用のディレクトリテーブル104-iは同一構成かつ同一データサイズであり、それぞれDSVOL102-iに分散配置される。各ディレクトリテーブル103-i,104-iの1つのエントリは、PVOL100の論理データの粒度(例えば256KB)単位のデータに対応する。すなわちディレクトリテーブル103,104は、PVOL100の論理データの粒度を単位として、複数のDSVOL102-iに分散配置される。ディレクトリテーブル104-i(i=0,1,・・・,n-1)は、DSVOL102-iのストレージコントローラ210の制御により、ディレクトリテーブル103-i(i=0,1,・・・,n-1)がコピーされたテーブルである。
ディレクトリテーブル103-i,104-iは、PVOL/Snapshot内アドレス400及び参照先アドレス(マッピング領域内アドレス)401を有する。PVOL/Snapshot内アドレス400は、ディレクトリテーブル103-iの場合はPVOL100内での対象データの格納論理アドレスであり、ディレクトリテーブル104-iの場合はSnapshot101内での対象データの格納論理アドレスである。参照先アドレス(マッピング領域内アドレス)401は、マッピングテーブル105-iへのポインタ情報である。PVOL/Snapshot内アドレス400には上限値(図4の例では1000000)があり、上限値を超過すると新たなグループ(ディレクトリ#)のディレクトリテーブルが作成される。
またアクセスしたPVOL/Snapshot内アドレス400と参照先アドレス(マッピング領域内アドレス)401の対応関係を格納しているテーブルが、該当のディレクトリ#の何れのディレクトリテーブル103-i,104-iであるかは、PVOL/Snapshot内アドレス400をDSVOLの数nで割った剰余で求められる。
参照先アドレス(マッピング領域内アドレス)401は、当該ディレクトリテーブル103-i,104-iに対応付けられたマッピングテーブル105-iのマッピング領域内アドレス500に対応する。
図5は、マッピングテーブル105-i(i=0,1,・・・,n-1)の構成の説明図である。マッピングテーブル105-iは、マッピング領域内アドレス500、参照先アドレス(追記領域内アドレス)501、及び圧縮後容量502を有する。
マッピング領域内アドレス500は、当該マッピングテーブル105-iに対応付けられたディレクトリテーブル103-i,104-iの参照先アドレス(マッピング領域内アドレス)401である。参照先アドレス(追記領域内アドレス)501は、対象データが格納される追記領域106内のアドレスである。圧縮後容量502は、PVOL100又はSnapshot101の対象データが、追記領域106-iに格納される際の圧縮後のデータ量である。
図6は、ボリューム管理テーブル311の構成の説明図である。ボリューム管理テーブル311は、PVOL100、Snapshot101、及びDSVOL102等のボリュームを管理するテーブルである。ボリューム管理テーブル311は、VOL#600、属性601、ディレクトリ#602、マッピング#603、容量604、及びPool#605を有する。
VOL#600は、ボリュームを識別する番号である。属性601は、VOL#600で識別されるボリュームの種別であり、PVOL、Snapshot、DSVOL等がある。ディレクトリ#は、VOL#600で識別されるボリュームに割り当てられたディレクトリテーブルのグループの番号である。
ディレクトリ#として、当該ボリュームの容量に応じて、DSVOL102上の領域が複数割り当てられる。例えば図6では、VOL#が0のPVOLには、ディレクトリ#が0,10,200のPVOL用のディレクトリテーブルのグループが割り当てられる。またVOL#が1のSnapshotには、ディレクトリ#が1,5,20のSnapshot用のディレクトリテーブルのグループが割り当てられる。DSVOL102のディレクトリ#602は、NULLである。
マッピング#603は、VOL#600で識別されるボリュームに割り当てられるマッピングテーブルのグループの番号である。PVOL100をコピーしたSnapshot101のマッピング#は、複写元のPVOLと共通である。例えば図6では、VOL#が0,1の各ボリュームには、マッピング#が2,5,10のマッピングテーブルのグループが割り当てられる。DSVOL102のマッピング#603は、NULLである。
容量604は、VOL#600で識別されるボリュームの容量である。Pool#605は、VOL#600で識別されるボリュームが切り出されるPoolの番号である。
図7は、ディレクトリ領域管理テーブル312の構成の説明図である。ディレクトリ領域管理テーブル312は、DSVOL102上における各ディレクトリ#の先頭アドレスを管理するテーブルである。ディレクトリ領域管理テーブル312は、ディレクトリ#700及びディレクトリ領域先頭アドレス701を有する。例えばディレクトリ#が0のディレクトリには、同一のDSVOL102上のアドレス50を先頭アドレスとする領域が確保されている。
対象データのPVOL/Snapshot内アドレスを、1つのディレクトリテーブルの管理可能容量で除算した商から、当該VOL/Snapshot内のディレクトリ#の通番が求まる。ディレクトリ#700は、図6のディレクトリ#602を参照し、ディレクトリ#の通番から求められる。
図8は、マッピング領域管理テーブル313の構成の説明図である。マッピング領域管理テーブル313は、DSVOL102上における各マッピング#の先頭アドレスを管理するテーブルである。マッピング領域管理テーブル313は、マッピング#800及びマッピング領域先頭アドレス801を有する。
図9は、ディレクトリ領域割り当てテーブル314の構成の説明図である。ディレクトリ領域割り当てテーブル314は、DSVOL102上のディレクトリ領域先頭アドレス900に割り当てられている各ディレクトリ#を管理するテーブルであり、ディレクトリ領域管理テーブル312の逆引きテーブルである。ディレクトリ領域割り当てテーブル314は、ディレクトリ領域先頭アドレス900及び割り当てディレクトリ#901を有する。
図10は、マッピング領域割り当てテーブル315の構成の説明図である。マッピング領域割り当てテーブル315は、DSVOL102上のマッピング領域先頭アドレス1000に割り当てられている各マッピング#を管理するテーブルであり、マッピング領域管理テーブル313の逆引きテーブルである。マッピング領域割り当てテーブル315は、マッピング領域先頭アドレス1000及び割り当てマッピング#1001を有する。
図11は、Snapshot世代管理テーブル316の構成の説明図である。Snapshot世代管理テーブル316では、複製元であるPVOL100のPVOL#毎に、Snapshotの最新世代が管理される。Snapshot世代管理テーブル316は、PVOL#1100、最新世代#1101、世代#1102、Snapshot作成時刻1103、Snapshot#1104、及び状態1105を有する。Snapshot世代管理テーブル316は、PVOL#毎に例えば1024個の世代を管理する(世代#=0~1023)。
Snapshot世代管理テーブル316では、各PVOL#のSnapshot作成毎に最新世代#がインクリメントされ、最新世代#1101に該当するSnapshot作成時刻1103、Snapshot#1104、及び状態1105が更新される。状態1105には、PVOLのSnapshot作成後に、Snapshotに対するI/Oを不可としつつPVOLとSnapshotのデータを同期させるPAIRがある。また状態1105には、PVOLとSnapshotのデータを同期させないSUSPEND(分割)がある。
図12は、VOL作成処理の処理手順を示すフローチャートである。VOL作成処理は、管理システム203からの指示に応じて、ボリューム作成プログラム303によって実行される。
先ずS1200では、ボリューム作成プログラム303は、指定条件(ボリュームの容量等)を充足するPVOLのディレクトリ領域及びマッピング領域の確保が各DSVOL102-iで可能かを、各DSVOL102-iを制御する全てのストレージコントローラ210により確認する。ボリューム作成プログラム303は、S1200で領域確保が可能と判定された場合(S1201Yes)にS1202へ処理を移し、S1200で領域確保が不可能と判定された場合(S1201No)にVOL作成処理を終了する。
S1202では、ボリューム作成プログラム303は、S1201で割り当て可能とされた当該PVOLに割り当てるディレクトリ領域の先頭アドレス及び割り当てディレクトリ#を決定する。ボリューム作成プログラム303は、決定したディレクトリ領域の先頭アドレス及び割り当てディレクトリ#を追記してディレクトリ領域割り当てテーブル314を更新する。
次にS1203では、ボリューム作成プログラム303は、S1201で割り当て可能とされた当該PVOLに割り当てるマッピング領域の先頭アドレス及び割り当てマッピング#を決定する。ボリューム作成プログラム303は、決定したマッピング領域の先頭アドレス及び割り当てマッピング#を追記してマッピング領域割り当てテーブル315を更新する。
次にS1204では、ボリューム作成プログラム303は、S1202で更新したディレクトリ領域割り当てテーブル314のディレクトリ領域先頭アドレス900の値をディレクトリ領域先頭アドレス701の値とし、割り当てディレクトリ#901の値をディレクトリ#700の値として、ディレクトリ領域管理テーブル312を更新する。
次にS1205では、ボリューム作成プログラム303は、S1203で更新したマッピング領域割り当てテーブル315のマッピング領域先頭アドレス1000の値をマッピング領域先頭アドレス801の値とし、割り当てマッピング#1001の値をマッピング#800の値として、マッピング領域管理テーブル313を更新する。
次にS1205では、ボリューム作成プログラム303は、本VOL作成処理で作成された属性=PVOLのディレクトリ#、マッピング#、容量、及びPool#を含むボリューム情報をボリューム管理テーブル311に追記して更新する。
図13は、Snapshot作成処理の処理手順を示すフローチャートである。Snapshot作成処理は、管理システム203からの指示に応じて、Snapshot作成プログラム304によって実行される。
先ずS1300では、Snapshot作成プログラム304は、Snapshot作成対象のPVOLである複製元VOLのVOL#を受領する。次にS1301では、Snapshot作成プログラム304は、S1300で受領した複製元VOLへデステージされていないダーティデータがキャッシュメモリ301にあるかを判定する。Snapshot作成プログラム304は、複製元VOLへデステージされていないダーティデータがある場合(S1301Yes)にS1302へ処理を移し、ダーティデータがない場合(S1301No)にS1303へ処理を移す。S1302では、Snapshot作成プログラム304は、ダーティデータの追記処理を行うが、詳細は図14を参照して後述する。
S1303では、Snapshot作成プログラム304は、ボリューム管理テーブル311から、複製元VOLの容量及びディレクトリ#を取得する。次にS1304では、Snapshot作成プログラム304は、複製元VOLの複製であるSnapshot(複製先)のディレクトリ領域がDSVOL102で確保可能か確認する。Snapshot作成プログラム304は、Snapshot(複製先)のディレクトリ領域が確保可能の場合(S1305Yes)にS1306へ処理を移し、確保不可能の場合(S1305No)に本Snapshot作成処理を終了する。
S1306では、Snapshot作成プログラム304は、本Snapshot作成処理で作成された属性=Snapshotのディレクトリ#、マッピング#、容量、及びPool#を含むボリューム情報をボリューム管理テーブル311に追記して更新する。Snapshotのマッピング#603の値は、複製元PVOLのマッピング#の値のコピーである。
次にS1307では、Snapshot作成プログラム304は、作成したSnapshotの最新世代#1101を+1インクリメントし、Snapshot作成時刻1103、Snapshot#1104(ボリューム管理テーブル311のVOL#に該当)、状態1105=SUSPENDを設定してSnapshot世代管理テーブル316を更新する。
次にS1308では、Snapshot作成プログラム304は、S1305で割り当て可能とされた当該Snapshotに割り当てるディレクトリ領域の先頭アドレス及び割り当てディレクトリ#を追記してディレクトリ領域割り当てテーブル314を更新する。
次にS1309では、Snapshot作成プログラム304は、S1308で更新したディレクトリ領域割り当てテーブル314のディレクトリ領域先頭アドレス900の値をディレクトリ領域先頭アドレス701の値とし、割り当てディレクトリ#901の値をディレクトリ#700の値として、ディレクトリ領域管理テーブル312を更新する。
次にS1310では、Snapshot作成プログラム304は、複数のDSVOL102-iの各ストレージコントローラ210に対してディレクトリコピーを指示する。次に1311では、Snapshot作成プログラム304は、S1310のディレクトリコピーの指示を受け、複数のDSVOL102-iの各ストレージコントローラ210を制御し、複製元VOLであるPVOLのディレクトリテーブル103-iを、S1308,S1309で確保した各DSVOL102-iのディレクトリ領域へ並列処理でコピーする。コピーにより作成されたディレクトリテーブル104-iには、新しいディレクトリ#が付与される。
図14は、追記処理の処理手順を示すフローチャートである。図14は、図13のS1302、図16のS1604、図17のS1701、図18のS1802、図19のS1902、図23のS2102、図24のS2202で実行される各追記処理の詳細を示す。以下、図13のS1302で実行される追記処理として、Snapshot作成プログラム304を処理主体として説明する。
なお図16のS1604ではフロントエンドライトプログラム306、図17のS1701ではバックエンドライトプログラム307、図18のS1802ではリストアプログラム308、図19のS1902ではリシンクプログラム309、図23のS2102ではリストアプログラム308、図24のS2202ではリシンクプログラム309のそれぞれが処理主体になる。
先ずS1400では、Snapshot作成プログラム304は、ダーティデータを特定する。次にS1401では、Snapshot作成プログラム304は、Snapshot世代管理テーブル316を参照し、PVOLがSUSPEND状態のSnapshotを有しているかを判定する。Snapshot作成プログラム304は、SUSPEND状態のSnapshotが存在しない場合(S1401No)、S1404に処理を移し、SUSPEND状態のSnapshotが存在する場合(S1401Yes)、S1402に処理を移す。
S1402では、Snapshot作成プログラム304は、追記処理対象のダーティデータの論理アドレス(LBA)に対応するディレクトリコピーが完了しているかを判定する。Snapshot作成プログラム304は、ディレクトリコピーが完了している場合(S1402Yes)、S1404に処理を移し、ディレクトリコピーが完了していない場合(S1402No)、当該領域のディレクトリ情報を追出しコピーする。追出しコピーとは、図13のS1311でのコピー処理で未コピーの領域を追記処理する場合に、追記処理対象の領域のディレクトリ情報のみをピンポイントでコピーする処理である。
次にS1404では、Snapshot作成プログラム304は、S1400で特定したダーティデータを圧縮する。次にS1405では、Snapshot作成プログラム304は、S1404で圧縮した圧縮データセットを複製元VOLの追記領域にコピーする。
次にS1406では、Snapshot作成プログラム304は、マッピングテーブル105の各エントリのうち、参照先アドレス(追記領域内アドレス)501が設定されていない未使用のエントリに、S1404で圧縮したデータの追記領域内の格納位置を保持する。すなわち圧縮データのコピー先アドレスを参照先アドレス(追記領域内アドレス)501に設定する。
次にS1407では、Snapshot作成プログラム304は、ディレクトリテーブル103の各エントリのうち、当該データの論理アドレス(ホストからアクセス可能なLBA)に対応するエントリに、S1406で作成したマッピング情報のマッピング領域内アドレス500を参照先アドレス(マッピング領域内アドレス)401に設定する。
次にS1408では、Snapshot作成プログラム304は、S1405で追記領域にコピーされたダーティデータをデステージする。
図15は、リード処理の処理手順を示すフローチャートである。リード処理は、ホスト装置からのリード要求に応じて、リードプログラム305によって実行される。
先ずS1500では、リードプログラム305は、サーバシステム202からのリード要求が対象とするデータのPVOL又はSnapshot内でのアドレスを取得する。次にS1501では、リードプログラム305は、リード要求の対象データがキャッシュヒットするかを判定する。リードプログラム305は、リード要求の対象データがキャッシュヒットする場合(S1501Yes)にS1505へ処理を移し、キャッシュヒットしない場合(S1501No)にS1502へ処理を移す。
S1502では、リードプログラム305は、ディレクトリテーブル103,104を参照して、S1500で取得したPVOL/Snapshot内アドレスを基に、参照先アドレス(マッピング領域内アドレス)401を取得する。リードプログラム305は、リード要求の対象データが、PVOL100内のデータである場合にはPVOL用のディレクトリテーブル103を参照し、Snapshot101内のデータである場合にはSnapshot用のディレクトリテーブル104を参照する。
次にS1503では、リードプログラム305は、マッピングテーブル105を参照し、S1502で取得した参照先アドレス(マッピング領域内アドレス)を基に参照先アドレス(追記領域内アドレス)501を取得する。次にS1504では、リードプログラム305は、S1503で特定した追記領域内アドレスに格納されているデータを伸長しつつキャッシュメモリにステージングする。
次にS1505では、リードプログラム305は、S1501でキャッシュヒットしたデータ又はS1504でステージングしたデータをホスト装置に転送する。
図16は、フロントエンドライト処理(PVOL/Snapshot共通)の処理手順を示すフローチャートである。フロントエンドライト処理は、ホスト装置から、PVOL100又はSnapshot101に対するライト要求を受け付けた場合に、フロントエンドライトプログラム306によって実行される。
先ずS1600では、フロントエンドライトプログラム306は、ホスト装置からのライト要求の対象データがキャッシュヒットするかを判定する。フロントエンドライトプログラム306は、ライト要求の対象データがキャッシュヒットする場合(S1600Yes)にS1602へ処理を移し、キャッシュヒットしない場合(S1600No)にS1601へ処理を移す。S1601では、フロントエンドライトプログラム306は、キャッシュメモリ301においてキャッシュ領域を確保する。
S1602では、フロントエンドライトプログラム306は、S1600でキャッシュヒットした対象データがダーティデータであるかを判定する。フロントエンドライトプログラム306は、S1600でキャッシュヒットした対象データがダーティデータである場合(S1602Yes)にS1603へ処理を移し、ダーティデータでない場合(S1602No)にS1605へ処理を移す。
S1603では、フロントエンドライトプログラム306は、S1602で判定されたダーティデータのWR(WRight)世代#と、当該ライト要求の対象データの世代#が一致するかを判定する。WR世代#はキャッシュデータの管理情報(不図示)に保持される。又、当該ライト要求の対象データの世代#は図11の最新世代#1101から取得される。S1603は、直前に取得されたスナップショットの対象データ(ダーティデータ)の追記処理がされていないうちに、当該ライト要求の対象データでダーティデータを更新してしまい、スナップショットのデータを書きつぶしてしまうことを防ぐ。フロントエンドライトプログラム306は、WR世代#と最新世代#が一致する場合(S1603Yes)にS1605へ処理を移し、WR世代#と最新世代#が一致しない場合(S1603No)にS1604へ処理を移す。
S1604では、フロントエンドライトプログラム306は、図14を参照して説明した追記処理を実行する。S1604により、最新世代#と一致しないWR世代#のダーティデータを追記領域へ書き込み、キャッシュメモリ301からデステージする。
S1605では、フロントエンドライトプログラム306は、S1601で確保したキャッシュ領域、又は、追記処理が必要なダーティデータを追記処理して再度ダーティデータを生成可能になったキャッシュ領域へ、ライト要求の対象データを書き込む。
S1606では、フロントエンドライトプログラム306は、S1605でキャッシュメモリ301へ書き込んだキャッシュデータのWR世代#を、S1603で比較した最新世代#に設定する。S1607では、フロントエンドライトプログラム306は、ホスト装置へ正常応答(Good応答)を返却する。
図17は、バックエンドライト処理の処理手順を示すフローチャートである。バックエンドライト処理は、DSVOL102の追記領域106に未反映のデータ(ダーティデータ)がキャッシュメモリ301上にある場合、未反映のデータを追記領域106に書き込む処理である。バックエンドライト処理は、フロントエンド処理と同期又は非同期で行われる。バックエンドライト処理は、バックエンドライトプログラム307により実行される。
先ずS1700では、バックエンドライトプログラム307は、キャッシュメモリ301上にダーティデータが有るかを判定する。バックエンドライトプログラム307は、キャッシュメモリ301上にダーティデータが有る場合(S1700Yes)にS1701へ処理を移し、ダーティデータが無い場合(S1700No)に本バックエンドライト処理を終了する。S1701では、バックエンドライトプログラム307は、図14で説明した追記処理を実行する。
図18は、実施例1のリストア処理の処理手順を示すフローチャートである。リストア処理は、管理システム203からのリストア(データ復元)の指示に応じて、リストアプログラム308によって実行される。
先ずS1800では、リストアプログラム308は、管理システム203から、リストア先のPVOL#及びリストア元のSnapshot#を受領する。次にS1801では、リストアプログラム308は、S1800でSnapshot#を受領したリストア元Snapshotにダーティデータが有るかを判定する。リストアプログラム308は、リストア元Snapshotにダーティデータが有る場合(S1801Yes)にS1802へ処理を移し、ダーティデータが無い場合(S1801No)にS1803へ処理を移す。
S1802では、リストアプログラム308は、図14で説明した追記処理を実行する。
S1803では、リストアプログラム308は、ボリューム管理テーブル311からリストア元Snapshotのディレクトリ#及びリストア先PVOLのディレクトリ#を取得する。次にS1804では、リストアプログラム308は、複数のDSVOL102-iの各ストレージコントローラ210に対して、S1803で取得されたリストア元/先のディレクトリコピーを指示する。
次にS1805では、リストアプログラム308は、各ストレージコントローラ210の並列処理によって、S1803で取得したリストア元のSnapshotのディレクトリ#のディレクトリテーブル104-iを、リストア先のPVOLのディレクトリ#のディレクトリテーブル103-iへそれぞれコピーする。
図19は、実施例1のリシンク処理の処理手順を示すフローチャートである。リシンク処理は、管理システム203からのリシンク(データ再同期)の指示に応じて、リシンクプログラム309によって実行される。
先ずS1900では、リシンクプログラム309は、管理システム203から、リシンク先Snapshot#及びリシンク元PVOL#を受領する。次にS1901では、リシンクプログラム309は、リシンク元PVOLにダーティデータが有るかを判定する。リシンクプログラム309は、リシンク元PVOLにダーティデータが有る場合(S1901Yes)にS1902へ処理を移し、ダーティデータが無い場合(S1901No)にS1903へ処理を移す。
S1902では、リシンクプログラム309は、図14で説明した追記処理を実行する。
S1903では、リシンクプログラム309は、ボリューム管理テーブル311からリシンク元PVOLのディレクトリ#及びリシンク先Snapshotのディレクトリ#を取得する。次にS1904では、リシンクプログラム309は、複数のDSVOL102-iの各ストレージコントローラ210に対して、S1903で取得されたディレクトリコピーを指示する。
次にS1905では、リシンクプログラム309は、各ストレージコントローラ210の並列処理によって、S1903で取得したリシンク元のPVOLのディレクトリ#のディレクトリテーブル103-iを、リシンク先のSnapshotのディレクトリ#のディレクトリテーブル104-iへそれぞれコピーする。
図20は、PVOL/Snapshot削除処理の処理手順を示すフローチャートである。PVOL/Snapshot削除処理は、管理システム203からのボリューム削除又はSnapshot削除の指示に応じて、PVOL/Snapshot削除プログラム310によって実行される。
先ずS2000では、PVOL/Snapshot削除プログラム310は、削除対象のPVOL#又はSnapshot#を受領する。次にS2001では、PVOL/Snapshot削除プログラム310は、ボリューム管理テーブル311から、削除対象のPVOL又はSnapshotのディレクトリ#及びマッピング#を取得する。
次にS2002では、PVOL/Snapshot削除プログラム310は、削除対象のPVOL又はSnapshotのディレクトリテーブルの削除を、各ディレクトリテーブルが分散配置されている各DSVOL102を制御する各ストレージコントローラ210に対して指示する。
次にS2003では、PVOL/Snapshot削除プログラム310は、ディレクトリ領域管理テーブル312から、S2002で削除されたディレクトリテーブルに該当するレコードを削除する。次にS2004では、PVOL/Snapshot削除プログラム310は、S2003でディレクトリ領域管理テーブル312から削除したレコードに対応するディレクトリ領域先頭アドレス900のレコードを、ディレクトリ領域割り当てテーブル314から削除する。
次にS2005では、PVOL/Snapshot削除プログラム310は、マッピング領域削除可能(つまり削除対象が、SnapshotがないPVOL、又は、SnapshotがあるPVOL単体)であるかを判定する。PVOL/Snapshot削除プログラム310は、マッピング領域削除可能の場合(S2005Yes)にS2006へ処理を移し、マッピング領域削除不可能の場合(S2005No)にS2009へ処理を移す。
S2006では、PVOL/Snapshot削除プログラム310は、削除対象のPVOLのマッピングテーブルの削除を、各マッピングデーブルが分散配置されている各DSVOL102を制御する各ストレージコントローラ210に対して指示する。
次にS2007では、PVOL/Snapshot削除プログラム310は、マッピング領域管理テーブル313から、削除されたマッピングテーブルに該当するレコードを削除する。次にS2008では、PVOL/Snapshot削除プログラム310は、S2007でマッピング領域管理テーブル313から削除したレコードに対応するマッピング領域先頭アドレス1000のレコードを、マッピング領域割り当てテーブル315から削除する。
次にS2009では、PVOL/Snapshot削除プログラム310は、削除したPVOL又はSnapshotに該当するボリュームのレコードをボリューム管理テーブル311から削除する。
次にS2010では、PVOL/Snapshot削除プログラム310は、削除したボリュームはSnapshotかを判定する。PVOL/Snapshot削除プログラム310は、削除したボリュームがSnapshotである場合(S2010Yes)にS2011へ処理を移し、削除したボリュームがPVOLである場合(S2010No)に本PVOL/Snapshot削除処理を終了する。
S2011では、PVOL/Snapshot削除プログラム310は、削除したSnapshotのレコードをSnapshot世代管理テーブル316から削除する。この際、Snapshot世代管理テーブル316において、削除したSnapshotが最新世代である場合には、最新世代を削除したSnapshotの次に新しい世代のSnapshotを最新世代とする。
次に図21及び図22を参照して、実施例1の効果を説明する。
本実施例では、図21に示すように、メタ情報のツリーを、第1階層のメタ情報であるPVOL用のディレクトリテーブル103と、第2階層のメタ情報であるPVOLとSnapshot共用のマッピングテーブル105の2段構成とする。PVOL用のディレクトリテーブル103は、データを参照するメタ情報へのポインタを管理するテーブルである。
そしてSnapshot取得時には、1段目のPVOL用のディレクトリテーブル103のみをコピーし、Snapshot用のディレクトリテーブル104を作成する。PVOL100からのリード及びライトは、ディレクトリテーブル103及びマッピングテーブル105に基づいてデータにアクセスされる。またSnapshot101からのリード及びライトは、ディレクトリテーブル104及びマッピングテーブル105に基づいてデータにアクセスされる。これにより、データアクセス時の探索のオーバーヘッドを低減できる。
また本実施例では、図22に示すように、各ストレージコントローラ210により制御される複数のDSVOL102へ、PVOL用のディレクトリテーブル103を、細粒度で分散配置する。そして、Snapshot取得時は、複数のストレージコントローラ210がそれぞれのDSVOL102内に分散配置されているPVOL用のディレクトリテーブル103単位でテーブルコピーを行う。この並列処理によるコピーのため、Snapshot作成時間を短縮できる。さらに、特定のPVOL/SnapshotにI/O負荷が偏って高負荷になっても、複数のストレージコントローラ210に負荷分散するため、複数のストレージコントローラ資源を有効活用することができる。
よって本実施例によれば、ストレージシステムに求められる機能の性能を損ねず、I/O性能と、ストレージシステム操作性能の両立を図ることができる。またI/O負荷の偏りがあっても、1つのストレージコントローラの性能に律速されることなく、マルチコントローラのメリットを十分に享受できる。またストレージシステムの性能低下や容量を気にすることなく、オンデマンドにボリュームの複製を作成することができる。