以下の説明において、「インターフェース部」は、1以上のインターフェースでよい。この1以上のインターフェースは、1以上の同種の通信インターフェースデバイス(例えば1以上のNIC(Network Interface Card))であってもよいし、2以上の異種の通信インターフェースデバイス(例えばNICとHBA(Host Bus Adapter))であってもよい。
また、以下の説明において、「メモリ部」は、1以上のメモリであり、典型的には主記憶デバイスでよい。メモリ部における少なくとも1つのメモリは、揮発性メモリであってもよいし不揮発性メモリであってもよい。
また、以下の説明において、「PDEV部」は、1以上のPDEVであり、典型的には補助記憶デバイスでよい。「PDEV」は、物理的な記憶デバイス(Physical storage DEVice)を意味し、典型的には、不揮発性の記憶デバイス、例えばHDD(Hard Disk Drive)又はSSD(Solid State Drive)である。
また、以下の説明において、「記憶部」は、メモリ部とPDEV部の少なくとも一部とのうちの少なくとも1つ(典型的には少なくともメモリ部)である。
また、以下の説明において、「プロセッサ部」は、1以上のプロセッサである。少なくとも1つのプロセッサは、典型的には、CPU(Central Processing Unit)のようなマイクロプロセッサであるが、GPU(Graphics Processing Unit)のような他種のプロセッサでもよい。少なくとも1つのプロセッサは、シングルコアでもよいしマルチコアでもよい。
また、少なくとも1つのプロセッサは、処理の一部又は全部を行うハードウェア回路(例えばFPGA(Field-Programmable Gate Array)又はASIC(Application Specific Integrated Circuit))といった広義のプロセッサでもよい。
また、以下の説明において、「xxxテーブル」といった表現により、入力に対して出力が得られる情報を説明することがあるが、この情報は、どのような構造のデータでもよいし、入力に対する出力を発生するニューラルネットワークのような学習モデルでもよい。従って、「xxxテーブル」を「xxx情報」と言うことができる。
また、以下の説明において、各テーブルの構成は一例であり、1つのテーブルは、2以上のテーブルに分割されてもよいし、2以上のテーブルの全部又は一部が1つのテーブルであってもよい。
また、以下の説明において、「プログラム」を主語として処理を説明する場合があるが、プログラムは、プロセッサ部によって実行されることで、定められた処理を、適宜に記憶部及び/又はインターフェース部などを用いながら行うため、処理の主語が、プロセッサ部(或いは、そのプロセッサ部を有するコントローラのようなデバイス)とされてもよい。
プログラムは、計算機のような装置にインストールされてもよいし、例えば、プログラム配布サーバ又は計算機が読み取り可能な(例えば非一時的な)記録媒体にあってもよい。また、以下の説明において、2以上のプログラムが1つのプログラムとして実現されてもよいし、1つのプログラムが2以上のプログラムとして実現されてもよい。
また、以下の説明において、「計算機システム」は、1以上の物理的な計算機を含んだシステムである。物理的な計算機は、汎用計算機でも専用計算機でもよい。物理的な計算機は、I/O(Input/Output)要求を発行する計算機(例えばホスト計算機)として機能してもよいし、I/O要求に応答してデータのI/Oを行う計算機(例えばストレージ装置)として機能してもよい。
すなわち、計算機システムは、I/O要求を発行する1以上のホスト計算機であるホストシステム、及び、I/O要求に応答してデータのI/Oを行う1以上のストレージ装置であるストレージシステムのうちの少なくとも1つでよい。少なくとも1つの物理的な計算機において、1以上の仮想的な計算機(例えばVM(Virtual Machine))が実行されてもよい。仮想的な計算機は、I/O要求を発行する計算機でもよいし、I/O要求に応答してデータのI/Oを行う計算機でもよい。
また、計算機システムは、1以上(典型的には複数)の物理的なノード装置で構成された分散システムでよい。物理的なノード装置は、物理的な計算機である。
また、物理的な計算機(例えばノード装置)が所定のソフトウェアを実行することにより、その物理的な計算機、又は、その物理的な計算機を含んだ計算機システムに、SDx(Software-Defined anything)が構築されてもよい。SDxとしては、例えば、SDS(Software Defined Storage)又はSDDC(Software-defined Datacenter)が採用されてもよい。
例えば、ストレージ機能を有するソフトウェアが物理的な汎用の計算機で実行されることにより、SDSとしてのストレージシステムが構築されてもよい。
また、少なくとも1つの物理的な計算機(例えばストレージ装置)が、ホストシステムとしての1以上の仮想的な計算機と、ストレージシステムのストレージコントローラ(典型的には、I/O要求に応答してデータをPDEV部に対して入出力する装置)としての仮想的な計算機とが実行されてもよい。
言い換えれば、このような少なくとも1つの物理的な計算機は、ホストシステムの少なくとも一部としての機能と、ストレージシステムの少なくとも一部としての機能の両方を有してもよい。
また、計算機システム(典型的にはストレージシステム)は、冗長構成グループを有してよい。冗長構成は、Erasure Coding、RAIN(Redundant Array of Independent Nodes)及びノード間ミラーリングのように複数のノード装置での構成でもよいし、PDEV部の少なくとも一部としての1以上のRAID(Redundant Array of Independent (or Inexpensive) Disks)グループのように単一の計算機(例えばノード装置)での構成でもよい。
また、以下の説明において、「データセット」とは、アプリケーションプログラムのようなプログラムから見た1つの論理的な電子データの塊であり、例えば、レコード、ファイル、キーバリューペア及びタプルのうちのいずれでもよい。
また、以下の説明において、種々の対象の識別情報として、識別番号が使用されるが、識別番号以外の種類の識別情報(例えば、英字や符号を含んだ識別子)が採用されてもよい。
また、以下の説明において、同種の要素を区別しないで説明する場合には、参照符号(又は、参照符号のうちの共通符号)を使用し、同種の要素を区別して説明する場合は、要素の識別番号(又は参照符号)を使用することがある。
例えば、記憶領域の単位である「ページ」を特に区別しないで説明する場合には、「ページ51」と記載し、個々のページを区別して説明する場合には、ページの番号を用いて「ページ#0」、「ページ#1」のように記載したり、参照符号を用いて「単独ページ51P」、「共通ページ51C」のように記載したりすることがある。
以下、図面を参照して、本発明の一実施形態を説明する。
図1は、本発明の一実施形態の例を示す図である。計算機システムの一例として、図3を用いて後で説明するストレージシステム200が採用されている。ストレージシステム200において、論理記憶領域(論理アドレス空間)の複数のレイヤがある。第1レイヤに属する1以上の第1論理記憶領域の一例が、1以上のプール503である。
第2レイヤ(第1レイヤよりも上位のレイヤ)に属する複数の第2論理記憶領域の一例が、複数の論理ボリューム501である。論理ボリューム501は、容量仮想化技術(典型的にはThin Provisioning)に従う仮想的な論理ボリュームである。論理ボリューム501のライト先論理アドレスに、プール503における未割当(空き)のページ51が割り当てられる。
ストレージシステム200は、図3に示すようにストレージコントローラ101を有する。ストレージコントローラ101は、プロセッサ部を含むコントローラの一例である。ストレージコントローラ101は、データ量削減機能として、重複排除機能を有する。また、データ量削減したまま仮想的に論理ボリュームをコピーする機能として、ボリューム複製機能を有する。
本実施形態では、重複データセットが格納される空間である共通領域80と、単独データセットが格納される空間である単独領域70とが用意される。言い換えれば、ストレージシステム200における論理アドレス空間が、共通領域80と単独領域70とに論理的に区別される。例えば、複数の論理ボリューム501は、それぞれI/O元から認識され得る2以上の論理ボリュームである2以上の提供ボリューム501Pを含む。
ストレージコントローラ101は、提供ボリューム#0をライト先としたライト要求に従う対象データセットが、いずれかの1以上のデータセットと重複するデータセットであるか否かを判定する重複判定処理を行う。重複判定処理は、ライト要求の処理に同期して行われる処理(インプロセス)と、ライト要求に従う対象データセットの格納の後にライト要求の処理と非同期に行われる処理(ポストプロセス)のいずれであってもよい。
重複判定処理の結果、対象データセットがいずれのデータセットとも重複しない単独データセットAであれば、ストレージコントローラ101は、データセットAに関する格納先を、単独領域70に属し提供ボリューム#0に対応したページ#0とする。単独領域70に属するページを、以下、「単独ページ」と言うことがある。図1の例によれば、ページ#0及び#1の各々が、単独ページ51Pである。
重複判定処理の結果、対象データセットがいずれかの1以上のデータセットと重複するデータセットB(又はC)であれば、ストレージコントローラ101は、重複データセットB(又はC)に関する格納先を、共通領域80に属するページ#2とする。
ページ#2が、重複データセットB及びCの各々の複数のライト先(提供ボリューム#0及び#1)から直接的又は間接的に参照される。共通領域80に属するページを、以下、「共通ページ」と言うことがある。
図1の例によれば、ページ#2が、共通ページ51Cである。重複判定処理がポストプロセスの場合、ストレージコントローラ101は、提供ボリューム#0及び#1にそれぞれ割り当てられている複数の単独ページ#0及び#1の各々から、データセットB及びCを、共通ページ#2にコピーし、複数の単独ページ#0及び#1の各々からデータセットB及びCを削除する。
これにより、図2に例示する一比較例のような状況の発生、すなわち、1つのページ60に、単独データセットAと重複データセットCとが混在してしまうといった状況の発生、を避けることができ、以って、図1に示す単独ページ51Pに関して、ページ51の回収、及び、ページ51間でのデータセットのコピーを、迅速に行うことができる。
例えば、ストレージコントローラ101は、提供ボリューム#0が削除対象とされた場合、提供ボリューム#0に関して割り当てられている複数の単独ページ51Pを、複数の単独ページ51Pの各々について単独ページ51Pがいずれか他の領域から参照されているか否かをチェックすること無しに、且つ、提供ボリューム#0におけるいずれかの領域が共通領域80を参照しているか否かをチェックすること無しに、解放する。
これにより、提供ボリューム#0に割り当たっていた複数の単独ページ51Pを迅速に回収することができる。
また、例えば、ストレージコントローラ101は、単独ページ51Pのガベージコレクション処理において、単独ページ51Pのうちの複数存在する有効な単独データセットを、いずれか別のページ51に追記的にコピーし、コピー元の単独ページ51Pの割り当てを解除する。
単独ページ51Pに関して、ページ51間でコピーされるデータセットは、単独データセットであり、重複データセットであることがない。故に、参照先の更新は、単独データセットの1つの論理アドレス(提供ボリューム501Pに属する論理アドレス)についてのみ行えばよく、複数の論理アドレスの各々について行う必要はない。
このため、単独ページ51Pから別のページ51へのデータセットのコピーを迅速に行うことができ、結果として、単独ページ51Pのガベージコレクション処理が効率化される。
図29は、図1の状態から提供ボリューム#1を複製(コピー)した例を示す図である。複製前、提供ボリューム#1は重複データセットB及びC、単独データセットDを持つ。提供ボリューム#1の複製ボリューム#11は、提供ボリューム#1の単独データセットDを参照する。
すなわち、提供ボリューム#1を複製後、単独領域70に存在する単独データセットDは提供ボリューム#1から参照され、また、提供ボリューム#11からも提供ボリューム#1の論理アドレスを介して間接的に参照される。
複製前、提供ボリューム#1からのみ参照されていた単独データセットDは、複製後、提供ボリューム#1と提供ボリューム#11から参照される共通データセットになる。しかし、データセットDは重複データセットではあるが、共通領域80には存在せず、単独領域70に存在する。
従って、複製前、単独領域70に存在する単独ページ#1は、複製後、共通ページになるわけではない。単独領域に存在しながら、重複データセットを有する単独ページを「重複単独ページ」と呼ぶ。
図30は、図29に示す複製直後の状態から複製元と複製先の提供ボリューム#1及び#11へライトした後の例を示す図である。提供ボリューム#1の重複データセットBをデータセットEで更新した場合、ストレージコントローラ101は、データセットEを単独領域70に新たに確保したページ#3に格納する。
同様に、提供ボリューム#11の重複データセットDをデータセットFで更新した場合、ストレージコントローラ101はデータセットFを単独領域70に新たに確保したページ#4に格納する。
以上により、図31に例示する一比較例のような状況の発生、すなわち、単独領域70に存在するページ#1の重複データセットDを提供ボリューム#11から直接参照してしまうことにより、ページ51の回収、及びページ51間でのデータセットのコピーが非効率的になってしまう問題を解決する。
例えば、図31において、ストレージコントローラ101は、提供ボリューム#1が削除対象とされた場合、提供ボリューム#1に関し割り当てられているページ#1が提供ボリューム#11からも参照されている為、単純に解放することはできない。
一方、図30の例では、提供ボリューム#1が削除対象とされた場合、提供ボリューム#1に割当てられているページ#3が提供ボリューム#11から直接に参照されることがない為、他の領域から参照されているか否かをチェックすること無しに、解放することができる。
このため、提供ボリューム#1に割り当たっていた複数の単独ページ51Pを迅速に回収することができる。一方で、ページ#1は重複単独ページである為、提供ボリューム#1の削除契機では解放せず、非同期にいずれの提供ボリューム501Pからも参照されていない事を確認後、解放する。本処理の詳細は後述する。
また、例えば、ストレージコントローラ101は、単独ページ51Pのガベージコレクション処理において、単独ページ51Pのうちの複数の有効な単独データセットを、いずれか別のページ51に追記的にコピーし、コピー元の単独ページ51Pの割り当てを解除する。
単独ページ51P(図30におけるページ#3)に関して、ページ51間でコピーされるデータセットは、単独データセットであり、重複データセットであることがない。故に、参照先の更新は、単独データセットの1つの論理アドレス(提供ボリューム501Pに属する論理アドレス)についてのみ行えばよく、複数の論理アドレスの各々について行う必要はない。
このため、単独ページ51Pから別のページ51へのデータセットのコピーを迅速に行うことができ、結果として、単独ページ51Pのガベージコレクション処理が効率化される。
更に、例えば、ストレージコントローラ101は、重複単独ページのガベージコレクション処理を、単独ページ51Pと同様に実施する。
すなわち、重複単独ページ(図29における単独ページ51P、ページ#1)に関して、ページ51間でコピーされるデータセットは、共通データセットであるが、ページ#1に存在するデータセットは複製元である提供ボリューム#1からの参照のみであり、複製先である提供ボリューム#11からは提供ボリューム#1の論理アドレスを介して間接的に参照している。
故に、参照先の更新は、共通データセットの1つの論理アドレス(複製元の提供ボリューム501Pに属する論理アドレス)についてのみ行えばよく、複数の論理アドレスの各々について行う必要はない。このため、重複単独ページから別のページ51へのデータセットのコピーを迅速に行うことができ、結果として、重複単独ページのガベージコレクション処理が効率化される。
また、図32に例示する一比較例のような状況の発生を防ぐ。すなわち、複製前の単独データセットは、複製後、共通データセットになる為、共通ページに格納しなければならず、複製前に単独ページに格納されていたデータセットを、共通領域80の共通ページに移行し、複製時間が長大化してしまうことを防ぐ。このように提供ボリューム501Pの複製をデータセットの移動無しに迅速に行うことができる。
以下、本実施形態を詳細に説明する。
図3は、ストレージシステム200を含むシステムの構成例を示す図である。ストレージシステム200は、複数(又は1つ)のPDEV220と、複数のPDEV220に接続されたストレージコントローラ101とを有する。
ストレージコントローラ101は、S−I/F214と、M−I/F215と、P−I/F213と、メモリ212と、それらに接続されたプロセッサ211とを有する。S−I/F214、M−I/F215、及びP−I/F213が、インターフェース部の一例である。メモリ212が、記憶部の一例である。
プロセッサ211が、プロセッサ部の一例である。プロセッサ部は、圧縮及び伸張を行うハードウェア回路を含んでいてもよい。本実施形態では、プロセッサ211が、圧縮及び伸張を行う。すなわち、ストレージコントローラ101は、データ量削減機能として、重複排除機能の他に圧縮機能を有する。
S−I/F214は、サーバシステム201とストレージコントローラ101との間のデータのやり取りを仲介する通信インターフェースデバイスである。S−I/F214に、FC(Fibre Channel)ネットワーク203を介して、サーバシステム201が接続される。
サーバシステム201は、ストレージコントローラ101に対して、I/O先(例えばLUN(Logical Unit Number)のような論理ボリューム番号や、LBA(Logical Block Address)のような論理アドレス)を指定したI/O要求(ライト要求又はリード要求)を送信する。
M−I/F215は、管理システム205とストレージコントローラ101の間のデータのやり取りを仲介する通信インターフェースデバイスである。M−I/F215に、IP(Internet Protocol)ネットワーク204を介して、管理システム205が接続される。
ネットワーク203及びネットワーク204は、同一の通信ネットワークでもよい。管理システム205は、ストレージシステム200を管理する。
P−I/F213は、複数のPDEV220とストレージコントローラ101の間のデータのやり取りを仲介する通信インターフェースデバイスである。P−I/F213には、複数のPDEV220が接続される。
メモリ212は、プロセッサ211が実行するプログラムと、プロセッサ211が使用するデータを記憶する。プロセッサ211は、メモリ212に格納されているプログラムを実行する。本実施形態では、例えば、メモリ212及びプロセッサ211の組が二重化されている。
図4は、メモリ212の構成と、メモリ212内のプログラム及び管理情報との例を示す図である。メモリ212は、ローカルメモリ401、キャッシュメモリ402、及び共有メモリ404というメモリ領域を含む。これらのメモリ領域のうちの少なくとも1つは、独立したメモリであってもよい。ローカルメモリ401は、このローカルメモリ401を含むメモリ212と同一組に属するプロセッサ211により使用される。
ローカルメモリ401には、リードプログラム411、フロントエンドライトプログラム412、バックエンドライトプログラム413、データ量削減プログラム414、VOL管理プログラム415、プール容量管理プログラム416、共通領域解放プログラム417、ボリューム複製制御プログラム418、及び重複単独領域解放プログラム419が格納される。これらのプログラムについては後述する。
キャッシュメモリ402には、PDEV220に対してライト又はリードされるデータセットが一時的に格納される。
共有メモリ404は、この共有メモリ404を含むメモリ212と同一組に属するプロセッサ211、及び異なる組に属するプロセッサ211の両方により使用される。共有メモリ404には、管理情報が格納される。
管理情報は、VOL管理テーブル421、アドレス変換テーブル422、プール管理テーブル423、有効領域管理テーブル424、ページ変換テーブル425、ページ割当管理テーブル426、サブブロック管理テーブル427、追記先検索テーブル428、ハッシュ管理テーブル429、重複管理テーブル430、共通領域割当管理テーブル431、世代管理テーブル432、及び実データ位置管理ビットマップ433を含む。
これらのテーブルうち、プール管理テーブル423以外については、図を参照して後述する。プール管理テーブル423は、プール503に関する情報を保持するテーブルである。
プール管理テーブル423は、例えば、プール503毎に、プール#(プール503の番号)、RG#(プール503の基になっている1以上のRAIDグループの番号)、プール容量(プール503の容量)、及びプール使用容量(プール容量のうち使用されている容量(典型的には、プール503のうちの割当て済ページの総容量))の情報を保持する。
図5は、ストレージシステム200内の記憶階層の例を示す図である。なお、以下の説明では、n番目のレイヤを「レイヤn」と呼ぶ(nは自然数)。nが小さい程、上位のレイヤである。ストレージシステム200内の記憶階層には、提供ボリューム501P、追記ボリューム502、プール503、及びRG504がある。
提供ボリューム501Pは、レイヤ1(図3を用いて説明した第2レイヤの一例)の論理記憶領域であり、サーバシステム201に提供される(サーバシステム201から可視の)の論理ボリュームである。
なお、レイヤ1の論理記憶領域として、更に、本実施形態では、後述するように、共通領域80に属する論理ボリュームでありサーバシステム201に提供されない(サーバシステム201から不可視の)共通ボリュームがある。
更に、レイヤ1の論理記憶領域として、本実施形態では、後述するように、単独領域70に属する論理ボリュームでありサーバシステム201に提供されない(サーバシステム201から不可視の)重複単独ボリュームがある。
追記ボリューム502は、レイヤ2の論理記憶領域であり、追記用の論理ボリュームである。1つの追記ボリューム502には、いずれか1つの論理ボリューム501(提供ボリューム501Pなど)が関連付けられる。逆に、1つの論理ボリューム501には、1又は複数の追記ボリューム502が関連付けられる。
従って、追記ボリューム502(レイヤ2の論理記憶領域)と論理ボリューム501(レイヤ1の論理記憶領域)とは、1対1又は1対多の関係である。本実施形態では、説明を簡単にするために、追記ボリューム502と論理ボリューム501は1対1の関係であるとする。
プール503は、レイヤ3(図3を用いて説明した第1レイヤの一例)の論理記憶領域であり、1以上のRG504に基づく論理記憶領域である。プール503は、複数のページ51で構成されている。なお、プール503は、少なくとも1つのRG504に代えて、又は加えて、ストレージシステム200の外部の記憶資源に基づいていてもよい。
RG504は、レイヤ4の論理記憶領域であり、複数のPDEV220で構成されたRAIDグループの空間である。
図5に例示の提供ボリューム501Pの一部は、2以上の提供ボリューム501Pのうちの少なくとも一部であり、圧縮又は重複排除が有効とされた領域である「有効領域」である。2以上の提供ボリューム501Pのうち有効領域以外の領域を、圧縮及び重複排除が無効とされた領域という意味で「無効領域」と言う。
ストレージコントローラ101は、ライト対象のデータセットAのライト先が有効領域の場合、ライト対象のデータセットAを圧縮し、提供ボリューム501Pに対応した追記ボリューム502に割り当てられたページ51Pa(ライト先のページに対して割り当てられた単独ページであるページ51Pa)に、圧縮されたデータセットA´を追記する。
すなわち、有効領域に関して、ページ51Paは、提供ボリューム501Pに対応した追記ボリューム502に割り当てられたページ51、言い換えれば、提供ボリューム501Pに間接的に割り当てられたページ51である。
ページ51Paには、追記的に圧縮後のデータセットA´が格納される。追記ボリューム502に割り当てられたページ(提供ボリューム501Pに間接的に割り当てられたページ)を「追記ページ」と言うことができる。
一方、ストレージコントローラ101は、ライト対象のデータセットBのライト先が無効領域の場合、ライト対象のデータセットBを圧縮することなしに、ライト先のページに対して割り当てられたページ51Pbに、非圧縮のデータセットBを格納する。
すなわち、無効領域に関して、ページ51Pbは、提供ボリューム501Pに直接的に(追記ボリューム502非経由で)割り当てられたページ51である。ページ51Pbには、非圧縮のデータセットBが格納される。
提供ボリューム501Pに直接的に割り当てられたページ51には、上書きすることができる。提供ボリューム501Pに直接的に割り当てられたページを「上書きページ」と言うことができる。
図6は、ページ51Paへの追記の例を示す図である。論理ボリューム501は、複数の単位領域である複数のブロック601で構成されている。本実施形態では、データセットは、ブロック単位のデータである。
論理ボリューム501に対応した追記ボリューム502に割り当てられたページ51Paには、圧縮後のデータセットが追記されていく。ページ51Paにおいて、圧縮後のデータセットが占める領域を、以下の説明では「サブブロック602」と言う。サブブロック602は、サブページ領域及びサブ部分領域の各々の一例である。
なお、ページ51Paには、非圧縮のデータセットが追記されてもよいが、本実施形態では、圧縮後データセットが追記される。プール503には、ページ51Paの状態が反映する。
図7は、重複排除処理の例を示す図である。図7には、特にポストプロセスの重複排除処理の例を示しており、大矢印の元と先に、重複排除処理前の例と重複排除処理後の例を示している。
論理ボリューム501として、提供ボリューム501Pの他に、共通ボリューム501Cがある。共通ボリューム501Cは、上述したように、共通領域80に属しサーバシステム201に提供されない論理ボリュームである。図7の共通ボリューム501Cの少なくとも一部が有効領域である。なお、有効領域に属する共通ボリュームと、無効領域に属する共通ボリュームとが用意されてもよい。
アドレス変換テーブル422(アドレス変換テーブル422Pと422C)及び追記ボリューム502(追記ボリューム502Pと502C)の各々が、論理ボリューム501毎に設けられている。
以下の説明において、論理ボリューム#m(VOL#が“m”の論理ボリューム(mは0以上の整数))に対応したアドレス変換テーブル422を、「アドレス変換テーブル#m」と言うことがある。
また、以下の説明において、論理ボリューム#mに対応した追記ボリューム502を、「追記ボリューム#m」と言うことがある。また、以下の説明において、下記の用語を使用することがある。
・提供ブロック:提供ボリュームにおけるブロック。
・共通ブロック:共通ボリュームにおけるブロック。
・重複先ブロック:重複データセットのライト先(コピー先)とされた共通ブロック 。
・追記単独ページ:単独ページ且つ追記ページであるページ。
・追記共通ページ:共通ページ且つ追記ページであるページ(共通ボリュームに対応した追記ボリュームに割り当てられたページ)。
提供ボリューム#1及び#2があり、故に、アドレス変換テーブル#1及び#2と、追記ボリューム#1及び#2がある。また、共通ボリューム#3があり、故に、アドレス変換テーブル#3と追記ボリューム#3がある。追記ボリューム#1及び#2が、単独領域70に属し、追記ボリューム#3が、共通領域80に属する。
重複排除処理の前の状況の一例は、図7の大矢印の元に示すように、下記の通りである。
・提供ボリューム#1及び#2がそれぞれ有する2つの提供ブロック601Pの各々に、データセットAが存在する。結果として、追記ボリューム#1及び#2にそれぞれ割り当てられた2つの追記単独ページ(単独ページ51P)の各々に、圧縮後データセットA´(サブブロック602P)が存在する。
・アドレス変換テーブル#1及び#2の各々では、データセットAのライト先提供ブロック(提供ブロック601P)の論理アドレスの参照先が、追記単独ページにおけるサブブロック602P(圧縮後データセットA´が存在するサブブロック602P)の論理アドレスである。
・ストレージコントローラ101は、以上の重複排除処理の前の状況に対し、上述した重複判定処理において、提供ボリューム#1及び#2に重複するデータセットAが存在することを検出する(存在すると判定する)。検出した場合、ストレージコントローラ101は、例えば以下の処理を含む重複排除処理を行う。
・ストレージコントローラ101は、重複データセットA(圧縮後データセットA´の伸張後のデータセットに相当)を、提供ボリューム#1及び#2における有効領域の提供ブロック601Pから、共通ボリューム#3の有効領域におけるいずれかの未使用の共通ブロック601Cにコピーする。コピー先の共通ブロック601Cが、重複先ブロック(重複先領域の一例)である。
・ストレージコントローラ101は、重複先ブロック(共通ブロック601C)に対応した追記ボリューム#3にページを割り当てる。割り当てられたページが、追記共通ページ(共通ページ51C)である。
・ストレージコントローラ101は、重複データセットAを圧縮し、圧縮後データセットA´を、追記共通ページに追記する。
・ストレージコントローラ101は、アドレス変換テーブル#3を更新する。更新後のアドレス変換テーブル#3では、重複先ブロック(共通ブロック601C)の論理アドレスの参照先が、追記共通ページ(共通ページ51C)におけるサブブロック602C(圧縮後データセットA´が存在するサブブロック602C)の論理アドレスである。
・ストレージコントローラ101は、アドレス変換テーブル#1及び#2を更新する。更新後のアドレス変換テーブル#1及び#2の各々では、提供ブロック601Pの論理アドレスの参照先が、追記単独ページにおけるサブブロック602P(圧縮後データセットA´が存在するサブブロック602P)の論理アドレスに代えて、重複先ブロックの論理アドレスとなる。
・ストレージコントローラ101は、追記ボリューム#1及び#2にそれぞれ割り当てられた2つの追記単独ページの各々のうち、圧縮後データセットA´が格納されているサブブロック602Pを、点線で示す通り、無効サブブロック(未割当)として管理する。
・ストレージコントローラ101は、重複管理テーブル430を更新する。更新後の重複管理テーブル430では、重複先ブロック(共通ブロック601C)の論理アドレスの参照元が、コピー元の2つの提供ブロック601Pの論理アドレスである。
以上の手順が、重複排除処理の一例である。なお、以上の重複排除処理において、ストレージコントローラ101は、重複データセットAを共通ブロック601Cにコピーすることに代えて、いずれかの圧縮後データセットA´を共通領域80に属する共通ページ51Cに追記的にコピーしてもよい。
そして、ストレージコントローラ101は、2つの提供ブロック601Pの論理アドレスの参照先を、コピー先ページ(共通ページ51C)のサブブロック602Cの論理アドレスとし、コピー元のサブブロック602Pを無効サブブロックとしてもよい。このような処理が採用される場合、共通ボリューム501Cは無くてもよい。
また、ストレージコントローラ101が重複データセットAを共通ブロック601Cにコピーする場合、共通ブロック601Cはキャッシュメモリ402に割り当てられてもよい。
ストレージコントローラ101は、例えば、提供ボリューム#1のうちの、データセットAのライト先の提供ブロック601Pに、データセットFを書き込むためのライト要求を受信したとする。
この場合、追記ボリューム#1の追記単独ページ(単独ページ51P)に対して、下記の(c1)〜(c3)が行われる。(c2)は、重複排除処理の前にデータセットFのライト要求を受けた場合に行われる処理である。(c3)は、重複排除処理の後にデータセットFのライト要求を受けた場合に行われる処理である。
(c1):ストレージコントローラ101は、旧サブブロックであるサブブロック602の参照元(旧参照元)が、提供ボリューム#1におけるいずれかの提供ブロック601Pの論理アドレスであるか否かを判定する。
ここで、「旧サブブロック」とは、ライト対象の圧縮後データセットF´の更新前の圧縮後データセットA´を格納したサブブロックである。「ライト対象の圧縮後データセットF´」とは、ライト先の提供ブロック601Pへのライト対象のデータセットFの圧縮後データセットである。
(c2):(c1)の判定の結果が真の場合、ストレージコントローラ101は、旧サブブロックが追記単独ページに存在するため、旧サブブロックはサブブロック602Pであり、旧サブブロックであるサブブロック602Pを無効サブブロック(未使用のサブブロック)とする。
そして、ストレージコントローラ101は、ライト対象の圧縮後データセットF´を新たなサブブロックに追記し、ライト先の提供ブロック601Pの論理アドレスの参照先を、旧サブブロックであるサブブロック602Pの論理アドレスから、新たなサブブロックの論理アドレスに変更する。
(c3):(c1)の判定の結果が偽の場合、ストレージコントローラ101は、旧サブブロックが追記共通ページに存在するため、旧サブブロックはサブブロック602Cであり、旧サブブロックでるサブブロック602Cを無効サブブロックとしない。
そして、ストレージコントローラ101は、ライト対象の圧縮後データセットF´を追記単独ページ(単独ページ51P)における新たなサブブロックに追記し、ライト先の提供ブロック601Pの論理アドレスの参照先を、重複先ブロックの論理アドレスから、新たなサブブロックの論理アドレスに変更する。
以上のような(c1)及び(c2)であるため、下記の(x1)及び(x2)のような状況が発生し得る。
(x1):追記単独ページにおいて、有効な圧縮後データセット(有効なサブブロック602P)の論理アドレスが非連続となる状況(有効な圧縮後データセットが離散した状況)。
(x2):共通ボリューム501Cにおける重複先ブロック(共通ブロック601C)が、いずれの提供ボリューム501Pにおける提供ブロック601Pからも参照されなくなっているにも関わらず、使用中のままとなり、結果として、共通ボリューム501Cの空き容量が増えず、且つ、不必要な圧縮後データブロックが共通ページ51Cに残り続けてしまう状況。
以上の(x1)の状況が発生し得るため、単独領域70に関しては、ガベージコレクション処理が必要となる。本実施形態では、単独領域70に関してのガベージコレクション処理を効率的に行うことができる。
すなわち、ガベージコレクション処理において、有効ないずれの圧縮後データセットも単独データセットの圧縮後データセットであるため、各有効な圧縮後データセットについて、参照元は1つであり、その1つの参照元についてのみ、参照先の変更を行えばよいからである。
以上の(x2)の状況が発生し得るため、ストレージコントローラ101は、重複先ブロックを未使用とするための解放処理を行う。
具体的に、解放処理においてストレージコントローラ101は、重複先ブロックの1以上の参照元ブロック(1以上の提供ボリューム501Pにおける1以上の提供ブロック601P)から、参照先が重複先ブロックではない参照元ブロックを除外する。
そして、ストレージコントローラ101は、1以上の参照元ブロックが除外されたために重複先ブロックを参照先とする参照元が無くなった場合、重複先ブロックを未使用へと解放する。
それに伴い、ストレージコントローラ101は、解放される重複先ブロックの参照先のサブブロック602Cを無効サブブロックとする。なお、共通ボリューム501Cにおける重複先ブロックの参照元となる提供ブロック601Pが1つだけの場合、ストレージコントローラ101は、下記のうちのいずれかを行ってもよい。
・ストレージコントローラ101は、重複先ブロックに対応した圧縮後データセットを、共通ページ51C(サブブロック602C)から、参照元となる提供ブロック601Pを含む提供ボリューム501Pに対応した追記単独ページへ、追記的にコピーする。
そして、ストレージコントローラ101は、コピー元のサブブロック602Cを未使用(未割当)とし、重複先ブロックを未使用とする。これにより、共通ボリューム501Cの空き容量を増やすことができる。
・ストレージコントローラ101は、重複先ブロックに対応した圧縮後データセットを、共通ページ51Cに格納されたままとする。これにより、ページ51間のコピーの発生頻度を低減することができる。
図33は、ボリューム複製処理の例を示す図である。図7と同様に、論理ボリューム501として提供ボリューム501Pに加えて共通ボリューム501Cがあり、アドレス変換テーブル422(アドレス変換テーブル422Pa、422P、422S、及び422C)と追記ボリューム502の各々が、論理ボリューム501毎に設けられている。
また、図7の説明で定義した用語に加え、図33の説明には下記の用語を使用することがある。
・追記重複単独ページ:単独ページ且つ追記ページ且つ共通データセットを有するページ(重複単独ボリュームに対応した追記ボリュームに割り当てられ、且つ、共通データセットを有するページ)。
提供ボリューム#1があり、故に、アドレス変換テーブル#1と、追記ボリューム#1がある。また、共通ボリューム#2があり、故に、アドレス変換テーブル#2と、追記ボリューム#2がある。追記ボリューム#1が、単独領域70に属し、追記ボリューム#2が、共通領域80に属する。
ボリューム複製前の状況の一例は、図33の大矢印の元に示すように、下記の通りである。
・提供ボリューム#1が有する2つの提供ブロック601Pの各々に、データセットA及びデータセットBが存在する。追記ボリューム#2に割り当てられた追記共通ページ(共通ページ51C)に、圧縮後データセットA´が存在する。また、追記ボリューム#1に割り当てられた追記単独ページに、圧縮後データセットB´が存在する。
・アドレス変換テーブル#1では、データセットAのライト先の提供ブロック601Pの論理アドレスの参照先が、共通ボリューム#2の重複先ブロックの論理アドレスであり、データセットBのライト先の提供ブロック601Pの論理アドレスの参照先が、追記単独ページにおけるサブブロック602Pの論理アドレスである。
以上の状況に対してストレージコントローラ101は、ボリューム複製処理において、複製先となる提供ボリューム#3を作成する。この提供ボリューム#3の作成に伴い、追記ボリューム#3及びアドレス変換テーブル#3も作成される。提供ボリューム#3は単独領域70に属し、下記のように図33の大矢印の先に示した通りとなる。
・ストレージコントローラ101は、複製元ボリュームへのライトデータを複製後に格納する為の論理ボリューム#4を作成する。論理ボリューム#4の作成に伴い、追記ボリューム#4及びアドレス変換テーブル#4も作成される。論理ボリューム#4は単独領域に属する。
複製前にサーバシステム201から提供ボリューム#1に発行されていたリード要求及びライト要求は、複製後に論理ボリューム#4へ発行されるようにするため、提供ボリューム#1と論理ボリューム#4のボリュームIDをスワップする。すなわち論理ボリューム#4が提供ボリュームになる。なお、図33にはスワップ前の状況を示している。
また、スワップ前の提供ボリューム#1は共通ボリューム#2と同様にサーバシステム201に提供されない重複単独ボリュームとなる。以降、重複単独ボリューム#1のことを旧世代提供ボリュームと呼び、提供ボリューム#4(スワップ後の提供ボリューム#1)のことを最新世代提供ボリュームと呼ぶこともある。
・ストレージコントローラ101は、ボリューム複製によって生成されるアドレス変換テーブル#3及びアドレス変換テーブル#4を、例えばアドレス変換テーブル#1の複製によって作成する。複製後のアドレス変換テーブル#3及びアドレス変換テーブル#4は、重複データセットAに対応する重複元ブロック(提供ブロック601S及び601Pa)の論理アドレスの参照先が、重複先ブロック(共通ブロック601C)の論理アドレスとなる。
一方、単独データセットBに対応する重複元ブロック(提供ブロック601S及び601Pa)の参照先は、アドレス変換テーブル#1と同じ参照先、すなわち、追記単独ページにおけるサブブロック602P(圧縮後データセットB´)の論理アドレスとするのではなく、複製元である旧世代提供ボリューム#1の圧縮前データセットAに対応する提供ブロック601Pの論理アドレスとなるように更新する。
以上が、ボリューム複製処理の一例である。なお、図33の大矢印の先の状態から複製先の提供ボリューム501Sの複製ボリュームを更に作成する場合も、以上と同様の処理となる。
すなわち、ストレージコントローラ101は、更に複製先となる提供ボリューム、及びその複製元となる提供ボリューム501Sへのライトデータを格納する為の新たな提供ボリュームを単独領域70に作成する。
サーバシステム201から発行されるリード要求及びライト要求を、新たに作成した論理ボリュームに対して実行されるよう、提供ボリューム501Sと新たな作成した提供ボリュームのボリュームIDをスワップする。
また、ボリューム複製処理において、ストレージコントローラ101は、複製先提供ボリューム#3及び最新世代提供ボリューム#4に対応するアドレス変換テーブル#3及びアドレス変換テーブル#4を、複製元の旧世代提供ボリューム#1に対応するアドレス変換テーブル#1から複製しなくてもよい。
その場合、複製先提供ボリューム#3及び最新世代提供ボリューム#4へのリード処理では、世代管理テーブル432、及び実データ位置管理ビットマップ433を参照して、実データが存在するアドレス変換テーブル422を特定する。この処理に関する詳細は後述する。
また、旧世代提供ボリューム#1は、複数の提供ボリューム#3及び#4から重複データセットの論理アドレスを参照される点で共通ボリューム#3と類似しているため、ボリューム複製処理において、共通ボリュームと同様、重複管理テーブル430を作成してもよい。また、旧世代提供ボリューム#1は単独領域70に代えて、共通領域80に属するように変更されてもよい。
ストレージコントローラ101は、例えば、最新世代提供ボリューム#4のうちの、データセットAのライト先の提供ブロック601Paに、データセットFを書き込むためのライト要求を受信したとする。
この場合、ストレージコントローラ101は、アドレス変換テーブル#4を参照し、書き込み前の旧データAに対応するA´が追記共通ページ(共通ページ51C)に存在するため、ライト対象の圧縮後データセットF´を追記単独ページ(追記ボリューム502Paのページ51Pa)における新たなサブブロックに追記する。
そして、ストレージコントローラ101は、ライト先提供ブロックの論理アドレスの参照先を、重複先ブロック(共通ブロック601C)の論理アドレスから新たなサブブロックの論理アドレスに変更する。
また、ストレージコントローラ101は、例えば、最新世代提供ボリューム#4のうちの、データセットBのライト先の提供ブロック601Paに、データセットGを書き込むためのライト要求を受信したとする。
この場合、ストレージコントローラ101は、アドレス変換テーブル#4を参照し、書き込み前の旧データBに対応するB´が追記重複単独ページとなった単独ページ51Pに存在する。
このため、ライト対象の圧縮後データセットG´を追記単独ページ(ページ51Pa)における新たなサブブロックに追記し、ライト先提供ブロックの論理アドレスの参照先を、重複先ブロックである提供ブロック601Pの論理アドレスから新たなサブブロックの論理アドレスに変更する。
また、ストレージコントローラ101は、例えば、複製先提供ボリューム#3のうちの、データセットAのライト先の提供ブロック601Sに、データセットHを書き込むためのライト要求を受信したとする。
この場合、ストレージコントローラ101は、アドレス変換テーブル#3を参照し、書き込み前の旧データAに対応するA´が追記共通ページに存在するため、ライト対象の圧縮後データセットH´を(追記ボリューム502Sの)追記単独ページ51Sにおける新たなサブブロックに追記する。
そして、ストレージコントローラ101は、ライト先提供ブロックの論理アドレスの参照先を、重複先ブロック(共通ブロック601C)の論理アドレスから新たなサブブロックの論理アドレスに変更する。
また、ストレージコントローラ101は、例えば、複製先提供ボリューム#3のうちの、データセットBのライト先の提供ブロック601Sに、データセットIを書き込むためのライト要求を受信したとする。
この場合、ストレージコントローラ101は、アドレス変換テーブル#3を参照し、書き込み前の旧データBに対応するB´が追記重複単独ページとなった単独ページ51Pに存在する。
このため、ライト対象の圧縮後データセットI´を追記単独ページ51Sにおける新たなサブブロックに追記し、ライト先提供ブロックの論理アドレスの参照先を、重複先ブロックである提供ブロック601Pの論理アドレスから新たなサブブロックの論理アドレスに変更する。
旧世代提供ボリューム#1は共通ボリューム#2と同様に、前述の(x2)の問題が発生し得る。すなわち、旧世代提供ボリューム#1において重複先ブロックとなった提供ブロック601Pが、いずれの最新世代の提供ボリューム501Paにおける提供ブロック601Pa及び複製先の提供ボリューム501Sにおける提供ブロック601Sから参照されなくなる可能性がある。
そして、提供ブロック601Pは、参照されなくなっているにも関わらず、使用中のままとなり、結果として、旧世代提供ボリューム#1の空き容量が増えず、且つ、追記重複単独ページである単独ページ51Pに、不必要な圧縮後データブロックが残り続けてしまうこと、が発生し得る。
この状況が発生し得るため、共通ボリューム#2と同様に、ストレージコントローラ101は、重複先ブロックである提供ブロック601Pを未使用とするための解放処理を行う。
具体的に、重複単独領域解放処理においてストレージコントローラ101は、重複先ブロックである提供ブロック601Pの1以上の参照元ブロック(1以上の提供ボリューム501Paにおける1以上の提供ブロック601Pa及び1以上の提供ボリューム501Sにおける1以上の提供ブロック601S)から、参照先が重複先ブロックではない参照元ブロックを除外する。
そして、ストレージコントローラ101は、1以上の参照元ブロックが除外されたために重複先ブロックを参照先とする参照元が無くなった場合、重複先ブロックである提供ブロック601Pを未使用へと解放する。
それに伴い、ストレージコントローラ101は、解放される重複先ブロックである提供ブロック601Pの参照先のサブブロック602Pを無効サブブロックとする。なお、旧世代提供ボリューム#1における重複先ブロックの参照元ブロックが1つだけの場合、ストレージコントローラ101は、下記のうちのいずれかを行ってもよい。
・ストレージコントローラ101は、重複先ブロックの提供ブロック601Pに対応した圧縮後データセットを、追記重複単独ページの単独ページ51Pから、参照元の提供ブロック601Pa(又は参照元の提供ブロック601S)を含む提供ボリューム501Pa(又は提供ボリューム501S)に対応した追記単独ページ(ページ51Pa)又は追記単独ページ51Sに、追記的にコピーする。
そして、ストレージコントローラ101は、(重複単独ページにおける)コピー元のサブブロック602Pを未使用(未割当)とし、重複先ブロックである提供ブロック601Pを未使用とする。これにより、旧世代提供ボリューム#1の空き容量を増やすことができる。
・ストレージコントローラ101は、重複先ブロックである提供ブロック601Pに対応した圧縮後データセットを、重複単独ページ(単独ページ51P)に格納されたままとする。これにより、ページ51間のコピーの発生頻度を低減することができる。
以下、テーブルの例を説明する。
図8は、VOL管理テーブル421の例を示す図である。本実施形態では、提供ボリューム501Pのようにサーバシステム201に提供される論理ボリュームも、共通ボリューム501C及び追記ボリューム502のようにサーバシステム201に提供されない論理ボリュームも、「VOL」と総称してもよい。
また、ボリューム複製により、新たにサーバシステム201に提供される提供ボリューム501Paと501S、及びサーバシステムに提供されなくなった旧世代提供ボリューム#1である提供ボリューム501Pも、「VOL」である。
VOL管理テーブル421は、VOLに関する情報を保持する。例えば、VOL管理テーブル421は、VOL毎にエントリを有する。各エントリは、VOL#801、VOL属性802、VOL容量803、及びプール#804といった情報を格納する。以下、1つのVOL(「対象VOL」と呼ぶ)を例に取って説明する。
VOL#801は、対象VOLの番号(識別番号)の情報である。VOL属性802は、対象VOLの属性の情報である(例えば、提供ボリュームは“提供”、追記ボリュームは“追記”、共通ボリュームは“共通”、ボリューム複製による旧世代の提供ボリュームは“重複単独”)。VOL容量803は、対象VOLの容量の情報である。プール#804は、対象VOLに関連付けられているプール503の番号の情報である。
図9は、アドレス変換テーブル422の例を示す図である。アドレス変換テーブル422は、論理ボリューム501(レイヤ1の論理ボリューム)毎に設定される。アドレス変換テーブル422は、参照元の論理アドレスと参照先の論理アドレスとの関係に関する情報を保持する。
例えば、アドレス変換テーブル422は、ブロック601毎にエントリを有する。各エントリは、VOL内アドレス901、参照先VOL#902、参照先VOL内アドレス903、データサイズ904、及び参照先VOL種別905といった情報を格納する。以下、1つのブロック601(「対象ブロック」と呼ぶ)を例に取って説明する。
VOL内アドレス901は、論理ボリューム501における対象ブロックの論理アドレス(例えば先頭論理アドレス)の情報である。参照先VOL#902は、対象ブロックの参照先のVOL(追記ボリューム又は共通ボリューム)の番号の情報である。
参照先VOL内アドレス903は、対象ブロックの参照先のVOLにおける対象ブロックの論理アドレスに対応する論理アドレス(参照先VOL内の論理アドレス)の情報である。データサイズ904は、対象ブロックをライト先としたデータセットの圧縮後データセットのサイズの情報である。
参照先VOL種別905は、対象ブロックの参照先のVOLの種別(“単独”(追記ボリューム)であるか、“共通”(共通ボリューム)であるか、“重複単独”(重複単独ボリューム)であるかの種別)の情報である。
図10は、有効領域管理テーブル424の例を示す図である。有効領域管理テーブル424は、論理ボリューム501毎に設定される。有効領域管理テーブル424は、有効領域に関する情報を保持する。例えば、有効領域管理テーブル424は、ブロック601毎にエントリを有する。
各エントリは、VOL内アドレス1001及び有効フラグ1002といった情報を格納する。以下、1つのブロック601(「対象ブロック」と呼ぶ)を例に取って説明する。VOL内アドレス1001は、対象ブロックの論理アドレスの情報である。有効フラグ1002は、対象ブロックが有効領域に属するか(“有”)、属さないか(“無”)の情報である。
図11は、ページ変換テーブル425の例を示す図である。ページ変換テーブル425は、論理ボリューム501毎に、及び追記ボリューム502毎に、設定される。ページ変換テーブル425は、論理ボリューム501又は追記ボリューム502における領域(例えば、ページ51のサイズと同数分のブロック601)とページ51との関係に関する情報を保持する。
例えば、ページ変換テーブル425は、論理ボリューム501又は追記ボリューム502における領域毎にエントリを有する。各エントリは、VOL内アドレス1101、割当フラグ1102、及びページ#1103といった情報を格納する。以下、1つの領域(「対象領域」と呼ぶ)を例に取って説明する。
VOL内アドレス1101は、対象領域の論理アドレス(例えば先頭論理アドレス)の情報である。割当フラグ1102は、対象領域にページ51が割り当てられているか(“割当済”)、割り当てられていないか(“未割当”)の情報である。ページ番号1103は、対象領域に割り当てられているページ51の番号の情報である。
図12は、ページ割当管理テーブル426の例を示す図である。ページ割当管理テーブル426は、プール503毎に設定される。ページ割当管理テーブル426は、ページ51とその割当先との関係に関する情報を保持する。例えば、ページ割当管理テーブル426は、ページ51毎にエントリを有する。
各エントリは、ページ#1201、割当フラグ1202、割当先VOL#1203、及び割当先VOL内アドレス1204といった情報を格納する。以下、1つのページ51(「対象ページ」と呼ぶ)を例に取って説明する。ページ#1201は、対象ページの番号の情報である。割当フラグ1202は、対象ページが割り当てられているか(“割当済”)、割り当てられていないか(“未割当”)の情報である。
割当先VOL#1203は、対象ページの割当先VOL(論理ボリューム501又は追記ボリューム502)の番号の情報である。割当先VOL内アドレス1204は、対象ページの割当先VOLにおける領域の論理アドレス(例えば先頭論理アドレス)の情報である。
図13は、サブブロック管理テーブル427の例を示す図である。サブブロック管理テーブル427は、追記ボリューム502毎に設定される。サブブロック管理テーブル427は、サブブロック602に関する情報を保持する。例えば、サブブロック管理テーブル427は、サブブロック602毎にエントリを有する。
各エントリは、ページ#1301、ページ内アドレス1302、割当フラグ1303、VOL内アドレス1304、及びサブブロックサイズ1305といった情報を格納する。
以下、1つのサブブロック602(「対象サブブロック」と呼ぶ)を例に取って説明する。
ページ#1301は、対象サブブロックを含むページ51の番号の情報である。ページ内アドレス1302は、ページ51における対象サブブロックの論理アドレスの情報である。割当フラグ1303は、対象サブブロックが割り当てられているか(“割当済”)、割り当てられていないか(“未割当”)、言い換えれば、対象サブブロックが使用中か未使用かの情報である。
VOL内アドレス1304は、対象サブブロックの割当先の論理アドレス(追記ボリューム502における領域の論理アドレス)の情報である。サブブロックサイズ1305は、対象サブブロックのサイズ(対象サブブロックに格納されている圧縮後データセットのサイズ)の情報である。なお、ページ内アドレス1302とVOL内アドレス1304は同じであってもよい。
図14は、追記先検索テーブル428の例を示す図である。追記先検索テーブル428は、圧縮後データセットの追記先の情報を保持する。追記先検索テーブル428は、例えば、追記ボリューム502毎にエントリを有する。各エントリは、VOL#1401、追記先アドレス1402、及び終端アドレス1403といった情報を格納する。
以下、1つの追記ボリューム502(「対象追記ボリューム」と呼ぶ)を例に取って説明する。VOL#1401は、対象追記ボリュームの番号の情報である。追記先アドレス1402は、対象追記ボリュームにおける追記先の論理アドレス(対象追記ボリュームに割り当てられた追記ページにおける追記先の論理アドレス)の情報である。
ここで、追記先アドレス1402は、追記先の先頭の論理アドレスの情報となる。終端アドレス1403は、追記先となり得る論理アドレスの終端の論理アドレスの情報である。 追記先の論理アドレスと終端の論理アドレスとの差に従うサイズが、圧縮後データサイズ未満の場合、追記不可のため、ガベージコレクション処理を経て、対象追記ボリュームの先頭の論理アドレスが再度追記先とされてよい。
具体的には、例えば、ストレージコントローラ101は、対象追記ボリュームの先頭の論理アドレスに近い追記ページから優先的にガベージコレクション処理を行ってもよい。それにより、対象追記ボリュームの先頭の論理アドレスに近い追記ページから優先的に、追記ページの割当が解除され、結果として、対象追記ボリュームの先頭の論理アドレスに近い領域から優先的に、未使用とされていってよい。
図15は、重複チェックテーブル489の例を示す図である。重複チェックテーブル489は、重複判定処理において作成され使用される。重複チェックテーブル489は、重複判定処理の対象とされるデータについて作成され、例えばメモリ212に格納される。ここで言う「データ」は、典型的には、所定の処理対象のデータであり、ブロックのサイズよりも大きい。
このため、重複判定処理(及び、単独領域70又は共通領域80へのデータの格納)は、ブロック単位(データセット単位)で行われてもよいが、本実施形態では、ブロック単位に代えて処理対象のデータの単位でまとめて行われる。
具体的には、例えば、処理対象のデータは、いずれかの提供ボリューム501Pに対するライト要求に従うデータであり、ライト要求に従うデータのサイズは、ブロックのサイズの整数倍でよく、重複判定処理(及び、単独領域70又は共通領域80へのデータの格納)は、ライト要求に従うデータの単位(すなわち、I/O要求の単位)で行われてもよい。
このように、重複判定処理(及び、単独領域70又は共通領域80へのデータの格納)は、処理対象のデータの単位でまとめて行われるので、効率的である。重複チェックテーブル489は、例えば、データを構成する1以上のデータセットにそれぞれ対応した1以上のブロック601の各々について、エントリを有する。
各エントリは、対象VOL#1501、対象VOL内アドレス1502、ハッシュ値1503、ヒットフラグ1504、比較先VOL#1505、比較先VOL内アドレス1506、比較成功フラグ1507、格納先VOL#1508、及び格納先VOL内アドレス1509といった情報を格納する。
以下、1つのブロック601(「対象ブロック」と呼ぶ)を例に取って説明する。対象VOL#1501は、対象ブロックを含む論理ボリューム501の番号の情報である。対象VOL内アドレス1502は、対象ブロックの論理アドレスの情報である。
ハッシュ値1503は、対象ブロックに対応したハッシュ値(対象ブロックがライト先であるデータセットのハッシュ値)の情報である。ヒットフラグ1504は、ハッシュ値ヒットしたか(“Hit”)、バッシュ値ヒットしなかったか(“Miss”)の情報である。「ハッシュ値ヒット」とは、対象ブロックに対応したハッシュ値と一致するハッシュ値が既に存在することである。
比較先VOL#1505は、対象ブロックについてハッシュ値ヒットが生じた場合に有効であり、比較先VOLの番号の情報である。「比較先VOL」とは、対象ブロックに対応したハッシュ値と一致するハッシュ値のデータセットを格納する論理ボリューム501であり、データセット同士の比較先とされる論理ボリューム501である。比較先VOLは、提供ボリューム501Pと共通ボリューム501Cのいずれかである。
比較先VOL内アドレス1506は、対象ブロックに対応したハッシュ値と一致するハッシュ値のデータセットを格納するブロック601の論理アドレス(比較先VOLにおけるブロック601の論理アドレス)の情報である。対象ブロックについて、比較先VOL#1505及び比較先VOL内アドレス1506の組が複数存在してもよい。
比較成功フラグ1507は、対象ブロックについてハッシュ値ヒットが生じた場合に行われるデータセット同士の比較が成功したか(“成功”)、失敗したか(“失敗”)の情報である。データセット同士が互いに一致の場合に、比較成功フラグ1507は“成功”である。
格納先VOL#1508は、格納先VOLの番号の情報である。「格納先VOL」とは、対象ブロックがライト先であるデータセットの格納先の論理ボリューム501である。対象ブロックがライト先であるデータセットが単独データセットであれば、格納先VOLは、追記ボリューム502である。
対象ブロックがライト先であるデータセットが重複データセットであれば、格納先VOLは、共通ボリューム501Cである。格納先VOL内アドレス1509は、対象ブロックがライト先であるデータセットの格納先ブロックの論理アドレス(格納先VOL内のブロックの論理アドレス)の情報である。
図16は、ハッシュ管理テーブル429の例を示す図である。ハッシュ管理テーブル429は、データセットのハッシュ値に関する情報を保持する。ハッシュ管理テーブル429は、例えば、ハッシュ値毎にエントリを有する。
各エントリは、ハッシュ値1601、登録フラグ1602、VOL#1603、及びVOL内アドレス1604といった情報を格納する。以下、1つのハッシュ値(「対象ハッシュ値」と呼ぶ)を例に取って説明する。
ハッシュ値1601は、対象ハッシュ値そのものの情報である。登録フラグ1602は、対象ハッシュ値をハッシュ値とするデータセットがストレージシステム200に存在しているか(“済”)、存在していないか(“未”)の情報である。
VOL#1603は、対象ハッシュ値をハッシュ値とするデータセットを格納する論理ボリューム501の番号の情報である。VOL内アドレス1604は、対象ハッシュ値をハッシュ値とするデータセットを格納するブロック601の論理アドレスの情報である。
重複判定処理において、対象ハッシュ値についてハッシュ値ヒットが生じた場合、対象ハッシュ値に対応したVOL#1603及びVOL内アドレス1604の情報が、図15に示した重複チェックテーブル489における比較先VOL#1505及び比較先VOL内アドレス1506の情報とされる。
図17は、重複管理テーブル430の例を示す図である。重複管理テーブル430は、重複データセットの位置(論理アドレス)に関する情報を保持する。重複管理テーブル430は、例えば、共通ボリューム501Cを構成する複数の共通ブロック601Cの各々について、VOL内アドレス(論理アドレス)を有する。
参照元が存在する共通ブロック601Cには、参照元のエントリが例えばキュー形式で関連付けられる。参照元のエントリは、VOL#(参照元のブロック601を含む論理ボリューム501の番号)、及び、VOL内アドレス(参照元のブロック601の論理アドレス)を格納する。
図18は、共通領域割当管理テーブル431の例を示す図である。共通領域割当管理テーブル431は、共通ボリューム501C毎に設定される。共通領域割当管理テーブル431は、共通ボリューム501Cの空き状況に関する情報を保持する。
共通領域割当管理テーブル431は、例えば、共通ボリューム501Cを構成する複数の共通ブロック601Cの各々について、エントリを有する。各エントリは、VOL内アドレス1801及び使用中フラグ1802といった情報を格納する。以下、1つの共通ブロック601C(「対象ブロック」と呼ぶ)を例に取って説明する。
VOL内アドレス1801は、対象ブロックの論理アドレスの情報である。使用中フラグ1802は、対象ブロックが使用中であるか(“使用中”)、使用中でないか(“未使用”)の情報である。
使用中フラグ1802の情報が“使用中”であるとは、対象ブロックに直接的(追記ボリューム非経由)又は間接的(追記ボリューム経由)にページ51が割り当てられていることを意味する。使用中フラグ1802の情報が“未使用”であるとは、対象ブロックにページ51が割り当てられていないこと、すなわち、空きであることを意味する。
図19は、共通領域チェックテーブル434の例を示す図である。共通領域チェックテーブル434は、共通ボリューム501C毎に設定される。共通領域チェックテーブル434は、共通ボリューム501Cに対する参照状況に関する情報を保持する。
共通領域チェックテーブル434は、例えば、共通ボリューム501Cを構成する複数の共通ブロック601Cの各々について、エントリを有する。各エントリは、VOL内アドレス1901及び参照フラグ1902といった情報を格納する。以下、1つの共通ブロック601C(「対象ブロック」と呼ぶ)を例に取って説明する。
VOL内アドレス1901は、対象ブロックの論理アドレスの情報である。参照フラグ1902は、対象ブロックについて1以上の参照元となるブロック601が存在するか(“有”)、存在しないか(“無”)の情報である。
図34は、世代管理テーブル432の例を示す図である。世代管理テーブル432は、複製ボリュームグループ毎に設定される。複製ボリュームグループとは、ある提供ボリューム501Pのボリューム複製処理により作成される(図33に示した)複製ボリューム(提供ボリューム501S)及び最新世代提供ボリューム(提供ボリューム501Pa)のグループである。
世代管理テーブル432は、ボリューム間の世代関係に関する情報を保持する。世代管理テーブル432は、ボリューム毎にエントリを有する。各エントリは、VOL#3401、親世代VOL#3402、及び子世代VOL#3403といった情報を格納する。以下、1つの最新世代提供ボリューム(「対象ボリューム」と呼ぶ)を例に取って説明する。
VOL#3401は、対象ボリュームの番号の情報である。親世代VOL#3402は、対象ボリュームの複製元である旧世代ボリュームの番号の情報である。子世代VOL#3403は、対象ボリュームを複製元とした複製先ボリュームの番号の情報である。
図35は、実データ位置管理ビットマップ433の例を示す図である。実データ位置管理ビットマップ433は、複製ボリュームグループ毎に設定される。実データ位置管理ビットマップ433は、ボリュームの論理アドレスの参照先が示す実データが格納されているVOLを特定する為の情報を保持する。
例えば、実データ位置管理ビットマップ433は、ブロック601毎にエントリを有する。各エントリは、VOL内アドレス3501及び世代VOL#毎の使用中フラグ3502といった情報を保持する。以下、1つのブロック601(「対象ブロック」と呼ぶ)を例に取って説明する。
VOL内アドレス3501は、対象ブロックの論理アドレスの情報である。世代VOL#毎の使用中フラグ3502は、対象ブロックに対応する実データ(いずれかのボリュームの参照先ブロックに格納されたデータ)が、存在するか(“有”)、存在しないか(“無”)の世代VOL#毎の情報である。
なお、世代VOL#毎の使用中フラグ3502の情報が(“無”)の場合、その(“無”)に対応する実データは、その世代として新しい実データが存在せず、その世代より前の世代に存在する実データが、リード要求などに対応するデータとして利用されてもよい。
以下、本実施形態で行われる処理を説明する。なお、以下の説明において、データセットの圧縮及び伸張は、データ量削減プログラム414により(又は、データ量削減プログラム414が呼び出されることにより)、実行されてもよい。
図20は、フロントエンドライト処理の流れの例を示す図である。フロントエンドライト処理は、論理ボリューム501に対するライト要求を受け付けた場合に行われる。
フロントエンドライトプログラム412は、キャッシュヒットしたか否かを判定する(ステップ2001)。ライト要求について、「キャッシュヒット」とは、ライト要求に従うライト先に対応したキャッシュセグメント(キャッシュメモリ402における領域)が確保されていることを意味する。
ステップ2001の判定結果が偽の場合(ステップ2001:NO)、フロントエンドライトプログラム412は、キャッシュメモリ402からキャッシュセグメントを確保する(ステップ2002)。
ステップ2001の判定結果が真の場合(ステップ2001:YES)、又は、ステップ2002の後、フロントエンドライトプログラム412は、確保されているキャッシュセグメントに、ライト要求に従うライト対象データを書き込む(ステップ2003)。
フロントエンドライトプログラム412は、ライト先の論理ボリューム501に対応した有効領域管理テーブル424を基に、ライト先が有効領域に属するか否かを判定する(ステップ2004)。
ステップ2004の判定結果が真の場合(ステップ2004:YES)、フロントエンドライトプログラム412は、ライト対象データを構成する1以上のデータセットの各々についてのライトコマンドを、データ量削減ダーティキューに蓄積する(ステップ2005)。
「データ量削減ダーティキュー」とは、ダーティのデータセット(ページ51に未格納のデータセット)であり圧縮が必要なデータセットのライトコマンドが蓄積されるキューである。
ステップ2004の判定結果が偽の場合(ステップ2004:NO)、フロントエンドライトプログラム412は、ライト対象データを構成する1以上のデータセットの各々についてのライトコマンドを、デステージダーティキューに蓄積する(ステップ2006)。
「デステージダーティキュー」とは、ダーティのデータセット(ページ51に未格納のデータセット)であり圧縮が不要なデータセットのライトコマンドが蓄積されるキューである。
ステップ2005又はステップ2006の後、フロントエンドライトプログラム412は、GOOD応答(ライト完了報告)を、ライト要求の送信元に返す(ステップ2007)。なお、ライト要求に対するGOOD応答は、バックエンドライト処理が完結した場合に返されてもよい。
バックエンドライト処理は、フロントエンド処理と同期又は非同期で行われてよい。バックエンドライト処理がバックエンドライトプログラム413により行われる。バックエンドライトプログラム413は、例えば、デステージダーティキューにあるライトコマンドについて、非圧縮又圧縮後のデータセットを、ライト先に関し割り当てられたページ51に書き込む。
図21は、データ量削減処理の流れの例を示す図である。データ量削減処理は、例えば定期的に行われる。
データ量削減プログラム414は、データ量削減ダーティキューを参照し(ステップ2101)、データ量削減ダーティキューにコマンドが有るか否かを判定し(ステップ2102)、判定結果としてデータ量削減ダーティキューにコマンドが無ければ(ステップ2102:NO)、データ量削減処理が終了する。
判定結果としてデータ量削減ダーティキューにコマンドが有れば(ステップ2102:YES)、データ量削減プログラム414は、データ量削減ダーティキューからライトコマンドを取得する、すなわち、ダーティのデータセットを選択する(ステップ2103)。
データ量削減プログラム414は、ステップ2103で選択されたデータセットについて重複排除処理を行い(ステップ2104)、重複排除されたか否かを判定する(ステップ2105)。なお、ステップ2104などの別定義の処理は後で説明する。
ステップ2103で選択されたデータセットが単独データセットであるが故に重複排除がされなかった場合(ステップ2105:NO)、データ量削減プログラム414は、重複排除されなかった単独データセットについて追記処理を行う(ステップ2106)。
ステップ2103で選択されたデータセットが重複データセットであるが故に重複排除がされた場合(ステップ2105:YES)、又は、ステップ2106の後、データ量削減プログラム414は、ステップ2103で選択されたデータセットを破棄(例えばキャッシュメモリ402から削除)する(ステップ2107)。
図22は、重複排除処理の流れの例を示す図である。重複排除処理は、図21のステップ2103で選択されたデータセットについて行われる。以下、図22から図24の説明において、ステップ2103で選択されたデータセットを「ライトデータセット」と言い、ライトデータセットのライト先のブロックを「ライト先ブロック」と言い、ライト先ブロックを含んだ論理ボリュームを「ライト先ボリューム」と言う。
データ量削減プログラム414は、ライトデータセットについて重複判定処理を行い(ステップ2201)、ライトデータセットが重複しているか否かを判定し(ステップ2202)、ステップ2201の判定結果として、ライトデータセットが単独データセット(重複していなデータセット)であれば(ステップ2202:NO)、重複排除処理を終了する。
ステップ2201の判定結果として、ライトデータセットが重複データセットであれば(ステップ2202:YES)、データ量削減プログラム414は、ライトデータセットと重複する別の重複データセットが単独領域70に存在するか否かを判定する(ステップ2203)。
なお、ライトデータセットと、そのライトデータセットと重複する別の重複データセットを、図22の以下の説明において「重複データセット」と総称する。すなわち、図22の以下の説明において、「重複データセット」は、ライトデータセットを含む2以上のデータセットのうちのいずれでもよい。
重複データセットが単独領域70に既に存在するデータセットの場合、後述のステップ2204及びステップ2205のいずれかにおいて、存在したデータセットの圧縮後データセットがデータ量削減プログラム414により一旦伸張され、伸張されたデータセットが、重複データセットとなってもよい。
また、ステップ2203の判定は、例えば、ライト先ブロックに対応した比較先VOL#1505の情報が、VOL属性802“提供”のVOL#801の情報と一致するか、或いはVOL属性802の情報が“共通”のVOL#801の情報と一致するか、に基づく。
ライト先ブロックに対応した比較先VOL#1505の情報が、VOL属性802の情報が“提供”のVOL#801の情報と一致すれば、別の重複データセットが単独領域70に存在することになるため、ステップ2203の判定結果が真(YES)である。
ライト先ブロックに対応した比較先VOL#1505の情報が、VOL属性802の情報が“共通”のVOL#801の情報と一致すれば、別の重複データセットが共通領域80に存在することになるため、ステップ2203の判定結果が偽(NO)である。
以上のステップ2203の判定結果が真の場合(ステップ2203:YES)、データ量削減プログラム414は、ステップ2204の処理へ進む。そして、データ量削減プログラム414は、使用中フラグ1802の情報が“未使用”の共通ブロック601Cを選択する(ステップ2204)。
以下、ステップ2204で選択された共通ブロック601Cを、「対象共通ブロック」と言い、対象共通ブロックを含む共通ボリューム501Cを、「対象共通ボリューム」と言う。
データ量削減プログラム414は、重複データセットを圧縮し、その圧縮後データセットを、追記共通ページ(対象共通ボリュームに対応した追記ボリューム502に割り当てられた共通ページ51C、特に対象共通ブロック)に追記する(ステップ2205)。
データ量削減プログラム414は、重複管理テーブル430を更新し、具体的には、対象共通ブロックに、1以上の重複データセットにそれぞれ対応した1以上のブロック601を参照元として関連付ける(ステップ2206)。
データ量削減プログラム414は、重複チェックテーブル489を更新し、具体的には、ライト先ブロックに対応した格納先VOL#1508の情報、及び、格納先VOL内アドレス1509の情報として、対象共通ボリュームの番号、及び、対象共通ブロックの論理アドレスを登録する(ステップ2207)。
データ量削減プログラム414は、ハッシュ管理テーブル429を更新し、例えば、ハッシュ値1601(重複データセットのハッシュ値)、登録フラグ1602(“済”)、VOL#1603(対象共通ボリュームの番号)、及びVOL内アドレス1604(対象共通ブロックの論理アドレス)の各々の情報を登録する(ステップ2208)。
データ量削減プログラム414は、ライトデータセット以外の重複データセットを格納する提供ボリューム501Pに対応したアドレス変換テーブル422を更新する(ステップ2209)。
このアドレス変換テーブル422の更新で、具体的には、重複データセットに対応した参照先VOL#902の情報、及び、参照先VOL内アドレス903の情報が、対象共通ボリュームの番号、及び、対象共通ブロックの論理アドレスに変更され、且つ、重複データセットに対応した参照先VOL種別905の情報が“共通”に変更される。
データ量削減プログラム414は、ライトデータセット以外の重複データセットを格納する提供ボリューム501Pに対応した追記ボリューム502に関するサブブロック管理テーブル427を更新し、具体的には、ライトデータセット以外の重複データセットの圧縮後データセットを格納するサブブロックに対応した割当フラグ1303の情報を“未割当”に変更する(ステップ2210)。
ステップ2203の判定結果が偽の場合(ステップ2203:NO)、データ量削減プログラム414は、ステップ2211へ進む。そして、データ量削減プログラム414は、重複管理テーブル430を更新し、具体的には、重複データセットを格納した共通ブロック601Cに、ライト先ブロックを新たな参照元として関連付ける(ステップ2211)。
データ量削減プログラム414は、重複チェックテーブル489を更新し、具体的には、ライト先ブロックに対応した格納先VOL内アドレス1509の情報と、格納先VOL#1508の情報として、重複データセットを格納した共通ブロック601Cの論理アドレスと、重複データセットを格納した共通ブロック601Cを含んだ共通ボリューム501Cの番号を登録する(ステップ2212)。
ステップ2210又はステップ2212の後、データ量削減プログラム414は、ライト先ボリュームに対応したアドレス変換テーブル422を更新する(ステップ2213)。
このアドレス変換テーブル422の更新で、具体的には、ライト先ブロック(ライトデータセット)に対応した参照先VOL#902の情報、及び、参照先VOL内アドレス903の情報が、共通ボリューム501Cの番号、及び、共通ブロック601Cの論理アドレスに変更され、且つ、ライト先ブロックに対応した参照先VOL種別905の情報が“共通”に変更される。
データ量削減プログラム414は、ライトデータセットの圧縮後データセットが追記単独ページにあれば、ライト先ボリュームに対応した追記ボリューム502に関するサブブロック管理テーブル427を更新し、具体的には、ライトデータセットの圧縮後データセットを格納するサブブロックに対応した割当フラグ1303を“未割当”に変更する(ステップ2214)。
本実施形態において、重複排除処理は、上述したポストプロセスとしての処理であるが、インプロセスとしての処理の場合、例えば図22のステップ2214は行われなくてもよい。これは、ライトデータセットの圧縮後データセットを追記すること無しに(又はライトデータセットの圧縮をすること無しに)重複排除がされるためである。
図23は、重複判定処理の流れの例を示す図である。データ量削減プログラム414は、ライトデータセットに関し重複チェックテーブル489を作成する(ステップ2301)。
重複排除処理が、例えば、I/O単位のような所定の処理対象のデータの単位で行われ、結果として、データが複数のデータセットを含む場合、重複チェックテーブル489は、それら複数のデータセットにそれぞれ対応した複数のエントリを有する。
データ量削減プログラム414は、ライト先ブロックに対応したハッシュ値1503の情報として、ライトデータセットのハッシュ値を登録する(ステップ2302)。
データ量削減プログラム414は、ステップ2302で登録したハッシュ値と一致するハッシュ値がハッシュ管理テーブル429に登録されているか否か、すなわち、ハッシュ値ヒットが生じるか否かを判定する(ステップ2303)。
ステップ2303の判定結果が真の場合(ステップ2303:YES)、データ量削減プログラム414は、重複チェックテーブル489を更新し、具体的には、ライト先ブロックに対応した比較先VOL#1505の情報及び比較先VOL内アドレス1506の情報として、ステップ2302で登録したハッシュ値と一致するハッシュ値に対応したVOL#1603の情報及びVOL内アドレス1604の情報を登録する(ステップ2304)。
データ量削減プログラム414は、ライトデータセットと、比較先VOL#1505の情報及び比較先VOL内アドレス1506の情報を基に取得したデータセット(例えば伸張後データセット)とを比較する(ステップ2305)。このステップ2305の比較は、圧縮後データセット同士の比較でもよい。
ステップ2303の判定結果が偽の場合(ステップ2303:NO)、データ量削減プログラム414は、ハッシュ管理テーブル429を更新し、具体的には、新たなエントリに、ハッシュ値1601(ライトデータのハッシュ値)、登録フラグ1602(“済”)、VOL#1603(ライト先ボリュームの番号)、及びVOL内アドレス1604(ライト先ブロックの論理アドレス)の各々の情報を登録する(ステップ2306)。
ステップ2305又はステップ2306の後、データ量削減プログラム414は、重複チェックテーブル489を更新し、具体的には、ライト先ブロックに対応した比較成功フラグ1507の情報を登録する(ステップ2307)。
この登録は、例えば、ステップ2305のデータセット同士の比較で一致が得られた場合、比較成功フラグ1507の情報として“成功”が登録される。ステップ2305のデータセット同士の比較で一致が得られなかった場合、又は、ステップ2306が行われた場合、比較成功フラグ1507の情報として“失敗”が登録される。
図24は、追記処理の流れ例を示す図である。追記処理は、図21のステップ2103で選択されたデータセットについて行われる。データ量削減プログラム414は、ライトデータセットを圧縮し、圧縮後データセットを例えばキャッシュメモリ402に格納する(ステップ2401)。
データ量削減プログラム414は、圧縮後データセットのサイズ以上の空きが、ライト先ボリュームに対応した追記ボリューム502に割当済のページ51に有るか否かを判定する(ステップ2402)。
この判定をするために、例えば、追記ボリューム502に対応した追記先アドレス1402の情報として登録されたアドレスが特定され、特定されたアドレスが属する領域に割り当てられているページ51の番号をキーとして、追記ボリューム502に対応したサブブロック管理テーブル427が参照されてもよい。
ステップ2402の判定結果が偽の場合(ステップ2402:NO)、データ量削減プログラム414は、ライト先ボリュームに対応した追記ボリューム502に、未割当のページ51を割り当てる(ステップ2403)。
ステップ2402の判定結果が真の場合(ステップ2402:YES)、又は、ステップ2403の後、データ量削減プログラム414は、追記先とするサブブロックを割り当てる(ステップ2404)。
データ量削減プログラム414は、ライトデータセットの圧縮後データセットを追記ボリューム502にコピーする、例えば、圧縮後データセットを、追記ボリューム502用の領域(キャッシュメモリ402における領域)にコピーする(ステップ2405)。
データ量削減プログラム414は、圧縮後データセットのライトコマンドをデステージダーティキューに登録し(ステップ2406)、ライト先ボリュームに対応したアドレス変換テーブル422を更新する(ステップ2407)。
このアドレス変換テーブル422の更新で、具体的には、ライト先ブロックに対応した参照先VOL#902の情報、及び、参照先VOL内アドレス903の情報が、追記ボリューム502の番号、及び、ステップ2404で割り当てたサブブロックの論理アドレスに変更され、且つ、ライト先ブロックに対応した参照先VOL種別905の情報が“単独”に変更される。
データ量削減プログラム414は、ライト先ボリュームに関連する旧世代ボリュームが存在するか否かを判定する(ステップ2408)。旧世代ボリュームとは、論理ボリュームの複製を取得した場合の、複製元のボリュームのことである。
ステップ2408の判定は、世代管理テーブル432においてライト先ボリュームの番号とVOL#3401の情報とが一致するエントリが参照され、親世代VOL#3402が設定されているか否かで判定されてもよい。
ステップ2408の判定結果が真の場合(ステップ2408:YES)、実データ位置管理ビットマップ433のライト先ブロックの番号とVOL内アドレス3501の情報が一致するエントリのうち、ライト先ボリュームに対応する世代VOL#毎の使用中フラグ3502を(“有”)に更新する(ステップ2409)。
ステップ2408の判定結果が偽の場合(ステップ2408:NO)、又は、ステップ2409の後、データ量削減プログラム414は、旧サブブロックの参照元(旧参照元)が、ライト先ブロックの論理アドレスであるか否か(すなわち、単独領域70であるか否か)を判定する(ステップ2410)。
「旧サブブロック」とは、ライトデータセットの圧縮後データセットの更新前の圧縮後データセットを格納したサブブロックである。すなわち、ステップ2408の判定は、ライトデータセットが、単独領域70内のデータセットの更新後のデータセットであるか、共通領域80内のデータセットの更新後のデータセットであるかの判定である。
ステップ2408の判定結果が真の場合(ステップ2408:YES)、データ量削減プログラム414は、旧サブブロックに対応した割当フラグ1303の情報を“未割当”に更新する(ステップ2409)。
図25は、リード処理の流れの例を示す図である。リード処理は、論理ボリューム501に対するリード要求を受け付けた場合に行われる。
リードプログラム411は、有効領域管理テーブル424を基に、リード要求に従うリード元が有効領域に属するか否かを判定し(ステップ2501)、ステップ2501の判定結果が真の場合(ステップ2501:YES)、世代管理テーブル432を参照する(ステップ2502)。
リードプログラム411は、リード元の提供ボリューム501Pの番号とVOL#3401の情報とが一致するエントリを参照し、親世代VOL#3402の情報が設定されているか否かを判定する(ステップ2503)。
ステップ2503の判定結果が真の場合(ステップ2503:YES)、リード元の論理ボリューム501の複製元が存在する事を意味し、必ずしも論理ボリューム501に実データが存在するわけではないので、リードプログラム411は、実データ位置管理ビットマップ433においてリード先ブロックに対応した情報をVOL内アドレス3501に持つエントリを参照する(ステップ2504)。
リードプログラム411は、世代VOL#毎の使用中フラグ3502の中から、リード先ボリュームに対応した世代VOL#の使用中フラグ、及びステップ2502で参照した親世代VOL#3402に対応した世代VOL#の使用中フラグの2つの使用中フラグを参照し、実データが存在するか(実データの位置を特定できるか)否かを判定する(ステップ2505)。
判定で参照した2つの使用中フラグのいずれか、又はいずれもが(“有”)である場合は、実データが存在するボリューム(位置)を特定できた事を意味する(ステップ2505:YES)。判定で参照した2つの使用中フラグがいずれも(“有”)である場合、リード先ボリュームに対応した世代VOL#のボリュームに実データが存在することになる。
判定で参照した2つの使用中フラグがいずれも(“無”)である場合、実データが存在するボリュームを特定できなかった事を意味する(ステップ2505:NO)。ステップ2505の判定結果が偽の場合(ステップ2505:NO)、リードプログラム411はステップ2502へ戻る。
そして、リードプログラム411は、世代管理テーブル432の親世代ボリュームに対応したVOL#3401のエントリを参照し(ステップ2502)、以降、実データが存在するボリュームを特定できるまで、ステップ2502からステップ2505の処理を繰り返す。
ステップ2503の判定結果が偽の場合(ステップ2503:NO)、リード元の論理ボリューム501には複製が存在しないことを意味し、リードプログラム411は、ステップ2506へ進む。
ステップ2503の判定結果が偽(ステップ2503:NO)、又はステップ2505の判定結果が真(ステップ2505:YES)の場合、実データが存在するボリュームを特定できている為、リードプログラム411は、特定したボリュームに対応したアドレス変換テーブル422を参照する(ステップ2506)。
リードプログラム411は、特定したボリュームを構成する各ブロックを、アドレス変換テーブル422に基づいて特定し、特定した各ブロックについて、以下の処理を行う。
・リードプログラム411は、特定したブロックに対応した参照先VOL種別905の情報が“単独”であるか否かを判定する(ステップ2507)。
・ステップ2507の判定結果が偽の場合(ステップ2507:NO)、特定したブロックに対応した参照先VOL#902及び参照先VOL内アドレス903の情報を基に、共通ボリューム501Cに対応したアドレス変換テーブル422を参照する(ステップ2508)。
・ステップ2507の判定結果が真の場合(ステップ2507:YES)、又はステップ2508の後、リードプログラム411は、特定したブロックに対応したページ51を、ページ変換テーブル425を基に特定し(ステップ2509)、特定したページ51から、特定したブロックに対応する圧縮後データセットを読み出し、圧縮後データセットを伸張し、伸張後データセットをキャッシュメモリ402に格納する(ステップ2510)。
ステップ2501の判定結果が真の場合(ステップ2501:YES)において、リード元のボリュームを構成する各ブロックについてステップ2510までの処理が終了すると、リード要求に従うデータがキャッシュメモリ402に格納されるため、リードプログラム411は、格納されたデータをリード要求の発行元に転送する(ステップ2511)。
ステップ2501の判定結果が偽の場合(ステップ2501:NO)、リードプログラム411は、リード元のボリュームに割り当てられているページ51を、ページ変換テーブル425を基に特定し(ステップ2509)、特定したページ51から、リード対象のデータを読み出し(ステップ2510)、読み出したデータをリード要求に送信元に転送する(ステップ2511)。
図36は、提供ボリューム複製処理の流れの例を示す図である。図36の処理は、特に、処理前は複製先のボリュームが存在せず、複製元及び複製先のボリュームは有効領域に属する場合の例である。この提供ボリューム複製処理は、例えば、いずれかの提供ボリューム501Pを指定したボリューム複製要求を受け付けた場合に行われる。
ボリューム複製制御プログラム418は、複製先の提供ボリューム501Sを作成し(ステップ3601)、具体的には、VOL管理テーブル421のVOL#801に複製先の提供ボリューム501Sの番号、VOL属性802に“提供”、VOL容量803、及びプール#804に情報をそれぞれ設定する。
ボリューム複製制御プログラム418は、複製先の提供ボリューム501Sに対応する追記ボリューム502Sを作成し(ステップ3602)、具体的には、VOL管理テーブル421のVOL#801に複製先の追記ボリューム502Sの番号、VOL属性802に“追記”、VOL容量803、及びプール#804に情報をそれぞれ設定する。
ボリューム複製制御プログラム418は、複製元の最新世代の提供ボリューム501Paを作成し(ステップ3603)、具体的には、VOL管理テーブル421のVOL#801に複製元の最新世代の提供ボリューム501Paの番号、VOL属性802に“提供”、VOL容量803、及びプール#804に情報をそれぞれ設定する。
ボリューム複製制御プログラム418は、複製元の最新世代の提供ボリューム501Paに対応する追記ボリューム502Paを作成し(ステップ3604)、具体的には、VOL管理テーブル421のVOL#801に複製元の最新世代の追記ボリューム502Sの番号、VOL属性802に“追記”、VOL容量803、及びプール#804に情報をそれぞれ設定する。
ボリューム複製制御プログラム418は、複製元の提供ボリューム501Pを重複単独ボリュームに更新し(ステップ3605)、具体的には、VOL管理テーブル421の複製元の提供ボリューム501Pに対応するエントリのVOL属性802を“重複単独”に更新する。
ボリューム複製制御プログラム418は、世代管理テーブル432を更新し(ステップ3606)、具体的には、複製元の提供ボリューム501Pに対応するエントリの子世代VOL#3403に複製元の最新世代の提供ボリューム501Pa及び複製先の提供ボリューム501Sの番号を設定する。
また、複製元の最新世代の提供ボリューム501Paの親世代VOL#3402、及び複製先の提供ボリューム501Sの親世代VOL#3402に、複製元の提供ボリューム501Pの番号を設定する。
ボリューム複製制御プログラム418は、複製元の提供ボリュームを含む複製ボリュームグループに対応した実データ位置管理ビットマップ433が存在するかを判定する(ステップ3607)。
ステップ3607の判定結果が偽の場合(ステップ3607:NO)、実データ位置管理ビットマップ433が存在しないため、ボリューム複製制御プログラム418は、実データ位置管理ビットマップ433を作成する(ステップ3608)。
実データ位置管理ビットマップ433の作成において、ボリューム複製制御プログラム418は、複製元の提供ボリューム501Pに対応するVOL#を最古の世代とし、世代VOL#毎の使用中フラグ3502のうちの最古の世代の1以上のフラグを(“有”)に更新し、その他の世代の1以上のフラグを(“無”)に更新する。
図37は、提供ボリューム複製処理の流れの例を示す図であり、図37の処理は、特に、複製先のボリュームが存在し、複製元及び複製先のボリュームは有効領域に属する場合の例である。この提供ボリューム複製処理は、例えば、いずれかの提供ボリューム501Pを複製元に、いずれかの提供ボリューム501Sを複製先に指定したボリューム複製要求を受け付けた場合に行われる。
ボリューム複製制御プログラム418は、複製元の提供ボリューム501Pの複製として複製ボリュームを作成する(ステップ3701)。複製元の提供ボリューム501Pの複製ボリュームは、図36で示した処理で作成される。
ボリューム複製制御プログラム418は、世代管理テーブル432を更新し(ステップ3702)、具体的には、ステップ3701で作成した複製ボリュームと複製先の提供ボリューム501Sをスワップする為、複製ボリュームに対応するエントリの親世代VOL#3402と、複製先の提供ボリューム501Sに対応するエントリの親世代VOL#3402の情報を入れ替える。
ボリューム複製制御プログラム418は、複製ボリュームの番号と複製先の提供ボリューム501Sの番号をスワップし(ステップ3703)、具体的には、VOL管理テーブル421の複製ボリュームに対応したVOL#801と複製先の提供ボリューム501Sに対応したVOL#801の情報を入れ替える。
図26は、提供ボリューム削除処理の流れの例を示す図である。この提供ボリューム削除処理は、例えば、いずれかの提供ボリューム501Pを指定したボリューム削除要求を受け付けた場合に行われる。
VOL管理プログラム415は、削除対象の提供ボリューム501Pが有効領域に属するか否かを、有効領域管理テーブル424を基に判定する(ステップ2601)。
ステップ2601の判定結果が真の領域について(ステップ2601:YES)、VOL管理プログラム415は、削除対象の提供ボリューム501Pに対応した各種テーブル(具体的には、アドレス変換テーブル422、有効領域管理テーブル424、及びページ変換テーブル425)を削除する(ステップ2602)。
また、VOL管理プログラム415は、削除対象の提供ボリューム501Pに対応したサブブロック管理テーブル427も削除する(ステップ2603)。
VOL管理プログラム415は、世代管理テーブル432を更新し(ステップ2604)、具体的には、削除対象の提供ボリューム501Pに対応するボリュームの親世代VOL#3402の番号を参照し、参照した番号と一致する番号をVOL#3401に持つエントリの子世代VOL#をクリアする。また、削除対象の提供ボリューム501Pのエントリを削除する。
VOL管理プログラム415は、実データ位置管理ビットマップ433を更新し(ステップ2605)、具体的には、世代VOL#毎の使用中フラグ3502において削除対象の提供ボリューム501Pに対応する列の使用中フラグを(“無“)に更新する。
ステップ2601の判定結果が偽の領域について(ステップ2601:NO)、及びステップ2605の後、VOL管理プログラム415は、削除対象の提供ボリューム501Pに割り当てられているページを未割当へと解放する(ステップ2606)。
ここで、「削除対象の提供ボリューム501Pに割り当てられているページ」とは、削除対象の提供ボリューム501Pに直接的に割り当てられている1以上のページ51と、削除対象の提供ボリューム501Pに間接的に割り当てられている1以上のページ51(削除対象の提供ボリューム501Pに対応した追記ボリューム502に割り当てられている1以上のページ51)である。
VOL管理プログラム415は、VOL管理テーブル421を更新し(ステップ2607)、具体的には、VOL管理テーブル421の削除対象の提供ボリューム501Pに対応するエントリを削除する。
以上のように、提供ボリュームが削除対象とされた場合、提供ボリュームに直接的又は間接的に割り当てられている1以上のページを、1以上のページの各々について、ページがいずれか他の領域から参照されているか否かをチェックすること無しに、且つ、提供ボリュームにおけるいずれかの領域が共通領域80を参照しているか否かをチェックすること無しに、解放することができる。
また、VOL管理プログラム415によりボリューム削除が実行された場合、削除されるボリュームはVOL属性が“提供”のボリューム、及びVOL属性が“提供”に対応する追記ボリューム(VOL属性が“追記”のボリューム)だけであり、本実施形態ではサーバシステム201に提供されていない重複単独ボリューム(VOL属性が“重複単独”のボリューム)が削除されることはない。
図27は、ガベージコレクション処理の流れの例を示す図である。図27のガベージコレクション処理は、追記ページを回収する処理であり、例えば、定期的に開始されてもよいし、プール503の容量に対して未割当のページ51の容量の比率が所定値未満になったことが、プール容量管理プログラム416により検出されたなどの場合に開始されてよい。
プール容量管理プログラム416は、ガベージコレクション処理においてコピー元とするページ51(コピー元ページ)を選択する(ステップ2701)。プール容量管理プログラム416は、コピー元ページが割り当てられている追記ボリューム502に対応したサブブロック管理テーブル427を参照し、ガベージコレクション処理において未チェックのサブブロック602があるか否かを判定する(ステップ2702)。
ステップ2702の判定結果が真の場合(ステップ2702:YES)、プール容量管理プログラム416は、ステップ2703へ進み、未チェックのサブブロック602のうちの1つのサブブロック602を選択する(ステップ2703)。
プール容量管理プログラム416は、ステップ2703で選択したサブブロック602の割当フラグ1303が“割当済”であれば(ステップ2704:YES)、コピー先のページ51におけるサブブロック602を割り当て(ステップ2705)、ステップ2703で選択したサブブロック602から、ステップ2705で割り当てたサブブロックに圧縮後データセットをコピーする(ステップ2706)。
ステップ2706により、コピー元のサブブロック602の参照元は、コピー元のサブブロック602に代えてコピー先のサブブロック602を参照先とすることになる。そして、プール容量管理プログラム416は、ステップ2706の後、ステップ2702に戻る。
ステップ2702の判定結果が偽の場合(ステップ2702:NO)、言い換えれば、コピー元ページ内の有効な圧縮後データセットが全てコピー先のページ51にコピーされた場合、プール容量管理プログラム416は、コピー元ページを回収する、すなわち、コピー元ページの割当フラグ1202の情報を“未割当”に変更する(ステップ2707)。
以上のように、追記ページのガベージコレクション処理では、ステップ2706において参照先が更新されることになるが、追記ページが単独ページであれば、コピーされるデータセットは、常に、単独データセットの圧縮後データセットである。故に、コピー元のサブブロック602の参照元は常に1つである。
このため、コピー元のサブブロック602それぞれについて、参照先の更新は、1つの参照元についてのみ行えばよい。従って、追記単独ページのガベージコレクション処理が効率化される。
また、追記ページが複製ボリュームから間接的に参照される重複単独ページであっても、コピーされるデータセットは、共通データセットの圧縮後データセットであるものの、コピー元のサブブロック602の参照元は常に1つである。
このため、コピー元のサブブロック602それぞれについて、参照先の更新は、1つの参照元についてのみ行えばよい。従って、追記重複単独ページのガベージコレクション処理も効率化される。
図28は、共通領域解放処理の流れの例を示す図である。共通領域解放処理は、例えば定期的に行われる。共通領域解放処理において、処理対象の共通ボリューム501Cに対応した共通領域チェックテーブル434が、共通領域解放プログラム417により作成されてもよいし、予め共有メモリ404に用意されていてもよい。
共通領域解放プログラム417は、いずれかの共通ブロック601Cを選択する(ステップ2801)。ステップ2801で選択した共通ブロック601Cを、「対象共通ブロック」と言う。共通領域解放プログラム417は、重複管理テーブル430を参照し、対象共通ブロックを参照する参照元が1つでも存在するか否かを判定する(ステップ2802)。
ステップ2802の判定結果が真の場合(ステップ2802:YES)、共通領域解放プログラム417は、ステップ2803へ進み、重複管理テーブル430から、対象共通ブロックに対応したいずれかの参照元エントリを選択し、選択した参照元エントリから参照元のボリューム番号及び論理アドレスを特定する(ステップ2803)。
共通領域解放プログラム417は、ステップ2803で特定したボリューム番号に対応したアドレス変換テーブル422から、ステップ2803で特定した論理アドレスに対応した参照先VOL#902及び参照先VOL内アドレス903の情報を特定する(ステップ2804)。
ステップ2804で特定した参照先(参照先VOL#902及び参照先VOL内アドレス903の情報により特定されるブロック601)が、対象共通ブロックに一致していれば(ステップ2805:YES)、共通領域解放プログラム417は、対象共通ブロックに対応した参照フラグ1902の情報を(“有”)とする(ステップ2806)。
一方、ステップ2804で特定した参照先が、対象共通ブロックに一致していなければ(ステップ2805:NO)、共通領域解放プログラム417は、ステップ2803で特定した参照元エントリを、対象共通ブロックに対応した参照元エントリから削除する(ステップ2807)。
なお、対象共通ブロックに、同一の提供ボリューム501Pを参照元とする複数の参照元エントリがある場合には、同一の提供ボリューム501Pに対応した複数の参照元エントリがそれぞれ表す複数の論理アドレスについて、まとめて、ステップ2803からステップ2807が行われてよい。
ステップ2802の判定結果が偽の場合(ステップ2802:NO)、対象共通ブロックに対応した1以上の参照元エントリについてステップ2803からステップ2807が行われたか、或いは、対象共通ブロックに1つも参照元エントリが無い。この場合、共通領域解放プログラム417は、対象共通ブロックに対応した参照フラグ1902の情報が(“有”)であるか否かを判定する(ステップ2808)。
ステップ2808の判定結果が偽の場合(ステップ2808:NO)、言い換えれば、対象共通ブロックに対応した参照フラグ1902の情報が(“無”)の場合、対象共通ブロックを参照先とする参照元が1つも存在しないので、共通領域解放プログラム417は、ステップ2809からステップ2810を行う。
すなわち、共通領域解放プログラム417は、ハッシュ管理テーブル429を更新し(ステップ2809)、具体的には、対象共通ブロックに対応した情報をVOL#1603及びVOL内アドレス1604に格納したエントリについて、登録フラグ1602の情報を(“無”)に更新し、VOL#1603及びVOL内アドレス1604の情報を削除する(ステップ2809)。
また、共通領域解放プログラム417は、対象共通ブロックを未使用へと解放し、具体的には、対象共通ブロックに対応した使用中フラグ1802の情報を“未使用”に更新する(ステップ2810)。
ステップ2808の判定結果が真の場合(ステップ2808:YES)、ステップ2809からステップ2810は行われない。これは、対象共通ブロックを参照先とする少なくとも1つの参照元が存在するためである。
以上の共通領域解放処理によれば、参照元が存在しなくなった共通ブロック601Cを検出することができ、検出された共通ブロック601Cを未使用へと解放することができる。以って、共通ボリューム501Cの空き容量(空きブロック数)を増やすことができる。
図38は、重複単独領域解放処理の流れの例を示す図である。重複単独領域解放処理は、例えば定期的に行われる。重複単独領域解放処理は、重複単独ボリューム(提供ボリューム501P)を処理対象とする。処理対象の重複単独ボリュームを「対象重複単独ボリューム」と言う。
重複単独領域解放プログラム419は、いずれかの重複単独ブロック(提供ブロック601P)を選択する(ステップ3801)。ステップ3801で選択した重複単独ブロックを、「対象重複単独ブロック」と言う。
重複単独領域解放プログラム419は、世代管理テーブル432の対象重複単独ボリュームに対応する情報をVOL#3401に持つエントリを参照し(ステップ3802)、参照したエントリの子世代VOL#3403の情報が設定されているか否かを判定する(ステップ3803)。
ステップ3803の判定結果が真の場合(ステップ3803:YES)、重複単独領域解放プログラム419は、実データ位置管理ビットマップ433の、対象重複単独ブロックに対応した情報をVOL内アドレス3501に持つエントリのうち、世代VOL#毎の使用中フラグ3502の情報であって、ステップ3802で参照した子世代VOL#3403の情報に対応する情報を参照する(ステップ3804)。
参照した世代VOL#毎の使用中フラグ3502の情報が使用中(“有”)である場合(ステップ3805:YES)、対象重複単独ブロックは子世代のボリュームから参照されていないので、重複単独領域解放プログラム419は、対象重複単独ブロックが更に新しい世代のボリュームから参照されていないかを調べるため、ステップ3802へ戻る。
ステップ3803の判定結果が偽の場合(ステップ3803:NO)、対象重複単独ボリュームの1以上の子世代のボリュームから、対象重複単独ブロックが参照されていないので、重複単独領域解放プログラム419は、ステップ3806からステップ3808を行う。
すなわち、重複単独領域解放プログラム419は、対象重複単独ブロックを未使用へと解放し、具体的には、アドレス変換テーブル422の対象重複単独ブロックに対応するエントリを削除する(ステップ3806)。
また、重複単独領域解放プログラム419は、サブブロック管理テーブル427の対象重複単独ブロックに対応するエントリの割当フラグ1303の情報を“未割当”に変更する(ステップ3807)。
更に、重複単独領域解放プログラム419は、実データ位置管理ビットマップ433を更新し、具体的には、対象重複単独ブロックに対応するエントリの世代VOL#毎の使用中フラグ3502を(“無”)に更新する(ステップ3808)。
ステップ3805の判定結果が偽の場合(ステップ3605:NO),対象重複単独ブロックは、子世代のボリュームから参照されている為、解放する対象は無い。
以上の共通領域解放処理によれば、参照元が存在しなくなった重複単独ブロックを検出することができ、検出された重複単独ブロックを未使用へと解放することができる。以って、重複単独ボリューム(提供ボリューム501P)の空き容量(空きブロック数)を増やすことができる。
以上、一実施形態を説明したが、これは本発明の1つの例示であって、本発明の範囲をこの実施形態にのみ限定する趣旨ではない。例えば、上述の実施形態では、データの移動を伴わない仮想的なボリューム複製の処理を説明したが、仮想的に複製されたボリュームは、一般的にスナップショットとして利用される場合もある。
スナップショットとはある時点のボリュームの状態を保存するものであるが、特にバックアップ用途でスナップショットを利用する場合は、必ずしも、複製先が提供ボリュームである必要はない。サーバシステム201からスナップショットデータの読み出し又は書き込みを行う時に、提供ボリュームが割当てられればよい。
したがって、スナップショットを取得する時点では、スナップショット取得元である最新世代の提供ボリューム(例えば図33における旧世代の提供ボリューム501P)を重複単独ボリュームとし、この重複単独ボリュームをスナップショットとし、新たに提供ボリューム(例えば図33における最新世代の提供ボリューム501Pa)を作成する(図36のステップ3603からステップ3608)。
また、サーバシステム201からスナップショットデータの読み出し又は書き込みを行う場合には、スナップショットを別の提供ボリューム(例えば図33の複製先の提供ボリューム501S)にアタッチする操作などを行うことで、複製先提供ボリュームからスナップショットデータの読み出し又は書き込みを行うことができる。
また、提供ボリュームにアタッチされていないスナップショット(重複単独ボリューム)を削除する場合は、重複単独ボリュームが、より新しい世代の重複単独ボリュームや、提供ボリュームから参照されているデータを有している可能性がある。
このような可能性として、例えば、図33において、複製先の提供ボリューム501Sが存在しない場合であっても、重複単独ボリュームは最新世代の提供ボリューム501Paから参照されているデータを有している可能性がある。
このため、参照されているデータは参照元のボリューム(図33の例では、最新世代の提供ボリューム501Pa)へ移行してから、重複単独ボリュームを削除する。
また、スナップショットとして利用する場合は、複製元が本番業務を行うボリュームとして利用され、複製先がバックアップとしても利用されることもある。これに対して、バックアップからの復元操作(リストア)や、本番ボリュームからバックアップへの再同期操作(リシンク)などの運用がある。
このような運用も、図37を用いて説明した複製先有りのボリューム複製処理で、実現することが可能である。すなわち、複製元ボリュームの複製を作成し、複製ボリュームと複製先ボリュームをスワップすることにより、データの移動を不要とし、迅速なリストア・リシンク処理を実現できる。
本発明は、他の種々の形態でも実施することが可能である。例えば、ライト要求のようなI/O要求の送信元(I/O元)は、上述の実施形態では、サーバシステム201であるが、ストレージシステム200における図示しないプログラム(例えば、VM上で実行されるアプリケーションプログラム)であってもよい。