尚、以下に説明する実施形態は特許請求の範囲にかかる発明を限定するものではなく、また実施形態の中で説明されている特徴の組み合わせの全てが発明の解決手段に必須であるとは限らない。
以下の説明では、「テーブル」、「リスト」、「キュー」等の表現にて各種情報を説明することがあるが、各種情報は、これら以外のデータ構造で表現されていても良い。データ構造に依存しないことを示すために「XXテーブル」、「XXリスト」等を「XX情報」と呼ぶことがある。各情報の内容を説明する際に、「識別情報」、「識別子」、「名」、「ID」、「番号」等の表現を用いるが、これらについてはお互いに置換が可能である。
また、以下の説明では、同種の要素を区別しないで説明する場合には、参照符号又は参照符号における共通番号を使用し、同種の要素を区別して説明する場合は、その要素の参照符号を使用又は参照符号に代えてその要素に割り振られたIDを使用することがある。
また、以下の説明では、「プログラム」を主語として処理を説明する場合があるが、プログラムは、プロセッサ(例えばCPU(Central Processing Unit))によって実行されることで、定められた処理を、適宜に記憶資源(例えばメモリ)及び/又はインターフェースデバイス(例えば通信ポート)等を用いながら行うため、処理の主語がプロセッサとされてもよい。プログラムを主語として説明された処理は、プロセッサあるいはそのプロセッサを有する装置が行う処理又はシステムとしてもよい。また、プロセッサは、処理の一部または全部を行うハードウェア回路を含んでもよい。プログラムは、プログラムソースから計算機のような装置にインストールされてもよい。プログラムソースは、例えば、プログラム配布サーバまたは計算機が読み取り可能な記憶メディアであってもよい。プログラムソースがプログラム配布サーバの場合、プログラム配布サーバはプロセッサ(例えばCPU)と記憶資源を含み、記憶資源はさらに配布プログラムと配布対象であるプログラムとを記憶してよい。そして、プログラム配布サーバのプロセッサが配布プログラムを実行することで、プログラム配布サーバのプロセッサは配布対象のプログラムを他の計算機に配布してよい。また、以下の説明において、2以上のプログラムが1つのプログラムとして実現されてもよいし、1つのプログラムが2以上のプログラムとして実現されてもよい。
本実施例は、分散型ストレージシステムを開示する。分散型ストレージシステムは、それぞれがストレージデバイスを含む複数の計算機ノードを含む。複数の計算機ノードは、ネットワークにより互いに接続される。分散型ストレージシステムは、複数の計算機ノードのストレージデバイスによってストレージプールを作成し、ストレージプールを用いて仮想的なストレージシステムを実現する。
本開示において、ストレージデバイスは、1台のHDD(Hard Disk Drive)やSSD(Solid State Drive)等の1台のストレージドライブ、複数台のストレージドライブを含むRAID装置、及び複数のRAID装置を含む。ストライプ(ストライプデータ)は、データ保護のための冗長コードの生成の元となるデータユニットである。ストライプを、冗長コードと区別するためにユーザデータと呼ぶことがある。ストライプは、計算機ノード内のストレージデバイスに格納されると共に、他の計算機ノードにおける冗長コードの生成において使用される。
ストライプタイプは、冗長コードを生成するストライプのクラスである。或るストライプが属するストライプタイプは、例えば、当該ストライプの論理アドレスと当該ストライプを格納する計算機ノードとによって決定される。ストライプタイプの識別子であるストライプタイプ番号は、対応する計算機ノードのグループを示す。一つのストライプは、互いに異なる複数の保護レイヤのストライプタイプに属することができる。ホストは、計算機ノード、当該計算機ノードで動作するプロセッサ、又は当該プロセッサが実行するアプリケーションプログラムである。
図1は、実施例1に係る分散型ストレージシステムの障害からのデータ復旧処理の概要を示す。
複数の計算機ノード101は、ネットワークを介し互いに通信する。以下において、計算機ノードを、単にノードと呼ぶ。複数のノード101は夫々、ノード#0〜#3と表される。
ノード101は、ストレージプログラム302、アプリケーションプログラム(アプリ)301、管理プログラム303を実行する。ストレージプログラム302は、ドライブ105を管理しており、仮想ボリューム107をアプリケーションプログラム301に提供する。ノード#0〜#3は、アプリケーションプログラムA〜Dが夫々実行し、ストレージプログラムA〜Dが夫々実行する。ストレージプログラムA〜Dは、仮想ボリュームA〜Dを夫々提供する。
正常時、ノード#0のストレージプログラムAは、アプリケーションプログラムAから受信したユーザデータD1を自ノード#0(ローカル)のストレージドライブに格納し、さらに静的マッピングテーブル506Aを用いて、ユーザデータD1に対する冗長コードを格納する他ノード#1を選択し、他ノード#1(リモート)にユーザデータを転送する。当該ノード101Bは、他ノードから受信したユーザデータに基づいてノード間の冗長コードPを生成し、冗長コードPを自ノードのストレージドライブ105に格納する。以後、自ノードや自サイトを自系と呼び、他ノードや他サイトを他系と呼ぶことがある。
管理プログラム303は、各ノード上で動作するストレージプログラム302、アプリケーションプログラム301とネットワークを介し、後述の管理オペレーションを発行する。この図の例では、管理プログラム303は、ノード#3でのみ動作しているが、複数のノード上で動作してもよい。
以上のようなシステムにおいて、ノード#0に障害が発生した際、まず、管理プログラム303は、障害ノード#0上で動作していたストレージプログラムAを、生存している別ノード#1に再起動する。この際、ストレージプログラムAは、アプリケーションプログラムAに提供していた仮想ボリュームAを提供する。当該仮想ボリュームAは、ストレージドライブ105を消失しているため、データの実体がない。そのため、ストレージプログラムAは、当該仮想ボリュームAへのアクセスに対し、コレクション処理により、データを復旧し、アプリケーションプログラムAへデータを返却する。
次に、管理プログラム303は、アプリケーションプログラムのフェイルオーバ先のノード#1を選定し、フェイルオーバ先のノード#1上で動作するストレージプログラムBへデータ移行要求を発行する。ストレージプログラムBは、ストレージプログラムAの仮想ボリュームAを、内部の仮想ボリュームとしてマッピングする外部接続を行い、自身のストレージデバイスとして処理できるようにする。次に、ストレージプログラムBは、新たな仮想ボリュームAnを作成し、外部接続された仮想ボリュームAから仮想ボリュームAnへデータ移行111を行う。これにより、分散型ストレージシステムは、障害の発生したノード#0上のデータを、生存ノード#1上で動作するストレージプログラムBへコピーし、新たに格納し直すことで、データを復旧する。
また、分散型ストレージシステムは、データ復旧処理と同時に、ノード#0の減設処理を実行する。減設処理では、まず、減設前の静的マッピングテーブル506Aに対し、減設後の構成で、新たな静的マッピングテーブル506Bを生成する。次に、分散型ストレージシステムは、各ノードに格納しているデータに対し、新たな静的マッピングテーブル506Bに基づき、冗長コードを格納するノードである冗長コードノード(冗長化先ノード)を決定し、新しく冗長コードPnを再生成する。その後、古い静的マッピングテーブル506Aに基づき生成した冗長コードPは、不要となるため、ストレージプログラムBは、冗長コードPを削除する。
この図の例では、2個のストライプから1個の冗長コードを生成する2D1Pを用いる場合の静的マッピングテーブル506A、506Bを示す。静的マッピングテーブル506は、ユーザデータ部分の行列であるD領域と、冗長コード部分の行列であるP領域とを含む。D領域とP領域における列番号は、ノード番号を示す。D領域における行番号は、ストライプ位置番号を示す。ストライプ位置は、予め設定されたストライプサイズ毎の論理記憶領域である。ストライプ位置は、論理アドレス順に繰り返し配置される。行列の要素に示された数字は、ストライプタイプ番号を示す。P領域は、冗長コードを格納するノードとストライプタイプ番号を示す。
静的マッピングテーブル506において、D領域において同一のストライプタイプを持つ複数のノードのユーザデータが、対応するストライプ位置へ書き込まれる場合、P領域において当該ストライプタイプを持つ冗長コードのノードへ送信される。
静的マッピングテーブル506Aは正常時の4個のノードに対するマッピングを示す。静的マッピングテーブル506Bは減設後の3個のノードに対するマッピングを示す。
以上のように、分散型ストレージシステムは、各ノードのアプリケーションプログラム301によりアクセスされるデータをローカルのドライブ105へ格納する。これにより、アプリケーションプログラム301の性能を向上させることができる。更に、分散型ストレージシステムは、ノード101の障害が発生した場合、アプリケーションプログラム301のフェイルオーバ先ノードに、データを復旧することで、復旧したアプリケーションプログラム301に対して、ネットワークを介さないデータ読み出しを実現する。また、分散型ストレージシステムのノード数を変更する構成変更が行われた場合、分散型ストレージシステムは、変更後の構成に合わせて静的マッピングテーブル506を変更することで、冗長度を維持することができる。
また、ストレージプログラム302が冗長コードを生成することにより、ドライブ105が特別な機能を持つことなく、冗長化を行うことができる。
ライト要求を受けたノードは、転送先計算機を選択し、ライトデータに基づく転送データを転送先計算機へ送信する。複数の他のノード101から複数の転送データを夫々受信したノード101は、グループ情報に基づいて複数の転送データから冗長コードを生成する。複数のノード101の構成が変更される場合、ノード101は、ユーザデータを読み出し、ユーザデータに基づく変更後の冗長コードを格納する計算機である新冗長コード計算機を選択し、読み出されたユーザデータに基づく再転送データを新冗長コード計算機へ送信する。転送データは、ライトデータ、ライトデータの一部、中間コード、後述するClass1 Code等であってもよい。再転送データは、ユーザデータ、ユーザデータの一部、中間コード、Class1 Code等であってもよい。
図2は、分散型ストレージシステムのシステム構成例を示す。
ノード101は、例えば一般的なサーバ計算機の構成を有している。ノード101のハードウェア構成は特に限定されない。ノード101は、バックエンドネットワーク203を介して他のノード101とバックエンドポート208を通じて接続する。
複数のノード101は、ドメイン201を形成する。ドメイン201は、例えば地理的な地域と対応させてもよいし、仮想的又は物理的なバックエンドネットワーク203のトポロジと対応させてもよい。外部ネットワーク204は、複数のドメイン201を接続する。以下において、各ドメインは、地理的に互いに離れた複数のサイトの一つに対応づけられているとする。
ノード101の内部構成において、バックエンドポート208、プロセッサパッケージ207、ディスクドライブ(以下においてドライブとも呼ぶ)105が内部ネットワーク202を介して接続されている。プロセッサパッケージ207は、メモリ205、プロセッサ206(例えばCPU)を含む。
メモリ205は、プロセッサ206により実行するプログラムを格納する。メモリ205は、揮発性のDRAMであってもよいし、不揮発のSCM(Storage Class Memory)などを用いてもよい。
ドライブ105は、例えば、FC(Fibre Channel)、SAS(Serial Attached SCSI)、SATA(Serial Advanced Technology Attachment)などのインタフェースを持つハードディスクドライブや、SSD(Solid State Drive)などである。また、ドライブ105は、NAND、PRAM、ReRAMなどのSCMを用いてもよいし、揮発性のメモリを用いてもよい。ドライブ105は、揮発性メモリを使用する場合、バッテリによってストレージデバイスを不揮発化してもよい。
図3は、分散型ストレージシステムのソフトウェア構成例を示す。
ノード101上には、ハイパーバイザ304が動作しており、ハイパーバイザ304上で、仮想マシン(VM)307が動作している。仮想マシン上には、用途に応じ、ストレージプログラム302、アプリケーションプログラム301、管理プログラム303が動作している。
ハイパーバイザ304は、ハイパーバイザ304上で動作する複数の仮想マシン307に対し、プロセッサ206、メモリ205、ドライブ105、及びバックエンドネットワーク203といったハードウェア資源の割り当てを管理し、仮想マシン307からのハードウェア資源へのアクセス要求を実際にハードウェアへ渡すためのコンポーネントである。仮想マシン307上では、OS(Operating System)が動作しており、その上で各種プログラムを動作させている。仮想マシン307は、各種プログラムに対し、ハイパーバイザ304から提供された仮想的な資源の割り当てを管理し、これら資源へのプログラムからのアクセス要求をハイパーバイザ304へ渡すためのコンポーネントである。
ストレージプログラム302は、ドライブ105へのストレージI/Oを管理するためのプログラムである。ストレージプログラム302は、ハードウェア資源であるドライブ105を束ねて、仮想化し、仮想ボリューム107として、ハイパーバイザ304を介し、他の仮想マシン307に提供する。例えば、ストレージプログラム302は、仮想ボリューム107をハイパーバイザ304に、iSCSIターゲット(ドライブ105)として、認識させることで、ハイパーバイザ304上に当該仮想ボリュームをマウントし、他の仮想マシン307へ当該ドライブ(仮想ボリューム)を提供する。ストレージプログラム302は、他の仮想マシン307からストレージI/Oのリクエストを受信すると、ドライブ105に対してストレージI/Oを行い、結果を返却する。また、他のノード101上で動作するストレージプログラム302との間で、ネットワークパス306を介して通信し、例えば、データ保護やデータ移行といったストレージの機能を実現する。
アプリケーションプログラム301は、ユーザの業務に必要なプログラムである。アプリケーションプログラム301は、ストレージI/Oを行う際、ストレージパス305を介し、ハイパーバイザ304を介し、ストレージプログラム302が提供する仮想ボリュームへI/O要求を送信する。
管理プログラム303は、ハイパーバイザ304、仮想マシン307、及びノード101の構成を管理するプログラムである。管理プログラム303は、仮想マシン307とハイパーバイザ304を介してネットワークI/Oを発行し、他の仮想マシン307に対して管理オペレーション308を発行する。
全ての仮想マシン307は、他の仮想マシン307に対し、ハイパーバイザ304を介し、ネットワーク通信を行う。また、上述した、ストレージプログラム302、アプリケーションプログラム301、管理プログラムは303、仮想マシン307上ではなく、ハードウェア上に直接動作しているOSで動作させ、システムを実現してもよい。
図4は、分散型ストレージシステムにおける複数ノードのページマッピングの例を示す。
本実施例の分散型ストレージシステムは、複数の論理ボリュームでプール402A、402Bを構成し、さらにプール402A、402B上に構成される仮想ボリューム107A〜107Cをアプリケーションプログラム301に提供する。ノード101Aは、プール402Aから仮想ボリューム107A、107Bを提供する。ノード101Bは、プール402Bから仮想ボリューム107Cを提供する。
一つのプール402は、1又は複数論理ボリュームで構成される。この論理ボリュームをプールボリューム401とも呼ぶ。プールボリューム401の実体は、ドライブ105の記憶領域である。プールボリューム401に対し、他のノード101のドライブ105の記憶領域が割り当てられることも可能である。
ノード101Aは、二種類のプールボリューム401を保持する。一つは、自ノードのドライブ105の記憶領域からなるプールボリューム401Aである。プールボリューム401Aが格納するデータは、自ノードのドライブ105に配置される。もう一方は、他のノード101Bのボリューム401Bをストレートマッピングするプールボリューム401Cである。これにより、ボリューム401Cは、プールボリューム401Cとして管理される。ノード101Aは、プールボリューム401Cを介して、他ノードのプールボリューム401BのI/O処理を行うことができる。
この機能は、ストレージ外部接続機能として知られている。ノード101Aは、プールボリューム401Cへのアクセスに対し、プールボリューム401C内の論理アドレスであるプールボリュームアドレスを、他ノードのプールボリューム401Bのプールボリュームアドレスに変換し、変換されたアドレスを含むI/O要求を当該他ノードのノード101Bに送信する。ノード101Aは、自ノードのプールボリューム401Cと他ノードのプールボリューム401Bとの間のページマッピングテーブルを保持する。ノード101Bも同様に、ノード101A内のボリューム401Aをプールボリュームとして管理する。
ストレージプログラム302は、自ノードによるホストアクセス量が多い仮想ページを、自ノードのプールボリューム401にマッピングし、他ノードによるホストアクセス量が多い仮想ページを、当該他ノードのプールボリューム401にマッピングする。これにより、ホストへレスポンスタイムを短縮する。他ノードのプールボリューム401から割り当てられた仮想ページのデータは、他ノードのドライブ105に格納される。
性能のために、アプリケーションプログラム301は、自ノードのプールボリューム401Aにアクセスすることが望ましい。しかし、自ノードのプールボリューム401Aの容量が枯渇した場合や、他ノードの障害によりそのノードのアプリケーションプログラム301を自ノードで再起動した場合等に、このような他ノードのプールボリューム401Bを用いることができる。このように、ストレージプログラム302がアプリケーションプログラム301へ仮想ボリュームを提供することにより、ドライブ105の容量の管理を容易にすることができる。
図5は、分散型ストレージシステムの制御のための情報を示す。
メモリ205は、保護レイヤ情報501、仮想化プロビジョニング情報502、キャッシュ情報503、ストレージ構成情報504、ストレージプログラム302を格納する。
保護レイヤ情報501は、データ保護に関する情報である。仮想化プロビジョニング情報502は、仮想ボリュームのプロビジョニングに関する情報である。キャッシュ情報503は、ストレージプログラムのキャッシュに関する情報である。ストレージ構成情報504は、分散型ストレージシステムの構成に関する情報である。
ストレージプログラム302は、ドライブ105へのストレージI/Oを管理するためのプログラムである。
保護レイヤ情報501は、保護レイヤ#1、#2、#3にそれぞれ対応する静的マッピングテーブル505、506、507を含む。保護レイヤ情報501は、さらに、ログ構造化マッピングテーブル508と、ローカル領域制御テーブル509とを含む。
本実施例において、保護レイヤ#1は、ノード101内の複数のドライブ105にデータを分散させることで保護する。保護レイヤ#2は、サイト内の複数のノード101にデータを分散させることで保護する。保護レイヤ#2は、複数のサイトにデータを分散させることで保護する。そのため、保護レイヤ#1、#2、#3をそれぞれ、ノード保護レイヤ、サイト保護レイヤ、ジオ保護レイヤと呼ぶことがある。なお、保護レイヤの数は、3でなくてもよい。
仮想化プロビジョニング情報502は、ページマッピングテーブル510を含む。
ストレージ構成情報504は、仮想ボリューム管理テーブル511とプールボリューム管理テーブル512と、ドライブ管理テーブル513とを含む。ストレージ構成情報504は、さらに、ドライブ状態管理テーブル514と、ノード状態管理テーブル515と、サイト状態管理テーブル516とを含む。
メモリ205は、この図に示す情報に加え、OS、インタフェースプログラムを含む、各種プログラムを格納する。メモリ205は、さらに、業務を実行するアプリケーションプログラム301を格納することがある。メモリ205に格納されている情報の全部又は一部のバックアップ517は、自ノード又は他ノードのドライブ105に同期又は非同期に保存されてもよい。
以下において、ノード101が保持する情報を示すテーブルの構成例を説明する。各テーブルにおいて、一部のエントリのみが示されている。各テーブルにおいて、空白のセルは、データの記載が省略されたセルである。テーブルのセルにおいて、「0x」は、16進数の数字を示す。ドライブ番号はノード内で一意であり、ノード番号はサイト内で一意である。サイト番号はシステム内で一意である。
図6は、保護レイヤ#2の静的マッピングテーブル506を示す。
データ数(ストライプ数)はd、パリティ数(冗長コード数)はp、サイクル数(ユーザデータ部分の行列の行数)はc、と表される。この図の例において、cは4、dは4、pは2(4D2P)である。即ち、データを格納するD領域601は4個のストライプサイズを有し、冗長コードを格納するP領域602は2個のストライプサイズを有する。静的マッピングテーブル506のマッピングは、プールボリュームアドレスに対してサイクル数毎に繰り返される。
ストライプタイプは、ストライプのクラスである。ストライプタイプ内の複数のストライプから1又は複数の冗長コードが生成される。ストライプは、予め定められたサイズのデータユニットである。この図の例においては、二つの冗長コードが生成され、それぞれ異なるノード101に格納される。同一ノードに複数の同一ストライプタイプが配置されないことを条件として、ストライプの数と冗長コードの数は、任意に設計することができる。冗長コードは、例えば、Erasure Codingにより生成される。これにより、分散型ストレージシステムは、構成変更前の静的マッピングテーブルの冗長度を変えることなく、構成変更後の静的マッピングテーブルを生成することができる。
この図において、例えば、ノード番号1、2、3、7のノードにおけるストライプ位置番号0のストライプは、ストライプタイプ番号0のストライプタイプに属する。さらに、ストライプタイプ番号0のストライプタイプに属する冗長コードノードのノード番号は0、5である。即ち、ノード番号0、5のノードは、ストライプタイプ番号0の冗長コードを格納する。
この図の例において、D領域601におけるストライプは、8個のノードに均等に分散される。ノードの記憶容量によって、ストライプタイプのデータノード数を変化させてもよい。また、ノードの総数が少ない場合や端数が発生する場合に、一部のストライプタイプの冗長コード数を減らしてもよい。異なるストライプタイプは異なるアルゴリズムにより冗長化を行ってもよい。また、cはdと異なっていてもよい。
冗長コードノードは、当該ストライプタイプの全てのデータノードと異なるノードから選択される。冗長コードノードには、データノードからのデータライトが集中する。したがって、冗長コードができるだけ均等に配置されるように、冗長コードノードが選択される。これにより、ドライブ105がSSDである場合に、ノード101の寿命を平準化できる。ノード間において寿命が偏った場合には、平準化するように冗長コードP領域602の配置を変更してもよい。
この図の例において、ストライプタイプは、プールボリュームアドレスにより決定される。これにより、一つのプールボリューム内の複数の領域は、複数のストライプタイプに分類される。また、冗長コードは、ストライプのボリューム内アドレスに依存しない。冗長コードノードは、同一ストライプタイプのデータから、d個の任意のデータを選択し、選択したデータから冗長コードを生成する。
保護レイヤ#2における、ホストからのライトデータに対する冗長コードノードは、以下の方法で決定する。まず、ホストからのライト要求を受信したノードは、自ノード番号を特定する。次に、ライト要求により指定された論理アドレスから、ライト先のプールボリュームアドレスであるライト先アドレスを特定し、以下の計算式により、ストライプ位置番号を決定する。
ストライプ位置番号 = (ライト先アドレス値 ÷ ストライプサイズ)mod c
自ノード番号とストライプ位置番号が決定されると、当該ノードは、当該保護レイヤの静的マッピングテーブル506を参照し、ストライプタイプ番号を特定し、冗長コードノードを決定する。
保護レイヤ#1、3の静的マッピングテーブル505、507は、保護レイヤ#2と同様の構成である。保護レイヤ#1では、ノード番号の代わりにドライブ番号が用いられる。保護レイヤ#3では、ノード番号の代わりにサイト番号が用いられる。
静的マッピングテーブル506を、ストライプタイプ番号毎にまとめると、ストライプタイプテーブル506sのように表すことができる。ストライプタイプテーブル506sは、一つのサイト内のノード101間で共有される情報である。ストライプタイプテーブル506sは、ノードストライプタイプ番号毎に、対応するストライプ(ユーザデータ)を格納するデータノードのノード番号と、ストライプから生成される冗長コードを格納する冗長コードノードのノード番号との、関係を示す。ノードストライプタイプ番号は、ノード間のストライプタイプの識別情報である。
図7は、保護レイヤ情報501におけるログ構造化マッピングテーブル508を示す。
ログ構造化マッピングテーブル508は、データマッピングテーブル701、冗長コードマッピングテーブル702、及び逆マッピングテーブル703を含む。
データマッピングテーブル701は、当該テーブル701を保持するノード101が自ノードのドライブ105に格納しているユーザデータを管理する。データマッピングテーブル701は、ユーザデータを格納する論理記憶領域毎のエントリを有する。各エントリは、論理ドライブ番号と、論理アドレスと、物理ドライブ番号と、物理アドレスと、物理記憶領域のサイズとを含む。
データマッピングテーブル701は、ノード101は、ユーザデータのプールボリュームアドレス(論理アドレス)から、当該データを格納するドライブ105(物理ドライブ)内のドライブアドレス(物理アドレス)を知ることができる。つまり、データマッピングテーブル701は、プールボリュームを示す論理ドライブ番号と、当該プールボリュームにおけるユーザデータのプールボリュームアドレス(論理アドレス)と、ドライブ105を示す物理ドライブ番号と、当該ドライブ内の物理記憶領域のドライブアドレス(物理アドレス)を対応付ける。データマッピングテーブル701は、物理記憶領域のサイズを格納する。例えば、データマッピングテーブル701において、論理ドライブ番号0x0000、論理アドレス0x0000のデータは、自ノードのドライブの物理ドライブ番号0x0010、物理アドレス0x0800に、データ長512Bytesで格納されていることを示す。データマッピングテーブル701は、さらに、格納しているデータの状態を示す情報を格納する。例えば、状態情報は、データが対応する冗長コードノードにデータを転送済であるか否かを示す。後述するように、ライトデータは、Sync/Asyncの設定に従い、ライトデータのホストライト処理と同期又は非同期に、冗長コード生成のために冗長コードノードに転送される。
冗長コードマッピングテーブル702は、当該テーブル702を保持するノード101が自ノードのドライブ105に格納している冗長コードを管理する。管理する冗長コードは、サイト間冗長コード、ノード間冗長コード、及びノード内冗長コードを含む。冗長コードマッピングテーブル702は、冗長コードを格納する論理記憶領域毎のエントリを有する。各エントリは、サイト番号と、ノード番号と、論理ドライブ番号と、論理アドレスと、物理ドライブ番号と、物理アドレスと、物理記憶領域のサイズとを含む。
これにより、ノード101は、ユーザデータを格納するプールボリュームアドレスから、当該ユーザデータの冗長コードの物理アドレスを知ることができる。例えば、冗長コードマッピングテーブル702において、サイト番号0、ノード番号2、論理ドライブ番号0x0000、論理アドレス0x0000の冗長コードは、自ノードのドライブの物理ドライブ番号0x0003、物理アドレス0x2000に格納されている。つまり、他ノードのプールボリュームにおけるユーザデータのプールボリュームアドレス(論理アドレス)と、自ノードに格納した冗長コードのドライブ105の物理記憶領域のドライブアドレス(物理アドレス)を対応付ける。
逆マッピングテーブル703は、冗長コードの格納位置から当該冗長コードの基になるユーザデータの格納位置を知る逆変換テーブルである。ノード101は、ユーザデータに障害が発生したときは、当該テーブル703を参照し、復旧に必要なデータを特定する。逆マッピングテーブル703は、冗長コードを格納する論理記憶領域毎のエントリを有する。各エントリは、冗長コードを格納する論理記憶領域の、論理ドライブ番号、論理アドレスと、当該冗長コードに対応するユーザデータを格納する論理記憶領域の、サイト番号、ノード番号、論理ドライブ番号、論理アドレス、サイズを含む。各エントリは更に、冗長コードの生成に用いられたライトデータが有効か無効かを示すフラグを含んでもよい。
例えば、逆マッピングテーブル703において、サイト番号0、ノード番号0、物理ドライブ番号0x0000、物理アドレス0x0000に格納された冗長コードは、サイト番号0、ノード番号1、物理ドライブ番号0x0000、物理アドレス0x2000のデータと、サイト番号0、ノード番号2、物理ドライブ番号0x0001、物理アドレス0x1300のデータと、サイト番号0、ノード番号3、物理ドライブ番号0x0004、物理アドレス0x0000のデータと、サイト番号0、ノード番号7、物理ドライブ番号0x0010、物理アドレス0x0400のデータとから、生成されたことを示している。
本実施例の分散型ストレージシステムは、ログ構造化方式でデータを格納する。ログ構造化方式は、プールボリューム内の論理アドレスのデータが新たなデータで更新される場合に、物理アドレスのデータを新たなデータで更新することなく、新たなデータを新たな物理アドレスに追記する。したがって、一つの論理アドレスのデータとして、旧データと新データとが物理記憶領域に格納され得る。また、不要となった旧データは、適宜消去される。ログ構造化方式により、冗長コードの更新のための読み出しが不要となり、ドライブ105へのライト処理の時間を短縮できる。なお、分散型ストレージシステムは、ログ構造化方式を実装しなくてもよい。
図8は、ローカル領域制御テーブル509を示す。
この図において、矢印はポインタを表す。ローカル領域制御テーブル509は、有効リスト801、無効リスト802、フリーリスト803、ローカル領域量テーブル804を含む。ローカル領域制御テーブル509は、自ノード内のドライブ105内の領域であるローカル領域を管理する。リスト801〜803において、各ローカル領域はドライブ番号及びドライブ内のLBA(Logical Block Address)で示される。
有効リスト801は、有効領域のリストである。有効領域は、最新のユーザデータ又は最新の冗長コードを格納する領域である。この図の例において、ドライブ番号0のドライブ105において、LBA0、4、5のブロックは、それぞれ、有効データを格納している。
無効リスト802は、無効領域のリストである。無効領域は、古いユーザデータ又は古い冗長コードを格納する領域である。古く、無効な冗長コードは、当該冗長コードの生成に使用されている全ストライプが無効である冗長コードである。この図の例において、ドライブ番号0のドライブ105において、LBA1、3、7のブロックは、それぞれ、無効データを格納している。フリーリスト803は、未使用領域のリストである。
ローカル領域量テーブル804は、複数のデータタイプの夫々のエントリを有する。ドライブ105に格納されるデータは、冗長コードタイプ及びライトデータタイプのいずれか一つのデータタイプに分類される。さらに、冗長コードタイプは、ノード冗長コード、サイト冗長コード、ジオ冗長コードの各タイプ分類され、ライトデータタイプは、各サイトストライプタイプに分類される。
各エントリは、目標使用量、実際使用量、及び有効領域の量を管理する。目標領域量は予め設定される。実際使用量は、対応する種類に割り当てられた有効領域及び無効領域の合計サイズを示す。有効領域量は、対応する種類に割り当てられた有効領域の合計サイズを示す。ストレージプログラム302は、各データタイプの量を個別に管理することで、各データタイプのデータ量を適切に制御できる。ストレージプログラム302は、ホストI/Oと同期又は非同期に、ローカル領域制御テーブル509を更新する。
図9は、仮想化プロビジョニング情報502に含まれる情報を示す。
仮想化プロビジョニング情報502は、ページマッピングテーブル510を含む。ページマッピングテーブル510は、仮想ボリューム内の仮想ページ毎のエントリを有する。各エントリは、仮想ボリューム番号と、当該仮想ボリューム内の仮想ページの論理アドレスと、当該仮想ページのサイズを示す範囲と、プールボリューム番号と、当該プールボリューム内の論理ページのプールボリュームアドレスとの対応関係を保持する。
本実施例において、ページマッピングテーブル510は、当該テーブル510を保持するノード101により提供される仮想ボリュームの情報を保持している。仮想ページには、前述の自ノード101Aのプールボリューム401Cを介して又は直接に、他ノード101Bのプールボリューム401Bの論理ページが割り当てられることがある。ページマッピングテーブル510は、仮想ページと、自ノード101Aのプールボリューム401A又は他ノード101Bのプールボリューム401Bとの関係を示す。ページマッピングテーブル510は、仮想ボリューム内の仮想ページの先頭LBAとアドレス範囲と、仮想ページの先頭LBAに対応する、プールボリューム内の論理ページの先頭LBAを保持する。
図10は、ストレージ構成情報504の第一部分を示す。
第一部分に含まれる各テーブルは、異なる記憶リソース種別の管理情報を示す。
仮想ボリューム管理テーブル511は、仮想ボリュームの情報を示す。本実施例において、仮想ボリューム管理テーブル511は、当該情報を保持するノード101が提供する仮想ボリュームの情報を示す。ノード101は、提供する仮想ボリュームへのアクセスを受け付ける。仮想ボリューム管理テーブル511は、障害発生にそなえ、自ノードがオーナではない仮想ボリュームの情報を保持してもよい。
仮想ボリューム管理テーブル511は、仮想ボリューム毎のエントリを有する。各エントリは、仮想ボリューム番号、当該仮想ボリュームのサイズ(容量)、当該仮想ボリュームの提供先のノード(オーナノード)のノード番号のリストを含む。仮想ボリュームのサイズは、割り当てられている論理ページの総量ではなく、仮想ボリュームの仮想容量(最大容量)を示す。さらに、各エントリは、冗長コードの生成及び書き込みが、ライトデータの自ノードのストレージデバイスへの書き込みと同期か非同期かを示す情報を含む。同期/非同期の情報は、保護レイヤ毎に与えられる。例えば、保護レイヤが保護レイヤ#3(ジオ保護レイヤ)である場合、同期に設定されるとレイテンシが増加するため、非同期に設定される。
プールボリューム管理テーブル512は、プールボリュームの情報を示す。本実施例において、プールボリューム管理テーブル512は、当該テーブル512を保持するノード101が提供するプールボリュームと、他ノード101が提供するプールボリュームとを示す。プールボリューム管理テーブル512は、プールボリューム毎のエントリを有する。各エントリは、プールボリューム番号、当該プールボリュームのサイズ(容量)、当該プールボリュームを提供するノードのノード番号の情報を含む。
ドライブ管理テーブル513は、各プールボリュームに割り当てられるドライブを示す。本実施例において、ドライブ管理テーブル513は、当該テーブル513を保持するノード101に含まれる自ノードのドライブ105の情報を示す。
ドライブ管理テーブル513は、プールボリューム毎のエントリを有する。各エントリは、プールボリューム番号、当該プールボリュームに用いられているドライブの種類(SSDやNL−SASドライブなど)、当該プールボリュームのためにストライピングしているドライブ番号の組(RAIDを構成するドライブ番号の組)、そのドライブのサイズ(容量)を含む。ストライピングを実施しない場合、一つのプールボリュームに対して一つのドライブのみが割り当てられる。なお、一つのドライブ内の複数の領域は、互いに異なるプールボリュームに割り当てられ得る。
なお、ストレージ構成情報504は、他ノードのプールボリュームを自ノードのプールボリュームとして管理するための外部接続管理情報を含んでいてもよい。
図11は、ストレージ構成情報504の第二部分を示す。
第二部分に含まれる各テーブルは、分散型ストレージシステムにおける障害管理情報を示す。
ドライブ状態管理テーブル514は、自ノード内のドライブ105毎のエントリを有する。各エントリは、ドライブ番号、当該ドライブの状態、当該ドライブのエラーカウント、当該ドライブの冗長コード変更ポインタを含む。自ノードが属するサイトを、自サイトと呼ぶ。
ノード状態管理テーブル515は、自サイトにおける他ノード毎のエントリを有する。各エントリは、ノード番号、当該ノードの状態、当該ノードのエラーカウントを含む。
サイト状態管理テーブル516は、分散型ストレージシステムにおけるサイト毎のエントリを有する。各エントリは、サイト番号、当該サイトの状態、当該サイトのエラーカウントを含む。本実施例において、自ノードは他サイトの代表ノードとのみ通信できるとする。そのため、代表ノードのエラーは、当該サイトのエラーを意味する。
ノード101のプロセッサ206は、自ノードのドライブ105又は他ノード101との通信においてエラーを検出すると、保持する管理情報514〜516においてエラーカウントをインクリメントする。
いずれかのハードウェアリソース(ドライブ、ノード又はサイト)におけるエラーカウントが、予め設定された第1閾値に達すると、プロセッサ206は、当該リソースの状態を正常状態から警告状態に変化させる。さらに、エラーカウントが、予め設定された第2閾値に達すると、プロセッサ206は、当該リソースの状態を警告状態から閉塞状態に変化させる。警告状態と閉塞状態は、異常状態である。
図12は、キャッシュ情報503を示す。
ノード101は、それぞれ、固有のキャッシュ情報503を保持する。キャッシュ情報503は、データダーティキュー1201、コードダーティキュー1202、中間ダーティキュー1203、クリーンキュー1204、フリーキュー1205、キャッシュビットマップテーブル1206を含む。ダーティキュー1201、1202、1203は、ドライブ105に未反映なキャッシュ上のデータを示す。
キューにおけるセルはエントリを示し、エントリの情報は、キャッシュビットマップテーブル1206内の情報に対応し、キャッシュビットマップテーブル1206から選択された情報を格納する。キュー内の矢印は、エントリ間をつなぐポインタを表す。黒丸は始点である。
データダーティキュー1201は、自ノードのドライブ105に格納されるホストからのライトデータを示す。データダーティキュー1201は、ドライブストライプタイプ番号とデータの格納位置である自ノードのドライブ番号との組毎のキューを含む。ドライブストライプは、保護レイヤ#1のストライプである。
コードダーティキュー1202は、冗長コード生成のために他ノードから受信したデータを指す。当該データ及び当該データから生成される冗長コードは、ダーティデータである。コードダーティキュー1202は、ストライプタイプとデータ位置の組毎のキューを含む。ノード101は、複数保護レイヤに属するため、異なる保護レイヤのストライプタイプのキューが用意される。即ち、コードダーティキュー1202は、ノードストライプタイプと冗長コードの格納位置のノード番号との組毎のキュー、サイトストライプタイプと冗長コードの格納位置のサイト番号との組毎のキューを含む。ノードストライプは、保護レイヤ#2のストライプである。サイトストライプは、保護レイヤ#3のストライプである。
例えば、コードダーティキュー1202のうち「Stripe Type#0、Node#0」のキューは、ノードストライプタイプ番号0のノードストライプに属し、ノード番号0のノードに格納されるデータのためのキューである。
中間ダーティキュー1203は、ドライブ105に未反映なキャッシュ上の中間コードを指す。中間コードは、新データと旧データから生成されるデータである。例えば、中間コードは、新データと旧データのxorで計算される。即ち、中間コードは、新データと旧データの差分データである。ノード101は、中間コードを使用してドライブ105に格納されている旧データの冗長コードを、新データの冗長コードに更新することができる。中間コードの使用方法の詳細は後述する。
中間ダーティキュー1203の構成は、コードダーティキュー1202と同様である。つまり、中間ダーティキュー1203は、ストライプタイプとデータ位置の組毎のキューを含む。ノード101は、複数保護レイヤに属するため、異なる保護レイヤのストライプタイプのキューが用意される。
クリーンキュー1204は、ドライブ105に反映済みのキャッシュ上のデータを指す。フリーキュー1205は、使用されていないキャッシュの領域を指す。
キャッシュビットマップテーブル1206は、キャッシュ内の所定サイズの一スロット毎のエントリを有する。各エントリは、データの論理アドレス、スロットのキャッシュアドレス(メモリ205上の位置)、当該スロットのサイズ、当該スロット内のデータがダーティであるか否かを示すダーティビットマップ、及び当該スロット内のデータがステージングされたか否かを示すステージングビットマップを含む。
論理アドレスは、ログ構造化マッピングテーブル508を参照して説明したストライプの論理アドレスが対応する。他ノード101から転送されたストライプの論理アドレスは、例えば、サイト番号、ノード番号、LDEV番号、及びLBA、オフセットを含む。ダーティビットマップは、その領域のどの部分がダーティ状態かを示す。ステージングビットマップは、当該領域のどの部分がキャッシュ上にステージング済みかを示す。たとえば、1ビットはドライブ105の1ブロックに対応する。
図13は、管理プログラム303の制御のための情報を示す。
システム構成情報1301は、システムの構成に関する情報である。リソース監視情報1302は、システムのプログラムが使用する仮想的又は物理的なハードウェア資源の利用状況に関する情報である。
システム構成情報1301は、物理マシンの構成情報を示す物理マシン構成管理テーブル1303、仮想マシンの構成情報を示す仮想マシン構成管理テーブル1304、仮想マシンの物理マシンへの配置情報を示す仮想マシン配置管理テーブル1305を含む。
リソース監視情報1302は、プロセッサ206、メモリ205、ドライブ105それぞれの利用状況の情報を示すCPU/メモリ/ストレージ管理テーブル1306と、ネットワークの利用状況の情報を示すネットワーク管理テーブル1307を含む。
上述した情報の全部又は一部のバックアップ517は、ドライブ105に同期又は非同期に保存されてもよい。
図14は、システム構成情報1301に含まれる情報を示す。
物理マシン構成管理テーブル1303は、分散型ストレージシステム内の物理マシン(ノード101)毎のエントリを有する。各エントリは、物理マシン番号、最大資源、状態情報を含む。物理マシン番号は、物理マシンに割り当てられ、システム内で一意な番号である。最大資源は、物理マシンが保有するハードウェア資源の最大数(量)を示しており、CPU、メモリ、ネットワーク、ストレージ、それぞれの情報を含む。状態情報は、正常、警告、障害、増設中、及び減設中といった状態を含む。正常状態は、当該物理マシンが正常に動作していることを示し、警告状態は、当該物理マシンの資源利用率が高く規定の閾値を超過した状態を示し、障害状態は、当該物理マシンに障害が発生し、動作していないことを示す。さらに、増設中状態は、当該物理マシンを増設対象物理マシンとして、サイト201に追加(加入)中である状態を示し、減設中状態は、当該物理マシンを増減設対象物理マシンとして、サイト201から除外(離脱)中である状態を示す。
増設中状態は、具体的には、分散型ストレージシステムにおける、増設先のサイト保護レイヤに、増設対象物理マシン(ノード101)を追加途中であることを示す。更に増設中状態は、各物理マシン(ノード101)上のストレージプログラム302は、既存の静的マッピングテーブルに新しいノード番号の列を追加した新しい静的マッピングテーブルを生成し、当該静的マッピングテーブルに基づき、冗長コードを再生成中であることを示す。減設中状態は、具体的には、分散型ストレージシステムにおける、減設先のサイト保護レイヤから、減設対象物理マシン(ノード101)を除外途中であることを示す。更に減設中状態は、各物理マシン(ノード101)上のストレージプログラム302は、既存の静的マッピングテーブルから減設対象ノードのノード番号の列を除外した新しい静的マッピングテーブルを生成し、当該静的マッピングテーブルに基づき、冗長コードを再生成中であることを示す。
仮想マシン構成管理テーブル1304は、分散型ストレージシステム内の仮想マシン毎のエントリを有する。各エントリは、仮想マシン番号、最大資源、状態情報を含む。仮想マシン番号は、仮想マシン307に割り当てられる、システム内で一意な番号である。最大資源は、仮想マシンが保有するハイパーバイザ304により、提供される仮想的なハードウェア資源の最大数(量)を示しており、CPU、メモリ、ネットワーク、ストレージ、それぞれの情報を含む。状態情報は、正常、警告、及び障害といった状態を含む。正常状態は、当該仮想マシンが正常に動作していることを示し、警告状態は、当該仮想マシンの資源利用率が高く規定の閾値を超過した状態を示し、障害状態は、当該仮想マシンに障害が発生し、動作していないことを示す。
仮想マシン配置管理テーブル1305は、分散型ストレージシステム内の仮想マシン毎のエントリを有する。各エントリは、仮想マシン番号、物理マシン番号を含む。仮想マシン番号は、配置される仮想マシンの番号を示しており、物理マシン番号は、当該仮想マシンを配置する先の物理マシンを示している。
図15は、リソース監視情報1302に含まれる情報を示す。
CPU/メモリ/ストレージ監視テーブル1306は、仮想マシン毎のエントリを有する。各エントリは、仮想マシン番号と使用資源を含む。仮想マシン番号は、仮想マシン307に割り当てられる、システム内で一意な番号である。使用資源は、仮想マシンが現在、利用している資源の情報を示す。当該情報が予め設定された閾値を超過した場合、管理プログラム303は、仮想マシン構成管理テーブル1304の状態情報を、警告に更新する。
ネットワーク監視テーブル1307は、仮想マシン毎のエントリを有する、各エントリは、一つのソース仮想マシン番号と、幾つかのターゲットマシン番号とを含む。ソース仮想マシン番号は、ネットワークI/Oの送信元となる仮想マシン番号を示しており、ターゲット仮想マシン番号は、ネットワークI/Oの受信先となる仮想マシンの番号を示している。ネットワーク監視テーブル1307は、仮想マシン間のネットワークI/Oの通信関係を示したマトリクスであり、後述するように、管理プログラム303は、仮想マシン間で互いに大量にネットワークI/Oをしている仮想マシン群を検出し、当該仮想マシン群を、同一物理マシンに配置することで、物理マシン外へのネットワークI/O量を低減させることができる。
図16は、ストレージプログラム302及び管理プログラム303の内部構成を示す。
以下で説明する各種プログラムは、プロセッサ206により実行される。ストレージプログラム302は、メイン処理プログラム1601、ホストI/O処理プログラム1602、周期処理プログラム1603、及びイベント処理プログラム1604を含む。
ホストI/O処理プログラム1602は、リード処理プログラム1605、コレクションリード処理プログラム1606、同期ライト処理プログラム1607、コレクションライト処理プログラム1608を含む。
メイン処理プログラム1601は、ストレージプログラム302が起動したとき、最初に呼び出されるプログラムであり、処理内で、ホストI/O処理プログラム1602、周期処理プログラム1603、イベント処理プログラム1604を呼び出す。メイン処理プログラムは、ユーザや管理プログラム303から、明示的に終了指示を受けるまで、上記処理をループ実行する。
ホストI/O処理プログラム1602は、ホストから仮想ボリューム107に対するI/O要求(リード要求又はライト要求)を受領した場合に、そのI/O要求を処理するプログラムであり、I/O要求の内容に応じて、リード処理プログラム1605、コレクションリード処理プログラム1606、同期ライト処理プログラム1607、コレクションライト処理プログラム1608の何れかを実行する。I/O要求が複数ある場合、ホストI/O処理プログラム1602は、全I/O要求を処理し終えるまで、ループして実行してもよい。
リード処理プログラム1605は、ホストからの要求が、リード要求であった場合に実行し、ホストから指定されたデータをドライブ又はキャッシュから読み出し、返却する。
コレクションリード処理プログラム1606は、リード処理時に、障害ノード101上のデータがリード対象である場合に実行し、障害データを復旧した後、ホストへデータを返却する。
同期ライト処理プログラム1607は、ホストからの要求が、ライト要求であった場合に実行し、ホストから指定されたアドレスにデータを書き込む。
コレクションライト処理プログラム1608は、ライト処理時に、障害ノード上のデータがライト対象である場合に実行し、ホストから書き込まれたデータの冗長コードを生成するため、冗長コードノードにデータを転送する。
周期処理プログラム1603は、デステージ処理プログラム1609、非同期ライト処理プログラム1610、容量枯渇管理処理プログラム1611を含む。周期処理プログラム1603は、周期処理として登録されたプログラムを一定周期で実行する。周期処理プログラム1603は、周期処理として登録された他のプログラムを実行してもよい。
デステージ処理プログラム1609は、キャッシュ上にありドライブ105に未反映であるデータ(ダーティデータ)を、ドライブ105に格納するプログラムである。
非同期ライト処理プログラム1610は、Asyncが指定された保護レイヤで、まだ他ノードに転送されていないデータを他ノードに転送する。
容量枯渇管理処理プログラム1611は、ドライブ105上のデータ量が、予め設定された目標使用量を超えている場合に、ガベージコレクション要求を発行し、不要なデータの消去を試みる。これにより、ストレージプログラム302は、必要なデータを限られた領域に格納できる。
イベント処理プログラム1604は、データ移行処理プログラム1612、データコピー処理1613、アドレス解決処理1614、構成変更処理プログラム1615、冗長化先変更処理プログラム1616、ガベージコレクション処理プログラム1617、データ再転送処理プログラム1618、データ消去処理プログラム1619を含む。イベント処理プログラム1604は、他ノードからのネットワークを介したイベント要求に対し、要求内容に応じた各種プログラムを実行し、実行結果を返却する。例えば、他ノードからガベージコレクションの要求を受信した場合、イベント処理プログラム1604は、ガベージコレクション処理プログラム1617を実行し、実行結果をイベント送信元の他ノードに返却する。
データ移行処理プログラム1612は、管理プログラム303からの要求により、実行するプログラムであり、ストレージプログラム302が提供する仮想ボリューム107内のデータを、別の仮想ボリューム107にコピーし、その後、ホストへ、コピー先の仮想ボリューム107を、新しいアクセス先として、提供しなおすプログラムである。
データコピー処理プログラム1613は、データ移行処理プログラム1612により、呼び出されるプログラムであり、移動元の仮想ボリューム107から移動先の仮想ボリューム107へのコピーを行うプログラムである。
アドレス解決処理プログラム1614は、データコピー処理プログラム1613により、呼び出されるプログラムであり、他ノードの仮想ボリュームを外部接続している状態で、当該他ノードの仮想ボリュームにアクセスする際、他ノードに、アクセス先のデータの物理アドレスを問合せるプログラムである。これにより、ストレージプログラム302は、リード要求を他ノードへネストして発行する必要がなくなり、ネットワーク通信量を削減できる。
構成変更処理プログラム1615は、管理プログラム303からの要求により、実行するプログラムであり、保護レイヤへのノードの増設、及び減設を実行する。
冗長化先変更処理プログラム1616は、構成変更処理プログラム1615により、呼び出されるプログラムであり、構成変更の情報に基づき、各ノード101内のユーザデータの冗長コードを、構成変更後の新しい静的マッピングテーブルに基づき、再生成するプログラムである。
ガベージコレクション処理プログラム1617は、容量枯渇管理処理プログラム1611からの要求に応じて呼び出され、不要なデータで生成された冗長コードを消去し、容量枯渇を回避する。
データ再転送処理プログラム1618は、他ノードのガベージコレクション処理プログラム1617からの要求に応じて自ノードの必要なデータを冗長コードノードへ再転送する。これにより、新しく冗長コードを生成することで、不要なデータを含む古い冗長コードを消去することができ、ドライブの容量枯渇を回避できる。
データ消去処理プログラム1619は、他ノードのガベージコレクション処理プログラム1617からの要求に応じて自ノードの不要なデータを消去する。
管理プログラム303は、状態管理処理プログラム1620、移動先選定処理プログラム1621を含む。
図17は、一時配置パタンテーブル3000を示す。
一時配置パタンテーブル3000は、配置パタンと、ネットワーク通信コストとを含む。配置パタンは、ノード101である物理マシン毎のエントリを有する。各エントリは、物理マシン番号と、当該物理マシンに配置される幾つかの仮想マシン番号とを含む。ネットワーク通信コストは、仮想マシン同士のネットワーク通信のうち、別の物理マシンに配置された仮想マシンとのネットワーク通信コスト(通信帯域)である。
以下、分散型ストレージシステムの動作について説明する。
まず、正常時の分散型ストレージシステムの動作について説明する。
図18は、ストレージプログラム302が実行するリード処理のフローチャートを示す。
本処理は、ホスト(例えばアプリケーションプログラム301)からリード要求が発行された場合に実行される。
まず、ストレージプログラム302は、受信したリード要求の指定アドレスで示されるアクセス先仮想ページに、プールボリューム内の論理ページが割り当て済であるか否かを、ページマッピングテーブル510を参照して判定する(S1801)。指定アドレスは、例えば、仮想ボリューム番号及びLBAで指定される。LBAは、開始LBA及びブロック長で表されてもよい。具体的には、ストレージプログラム302は、ページマッピングテーブル510を参照し、指定アドレスから、対応するプールボリューム番号とLBAを検索する。ストレージプログラム302は、対応するアドレス情報の有無で、仮想ページに論理ページが未割り当てか否かを判定する。
論理ページが未割り当てである場合(S1801:N)、ストレージプログラム302は、排他が必要か否か判定する(S1805)。ストレージプログラム302は、仮想ボリューム管理テーブル511を参照し、仮想ボリュームのオーナノードが自ノードのみである場合に排他不要と判定する。
排他が必要の場合(S1805:Y)は、ストレージプログラム302は、排他を取得して(S1806)、再度、仮想ページにプールボリューム内の論理ページが割り当て済であるか否かを判定する(S1807)。排他方法の一例として、ストレージプログラム302は、リードアドレスから一意に決まる代表ノードを、ハッシュ関数を使用して特定し、代表ノードに調停を依頼し、代表ノードが調停を行う。
論理ページが割り当て済である場合(S1807:Y)、ストレージプログラム302は、排他を解除し(S1814)、ステップS1802に進む。論理ページが未割り当てである場合(S1807:N)、ストレージプログラム302は、ゼロデータを返し(S1808)、ステップS1805の判定と同様に排他要否を判定する(S1809)。排他が必要である場合(S1809:Y)には、排他がすでに取得されているため、ストレージプログラム302は、排他を解放する(S1810)。
ステップS1801において論理ページが割り当て済であり(S1801:Y)、且つ仮想ページに自ノードのプールボリューム内の論理ページが割り当てられている場合(S1802:Y)、ストレージプログラム302は、自ノードのキャッシュ領域を確保し(S1803)、当該プールボリュームからデータをリードして、当該リードデータをホストへ返す(S1804)。ストレージプログラム302は、プールボリューム管理テーブル512及び外部接続管理情報を参照して、仮想ページに自ノードのプールボリューム内の論理ページが割り当てられているか否か判定する。
仮想ページに、自ノードのプールボリューム401Aを介して他ノード101のプールボリューム401B内の論理ページが割り当てられる場合、当該仮想ページに他ノードのプールボリューム内の論理ページが割り当てられていると判定される。
キャッシュ領域の確保において、ストレージプログラム302は、キャッシュ情報503を参照して、対象論理アドレスに対応付けられているキャッシュ領域を特定する。対応するキャッシュ領域が存在しない場合、ストレージプログラム302は、フリーキュー1205から新たな領域を確保する。フリーキュー1205が空の場合、ストレージプログラム302は、クリーンキュー1204から新たな領域を確保する。クリーンキュー1204が空の場合、ストレージプログラム302は、ダーティキュー1201、1202又は1203内の領域をデステージしてフリー領域に変化させる。
アクセス先仮想ページに他ノードのプールボリューム401B内の論理ページが割り当てられている場合(S1802:N)、リード要求の転送先となる当該他ノードが障害状態でないか否か、ノード状態管理テーブル515により、判定する(S1811)。ステップS1811の判定の結果、転送先の他ノードが障害状態でない(正常状態である)場合(S1811:N)、ストレージプログラム302は、当該他ノードのノード101にリード要求を転送する(S1812)。これにより、他ノード101は、本フローチャートに従ったリード処理を実行する。ストレージプログラム302は、自ノードではリードデータをキャッシュしない。つまり、仮想ページに割り当てられる論理ページが他ノードにあれば、ストレージプログラム302は、リードデータを自ノードのメモリ205にキャッシュせず(リードスルー)、他ノード101がリードデータをキャッシュする。ステップS1811の判定の結果、転送先の他ノードが障害状態である場合(S1811:Y)、コレクションリード処理を呼び出し、実行する(S1813)。
図19は、ストレージプログラム302が実行する同期ライト処理のフローチャートを示す。
本処理は、ホスト(例えばアプリケーションプログラム)からライト要求が発行された場合に実行される。本処理は、自ノードのプールボリュームにライトデータを格納することに加え、ノード間冗長コード及びサイト間冗長コードを生成するために、他ノードのノード101にライトデータを転送する。
ライト要求を受けたノード101のストレージプログラム302は、アクセス先仮想ページにプールボリューム内の論理ページが割り当て済であるかどうかを判定する(S1901)。
論理ページが未割り当てである場合(S1901:N)、ストレージプログラム302は、仮想ページをプールボリュームに割り当てる処理を実行する。ストレージプログラム302は、まずページマッピングテーブル510の更新の排他が必要か否か判定する(S1911)。排他を取得する理由は、他ノード101が同時に割り当てを行う場合に、仮想ページに対して、複数の異なる論理ページが割り当てられることを防ぐためである。
ストレージプログラム302は、仮想ボリューム管理テーブル511を参照し、オーナノードに自ノード以外が含まれている場合は、排他が必要であると判定し、オーナノードが自ノードのみである場合、排他が不要であると判定する。排他が必要と判定した場合(S1911:Y)、ストレージプログラム302は、排他を取得する(S1912)。排他の取得方法は、前述のリード処理において示した方法と同様である。
次に、ストレージプログラム302は、仮想ページに論理ページが割り当て済であるか否かを、再度判定する(S1913)。これは、ステップS1901で仮想ページに割り当て済みであるか否かを判定した後、ステップS1912で排他を取得する前に、他ノードによって排他が取得されている可能性があるからである。
ページが未割り当てである場合(S1913:N)、ストレージプログラム302は、仮想ページに割り当てるプールボリューム及びその中の論理ページを決定する(S1914)。ここでストレージプログラム302は、自ノードのプールボリューム内に空きページがあるかどうかをチェックする。具体的には、ストレージプログラム302は、プールボリューム及びその中の論理ページを選択し、静的マッピングテーブル506を用いて当該論理ページのストライプタイプを特定し、ローカル領域量テーブル804において、当該ストライプタイプのエントリにおいて、実際使用量が目標使用量より少ないか判定する。実際使用量が目標使用量より少ない場合、ストレージプログラム302は、当該仮想ページに自ノードのプールボリューム内の論理ページを割り当てる。空きページが自ノードに存在しない場合、ストレージプログラム302は、外部接続機能により他ノードのプールボリュームをローカルにマウントし、その空きページを仮想ページに割り当てる。
プールボリュームを決定すると、ストレージプログラム302は、当該プールボリューム内の論理ページを仮想ページに割り当てる(S1915)。具体的には、ストレージプログラム302は、ページマッピングテーブル510の対応関係を更新する。
次に、ストレージプログラム302は、排他が必要か否かを判定する(S1916)。この判定は、ステップS1911と同様である。排他が必要な場合(S1916:Y)、又はS1913でページが割り当て済みである場合(S1913:N)、ストレージプログラム302は、取得済みの排他を解放する(S1917)。排他が不要な場合(S1916:N)、ストレージプログラム302は、ステップS1902に進む。
ステップS1901で論理ページが割り当て済である場合(S1901:Y)、ストレージプログラム302は、ライト要求の仮想ボリュームにおける論理アドレス(仮想ページ)に、自ノードのプールボリュームが割り当てられているかを、ページマッピングテーブル215を参照して判定する(S1902)。
自ノードのプールボリュームが割り当てられていない場合(S1902:N)、次にライト要求の転送先となる他ノードが障害状態でないか否かを、ノード状態管理テーブル515により判定する(S1918)。ステップS1918の判定の結果、転送先の他ノードが障害状態でない(正常状態である)場合(S1918:N)、ストレージプログラム302は、他ノード101にライト要求を転送する(S1918)。他ノード101は、本フローチャートに従った同期ライト処理を実行する。データコヒーレンシの維持のため、ストレージプログラム302は、自ノードでライトデータをキャッシュしない。ステップS1918の判定の結果、転送先の他ノードが障害状態である場合(S1918:Y)、ストレージプログラム302は、コレクションライト処理を呼び出し、実行する(S1920)。
仮想ページに自ノードのプールボリュームが割り当てられている場合(S1902:Y)、ストレージプログラム302は、保護レイヤ毎のライト処理を開始する(S1903〜S1910)。例えば、分散型ストレージシステムが三つの保護レイヤで構成されている場合、ストレージプログラム302は、3レイヤで計3回処理を繰り返す。なお、本実施例において、ノード保護レイヤは、同期ライトに設定されている。
ストレージプログラム302は、当該レイヤが同期ライト対象かどうかを判定する(S1903)。具体的には、ストレージプログラム302は、仮想ボリューム管理テーブル511において、ライト対象の仮想ボリュームに対応するSync/Asyncフィールドを参照して判定する。
同期ライトの対象ではない場合(S1903:N)、ストレージプログラム302は、ライトデータ(ストライプ)を他ノード101に転送することなく、データマッピングテーブル701の領域の状態フィールドに”未完了”と記録する。状態フィールドは、各保護レイヤの状態を示す。状態フィールドが”未完了”を示すキャッシュ上のデータは、転送まで維持される。
ストレージプログラム302は、全ての保護レイヤで処理が完了したかを判定し(S1910)、完了していたら本処理を終了する。完了していない場合(S1910:N)、ストレージプログラム302は、次の保護レイヤの処理をステップS1903から繰り返す。同期ライト対象の場合(S1903:Y)、ストレージプログラム302は、自ノードのキャッシュ領域において、キャッシュ確保を実施する(S1904)。その方法は、前述のリード処理における方法と同様である。
次に、ストレージプログラム302は、ライトデータのストライプタイプを特定し、ライトデータの転送先の冗長コードノードを決定する(S1905)。ストレージプログラム302は、冗長コードノードを以下の方法で特定する。ストレージプログラム302は、指定アドレスに基づいて、静的マッピングテーブル506におけるストライプ位置番号を算出し、算出したストライプ位置番号と自ノード番号とから、当該保護レイヤの静的マッピングテーブルを参照して、ストライプタイプ番号(静的マッピングテーブルの要素)を決定する。ストレージプログラム302は、当該保護レイヤの静的マッピングテーブル506を参照して、ストライプタイプ番号から、冗長コードノードを決定する。ストレージプログラム302は、例えば、保護レイヤ#2の静的マッピングテーブル506を参照して、ノード間冗長コードを最終的に格納する冗長コードノードを決定する。ストレージプログラム302は、例えば、保護レイヤ#3の静的マッピングテーブル507を参照して、冗長コードサイト(保護レイヤ#3の冗長コードを格納するサイト)を決定する。例えば、各サイトの代表ノードが予め設定されており、ストレージプログラム302は、冗長コードサイトの代表ノードを冗長コードノードとして決定する。
次に、ストレージプログラム302は、中間コードを転送するか否か判定する(S1906)。中間コードは、旧データ(今までの最新データ)と新データ(今回ライトするデータ)の更新差分を表す。例えばRAID5に相当する冗長コードの場合、中間コードは、旧データと新データのxor値である。その他、Erasure Codingを用いる場合、ストレージプログラム302は、行列の係数を乗算した複数のxor結果を生成してもよい。
中間コード転送の要否の判定基準としていくつかの基準を使用することができる。例えば、ストレージプログラム302は、冗長コードノードの冗長コード領域の残量が閾値より少ないとき、中間コード転送要と判定する。これにより、冗長コードノードは、必要な冗長コードを確実に格納できる。この場合、ストレージプログラム302は、冗長コードノードのローカル領域量の情報を冗長コードノードから取得する。
ストレージプログラム302は、自ノードにおいてキャッシュヒット時のレスポンス低減効果が小さい場合に、中間コードを生成してもよい。例えば、自ノードにおいてライトスルーモードが設定されているとき、自ノードにおいて所定の低レイテンシドライブが使用されているとき、自ノードが閾値より高い負荷状態であるとき、又は、ノード間通信距離が閾値より長いとき、ストレージプログラム302は、中間コード転送要と判定する。
または、ストレージプログラム302は、ドライブ105のライト寿命が十分ある場合に、中間コード転送要と判定してもよい。なお、ライトスルーモードにおいて、ストレージプログラム302は、ライトデータをキャッシュからドライブ105にデステージした後に、ホストに完了応答を返す。
中間コード転送要と判定した場合(S1906:Y)、ストレージプログラム302は、キャッシュ上の新データとドライブ105から読み出した旧データとから中間コードを生成し(S1907)、冗長コードノードのキャッシュに中間コードをライトする(S1908)。ストレージプログラム302は、自アドレス情報(サイト番号、ノード番号、LDEV番号、LBA、TL(Transfer Length))及び中間コードであることを示す識別子と共に、中間コードを、冗長コードノードへ転送する。LDEV番号は、プールボリュームの識別子である。
冗長コードノードにおいて、中間コードと同一転送元アドレスのダーティデータが存在する場合、冗長コードノードのストレージプログラム302は、中間コードとそのダーティデータのxorを算出して、キャッシュ上のデータを更新する。冗長コードノードのストレージプログラム302は、当該中間コードに関する情報を、中間ダーティキュー1203に接続する。冗長コードノードは、同一冗長コードの元となる異なる転送元からの中間コードのxorを算出して、キャッシュ上のデータを更新してもよい。
ステップS1906において、中間コードを転送しないと判定した場合(S1906:N)、ストレージプログラム302は、冗長コードノードにライトデータを転送し、冗長コードノードは、受信したライトデータをキャッシュに格納する(S1909)。ライトデータの転送元ノードは、冗長コードノードに、転送データの自アドレス情報(サイト番号、ノード番号、LDEV番号、LBA、TL)と通常データであることを示す識別子と共に、ライトデータを転送する。冗長コードノードにおいて、ストレージプログラム302は、ライトデータに対応する情報を、対応するコードダーティキュー1202に接続する。
図20は、ストレージプログラム302が実行する非同期ライト処理のフローチャートを示す。
本処理は、ホストI/Oとは非同期に実行され、Asyncが指定された保護レイヤで、まだ他ノードに転送されていないデータを転送する。非同期ライト処理におけるステップS2002〜S2009は、同期ライト処理におけるステップS1904〜S1910と同様である。ここでは、同期ライト処理との差分のみを説明する。各ノード101において、ストレージプログラム302は、ページマッピングテーブル510を参照し、登録されている全仮想ボリュームについて、本処理を実行する。
ストレージプログラム302は、対象の仮想ページが非同期ライトの対象であるかを判定する(S2001)。具体的には、ストレージプログラム302は、データマッピングテーブル701において、仮想ページに対応するプールボリューム内の論理ページの状態をチェックする。当該保護レイヤにおいて、”未完了”の状態であれば、ストレージプログラム302は、非同期ライト対象と判定し(S2001:Y)、ステップS2002に進む。
全ての仮想ページの処理が終了したら(S2009:Y)、ストレージプログラム302は、本フローを終了する。ストレージプログラム302は、非同期ライト処理を周期的に実行してもよいし、常時実行してもよい。ストレージプログラム302は、”未完了”状態のページ量に応じて本処理の実行頻度やデータ転送速度を動的に変更してもよい。
例えば、仮想ボリューム管理テーブル511の同期/非同期の情報において、保護レイヤ#3(ジオ保護レイヤ)が非同期に設定されている場合、ライト要求時にサイト間のデータ転送を行わないことから、アプリケーションプログラム301の応答時間の増加を防ぐことができる。
図21は、ストレージプログラム302が実行するデステージ処理のフローチャートを示す。
本処理はキャッシュ上にダーティデータ、つまり、ドライブ105に未反映のデータが存在する場合に、ホストI/Oと非同期で実行される。キャッシュには、2種類のダーティデータが存在する。一つは、自ノードのドライブ105に格納されるライトデータである。他の一つは、冗長コード生成のために他ノード101から転送されたデータである。ここで、他ノードから転送されたデータは、中間コードを含む。ダーティデータは、データダーティキュー1201、コードダーティキュー1202及び中間ダーティキュー1203で管理されている。このフローチャートは、データダーティキュー1201及びコードダーティキュー1202で管理されているダーティデータのデステージ処理を示す。
まず、ストレージプログラム302は、データダーティキュー1201及びコードダーティキュー1202を参照し、対象のダーティデータを見つける。ストレージプログラム302は、対象データが、自ノードのドライブ105に格納するためのライトデータであるか否かを判定する(S2101)。対象データがデータダーティキュー1201によって示されている場合、対象データはライトデータである。
対象データがライトデータである場合(S2101:Y)、ストレージプログラム302は、当該ライトデータを自ノードのドライブ105にライトする(S2107)。データは、ログ構造化形式で格納される。前述のログ構造化マッピングテーブル508に示したように、ライトデータをドライブ105にログ構造化形式で格納する際に、ストレージプログラム302は、プールボリュームアドレスとドライブアドレスとの対応関係、及びデータの状態を、データマッピングテーブル701に記録する。
ドライブ105に空き領域が無い場合、ストレージプログラム302は、後述する容量枯渇管理処理を実行してからドライブ105へのデータのライトを実行してもよい。
ストレージプログラム302は、全ダーティデータを処理したかどうかを判定する(S2106)。全ダーティデータの処理が終了している場合(S2106:Y)、ストレージプログラム302は、本フローを終了する。
対象データがライトデータではない場合、つまり、対象データが冗長コード生成のためのデータ(他ノードから受信したデータ)である場合(S2101:N)、ストレージプログラム302は、同一ストライプタイプのダーティデータを見つける(S2102)。
具体的には、ストレージプログラム302は、コードダーティキュー1202における対象データのキューにおいて、対象データを含む、異なるノード101から転送された複数のライトデータを取得する。ストレージプログラム302は、予めユーザにより指定されたデータ保護の方針を示す配置ポリシ(XDYP:最大ユーザデータ数Xに対して冗長コード数Y)に従い、可能な限りX個のデータを取得する。配置ポリシについては、後述する。
具体的には、ストレージプログラム302は、静的マッピングテーブル506又は507が示すデータノード数を超えない範囲で、できるだけ多くのストライプを選択する。これにより、ストレージプログラム302は、できるだけ配置ポリシを満たす冗長化を行うことができる。ここで選択されるライトデータの転送元ノードは、全て異なる。対象データのキューが、当該ストライプタイプに属する全データノードからのライトデータを示す場合、ストレージプログラム302は、全データノードからのライトデータを選択する。ストライプの選択において、転送元ノードでの論理アドレスは問わない。
このように、冗長コード生成の要素となるライトデータの数は固定されておらず、不定である。また、冗長コード生成の要素となるライトデータの論理アドレスの組も不定である。これにより、ストレージプログラム302は、転送されたライトデータのみから効率的に冗長コードを生成できる。コードダーティキュー1202において、同一ストライプタイプの他ノード101からのライトデータが存在しない場合、ストレージプログラム302は、単一対象データを冗長コードとして、ドライブ105に格納してもよい。また、データをデステージする際に、転送元ノードからのデータはフロントエンドライトに同期して転送されるため、その時点では転送元ノードのドライブに書き出されておらず、デステージされる前に新たに同期ライト処理が発生するとキャッシュ上で当該ライトデータが上書きされる可能性がある。このため、冗長コードノードでは、転送元ノードがデステージ完了したデータのみ冗長コードの生成に使用するようにしなければならない。この実現のために、転送元ノードがデステージした旨を、冗長コードノードに通知してもよい。但し、転送元ノードがデステージタイミングで冗長コードノードにデータ転送する場合は、冗長コードノードはこの条件を考慮しなくてよい。
ストレージプログラム302は、中間ダーティキュー1203における同一ストライプタイプのキューからダーティデータを見つけてもよい。ストレージプログラム302は、ドライブ105に格納されており対応する冗長コードと中間コードのxorを算出して冗長コードを更新する。更新された冗長コードが、対象データの転送元ノードとは異なるノードのライトデータのみから生成されている場合、ストレージプログラム302は、対象データと更新された冗長コードとから新たな冗長コードを生成する。
ストレージプログラム302は、できるだけ旧ライトデータの比率が大きくなるように、冗長コードを生成するライトデータを選択してもよい。ストレージプログラム302は、旧ライトデータのみで冗長コードを生成できる場合、旧ライトデータのストライプのみを選択して冗長コードを生成する。冗長コード生成における旧データの比率を大きくすることで、当該冗長コードが無効データとなる時期を早め、冗長コード格納領域の空き容量を効率的に増加させることができる。
ストレージプログラム302は、選択したライトデータから冗長コードを算出し、ドライブ105にライトする(S2103、S2104)。
複数のユーザデータの組み合わせから冗長コードを書き出した後、他ノードがその組み合わせから冗長コードを生成する必要がある場合、ストレージプログラム302は、他ノードへ冗長コードを生成したユーザデータの組み合わせ情報を通知する。例えば、ストレージプログラム302は、冗長コードを生成したユーザデータのノード番号、ストライプ番号、ドライブ番号、LBAを組み合わせ情報として通知する。通知を受信した他ノードは、組み合わせ情報に基づき、2つ目以降の冗長コードを生成する。これにより、複数の冗長コードノードにおいて、同じユーザデータの組み合わせで、冗長コードを生成することができる。
ドライブ105へのライトは、ステップS2107と基本的には同様に、ログ構造化形式による追記である。これにより、旧データの読み出しを省略し、高速及び効率的な冗長コードの生成及びドライブライト処理を実現する。
ストレージプログラム302は、算出した冗長コードの格納位置の物理領域と、プールボリューム内の論理ページとの対応関係を、データマッピングテーブル701ではなく、冗長コードマッピングテーブル702に記録する。ストレージプログラム302は、さらに、逆マッピングテーブル703において、プールボリュームアドレスとドライブアドレスとの対応関係を記録する。冗長コードは複数のライトデータから生成されるため、逆マッピングテーブル703は、一つのドライブアドレスに対して複数の参照を持つ。
ストレージプログラム302は、冗長コードをドライブ105にライトしたら、冗長コードをクリーンキューに変更し、ライトの完了を転送元ノードに通知する(S2105)。この通知を受信した転送元ノードは、データマッピングテーブル701における対象データの対象保護レイヤの状態を“完了”に変化させる。状態フィールドは、ノード障害時に当該データを再転送対象とするかどうかを判定するために参照される。ストレージプログラム302は、全ダーティデータの処理を完了したら(S2106:Y)、本フローを終了する。そうでなければ、ストレージプログラム302は、S2101において次のダーティデータを処理する。
中間コードのデステージにおいて、ストレージプログラム302は、ドライブ105に格納されている旧冗長コードと中間コードとから、新たな冗長コードを生成し、ドライブ105における旧冗長コードにオーバーライトする。オーバーライトであるため、ログ構造化マッピングテーブル508は変わらない。中間コードによる冗長コードの更新は、データノードからの旧データのリードを必要とするが、冗長コードノードにおけるローカル領域の使用量を低減できる。
中間ダーティキュー1203に、一つの冗長コードに対する複数の中間コードが存在する場合、ストレージプログラム302は、全中間コードのxorを算出して新中間コードを生成し、当該新中間コードによって冗長コードを更新する。同一冗長コードに対応する複数の中間コードは、同一論理アドレスの異なる世代のデータ及び異なるノード101の中間コードを含む。
ストレージプログラム302は、冗長コードマッピングテーブル702を使用して、中間ダーティキュー1203から選択した中間コードの冗長コードの物理アドレスを知ることができる。さらに、ストレージプログラム302は、逆マッピングテーブル703を使用して、当該冗長コードに対応する中間コードの論理アドレスを特定することができる。
冗長コード更新の具体例を、以下に示す。以下では、Erasure Codingとして、リードソロモン符号を用いたRAID6を例に挙げる(d=3、p=2)。ガロア係数をA1〜A3とする。
(1)コードダーティキュー1202
ストレージプログラム302は、コードダーティキュー1202からX1〜X3のダーティデータを選択し、下記の式で、冗長コードP1又はP2を算出する。
P1=X1xorX2xorX3
P2=(X1*A1)xor(X2*A2)xor(X3*A3)
冗長コードP1、P2は、それぞれ、自ノードのストレージデバイスの新規領域にライトされる。
(2)中間ダーティキュー1203
ストレージプログラム302は、中間ダーティキュー1203から、自ノードのドライブ105にライト済みの旧冗長コードP1o又はP2oに対応する新らたな中間ダーティデータM1、M2を抽出する。中間ダーティデータの個数は2とは限らない。ストレージプログラム302は、下記の式で新中間コードMP1又はMP2を算出する。
MP1=M1xorM2
MP2=(M1*A1)xor(M2*A2)
ストレージプログラム302は、下記の式で新たな冗長コードP1又はP2を算出する。
P1=P1oxorMP1
P2=P2oxorMP2
新冗長コードP1、P2は、旧領域(P1o、P2o)にオーバーライトされる。
また、ストレージプログラム302は、予め設定されたデータ数d以下のライトデータで、冗長コードを生成することがあり得る。このとき、ストレージプログラム302は、不足分のライトデータを0データとして、冗長コードを生成する。
例えば、データ数dが3に設定されている場合、ストレージプログラム302は、3つのライトデータX1、X2、X3から冗長コードを生成する。しかし、3つ目のライトデータX3が、いつまでも他ノードから転送されない場合、ストレージプログラム302は、他の挿入済みのライトデータX1、X2をデステージすることができない。そこで、ストレージプログラム302は、以下のように不足分のライトデータX3を0データとして、冗長コードを生成し、デステージを行う。
P=X1xorX2xor0
このようなデータ数dに満たないライトデータ数で生成された冗長コードに対して、不足分のライトデータが、冗長コード生成後に、他ノードから転送された場合、ストレージプログラム302は、当該ライトデータで当該冗長コードを更新してよい。例えば、ストレージプログラム302は、上述した例で生成した冗長コードPを、以下のように更新し、新たな冗長コードPnを生成する。
Pn=PxorX3
以上のように、デステージ時に、データ数dに満たないライトデータ数で生成した冗長コードが存在する場合、ストレージプログラム302は、このような冗長コードを見つけ、不足分のライトデータで、当該冗長コードを更新してもよい。これにより、ライトデータの転送元ノードは、中間コードを生成せずとも、冗長コードを更新することができ、限られた容量を効率的に利用することができる。
上述のように、冗長コードノードは、一つのストライプタイプ内のライトデータから動的にライトデータを選択し、選択したライトデータから冗長コードを生成する。これにより、冗長コードノードは、既存冗長コードを読み出すことなく、転送されたライトデータから効率的に冗長コードを生成することができる。
本実施例における冗長コードノードによるライトデータの動的な選択において、選択されるライトデータの組み合わせ及び選択されるストライプ数の少なくとも一方が不定である。上記の例で、冗長コードノードは、ストライプ数及びアドレス組み合わせの双方から独立してライトデータを選択するが、その一方が固定されていてもよい。ここで、アドレス組み合わせにおけるアドレスは、ノード、プールボリューム及びプールボリュームアドレスで指定されるアドレスである。
冗長コードのドライブ105へのライトに、ログ構造化方式が適用されてなくてもよい。つまり、冗長コードノードは、旧冗長コードと同一アドレス組み合わせから生成した新冗長コードをローカル領域に追記することなく、旧冗長コードを新冗長コードに書き換えてもよい。ログ構造化方式が採用されない構成において、既存の全冗長コードと異なるアドレス組み合わせの冗長コードは、ローカル領域に追記される。
上記の例で、冗長コードノードは、予め定義されたストライプタイプ内のライトデータのみから冗長コードを生成する。なお、分散型ストレージシステムは、プールボリュームアドレスに対してストライプタイプを定義することなく、他のルールを用いてライトデータの組み合わせを決定し、その組み合わせから冗長コードを生成してもよい。
ここでは、ストレージプログラム302が実行する容量枯渇管理処理について説明する。
まず、ノード101上のストレージプログラム302内の容量枯渇管理処理プログラム1611が、自ノードで、ライトデータタイプの中の何れかのストライプタイプの実際使用量が目標使用量を超過していることを検出すると、容量枯渇管理処理を実行する。
次に、容量枯渇管理処理プログラム1611は、容量枯渇を検出したストライプタイプの冗長コードを格納する冗長コードノードに、削減対象のストライプタイプの情報を指定し、容量削減処理の要求を発行する。容量削減処理の要求を受信した冗長コードノードは、削減対象のデータタイプから生成された冗長コードを消去して、容量削減要求元の容量に空き容量を確保しようとする。
ここで、冗長コードノードは、全て無効ライトデータに対応する冗長コードを、もはや保持する意味はなく、即座に消去2204できる。しかし、少なくとも一つの有効ライトデータに対応する冗長コードを消去すると、有効ライトデータの冗長度が下がるため、冗長コードノードは、その冗長コードを消去することができない。したがって、冗長コードノードは、冗長コードを消去する前に、その冗長コードの生成に用いられたライトデータが、有効か無効かを判定し、有効である場合、当該有効データを再度、転送してもらうことで、転送された有効データとキャッシュ上に存在する別の有効データとから、新しく冗長コードを生成し、有効ライトデータの冗長度を下げないようにする。
図22は、ストレージプログラム302が実行する容量枯渇管理処理のフローチャートを示す。
本処理は、何れかの実際使用量が目標使用量を超えている場合に、データの消去を試みる。これにより、分散型ストレージシステムは、必要なデータを限られた領域に格納できる。消去するデータタイプは、ライトデータタイプと冗長コードタイプである。ストレージプログラム302は、本処理をホストI/Oと非同期に実施してもよい。実際使用量と目標使用量の関係は、ローカル領域量テーブル804に示される。
まず、ストレージプログラム302は、ローカル領域量テーブル804を参照し、選択した対象データタイプの実際使用量が、目標使用量を超過しているか否か判定する(S2301)。
ステップS2301にて、判定の結果、対象データタイプの実際使用量が目標使用量を超過していない場合(S2301:N)、ストレージプログラム302は、容量枯渇管理処理を終了する。ステップS2301にて、判定の結果、対象データタイプの実際使用量が目標使用量を超過している場合(S2301:Y)、ストレージプログラム302は、容量削減処理を実行する(S2302)。このとき、実際使用量を超過しているデータタイプが、ライトデータである場合、容量超過を検出したノードである容量超過ノードのストレージプログラム302は、当該ライトデータの冗長コードを格納するノードである冗長コードノードに対し、実際使用量が超過しているデータタイプの情報を指定し、容量削減処理を要求する容量削減要求を発行する。実際使用量を超過しているデータタイプが、冗長コードであった場合、自ノードのストレージプログラム302が、容量削減処理を実行する。
次に、容量削減処理について説明する。
冗長コードノードは、容量削減要求を受信すると(S2305)、ログ構造化マッピングテーブル508を参照することで、消去対象とする冗長コードを探索する(S2306)。探索の際、容量削減処理の要求元ノードが他ノードである場合、消去したいデータは、当該他ノードの、無効ライトデータであるため、冗長コードノードは、当該他ノードの無効ライトデータを含む冗長コードを探索する。容量削減処理の要求元ノードが自ノードである場合、消去したいデータは、自ノードの冗長コードであるため、冗長コードノードは、冗長コードを探索する。この際、冗長コードノードは、可能な限り無効ライトデータから生成された冗長コードを探索することで、後述するデータ再転送処理の発行回数を抑えネットワーク通信量を削減することができる。
次に、冗長コードノードは、探索結果の冗長コードに対して、冗長コードの生成に用いられたライトデータが無効データか否か判定する(S2307)。例えば、冗長コードノードは、逆マッピングテーブル703に、冗長コードの生成に用いられたライトデータが有効か無効かを示すフラグを設け、それを用いて判定してもよいし、各ライトデータを格納するノードに対し、ライトデータの有効無効を問合せてもよい。
ステップS2307で、判定の結果、冗長コードを生成したライトデータが、無効ライトデータである場合(S2307:N)、冗長コードノードは、当該無効ライトデータを格納するノードであるデータノードに対して、当該無効ライトデータのデータ消去処理を要求する消去要求を発行する(S2309)。
ここでは、データ消去処理について説明する。消去要求を受信したデータノードは、データ消去処理として、消去要求のあったデータを消去し、完了応答を要求元ノードに返却する(S2317〜S2319)。具体的には、データノードは、ローカル領域制御テーブル509の無効リスト802から消去対象ライトデータを削除し、フリーリスト803に繋ぎ直す。
ステップS2307で、判定の結果、冗長コードを生成したライトデータが、有効ライトデータである場合(S2307:Y)、冗長コードノードは、当該有効ライトデータを格納するノードであるデータノードに対して、当該無効ライトデータのデータ再転送処理を要求するデータ再転送要求を発行する(S2308)。
ここでは、データ再転送処理について説明する。再転送要求を受信したデータノードは、データ再転送処理として、再転送要求のあったデータをドライブ105又はキャッシュから読み出し、要求元ノード(当該ライトデータの冗長コードノード)に再転送し、完了応答を返却する(S2314〜S2316)。再転送された有効データは、冗長コードノードにおいて、キャッシュ情報503のコードダーティキュー1202に接続し直され、デステージ処理プログラム1609で、再度冗長コードが生成され、ドライブ105に書き出される。
次に、冗長コードノードは、消去対象の冗長コードの生成に用いられたライトデータに対して、上述したデータ消去処理、又はデータ再転送処理が完了したか否か判定する(S2310)。ステップS2310で、判定の結果、未完了の場合(S2310:N)、冗長コードノードは、未完了のライトデータに対して、ステップS2307〜S2309の処理を再実行する。ステップS2310で、判定の結果、完了の場合(S2310:Y)、冗長コードノードは、消去対象の冗長コードの生成に用いられた全てのライトデータに対して、データ消去処理、又はデータ再転送処理が完了したため、当該消去対象の冗長コードを消去する(S2311)。ここで冗長コードノードは、具体的には、冗長コードマッピングテーブル702における対象領域のドライブアドレスとプールボリュームアドレスの関係を削除し、無効リスト802から対象領域を削除してフリーリスト803に再接続し、ローカル領域量テーブル804において対応する冗長コードタイプの実際使用量を削減する。
次に、冗長コードノードは、消去要求のあったデータタイプから生成された冗長コード、又は消去要求のあったデータタイプの冗長コードを全て探索し終えたか否か判定する(S2312)。ステップS2313で、判定の結果、全ての冗長コードを探索し終えていない場合、冗長コードノードは、ステップS2306〜S2311を再度実行する(S2312:N)。ステップ2313で、判定の結果、全ての冗長コードを探索し終えた場合(S2312:Y)、冗長コードノードは、冗長コードの消去が完了したことを、容量削減処理の要求元である容量超過ノードに返却し、処理を終了する(S2313)。
以下、異常時の分散型ストレージシステムの動作について説明する。
図23は、管理プログラム303及びストレージプログラム302における構成管理処理のフローチャートを示す。
本処理は、管理プログラム303とストレージプログラム302の2つのプログラムにより、実現される。本処理により、ノード障害、ノード減設、ノード増設等の、構成変更時の処理が実行される。
まず、ノード101のうち特定の状態管理ノードにおける管理プログラム303が実行する状態管理処理について説明する。状態管理ノードは、管理プログラム303が動作するノードであり、全てのノード101であってもよいし、予め設定された一部のノードであってもよい。
管理プログラム303は、ハイパーバイザ304、及び仮想マシン307からリソースの使用情報を取得する(S2401)。
次に、管理プログラム303は、取得したリソースの使用情報を、リソース監視情報1302に更新する(S2402)。ここで管理プログラム303は、各物理マシン、又は仮想マシンから取得したリソース使用情報を、取得元の物理マシン、又は仮想マシンに対応するリソース監視情報1302のエントリに反映する。その後、管理プログラム303は、反映されたエントリを参照し、リソースの使用状況が、ユーザ又はシステムにより、予め設定された閾値を超過している場合、システム構成情報1301の状態情報を警告状態に更新する。さらに、リソースの取得に要する通信時に、エラーが返却されたノード(物理マシン)、又は仮想マシン307は、システム構成情報1301の状態情報を障害状態に更新する。
次に、管理プログラム303は、システム構成情報1301を参照し、物理マシンと仮想マシンの状態を確認する(S2403)。
次に、管理プログラム303は、システム構成情報1301の状態情報を参照し、状態が障害状態のノード(物理マシン)が存在するか否か判定する(S2404)。ステップS2404で、判定の結果、障害状態のノード(物理マシン)が存在しない場合(S2404:N)、管理プログラム303は、次のステップS2405に移る。ステップS2404で、判定の結果、障害状態のノード(物理マシン)が存在する場合(S2404:Y)、管理プログラム303は、障害状態のノード(物理マシン)で動作していた、ストレージプログラム302を別の正常に動作しているノード(物理マシン)上に再起動する。前述したように、各ノード101が、メモリ205内の制御情報を、別の再起動先ノード(物理マシン)のドライブ105内のバックアップ517にバックアップしておくことで、再起動先ノードは、制御情報を維持したまま、障害ノード上で動作していたストレージプログラムを再起動させる。なお、再起動先ノードは、再起動先ノードで動作している物理マシン上に、障害ノード上で動作していたストレージプログラム302を新規仮想マシンとして再起動してもよいし、既に動作しているストレージプログラムを動作させている仮想マシン上に、障害ノード上で動作していたストレージプログラムを別プロセスとして、再起動してもよい。
障害ノード上から再起動先ノードに再起動されたストレージプログラム302は、ホストに対して、仮想ボリュームを提供する。ただし、当該仮想ボリュームは、ドライブ105を持たないため、ホストから当該仮想ボリュームに対するアクセスは、後述するコレクションリード処理プログラム1606、及びコレクションライト処理プログラム1608を実施し、ホストへ結果を返却する。
次に、管理プログラム303は、障害ノードと保護レイヤに含まれる全てのノードとに対し、構成変更処理を要求する構成変更要求を発行する(S2408)。このとき、構成変更要求は、構成変更対象(増設対象や減設対象など)のノード番号を含む。ストレージプログラム302が実行する構成変更処理については、後述する。
次に、管理プログラム303は、障害ノード上で動作していたアプリケーションプログラムを動作させる仮想マシンの移動先のノードを選定する(S2409)。仮想マシン移動先選定処理では、各ノードのリソースの利用状態をチェックし、各ノードのリソース使用負荷が分散するように、障害ノード上の仮想マシンの復旧先である移動先ノードを選定する。移動先選定処理の詳細は、後述する。
次に、管理プログラム303は、障害ノード上で動作していたストレージプログラム302により提供されていた仮想ボリューム上のデータを、アプリケーションプログラムのための仮想マシンの移動先ノードの仮想ボリュームへ移動させることを要求するデータ移行要求を、移動先ノードのストレージプログラムへ発行する(S2410)。これにより、再起動先ノードは、障害ノード上のデータを復旧することと、そのデータを生存ノードへ移行することとを、同時に実現することができる。もし、スペアドノードを使用してスペア領域へデータを一時的に復旧した場合、障害ノードを別のノードにリプレースした後、一時的に復旧したデータを、スペアドノードからリプレースしたノードへ書き戻す必要があり、復旧に要する保守工数が増加する。本処理では、障害ノードの減設(つまり、保護レイヤからの障害ノードを除外する)処理と、データの復旧処理とを同時に実行することで、ノードのリプレースや一時データの書き戻しを必要としないため、復旧に要する保守工数を削減する効果がある。
次に、データの移行が終わると、管理プログラム303は、仮想マシンを移動先ノードに移動する(S2411)。
次に、管理プログラム303は、現在の処理は、障害復旧処理であるかどうかを判定し、障害復旧処理である場合(S2412:Y)、再起動されたストレージプログラムを終了し、このフローを終了する(S2413)。例えば、管理プログラム303は、障害復旧の処理ルート(S2407)を実行することで、障害ノード上のストレージプログラム302を再起動先ノードに再起動したとき、再起動先ノードのストレージプログラムが動作する仮想マシンIDをメモリ上に記憶しておく。管理プログラム303は、S2413において、記憶された仮想マシンIDを参照して、障害ノードから再起動したストレージプログラムが存在すれば、当該ストレージプログラムが動作する仮想マシンを終了する。障害復旧処理でない場合(S2412:N)、状態管理処理を終了する。
また、状態管理処理では、障害復旧処理だけでなく、ノードの増減設処理、及び複数ノード(物理マシン)間のリソース使用負荷の分散(リバランス)処理を実行することができる。
ステップS2405では、管理プログラム303は、物理マシンの増減設要求があるか否か判定する。具体的には、管理プログラム303は、ノードの増減設要求を、ユーザ又はシステムから受け取ると、システム構成情報1301の物理マシン構成管理テーブル1303の状態情報の対応するエントリを、要求内容に応じて増設中又は減設中に更新しておき、この状態情報を参照し、増設要求又は減設要求があるか判定する。この際、管理プログラム303は、増設要求又は減設要求を受信した後、続けてストレージプログラムへ構成変更要求を発行し、仮想マシンのリバランスを実行してもよい。
ステップS2405で、判定の結果、増減設要求がある場合(S2405:Y)、ステップS2408〜S2413を実行する。ステップS2405で、判定の結果、増減設要求がない場合(S2405:N)、ステップS2406を実行する。
ステップS2406では、管理プログラム303は、物理マシンのリソース利用状態に偏りがあり、リソース使用を分散させるため、仮想マシンを複数物理マシン間で、リバランスが必要か否かを判定する(S2406)。具体的には、管理プログラム303は、システム構成情報1301の状態情報を参照し、状態が警告状態であるかどうか判定する。状態情報が警告状態である場合、管理プログラム303は、リソースの使用状態が閾値を超えているため、仮想マシンのリバランスが必要であると判定する。
ステップS2406で、判定の結果、仮想マシンのリバランスが必要な場合(S2406:Y)、管理プログラム303は、ステップS2409〜S2413を実行し、当該物理マシン又は仮想マシンに対して、仮想マシンのリバランス処理を実行する。ステップS2406で、判定の結果、仮想マシンのリバランスが不要な場合(S2406:N)、管理プログラムは、このフローを終了する。
次に、構成変更処理について説明する。
ストレージプログラム302は、構成変更要求を受信すると、要求された構成変更情報から増減設対象ノード番号を取得し(S2414)、増減設対象ノード番号に基づいて新しい静的マッピングテーブルを生成する(S2415)。
図1の例において、ノード#0に障害が発生したとき、ストレージプログラム302は、構成変更前の静的マッピングテーブル506Aから、ノード#0のノードを減設し、構成変更後の新しい静的マッピングテーブル506Bを生成する。
静的マッピングテーブルの生成処理では、まず、構成変更前の静的マッピングテーブル506Aから、一つのストライプタイプを選択する。
図1の例において、ストレージプログラム302は、ストライプタイプ番号3を選択している。次に、ストレージプログラム302は、選択したストライプタイプ番号3のストライプを、減設対象のノード#0のストライプに割り当てられたストライプタイプ番号と交換する。具体的には、ストレージプログラム302は、ノード#0のD0(ノード番号=0、ストライプ位置番号=0)のストライプタイプ番号0と、ノード#3のD0(ノード番号=3、ストライプ位置番号=0)のストライプタイプ番号3とを交換し、ノード#0のD1のストライプタイプ番号2と、ノード#2のD1のストライプタイプ番号3とを交換し、ノード#0のPのストライプタイプ番号1と、ノード#1のPのストライプタイプ番号3とを交換する。以上のようにして、ストレージプログラム302は、構成変更後の新しい静的マッピングテーブル506Bを生成する。ノードを増設する場合、ストレージプログラム302は、減設処理と逆に、増設対象ノード上に、新規ストライプタイプ番号を定義し、当該ストライプタイプ番号を、同一ノード(同一列)に同一ストライプタイプが重複しないよう、各ノードのストライプタイプ番号と交換し、構成変更後の新しい静的マッピングテーブルを生成する。
次に、ストレージプログラム302は、構成変更後の静的マッピングテーブルに基づき、後述する冗長化先変更処理を実行する(S2416)。冗長化先変更処理は、各ノードに格納しているライトデータに対し、新たな静的マッピングテーブルに基づき、冗長化先(冗長コード格納先、例えば、冗長コードノード)を決定し、新しく冗長コードを再生成する。その後、古い静的マッピングテーブルに基づき生成した冗長コードは、不要となるため、削除する。これにより、ライトデータを移動させずに、保護レイヤ情報を更新できるため、アプリケーションプログラムとアプリケーションプログラムがアクセスするデータの同ノードへの配置を維持することができる。
次に、冗長化先変更処理が完了すると、ストレージプログラム302は、不要となった構成変更前の静的マッピングテーブルを破棄し、要求元へ応答し、このフローを終了する(S2417)。具体的には、ストレージプログラム302は、メモリ205上及びドライブ105上のバックアップ517から、不要な静的マッピングテーブル505〜507を消去する。
次に、データ移行処理について説明する。
前述のように、ステップS2410において、管理プログラム303は、移行元の仮想ボリュームと移行先の仮想ボリュームを指定するデータ移行処理の要求を、移動先ノードのストレージプログラム302へ発行する。
データ移行要求を受信した移動先ノードのストレージプログラム302は、まず、移行先の仮想ボリューム(移行先ボリューム)を自ノード上に作成する(S2418)。具体的には、ストレージプログラム302は、仮想ボリューム管理テーブル511を参照し、空きエントリを探す。ストレージプログラム302は、空きエントリが見つかったら、当該エントリを新規仮想ボリュームとして、仮想ボリューム管理テーブル511に、仮想ボリュームのサイズ、保護レイヤ毎の同期/非同期保護設定、及びオーナノード番号を登録する。
次に、移動先ノードのストレージプログラム302は、移行元のストレージプログラム302、例えば再起動先ノードにより再起動されたストレージプログラム302により提供される仮想ボリューム(移行元ボリューム)を、ストレージ外部接続機能により、自ノードのストレージプログラム302に接続する(S2419)。
次に、移動先ノードのストレージプログラム302は、外部接続された仮想ボリュームから、新規に作成した自ノードの仮想ボリュームへデータコピー処理を実行する(S2420)。データコピー処理の詳細については、後述する。
次に、データコピー処理が完了すると、移動先ノードのストレージプログラム302は、ホストへのストレージI/Oのメインパスを、移行先ボリュームに切り替え、このフローを終了する(S2421)。これにより、ホストは、以降、移行先ボリュームへアクセスするようになる。
以上の構成管理処理によれば、分散型ストレージシステムは、正常なノードの数の変化に応じて、ユーザデータと冗長コードの配置を変更することで、冗長度を維持することができる。ノードの障害時や減設時、分散型ストレージシステムは、減設対象のノードを含まない組み合わせで、冗長コードを再生成することで、各ノード上のデータの冗長度を回復することができる。また、ノードの増設時、分散型ストレージシステムは、既存のノードと増設対象のノードを含む組み合わせで、冗長コードを再生成することで、各ノード上のデータの冗長度を維持することができる。
図24は、ストレージプログラム302が実行するデータコピー処理のフローチャートを示す。
データコピー処理は、指定された移行元ボリューム内のデータを、指定された移行先ボリュームにコピーする。データコピー処理を実行するストレージプログラム302は、移行元ボリュームを提供するストレージプログラム302が実行してもよいし、移行先ボリュームを提供するストレージプログラム302が実行してもよいし、移行元と移行先に無関係なストレージプログラム302が実行してもよい。ストレージプログラム302は、データコピー処理において、アドレス解決処理を実行することにより、移行元と移行先のストレージプログラムの間のネットワークI/O通信量を削減する。
まず、ストレージプログラム302は、移行元ボリューム内のコピー元データのアドレスであるコピー元アドレスを指定し、コピー元アドレスに自ノードのプールボリューム内の論理ページが割り当てられているか否かを、ページマッピングテーブル510及び外部接続管理情報を参照して判定する(S2501)。コピー元アドレスは、例えば、仮想ボリューム番号と論理アドレスで指定される。
ステップS2501で、判定の結果、ストレージプログラム302は、コピー元アドレスに自ノードの論理ページが割り当てられている場合(S2501:Y)、ストレージプログラム302は、リード処理を実行し、コピー元アドレスのデータを読み出す。リード処理の詳細については、前述のとおりである。ステップS2501で、判定の結果、コピー元アドレスに自ノードの論理ページが割り当てられていない場合(S2501:N)、ストレージプログラム302は、コピー元データを格納する他ノードのストレージプログラム302に対して、アドレス解決処理を要求するアドレス解決要求を発行する(S2506)。このとき、ストレージプログラム302は、アドレス解決要求に、例えば、仮想ボリューム番号、論理アドレス、リード属性を指定する。アドレス解決処理の詳細については、後述する。
次に、ストレージプログラム302は、アドレス解決処理完了の応答を受けると、返却された情報を元に、コピー元データを格納する他ノードに対して、解決されたコピー元アドレスからコピー元データを読み出すことを要求するリード要求を発行する(S2502)。リード処理の詳細については、前述の通りである。
次に、ストレージプログラム302は、移行先ボリューム内のコピー先アドレスに、自ノードのプールボリューム内の論理ページが割り当てられているか否かを判定する(S2503)。コピー先アドレスに、自ノードの論理ページが割り当てられているか否かの判定方法は、S2501と同様である。ステップS2503で、判定の結果、コピー先アドレスに自ノードの論理ページが割り当てられている場合(S2503:Y)、ストレージプログラム302は、リードされたコピー元データをライトデータとして指定し、コピー先アドレスをライト先アドレスに指定して、ライト処理を実行する(S2504)。
ステップS2503で、判定の結果、コピー先アドレスに自ノードの論理ページが割り当てられていない場合(S2503:N)、コピー先アドレスに割り当てられている他ノードに対して、アドレス解決要求を発行する(S2507)。このとき、ストレージプログラム302は、アドレス解決要求に、例えば、仮想ボリューム番号、論理アドレス、ライト属性を指定する。アドレス解決処理の詳細については、後述する。
次に、コピー先アドレスが解決されると、ストレージプログラム302は、リードされたコピー元データをライトデータ、解決されたコピー先アドレスをライト先アドレスに指定し、ライト処理を実行する(S2504)。ライト処理の詳細については、前述のとおりである。
次に、ストレージプログラム302は、移行元ボリューム上のデータを全てコピーしたかどうか、判定する(S2505)。ステップS2505で、判定の結果、コピー対象データが、まだ存在する場合(S2505:Y)、ステップS2501〜S2504を再度実行する。ステップS2505で、判定の結果、コピー対象データが、まだ存在する場合(S2505:N)、ストレージプログラム302は、データコピー処理を終了する。
次に、アドレス解決処理について説明する。
ストレージプログラム302は、アドレス解決要求を受信すると、アドレス解決要求に基づいて、アドレス解決の属性がリード属性かライト属性かを判定する。
アドレス解決要求が、リード属性である場合、アドレス解決要求により指定された領域に自ノードの論理ページが割り当てられているか否かを判定する(S2508)。判定方法は、ステップS2501で述べた方法と同様である。ステップS2508で、判定の結果、指定された領域に自ノードの論理ページが割り当てられている場合(S2508:Y)、アドレス解決要求により指定された領域に割り当てられたアドレスである解決アドレスを、ページマッピングテーブル510により解決する(S2509)。次に、ストレージプログラム302は、得られた解決アドレスを、アドレス解決要求の発行元ノード上のストレージプログラム302に返却する(S2510)。解決アドレスは、例えば、プールボリューム番号とプールボリュームアドレスとにより表される。
ステップS2508で、判定の結果、指定された領域に自ノードの論理ページが割り当てられていない場合(S2508:N)、ストレージプログラム302は、当該データを格納する他ノードのストレージプログラム302に対して、アドレス解決要求を発行し(S2511)、完了応答を待機する(S2512)。その後、ストレージプログラム302は、他ノードのストレージプログラム302から、アドレス解決完了の応答を受信したら、返却された情報を、アドレス解決要求の発行元に返却する(S2510)。
アドレス解決要求がライト属性である場合、ストレージプログラム302は、ステップS2508において、アドレス解決要求により指定された仮想ボリュームに対して、仮想ページの新規割り当て処理を実行する。仮想ページに自ノードのプールボリューム内の論理ページを割り当てる場合(S2508:Y)、自ノードのプールボリューム内の論理ページを仮想ページに割り当て、割り当てた当該プールボリューム番号とプールボリュームアドレスで表される解決アドレスを、アドレス解決処理の発行元に返却する(S2509、S2510)。仮想ページに他ノードのプールボリューム内の論理ページを割り当てる場合(S2508:N)、その他ノードに対して、ライト属性を指定したアドレス解決要求を発行し(S2511)、完了の応答を待機する(S2512)。その後、応答が返却されると、ストレージプログラム302は、結果をアドレス解決要求の発行元に返却する(S2510)。仮想ページの割り当てについては、前述の同期ライト処理で述べたとおりである。
もし、仮想ページの割り当てが、複数のノード上のストレージプログラムにネストして、割り当てられているとき、リード要求を順番に転送すると、結果返却の際、読み出したデータをネストした全てのストレージプログラムを介して、返却するため、ネットワーク通信量が増加する。本実施例のアドレス解決処理は、データの読み出し元のノードで、データの読み出し先のノードと、論理ドライブ、及び論理アドレスを先に解決することで、リード要求の発行に伴う読み出しデータのネットワーク転送を1回に抑えることができ、ネットワーク通信量を削減する効果がある。
次に、ストレージプログラム302が実行するコレクションリード処理について説明する。
ノードAは、障害ノードであり、データXを格納している。ノードBは、障害ノード上のデータXの冗長コードXxorYxorZを格納している。ノードCは、当該冗長コードの基になるデータYを格納しており、ノードC上のホストが、障害ノード上のデータXをリードしている。ノードDは、当該冗長コードの基になるデータZを格納している。
ノードC上のホストが、障害ノード上のデータXに対してリード処理を発行したとき、ノードCは、ノードAは障害ノードであるため、リード対象データXの冗長コードを格納するノードBに対し、コレクションリード処理の要求を発行する。データの復旧に必要な冗長コードマッピングテーブルや逆マッピングテーブルは、冗長コードノードのローカルのドライブ105に格納しているため、ノードCがコレクションリード処理を冗長コードノードに要求することで、これらの制御情報をノード間で通信する必要がなくなり、オーバヘッドを削減する効果がある。コレクションリード処理の要求を受信したノードBは、データの復旧に必要なライトデータY、X、及び冗長コードX*Y*Zを、自ノード及び他ノードのドライブ105から読み出し、データXを復旧する。その後、ノードBは、復旧したデータを、コレクションリード処理要求の発行元に返却する。
図25は、ストレージプログラム302が実行するコレクションリード処理のフローチャートを示す。
コレクションリード処理は、ホストからリード要求を受信したノードであるリード要求受信ノードの処理(ステップS2609〜S2612)と、冗長コードノードの処理(ステップS2601〜S2608)とを含む。
まず、リード要求受信ノードの処理(ステップS2609〜S2612)について説明する。
リード要求受信ノードのストレージプログラム302は、リード対象ユーザデータが、障害ノード上に存在すると判定した場合、冗長コードノード上のストレージプログラム302に、コレクションリード要求を発行する(S2609)。このとき、コレクションリード要求は、例えば、リード対象ユーザデータのサイト番号、ノード番号、プールボリューム(論理ドライブ)番号、プールボリュームアドレスを指定する。また、冗長コードノードは、前述の静的マッピングテーブルの説明で示した方法を用いて、静的マッピングテーブルより、リード対象ユーザデータのノード番号とプールボリュームアドレスから、特定する。
次に、リード要求受信ノードのストレージプログラム302は、コレクションリード要求に対する応答を受信するまで、待機する(S2610)。ストレージプログラム302は、コレクションリード要求に対する応答を受信すると(S2611)、返却されたリード対象ユーザデータをホストへ返却し、処理を終了する(S2612)。
次に、冗長コードノードの処理(ステップS2601〜S2608)について説明する。冗長コードノードのストレージプログラム302は、コレクションリード要求を受信すると、当該プログラムを実行する。ストレージプログラム302は、キャッシュ上に、コレクションリード要求の要求ユーザデータが存在するか否か判定する(S2601)。具体的には、ストレージプログラム302は、キャッシュ情報503のコードダーティキュー1202から、要求ユーザデータのノード番号、論理ドライブ、論理アドレスと一致するエントリのデータが存在するか否かを確認する。ステップS2601で、判定の結果、キャッシュ上に要求ユーザデータが存在する場合(S2601:Y)、ストレージプログラム302は、当該ユーザデータを、要求元のリード要求受信ノードに返却し、処理を終了する(S2608)。本処理ルートは、当該ユーザデータは、まだデステージ処理が実行されておらず、該ユーザデータの冗長コードが生成されていない状態にあることを意味する。したがって、このような状態にあるユーザデータは、要求ユーザデータを冗長コードから計算しなおす必要がないため、高速にユーザデータを返却することができる。
ステップS2601で、判定の結果、キャッシュ上に要求ユーザデータが存在する場合(S2601:N)、ストレージプログラム302は、冗長コードから、要求ユーザデータを復旧する処理に移行する。まず、ストレージプログラム302は、ログ構造化マッピングテーブル508の冗長コードマッピングテーブル702を参照し、指定されたノード番号、論理ドライブ、及び論理アドレスから、要求ユーザデータの冗長コードの格納位置を特定する。次に、逆マッピングテーブル703を参照し、特定した格納位置から、当該冗長コードの生成に用いられた他ノードのユーザデータを特定する(S2602)。
次に、ストレージプログラム302は、ステップS2602で特定した、他ノードのユーザデータに対して、リード要求を発行する(S2603)。リード要求を発行後、ストレージプログラム302は、自ノードに格納している冗長コードをリードし(S2604)、その後、他ノードからリード処理の完了応答を待機する(S2605)。その後、ストレージプログラム302は、他ノードからのリード処理の完了応答を受信すると、他ノードからリードしたユーザデータと、自ノードからリードした冗長コードとから、リード要求ユーザデータを復旧する(S2606、S2607)。その後、ストレージプログラム302は、復旧したユーザデータを、要求元であるリード要求受信ノードに返却し、処理を終了する(S2608)。
以上のコレクションリード処理によれば、ノードの障害時、一時的なストレージプログラムが、コレクションリード要求を冗長コードノードへ発行し、冗長コードノードがデータを復旧することができる。これにより、一時的なストレージプログラムは、障害ノードのデータを移動先ノードへコピーすることができる。
次に、ストレージプログラム302が実行するコレクションライト処理について説明する。
ノードAは、障害ノードであり、データXを格納している。ノードBは、障害ノード上のデータXの冗長コードXxorYxorZを格納している。ノードCは、当該冗長コードの基になるデータYを格納しており、ノードC上のホストが、障害ノード上のデータXをリードしている。ノードDは、当該冗長コードの基になるデータZを格納している。
ノードC上のホストが、障害ノード上のデータXに対してライト処理を発行したとき、ノードCは、ノードAは障害ノードであるため、コレクションライト処理を実行し、ライト対象データXの冗長コードを格納する冗長コードノードBに対し、冗長コード転送のためのデータ転送処理を実行する。ノードCは、冗長コードノードBに、中間コードを転送する必要がある場合、コレクションリード処理により、ライト対象ユーザデータを復旧してから、当該復旧したライト対象ユーザデータと新規ライトユーザデータで、中間コードを生成し、生成した中間コードを冗長コードノードに転送する。
図26は、ストレージプログラム302が実行するコレクションライト処理のフローチャートを示す。
ここでは、同期ライト処理について、記載しているが、非同期ライト処理についても、同様にして、コレクションライト処理を実施する。
まず、ホストからライト要求を受信したライト要求受信ノードのストレージプログラム302は、ライト対象ユーザデータが同期ライト対象か否か判定する(S2701)。判定方法は、前述の同期ライト処理のとおりである。ステップS2701で、判定の結果、同期ライト対象である場合(S2701:Y)、ストレージプログラム302は、静的マッピングテーブルの説明で示した方法で、ライト対象データのストライプタイプを特定し、特定したストライプタイプと静的マッピングテーブルから、冗長コードノードを決定する(S2702)。次に、ストレージプログラム302は、中間コードの転送が必要か否か判定する(S2703)。
ステップS2703で、判定の結果、中間コードの転送が必要であると判定された場合(S2703:Y)、ストレージプログラム302は、中間コードを生成するために、コレクションリード処理を実行し、ライト対象ユーザデータの復旧処理を行う(S2706)。次に、ストレージプログラム302は、復旧したライト対象データと、新規ライトデータから、中間コードを生成し、生成した中間コードを冗長コードノードに転送する(S2707、S2708)。ステップS2703で、判定の結果、中間コードの転送が必要でないと判定された場合(S2703:N)、ストレージプログラム302は、ライトデータを冗長コードノードに転送する(S2704)。次に、ストレージプログラム302は、全保護レイヤで、処理を完了したか否かを判定する(S2705)。ステップS2705で、判定の結果、全保護レイヤで、処理を完了していない場合(S2705:N)、ストレージプログラム302は、処理を完了していない保護レイヤに対し、ステップS2701から処理を再実行する。ステップS2705で、判定の結果、全保護レイヤで、処理を完了している場合(S2705:Y)、ストレージプログラム302は、処理を終了する。
図27は、ストレージプログラム302が実行する冗長化先変更処理の概念を示す。
この図は、分散型ストレージシステムが、静的マッピングテーブル(構成変更前)110Aから静的マッピングテーブル(構成変更後)110Bに、保護レイヤにおける格納位置を変更することを示している。具体的には、ノード#0〜#3が、2D1Pでノード間のデータ保護を行っていた分散型ストレージシステムに対し、ノード#3を当該保護レイヤから除外する。さらに、この図は、静的マッピングテーブル506Aにおいて、ノード#1のD0(ノード番号=1、ストライプ位置番号=0)のストライプに該当するユーザデータに対し、冗長コードの格納位置をノード#2からノード#0に変更する処理を示している。
冗長コードの格納位置の変更は、以下のようにして行う。まず、ノード#1は、冗長化先変更メイン処理1616Aを実行し、D0のストライプに該当するユーザデータXを読み出し、構成変更後の静的マッピングテーブル506Bを参照する。その後、冗長コードノード#0に、当該ユーザデータを転送する。構成変更後の冗長コードノード#0は、転送されたユーザデータから新しい冗長コードXxorZを生成し、ドライブへ格納する。このとき、冗長コードを生成するデータの組み合わせ(ストライプタイプ)は、構成変更後の静的マッピングテーブル506Bに基づき決定する。具体的には、ノード#0は、ノード#1のD0のストライプに該当するユーザデータXとノード#2のD1のストライプに該当するユーザデータZとで、冗長コードを生成する。
また、冗長コードの格納位置を変更したユーザデータXの構成変更前の古い冗長コードは、もはや不要であるため、ノード#1は、古い冗長コードの消去要求をノード#2に発行する。ノード#2は、古い冗長コードの消去要求を受信すると、冗長化先変更サブ処理1616Bを実行し、要求のあったユーザデータに対応する冗長コードを、ログ構造化マッピングテーブルを参照し、探索し、当該冗長コードの消去を試みる。以上のようにして、分散型ストレージシステムは、冗長化先変更処理として、ユーザデータの冗長コードノードを変更し、保護レイヤの構成変更を行う。
図28は、ストレージプログラム302が実行する冗長化先変更処理のフローチャートを示す。
冗長化先変更処理は、後述する構成変更処理から実行される処理であり、各ノード101のドライブ105に格納しているユーザデータに対する旧冗長コードノードを、構成変更後の新しい静的マッピングテーブルに基づいて新冗長コードノードを変更し、冗長コードを再生成する。冗長化先変更処理は、格納位置が変更される冗長コードの生成に用いられたユーザデータを格納するデータノードにより実行される冗長化先変更メイン処理と、構成変更前の旧冗長コードノードにより実行される冗長化先変更処理サブ処理とを含む。
まず、冗長化先変更メイン処理について説明する。
冗長化先変更メイン処理では、ストレージプログラム302は、各ドライブ105内のユーザデータに対して、論理アドレス順に、ユーザデータの冗長コードノードを変更していく。まず、ストレージプログラム302は、対象ユーザデータのストライプタイプを対象ストライプタイプとして特定し、対象ストライプタイプの構成変更処理が必要か否か判定する(S2901)。ここで、対象ストライプタイプの構成変更処理が必要であるとは、例えば、構成変更前後の静的マッピングテーブルにおいて、対象ストライプタイプの冗長コードを格納するノード番号が変更されていること、又は対象ストライプタイプのユーザデータの組み合わせが変更されていることである。
ステップS2901で、判定の結果、対象ストライプタイプの構成変更処理が必要である場合(S2901:Y)、ストレージプログラム302は、対象ユーザデータをドライブ105からリードする(S2902)。次に、ストレージプログラム302は、対象ストライプタイプと構成変更後の静的マッピングテーブルから、対象ストライプタイプの構成変更後の新冗長コードノードを決定する(S2903)。次に、ストレージプログラム302は、ステップS2903で決定した新冗長コードノードに、対象ユーザデータを転送する(S2904)。ライトデータを受信した新冗長コードノードのストレージプログラム302は、キャッシュ情報503のコードダーティキュー1202に、受信したライトデータをキューイングし、デステージ処理で、冗長コードを生成し、ドライブ105に格納する。
次に、ストレージプログラム302は、対象ストライプタイプと構成変更前の静的マッピングテーブルから、対象ストライプタイプの構成変更前の旧冗長コードノードを特定する(S2905)。次に、ストレージプログラム302は、ステップS2906で特定した旧冗長コードノードに対し、構成変更前の冗長コードを消去することを要求する冗長コード消去要求を発行する(S2906)。冗長コード消去要求は、例えば、対象ユーザデータのサイト番号、ノード番号、論理ドライブ番号、及び論理アドレスを含む。構成変更前の旧冗長コードノードにより実行される冗長化先変更サブ処理の詳細は、後述する。
次に、ストレージプログラム302は、対象ストライプタイプ内の全ユーザデータに対して、処理を完了したか否かを判定する(S2907)。例えば、ストレージプログラム302は、ドライブ状態管理テーブル514に、冗長コード変更ポインタを保持し、当該ポインタにより、当該ユーザデータに対する処理が完了しているか否かを判定する。具体的には、ストレージプログラム302は、論理アドレスに対し、若い論理アドレスから、一定のデータサイズで、順に冗長化先変更処理を実行し、1つのデータに対し、処理が完了すると、冗長コード変更ポインタを更新する。このとき、ストレージプログラム302は、冗長コード変更ポインタが指す論理アドレスよりも小さい値の論理アドレスに対する冗長化先変更処理が完了済みであると判定でき、冗長コード変更ポインタが指す論理アドレスよりも大きい値の論理アドレスに対する冗長化先変更処理が未完了であると判定できる。
ステップS2907で、判定の結果、処理が未完了のユーザデータが存在する場合(S2907:N)、ストレージプログラム302は、当該ユーザデータに対して、S2902から処理を実行する。
ステップS2907で、判定の結果、対象ストライプタイプ内の全ユーザデータに対する処理が完了した(処理が未完了のユーザデータが存在しない)場合(S2907:Y)、ストレージプログラム302は、ドライブ105内の全ストライプタイプに対して処理を完了したか否かを判定する(S2908)。ステップS2908で、判定の結果、全ストライプタイプに対して処理を完了している場合(S2908:Y)、ストレージプログラム302は、処理を終了する。ステップS2908で、判定の結果、全ストライプタイプに対して処理を完了していない場合(S2908:N)、ストレージプログラム302は、処理が未完了のストライプタイプに対して、ステップS2901から処理を再実行する。
ステップS2901で、判定の結果、当該ストライプタイプの構成変更処理が必要でない場合(S2901:N)、ストレージプログラム302は、ドライブ105内の全ストライプタイプに対して処理を完了したか否かを判定する(S2908)。
次に、冗長化先変更サブ処理について説明する。
冗長コード消去要求を受信したストレージプログラム302は、冗長コード消去要求により指定された対象ユーザデータがキャッシュ上に存在するか否か判定する(S2909)。具体的には、ストレージプログラム302は、キャッシュ情報503のコードダーティキュー1202から、指定されたノード番号、論理ドライブ番号、及び論理アドレスと一致するユーザデータが存在するかどうか、確認する。
ステップS2909で、判定の結果、対象ユーザデータがキャッシュ上に存在する場合(S2909:Y)、ストレージプログラム302は、当該ユーザデータをキャッシュ上から消去する。具体的には、ストレージプログラム302は、コードダーティキュー1202から当該ユーザデータのエントリを除外し、そのエントリをフリーキュー1205に繋ぎなおす。
ステップS2909で、判定の結果、対象ユーザデータがキャッシュ上に存在しない場合(S2909:N)、ストレージプログラム302は、対象ユーザデータが、構成変更後の新しい静的マッピングテーブルによって冗長化済みであることを示すフラグを設定する(S2910)。例えば、ストレージプログラム302は、ログ構造化マッピングテーブル508の逆マッピングテーブル703における、対象ユーザデータのエントリに、当該フラグを設定する。次に、ストレージプログラム302は、対象ユーザデータに対応する対象冗長コードが消去可能であるか否かを判定する(S2911)。具体的には、ストレージプログラム302は、ステップS2910で設定したフラグを確認し、対象冗長コードの逆マッピングテーブル703における、ユーザデータ毎のエントリのフラグを確認し、対象冗長コードの生成に用いられた全てのユーザデータが新しい静的マッピングテーブルによって冗長化済みである場合に、対象冗長コードが消去可能であると判定する。
ステップS2911で、判定の結果、対象冗長コードが消去可能である場合(S2911:Y)、ストレージプログラム302は、対象冗長コードを消去する(S2912)。具体的には、ストレージプログラム302は、冗長コードマッピングテーブル702と逆マッピングテーブル703から対象冗長コードのエントリを削除し、ローカル領域管理テーブルの対象冗長コードのエントリを有効リスト801からフリーリスト803に繋ぎ直す。ステップS2911で、判定の結果、対象冗長コードが消去可能でない場合(S2911:N)、処理を終了する。
以上の冗長化先変更処理によれば、分散型ストレージシステムは、構成変更後の冗長コードを生成すると共に、構成変更前の冗長コードを消去することができる。これにより、分散型ストレージシステムは、構成変更前の冗長コードの記憶領域を、その後の冗長コードの記憶領域として利用することができる。
分散型ストレージシステムは、保護レイヤ#3においても保護レイヤ#2と同様の処理を行うことができる。ノードは、ライト要求を受けた場合、ライト要求と非同期で、サイトグループ情報(例えば、静的マッピングテーブル507)に基づいて他のサイトから転送先サイトを選択し、ライトデータに基づくサイト転送データ(例えば、ライトデータ)を転送先サイトへ送信する。また、ノードは、複数の他のサイトから複数のサイト転送データを夫々受信した場合、サイトグループ情報に基づいて複数のサイト転送データからサイト冗長コードを生成し、ローカルの記憶デバイス(例えば、ドライブ105)へサイト冗長コードを書き込む。複数のサイトの構成が変更される場合、ノードは、変更された複数のサイトの構成に基づいてサイトグループ情報を変更し、ローカルの記憶デバイスからデータを読み出し、変更後のサイトグループ情報に基づいて、読み出されたデータに対応する変更後のサイト冗長コードを格納するサイトである新冗長コードサイトを選択し、読み出されたデータに基づく再転送データを新冗長コードサイトへ送信し、変更前のサイトグループ情報に基づいて、読み出されたデータに基づくデータに対応する変更前のサイト冗長コードを格納するサイトである旧冗長コードサイトを選択し、変更前のサイト冗長コードを消去することを要求する消去要求を、旧冗長コードサイトへ送信する。これにより、複数のサイトの構成を変更する場合でも、冗長度を維持することができる。また、他の保護レイヤと併用することにより、信頼性を高めることができる。サイトグループは、保護レイヤ#3のストライプタイプ等に対応する。サイト転送データは、ライトデータ、ライトデータの一部、中間コード、Class1 Code等に対応する。
分散型ストレージシステムは、保護レイヤ#1においても保護レイヤ#2と同様の処理を行うことができる。保護レイヤ#1において、ノードは、ライト要求を受けた場合、ローカルの複数の記憶デバイス(例えば、ドライブ105)の中の第一記憶デバイスへライトデータを書き込み、記憶デバイスグループ情報(例えば、静的マッピングテーブル505)に基づいて、ライトデータから記憶デバイス冗長コードを生成し、記憶デバイスグループ情報に基づいて、複数の記憶デバイスの中の第二記憶デバイスへ記憶デバイス冗長コードを書き込む。複数の記憶デバイスの構成が変更される場合、変更された複数の記憶デバイスに対応するノードは、変更された複数の記憶デバイスの構成に基づいて記憶デバイスグループ情報を変更し、記憶デバイスからデータを読み出し、変更後の記憶デバイスグループ情報に基づいて、読み出されたデータに対応する変更後の記憶デバイス冗長コードを格納する記憶デバイスである新冗長コード記憶デバイスを選択し、読み出されたデータに基づく記憶デバイス再転送データを新冗長コード記憶デバイスへ書き込み、変更前の記憶デバイスグループ情報に基づいて、読み出されたデータに対応する変更前の記憶デバイス冗長コードを格納する記憶デバイスである旧冗長コード記憶デバイスを選択し、変更前の記憶デバイス冗長コードを消去することを要求する消去要求を、旧冗長コード記憶デバイスへ発行する。これにより、複数のドライブの構成を変更する場合でも、冗長度を維持することができる。また、他の保護レイヤと併用することにより、信頼性を高めることができる。記憶デバイスグループは、保護レイヤ#1のストライプタイプ等に対応する。記憶デバイス転送データは、ライトデータ、ライトデータの一部、中間コード、Class1 Code等に対応する。
図29は、管理プログラム303が実行する仮想マシン移動先選定処理のフローチャートを示す。
管理プログラム303は、仮想マシンの配置パタンを一時的に格納する一時配置パタンテーブル3000を初期化する(S3001)。具体的には、一時配置パタンテーブル3000における配置パタンとネットワーク通信コストへ無効値を設定する。
次に、管理プログラム303は、仮想マシンの物理マシンへの配置パタンを生成する(S3002)。配置パタンの生成方法は、例えば、一般的に知られている組み合わせ列挙のアルゴリズムにより、物理マシンと仮想マシンの配置の組み合わせを網羅的に列挙する。ただし、ストレージプログラム302が動作する仮想マシンは、ローカルのドライブ105を操作するため、移動対象仮想マシンとされない。又は、ストレージプログラム302が動作する仮想マシンが移動対象として選定された場合、当該配置パタンは、破棄される。
次に、管理プログラム303は、生成した配置パタンが、配置ポリシに適合するか否か判定する(S3009)。具体的には、管理プログラム303は、後述する配置ポリシを示す配置ポリシ管理テーブルを参照し、例えば、配置ポリシにより異なる物理マシンに配置されるように設定されている複数の仮想マシンを、同じ物理マシンに配置するような配置パタンが生成された場合、当該配置パタンは配置ポリシに適合しないため、当該配置パタンを破棄する。これにより、管理プログラム303は、クラスタ構成をとるアプリケーションプログラム301を動作させている仮想マシンを物理的に別のノード101で動作させることができるため、ノード障害時のアプリケーションプログラム301への影響範囲を小さくすることができる。
さらに、例えば、配置ポリシにより同一物理マシンに配置するように設定されている複数の仮想マシンを、異なる物理マシンに配置するような配置パタンが生成された場合、当該配置パタンは配置ポリシに適合しないため、管理プログラム303は、当該配置パタンを破棄する。これにより、管理プログラム303は、多量にネットワーク通信を行う仮想マシン同士を、同一物理マシンに配置することで、これら仮想マシンのネットワーク通信を、ハイパーバイザ304により提供される仮想ネットワークを介した通信で実現することができるため、物理マシン間でのネットワーク通信量を削減することができる。
ステップS3009で、判定の結果、生成した配置パタンが配置ポリシに適合しない場合(S3009:N)、管理プログラム303は、ステップS3007に移行する。
ステップS3009で、判定の結果、生成した配置パタンが配置ポリシに適合する場合(S3009:Y)、管理プログラム303は、生成した配置パタンにおけるネットワーク通信コストを計算する。
具体的には、管理プログラム303は、以下の式により、特定の物理マシンのネットワーク通信コストを計算する。
物理マシンのネットワーク通信コスト =
自ノード物理マシンに配置された仮想マシンと他ノード物理マシンに配置された仮想マシンのネットワーク通信量の合計
例えば、物理マシンが3台(物理マシン#0、#1、#3)、仮想マシンが5台(仮想マシン#0、#1、#2、#3、#4)をシステム構成とするとき、物理マシンと仮想マシンを以下のように配置されたとする。
物理マシン#0:仮想マシン#0、#1
物理マシン#1:仮想マシン#2、#3
物理マシン#2:仮想マシン#4
このとき、物理マシン#0のネットワーク通信コストは、以下のようになる。
物理マシン#0のネットワーク通信コスト =
仮想マシン#0−#2間のネットワーク通信量
+ 仮想マシン#0−#3間のネットワーク通信量
+ 仮想マシン#0−#4間のネットワーク通信量
+ 仮想マシン#1−#2間のネットワーク通信量
+ 仮想マシン#1−#3間のネットワーク通信量
+ 仮想マシン#1−#4間のネットワーク通信量
管理プログラム303は、ネットワーク監視テーブル1307から、各仮想マシン間のネットワーク通信量を取得する。その後、管理プログラム303は、各物理マシンのネットワーク通信コストのうち、最大となるネットワーク通信コストを当該配置パタンのネットワーク通信コストとして、一時配置パタンテーブル3000に設定する。
次に、管理プログラム303は、現在の一時配置パタンテーブル3000のネットワーク通信コストが無効値、又はステップS3003での計算結果が現在の一時配置パタンテーブル3000のネットワーク通信コストより小さいか、否かを判定する(S3004)。
ステップS3004で、判定の結果、現在の一時配置パタンテーブル3000のネットワーク通信コストが無効値又はステップS3003での計算結果が現在の一時配置パタンテーブル3000のネットワーク通信コストより、小さい場合(S3004:Y)、管理プログラム303は、ステップS3005に移行する。
ステップS3004で、判定の結果、現在の一時配置パタンテーブル3000のネットワーク通信コストが無効値でなく、且つステップS3003での計算結果が、現在の一時配置パタンテーブル3000のネットワーク通信コストより大きい場合(S3004:N)、管理プログラム303は、当該配置パタンを破棄し、ステップS3007に移行する。
ステップS3005で管理プログラム303は、現在選択中の配置パタンに仮想マシンを移動したとき、ネットワーク以外の仮想マシンのリソース、CPU/メモリ/ストレージが物理マシンのリソース合計を超過しないか否か判定する。具体的には、管理プログラム303は、CPU/メモリ/ストレージ監視テーブル1306を参照し、当該配置パタンでの同物理マシンに配置された仮想マシンのリソース合計が、物理マシン構成管理テーブル1303に格納された配置先の物理マシンのリソース最大値を超過していないか判定する。
ステップS3005で、判定の結果、仮想マシンのリソース使用量の合計が、物理マシンの最大リソース量を超えていない場合(S3005:Y)、管理プログラム303は、現在の一時配置パタンテーブル3000を、新しい計算結果の配置パタンで更新する(S3006)。ステップS3005で、判定の結果、仮想マシンのリソース使用量の合計が、物理マシンの最大リソース量を超えている場合(S3005:N)、管理プログラム303は、ステップS3007に移行する。
ステップS3007で管理プログラム303は、仮想マシンの物理マシンへの全ての配置パタンに対して、処理を完了したか否かを判定し、まだ未完了の配置パタンが存在する場合(S3007:N)、ステップS3002から処理を実行する。ステップS3007で、判定の結果、仮想マシンの物理マシンへの全ての配置パタンに対して、処理を完了した場合(S3007:Y)、管理プログラム303は、現在の一時配置パタンテーブル3000に格納されている配置パタンを新しい配置パタンとして、決定する(S3008)。
以上のように管理プログラム303は、仮想マシンの物理マシンへの配置先を決定することで、物理マシンの外部のネットワーク通信と、物理マシンの内部のネットワーク通信とを考慮した仮想マシンの物理マシンへの配置を実現できる。つまり、管理プログラム303は、内部のネットワーク通信量が多く、外部のネットワーク通信量が少ない配置パタンを見つけることができ、システム全体の物理ネットワークのネットワーク通信量を削減できる。
以下、管理プログラム303により管理者へ提供されるGUI(Graphical User Interface)について説明する。各GUIは、分散型ネットワークシステムに接続された端末装置により、表示され、管理者からの入力を受け付けてもよい。
図30は、ノード設定画面の構成例を示す。
ノード設定画面におけるGUI3114は、ユーザにノード構成の設定情報を表示し、管理者がノード構成を設定するためのインタフェースを提供する。GUI3114は、ノード情報3101、ノード構成設定3102、ドライブ構成設定3107、及びデータ保護設定3110を含む。各カラムへの入力は、ユーザが任意の値を入力することでもよいし、ユーザがプルダウンにより登録済みの情報を選択することでもよい。
ノード情報3101は、ノード毎のエントリを有する。各エントリは、ノードID、ノード名、IPアドレス、状態を含む。ノードIDは、ノード、つまり物理マシンの識別子を示しており、システムで一意な値である。本識別子は、ノードの追加、及び変更時に、システムにより決定される。ノード名は、ノードの追加及び変更時にユーザが指定した任意の文字列を示す。IPアドレスは、ノードに追加及び変更時にユーザが指定したIPアドレス、又はシステムが決定したIPアドレスを示す。状態は、ノードの状態を示しており、例えば、正常、障害、復旧中、構成変更中を含む。状態が、復旧中又は構成変更中である場合、復旧処理、及び構成変更処理の進捗をユーザに示してもよい。
以上により、ユーザは、システムを構成している各ノードの構成、及び状態を確認することができる。
ノード構成設定3102は、ノード名3103、IPアドレス3104、サイト設定3105、ジオ設定3106を含む。ユーザが各項目の値を入力後、ノード構成設定3102下部に設けられた「追加」、「変更」、又は「削除」ボタンを押すことにより、管理プログラム303は、処理を実行する。追加の場合、管理プログラム303は、設定対象ノードを新たにシステムに追加する。変更の場合、管理プログラム303は、設定対象ノードの設定を、入力した値に変更する。削除の場合、管理プログラム303は、設定対象ノードをシステムから削除する。
ノード名3103は、設定対象ノードの名称を指定できる。ユーザは、本項目に、設定対象ノードを入力する。IPアドレス3104は、設定対象ノードに設定するIPアドレスを指定できる。ユーザが本項目に任意の値を入力してもよい。また、IPアドレス3104に対しAUTOが選択された場合、システムが使用可能なIPアドレスを検索し、使用可能なIPアドレスを自動で設定対象ノードに設定する。管理プログラム303は、ノード情報3101のテーブルにより、設定されたIPアドレスを確認できる。サイト設定3105は、設定対象ノードが属するサイト保護レイヤ(保護レイヤ#2)のゾーンを指定できる。このゾーンは、後述するデータ保護設定で、登録することができ、このゾーンに追加されたノード間で、冗長コードを生成し、ノード間のデータの保護を行う。ジオ設定3106は、設定対象ノードが属するジオ保護レイヤ(保護レイヤ#3)のゾーンを指定できる。このゾーンは、後述するデータ保護設定で、登録することができ、このゾーンに追加されたサイト間で、冗長コードを生成し、サイト間のデータの保護を行う。
ドライブ構成設定3107は、ノード名3108、ドライブ名3109を含む。ユーザが各項目の値を入力後、ドライブ構成設定3107下部に設けられた「追加」、又は「削除」ボタンを押すことにより、管理プログラム303は、処理を実行する。追加の場合、管理プログラム303は、設定対象のノードに、指定されたドライブを追加する。削除の場合、管理プログラム303は、設定対象のノードから、指定されたドライブを削除する。
ノード名3108は、ドライブを追加する対象のノードの名称を指定できる。ドライブ名3109は、追加対象のドライブの名称を指定できる。ドライブの名称は、システムにより検出されたドライブの名称が表示される。
データ保護設定3110は、レイヤ名3111、保護レベル3112、保護方式3113を含む。ユーザが各項目の値を入力後、データ保護設定3110下部に設けられた「追加」、「変更」、又は「削除」ボタンを押すことにより、管理プログラム303は、処理を実行する。追加の場合、管理プログラム303は、設定対象の保護レイヤを新たにシステムに追加する。変更の場合、管理プログラム303は、設定対象の保護レイヤの設定を、入力した値に変更する。削除の場合、管理プログラム303は、設定対象の保護をシステムから削除する。
レイヤ名3111は、設定対象の保護レイヤの名称を指定できる。保護レベル3112は、設定対象の保護レイヤのデータ保護の方針(XDYP:最大Data数X、冗長コード数Y)を指定できる。ノード数がX+Yに満たない場合、リソースのストレージ容量が異なる場合などにおいて、分散型ストレージシステムは、実構成内においてこれらに近い値を保護レベル3112として使用する。保護方式3113は、設定対象の保護レイヤにおいて、冗長コード生成のためのデータ転送をホストI/Oと同期で実施するか、非同期で実施するかを指定できる。
図31は、配置ポリシ設定画面の構成例を示す。
配置ポリシ設定画面におけるGUI3201は、ユーザに仮想マシンの配置ポリシを設定するインタフェースを提供する。GUI3201は、配置ポリシ情報3202、配置ポリシ設定3203を含む。各カラムへの入力は、ユーザが任意の値を入力することでもよいし、ユーザがプルダウンにより登録済みの情報を選択することでもよい。
配置ポリシ情報3202は、ポリシID、ポリシ名、仮想マシンID、及びポリシ種別の情報をユーザに表示する。ポリシIDは、新規ポリシ追加時に、システムにより割り当てられる識別子であり、システムがポリシを参照するときに使用される。ポリシ名は、ユーザが任意に指定可能な文字列であり、ユーザがポリシを確認するときに使用する。仮想マシンIDは、当該ポリシの設定対象である仮想マシンの識別子である。当該仮想マシンに対して、設定したポリシが適用される。ポリシ種別は、適用するポリシの種類であり、例えば、同ノード配置と別ノード配置の2種類がある。同ノード配置は、適用対象の複数の仮想マシンを同ノード(物理マシン)に配置することを意味する。別ノード配置は、適用対象の複数の仮想マシンをそれぞれ別ノード(物理マシン)に配置することを意味する。
配置ポリシ設定3203は、配置ポリシの設定インタフェースをユーザに提供する。配置ポリシ設定3203は、ポリシ名3204、ポリシ種別3205、及び仮想マシン名3206を含む。ユーザが各項目の値を入力後、配置ポリシ設定3203下部に設けられた「変更」、「追加」、又は「削除」ボタンを押すことにより、管理プログラム303は、設定情報をシステムに反映する。追加の場合、管理プログラム303は、設定対象のポリシを新たにシステムに追加する。変更の場合、管理プログラム303は、設定対象のポリシを、入力した値に変更する。削除の場合、管理プログラム303は、設定対象のポリシをシステムから削除する。
ポリシ名3204は、設定対象のポリシの名称を指定する。ポリシ種別3205は、適用するポリシの種類を指定する。ポリシ種別の説明は、先に述べたとおりである。仮想マシン名3206は、ポリシ適用対象の仮想マシンの名称を指定する。
図32は、実施例2におけるオフロード構成を示す。
本実施例においては、ドライブ105の代わりにフラッシュドライブ3301が用いられる。ネットワーク203により接続されたノード101のバックエンドポート208は、仮想的又は物理的なネットワーク203を介して複数のフラッシュドライブ3301に接続されている。一つのサイトには、1又は複数のノード101が設置されている。
ノード101は、他のノード101を介することなく、バックエンドネットワーク203を介してフラッシュドライブ3301それぞれと通信可能であり、ローカルドライブとして使用できる。一つのフラッシュドライブ3301は、一つのノード101とのみ通信する。
バックエンドネットワーク203は、複数のノード101を相互接続してもよく、バックエンドネットワーク203が接続されたノード101間は、バックエンドネットワーク203を使用して通信する。バックエンドネットワーク203で接続されていないノード間の通信は、例えば、外部ネットワーク204を使用する。
フラッシュドライブ3301は、バックエンドネットワーク203に接続するためのI/F、データを一時的に格納するバッファメモリ、フラッシュドライブ3301を制御する内部プロセッサ、及びデータを格納する複数のフラッシュメモリを含む。
本実施例の分散型ストレージシステムは、冗長コード生成処理、及びログ構造化形式でのデータ格納処理を、フラッシュドライブ3301で実施することにより、オフロード構成を実現する。これにより、ノード101は、冗長コードの生成及びログ構造化形式を意識することなく、ライト処理を実施できるため、ライト処理の時間を短縮できる。
本実施例のオフロード構成は、具体的には、次に説明するコーディネータプログラム3401とドライブプログラム3402で実現される。コーディネータプログラム3401は、ノード101上で動作するプログラムであり、ホストからストレージI/Oを受信し、ノード101間、及びフラッシュドライブ3301間での通信処理を実施する。
ドライブプログラム3402は、フラッシュドライブ3301の内部プロセッサ上で動作するプログラムであり、コーディネータプログラム3401から受信したコマンドを処理する。
この図の例では、分散型ストレージシステムは、ノード101A〜101Cを含む。ノード101A〜101Cは、プロセッサ206A〜206Cを夫々含む。ノード101Aは、フラッシュドライブ3301A〜3301Cを含み、ノード101Bは、フラッシュドライブ3301D〜3301Eを含み、ノード101Cは、フラッシュドライブ3301F〜3301Gを含む。プロセッサ206A〜206Cは、コーディネータプログラム3401A〜3401Cを夫々実行する。フラッシュドライブ3301A〜3301Gは、ドライブプログラム3402A〜3402Gを夫々実行する。
ノード101Bのコーディネータプログラム3401Bは、ホストからライト要求を受信すると、フラッシュドライブ3301D上で動作するドライブプログラム3402Dへ、ホストからのユーザデータDATA1を書き込むためのライトコマンドを発行する。それと同時に、フラッシュドライブ3301E上で動作するドライブプログラム3402Eへ、ノード内の冗長コードを生成するためのコマンドを発行し、さらにノード間の冗長コードを生成するため、ノード101A上で動作するコーディネータプログラム3401AにユーザデータDATA1を転送する。
ドライブプログラム3402Dは、受信したユーザデータDATA1を、フラッシュドライブ3301D内の不揮発媒体へ格納する。ドライブプログラム3402Eは、フラッシュドライブ3301E内のバッファメモリ上に存在するコードダーティキューへ、受信したユーザデータDATA1をキューイングし、デステージ処理でユーザデータDATA1から冗長コードCode4を生成し、不揮発媒体へ格納する。つまり、フラッシュドライブ3301Dとフラッシュドライブ3301Eが、一つのストライプタイプのデータドライブ、及び冗長コードドライブに夫々対応する。冗長コードドライブは、ユーザデータのライト先アドレスと、実施例1で説明した静的マッピングテーブルに基づいて、決定される。また、この図の例の分散型ストレージシステムは、一つのユーザデータから冗長コードを生成しているが、冗長コードは、複数のドライブにライトされたユーザデータ同士で生成してもよい。
ノード101Cは、ホストからユーザデータDATA2のライト要求を受信すると、ノード101Bと同様に処理する。
これにより、ノード101Aは、ノード101Bとノード101CからユーザデータDATA1、DATA2を受信する。ノード101Aのコーディネータプログラム3401Aは、冗長コードを格納するフラッシュドライブ3301Aを決定し、冗長コード書き込みのためのコマンドを用いて、受信したユーザデータDATA1、DATA2を当該フラッシュドライブ3301Aへ書き込む。
冗長コード書き込みのコマンドを受信したドライブプログラム3402Aは、フラッシュドライブ3301A内のバッファメモリに存在するコードダーティキューに受信したユーザデータをキューイングし、デステージ処理でノード間の冗長コードCode1を生成し、不揮発媒体へ格納する。
また、コーディネータプログラム3401は、各フラッシュドライブ3301の容量が枯渇しないように、容量の管理を行う。具体的には、コーディネータプログラム3401は、フラッシュドライブ3301の実際使用量を、後述するローカル領域量テーブルを用いて監視し、目標使用量を超過したフラッシュドライブ3301Bのユーザデータの冗長コードを格納するフラッシュドライブ3301B上のドライブプログラム3402Bに対し、容量削減要求を発行し、不要な冗長コード及びユーザデータの消去処理を行う。
また、管理プログラム303は、一つ又は複数のノード101上で動作しており、各ノード101上のコーディネータプログラム3401に対して、ノード101の追加や削除、復旧処理といった管理オペレーションを発行する。
図33は、分散型ストレージシステムの制御のためにフラッシュドライブ3301で管理されるログ構造化マッピングテーブル508bの構成例について示す。
フラッシュドライブ3301内のバッファメモリ3504は、ログ構造化マッピングテーブル508bを格納する。
ログ構造化マッピングテーブル508bは、ログ構造化マッピングテーブル508内の情報に加え、アドレス識別子変換テーブル3501とアドレス識別子フリーリスト3502を含む。
アドレス識別子変換テーブル3501は、データを一意に識別するためのアドレス識別子と、論物(論理アドレス−物理アドレス)変換情報であるログ情報との、対応関係を示す。フラッシュドライブ3301は、ユーザデータが書き込まれる度に、論物変換情報を更新し、更新した論物変換情報をログ情報として、ドライブ内で一意な識別子であるアドレス識別子を付与し、管理する。フラッシュドライブ3301は、他フラッシュドライブが保持されている冗長コードに対し、その冗長コードの生成に用いられたユーザデータの情報を、アドレス識別子を用いて保持する。
これにより、フラッシュドライブ3301は、ガベージコレクション処理やウェアレベリング処理を行うことにより自ノードのフラッシュドライブに格納されているユーザデータの物理アドレスが変更されても、他ノードのフラッシュドライブへ変更後の物理アドレスを通知しなくてよいため、フラッシュドライブ3301間の通信オーバヘッドを削減できる。
アドレス識別子フリーリスト3502は、未使用のアドレス識別子を格納している。コーディネータプログラム3401は、ユーザデータを書き込むとき、アドレス識別子フリーリスト3502の先頭からアドレス識別子を取得(デキュー)し、取得したアドレス識別子とともにフラッシュドライブ3301へユーザデータを書き込む。
フラッシュドライブ3301は、指定されたアドレス識別子と共にログ情報をアドレス識別子変換テーブル3501へ格納する。また、コーディネータプログラム3401は、無効ユーザデータを消去する契機(INVALIDATEコマンド発行契機)で、消去されたアドレス識別子を、アドレス識別子フリーリスト3502の末尾へ登録(エンキュー)する。
なお、フラッシュドライブ3301は、ログ構造化マッピングテーブル508bのバックアップ3506をフラッシュメモリ3505へ格納してもよい。
図34は、コーディネータプログラム3401とドライブプログラム3402間の通信インタフェースを示す。
コーディネータプログラム3401は、次のコマンドをドライブプログラム3402へ発行することができる。
D_WRITEコマンド3601は、ユーザデータを格納するフラッシュドライブ上のドライブプログラムに対し、ドライブ番号、LBA、データ転送長、アドレス識別子を引数として、ユーザデータの書き込みを行う。
P_WRITEコマンド3602は、冗長コードを格納するフラッシュドライブ上のドライブプログラムに対し、ドライブ番号、データ転送長、データ格納情報を引数として、冗長コード生成のためのユーザデータの書き込みを行う。データ格納情報は、ユーザデータを格納するフラッシュドライブのノード番号、ドライブ番号、LBA、アドレス識別子を含む。
D_READコマンド3603は、ユーザデータを格納するフラッシュドライブ上のドライブプログラムに対し、ドライブ番号、LBA、データ転送長を引数として、有効ユーザデータを読み出す。
OLD_D_READコマンド3604は、ユーザデータを格納するフラッシュドライブ上のドライブプログラムに対し、ドライブ番号、アドレス識別子、データ転送長を引数として、無効ユーザデータを読み出す。本コマンドは、コレクションリードの際に、障害データを復旧するために使用される。
P_GETコマンド3605は、ドライブ番号を引数として、冗長コードを格納するフラッシュドライブから、そのフラッシュドライブにおけるデステージ処理で生成された冗長コードの生成において、生成に用いられたユーザデータを示す冗長コード構成情報を取得する。冗長コード構成情報は、ユーザデータを格納するフラッシュドライブのノード番号、ドライブ番号、LBA、及びアドレス識別子を含む。
P_PUSHコマンド3606は、ドライブ番号と、冗長コード構成情報を引数として、2つ目以降の冗長コードを格納するフラッシュドライブに対し、冗長コード構成情報を通知する。
INVALIDコマンド3607は、容量枯渇管理処理時、ユーザデータを格納するフラッシュドライブに対し、ドライブ番号、アドレス識別子を引数として、不要となった無効ユーザデータを消去する。
SEARCHコマンド3608は、容量枯渇管理処理時、冗長コードを格納するフラッシュドライブに対し、削除対象の冗長コードの探索を依頼し、探索結果として、削除対象冗長コードの冗長コード情報と、削除対象冗長コードの冗長コード構成情報とを取得する。削除対象冗長コードの冗長コード情報は、冗長コードを格納するフラッシュドライブのドライブ番号とLBAを含む。削除対象冗長コードの冗長コード構成情報は、ユーザデータを格納するフラッシュドライブのドライブ番号、LBA、アドレス識別子、及び当該ユーザデータが有効ユーザであるか無効ユーザデータであるかを示す情報を含む。
P_READコマンド3609は、コレクションリード処理時、冗長コードを格納するフラッシュドライブから、復旧対象ユーザデータの冗長コード、及び冗長コード構成情報を取得する。冗長コード構成情報は、冗長コードを生成したユーザデータの格納位置、ノード番号、ドライブ番号、LBA、アドレス識別子を含む。
以上のコマンドにより、コーディネータプログラム3401とドライブプログラム3402間で通信を行うことにより、オフロード構成を実現する。
以下、実施例2の分散型ストレージシステムの動作について説明する。
図35は、実施例2のリード処理のフローチャートを示す。
本実施例のリード処理において、コーディネータプログラム3401は、ドライブプログラム3402からユーザデータを読み込む処理である。
コーディネータプログラム3401は、ホストからのリード要求が、自ノード内のフラッシュドライブへのアクセスであるか否かを判定する(S3701)。
ステップS3701で、判定の結果、他ノードのフラッシュドライブへのアクセスである場合(S3701:N)、コーディネータプログラム3401は、他ノードのコーディネータプログラム3401へリード要求を転送する(S3707)。リード要求を受信した他ノードのコーディネータプログラム3401は、本処理と同様にリード要求を処理する。
ステップS3701で、判定の結果、自ノードのフラッシュドライブへのアクセスである場合(S3701:Y)、コーディネータプログラム3401は、アクセス先のフラッシュドライブが障害ドライブであるか否かを判定する(S3702)。
ステップS3702で、判定の結果、アクセス先のドライブが障害ドライブである場合(S3702:Y)、コーディネータプログラム3401は、後述するコレクションリード処理を実行する(S3708)。
ステップS3702で、判定の結果、アクセス先のドライブが障害ドライブでない場合(S3702:N)、コーディネータプログラム3401は、D_READコマンドをアクセス先のフラッシュドライブ上のドライブプログラム3402に発行し(S3703)、処理の完了を待機する(S3704)。
ドライブプログラム3402は、D_READコマンドを受信すると、ログ構造化マッピングテーブル508bのアドレス識別子変換テーブル3501の論物変換情報を参照し、指定された論理アドレスを物理アドレスに変換する(S3709)。
次に、ドライブプログラム3402は、不揮発媒体から指定されたユーザデータを読み込み、結果を、コーディネータプログラム3401に返却する(S3710、S3711)。
コーディネータプログラム3401は、ドライブプログラム3402から完了応答を受信すると、返却されたユーザデータをホストへ返却する(S3706)。
図36は、実施例2の同期ライト処理のフローチャートを示す。
本実施例の同期ライト処理において、コーディネータプログラム3401は、ドライブプログラム3402へユーザデータを書き込む。コーディネータプログラム3401は、ログ構造化形式を意識することなく、データを書き出すことができるため、ライト処理時間を短縮できる。
コーディネータプログラム3401は、ホストからのライト要求が、自ノード内のフラッシュドライブへのアクセスであるか否かを判定する(S3801)。
ステップS3801で、判定の結果、他ノードのフラッシュドライブへのアクセスである場合(S3801:N)、コーディネータプログラム3401は、他ノードのコーディネータプログラム3401へライト要求を転送する(S3810)。ライト要求を受信した他ノードのコーディネータプログラム3401は、本処理と同様にライト要求を処理する。
ステップS3801で、判定の結果、自ノードのフラッシュドライブへのアクセスである場合(S3801:Y)、コーディネータプログラム3401は、アクセス先のフラッシュドライブが障害ドライブであるか否か判定する(S3802)。
ステップS3802で、判定の結果、アクセス先のドライブが障害ドライブである場合(S3802:Y)、コーディネータプログラム3401は、図27で説明したコレクションライト処理を実行する(S3711)。
ステップS3802で、判定の結果、アクセス先のドライブが障害ドライブでない場合(S3802:N)、コーディネータプログラム3401は、アドレス識別子フリーリストから、フリーのアドレス識別子を取得する(S3803)。
次に、コーディネータプログラム3401は、取得したアドレス識別子を含むD_WRITEコマンドをアクセス先のフラッシュドライブ上のドライブプログラム3402に発行する(S3804)。
ドライブプログラム3402は、D_WRITEコマンドを受信すると、受信したユーザデータを、キャッシュ情報のデータダーティキューに接続し(S3813)、結果をコーディネータプログラム3401に返却する(S3814)。
次に、コーディネータプログラム3401は、冗長コードを格納するためのユーザデータ転送を行うため、処理対象の保護レイヤの冗長コードの格納位置が、自ノードか否かを判定する(S3805)。
ステップS3805で、判定の結果、他ノードに冗長コードを格納する場合(S3805:N)、コーディネータプログラム3401は、他ノードのコーディネータプログラム3401に、P_WRITEコマンドを転送する(S3812)。P_WRITEコマンドを受信した他ノードのコーディネータプログラム3401は、冗長コードを格納するフラッシュドライブを、例えばラウンドロビンを用いて決定し、決定したフラッシュドライブ上のドライブプログラムへP_WRITEコマンドを発行する。
ステップS3805で、判定の結果、自ノードに冗長コードを格納する場合(S3805:Y)、コーディネータプログラム3401は、冗長コード格納位置の自ノードのフラッシュドライブ3301へP_WRITEコマンドを発行する(S3806)。
P_WRITEコマンドを受信したドライブプログラム3402は、受信したユーザデータを、キャッシュ情報のコードダーティキューに接続し、結果をコーディネータプログラム3401に返却する(S3815、S3816)。
次に、コーディネータプログラム3401は、全保護レイヤにおいて、冗長コードのためのデータ転送を完了したか否かを判定する(S3807)。
ステップS3807で、判定の結果、未処理の保護レイヤが存在する場合(S3807:N)、コーディネータプログラム3401は、ステップS3805から処理を実行する。
ステップS3807で、判定の結果、未処理の保護レイヤが存在する場合(S3807:Y)、コーディネータプログラム3401は、フラッシュドライブからのコマンド完了を待機し、完了を受信すると、ライト要求の完了応答をホストへ返却する(S3808、S3809)。
図37は、実施例2のデステージ処理のフローチャートを示す。
本実施例のデステージ処理において、ドライブプログラム3402は、不揮発媒体へユーザデータを書き込む。ドライブプログラム3402は、実施例1で説明したデステージ処理のステップS2101〜S2107と同様のステップS3901〜S3907を行う。ここでは、実施例1のデステージ処理との差違についてのみ説明する。
ドライブプログラム3402は、S3903において、最初の冗長コードを生成し、S3904において、当該冗長コードを媒体へ書き込んだ後、S3905において、当該冗長コードを生成したユーザデータの組み合わせ情報を、バッファメモリに一時保存する。
コーディネータプログラム3401は、冗長コードの生成に用いられたユーザデータの組み合わせ情報であって、ドライブプログラム3402により保存された組み合わせ情報を、P_GETコマンドにより取得する(S3909)。コーディネータプログラム3401は、本処理を、周期的に実行してもよいし、常時実行してもよい。
P_GETコマンドの結果、ドライブプログラム3402からユーザデータの組み合わせ情報が返却さなければ(S3909:N)、コーディネータプログラム3401は、処理を終了する。
P_GETコマンドの結果、ドライブプログラム3402からユーザデータの組み合わせ情報が返却されれば(S3909:Y)、コーディネータプログラム3401は、2つ目以降の冗長コードを格納するフラッシュドライブのドライブプログラム、又は2つ目以降の冗長コードを格納するノードのコーディネータプログラムへ、当該組み合わせ情報を通知する(S3910)。これにより、組み合わせ情報を受信したコーディネータプログラムは、ノード間の冗長コードを格納するフラッシュドライブのドライブプログラムへ当該組み合わせ情報を通知する。
ユーザデータの組み合わせ情報を受信したドライブプログラム3402は、バッファメモリ上のコードダーティキューから、組み合わせ情報により指定されたユーザデータを検出し(S3911)、当該ユーザデータで次の(2つ目以降の)冗長コードを生成し(S3912)、生成された冗長コードを不揮発媒体へ書き込む(S3913)。
次に、実施例2の容量枯渇管理処理について説明する。
本実施例では、コーディネータプログラム3401が、容量枯渇管理処理及び容量削減処理を実行し、ドライブプログラム3402が、データ再転送処理及びデータ消去処理を行う。さらに、実施例1のストレージプログラム302による消去対象冗長コードの探索処理は、本実施例においては、ドライブプログラム3402にオフロードされる。
実施例1の容量枯渇管理処理との差分について以下で説明する。自ノード、又は他ノードのコーディネータプログラム3401で実行される容量枯渇管理処理から、容量削減要求を受信したコーディネータプログラム3401は、S2305と同様の容量削減処理を実行する。
その後、コーディネータプログラム3401は、容量削減処理のS2306の代わりに、コーディネータプログラム3401は、消去対象冗長コードを探索するSEARCHコマンドを、ドライブプログラム3402に発行する。
SEARCHコマンドを受信したドライブプログラム3402は、消去対象とする冗長コードを探索する。この際、ドライブプログラム3402は、容量削減が必要なドライブ番号を引数とし、当該ドライブ番号の無効ユーザデータから生成された冗長コードを探索する。
ドライブプログラム3402は、消去対象の冗長コードが見つかると、当該冗長コード情報と当該冗長コード構成情報とを、コーディネータプログラム3401に返却する。冗長コード情報は、冗長コードの格納位置のドライブ番号、LBAを含み、容量削減処理で、冗長コード削除時に、削除対象の冗長コードを指定する際に使用される。冗長コード構成情報は、冗長コードの生成に用いられたユーザデータの、ノード番号、ドライブ番号、アドレス識別子を含み、容量削減処理で、ユーザデータを消去、又は再転送する際に使用する。また、無効ユーザデータ消去は、コーディネータプログラム3401が、ドライブプログラム3402に、消去対象のユーザデータを識別するアドレス識別子を引数に、INVALIDコマンドを発行し、無効ユーザデータの消去を行う。
図38は、実施例2のコレクションリード処理のフローチャートを示す。
本実施例のコレクションリード処理において、コーディネータプログラム3401は、ドライブプログラム3402から障害ユーザデータを読み込む。
コーディネータプログラム3401は、冗長コード及び冗長コード構成情報を取得するために、復旧対象のユーザデータの冗長コードを格納するフラッシュドライブのドライブプログラム3402へ、P_READコマンドを発行する(S4101)。その後、コーディネータプログラム3401は、P_READコマンドの結果が返却されるまで、待機する(S4102)。
復旧対象のユーザデータの冗長コードを格納するフラッシュドライブのドライブプログラム3402は、P_READコマンドを受信すると、フラッシュドライブ内のバッファメモリのコードダーティキューに、復旧対象ユーザデータが存在するか否か判定する(S4111)。
ステップS4111で、判定の結果、復旧対象ユーザデータが存在する場合(S4111:Y)、ドライブプログラム3402は、当該復旧対象ユーザデータをコーディネータプログラム3401に返却する(S4115)。
ステップS4111で、判定の結果、復旧対象ユーザデータが存在する場合(S4111:N)、ドライブプログラム3402は、ログ構造化マッピングテーブル508b内の冗長コードマッピングテーブルから、復旧対象ユーザデータの冗長コードを特定する(S4112)。次に、ドライブプログラム3402は、ログ構造化マッピングテーブル508b内の逆マッピングテーブルから、冗長コード構成情報を特定する(S4113)。
次に、ドライブプログラム3402は、特定した冗長コードと冗長コード構成情報を、コーディネータプログラム3401に返却する(S4114)。
コーディネータプログラム3401は、P_READコマンドの結果を受信すると、返却されたデータが、復旧対象ユーザデータであるか否か判定する(S4103、S4104)。
ステップS4104で、判定の結果、復旧対象ユーザデータが返却された場合(S4104:Y)、コーディネータプログラム3401は、当該復旧対象ユーザデータを、ユーザデータのリード要求元に返却し、処理を終了する。
ステップS4104で、判定の結果、復旧対象ユーザデータが返却されていない場合(S4104:Y)、コーディネータプログラム3401は、返却された冗長コード構成情報から、復旧に必要なユーザデータを特定し、特定されたユーザデータのアドレス識別子を指定するOLD_D_READコマンドを発行することにより、特定されたユーザデータを読み込む。ここで、必要なユーザデータが他ノードに格納されている場合、コーディネータプログラム3401は、OLD_D_READコマンドを、他ノードのコーディネータプログラム3401に転送する。コーディネータプログラム3401は、ドライブプログラム3402から、OLD_D_READコマンドの結果が返却されるまで、待機する(S4106)。
ドライブプログラム3402は、OLD_D_READコマンドを受信すると、ログ構造化マッピングテーブル508b内のアドレス識別子変換テーブルから、指定されたアドレス識別子に対応するユーザデータの物理アドレスを特定し(S4116)、当該ユーザデータを不揮発媒体から読み出し(S4117)、当該ユーザデータをコーディネータプログラム3401に返却する(S4118)。
コーディネータプログラム3401は、全てのOLD_D_READコマンドの結果を受信すると(S4107)、P_READコマンドで読み出した冗長コードと、OLD_D_READコマンドで読み出したユーザデータとから、復旧対象ユーザデータを計算して復旧する(S4108)。その後、コーディネータプログラム3401は、復旧したユーザデータを、ユーザデータの要求元に返却し(S4109)、このフローを終了する。
次に、実施例2における冗長化先変更処理について説明する。
本実施例の冗長化先変更処理は、コーディネータプログラム3401が実施例1と同様の冗長化先変更メイン処理を実行し、ドライブプログラム3402が実施例1と同様の冗長化先変更サブ処理を実行することで実現される。
コーディネータプログラム3401は、管理プログラム303から構成変更要求を受信すると、実施例1と同様の構成変更処理を実行し、冗長化先変更メイン処理を実行する。冗長化先変更メイン処理において、コーディネータプログラム3401は、フラッシュドライブ3301から、ユーザデータを順に読み出す。次に、コーディネータプログラム3401は、静的マッピングテーブルを参照し、構成変更後の冗長化先を決定し、P_WRITEコマンドを用いて、読み出したユーザデータを構成変更後の冗長化先へ書き出す。さらに、コーディネータプログラム3401は、構成変更前の静的マッピングテーブルを参照し、古い冗長コードを格納するフラッシュドライブに対して、冗長化先を変更したユーザデータを指定し、当該ユーザデータの冗長コードを消去するコマンドを発行する。
構成変更に伴う冗長コードの消去コマンドを受信したドライブプログラム3402は、冗長化先変更サブ処理を実行し、実施例1の冗長化先変更処理のフローチャートに従って処理を実行した後、結果をコーディネータプログラム3401に返却する。
次に、実施例2におけるデータコピー処理について説明する。
本実施例のデータコピー処理は、実施例1のデータコピー処理及びアドレス解決処理を、コーディネータプログラム3401が実行することで実現される。
コーディネータプログラム3401は、管理プログラム303からデータ移行要求を受信すると、実施例1と同様のデータ移行処理を実行し、データコピー処理を実行する。コーディネータプログラム3401は、実施例1と同様の説明したデータコピー処理及びアドレス解決処理を実行し、データのコピーを行う。
次に、実施例2における障害復旧処理について説明する。
本実施例の復旧処理は、実施例1の復旧処理と同様に実施する。但し、本実施例において、管理プログラム303は、構成変更処理及びデータ移行処理の要求を、コーディネータプログラム3401に対して発行する。