以下、本発明の実施形態について、図面を参照して説明する。なお、以下に説明する実施形態は特許請求の範囲に係る発明を限定するものではなく、また実施形態の中で説明されている諸要素及びその組み合わせの全てが発明の解決手段に必須であるとは限らない。
なお、以下の説明では、「aaaテーブル」の表現にて各種情報を説明することがあるが、各種情報は、テーブル以外のデータ構造で表現されていても良い。データ構造に依存しないことを示すために「aaaテーブル」を「aaa情報」と呼ぶこともできる。
また、以下の説明では、「プログラム」を主語として処理を説明する場合があるが、プログラムは、プロセッサ(例えばCPU(Central Processing Unit))によって実行されることで、定められた処理を、適宜に記憶資源(例えばメモリ)及び/又は通信インターフェースデバイス(例えばポート)を用いながら行うため、処理の主語がプログラムとされても良い。プログラムを主語として説明された処理は、プロセッサ或いはそのプロセッサを有する計算機(例えば、管理計算機、ホスト計算機、コントローラ等)が行う処理としても良い。また、コントローラ(ストレージコントローラ)は、プロセッサそれ自体であっても良いし、コントローラが行う処理の一部又は全部を行うハードウェア回路を含んでも良い。プログラムは、プログラムソースから各コントローラにインストールされても良い。プログラムソースは、例えば、プログラム配布サーバ又はコンピュータ読取可能な記憶メディアであっても良い。
また、以下の説明では、同種の要素を区別しないで説明する場合には、参照符号又は参照符号における共通番号を使用し、同種の要素を区別して説明する場合は、その要素の参照符号を使用又は参照符号に代えてその要素に割り振られたIDを使用することがある。
すなわち、本実施形態のストレージシステムでは、RAID幅kを、k≦NとなるN台のドライブ空間に変換するマップ作成方式およびマッピングを適用する論理構造について開示する。マッピング作成に当たり、N+1台からN台への減設において、データの冗長化に必要な必要なデータ領域を確保するための既存データの移動量を低減するマップを作成することで、ドライブ減設時に必要なデータ移動量を低減する。加えて、増減設単位である1台分のドライブ容量でアドレス空間を定義し、ユーザに提供することで、ドライブ1台での増減設を可能とする。また、物理的なドライブ搭載位置を示す識別子と、仮想的なドライブの識別子とを対応付け、その対応付を更新することで、任意の物理位置にあるドライブを減設する際のデータ移動量を低減する。
図1は、本実施例の計算機システム(ストレージシステム)における、仮想記憶領域と物理記憶領域との間のマッピングの概要を示す。
この図の上部は、仮想記憶領域を示し、この図の下部は、物理記憶領域を示す。
本実施例の計算機システムは、仮想ボリュームをホストに提供し、仮想記憶ドライブ(VDEV :Virtual DEVice)102により提供される仮想記憶領域を仮想ボリュームに割り当てる。この図の例においては、40個の仮想記憶ドライブ102が示されており、それぞれにVDEV#(番号)が与えられている。仮想記憶領域は、例えばページである。
さらに、複数の仮想記憶ドライブ102 を含む仮想パリティグループ(VPG:Virtual Parity Group)106が構成される。この図の例においては、4個の仮想記憶ドライブ102が、一つの仮想パリティグループ106を構成する。この図の例においては、10個の仮想パリティグループ106が示されており、それぞれにVPG#(番号)が与えられている。また、各仮想パリティグループ106に属する仮想記憶ドライブ102には、それぞれ仮想パリティグループ内の位置を示すVDEV#が与えられる。この図の例においては、各仮想パリティグループ106内に4個の仮想記憶ドライブ102が示されており、それぞれに異なるVDEV#が与えられている。
仮想パリティグループ106は、RAID(Redundant Array of Inexpensive Disks)グループであり、複数の仮想記憶ドライブ102に跨る冗長データセットを格納する。冗長データセットは、RAIDにおいてデータをリビルドするためのデータセットであり、ホストからのデータと冗長データとを含む。
仮想記憶領域は、所定サイズの仮想ストライプ104に分割されている。仮想パリティグループ106内の複数の仮想記憶ドライブ102のそれぞれの中の特定の論理アドレスの仮想ストライプ104は、仮想ストライプ列105を構成する。この図の例においては、4個の仮想ストライプ104が一つの仮想ストライプ列105を構成する。仮想ストライプ列105は、冗長データセットを格納する。冗長データセットは、ホストからのデータDと、データDに基づくパリティPとを含む。一つの仮想ストライプ列105内の各仮想ストライプ104は、対応する冗長データセット内のデータD又はパリティPを格納する。
なお、データDを、ユーザデータと呼ぶことがある。パリティPを、冗長データと呼ぶことがある。冗長データセット内の各仮想ストライプに格納されるデータを要素データと呼ぶことがある。
一つの仮想記憶ドライブ102において、一つの仮想ストライプ104、又は論理アドレスが連続する所定数の仮想ストライプ104が、一つの仮想パーセル103を構成する。この図の例においては、連続する論理アドレスを有する2個の仮想ストライプ104が、一つの仮想パーセル103を構成する。
さらに、連続する論理アドレスを有する所定数の仮想ストライプ列105は、仮想チャンク(Vchunk:Virtual chunk)101を構成する。仮想チャンク101は、一つの仮想パーセル列である。仮想パーセル列は、一つの仮想パリティグループ106内の複数の仮想記憶ドライブ102のそれぞれの中の特定の論理アドレスの仮想パーセル103で構成される。言い換えれば、一つの仮想チャンク101は連続する論理アドレスを有する1以上の仮想ストライプ列105で構成されている。この図の例においては、一つの仮想チャンク101は、連続する論理アドレスを有する2個の仮想ストライプ列105で構成されている。この図の例においては、20個の仮想チャンク101が示されており、それぞれにVPG106内のVchunk#が与えられている。仮想パーセル103が一つの仮想ストライプ104で構成される場合、仮想チャンク101は一つの仮想ストライプ列105で構成される。
この図の例においては、各仮想パーセル103内に記された数字のペアは、VPG#とVchunk#で表されるVchunk識別子である。例えば、Vchunk識別子が"0-1"である仮想パーセル103は、VPG#=0、Vchunk#=1に属することを示す。
仮想記憶領域は、物理記憶ドライブ(PDEV:Physical DEVice)107 が提供する物理記憶領域にマッピングされている。この図の例においては、10個の物理記憶ドライブ107が示されており、それぞれに仮想的な管理番号であるPDEV#が与えられている。複数の物理記憶ドライブ107を含む分散Parityグループ(DPG:Distributed Parity Group)110が構成される。この図の例においては、5個の物理記憶ドライブ107が、一つの分散Parityグループ110を構成する。この図の例においては、2個の分散Parityグループ110が示されており、それぞれにDPG#が与えられている。仮想記憶領域と物理記憶領域の間のマッピングをパーセルマッピングと呼ぶことがある。また、各分散Parityグループ110に属するドライブには、それぞれ分散Parityグループ内の位置を示すPDEV(Physical DEVice)#が与えられる。この図の例においては、各分散Parityグループ110内に5個の物理記憶ドライブ107が示されており、それぞれに異なるPDEV#が与えられている。
PDEV#は、ドライブエンクロージャ111内の物理記憶ドライブ112の物理的な搭載位置を示す識別子であるDrive#と1対1で対応する。この図例においては、10個の物理記憶ドライブ112と、10箇所の搭載位置#0~#9が示されており、両者の対応付を示すマッピングをドライブマッピングと呼ぶ。
仮想チャンク101内の各仮想パーセル103は、物理記憶領域における物理パーセル109にマッピングされる。各物理パーセル109内の数字は、対応する仮想パーセル103が属するVchunk識別子(VPG#とVchunk#)を示す。この図の例においては、それぞれのPDEVに対し5個の物理パーセル109が示されており、それぞれにParcel#が与えられている。各物理パーセル109は、Parcel#、PDEV#とDPG#で同定される。物理的なドライブの搭載位置はさらに、ドライブマッピングテーブルを用いてPDEV#とDrive#を変換することにより、同定される。
この図の例においては、仮想チャンク101内の複数の仮想パーセル103は、障害回復のため、それぞれ異なる複数の物理記憶ドライブ107にマッピングされる。言い換えれば、仮想ストライプ列105内の複数の仮想ストライプ104も、それぞれ異なる複数の物理記憶ドライブ107にマッピングされる。これにより、冗長データセットは、分散Parityグループ内の物理記憶ドライブ数の要素データ(データD又はパリティP)を含み、それらは、分散Parityグループ内の物理記憶ドライブ数の物理記憶ドライブ107にそれぞれ書き込まれる。
パーセルマッピングは、マッピング条件を満たす。マッピング条件は、各仮想チャンク101が複数の物理記憶ドライブ107にマッピングされることである。言い換えれば、マッピング条件は、一つの物理記憶ドライブ107内の複数の物理パーセル109が同一の仮想チャンク101にマッピングされないことである。
以下、実施例に係る計算機システムを説明する。
図2は、本実施例に係る計算機システムのハードウェア構成を示す。
計算機システム201は、1以上のホスト計算機(以下、ホストという)204と、管理サーバ203と、ストレージコントローラ202と、ドライブエンクロージャ111とを含む。ホスト204と、管理サーバ203と、ストレージコントローラ202とは、ネットワーク220を介して接続されている。ドライブエンクロージャ111は、ストレージコントローラ202と接続されている。ネットワーク220は、ローカルエリアネットワーク(LAN:Local Area Network)であっても良く、ワイドエリアネットワーク(WAN:Wide Area Network)であってもよい。ホスト204とストレージコントローラ202が一つの計算機であってもよい。また、ホスト204とストレージコントローラ202のそれぞれが仮想マシンであってもよい。
ホスト204は、例えば、アプリケーションを実行する計算機であり、アプリケーションにより利用されるデータをストレージコントローラ202から読み出し、アプリケーションにより作成されたデータをストレージコントローラ202へ書き込む。
管理サーバ203は、管理者により使用される計算機である。管理サーバ203は、情報を入力するための入力デバイスと、情報を表示するための出力デバイスとを含んでもよい。管理サーバ203は、入力デバイスに対する管理者の操作により、データの復元のためのデータ復元処理の種類の設定を受け付け、ストレージコントローラ202に受け付けたデータ復元処理を実行させるように設定する。
ストレージシステムは、例えば、ストレージコントローラ202、及びドライブエンクロージャ111を含む。ドライブエンクロージャ111には、物理記憶ドライブ107(単にドライブとも呼ぶ)が複数含まれている。物理記憶ドライブ107は、例えば、磁気ディスク、フラッシュメモリ、その他の不揮発性半導体メモリ(PRAM、ReRAM等) 物理記憶ドライブである。本構成に対して、外部ストレージ装置205が接続されることもある。外部ストレージ装置205は、例えば、上記ストレージシステムとは別のストレージシステムであって、ストレージコントローラ202は、外部ストレージ装置205内のシステムコントローラを経由して、外部ストレージ装置205内の物理記憶ドライブ上へのデータ読み出し・書き込みを行う。
ストレージコントローラ202は、1以上のフロントエンドパッケージ(FEPK:FrontEnd PacKage)206と、保守インタフェース(保守I/F)208と、1以上のマイクロプロセッサパッケージ(MPPK)215と、1以上のキャッシュメモリパッケージ(CMPK:CM PacKage)213と、1以上のバックエンドパッケージ(BEPK:BackEnd PacKage)209と、内部ネットワーク221とを有する。
FEPK206、保守I/F208、MPPK215、CMPK213、及びBEPK209は、内部ネットワーク221を介して接続されている。BEPK209は、複数系統のパスを介してドライブエンクロージャ111と接続されている。
FEPK206は、ホスト204とのインタフェースの一例であり、1以上のポート207を有する。ポート207は、ストレージコントローラ202を、ネットワーク220等を介して種々の装置と接続する。保守I/F208は、ストレージコントローラ202を、管理サーバ203と接続するためのインタフェースである。
MPPK215は制御部であって、1以上のマイクロプロセッサ(MP:Micro Processer)216と、ローカルメモリ(LM:Local Memory)217とを有する。MP216は、LM217に格納されたプログラムを実行して各種処理を実行する。MP216は、BEPK209を介して、各種コマンド(例えばSCSIにおけるREADコマンドやWRITEコマンドなど)をドライブエンクロージャ111内の物理記憶ドライブ107に送信する。LM217は、各種プログラムや、各種情報を記憶する。
CMPK213は、1以上のキャッシュメモリ(CM)214を有する。CM214は、ホスト204から物理記憶ドライブ107に書き込むデータ(ライトデータ)や、物理記憶ドライブ107から読み出したデータ(リードデータ)を一時的に格納する。
BEPK209は、ドライブエンクロージャ111とのインタフェースの一例であり、1以上のポート207を有する。BEPK209は、パリティ演算機210、転送バッファ(DXBF)211、BEコントローラ212で構成される。ドライブエンクロージャ111へのデータ書き込み時に、パリティ演算機210を用いてデータの冗長化を行い、BEコントローラ212によってドライブエンクロージャ111へデータを転送する。ドライブエンクロージャ111からのデータ読み出し時に、冗長化データからのデータ復元が必要な場合に、パリティ演算機210を用いてデータを復元する。転送バッファ(DXBF)211には、上記のデータ処理中にデータを一時的に格納する。
ドライブエンクロージャ111は、複数の物理記憶ドライブ107を有する。物理記憶ドライブ107は、1以上の記憶媒体を含む。記憶媒体は、例えば、磁気ディスク、フラッシュメモリ、その他の不揮発性半導体メモリ(PRAM、ReRAM等)である。1つ以上の物理記憶ドライブ107は、スイッチ218を介してBEコントローラ212と接続されている。同一のBEコントローラに接続された物理記憶ドライブ107郡をパスグループ219と呼ぶ。
ストレージコントローラ202は、複数の物理記憶ドライブ107の記憶領域で構成される容量プール(以下、単にプールという)を管理する。ストレージコントローラ202は、プール内の記憶領域を用いてRAIDグループを構成する。すなわち、ストレージコントローラ202は、複数の物理記憶ドライブ107を用いて、複数の仮想パリティグループ(VPG)を構成する。VPGは、仮想的なRAIDグループである。
VPGの記憶領域は、複数のサブ記憶領域列で構成されている。各サブ記憶領域列は、複数のサブ記憶領域で構成されている。複数のサブ記憶領域は、VPGを構成する複数の物理記憶ドライブ107に跨っており、複数の物理記憶ドライブ107にそれぞれ対応している。ここで、一つのサブ記憶領域を、「ストライプ」と呼び、サブ記憶領域列を、「ストライプ列」と呼ぶ。複数のストライプ列によって、RAIDグループの記憶領域が構成されている。
RAIDには、いくつかのレベル(以下、「RAIDレベル」という)がある。例えば、RAID5では、RAID5に対応したホストコンピュータから指定されたライト対象のデータは、所定サイズのデータ(以下、便宜上「データ単位」という)に分割される。各データ単位は、複数のデータ要素に分割される。複数のデータ要素は、同一のストレイプ列内の複数のストライプにそれぞれ書き込まれる。
RAID5では、物理記憶ドライブ107に障害が発生したことにより、その物理記憶ドライブ107から読み出せなくなったデータ要素をリビルドするために、各データ単位に対して、"パリティ"と呼ばれる冗長な情報(以下、「冗長コード」)が生成される。冗長コードも、複数のデータ要素と同一のストライプ列内のストライプに書き込まれる。
例えば、RAIDグループを構成する物理記憶ドライブ107の数が4である場合、そのうちの3個の物理記憶ドライブ107に対応する3個のストライプに、データ単位を構成する3個のデータ要素が書き込まれ、残りの一つの物理記憶ドライブ107に対応するストライプに、冗長コードが書き込まれる。以下、データ要素と冗長コードとを区別しない場合には、両者をそれぞれストライプデータ要素ということもある。
RAID6では、各データ単位に対して、2種類の冗長コード(Pパリティ、Qパリティという)が生成されて、それぞれの冗長コードが同一のストライプ列内のストライプに書き込まれる。これにより、データ単位を構成する複数のデータ要素のうちの2個のデータ要素を読み出すことができない場合に、これら2個のデータ要素を復元することができる。
上記に説明した以外にもRAIDレベルは存在する(例えばRAID1~4)。データの冗長化技術として、3重ミラー(Triplication)や、パリティを3個用いたトリプルパリティ技術等もある。冗長コードの生成技術についても、ガロア演算を用いたReed-solomon符号や、EVEN-ODD等さまざまな技術が存在する。以下においては、主にRAID5又は6について説明するが、冗長化技術を上述した方法に置き換え可能である。
ストレージコントローラ202は、物理記憶ドライブ107のうちいずれかの物理記憶ドライブ107が故障した場合に、故障した物理記憶ドライブ107に格納されているデータ要素を復元する。
MPPK215内のMP216は、故障した物理記憶ドライブ107に格納されていたデータ要素を復元するために必要なストライプデータ要素(例えば、他のデータ要素及びパリティ)を、当該データを格納している複数の物理記憶ドライブ107から取得する。MP216は、インタフェースデバイス(例えば、BEPK209)を介して、取得したストライプデータ要素をキャッシュメモリ(CM:Cache Memory)214に格納する。その後、キャッシュメモリ214のストライプデータ要素に基づいてデータ要素を復元し、当該データ要素を所定の物理記憶ドライブ107に格納する。
例えば、RAID5で構成されたRAIDグループのデータ単位に対して、MP216は、データ単位を構成する複数のデータ要素の排他的論理和(XOR)をとることによってPパリティを生成する。RAID6で構成されたRAIDグループのデータ単位に対して、MP216は、更に、データ単位を構成する複数のデータ要素に所定の係数を掛けた後、それぞれのデータの排他的論理和をとることによって、Qパリティを生成する。
以下、MP216の動作をストレージコントローラ202の動作として説明することがある。
図3は、本実施例に係る計算機システムの論理構成を示す。
ストレージコントローラ202は、複数、たとえば、5個のドライブ107を束ねて、分散Parityグループ(DPG)110を構成する。ストレージコントローラ202は、1以上の分散Parityグループ110とそれに対応する1以上の仮想パリティグループ(VPG)106を構成する。 ストレージコントローラ202は、DPG110の一部記憶領域を、VPG106へ割り当てる。
プール301内には複数の仮想ボリューム(VVOL:Virtual VOLume)302が存在する。VVOL302は、仮想的な記憶デバイスであり、ホスト204から参照されることができる。ストレージコントローラ202の管理者からの指示に応じて、管理サーバ203は、保守I/F208を介して、ストレージコントローラ202に任意のサイズのVVOL302を作成させる。サイズは、実際のドライブ107の合計容量に依存しない。ストレージコントローラ202は、ホスト204からのI/O要求(ホストI/O)により示されたVVOL302内の記憶領域(VVOLページ303)に対して、VPG内の記憶領域(VPGページ304)を動的に割り当てる。
図4は、物理記憶ドライブのデータ構成を示す。
物理記憶ドライブ107は、ストレージコントローラ202等の上位の装置との間で、SCSIコマンド処理の最小単位(例えば、512Byte)であるサブブロック402を単位として、データの受け渡しを行う。スロット401は、キャッシュメモリ214上でのデータをキャッシュする際の管理単位であり、例えば、256KBである。スロット401は、連続する複数のサブブロック402の集合で構成される。物理ストライプ403は、複数(例えば、2個)のスロット401を格納する。
図5は、仮想ボリュームのページマッピングを示す。
ホスト204により認識可能なVVOL302は、複数のVVOLページ303で構成される。VVOL302は、ユニークな識別子(VVOL番号)を持つ。ストレージコントローラ202は、VVOLページ303に、VPG106内のVPGページ304を割り当てる。この関係をページマッピング501と呼ぶ。ページマッピング501は、ストレージコントローラ202により動的に管理される。連続するVVOLページ#を持つ複数のVVOLページには、連続するVVOL空間のアドレスが与えられる。
VPG106は、1以上の仮想チャンク(Vchunk)101を含む。Vchunk101は、複数の仮想パーセル103で構成される。この図の例では、Vchunk101は、8個の仮想パーセル103で構成されている。
仮想パーセル103は、一つの仮想記憶ドライブ102内の連続した領域で構成されている。仮想パーセル103は、1又は複数の仮想ストライプ104で構成されている。この図の例において、仮想パーセル103は、8個の仮想ストライプ104で構成されている。仮想パーセル103における仮想ストライプ104の数は特に限定されない。仮想パーセル103が複数の仮想ストライプ104を含むことで、処理の効率化が実現される。
この図の例において、VPG106は、RAID6の6D+2P構成である、すなわち、データ単位を構成する6つのデータ要素(D)と、これらデータ要素に対応する2つのパリティ(P、Q)とをそれぞれ異なる物理記憶ドライブ107に格納する。この場合、Vchunk101は、例えば、8個の異なる物理記憶ドライブ107の仮想パーセル103で構成される。
言い換えれば、Vchunk101は、複数の仮想ストライプ列105で構成されており、この図の例においては、8個の仮想ストライプ列105で構成されている。Vchunk101が複数の仮想ストライプ列105を含むことで、処理の効率化が実現される。なお、Vchunk101は、一つの仮想ストライプ列105で構成されてもよい。
Vchunk101は、複数(例えば、4個)のVPGページ304を含む。VPGページ304は、複数(例えば、2個)の連続する仮想ストライプ列105のストライプデータ要素を格納することができる。例えば、この複数のデータ単位を数MBとすることで、ドライブ107が磁気ディスクなどである場合でも、ホストI/Oのシーケンシャル性能を一定に保つことができる。
この図においては、1_D1、1_D2、1_D3、1_D4、1_D5、1_D6、1_P、1_Qのように、「_」の前の数字が共通するものが、同一の仮想ストライプ列105のストライプデータ要素を示す。なお、各ストライプデータ要素のサイズは、物理ストライプ403のサイズである。
VPG106は上位ストレージシステムにおいて、ユニークな識別子(VPG番号)を持つ。また、各VPG106内のK個の仮想記憶ドライブ102のそれぞれには、ドライブ番号(VDEV番号)が与えられている。これは、VPG106内の記憶領域のアドレッシングのための識別子で、後述するDPG110内のドライブ(PDEV)との対応関係を表すための識別子である。KをVPGドライブ数と呼ぶことがある。
各VVOL302は、ホスト204から、VVOL302を表す識別子とLBAとを用いてアクセスされる。この図に示すように、VVOLページ303には、VVOL302の先頭からVVOLPage#が与えられる。ホストI/Oにより指定されたLBAに対して、以下の式によりVVOLPage#を算出することが出来る。ここで、Floor(x)は、実数xに対してx以下の最大の整数を示す記号である。LBA及びVVOLPagesizeのそれぞれは、サブブロック数で表されてもよい。
VVOLPage#=Floor(LBA/VVOLPagesize)
また、VVOLページ303及びVPGページ304のそれぞれは、複数の仮想ストライプで構成されている。ただし、ホスト204にパリティのデータをアクセスさせないため、VVOL302上ではパリティが見えない。例えば、この図で示している6D+2Pの場合、VPG106の空間において8×2個の仮想ストライプを含むVPGページ304は、VVOL302の空間において6×2個の仮想ストライプを含むVVOLページ303として見える。
ストレージコントローラ202は、VPG106の空間とVVOL302の空間を補正することにより、ページマッピング501と合わせて、VVOL302側のLBAに対応するVPG#でのVDEV#とVchunk#、及び仮想パーセル103内のオフセットアドレスを算出することが出来る。もちろん、ストレージコントローラ202は、ホストI/Oに対応したパリティ領域のVPG#でのVDEV#とVchunk#、及び仮想パーセル103内のオフセットアドレスも算出可能である。
この図は、RAID6(6D+2P)を用いるケースを示すが、例えば14D+2Pなど、D数を増やしてもよいし、RAID5やRAID1を用いてもよい。また、RAID4のようにパリティのみの仮想パーセルを作成してもよい。通常のRAID4 の場合、上位層の論理設計を簡略化できるというメリットがある一方、Write時にパリティドライブにアクセスが集中するため、パリティドライブがボトルネック化しやすいというデメリットがあるが、分散RAID構成の場合、VPG106上のパリティドライブ内のデータは、DPG110上では複数の物理記憶ドライブ107に分散されているため、当該デメリットの影響を最小化することができる。また、RAID6におけるQパリティのエンコーディングはガロア演算以外でも、EVEN-ODD法など他の一般的に知られた方法を使ってもよい。
図6は、VPGとDPGの間のパーセルマッピングを示す。
Vchunk101は、前述のとおり、VPG106の記憶領域の空間において連続的である。連続するc個のVchunk101は、Vchunk周期601を構成する。DPG110を構成するN台の物理記憶ドライブ107において、各ドライブ107の中で連続するm個のParcel109、合計N×m個のParcelは、Parcelサイクル603を構成する。cを周期Vchunk数と呼ぶ。mを周期Parcel数と呼ぶ。共通のDPG110から構成される1つ以上のVPGについて、共通のVchunk周期#を持つVchunk周期の集合を、Vchunk周期グループ602と呼ぶ。
一つのVchunk周期グループ602は、一つのParcelサイクル603に対応する。また、パーセルマッピング604は周期的である。すなわち、Vchunk周期グループ602とParcelサイクル603の各ペアにおいてパーセルマッピング604は共通である。仮想記憶領域と物理記憶領域との間のパーセルマッピング604が周期的であることで、データを複数の物理記憶領域へ適切に分散できると共に、パーセルマッピング604の効率的な管理が実現される。なお、非周期的、即ち1周期のみのパーセルマッピングが採用されてもよい。
各Vchunk周期601内のVchunk101の識別子をCycle Vchunk#(CVC#)で表す。したがって、CVC#は、0からc-1までの値を取る。Parcelサイクル603内のParcel108の識別子を、Local ParCel#(LPC#)で表す。LPC#は、0からm-1までの値を取る。一つのVchunk101内の複数の仮想パーセルのデータ実体には、複数の物理パーセル109が割り当てられる。
また、Vchunk周期グループ602内のVchunk101の識別子をLocal Vchunk#(LVC#)で表す。LVC#は、VPG#nと、CVC#から一意に求められる。
LVC#=n×C+CVC#
で求められる。
図7は、VPG106とDPG110のパーセルマッピング604について、c=2、m=8、K=4、N=5の例について示す。cはVchunk周期601内の Vchunk数、mはParcelサイクル603内のドライブ内Parcel数、KはVPG106内のドライブ数、NはDPG110内のドライブ数である。
このように、パーセルマッピングを、Vchunk周期601及びParcelサイクル603の組み合わせ毎に、繰り返し配置することで、マッピングパターンの規模を減少させると共にマッピングパターンの生成の負荷やアドレス変換の負荷を抑えることができる。
VPG106内の仮想記憶ドライブ102内の仮想パーセル103に記されているVchunk識別子"x-y-z"のうち、xは、VPG#を表し、yはVchunk周期#を表し、ZはCVC#を表している。その仮想パーセル103に割り当てられた物理パーセルには、同じVchunk識別子が記している。パーセルマッピングにおいて、一つのVchunk周期601内の複数の仮想パーセル103と、一つのParcelサイクル603内の複数の物理パーセルとの間の対応関係を、マッピングパターンと呼ぶ。例えば、マッピングパターンは一つのParcelサイクル603内の各物理パーセルに対応するVchunk識別子とVDEV#を用いて表される。各Parcelサイクル603のマッピングパターンは、共通である。
本例においては、2個のVchunk周期601と、2個のParcelサイクル603とを示す。各Parcelサイクル603は、5個のドライブ107に亘る。一つのParcelサイクル603の全ての物理パーセルは、一つのVchunk周期グループ内の仮想パーセルに割り当てられる。
ここではm=8としているが、ドライブ107の台数がKの整数倍でない任意のケースにおいて、VPG-DPG間のマッピングを適切に設定するために、mはKの整数倍であればよい。
図8は、共有メモリの内容を示す。
共有メモリ801は、例えば、物理記憶ドライブ107、CM214、及びLM217の少なくともいずれか1個の記憶領域を用いて構成される。なお、ストレージコントローラ202は、物理記憶ドライブ107、CM214、及びLM217の内の複数の構成の記憶領域を用いて論理的な共有メモリ801を構成し、各種情報についてキャッシュ管理を行うようにしてもよい。
共有メモリ801は、プール管理テーブル802と、ドライブ#入れ替え管理テーブル803と、ページマッピングテーブル804と、サイクルマップポインタテーブル805と、サイクルマッピングテーブル 806と、サイクルマッピング逆変換テーブル 807と、PGマッピングテーブル(V2P) 808と、PGマッピング逆変換テーブル(P2V) 809と、ドライブマッピングテーブル(V2P)810と、ドライブマッピング逆変換テーブル(P2V)811とを格納する。
パーセルマッピングにおいて、マッピングパターンは、PGマッピングテーブル808、サイクルマップポインタテーブル805および、サイクルマッピングテーブル806により表される。
また、ドライブの減設時、減設前のマッピングパターンを現行マッピングパターン(Current)と呼び、減設中のマッピングパターンを中途マッピングパターン(Changing)と呼び、減設後のマッピングパターンを目標マッピングパターン(Target)と呼ぶ。即ち、減設時、共有メモリ801は、Currentのサイクルマッピングテーブル806及びサイクルマッピング逆変換テーブル 807と、Changingのサイクルマッピングテーブル806及びサイクルマッピング逆変換テーブル807と、Targetのサイクルマッピングテーブル806及びサイクルマッピング逆変換テーブル 807とを格納する。なお、PGマッピングテーブル808、サイクルマップポインタテーブル805は、増設前後で共通のテーブルを格納すればよいが、構成をこれに限定しない。
また、減設時には、ドライブマッピングテーブル(V2P)810、ドライブマッピング逆変換テーブル(P2V)811、およびドライブ#803を用いてPDEV#とDrive#との対応を管理する。
図9は、ローカルメモリの内容を示す。
ローカルメモリ217は、ドライブ減設処理プログラム901と、単体増設マップ作成プログラム902と、減設後マップ作成処理プログラム903と、サイクル単位減設処理プログラム905と、デステージ処理プログラム906と、VP変換処理プログラム907と、PV変換処理プログラム908とを格納する。各処理の具体的な用途については後述する。
図10は、プール管理テーブルを示す。
プール管理テーブル802は、プール301と、VPG106の対応関係を示す情報である。プール管理テーブル802は、Pool#1001とVPG#1002と、割当可能Vchunk数1003と、割当可能VPGページ数1004のフィールドを含む。
本テーブルにより、ストレージコントローラ202は、プール301に属するVPG106の識別子と、各VPG106の割当可能Vchunk数と、各VPG106の割当可能VPGページ数1004を調べることができる。
割当可能割当可能Vchunk数1003には、対応するDPG110の容量をもとに、0以上の値が格納される。VPG#1002で示されたVPG106においては、その割当可能割当可能Vchunk数1003を超えるVchunk#にページを割り当てることができない。周期Parcel数をm、DPG内のParcelサイクルの数をWとした場合、割当可能Vchunk数1003の最大値Vは、以下の基準で設定される。
割当可能Vchunk数最大値 V=W×m/K
ここで、mはKの整数倍であるので、上記式の結果は必ず整数となる。
なお、Parcelサイクル内に、スペア領域として別途Parcelをリザーブしておく場合などは、mはKの倍数でなくとも良い。
Parcelサイクル内のリザーブパーセルの個数をSとして、m-sがKの倍数であればよく、その場合の割当可能Vchunk数1003の最大値は、以下の基準で設定される。
割当可能Vchunk数最大値 V=W×(m-s)/K
割当可能VPGページ数1004には、対応するDPG110の容量をもとに、0以上の値が格納される。VPG#1002で示されたVPG106においては、その割当可能VPGページ数1004を超えるVPGページ#にページを割り当てることができない。割当可能Vchunk数1003V_c、Vchunk内VPGページ数VPとして、割当可能VPGページ数Pは、以下の基準で設定される。
割当可能VPGページ数 P=V_c×VP
上記式にて明らかなように、割当可能VPGページ数は、割当可能Vchunk数1003に比例する。以降の説明で、単に割当可能Vchunk数1003を更新・削除する、旨を述べる場合、特に言及がない限り、割当可能VPGページ数1004も併せて更新する。更新する際の割当可能VPGページ数1004は、前述の基準で求める。
図11は、ページマッピングテーブルを示す。
ページマッピングテーブル 804は、VVOL302のページと、VPG106のページとの対応関係を示す情報である。ページマッピングテーブル 804は、プール#1101と、VVOL#1102と、VVOLページ#1103と、VPG#1104と、VPGページ#1105とのフィールドを含む。プール#1101と、VVOL#1102と、VVOLページ#1103とは、VVOLページを示す。VPG#1104と、VPGページ#1105とは、当該VVOLページに割り当てられたVPGページを示す。未使用のVVOLページ#1103に対応するVPG#1104及びVPGページ#1105には、「未割当」に相当する値が格納される。
図12は、マップポインタテーブルを示す。マップポインタテーブル 805は、DPG#1201と、Cycle#1202と、サイクルマップバージョン1203のフィールドを含む。本テーブルにより、ストレージコントローラ202は、アドレス変換時に参照するべきサイクルマッピングテーブルのバージョンを参照することができる。サイクルマップバージョン1203は、ドライブ増設する場合に更新される。サイクルマップバージョンが"Target"のサイクルは、増設処理が完了したことを示している。ストレージコントローラ202は、増設処理中にDPG空間のアドレスにアクセスする場合、指定されたDPG空間のサイクルに対応するサイクルマップバージョンが"Target"であれば、増設後のサイクルマッピングテーブルを用いてアドレス変換を行い、"Current"であれば、増設前のサイクルマッピングテーブルを用いてアドレス変換を行い、"Changing"であれば、増設中のサイクルマッピングテーブルを用いてアドレス変換を行う。
図13は、サイクルマッピングテーブルを示す。サイクルマッピングテーブル806は、CurrentとTarget、Changingの3種類のテーブルを有している。これらは、以下に説明するドライブの増設処理の途中状態で、正しいアドレスを参照するために存在する。Currentは、現在のマッピングテーブルを表し、Targetは増減設後の目標のマッピングテーブルを表し、Changingは増減設過渡中のマッピングテーブルを表している。各サイクルマッピングテーブル806は、Cycle Vchunk#1301と、VDEV#1302と、Local Parcel#1303と、PDEV#1304のフィールドを含む。
本マッピングテーブルを参照することによって、ストレージコントローラ202は、CycleVchunk#,VDEV#をキーとして、Local Parcel#、PDEV#を取得することができる。
図14に示すサイクルマッピング逆変換テーブル807は、サイクルマッピングテーブル806の逆引きテーブルであり、サイクルマッピングテーブル806同様、CurrentとTargetの2種類のテーブルを有している。サイクルマッピング逆変換テーブル807は、CurrentとTarget、Changingの3種類のテーブルを有している。サイクルマッピング逆変換テーブル807のCurrentは、サイクルマッピングテーブル806のCurrentの逆引きテーブルであり、サイクルマッピング逆変換テーブル807のTargetは、サイクルマッピングテーブル806のTargetの逆引きテーブルであり、サイクルマッピング逆変換テーブル807のChangingは、サイクルマッピングテーブル806のChangingの逆引きテーブルである。 各サイクルマッピング逆変換テーブル807は、Local Parcel#1401と、PDEV#1402と、Local Vchunk#1403と、VDEV#1404のフィールドを含む。本マッピング逆変換テーブルを参照することによって、ストレージコントローラ202は、Local Parcel#、PDEV#をキーとして、Cycle Vchunk#、VDEV#を取得することができる。
本マッピング逆変換テーブルは、サイクルマッピングテーブル806と連動して更新される。以降の説明で、サイクルマッピングテーブル806の作成、更新、削除や、CURRENT面、Target面、Changing面へ設定する場合、特に言及がない限り、サイクルマッピング逆変換テーブル807も、サイクルマッピングテーブル806に合わせて作成、更新、削除や、CURRENT面、Target面、Changing面へ設定される。
各サイクルマッピングテーブルおよびサイクルマッピング逆変換テーブルのデータの生成方法や参照方法については、後述する。
図15Aは、PGマッピング(V2P)テーブルを示す。PGマッピング(V2P)テーブル809は、VPGとDPGのマッピングを管理するテーブルである。PGマッピング(V2P)テーブル808は、仮想パリティグループ番号(VPG#)1501と、分散Parityグループ番号(DPG#)1502とから構成される。
PGマッピング(V2P)テーブル808では、仮想パリティグループ番号(VPG#)1501から、分散Parityグループ番号(DPG#)1502の値を求める事ができる。
図15Bに示すPGマッピング(P2V)テーブルは、PGマッピング(V2P)テーブル809の逆引きテーブルである。PGマッピング(P2V)テーブル809は、分散Parityグループ番号(DPG#)1504と、仮想パリティグループ番号(VPG#)1503とから構成される。
PGマッピング(P2V)テーブル809では、分散Parityグループ番号(DPG#)1504から、仮想パリティグループ番号(VPG#)1503の値を求める事ができる。
図16Aは、ドライブマッピング(V2P)テーブルを示す。ドライブマッピング(V2P)テーブル810は、PDEV#とDrive#のマッピングを管理するテーブルである。ドライブマッピング(V2P)テーブル810は、分散Parityグループ番号(DPG#)1601と、PDEV#1602と、Drive#1603とから構成される。ドライブマッピング(V2P)テーブル810では、分散Parityグループ番号(DPG#)1601と、PDEV#1602から、Drive#1603の値を求める事ができる。
図16Bに示すドライブマッピング(P2V)テーブルは、ドライブマッピング(V2P)テーブル811の逆引きテーブルである。ドライブマッピング(P2V)テーブル811は、Drive#1606と、分散Parityグループ番号(DPG#)1604と、PDEV#1605と、から構成される。ドライブマッピング(P2V)テーブル811では、Drive#1606から、分散Parityグループ番号(DPG#)1604とPDEV#1605の値を求める事ができる。
図17は、ドライブ#入れ替え管理テーブル803を示す。ドライブ#入れ替え管理テーブル803は、PDEV#(Source)1701と、PDEV#(Target)1702と、から構成される。PDEV#(Source)1701から、ドライブ#入れ替え先のPDEV#(Target)1702の値を求めることができる。
図18は、本実施例で示すドライブ減設前のマッピングパターン作成方法について示す。
ここでは、周期Parcel数m=4、ドライブ台数N=4の構成において、ドライブ数=5のマッピングパターンを示す。
上記マッピングパターンは、周期Parcel数m=4、ドライブ台数N=4の構成をもとに、1台のドライブを増設したとみなして作成する。
P1は、ドライブ増設前の初期のマッピングパターンを示す。なお、この図の例は、簡単のため、2つのParcelサイクル603のみを記す。
DPG110内の物理記憶ドライブ107内の物理パーセル109に記されているVchunk識別子"x-y"のうち、xは、対応する仮想パーセル103のLVC#を表し、yはVchunk周期#を表している。
P2は、ドライブ増設中のマッピングパターンを示す。既存のVchunk101を構成するParcel108の一部を増設したドライブ1801に割り当てる。これにより、既存のドライブ107に、Vchunk101にマッピングされていないParcelができる。この図の例では、Parcelサイクルあたり、既存の4台のドライブ107のうち3台から1Parcelずつ移動するParcel108を選択し、合計3個のParcelを移動しているが、移動量は周期Parcel数、周期Parcel内のリザーブパーセルの個数、Vchunkを構成するParcel数に依存する。周期Parcel数m、周期Parcel内のリザーブパーセルの個数S、VPGドライブ数Kとして、Parcelサイクルあたりの移動量 Tは以下の式で表現される。
T=(K-1)×(m-s)/K
P3では、新規Vchunkを作成する。新規Vchunkは、前述の既存Vchunkの再構成処理により生じた、VchunkにマッピングされていないParcelから構成する。
Parcelサイクルあたりの新規Vchunkの数は、周期Parcel数、周期Parcel内のリザーブパーセルの個数、Vchunkを構成するParcel数に依存する。周期Parcel数m、周期Parcel内のリザーブパーセルの個数S、VPGドライブ数Kとして、新規Vchunkの数Vは以下の式で表現される。
V=(m-s)/K
なお、新規Vchunkの容量(=V×K)は、スペアを除いた増設ドライブ1801の容量(=m-s)と等しい。
上記手順により決定したマッピングパターンを用いて、周期Parcel数m=4、ドライブ台数N=5の構成におけるマッピングパターンとする。本マッピングパターンは、N=4の分散RAIDへ実際に1台ドライブを増設して実現しても良いし、N=5の分散RAIDを作成して利用しても良い。
図19は、本実施例で示すドライブ減設後のマッピングパターン作成方法について示す。
ここでは、周期Parcel数m=4、ドライブ台数N=4の構成において、ドライブ数=5のマッピングパターンを用いて、Drive#1のドライブを減設する方式を示す。
P1は、ドライブ減設前の初期のマッピングパターンである現行マッピングパターンを示す。なお、この図の例は、簡単のため、2つのParcelサイクル603のみを記す。
まず、Vchunk識別子"4-a"(aは正の整数)で特定されるVchunkから、割り当て済みのVVOLページを別のVchunkへと移動し、当該Vchunkに有効データが格納されていない状態とする。すなわち、VPG#4に割り当てられているVVOLPageをすべて、他のVPG#の未割り当てページに移動し、VPG#4上のページをすべて未割り当て化する。次に、Vchunk識別子"4-a"(aは正の整数)で特定されるVchunkの削除を行う。
P2では、PDEV#最大のドライブ(本例ではPDEV#4、以降末尾ドライブ1901と呼ぶ)上のParcelから、Vchunk識別子"4-a"(aは正の整数)で特定されるVchunkの削除によって未割り当てとなったParcelへデータを移動する。移動後のParcel配置は、N=4のマッピングパターンをもとに決める。
P3は、Parcel入れ替え後のマッピングを示す。Parcelの入れ替えによって、末尾ドライブ1901上のデータがすべて無くなる。
P4で、減設対象のドライブ(Drive#1)から末尾ドライブ1901へデータをコピーする。
P5で、減設対象のドライブのPDEV#(#1)が末尾ドライブ1901のDrive#(Drive#4)、末尾ドライブ1901のPDEV#(#4)が減設対象のドライブのDrive#(Drive#1)となるように、ドライブマッピングテーブルを更新する。
以上により、Drive#1で示されるドライブがマッピングパターンの範囲からなくなり、かつ当該Drive上に有効データが無い状態が実現できるため、当該Driveを減設することが可能となる。
以下、ストレージコントローラ202の動作の詳細について説明する。
図20は、ドライブ減設処理を示す。ドライブ減設処理プログラム901は、ドライブを減設する場合に減設処理を行う。管理者は、システムに対して減設用のドライブを1台以上選択して、減設指示を管理サーバ203へ入力する。ストレージコントローラ202は、その減設指示を管理サーバ203から受領した契機で、ドライブ減設処理を実行する。
まず、ドライブ減設処理プログラム901は、減設対象として指定されたドライブの台数から、操作対象となるVPG#を決定する(ステップS2001)。
VPG#の決定は以下の手順で行う。ドライブマッピング(P2V)テーブル 811を参照し、減設指示されたDrive#に対応するDPG#を特定する。このとき、複数個の減設対象Drive#から、単一のDPG#が求まる場合と、複数のDPG#に分かれる場合がある。
対応するDPG#が複数ある場合は、以降の処理をそれぞれのDPG#に対して繰り返し行う。以降、対象とするDPGを、減設対象DPGと呼ぶ。
次にPGマッピング(P2V)テーブル 809を参照して、DPG#に対応するVPG#の一覧を取得する。取得したVPG#の、降順にR個(Rは、単一のDPG#に対応する減設対象ドライブ台数)のVPGを、操作対象とする。以降、操作対象のVPGを、減設対象VPGと呼ぶ。
次に、減設対象のVPGから、有効データを退避する(ステップS2002)。有効データの退避は、次の手順で行う。
まず、プール管理テーブル802について、減設対象VPG#に対応する割当可能Vchunk数1003および、割当可能VPGページ数1004を0に更新する。これにより、当該VPGに対して、以降有効データが追加で格納されることを抑止する。
次に、ページマッピングテーブル804を参照し、減設対象のVPG#に割り当てられているVVOLPage#の一覧を取得する。これらのページが、退避元データである。
次に、退避先のページを決定する。プール管理テーブル802を参照して、減設対象のVPG#と同じPool#に対応づいている、減設対象でなく、かつ割当可能VPGページ数1004が0でないものを退避先として決定する。候補が複数ある場合は、例えば利用率の最も低いVPGを、対象VPGとして選択する、又は、VVOL毎に、割当優先度をVPGに設定し、割当優先度が最も高いVPGを、対象VPGとして選択し、VPGページを退避先として選択する。対象VPGページを選ぶ方法は、例えば対象VPG内の空きページのうち、最もVPGページ#の若いページを、対象VPGページとして選択する。
この処理を、退避元データのページ数分繰り返す。
退避元ページより少ないページ数しか確保できなかった場合、ドライブ減設処理は継続できないので、ドライブ減設処理プログラム901は失敗として終了する(ステップS2003、No)。
退避元ページ数分ページ確保できた場合に、退避元ページのデータを退避先ページへとコピーする。コピーが完了したら、ページマッピングテーブル 804のVPG Page#1105のエントリを、コピー元ページのVPG#、VPG Page#から、コピー先ページのVPG#、VPG Page#へ更新する。また、コピーによりVPGごとの割当可能VPGページ数1004、割当可能Vchunk数1003のエントリの値が変化するので、プール管理テーブル802の情報も更新する。更新のあと、ドライブ減設処理プログラム901は次のステップ実行する(ステップS2003、Yes)。
次に、ドライブ減設処理プログラム901は、減設後マップ作成処理を実行する(ステップS2004)。本処理では、減設後のマッピングパターンを生成する。詳細は後述する。
次に、ドライブ減設処理プログラム901は、作成した減設後のマッピングパターンを、サイクルマッピングテーブル806のTarget面のサイクルマッピングテーブルに設定する(ステップS2005)。
次に、ドライブ減設処理プログラム901は、全サイクルに対してサイクル単位減設処理が完了しているかを判定する(ステップS2007)。
判定には、例えば、マップポインタテーブル805を参照してもよい。減設対象DPG#に対応するサイクルマップバージョンエントリ1203はすべてTargetを参照する状態になっていれば、サイクル単位減設処理が完了しているとみなせる。
全サイクルに対してサイクル単位減設処理が完了していない場合(ステップS2007でNo)、ドライブ減設処理プログラム901は、ステップS2006に戻り、次の対象ドライブに対して同様の処理を実施し、全サイクルに対してサイクル単位減設処理が完了している場合(ステップS2007でYes)は、CURRENT面のサイクルマッピングテーブル806をTarget面のサイクルマッピングテーブルの内容に更新する(ステップS2008)。これにより、CURRENT面とTarget面が、減設後のマッピングパターンの内容で一致する。
次に、ドライブ減設処理プログラム901は、マップポインタテーブル805を参照し、減設対象DPG#に対応するサイクルマップバージョンエントリ1203を、全てCurrentに更新して、処理を完了する(ステップS2009)。これにより、次の新たなドライブ減設時に、再度上述の処理を実施してTarget面を更新した場合でも、現在のマッピングパターンを継続して参照可能となる。
以上までの処理で、減設ドライブ台数分の、R個の末尾ドライブ上から、有効なデータが排除される(図19のP3の状態)。
次に、ドライブ減設処理プログラム901は、ドライブ#入れ替え処理を実施して、減設処理を完了する(ステップS2010。本処理によって、減設対象のドライブ上から有効なデータを排除し、減設可能な状態とする。詳細は後述する。
図21は、減設後マップ作成処理を示す。減設後マップ作成処理プログラム903はまず、減設後のドライブ台数を算出する(ステップS2101)。減設後のドライブ台数は、ドライブマッピング(V2P)テーブル 810の、減設対象DPG#2に対応するDrive#1603のエントリのうち、有効なDrive#、すなわちInvalidでないDrive#の数を数える。これが、対象のDPG#を構成しているドライブ台数(Q)である。減設後のドライブ台数は、Q-Rで求められる。
次に、減設後マップ作成処理プログラム903は、マップ作成の起点となるマップ(起点マップ)を作成し、減設後マップとして設定する(ステップS2102)。起点マップは、DPGを構成可能な最小ドライブ台数におけるマッピングパターンである。図18に示した例では、P1に示すドライブ4台のマッピングが該当する。本図では、K=4の場合が示されておりDPGを構成するドライブ台数は4未満にならないため、起点マップは、ドライブ台数4台のマップとなる。
なお、ドライブ台数が4台より多いマップを起点マップとしてもよい。ただし、起点マップ台数未満のドライブ台数への減設が不可となる。
起点マップの作成方法は、限定しない。例えば、図18のP1のように、PDEVの先頭から順にVchunkを割り当てていけば良い。
減設後マップのドライブ台数が、減設後ドライブ台数未満の場合(ステップS2103、No)、減設後マップ作成処理プログラム903は、単体増設マップ作成処理を実施する(ステップS2104)。詳細は後述する。本処理によって、ドライブ台数が増えた減設後マップが作成される。
減設後マップのドライブ台数が、減設後ドライブ台数と一致する場合(ステップS2103、Yes)、減設後マップ作成処理プログラム903は、処理を終える。以上の手順によって、減設後マップが作成される。
図22は、単体増設マップ作成処理を示す。単体増設マップ作成処理は、大きく、既存のVchunkを構成するパーセル情報を更新する既存パーセル再配置処理2201と、増設した容量に新規にVchunkを割り当てる新規Vchunk割当処理2202からなる。それぞれの処理に分けて説明する。
既存パーセル再配置処理2201では、単体増設マップ作成プログラム902は、減設後マップにより対応付けられたドライブ107内の物理パーセル109で構成されている既存のVchunkのいくつかについて、ドライブ台数を1台追加した構成に変更する。すなわち、増設ドライブ1801の物理パーセルを用いた構成に変更し、サイクルマッピングテーブル806を更新する。
まず、単体増設マップ作成プログラム902は、既存のLocal Vchunkに割り当てられている物理パーセル109を移動元候補として1つ選択し、当該パーセルのLocal Parcel#および、PDEV#を取得する(ステップS2203)。Local Parcel#とPDEV#を直接選択してもよいし、対象のLocal Vchunk#とVDEV#を決めた後に、サイクルマッピングテーブル806を参照して対応するLocal Parcel#とPDEV#を取得しても良い。ここでは、例えば、単体増設マップ作成処理内で、移動元として選択したパーセル数が、既存のPDEV間で平準化するように選択する。選択した物理パーセル109を、以降候補パーセルと呼ぶ。
次に、単体増設マップ作成プログラム902は、候補パーセルを含むLocal Vchunkが、増設ドライブ内のParcelを含むかどうかを判定する(ステップS2204)。単体増設マップ作成プログラム902は、Targetのサイクルマッピング逆変換テーブル807を参照し、ステップS2203で取得した候補パーセルのLocal Parcel#とPDEV#をキーとして、Local Vchunk#を取得する。次に、単体増設マップ作成プログラム902は、Targetのサイクルマッピングテーブル806を参照し、Local Vchunk#をキーとして、Local Vchunk#を構成するすべてのVDEV#と、そのLocal Vchunk#、VDEV#に対応するParcelのPDEV#を取得する。取得したPDEV#のうちの少なくとも1つが、増設ドライブのPDEV#と一致する場合、ステップS2204のYesに分岐し、ステップS2203を再度実行する。
取得したPDEV#が全て、増設ドライブのPDEV#と一致しない場合(ステップS2204No)、単体増設マップ作成プログラム902は候補パーセルを、移動元パーセルとして確定させる(ステップS2205)。
次に、単体増設マップ作成プログラム902は、増設ドライブの物理Parcelの中から、サイクルマッピングテーブル806に未割り当てのパーセルを選択し、移動先パーセルとして確定する(ステップS2206)。パーセルが未割り当てか否かを判定する手段は、特に限定しない。例えばパーセル#毎の割当・未割り当て状態を管理するテーブルを用いて判定してもよいし、未割り当て状態のパーセル#をキュー管理し、キューを参照することで未割り当てのパーセルを取得してもよい。
次に、単体増設マップ作成プログラム902は、移動元パーセルを含むVchunkの構成情報を、移動先パーセルを含むよう更新する(ステップS2207)。単体増設マップ作成プログラム902は、Targetのサイクルマッピング逆変換テーブル807を参照し、移動元のLocal Parcel#とPDEV#をキーとして、Local Vchunk#、VDEV#を取得する。次に、取得したLocal Vchunk#、VDEV#をキーとして取得できるLocal Parcel#エントリ1303と、PDEV#エントリ1304を、移動先パーセルのLocal PDEV#とPDEV#にそれぞれ更新する。更に、単体増設マップ作成プログラム902は、、Targetのサイクルマッピング逆変換テーブル807を、サイクルマッピングテーブル806にあわせて更新する。この時点で、移動元パーセルは、Local Vchunkを構成しなくなったため、移動元パーセルのLocal Parcel#とPDEV#をキーとして取得できるLocal Vchunk#1403と、VDEV#に、それぞれ無効値を格納する。
次に、単体増設マップ作成プログラム902は、既存パーセルの移動が十分量行われたかを判定する(ステップS2208)。増設ドライブに移動したパーセルの個数が前述の移動量 T個未満の場合(ステップS2208No)、単体増設マップ作成プログラム902はステップS2203に戻り処理を行う。
増設ドライブに移動したパーセルの個数が全述の移動量T個以上の場合(ステップS2208Yes)、単体増設マップ作成プログラム902は、処理を新規Vchunk割当処理2202に進める。
新規Vchunk割当処理2202において、単体増設マップ作成プログラム902はまず、未割り当ての物理パーセルをK台のドライブから1個ずつ選択することを試みる(ステップS2209)。
選択できる場合(ステップS2210、Yes)、単体増設マップ作成プログラム902は、選択したK個のParcelで新規Vchunkを構成する(ステップS2211)。単体増設マップ作成プログラム902は、Targetのサイクルマッピングテーブル806に新規Local Vchunk#エントリを追加し、新規Local Vchunk#を構成するK個のVDEV#に対して、選択したK個のパーセルのLocal Parcel#とPDEV#を設定する。Targetのサイクルマッピング逆変換テーブル807も、サイクルマッピングテーブル806に合わせて更新する。なお、K個のドライブの選択方法は特に限定しないが、例えば、未割り当てパーセル数の多い方からK個のドライブを選択すればよい。
新規Vchunkが構成された時点で、Vchunkが割り当てられるVPG#は一意に決まる。割当対象のVPG#およびVPG内のCycle Vchunk#は、以下の計算式で求められる。
VPG#=Floor(LVC#/C)
Cycle Vchunk#=LVC# mod C
ステップS2210において、K個のパーセルを選択できなかった場合(No)、単体増設マップ作成プログラム902は、処理を終了する。
以上により、もとにしたマッピングパターンのドライブ台数よりも1台多いドライブを用いてVchunkを構成するマッピングパターンが作成される。なお、本実施例では、単体増設マップ作成処理の主体を、ストレージコントローラ202内の単体増設マップ作成プログラム902として記載したが、この処理の一部または全部を、他の主体が行っても良い。たとえば、構成に応じたマッピングパターンを、事前に高性能計算機によって作成しておき、ストレージコントローラ202は、作成されたマッピングパターンを読み込んで使用することも可能である。これにより、ストレージコントローラ202の負荷を低減できるほか、より特性の良いマッピングパターンを利用する事が可能である。
この場合には、例えば、事前に作成したマッピングパターンを、共有メモリ801またはローカルメモリ217上に、構成PDEV台数ごとに保存しておき、図20のステップS2004~S2005の代わりに、減設後の構成PDEV台数に対応するマッピングパターンを、サイクルマッピングテーブル806のTarget面806Bに設定する。
図23は、サイクル単位減設処理を示す。
サイクル単位減設処理プログラム905は、前述のドライブ減設処理のステップS2006において、処理を行う。サイクル単位減設処理は、後述のデータSWAP処理を実行することで、現行マッピングパターン(Current)で示されたデータの配置を、目標マッピングパターン(Target)で示されたデータの配置に変更する。
まず、サイクル単位減設処理プログラム905は、サイクルマッピングテーブル806のCurrent面をChanging面へコピーし(ステップS2301)、マップポインタテーブル805の、当該サイクルのサイクルマップバージョンエントリを、Changingへと更新する(ステップS2302)。
次に、サイクル単位減設処理プログラム905は、減設対象のサイクルマッピングテーブル806内の一つの物理パーセルを対象物理パーセルとして順次選択する(ステップS2303)。例えば、サイクル単位減設処理プログラム905は、サイクルマッピングテーブル806内の全ドライブ内の物理パーセルのうち、PDEV#、Parcel#が若いものから順に、データSWAP処理が未実施である物理パーセルを、対象物理パーセルとして選べばよい。
次に、サイクル単位減設処理プログラム905は、対象物理パーセルがSWAP対象であるかを判定する(ステップS2304)。具体的には、減設対象のDPGが参照するサイクルマッピング逆変換テーブル807のCurrent面を参照し、対象物理パーセルが構成するLocal Vchunk#および、VDEV#に差分がある場合、対象物理パーセルはSWAP対象である。ここで、Local Vchunk#および、VDEV#に有効エントリが無い場合がある。減設後にデータ格納されないParcelであることを示しているため、当該Parcelは、SWAP対象としない。
さらに、Current面でSWAP対象物理パーセルが構成するLocal Vchunk#とVDEV#をキーとして、Target面を参照して取得される物理パーセルがSWAP先ペアとなる。
対象物理パーセルがSWAP対象でないと判定された場合(ステップS2304でNo)、サイクル単位減設処理プログラム905は、ステップS2310に処理を進める。ステップS2310については後述する。
対象物理パーセルがSWAP対象であると判定された場合(ステップS2304でYes)、サイクル単位減設処理プログラム905はSWAP対象ペアが割り当てられている二つのVchunkを対象Vchunkペアとして選択し、対象Vchunkペア内の仮想ストライプを対象ストライプペアとして順に選択する(ステップS2305)。
次に、サイクル単位減設処理プログラム905は、対象ストライプペアに対するデータSWAP処理を実施する(ステップS2306)。データSWAP処理は、特許文献1に示されている処理と同様である。データSWAP処理は、対象ストライプペアの少なくとも一つが有効データを格納している場合、対象ストライプペアの間でデータを入れ替える。例えば、データSWAP処理は、対象ストライプペアの少なくとも一つの仮想ストライプがVVOLページに割り当てられている場合、Currentにおいて当該仮想ストライプに対応する物理ストライプから、当該VVOLページに対応する対象キャッシュスロットへデータをステージングし、対象キャッシュスロットのデステージ(CM214からドライブ107への書き込み)を抑止し、対象キャッシュスロットをダーティに設定する。データSWAP処理後にデステージ抑止を解除されると、対象キャッシュスロットに格納されたデータは、非同期で、Targetにおいて当該仮想ストライプに対応する物理ストライプへデステージされる。
次に、サイクル単位減設処理プログラム905は、対象物理パーセル内に、データSWAP処理が行われていないストライプ(未SWAP領域)が存在するかを判定する(ステップS2307)。未SWAP領域が存在する場合(ステップS2307でNo)、サイクル単位減設処理プログラム905は、ステップS2303に戻り、対象物理パーセル内の次の物理ストライプに対して同様の処理を実施する。
未SWAP領域が存在しないと判定された場合(ステップS2307でYes)、サイクル単位減設処理プログラム905は、Changing面のサイクルマッピングテーブル806の情報を、SWAP後のパーセル情報に更新する(ステップS2308)。これにより、サイクル単位減設処理対象のサイクル#に対するVP変換処理(後述)を実施する場合でも、正しい物理パーセルに対してアクセスが可能となる。
次に、サイクル単位減設処理プログラム905は、ステップS2306でデステージ抑止を施されていた対象キャッシュスロットのデステージ抑止を解除する(ステップS2309)。
次に、サイクル単位減設処理プログラム905は、減設対象のサイクルマッピングテーブル806内の全物理パーセルを対象物理パーセルとして選択したか否かを判定する(ステップS2310)。未選択である物理パーセルが存在する場合(ステップS2310でNo)、サイクル単位減設処理プログラム905は、ステップS2303に戻って、次の対象物理パーセルを選択する。
未選択である物理パーセルが存在しない場合(ステップS2310でYes)、サイクル単位減設処理プログラム905は、マップポインタテーブル805の、当該サイクルの
サイクルマップ バージョンエントリを、Targetへと更新し、処理を終了する(ステップS2311)。
以上のサイクル単位減設処理によれば、ストレージコントローラ202は、SWAP対象の物理パーセルに対応するVchunkに有効データが格納されている場合、Currentに基づいて、当該Vchunkに対応する物理パーセルから有効データを読み出し、Targetに基づいて、当該Vchunkに対応する物理パーセルへ有効データを書き込む。これにより、ストレージコントローラ202は、CurrentからTargetへのマッピングパターンの変更に合わせて、データを移動させることができる。
なお、サイクル単位減設処理において、ストレージコントローラ202は、物理パーセルを順次選択する代わりに、仮想チャンクや仮想パーセルを順次選択してもよい。
図24は、ドライブ#入れ替え処理を示す。
ドライブ#入れ替え処理プログラム904は、前述のドライブ減設処理のステップS2010において、処理を行う。本処理ではまず、減設対象のドライブから、末尾ドライブへとデータをコピーする。これにより、末尾ドライブと減設対象ドライブ内のデータが一致する。
この状態で、ドライブマッピングテーブル上の、減設対象ドライブのPDEV#と、末尾ドライブのPDEV#を、それぞれ末尾ドライブのDrive#、減設対象ドライブのDrive#へと入れ替えて更新することで、減設対象ドライブのPDEV#が末尾ドライブとなり、マッピングパターンの範囲外のPDEV#となる。これ以降、減設対象ドライブへデータがアクセスされなくなるため、当該ドライブの減設が可能となる。
ドライブ#入れ替え処理プログラム904はまず、減設対象ドライブのPDEV#をコピー元PDEV#、末尾ドライブのPDEV#をコピー先PDEV#として決定する(ステップS2401)。
複数ドライブをまとめて減設する場合、コピー元ドライブが複数存在するが、任意の1台を選択する。末尾ドライブは、ドライブマッピング(V2P)テーブル 810を参照し、減設対象DPG#に対応する、PDEV#のうち、Drive#に有効値(Invalidでない)が格納された最大のPDEV#とする。
コピー元PDEV#と、コピー先PDEV#が一致する場合(ステップS2402、Yes)は、以降のコピー処理は不要なため、ステップS2410を実施する。
コピー元PDEV#と、コピー先PDEV#が不一致の場合(ステップS2402、No)に、ドライブ#入れ替え処理プログラム904は、コピー元PDEV#をIO二重化対象化として管理する(ステップS2403)。ドライブ#入れ替え処理プログラムは、ドライブ#入れ替え管理テーブル803において、コピー元PDEV#を示すPDEV#(Source)1701に対応する、PDEV#(Target)1702に、コピー元PDEV#を設定する。これにより、後述するデステージ処理において、デステージ対象のドライブがコピー元PDEVだった場合に、コピー先PDEVへもデステージ処理が行われる。
次に、ドライブ#入れ替え処理プログラム904は、コピー元PDEV上のデータを、コピー先PDEVへコピーする(ステップS2404)。全PDEV領域のコピーが完了すると(ステップS2405)、ステップS2406に進む。
ステップS2406において、ドライブ#入れ替え処理プログラム904は、デステージ処理の実行を抑止する。デステージ処理とは、キャッシュ上のデータをドライブへ書き込む処理である。抑止の方法は、限定しない。たとえば、抑止用の管理情報をメモリ上に保持し、デステージ処理の度にそれを参照して、抑止されている場合は処理をスキップすることで実現できる。
次に、ドライブ#入れ替え処理プログラム904は、ドライブ#を入れかえる(ステップS2407)。ドライブマッピング(V2P)テーブル 810において、減設対象のDPG#、PDEV#に対応するDrive#1603のエントリに、末尾ドライブのDrive#を、末尾ドライブのDPG#、PDEV#に対応するDrive#1603のエントリに、減設対象ドライブのDrive#を、それぞれ設定する。また、ドライブマッピング(P2V)テーブル811の内容を、ドライブマッピング(V2P)テーブル810の対応関係と一致するよう更新する。
次に、ドライブ#入れ替え処理プログラム904は、IO二重化対象から対象ドライブを除外する(ステップS2408)。ドライブ#入れ替え処理プログラムは、ドライブ#入れ替え管理テーブル803において、コピー元PDEV#を示すPDEV#(Source)1701に対応する、PDEV#(Target)1702に、無効値(Invalid)を設定する。これにより、以降のデステージ処理においては、コピー先PDEV#へのデステージが行われなくなる。
次にドライブ#入れ替え処理プログラム904は、ステップS2406で実施したデステージ処理抑止を解除する(ステップS2409)。
ドライブ#入れ替え処理プログラム904は、すべての減設対象ドライブに対して、ステップS2401~ステップS2409を実行した場合に、処理を終了し(ステップS2410、Yes)、未実施の減設対象ドライブが有る場合には、ステップS2401から再度実行する(ステップS2410、No)。
図25は、デステージ処理を示す。デステージ処理は、キャッシュ上のデータを、ドライブへと書き込む処理である。デステージ処理の実行は、例えば、新規データを格納するための空き容量がキャッシュ上にない場合に、データをキャッシュ上から破棄する際に行う。
デステージ処理において、デステージ処理プログラム906は、デステージ対象のドライブを示すPDEV#が、IO二重化対象化どうか、すなわち、ドライブ#入れ替え管理テーブル803を参照し、デステージ対象のドライブを示すPDEV#に対して、PDEV#(Target)1702に有効値があるかどうかを確認する。
有効値がない場合(ステップS2501、No)、デステージ対象のドライブを示すPDEV#へ要求されたデータを書き込み、処理を終了する(ステップS2502)。
有効値がある場合(ステップS2501、Yes)、PDEV#(Target)1702に格納されたPDEV#を、IO二重化先のPDEV#として取得し(ステップS2503)、IO二重化先ドライブへデータ書き込む(S2504)。デステージ対象のドライブを示すPDEV#へ要求されたデータを書き込み、処理を終了する(ステップS2502)。
これにより、IO二重化対象のPDEV#へのデステージ処理が、二重化先PDEV#へもデステージされることとなり、ドライブコピー中に行われたデータ更新がコピー先ドライブへも反映される。
図26は、VP変換処理を示す。
VP(Virtrual-Physical)変換処理は、VP変換処理プログラム907により実行される。VP変換は、論理記憶領域のアドレスから物理記憶領域のアドレスへの変換処理である。VP変換処理は、ホスト204からI/O要求を受領した場合のページ変換処理などから呼び出される。ページ変換処理は、I/O要求により指定された仮想ボリューム内のアドレスを、VPG空間のアドレスに変換する。VP変換処理は、指定された仮想的なアドレスであるVPG空間のアドレス(VPG#、VDEV#、Vchunk#)を、物理的なデータの格納先であるDPG空間のアドレス(DPG#、PDEV#、Parcel#)に変換する。
まず、VP変換処理プログラム907は、Vchunk#から、Cycle Vchunk#を算出する(ステップS2601)。Cycle Vchunk#は、
Cycle Vchunk#=Vchunk# mod c
で算出できる。
次に、VP変換処理プログラム907は、VPG#と、Cycle Vchunk#、周期Vchunk数Cから、Local Vchunk#を算出する(ステップS2602)。
Local Vchunk#は、
Local Vchunk#=VPG#×C+Cycle Vchunk#
で算出できる。
次に、VP変換処理プログラム907は、Vchunk#から、cycle #を算出する(ステップS2603)。cycle #は、
cycle#=Floor(Vchunk#/c)
で算出できる。
次に、VP変換処理プログラム907は、物理インデックス取得処理を実行する(ステップS2604)。
物理インデックス取得は、VPG#、VDEV#、Local Vchunk#を入力として、DPG#、PDEV#、Local Parcel#を取得する処理である。
例えばVP変換処理プログラム907は、PGマッピング(V2P)テーブル 808を用いて、VPG#からDPG#を取得する。
次に、VP変換処理プログラム907は、マップポインタテーブル 805を参照し、DPG#と、cycle #をキーとして、サイクルマップバージョン1203を特定し、参照するサイクルマッピングテーブル806の面を決定する。
次に、VP変換処理プログラム907は、サイクルマッピングテーブル806を用いて、VDEV#とLocal Vchunk#から、PDEV#とLocal Parcel#を取得する。
次に、VP変換処理プログラム907は、Local Parcel#、Cycle#、および、周期Parcel数mから、Parcel#算出を行い、処理を終了する(ステップS2605)。Parcel#は、
Parcel#=Cycle#*m+Local Parcel#
で算出できる。
図27は、PV変換処理を示す。
PV(Physical-Virtrual)変換処理は、PV変換処理プログラム908により実行される。PV変換は、物理記憶領域から、論理記憶領域への変換処理である。PV変換は、例えば、リビルド処理で故障した物理記憶領域に対応するデータを特定するためなどに用いられる処理である。PV変換は、指定された物理的なデータの格納先であるDPG空間のアドレス(DPG#、PDEV#、Parcel#)を、仮想的なアドレスであるVPG空間のアドレス(VPG#、VDEV#、Vchunk#)に変換する。PV変換は、VP変換の逆変換に相当する。つまり、VP変換を実施した後に、その結果でPV変換を実施すると、同じアドレスが返却されることになる。また、逆も同じである。
まず、PV変換処理プログラム908は、Parcel#から、Local Parcel#を算出する(ステップS2701)。Local Parcel#は、
Local Parcel#=Parcel# mod (m)
で算出できる。
次に、PV変換処理プログラム908は、Parcel#から、cycle #を算出する(ステップS2702)。cycle #は、
cycle #=Floor(Parcel#/m)
で算出できる。
次に、PV変換処理プログラム908は、マップポインタテーブル 805を参照し、DPG#と、cycle #をキーとして、サイクルマップバージョン1203を特定し、参照するサイクルマッピングテーブル806の面を決定する。
次に、PV変換処理プログラム908は、仮想インデックス取得を実行する(ステップS2703)。
仮想インデックス取得は、DPG#、PDEV#、Local Parcel#を入力として、VPG#、VDEV#、Local Vchunk#を取得する処理である。
例えばPV変換処理プログラム908は、PGマッピング(P2V)テーブル809を用いて、DPG#からVPG#を取得し、サイクルマッピング逆変換テーブル807を用いて、PDEV#とLocal Parcel#から、VDEV#とLocal Vchunk#を取得する。なお、本変換において、VDEV#、Local Vchunk#が割り当てられていない場合、当該Parcelはスペア領域であり、データが割り当てられていないことを示す。
次に、PV変換処理プログラム908は、Local Vchunk#、Cycle#、および、周期Vchunk数Cから、Cycle Vchunk#算出を行う(ステップS2704)。
Cycle Vchunk#は、
Cycle Vchunk#=Local Vchunk# mod c
で算出できる。
次に、PV変換処理プログラム908は、Cycle Vchunk#、Cycle#、および、周期Vchunk数Cから、Vchunk#算出を行い、処理を終了する(ステップS2705)。Vchunk#は、
Vchunk#=Cycle#*C+Cycle Vchunk#
で算出できる。
以上のPV変換処理によれば、ストレージコントローラ202は、リビルド処理において、障害があるドライブ107のDPG空間のアドレスを、VPG空間のアドレスへ変換し、リビルドに必要なデータを特定することができる。
本実施例に示したデータ配置およびデータの移動方法によって、分散RAIDにおける任意のドライブ減設が可能となる。