以下、図面を参照して本発明の実施形態を説明する。以下の記載および図面は、本発明を説明するための例示であって、説明の明確化のため、適宜、省略および簡略化がなされている。また、実施形態の中で説明されている特徴の組み合わせの全てが発明の解決手段に必須であるとは限らない。本発明が実施形態に制限されることは無く、本発明の思想に合致するあらゆる応用例が本発明の技術的範囲に含まれる。本発明は、当業者であれば本発明の範囲内で様々な追加や変更等を行うことができる。本発明は、他の種々の形態でも実施する事が可能である。特に限定しない限り、各構成要素は複数でも単数でも構わない。
以下の説明では、「テーブル」、「リスト」、「キュー」等の表現にて各種情報を説明することがあるが、各種情報は、これら以外のデータ構造で表現されていてもよい。データ構造に依存しないことを示すために「XXテーブル」、「XXリスト」等を「XX情報」と呼ぶことがある。各情報の内容を説明する際に、「識別情報」、「識別子」、「名」、「ID」、「番号」等の表現を用いるが、これらについてはお互いに置換が可能である。
また、以下の説明では、同種の要素を区別しないで説明する場合には、参照符号または参照符号における共通番号を使用し、同種の要素を区別して説明する場合は、その要素の参照符号を使用または参照符号に代えてその要素に割り振られたIDを使用することがある。
また、以下の説明では、プログラムを実行して行う処理を説明する場合があるが、プログラムは、プロセッサ(例えばCPU)によって実行されることで、定められた処理を、適宜に記憶資源(例えばメモリ)および/またはインターフェースデバイス(例えば通信ポート)等を用いながら行うため、処理の主体がプロセッサとされてもよい。同様に、プログラムを実行して行う処理の主体が、プロセッサを有するコントローラ、装置、システム、計算機、ノード、ストレージシステム、ストレージ装置、サーバ、管理計算機、クライアント、またはホストであってもよい。プログラムを実行して行う処理の主体(例えばプロセッサ)は、処理の一部または全部を行うハードウェア回路を含んでもよい。
プログラムは、プログラムソースから計算機のような装置にインストールされてもよい。プログラムソースは、例えば、プログラム配布サーバまたは計算機が読み取り可能な記憶メディアであってもよい。プログラムソースがプログラム配布サーバの場合、プログラム配布サーバはプロセッサ(例えばCPU)と記憶資源を含み、記憶資源はさらに配布プログラムと配布対象であるプログラムとを記憶してよい。そして、プログラム配布サーバのプロセッサが配布プログラムを実行することで、プログラム配布サーバのプロセッサは配布対象のプログラムを他の計算機に配布してよい。また、以下の説明において、2以上のプログラムが1つのプログラムとして実現されてもよいし、1つのプログラムが2以上のプログラムとして実現されてもよい。
本実施形態における分散型ストレージシステム100は、それぞれがストレージデバイスを含む複数のノード101を有し、ノード101間がネットワーク103により接続された構成である。分散型ストレージシステム100は、複数のノード101のストレージデバイスによって、ストレージプールを実現する仮想的なストレージシステムを実現する。
ストレージデバイスは、例えばHDD(Hard Disk Drive)やSSD(Solid State Drive)等の1台のストレージドライブ、複数台のストレージドライブ、複数台のストレージドライブを含むRAID(Redundant Arrays of Independent Disks)装置、または複数のRAID装置であっても良い。以下の説明において、ストレージデバイスは、ドライブ105と表現されることがある。
ストライプとは、データブロック、またはデータ保護のためにデータブロックから生成されるパリティブロック(Class1 code)のいずれかのデータユニットである。ストライプは、ノード101内のストレージデバイスに格納されると共に、他のノード101におけるパリティブロック(Class2 code)の生成において使用される。
ストライプグループは、ストライプ(データブロックまたはClass1 code)と、当該ストライプから生成されるClass2 codeの組合せである。各ストライプが属するストライプグループは、例えば、当該ストライプの論理アドレスと、当該ストライプを格納するノード101とによって決定される。
ストライプグループは、データセットと呼ぶことがある。データセットは、所定数のデータ要素で構成される。ここで、データ要素とは、データセットに含まれるデータブロックとClass1 codeとClass2 codeである。データセットは、データブロックとClass2 codeで構成されてもよく、Class1 codeは含まれていてもよいし含まれなくてもよい。
また、本実施例では、Erasure Coding(EC)により、データブロックからClass2 codeを生成する例を開示しており、ストライプグループをECグループと呼ぶことがある。但し、ECグループと記載しても、Class2 codeの生成方法は必ずしもECに限定されない。
ストライプグループを構成するストライプについて、データブロックの数をD数と呼び、Class2 codeの数をP数と呼ぶことがある。また、ストライプグループの構成について、自然数m、nを用いて、mDnPと表現する場合、m個のデータブロックとn個のClass2 codeでストライプグループが構成されることを示す。
ホストは、分散型ストレージシステム100にアクセスする計算機、当該計算機で動作するプロセッサまたは当該プロセッサが実行するプログラムである。
データストアノードとは、特定のストライプグループに着目したとき、当該ストライプグループのデータブロックをローカルのドライブ105に格納するノード101である。パリティストアノードとは、特定のストライプグループに着目したとき、当該ストライプグループのClass2 codeを、ローカルのドライブ105に格納するノード101である。
図1は、実施例1における分散型ストレージシステム100の構成を示す図である。分散型ストレージシステム100は、複数のノード101と、複数のノード101間を接続するネットワーク103を有する。分散型ストレージシステム100は、計算機システム、または情報処理システムと呼ばれてもよい。ネットワーク103は、バックエンドネットワークと呼ばれてもよい。
ノード101は、計算機であればよく、例えば一般的なサーバ計算機の構成を有している。ノード101は、計算機、計算機ノード、サーバ、ストレージ装置、またはストレージシステムのいずれかの表現で呼ばれてもよい。
ノード101は、バックエンドポート108、コントローラ107、ドライブ105、内部ネットワーク102を有する。バックエンドポート108、コントローラ107、ドライブ105は、内部ネットワーク102を介して接続されている。ノード101の各構成要素(バックエンドポート108、コントローラ107、ドライブ105、内部ネットワーク102)は、それぞれ1つでもよいし、複数あってもよい。なお、ノード101のハードウェア構成は、この例に限定されない。例えば、ノード101に、圧縮等の特定の処理を行う専用ハードウェア回路がさらに追加されてもよい。
各ノード101のバックエンドポート108はネットワーク103と接続しており、ノード101はネットワーク103を介して他のノード101と接続する。バックエンドポート108は、ポートと呼ばれてもよい。
コントローラ107は、1つまたは複数のメモリ104と、1つまたは複数のプロセッサ106と、を有する。コントローラ107は、例えばプロセッサパッケージであってもよい。プロセッサ106は、プログラムを実行する制御部であって、例えばCPU(Central Processing Unit)であってもよい。プロセッサ106は、メモリ104内のプログラムを実行して、コマンドに応じた各種の処理を実行する。プロセッサ106は、プログラムを実行する演算部または制御部であれば良い。以降では、プロセッサ106がメモリ104上のプログラムを実行して行われる処理を、ノード101やコントローラ107を処理の主体として記載することがある。
メモリ104は、プロセッサ106により実行されるプログラムを格納する記憶部である。メモリ104は、揮発性のDRAMであってもよいし、不揮発のSCM(Storage Class Memory)などを用いてもよい。
ドライブ105は、ストレージデバイスであればよく、ストレージデバイスと呼ばれてもよい。ドライブ105は、例えば、FC(Fibre Channel)、SAS(Serial Attached SCSI)、SATA(Serial Advanced Technology Attachment)などのインタフェースを持つハードディスクドライブや、上記インタフェースに加えてNVMe(Non-Volatile Memory Express)などのインタフェースを持つSSD(Solid State Drive)などである。また、ドライブ105は、NAND、PRAM、ReRAMなどのSCMを用いてもよいし、揮発性のメモリを用いてもよい。ドライブ105は、揮発性メモリを使用する場合、バッテリによってストレージデバイスを不揮発化してもよい。
ノード101は、メモリ104の一部を、キャッシュまたはバッファとして使用することができる。また、ノード101は、SSDなどドライブ105の一部を、キャッシュまたはバッファとして使用することができる。
ノード101上でハイパーバイザが動作し、ハイパーバイザ上で1または複数の仮想マシンが稼働しても良い。仮想マシン上で、OSやプログラムが動作してもよい。すなわち、OSやプログラムは、ノード(物理計算機)101のハードウェア上で動作することもあれば、仮想マシン上で動作することもある。
また、ホストは、仮想マシン上で動作するアプリケーションプログラム(ホストプログラム)201であってもよいし、物理的なホスト計算機(ホストコンピュータ)であっても良い。OSやストレージコントローラプログラムが動作する仮想マシンと、ホストプログラムが動作する仮想マシンとが、同一のノード101上にあっても、ネットワーク103を介して接続する異なるノード101上にあってもよい。ここで、ストレージコントローラプログラムとは、分散型ストレージシステム100を制御するためのプログラムであって、例えば図3に示す各種プログラム305〜307の一部または全部を含むプログラムである。また、ストレージコントローラプログラムは、ハイパーバイザの一部であっても良い。
また、分散型ストレージシステム100が複数のノード101を有するとき、ノード101の一部が異なるサイトにあっても良い。また、分散型ストレージシステム100のノード101の一部または全部がクラウド上にあって、ネットワークを介して、ユーザにサービスが提供されても良い。
このような構成例であっても、本発明を適用することができる。一般的に仮想マシンは、ハイパーバイザが提供する仮想的なハードウェア資源の上で稼動し、ハードウェア資源へのアクセスはハイパーバイザを経由する形態であるが、ハイパーバイザが備える機能によっては、ハードウェア資源を仮想マシンが直接アクセス可能となる場合がある。いわゆるパススルー技術である。
以下、分散型ストレージシステム100を主語とした処理については、特に限定しない限り、分散型ストレージシステム100のいずれか一つのノード101で行ってもよいし、複数のノード101で連携または独立して行ってもよい。
図15は、分散型ストレージシステム100が有する複数のノード101に、データ要素を分散して配置されたデータセットについて、データ要素を増加させるときの処理の一例を示す模式図である。
分散型ストレージシステム100について、ノード101を追加する前の構成を分散型ストレージシステム100−1とし、ノード101を追加した後の構成を分散型ストレージシステム100−2として、以下説明する。
分散型ストレージシステム100−1は、システムの可用性を高めるために、複数のノード101の間でデータの冗長性を持たせている。図15の例によれば、X個のデータ(例えばAi,Bi)と、当該X個のデータに対応するY個の冗長データ(例えばPi)をデータ要素とするデータセットについて、X+Y個の異なるノード101に各データ要素を分散させている。ここで、X,Yは1以上の整数とする。また、iは1以上の整数であり、図15において、データセットiのデータ要素をAi,Bi,Piで表している。
分散型ストレージシステム100−1は、Y個までのノード101の障害であれば、障害が起きていない残りのノード101のデータ要素を用いて、障害が起きたノード(障害ノード)のデータ要素を復旧可能である。ここで、障害ノードのデータ要素を復旧するとは、分散型ストレージシステム100−1で稼働する業務を停止することなく、障害ノードに格納されていたデータ要素をリビルドすることを含む。リビルド後のデータセットは、冗長度Yまで冗長性を回復できる。
なお、分散型ストレージシステム100−1のデータをバックアップしておくことで、Y個を超えるノード101の障害が起きた場合でも、バックアップしたデータを用いて、データを復元することができる。
図15の分散型ストレージシステム100−2の模式図は、各データセットについて、Z個のデータをデータ要素として追加したときのデータ配置の一例を示すものである。ここで、Zは1以上の整数とする。X個のデータとY個の冗長データをデータ要素とするデータセットと比べて、X+Z個のデータとY個の冗長データをデータ要素とするデータセットは、データセットの冗長度はYのままであるが、データに対する冗長データの割合は下がり、ストレージの容量効率が向上する。このように、データセットのデータ要素を増加させ、データに対する冗長データの割合を下げることで、分散型ストレージシステム100のストレージの容量効率を高めることができる。結果として、データを保管するコストを低減することができ、分散型ストレージシステム100への投資額を抑えることができる。
分散型ストレージシステム100−2は、分散型ストレージシステム100−1に、Z個以上の新たなノード101を追加した構成である。図15の例でいえば、分散型ストレージシステム100−1はNode I、Node II、Node IIIで構成され、分散型ストレージシステム100−2は分散型ストレージシステム100−1にNode IVを追加した構成である。この新たに追加したノードを、追加ノードと呼ぶ。
図15のS1に示すように、分散型ストレージシステム100−2は、各データセットに追加されるZ個のデータをゼロデータとし、そのゼロデータを追加ノードに配置するように制御する。データセットに新たに追加されたデータ要素がゼロデータであれば、データ要素を増加する前のデータセットのX個のデータに対応するY個の冗長データの値と、データ要素を増加した後のデータセットのX+Z個のデータに対応するY個の冗長データの値と、は一致する。したがって、冗長データを計算し直す必要がなく、その計算負荷をなくすことができるうえ、冗長データを計算するために各ノード101からデータを収集することも不要であり、ノード101間でのデータ転送量を低減できる。
また、データ要素を増加する前のデータセットのX個のデータおよびY個の冗長データのデータ配置を、データ要素を増加した後も変更しないことで、ノード101間でのデータ移動が不要となり、ノード間101でのデータ転送量を低減できる。ここで、データ配置を変更しないとは、データを格納するノード101を変更しないことを意図するが、各ノード101内でデータを格納するストレージデバイスについても変更しなくて良い。
ここで、データの分散方法として、複数のノード101のうち、特定のノードのみに冗長データを配置する方法と、各ノード101に冗長データを分散する方法がある。前者の特定のノードのみに冗長データを配置する方法では、追加ノードに配置するデータ要素を全てゼロデータとすることが可能となる。しかしながら、この方法では、冗長データの書き込みや読み出しが特定のノードに集中し、書き込みおよび読み出しの性能のボトルネックとなる可能性がある。また、各ノード101で消費されるストレージ容量を均一化しにくい。さらに、冗長データが配置される特定のノードで、業務アプリケーション(アプリケーションプログラム)を動作させないとすれば、プロセッサ等の計算機リソースの効率的な使用ができない可能性がある。以上の理由により、各ノード101に冗長データを分散する方法が、分散型ストレージシステム100として望ましい実施形態の一つと考えられる。以下、各ノード101に冗長データを分散する方法を採用した場合について説明する。
図15のS2は、追加ノードに冗長データを配置する例について示す。追加ノードに、いずれのデータセットの冗長データを配置するかについては、分散型ストレージシステム100で採用されるデータ分散方法に従って決められる。図15の例では、4つのデータセットのデータ配置が示されており、そのうち1つのデータセットの冗長データが追加ノードに配置されている。残りの3つのデータセットについては、ゼロデータを追加ノードに配置している。
上述のとおり、データセットに新たに追加されたデータ要素がゼロデータであれば、データ要素を増加する前の冗長データの値と、データ要素を増加した後の冗長データの値と、は一致する。したがって、追加ノードに配置する冗長データは、データ要素を増加する前の冗長データを配置していたノード(Node III)から、当該冗長データを追加ノードに移動またはコピーすれば良い。また、冗長データを、同じデータセットの他のデータ要素から再計算して、追加ノードに配置しても良い。
図15のS3は、追加ノードに冗長データを配置する場合、データ要素を増加する前の冗長データを配置していたノード(Node III)にゼロデータを配置することを示している。
以上、分散型ストレージシステム100に新たなノード101を追加する場合に、データセットのデータ要素数を増やすことで、ストレージの容量効率を向上させる方法について説明した。このような方法を採用するのに適した一例として、事業をスモールスタートするときには、分散型ストレージシステム100への初期投資額を抑えるために少ないノード101で運用し、事業で提供するサービスへの需要拡大にともない、新たにノード101を追加して分散型ストレージシステム100をスケールアウトする例が挙げられる。なお、この例は、あくまで一例であり、上述した方法を採用する分散型ストレージシステム100を何ら制限するものではない。
データを冗長化する方法は、ノード間でのデータを複製(レプリケーション)する方法や、冗長データとしてパリティまたは消失訂正符号(Erasure Code)を用いる方法等、様々な方法がある。
分散型ストレージシステム100のノード101の数(以下、ノード数とも呼ぶ)は、分散する各データセットのデータ要素の数以上であれば良い。すなわち、分散型ストレージシステム100−1のノード数は、X+Y個のみに限られず、X+Y個以上であれば良い。同様に、分散型ストレージシステム100−2のノード数は、X+Y+Z個のみに限られず、X+Y+Z個以上であれば良い。
分散型ストレージシステム100のノード数が、各データセットのデータ要素の数より多い場合でも、各データセットのデータ要素の其々は、分散型ストレージシステム100の異なるノード101に分散して格納される。異なるデータセットの間で、分散するノードの組合せが異なっていても良い。
各データセットに追加されるZ個のデータをゼロデータとすることを上述したが、このゼロデータを配置する方法の具体例を述べる。1つ目の具体例は、ゼロデータを配置するノード101において、実際にゼロデータを格納する方法である。2つ目の具体例は、ゼロデータを配置するノード101において、当該データをゼロデータと管理する方法である。この場合、実際に当該ノード101のドライブ105にゼロデータが格納されていても、格納されていなくても良い。ゼロデータを格納不要とすることで、ゼロデータを格納する負荷を抑えることができる。また、ゼロデータを格納しない場合、当該ゼロデータの配置先となる論理アドレスに対し、当該ノード101が有する1以上のドライブ105からなる実記憶領域を割り当てても、割り当てなくても良い。ゼロデータの場合に実記憶領域を割り当てないことで、当該ノード101の未使用な実記憶領域を増やすことができ、ストレージの容量効率を向上できる。したがって、ゼロデータを配置するノード101において、当該データをゼロデータと管理する方法としては、当該ゼロデータの配置先となるアドレスに、ゼロデータであることを示す情報を対応づけて管理する方法や、当該ゼロデータの配置先となる論理アドレスに、実記憶領域を割り当てない方法等がある。ゼロデータの配置先となるアドレスに対し、読み出し要求があった場合に、ゼロデータを応答できれば、いずれの方法が採用されても良い。
分散型ストレージシステム100において、新たなノード101の追加は、ノード101を追加する命令を管理装置から受領したとき、または自動でノード101の追加を検知したときに実行しても良い。ここで、管理装置とは、分散型ストレージシステム100を管理する装置である。データセットのデータ要素の増加は、管理装置からの命令に従って実行されて良い。新たなノード101の追加と、データセットのデータ要素の増加は、同じタイミングで行われても、異なるタイミングで行われても良い。
また、新たなノード101を追加することは、本発明の実施に、必ずしも必須の構成でなくても良い。すなわち、データセットのデータ要素を増やした後のデータ要素数X+Y+Z個以上のノードを、分散型ストレージシステム100−1が有していた場合、ノード101を追加しなくても、データセットのデータ要素を増やすことができる。
このように、データセットのデータ要素数を増やす方法を採用するのに適した一例として、IoT(Internet of Things)プラットフォーム等におけるデータレイク、すなわち多様なビッグデータの活用が容易なデータ管理システムにおいて、例えばデータの増大にあわせてストレージの容量効率を見直す場合が挙げられる。なお、この例は、あくまで一例であり、上述した方法を採用する分散型ストレージシステム100を何ら制限するものではない。
図2は、分散型ストレージシステム100のライト処理の概要を示す図である。分散型ストレージシステム100は、冗長化のため、ノード101間でデータブロックを転送する。
以下において、ノード101は、データブロックに基づき一次的な冗長符号を生成して、当該データブロックとともに他のノード101に転送し、転送先のノード101で二次的な冗長符号を生成する方法について述べる。
図2は、分散型ストレージシステム100が有するノード101A、101B、101C、101Dの4ノードにおいて、2D2Pの冗長構成でデータ保護する例を示している。つまり、分散型ストレージシステム100は、2ノード障害時に全てのデータを回復できる冗長性を有する。
例えば、ノード101Aは、アプリケーションプログラムまたは仮想マシン201から受信したデータ長の長いライトデータブロック203を、2個のデータブロック(aブロック204A、bブロック204B)に分割し、さらに、それら分割したデータブロックから一次的な冗長符号であるp1ブロック205を1個生成する。この一次的な冗長符号は、例えばパリティブロック等の冗長コードであって、Class1 codeと呼ぶことがある。
次に、ノード101Aは、データブロック204A、204BおよびClass1 code205を、他ノード101B〜101Dのキャッシュ(またはバッファ)に分散コピーする。図2の例では、ノード101Aは、データブロック204A、データブロック204B、Class1 code205を、それぞれノード101B、ノード101C、ノード101Dにコピーする。コピー先となるノード101は、後述するストライプマッピングテーブル301を使用して、ライトデータを受信したノード番号と書き込み先アドレスから求める。以下、コピー先となるノード101を、宛先ノードと呼ぶことがある。
コピーが完了した時点で、必要な冗長性が得られている(2ノード障害の回復が可能な)ため、同期的なライト処理が完了する。
同様に、ノード101B〜101Dは、それぞれ受信したライトデータブロック(DATA2〜DATA4)を2つのデータブロックに分割し、さらに、Class1 codeを生成する。ノード101B〜101Dの各々は、分割したデータブロックおよびClass1 codeを、他の3つのノード101のキャッシュ(またはバッファ)に、分散コピーする。各ノード101は、他の3つのノード101それぞれから受信したデータブロックまたはClass1 codeのコピーを、キャッシュ(またはバッファ)に格納する。
ノード101Aは、ライト処理とは非同期的に、他の3つのノード101から集約したデータブロックまたはClass1 codeから、二次的な冗長符号であるx1ブロック206Aおよびy1ブロック206Bを生成する。この二次的な冗長符号は、例えばパリティブロック等の冗長コードであって、Class2 codeと呼ぶことがある。
同様に、ノード101B〜101Dは、それぞれ、非同期的に、他の3つのノードから集約したデータブロックまたはClass1 codeから、Class2 codeを生成する。
ノード101A〜101Dの各々は、それぞれ生成したClass2 codeをローカルなドライブ105に書き込む。また、ノード101A〜101Dの各々は、当該Class2 codeの生成に使用したデータブロックまたはClass1 codeのコピーが格納されたキャッシュ(またはバッファ)の領域を解放する。
図2は2D2P冗長構成の例を示すが、本実施例の方法は、任意のmDnP構成(m、nは自然数)に適用できる。ライトデータブロック(mD)は、ローカルなドライブ105に格納され、冗長度を1減らした個数(冗長度がn−1)のClass1 codeと共に、他のノード101に転送される。例えば、3D2P構成(d1、d2、d3、p)において、ライトデータブロック(d1+d2+d3)はローカルなドライブ105に格納され、データブロックd1、d2、d3、pが異なるノード101にそれぞれ転送される。
図3は、メモリ104の構成を示す図である。分散型ストレージシステム100の各ノード101のメモリ104には、分散型ストレージシステム100を制御するための情報またはプログラムが格納される。例えば、メモリ104には、ストライプマッピングテーブル301、キャッシュ管理テーブル302、パリティ管理テーブル303、ノード状態管理テーブル304、ECグループ拡縮処理プログラム305、ホストI/O処理プログラム306、およびロールバック処理プログラム307が格納される。各種プログラム305〜307は、プロセッサ106により、実行される。以下の説明において、ストライプマッピングテーブル301、キャッシュ管理テーブル302、パリティ管理テーブル303、ノード状態管理テーブル304を含む管理情報を、各種管理情報301〜304と呼ぶことがある。
ストライプマッピングテーブル301は、ストライプグループ番号の組合せの情報を含み、データブロックやClass1 codeのコピー先となる宛先ノードを決定するときや、障害が発生したノード101に格納されたデータブロックをリビルドするときに使用する。
キャッシュ管理テーブル302は、Class2 codeを生成するダーティデータ、またはClass2 codeの整合性を維持するためのアンドゥデータのキャッシュに関する情報を含む。パリティ管理テーブル303は、ログストラクチャード形式で格納されるClass2 codeの管理情報およびClass2 codeを構成するデータブロックの格納位置情報を含む。ノード状態管理テーブル304は、各ノード101の運用状態の情報を含む。
ECグループ拡縮処理プログラム305は、ユーザまたはクラスタ管理プログラムからのECグループ拡縮要求を制御するためのプログラムである。ホストI/O処理プログラム306は、アプリケーションプログラムや仮想マシンといったホストからのI/O要求を制御するためのプログラムである。ロールバック処理プログラム307は、データストアノードの障害時にパリティストアノード間でClass2 codeの整合性を制御するためのプログラムである。
メモリ104は、図3に示す情報およびプログラムに加え、ストレージ機能を実現するストレージプログラム、OS、インタフェースプログラムを含む、各種プログラムを格納する。メモリ104は、さらに、業務を実行するアプリケーションプログラムを格納することがある。
上述した各種管理情報301〜304と、プログラム305〜307を含む各種プログラムの全部または一部のコピーは、バックアップ等の目的のため、ドライブ105に同期または非同期に保存されてもよい。
以下、図4A、図4B、図5,図6、図7を用いて、メモリ104が保持する情報(ストライプマッピングテーブル301、キャッシュ管理テーブル302、パリティ管理テーブル303、ノード状態管理テーブル304)の構成例を説明する。各テーブルにおいて、一部のエントリのみが示されている。各テーブルにおいて、空白のセルは、データの記載が省略されたセルである。テーブルのセルにおいて、「0x」は、16進数の数字を示す。
図4Aは、ストライプマッピングテーブル301の構成の概念を示す図である。図4Aのストライプマッピングテーブル301は、分散型ストレージシステム100が4台のノード(E0〜E3)でクラスタを構成していることを示している。ECグループの構成は、2D2Pであり、サイクル数Cが2である。
図4Aに示すストライプマッピングテーブル301は、列要素(E0〜E3)として列番号401を含み、行要素(D1、D2、P1、XY)として行番号402を含む。
列番号401は、要素番号と呼ぶことがある。要素番号は、例えばノード番号、ドライブ番号、またはノード番号およびドライブ番号の両方を指定する情報のいずれかであっても良い。
行番号402は、データブロックを特定する情報(D1、D2)と、Class1 codeを特定する情報(P1)と、Class2 codeを特定する情報(XY)を含む。行番号402は、例えば、データブロック、Class1 code、またはClass2 codeの格納先を示す論理アドレスであっても良い。
また、ストライプマッピングテーブル301は、列番号401と行番号402で指定される各セル403に、ストライプグループ番号(S0〜S3)を含む。ストライプグループ番号は、ストライプグループを識別する情報である。ストライプグループは、ストライプ(データブロックまたはClass1 code)と、当該ストライプから生成されるClass2 codeの組合せである。
ストライプマッピングテーブル301で、同一のストライプグループ番号に対応するストライプとClass2 codeは、当該ストライプグループ番号の同じストライプグループに属する。各ストライプが属するストライプグループは、例えば、当該ストライプの論理アドレス(行番号402に相当)と、当該ストライプを格納するノード101のノード番号(列番号401に相当)とによって決定される。そして、コントローラ107は、同じストライプグループに属する複数のストライプから、Class2 codeを生成する。さらに、コントローラ107は、ストライプマッピングテーブル301で、当該ストライプグループ番号とClass2 codeの行番号(XY)に対応するノード番号(列番号401)のノード101に、Class2 codeを格納する。
ストライプマッピングテーブル301は、データ部404、Class1 code部405、およびClass2 code部406の3つのセクタを含む。図4Aの例では、データ部404は行番号402がD1およびD2のセクタであり、Class1 code部405は行番号402がP1のセクタであり、Class2 code部406は行番号402がD1およびD2のセクタである。
データ部404は、アプリケーションプログラムや仮想マシンにより書き込まれたデータブロックに対応したストライプグループ番号を管理している。
Class1 code部405は、書き込まれたデータブロックを分割して生成されたClass1 codeに対応したストライプグループ番号を管理している。Class1 codeは、同じ列番号401のデータ部404に対応するデータブロックから生成する。例えば、列番号401がE0の場合、E0に対応するD1とD2の論理アドレスに書き込まれたデータブロックから、Class1 code(P1)を生成する。
Class2 code部406は、その要素番号(列番号401)のノード101に格納されるClass2 codeのストライプグループ番号を管理している。例えば、E0の列の場合、Class2 codeは、ストライプグループ番号がS0であり、同じストライプグループ番号に対応するデータ部404およびClass1 code部405から生成される。具体的には、E0の列のClass2 codeは、E1の列のD1データブロックと、E2の列のClass1 codeと、E3の列のD1データブロックから生成する。そのため、E1の列のD1データブロックと、E2の列のClass1 codeと、E3の列のD1データブロックのコピー先となる宛先ノードは、E0のノード番号のノード101となる。
また、例えば、以下のように計算することで、書き込まれたデータブロックおよびClass1 codeのコピー先(転送先)となる宛先ノードを決定する。以下において、Cとは、データ部のサイクル数(行数)を示し、ストライプサイズは、1セルあたりのデータサイズを示す。LBAとは、ブロックの論理的なデータの場所を示す論理ブロックアドレス(Logical Block Address)である。以下において、ストライプマッピングテーブル301内のセル位置を(列番号401、行番号402)で示す。
(1)データブロック
コントローラ107は、データブロックを、ローカルなノード101のドライブ105に、LBA順にストレートマッピングされるように格納する。コントローラ107は、データブロックの宛先ノードを決定するため、列番号401をノード番号とし、行番号402を(LBA / ストライプサイズ)mod Cとして、列番号401と行番号402を算出する。コントローラ107は、ストライプマッピングテーブル301のデータ部404において、(ノード番号、(LBA / ストライプサイズ)mod C)のセル位置にあるセルに格納されたストライプグループ番号を取得する。コントローラ107は、ストライプマッピングテーブル301のClass2 code部406において、取得した番号と同じストライプグループ番号を格納するセルの列番号401を取得し、当該列番号401に対応するノード101へデータブロックを転送する。
(2)Class1 code
コントローラ107は、Class1 codeについて、列番号401をノード番号とし、行番号402をP1として、列番号401と行番号402を算出する。コントローラ107は、ストライプマッピングテーブル301のClass1 code部405において、(ノード番号、P1)のセル位置にあるセルに格納されたストライプグループ番号を取得する。コントローラ107は、ストライプマッピングテーブル301のClass2 code部406において、取得した番号と同じストライプグループ番号を格納するセルの列番号401を取得し、当該列番号401に対応するノード101へClass1 codeを転送する。
また、データブロックとClass1 codeを受領した宛先ノードでは、データブロックとClass1 codeからClass2 codeを生成し、ドライブ105にマッピングされたデータ部404の終端からストレートマッピングされるように、ドライブ105に格納する。このとき、同一ストライプから生成された複数のClass2 codeであるx、yパリティブロックは、ドライブ内の連続領域に格納される。これにより、Class2 codeをシーケンシャルに読み出すことができ、リビルド時のペナリティを軽減できる効果がある。
ストライプマッピングテーブル301は、図4Aの例に限定されず、例えば同列内であれば任意にストライプグループ番号を入れ替えてよい。
図4Bは、ストライプマッピングテーブル301の構成の具体例を示す図である。すなわち、図4Aのストライプマッピングテーブル301は、図4Bに示す構成であってよい。
図4Bのストライプマッピングテーブル301は、ノード番号からストライプグループ番号に変換するためのストライプグループ番号テーブル409と、ストライプグループ番号からノード番号に変換するノード番号テーブル410を有する。
ストライプグループ番号テーブル409は、要素番号、ストライプグループ番号(D1)、ストライプグループ番号(D2)、およびストライプグループ番号(P1)を含む。要素番号は、データブロックを格納するノード番号であり、列番号401に対応する。ストライプグループ番号(D1)、ストライプグループ番号(D2)は、データ部404の各行に対応したストライプグループ番号である。ストライプグループ番号(P1)は、Class1 code部405に対応したストライプグループ番号である。
ノード番号テーブル410は、ストライプグループ番号、データブロック要素番号、Class1 code要素番号、およびClass2 code要素番号を含む。
データブロック要素番号は、同行のストライプグループ番号に対応するデータ部404を有するノードのノード番号である。Class1 code要素番号は、同行のストライプグループ番号に対応するClass1 code部405を有するノードのノード番号である。Class2 code要素番号は、同行のストライプグループ番号に対応するClass2 code部406を有するノード(宛先ノード)のノード番号である。
図5は、キャッシュ管理テーブル302の構成を示す図である。キャッシュ管理テーブル302は、ダーティキャッシュテーブル501とアンドゥキャッシュテーブル502を含む構成である。
ダーティキャッシュデーブル501は、Class2 codeを計算するためのデータブロックを管理している。ダーティキャッシュテーブル501は、ストライプグループ番号、要素番号、およびダーティキューを含む。ストライプグループ番号は、Class2 codeを同一ストライプグループ番号のデータブロックで生成するための番号である。ストライプグループ番号ごとに、要素番号とダーティキューを管理する。要素番号は、ストライプマッピングテーブル301で管理している列要素の番号であり、データブロックの送信元である。ダーティキューは、Class2 codeを生成するために、他ノードに転送されたデータブロックである。ダーティキューには、データブロック本体だけでなく、それらデータブロックが格納された位置情報(ノード番号、ドライブ番号)を保持する。
アンドゥキャッシュテーブル502は、データストアノードに障害が発生した時に、パリティストアノード間のClass2 codeの整合性をとるためのアンドゥキューを管理している。アンドゥキャッシュテーブル502は、要素番号、タグ番号、アンドゥキュー、I/O範囲、および状態を含む。タグ番号は、ホストI/Oに付与される番号であり、当該システムが処理可能なホストI/Oの多重度分だけ番号が存在する。アンドゥキューは、Class2 codeのロールバック処理時に使用するデータブロックまたは中間コードである。アンドゥキューには、アンドゥデータ本体だけでなく、アンドゥデータが格納された位置情報(ノード番号、ドライブ番号)を保持する。アンドゥデータは、ライトデータを受信した要素番号とタグ番号に対応するエントリにキューイングする。また、同要素番号、同タグ番号、且つ異なる世代番号のライトデータを受信した時に、一度破棄し、受信したライトデータを新たにキューイングする。I/O範囲は、受信したI/Oが同時にどのデータブロックを更新しているかを示す。これにより、データストアノード障害時に、当該エントリが整合性をとるべき、ノード(要素)を判別する。具体的には、I/O範囲情報として、開始アドレスとデータ転送長を記録する。状態は、各行の状態であり、Class2 codeに整合性を確認した状態かどうかを確認する。データストアノードに障害が発生した時、状態が未チェックのエントリに対して、整合性がとれているかどうか他パリティストアノードに問い合わせて確認する。整合性を確認した後、エントリの状態をチェック済みに変更する。
図6は、パリティ管理テーブル303の構成を示す図である。パリティ管理テーブル303は、正引きテーブル601と逆引きテーブル602とフリーリスト603を含む管理情報である。
正引きテーブル601は、データブロックの格納アドレスをキーとして、Class2 codeの格納アドレスを引くための情報を管理する管理情報である。データブロックの格納アドレス(DATA LBA)からClass2 codeの格納アドレス(PARITY LBA)を引く操作を正引きと呼ぶ。
正引きテーブル601は、データノード番号、データドライブ番号、データLBA、世代番号、パリティドライブ番号、およびパリティインデックス番号を情報として含む。データノード番号、データドライブ番号、およびデータLBAは、データブロックを格納するノードの番号、ドライブの番号、LBAである。世代番号は、データブロックが書き出された世代を管理する番号であり、データブロックの更新時に更新される。世代番号は、データストアノード障害時におけるロールバック処理で使用する。パリティドライブ番号は、当該エントリと同行のデータブロックに対応するClass2 codeを格納するドライブの番号である。パリティインデックス番号は、Class2 codeの格納位置を示す番号である。正引きテーブル601は、格納しているClass2 codeに対応する情報をパリティストアノードに格納する。
逆引きテーブル602は、Class2 codeの格納アドレス(PARITY LBA)をキーとして、当該Class2 codeを計算したデータブロックの格納アドレス(DATA LBA)を引くための情報を管理する管理情報である。Class2 codeの格納アドレスからデータブロックの格納アドレスを引く操作を逆引きと呼ぶ。
逆引きテーブル602は、パリティドライブ番号、パリティインデックス番号、およびパリティ構成情報を含む。一意なClass2 codeに対して、そのClass2 codeを構成するデータブロックの格納位置を管理している。パリティドライブ番号とパリティインデックス番号は、Class2 codeを格納しているドライブ番号と格納位置を示す番号である。パリティ構成情報は、データノード番号、データドライブ番号、データLBA、および状態を含む。データノード番号、データドライブ番号、およびデータLBAは、対応するClass2 codeを計算したデータブロックの格納位置情報を示す。パリティ構成情報で使用する行(以降、スロットと呼ぶ)は、データ保護設定mDnPのmの数に対応しており、ECグループの拡縮に合わせて、使用するスロットを増減させる。状態は、Class2 codeを計算したデータブロックの状態を示しており、状態には、使用中(USE)と未使用(UNUSE)がある。状態が未使用である場合、まだ当該Class2 codeの当該スロットにデータブロックは書き込まれておらず、当該データブロックは、0データとして、Class2 codeが計算される。
フリーリスト603は、Class2 codeをログストラクチャードで管理する管理情報である。新規に計算されるClass2 codeは、フリーリストより、取得された書き出し先へ書き出される。ECグループの拡縮やガベージコレクションにより、Class2 codeを消去したとき、消去したClass2 codeが使用していたアドレスをフリーリストに追加する。
図7は、ノード状態管理テーブル304の構成を示す図である。ノード状態管理テーブル304は、各ノードの運用状態を管理する。ノード状態管理テーブル304は、データノード番号、データドライブ番号、進捗ポインタ、およびノード状態の情報を対応づけて管理している。
ノード状態は、当該ノード状態に対応付けられたノード番号で識別されるノードの状態を管理している。ノード状態には、NORMAL、ERROR、およびRECLUSTERINGがある。NORMALは、当該ノードが正常状態であることを示し、ERRORは、当該ノードが障害状態であることを示す。RECLUSTERINGは、当該ノードが、ノード増減設やECグループ拡縮により、ECクラスタを再構築している途中であることを示す。
進捗ポインタは、当該進捗ポインタに対応づけられたノード番号およびドライブ番号で識別されるノードおよびドライブについて、障害状態からの復旧の進捗状況、およびECクラスタ再構築の進捗状況を示す。進捗ポインタは、当該ノードの当該ドライブのLBAを示しており、進捗ポインタで示されたLBAまでは、障害復旧またはクラスタ再構築処理が完了していることを示す。このため、障害復旧中やクラスタ再構築中は、当該進捗ポインタを参照して、読み出し先または書き込み先データブロックに対応するClass2 codeの格納先ノードを決定する。
例えば、LBAの若い番号から順にクラスタ再構築処理を実行している場合、進捗ポインタが指し示すLBAより、小さいLBAは、クラスタ再構築が完了しているため、新規ストライプマッピングテーブルに基づき、Class2 codeの格納先ノードを決定する。逆に、進捗ポインタが指し示すLBAより、大きいLBAは、クラスタ再構築が完了していないため、旧ストライプマッピングテーブルに基づきClass2 codeの格納先ノードを決定する。
図8Aと図8Bを用いて、データ数(D数)とノード数を同時に増設するとき、すなわちECグループを拡張するときのストライプマッピングテーブル301とパリティ管理テーブル303の逆引きテーブル602の更新処理を説明する。
図8Aは、データ数とノード数を同時に増設するときのストライプマッピングテーブル301の更新例を示す概念図である。ストライプマッピングテーブル301Aは、ECグループ拡張前のストライプマッピングテーブル301であり、ストライプマッピングテーブル301Bは、ECグループ拡張後のストライプマッピングテーブル301である。
ストライプマッピングテーブル301Aは、分散型ストレージシステム100が5台のノード(E01〜E05)でクラスタを構成していることを示している。ECグループの構成は、3D2Pであり、サイクル数Cが4である。
このクラスタ構成に6番目のノード(E06)を追加し、更に3D2Pから4D2PにECグループを拡張するときのストライプマッピングテーブル301の変更例を示す。
まず、コントローラ107は、既存のストライプマッピングテーブル301Aに対して、6番目のノードの列(E06)を追加する。
次に、コントローラ107は、追加した6番目の列(E06)に対して、ストライプグループ番号を割り当てる。以下、追加した列へのストライプグループ番号の割り当て方の例を説明する。
(1)コントローラ107は、データ部に対して、割り当て数が拡張後のD数(4個)に満たないストライプグループ番号(S01、S02、S03、S05)を選択し、そのストライプグループ番号を、追加した列を含めデータ部内に割り当てるストライプグループ番号の合計数が拡張後のD数(4個)となるように、追加した列(E06)に割り当てる。
(2)コントローラ107は、データ部に対して、ストライプグループ番号の割り当て数が、拡張後のD数(4個)に満たない番号(S04、S06、S07)が存在すれば、そのストライプグループ番号の内、割り当て数が最小のストライプグループ番号(S07)を消去し、他に拡張後のD数(4個)に満たない番号(S04、S06)に変更する。
(3)コントローラ107は、Class1 code部に対して、割り当て数が0個のストライプグループ番号を選択(S06)し、そのストライプグループ番号を、追加した列(E06)を含めClass1 code部内に割り当てる合計数が拡張後のP数−1個(1個)となるように、追加した列(E06)に割り当てる。
(4)コントローラ107は、Class2 code部に対して、他の列よりもストライプグループ番号の割り当て数が多い列を選択し、当該列に割り当てられたストライプグループ番号の内、追加した列(E06)に上記(1)〜(3)割り当てられたストライプグループ番号と重複しないストライプグループ番号を選択(S04)し、追加した列に移動する。
図8Bは、データ数とノード数を同時に増設するときの逆引きテーブル602の更新例を示す概念図である。コントローラ107は、D数が増加したとき、パリティ管理テーブル303の逆引きテーブル602が含むパリティ構成情報のスロットを、D数を増設した数と同等の数だけ増設する。これにより、Class2 codeを構成するデータブロックにおいて、新たに増設したD数分のデータブロック位置情報を管理できるようにする。コントローラ107は、追加したスロットは、0データとして扱う。これにより、Class2 codeを更新することなく、D数を拡張できるため、ネットワーク転送コストを削減できる。コントローラ107は、追加スロットに該当するノードおよびドライブに対して、データブロック書き込みが発生した時、書き込まれたデータブロックでClass2 codeを更新し、当該スロットの情報を更新する。
以上の変更ようにすることで、データ部に対しての変更を少なくすることで、可能な限り既存データブロックのClass2 code格納位置を変更しないできるため、ECグループ拡張に伴うデータブロック転送量を削減できる。
図9Aと図9Bを用いて、データ数(D数)とノード数を同時に減設するとき、すなわちECグループを収縮するときのストライプマッピングテーブル301とパリティ管理テーブル303の逆引きテーブル602の更新処理を説明する。
図9Aは、データ数とノード数を同時に減設するときのストライプマッピングテーブル301の更新例を示す概念図である。ストライプマッピングテーブル301Cは、ECグループ収縮前のストライプマッピングテーブル301であり、ストライプマッピングテーブル301Dは、ECグループ収縮後のストライプマッピングテーブル301である。
ストライプマッピングテーブル301Cは、分散型ストレージシステム100が6台のノード(E01〜E06)でクラスタを構成していることを示している。ECグループの構成は、4D2Pであり、サイクル数Cが4である。
このクラスタ構成から6番目のノード(E06)を除外し、更に4D2Pから3D2PにECグループを収縮するときのストライプマッピングテーブル301の変更例を示す。
まず、コントローラ107は、既存のマッピングテーブル301Cに対して、6番目のノードの列(E06)を除外する。
次に、コントローラ107は、除外後のストライプマッピングテーブル301の各列に対して、ストライプグループ番号を割り当て直す。以下、当該割り当て直し方の例を説明する。
(1)コントローラ107は、データ部に対して、割り当て数が収縮後のD数(3個)を超過するストライプグループ番号(ここでは、S01、S04)を選択し、そのストライプグループ番号の内、割り当て数が最大のストライプグループ番号(S01、S04)の内、1つの割り当てを消去し、新しいストライプグループ番号(S07)に変更する。
(2)コントローラ107は、Class2 code部に対して、同列で重複しないように、新しく追加したストライプグループ番号を一つの列に割り当てる。
(3)コントローラ107は、Class2 code部に対して、除外した列に割り当てられたストライプグループ番号(S01)を同列で重複しないように、既存の列(E01)に移動する。
図9Bは、データ数とノード数を同時に減設するときの逆引きテーブル602の更新例を示す概念図である。コントローラ107は、D数が減少したときは、パリティ管理テーブル303の逆引きテーブル602が含むパリティ構成情報のスロットを、D数を減設した数と同等の数だけ減設する。これにより、Class2 codeを構成するデータブロックにおいて、減設対象となった不要なD数分のデータブロック位置情報を管理しないようにする。このとき、コントローラ107は、減設対象スロットのデータブロックを、0データ化しておく。具体的には、コントローラ107は、減設対象スロットに該当するデータブロックを転送し、パリティを当該データブロックで更新する。これにより、Class2 codeを全て崩して再生成することなく、一部のデータブロックだけをパリティ構成情報から除外できる。
以上のようにすることで、可能な限り既存データブロックのClass2 code格納位置を変更しないようにし、ECグループ収縮に伴うデータブロック転送量を削減する。
図10は、ECグループ拡縮処理のフローチャートである。ユーザまたは管理プログラムから、分散型ストレージシステム100がECグループの拡縮要求を受信したときに、ノード101のコントローラ107で、ECグループ拡縮処理プログラム305を実行することにより、ECグループ拡縮処理を行う。
図10のS1001〜S1005の処理は、分散型ストレージシステム100のいずれかのノード101のコントローラ107で行われる。2以上のノード101で行うことも可能であるが、S1004やS1005の処理において全てのノード101で共有する各種管理情報301〜304を更新するので、これらの情報がノード間で不整合となるのを防ぐため、本実施例では、一つのノード101でS1001〜S1005の処理を行うとする。
例えば、ユーザまたは管理プログラムからECグループの拡縮要求を受信したノード101で、S1001〜S1005の処理を行うとする。例えば、分散型ストレージシステム100が有する複数のノード101のうち、一つをマスターノードとし、その他のノード101をスレーブノードとする場合、マスターノードがS1001〜S1005の処理を実行してもよい。マスターノードは、ユーザまたは管理プログラムからECグループの拡縮要求を受信して本処理を行う。スレーブノードがユーザまたは管理プログラムからECグループの拡縮要求を受信する場合には、マスターノードはスレーブノードからECグループの拡縮要求を受信して本処理を行う。
コントローラ107は、ノード状態管理テーブル304を参照して、分散型ストレージシステム100のクラスタが既に再構築処理中ではないかどうかを判定する(S1001)。具体的には、コントローラ107は、ノード状態管理テーブル304を参照して、各ノードのノード状態が「RECLUSTERING」であれば、クラスタが既に再構築処理中であると判定する。
S1001の判定の結果、クラスタが再構築処理中であった場合(S1001:Y)、コントローラ107はECグループ拡縮処理を終了する。または、コントローラ107は、ECグループの拡縮要求をキューイングしておき、現在のクラスタ再構築処理が完了してから、キューイングした要求を取り出し、要求を実行してもよい。
S1001の判定の結果、クラスタが再構築中でない場合(S1001:N)、コントローラ107は、ECグループの拡縮要求が収縮要求かどうか判定する(S1002)。ここで、収縮要求とは、クラスタからノードを減設する操作を指す。
S1002の判定の結果、収縮要求である場合(S1002:Y)、コントローラ107は、ECグループを収縮した場合に十分な空き容量があるか否か判定する(S1003)クラスタからノードを減設する場合、パリティ部の比率が増加するため、十分な空き容量がなくデータ部の使用率が高いと、収縮後に十分なパリティ部の記憶容量が確保できない可能性がある。
S1003の判定の結果、十分な空き容量がない場合(S1003:N)、コントローラ107は、ECグループ拡縮処理を終了する。S1003の判定の結果、十分な空き容量がある場合(S1003:Y)、コントローラ107は、S1004の処理を実行する。
S1004では、コントローラ107は、ストライプマッピングテーブル301をEC拡縮後の構成に合わせて更新する。更新したストライプマッピングテーブル301を、新規ストライプマッピングテーブルと呼ぶことがある。更新前のストライプマッピングテーブル301を、旧ストライプマッピングテーブルと呼ぶことがある。新規ストライプマッピングテーブルと旧ストライプマッピングテーブルの両方を指す用語として、新旧ストライプマッピングテーブルと呼ぶことがある。コントローラ107は、新旧ストライプマッピングテーブルを保存する。
S1002の判定の結果、収縮要求でない場合(S1002:N)も、コントローラ107は、S1004の処理を実行する。
コントローラ107は、ECグループ拡縮処理に備えて、各種管理情報301〜304を初期化する。具体的には、パリティ管理テーブル303内のパリティ構成情報のスロット数をECグループ拡縮後の構成に合わせて追加し、更にノード状態管理テーブル304内の進捗ポインタを初期化し、更に新規ストライプマッピングテーブルに基づき、キャッシュ管理テーブル302を新たに作成する(S1005)。
マスターノードのコントローラ107は、他のスレーブノード101に、S1004およびS1005で更新した各種管理情報301〜304を転送し、クラスタ再構築処理を要求する。各ノード101コントローラ107は、クラスタ再構築処理を実行する(S1006)。各ノード101で実行されるクラスタ再構築処理の詳細については、図11にて述べる。
クラスタ再構築処理が終わると、各ノード101のコントローラ107は、それぞれのノード101内において、Class2 codeを新規ストライプマッピングテーブルに対応するように、詰め直す(S1007)。具体的には、ストライプマッピングテーブル301の変更により、Class2 codeの開始アドレスが変更されるため、新規ストライプマッピングテーブルでClass2 code部にあたるLBAに格納されたClass2 codeのインデックス番号を変更する。また、新規ストライプマッピングテーブルでデータ部領域にあたるLBAに格納されたClass2 codeは、新規ストライプマッピングテーブルでClass2 code部領域となるように読み出して、書き直す。
最後に、コントローラ107は、各種管理情報301〜304を更新する。具体的には、コントローラ107は、旧ストライプマッピングテーブルや旧キャッシュ管理テーブルを破棄して、各種管理情報301〜304をECグループ拡縮後の情報に更新する(S1008)。例えば、マスターノードのコントローラ107が各種管理情報301〜304を更新した後、他のスレーブノードに更新した各種管理情報301〜304を転送して、同期させてもよい。
図11は、クラスタ再構築処理のフローチャートである。クラスタ再構築処理は、図10のECグループ拡縮処理の一部(S1006)であり、各ノード101のコントローラ107により実行される。クラスタ再構築処理は、ECグループの拡縮に伴うクラスタの再構築処理である。具体的には、クラスタ再構築処理は、新旧ストライプマッピングテーブルを比較して、ストライプグループ番号が変化しているデータブロックに対して、新規ストライプマッピングテーブルに従うように、当該データブロックに対応するClass2 codeを更新する。なお、SMTとは、ストライプマッピングテーブル301を意味する。
以下の説明では、あるストライプのデータブロックを処理対象としたとき、当該ストライプのデータブロックを格納するノード101をデータストアノードとし、当該ストライプが属するストライプグループのClass2 codeを格納するノード101をパリティストアノードとする。
まず、データストアノードにおけるクラスタ再構築処理のフローチャートを説明する。データストアノードのコントローラ107は、自身のノードが有するストライプについて、LBAの若い番号から順に処理対象として、以下のクラスタ再構築処理を実行する。
コントローラ107は、ノード状態管理テーブル304の進捗ポインタを参照し、処理対象がLBA終端かどうかを確認する(S1101)。
S1101の確認の結果、処理対象がLBA終端でない場合(S1101:N)、コントローラ107は、処理対象のLBAに対応するストライプグループ番号が新規ストライプマッピングテーブルと旧ストライプマッピングテーブルで同じかどうか確認する(S1102)。
S1102の確認の結果、処理対象のLBAに対応するストライプグループ番号が新旧ストライプマッピングテーブルで同じである場合(S1102:Y)、コントローラ107は、何も処理せず、進捗ポインタを更新して、次のLBAへ処理を進める(S1109)。
S1102の確認の結果、処理対象のLBAに対応するストライプグループ番号が新旧ストライプマッピングテーブルで異なる場合(S1102:N)、コントローラ107は、処理対象のLBAの排他を取得する(S1103)。
コントローラ107は、旧ストライプマッピングテーブルにおけるストライプグループ番号が、新規ストライプマッピングテーブルで解散しているかどうか確認する(S1104)。解散とは、旧ストライプマッピングテーブルで割り当てられていたストライプグループ番号が、新規ストライプマッピングテーブルで割り当てられていない状態を意味する。
S1104の確認の結果、旧ストライプマッピングテーブルで割り当てられていたストライプグループ番号が解散している場合(S1104:Y)、コントローラ107は、当該ストライプグループ番号に対応するパリティストアノードのClass2 codeは、不要であるため、破棄する。コントローラ107は、旧ストライプマッピングテーブルに対応するパリティストアノードへ当該LBAのデータブロックのClass2 codeへパージ指示を送信する(S1105)。パージ指示を受信するパリティストアノードのフローチャートは、後述する。
S1104の確認の結果、旧ストライプマッピングテーブルで割り当てられていたストライプグループ番号が解散していない場合(S1104:N)、当該ストライプグループ番号に対応するパリティストアノードのClass2 codeを構成する処理対象のLBAのデータブロックは不要であるため、コントローラ107は、Class2 codeを構成するデータブロックから除外する。コントローラ107は、旧ストライプマッピングテーブルに対応するパリティストアノードへ除外対象のデータブロック(除外データ)を更新属性で転送する(S1106)。除外データを受信するパリティストアノードのフローチャートは、後述する。
コントローラ107は、処理対象のドライブ105が減設対象のドライブかどうか確認する(S1107)。S1107の確認の結果、減設対象でない場合(S1107:N)、コントローラ107は、新規ストライプマッピングテーブルに対応するパリティストアノードへClass2 codeを生成するため、処理対象のLBAに格納しているデータブロックを読み出して、新規属性で転送する(S1108)。コントローラ107は、進捗ポインタを更新する(S1109)。S1107の確認の結果、減設対象である場合も(S1107:Y)、コントローラ107は、S1109を実行する。
コントローラ107は、処理対象のLBAの排他を取得しているか確認する(S1110)。S1110の確認の結果、処理対象のLBAの排他を取得している場合(S1110:Y)、コントローラ107は、処理対象のLBAの排他を解放し、次のLBAへ処理を進める(S1111)。S1110の確認の結果、処理対象のLBAの排他を取得していない場合(S1110:N)、コントローラ107は、次のLBAへ処理を進める(S1111)。
S1101の確認の結果、処理対象がLBA終端である場合(S1101:Y)、コントローラ107は、データストアノードのクラスタ再構築処理を終了する。
次に、パリティストアノードにおけるクラスタ再構築処理のフローチャートを説明する。
まず、パリティストアノードが、パージ指示を受信したときに実行される処理について説明する。パリティストアノードのコントローラ107は、パージ指示を受信したら、パージ対象のデータブロックに対応するパリティ構成情報を取得し、パージ対象のデータブロックのスロットの状態をパージ中(PURGING)に更新し、全てのスロットがパージ中あるいは未使用(FREE)かどうかを確認する(S1112)。S1112の確認の結果、使用中(USING)のスロットが残存する場合(S1112:N)、コントローラ107は処理を終了する。S1112の確認の結果、全てのスロットがパージ中あるいは未使用(FREE)である場合、当該Class2 codeは、もはやどのノードも使用していないため、コントローラ107はClass2 codeを消去して、処理を終了する(S1113)。Class2 codeの消去では、コントローラ107は、パリティ管理テーブル303の正引きテーブル601と逆引きテーブル602の対象エントリを消去し、消去対象のClass2 codeを格納していたLBAをフリーリスト603に挿入する。
次に、パリティストアノードが、データブロックを新規属性または更新属性で受信した時の処理について説明する。パリティストアノードのコントローラ107は、データブロックを受信したら、受信したブロックが更新属性かどうかを確認する(S1114)。
S1114の確認の結果、更新属性でなく新規属性である場合(S1114:N)、コントローラ107は、新規ライトデータを受信しているため、受信ブロックをダーティキャッシュに格納する(S1123)。格納したダーティキャッシュは、図12で説明するように、パリティストアノードのホストI/O処理プログラムに従って処理される。
S1114の確認の結果、更新属性である場合(S1114:Y)、受信したデータブロックは除外データまたは中間コードであるため、コントローラ107は、受信したブロックを使用して格納されたClass2 codeをRead Modify Writeにより更新する。
まず、コントローラ107は、正引きテーブル601を参照して、更新対象のClass2 codeを特定する(S1115)。具体的には、コントローラ107は、受信したブロックの格納位置情報を参照し、当該格納位置情報に対応する正引きテーブル601のエントリを参照して、Class2 code格納位置を特定する。
次に、コントローラ107は、特定したClass2 codeの格納位置であるLBAの排他を取得する(S1116)。コントローラ107は、逆引きテーブル602を取得して、更新対象のスロットを特定する(S1117)。具体的には、特定したClass2 codeの格納LBAに対応する逆引きテーブル602のエントリを参照し、参照したエントリ中のパリティ構成情報から、受信したブロックの格納位置情報と一致するスロットを特定する。
コントローラ107は、更新対象のClass2 codeをドライブ105から読み出し(S1118)、読み出したClass2 codeと受信したブロックでXOR計算を行い、Class2 codeを更新する(S1119)。コントローラ107は、更新したClass2 codeをドライブ105に格納する(S1120)。
コントローラ107は、パリティ管理テーブル303の逆引きテーブル602を更新する(S1121)。具体的には、コントローラ107は、逆引きテーブル内にあるパリティ構成情報のうち、除外データの対象となるスロットの情報を消去する。受信ブロックが中間コードである場合は、パリティ管理テーブル303の更新は行わない。
コントローラ107は、S1116で取得した排他を解放する(S1122)。最後に、コントローラ107は、受信したブロックをアンドゥキャッシュに格納して、処理を終了する(S1124)。
図12は、ホストI/O処理のフローチャートである。アプリケーションプログラムや仮想マシンといったホストからI/O要求を受信したときに、ノード101のコントローラ107で、ホストI/O処理プログラム306を実行することにより、ホストI/O処理が開始される。
まず、I/O要求を受信したノード(データストアノード)のコントローラ107で実行するホストI/O処理について説明する。
コントローラ107は、受信したI/O要求からI/O処理対象となるデータブロック位置(データブロックの格納先)を特定し、データブロック位置の排他を取得する(S1201)。これにより、I/O処理を並列して処理した場合でもデータ不整合が発生しないようにする。
コントローラ107は、I/O要求が読み出し処理かどうかを判定する(S1202)。S1202の判定の結果、読み出し処理である場合(S1202:Y)、コントローラ107は、ドライブ105から要求対象のデータブロックを読み出して、読み出したデータブロックをホストに転送する(S1203)。最後に、コントローラ107は、取得していた排他を解放して処理を終了する(S1210)
S1202の判定の結果、I/O要求が読み出し処理ではなく書き込み処理である場合(S1202:N)、コントローラ107は、新規ライトかどうかを判定する(S1204)。S1204の判定の結果、新規ライトである場合(S1204:Y)、コントローラ107は、Class1 codeを計算する(S1208)。なお、Class1 codeは、ストライプグループの構成がmDnPの場合、n−1個だけ生成する。
S1204の判定の結果、新規ライトではなく更新ライトである場合(S1204:N)、コントローラ107は、ドライブ105からライト先アドレスに格納されたデータブロックを読み出して(S1205)、読み出したデータブロックとライトデータとで、データブロックの中間コードを計算する。同様に、コントローラ107は、Class1 codeの中間コードを計算する(S1206)。
Class1 codeの中間コードの計算方法について説明する。Class1 codeの中間コードの計算方法は、書き込まれたライトデータブロックのブロックサイズおよび新規ライトか、更新ライトかにより、異なる。Class1 codeの中間コード(Px)は、以下のように計算する。
[数1]
Px=P1'+P1
ここで、PxはClass1 codeの中間コードであり、P1'は新規ライトデータブロックにより生成したClass1 code、P1は既にドライブ105へ書き出されたデータブロックで生成したClass1 codeとする。数式1から数式5に関するXOR演算を、単に"+"として表記する。
例として、ストライプグループの構成を4D2Pとし、4つのデータブロックを新規ライトで書き込む場合のClass1 codeの中間コード(Px)の計算方法を以下に示す。
[数2]
Px=P1'+P1
=(D1'+D2'+D3'+D4')+(0+0+0+0)
=D1'+D2'+D3'+D4'
ここで、新規ライト対象の4つのデータブロックを、D1'、D2'、D3'、D4'とする。0は0データを示す。
例として、ストライプグループの構成を4D2Pとし、2つのデータブロックを新規ライトで書き込む場合のClass1 codeの中間コード(Px)の計算方法を以下に示す。
[数3]
Px=P1'+P1
=(D1'+D2'+0+0)+(0+0+0+0)
=D1'+D2'
ここで、新規ライト対象の2つのデータブロックを、D1'、D2'とする。
新規ライトの場合、新規ライト対象のデータブロック以外のストライプは、0データとして扱い、Class1 codeの中間コード(Px)を生成する。0データのXOR演算は、結果に影響を与えないため、上記のようになる。新規ライト対象のデータブロックの数が、1ブロックや3ブロックの場合も同様に計算できる。
例として、ストライプグループの構成を4D2Pとし、4つのデータブロックを更新ライトで書き込む場合のClass1 codeの中間コード(Px)の計算方法を以下に示す。
[数4]
Px=P1'+P1
=(D1'+D2'+D3'+D4')+(D1+D2+D3+D4)
=M1+M2+M3+M4
ここで、更新ライト対象の4つのデータブロックを、D1'、D2'、D3'、D4'とする。また、既にドライブ105に書き込まれているデータブロックをD1、D2、D3、D4とする。また、更新ライト対象のデータブロックと、当該データブロックのライト先に格納されたデータブロックから計算する中間コードを、M1、M2、M3、M4とする。M1、M2、M3、M4は、それぞれD1'+D1、D2'+D2、D3'+D3、D4'+D4で計算される。
例として、ストライプグループの構成を4D2Pとし、2つのデータブロックを更新ライトで書き込む場合のClass1 codeの中間コード(Px)の計算方法を以下に示す。
[数5]
Px=P1'+P1
=(D1'+D2'+D3+D4)+(D1+D2+D3+D4)
=M1+M2
ここで、更新ライト対象の2つのデータブロックを、D1'、D2'とする。また、既にドライブ105に書き込まれているデータブロックをD1、D2、D3、D4とする。また、更新ライト対象のデータブロックと、当該データブロックのライト先に格納されたデータブロックから計算する中間コードを、M1、M2とする。M1、M2は、それぞれD1'+D1、D2'+D2で計算される。
更新ライトの場合、更新ライト対象のデータブロックについて、既存データブロックとXOR計算することで、Class1 codeの中間コード(Px)を生成する。同データ同士のXOR演算は、0データとなり、結果に影響を与えないため、上記のようになる。更新ライト対象のデータブロックの数が、1ブロックや3ブロックの場合も同様に計算できる。
以上のように、書き込みパタンごとに適した計算方法により、Class1 codeの中間コード(Px)を計算することで、XOR計算回数を減らし、パリティ計算処理を高速化する。
コントローラ107は、ストライプマッピングテーブル301を参照して、Class2 codeの格納先となる宛先ノードを決定し、S1206で計算したデータブロックの中間コード、およびClass1 codeの中間コードを宛先ノードへ転送する。データ転送の際、コントローラ107は、更新属性の情報を付与し、中間コードを転送する(S1207)。
コントローラ107は、ストライプマッピングテーブル301を参照して、Class2 codeの格納先となる宛先ノードを決定し、S1208で計算したClass1 codeとデータブロックを宛先ノードへ転送する。データ転送の際、コントローラ107は、新規属性の情報を付与し、Class1 codeとデータブロックを転送する(S1209)。
なお、S1207およびS1209において、コントローラ107は、ノード状態管理テーブル304を参照して、ノード状態がクラスタ再構築中の場合は、進捗ポインタを参照し、データ格納先アドレスが既に、クラスタ再構築が完了しているかどうかを確認する。データ格納先アドレスのクラスタ再構築が完了している場合、コントローラ107は、新規ストライプマッピングテーブルに従い宛先ノードを決める。データ格納先アドレスのクラスタ再構築が未完了の場合、コントローラ107は、旧ストライプマッピングテーブルに従い宛先ノードを決める。
コントローラ107は、ローカルのドライブ105へ受信したライトデータブロックを書き込む(S1210)。最後に、コントローラ107は、S1201で取得したデータブロック位置の排他を解放して、データストアノードにおけるホストI/O処理を終了する(S1211)。
次に、宛先ノードであるパリティストアノードのコントローラ107で実行するホストI/O処理について説明する。本処理は、キャッシュ容量の消費量を定期的に確認し、非同期的に実行してもよいし、またはS1207またはS1209のデータ転送でパリティ生成用データを受信した契機で起動し、データストアノードにおけるホストI/O処理(ライト処理の場合)と同期的に実行してもよい。
コントローラ107は、キャッシュ消費量が閾値を超過しているかどうか確認する(S1212)。S1212の確認の結果、キャッシュ消費量が閾値を超過していない場合(S1212:N)、コントローラ107は、パリティストアノードにおけるホストI/O処理を終了する。
S1212の確認の結果、キャッシュ消費量が閾値を超過している場合(S1212:Y)、コントローラ107は、フリーリスト603に空きがあるかどうかを確認する(S1213)。
S1213の確認の結果、フリーリスト603に空きがない場合(S1213:N)、新規Class2 codeの書き出し先を確保できないため、コントローラ107は、既存Class2 codeのうち、パリティ構成情報のいくつかのスロットが未使用のClass2 codeを選択し、そのClass2 codeへデステージ対象のデータブロックをRead Modify Writeにより、更新する。まず、コントローラ107は、パリティ構成情報を参照して、いくつかのスロットが未使用となっているClass2 codeを選択する(S1216)。次に、コントローラ107は、更新対象のClass2 codeの排他を取得し(S1116)、選択したClass2 codeをドライブから読み出す。(S1118)。次に、コントローラ107は、ダーティキャッシュに格納しているデータブロックのうち、未使用スロットに対応するデータブロックを選択し、選択したデータブロックを使用して、Class2 codeを更新する(S1217)。例えば、図6に示すように、パリティ構成情報のうち、データストアノード番号0x03に接続されたドライブ番号0x0000に対応するスロットが未使用である場合、ダーティキャッシュに格納されたデータブロックのうち、データストアノード番号0x03に接続されたドライブ番号0x0000に格納されたデータブロックからコピーされたデータブロックが選択される。
次に、コントローラ107は、更新したClass2 codeをドライブ105へ書き出し(S1120)、パリティ管理テーブルを更新する(S1121)。具体的には、更新に使用したデータブロックに対応する正引きテーブル601のエントリを更新したClass2 codeの書き出し先アドレスで更新する。更に、コントローラ107は、更新したClass2 codeに対応する逆引きテーブル602のエントリの未使用スロットを、Class2 codeの再計算に使用したデータブロックの格納位置情報で更新する。最後に、コントローラ107は、取得した排他を解放して、処理を終了する(S1122)。
S1213の確認の結果、フリーリスト603に空きがある場合(S1213:Y)、コントローラ107は、新規Class2 codeの書き出し先を確保できるため、複数のデータブロックで新規Class2 codeを計算し、ドライブ105へ書き出す。まず、コントローラ107は、フリーリスト603からClass2 codeの書き出し先を取得し、ダーティキャッシュテーブル501から、同一ストライプグループ番号のデータブロック、またはClass1 codeを選択する(S1214)。選択するデータブロック、またはClass1 codeは、同一ストライプグループ番号であれば、任意のブロックでよい。次に、コントローラ107は、選択したデータブロック、またはClass1 codeでClass2 codeを計算する(S1215)。Class2 codeは、mDnPの場合、n個だけ生成する。次に、コントローラ107は、書き出し先アドレスの排他を取得し(S1116)、Class2 codeを書き出す(S1120)。
次に、コントローラ107は、パリティ管理テーブル303を更新する(S1121)。具体的には、コントローラ107は、選択したデータブロックに対応する正引きテーブル601のエントリを取得した書き出し先アドレスで更新し、更に取得したClass2 codeの書き出し先アドレスに対応する逆引きテーブル602のエントリを、Class2 codeの計算に使用したデータブロックの格納位置情報で更新する。最後に、コントローラ107は、S1116で取得した排他を解放して、パリティストアノードにおけるホストI/O処理を終了する(S1122)。
図13は、ロールバック処理のフローチャートである。データストアノードに障害が生じたとき、障害の発生したデータストアノードのパリティブロック(Class2 code)を格納している各パリティストアノードのコントローラ107で、ロールバック処理プログラム307を実行することにより、ロールバック処理を行う。ロールバック処理では、データストアノードに障害が発生したときに、パリティストアノード間でClass2 codeの整合性を確認し、不整合があった場合、Class2 codeの整合性をとるための処理を行う。
まず、コントローラ107は、アンドゥキャッシュテーブル502の状態を参照して、全てのエントリに対して、整合性の確認をとったかどうか確認する(S1301)。S1301の確認の結果、全てのエントリに対して、まだ整合性がとれていない場合(S1301:N)、コントローラ107は、整合性を未確認であるキャッシュエントリを一つ選択する(S1302)。
次に、コントローラ107は、選択したエントリのI/O範囲情報から整合性をとるべき、他のパリティストアノードノード(問い合わせ先ノード)を選定する(S1303)。具体的には、コントローラ107は、I/O範囲における開始アドレスと、データ転送長から、ライト対象となったデータブロックを特定する。ライト先が複数のデータブロックに跨っている場合、それらのデータブロックのClass2 codeを格納する他のパリティストアノードを、問い合わせ先ノードとして選定する。例えば、開始アドレスが0x00000000、データ転送長が16KB、およびデータブロック単位が4KBの場合、アドレス0x00000000から4ブロックが更新対象である。このため、これら4ブロックのストライプグループ番号をストライプマッピングテーブル301から求め、問い合わせ先ノードを選定する。
次に、コントローラ107は、選定した問い合わせ先ノードから、選択中のエントリと同タグ番号のエントリの世代番号を取得する(S1304)。コントローラ107は、取得した世代番号が、自ノードのエントリに記録された世代番号より小さいか否か確認する(S1305)
S1305の確認の結果、取得した世代番号が、自ノードのエントリに記録された世代番号より小さい場合(S1305:Y)、コントローラ107は、最新ライトデータを未受信のパリティストアノードが存在するとして、自系ノードのClass2 codeをロールバックすることで、Class2 codeの整合性をとる。この処理は、Read Modify Writeに使用するデータブロックが、ロールバック用ブロックであること(S1306)以外は、図11で説明したフローチャートと同様である(S1115〜S1118、S1120〜S1122)。S1306では、コントローラ107は、選択中エントリのキャッシュエントリに格納されたデータブロック、または中間コードを使用して、Class2 codeをRead Modify Writeすることで、Class2 codeを更新する。
コントローラ107は、アンドゥキャッシュテーブル502において、整合性を確認したエントリの状態を確認済み(CHECKED)に更新して、当該エントリの確認を完了し、またS1301を実施する(S1307)。
S1305の確認の結果、取得した世代番号が、自ノードのエントリに記録された世代番号より小さくない場合も(S1305:N)、コントローラ107はS1307を実施する。
S1301の確認の結果、全てのエントリに対して、整合性の確認がとれた場合、コントローラ107はロールバック処理を終了する(S1301:Y)。
図14は、実施例2における分散型ストレージシステム100の構成を示す図である。分散型ストレージシステム100について、実施例1における図1が示す構成と、実施例1における図14が示す構成との主な差は、実施例2のノード101のバックエンドポート108については、ネットワーク103に加えて、仮想的または物理的なバックエンドネットワーク1406を介して複数のフラッシュドライブ1401と接続されている点である。
以下、実施例1と同様の構成要素には同じ符号をつけて、説明を省略する。実施例1で説明した各種管理情報301〜304や各種プログラム305〜307、また各種処理(例えば図10〜図13の処理)については、以下特に説明がない限り、実施例2も同様である。
一つのサイトには、1または複数のノード101が設置されている。ノード101は、他のノード101を介することなく、バックエンドネットワーク1406を介してフラッシュドライブ1401それぞれと通信可能であり、ローカルなドライブ105として使用できる。一つのフラッシュドライブ1401は、一つのノード101とのみ通信する。
バックエンドネットワーク1406は、複数のノード101を相互接続してもよく、バックエンドネットワーク1406が接続されたノード101間は、バックエンドネットワーク1406を使用して通信してもよい。バックエンドネットワーク1406で接続されていないノード101間の通信は、ネットワーク103を使用する。
フラッシュドライブ1401は、ノード101と接続するためのインタフェース1402、データを一時的に格納するバッファメモリ1404、フラッシュドライブ1401を制御する内部プロセッサ1403、およびデータを格納する複数のフラッシュメモリ1405を含んで構成される。
本実施例は、パリティブロック(Class1 codeまたはClass2 code)の計算処理、当該パリティブロックのメタデータ管理、およびログストラクチャード形式でのデータ格納処理をフラッシュドライブ1401で実施する。これにより、ノード101は、パリティブロック(Class1 codeまたはClass2 code)の生成、当該パリティブロックの構成管理、ログストラクチャード形式を意識することなく、ライト処理を実施できるため、ノード101の処理負荷を削減でき、その分の計算リソ−スをアプリケーションプログラムや仮想マシンに割り当てることができる。
具体的には、実施例1で述べた各種管理情報301〜304をフラッシュドライブ1401内のバッファメモリ1404に格納し、一部プログラムをフラッシュドライブ1401内の内部プロセッサ1403で実行する。一部プログラムとは、パリティ計算およびパリティのメタデータ管理、およびログストラクチャード管理を実行するプログラムである。
なお、本発明は、上記した実施例に限定されるものではなく、様々な変形例が含まれる。実施例1と実施例2の構成は、他の実施例の構成要素と組合せて実施しても良い。実施例1または実施例2の構成の一部を、他の実施例の構成の一部と代替して実施しても良い。実施例1、実施例2の構成の一部を除いて実施しても良い。
また、以下の構成についても、実施例1または実施例2の技術的範囲に含まれる。
分散型ストレージシステム100は、ECグループを拡張または収縮する場合、各ノード101のデータに対し、変更前のECグループの構成から、変更後のECグループの構成へ論理構成を切り替える。
分散型ストレージシステム100は、ECグループの拡張または収縮前後の新旧ストライプマッピングテーブルを参照して、新旧ストライプマッピングテーブルのストライプグループ番号の割り当て状態とノード構成に応じて、分散型ストレージシステム100のクラスタを再構築する。特に、分散型ストレージシステム100は、新旧ストライプマッピングテーブルを比較し、新旧ストライプマッピングテーブルで割り当てられたストライプグループ番号が異なるデータブロックがある場合、以下の処理を実行する。以下、当該データブロックを「対象データブロック」と呼ぶ。対象データブロックとして、Class1 codeを含んでいてもよい。
(1)分散型ストレージシステム100は、旧ストライプマッピングテーブルにおけるストライプグループ番号が、新規ストライプマッピングテーブルに存在しないとき、旧ストライプマッピングテーブルにおけるストライプグループ番号で生成したパリティブロック(Class2 code)を削除する通知をパリティストアノードに送信する。パリティストアノードは、当該Class2 codeを削除する。
(2)分散型ストレージシステム100は、旧ストライプマッピングテーブルにおけるストライプグループ番号が、新規ストライプマッピングテーブルに存在するとき、対象データブロックをパリティストアノードに送信する。パリティストアノードは、旧ストライプマッピングテーブルにおけるストライプグループ番号で生成したClass2 codeの構成から対象データブロックを除去するように、Class2 codeを更新する。
(3)分散型ストレージシステム100は、対象データブロックを格納するデータストアノードが減設対象でなければ、パリティストアノードに対象データブロックを転送して、
新規ストライプマッピングテーブルにおけるストライプグループ番号で生成したパリティを生成または更新する。
分散型ストレージシステム100は、動的に選択したデータでパリティを計算し、選択したデータの格納位置情報を記録するシステムであり、ECグループの拡張または収縮に合わせ、管理情報(例えば、ストライプマッピングテーブル301等)を更新する。例えば、分散型ストレージシステム100は、ECグループを拡張するとき管理情報に新規スロットを追加し、0データとして初期化する。また、分散型ストレージシステム100は、ECグループを収縮するとき、管理情報から0データとなった既存スロットを削除する。
分散型ストレージシステム100は、追加ノードへのライトデータのパリティ計算方法を、パリティ空間に空き容量に応じて、既存パリティを書き換えるか、新規パリティを生成するか切り替える。また、分散型ストレージシステム100は、同じストライプから計算される複数のパリティを、ドライブ105の連続領域に格納する。
分散型ストレージシステム100は、パリティを生成したデータまたは更新した中間コードを世代番号と共に管理し、データストアノードの障害時にノード101間で世代番号の整合性を確認して、必要であればパリティをロールバックする。
分散型ストレージシステム100は、ECグループを拡張または収縮する前後において、ストライプグループの組換え数が少なくなるように、ストライプマッピングテーブル301を更新する。分散型ストレージシステム100は、データ転送先管理部と一次的なパリティ転送先管理部と二次的なパリティ転送先管理部の3つの部分に対して、順にストライプグループの割り当てを変更する。
分散型ストレージシステム100は、ECグループを拡張するのと同時にクラスタを構成するノード101を増設するとき、拡張後のD数に満たないストライプグループに対し、追加ノードのセルを組み込んでストライプグループを組み直す。また、分散型ストレージシステム100は、拡張後のD数に満たないストライプグループを解散して、解散したストライプグループが割り当てられていたセルを、拡張後のD数に満たない他ストライプグループに組み込み、ストライプグループを組み直す。また、分散型ストレージシステム100は、既存ノードに割り当てられたパリティのセルのうち、割り当て数に偏りがあるノードのセルを、同ノードでストライプグループが重複しないように追加ノードに割り当て直す。
分散型ストレージシステム100は、既存パリティブロックに対して、RMW(Read−Modify Write)動作により、パリティを構成するデータブロックに新規データブロックを追加することで、新規パタンにパリティブロックを書き換えて,ECグループを拡張する。分散型ストレージシステム100は、追加ノードに対してのライト要求時にパリティブロックの書き換えを実施することで、ECグループ拡張でのネットワーク転送とライト時のデータ保護のためのネットワーク転送を共通化する。ネットワーク転送が必要なデータブロックを追加したノードに局所化することで,ECグループ拡張中のネットワーク転送量を削減できる。
分散型ストレージシステム100は、ECグループを収縮するのと同時にクラスタを構成するノード101を減設するとき、除外ノードに割り当てられたセルを除外ノードと共にストライプマッピングテーブル301から除外してストライプグループを組み直す。分散型ストレージシステム100は、収縮後のD数を超過するストライプグループのうち、いくつかのセルを選択し、それらで新規ストライプグループを組み直す。分散型ストレージシステム100は、除外ノードに割り当てられたパリティのセルを、そのパリティを構成するデータブロックが割り当てられていない既存ノードのセルに割り当て直す。
分散型ストレージシステム100は、上述したパリティの計算方法を、ドライブ105内部で実行する。
本発明の一態様によれば、分散型ストレージシステム100は、ECグループ拡縮前後のストライプマッピングテーブル301のストライプグループ番号の割り当て状態とノード構成に応じて、既存パリティブロックを書き換えるか(Read Modify Write)、新規パリティブロックを生成するかを使い分けることで、ECグループ拡縮時のパリティブロック組換え処理のライトペナルティを削減する。また、パリティ空間の空き容量に応じて、追加ノードへのライト時のパリティブロック計算方法を更新ライトと新規ライトで使い分けることにより、追加ノードに対するライトペナルティを削減する。さらに、パリティブロックの格納先数が冗長度に依存しない符号化方式において、ECグループ拡縮の前後で、ストライプの組換え数が少なくなるように、ストライプマッピングテーブル301を更新することで、ノード間のデータ転送量を削減する。複数のストレージデバイスを含む分散型ストレージシステム100において、ECグループ拡縮時における、ライトペナルティおよびネットワーク転送量を削減することで、ECグループ拡縮に要する時間の短縮でき、更にホストI/O性能を高めることができる。
分散型ストレージシステム100は、データセット(ECグループ、ストライプグループ)のデータ要素を増加させるとき、新たなノードにはゼロデータまたは冗長データを配置する。分散型ストレージシステム100は、複数のノードを含むストレージシステムである。前記複数のノードの其々は、ストレージデバイスと、前記ストレージデバイスにデータを格納するコントローラと、を有する。前記複数のノードのコントローラのうち、少なくとも1以上のコントローラは、複数のデータと、前記複数のデータに対応する冗長データとからなる第1所定数のデータ要素で、データセットを構成する。当該コントローラは、前記データセットの前記第1所定数のデータ要素を、前記複数のノードのうち、第1所定数の第1ノードに分散して配置する。当該コントローラは、前記データセットを構成するデータ要素の数を、前記第1所定数から第2所定数増加させる指示を受信すると、前記データセットの前記第1所定数のデータ要素と、第2所定数のゼロデータとを、新たなデータ要素としてデータセットを再構成する。当該コントローラは、前記再構成したデータセットのデータ要素を、前記第1所定数の前記第1ノードと第2所定数の第2ノードに分散させる配置であって、前記再構成したデータセットのデータ要素のうち、前記第2所定数の前記第2ノードにはゼロデータまたは前記冗長データを配置するように制御する。
少なくとも1以上の前記コントローラは、前記再構成したデータセットのデータ要素を、前記第1所定数の前記第1ノードと前記第2所定数の前記第2ノードに分散させるとき、前記再構成したデータセットのデータ要素のうち、前記複数のデータ其々の配置先のノードは同じとなるように制御する。すなわち、データセットのデータ要素を増加させるとき、データ(ユーザデータ)は、他ノードに移動しないでよいので、データ転送量を削減できる。
前記第2所定数の前記第2ノードのうち、ゼロデータを配置したノードのコントローラは、前記ゼロデータの配置先に対する第1ライト要求を受信すると、前記ゼロデータの配置先に前記第1ライト要求の第1ライトデータを格納し、前記第1所定数の前記第1ノードと前記第2所定数の前記第2ノードのうち、前記再構成したデータセットの前記冗長データが配置されたノードに、前記第1ライトデータを送信するように制御する。前記第1ライトデータを受信したノードのコントローラは、前記再構成したデータセットの前記冗長データと前記第1ライトデータを基に、前記冗長データを更新するように制御する。ゼロデータを書き換えるときに、冗長データ(Class2 code)をRead Modify Writeで更新する。
前記第1ライトデータを受信したノードのコントローラは、前記冗長データの更新するとき、前記第1所定数の前記第1ノードと前記第2所定数の前記第2ノードのうち、前記第1ライトデータを送信したノード以外の他ノードに配置された前記複数のデータ及びゼロデータを用いずに、前記冗長データを更新するように制御する。冗長データ(Class2 code)の更新に、ライトデータと冗長データ以外のデータは使わないでもよいので、データ転送量を削減できる。
前記第1所定数の前記第1ノードのうち、前記複数のデータを配置したノードのコントローラは、前記複数のデータのいずれかの配置先をライト先とする第2ライト要求を受信すると、前記ライト先に配置されたデータを読み出し、前記第2ライト要求の第2ライトデータと前記読み出したデータから中間コードを生成する。当該コントローラは、前記第2ライトデータに基づいて、ライト先に配置されたデータを更新する。当該コントローラは、前記第1所定数の前記第1ノードと前記第2所定数の前記第2ノードのうち、前記再構成したデータセットの前記冗長データが配置されたノードに、前記中間コードを送信するように制御する。前記中間コードを受信したノードのコントローラは、前記再構成したデータセットの前記冗長データと前記中間コードを基に、前記冗長データを更新するように制御する。データを書き換えるときに、中間コードを用いて、冗長データ(Class2 code)をRead Modify Writeで更新する。
前記中間コードを受信したノードのコントローラは、前記冗長データの更新するとき、前記第1所定数の前記第1ノードと前記第2所定数の前記第2ノードのうち、前記中間コードを送信したノード以外の他ノードに配置された前記データ及びゼロデータを用いずに、前記冗長データを更新するように制御する。冗長データ(Class2 code)の更新に、中間コードと冗長データ以外のデータは使わないでもよいので、データ転送量を削減できる。
前記データセットの前記第1所定数のデータ要素を、前記第1所定数の前記第1ノードに分散して配置しているとき、前記第1所定数の前記第1ノードの其々は、前記データセットの前記第1所定数のデータ要素の配置を管理するストライプマッピング情報を有する。前記第1所定数の前記第1ノードのうち少なくとも1以上のノードは、前記データセットを構成するデータ要素の数を、前記第1所定数から前記第2所定数増加させる前記指示を受信すると、前記ストライプマッピング情報を、前記再構成したデータセットのデータ要素の配置を管理するように更新する。当該少なくとも1以上のノードは、前記第1所定数の前記第1ノードと前記第2所定数の前記第2ノードのうちの他ノードに前記更新したストライプマッピング情報を送信するように制御する。前記第1所定数の前記第1ノードと前記第2所定数の前記第2ノードの其々は、前記更新前のストライプマッピング情報と前記更新したストライプマッピング情報に基づいて、前記再構成したデータセットのデータ要素を分散させるように制御する。
前記第2所定数の前記第2ノードにゼロデータを配置する場合、前記第2所定数の前記第2ノードの其々は、当該ノードが有するストレージデバイスにゼロデータを格納する処理、または当該ノードにおけるゼロデータの配置先となるアドレスに、ゼロデータであることを示す情報を対応づけて管理する処理の少なくとも一方の処理を実行する。あるいは、前記第2所定数の前記第2ノードにゼロデータを配置する場合、前記第2所定数の前記第2ノードの其々は、当該ノードにおけるゼロデータの配置先となる論理アドレスに、当該ノードが有するストレージデバイスの実記憶領域を割り当てない。
前記第1所定数の前記第1ノードのそれぞれは、論理ボリュームを提供する。前記再構成前のデータセットに含まれる前記複数のデータの其々は、別々のノードが提供する論理ボリュームのデータである。
前記データセットを構成するデータ要素の数を、前記第1所定数から第2所定数増加させる指示を受信する前に、前記複数のノードに加えて、少なくとも前記第2所定数の前記第2ノードを追加してスケールアウトする。
前記第1所定数の前記第1ノードと第2所定数の第2ノードの其々は、各々のノードに配置する冗長データを格納するための空き容量であるパリティ空き容量を管理する。前記第1ライトデータ(新規ライトデータ)を受信したノード(パリティストアノード)のコントローラは、当該ノードにおけるパリティ空き容量が所定の容量以下である場合、前記再構成したデータセットの前記冗長データと前記第1ライトデータを基に、前記冗長データを更新して格納する。一方、前記第1ライトデータを受信したノードのコントローラは、当該ノードにおけるパリティ空き容量が所定の容量以下ではない場合、前記再構成したデータセットのデータ要素のうち、前記冗長データ以外のデータ要素を基に、前記再構成したデータセットの冗長データを生成し、当該パリティ空き容量の少なくとも一部に前記生成した冗長データを格納する。
前記再構成したデータセットのデータ要素に複数の冗長データが含まれ、前記第1所定数の前記第1ノードと第2所定数の第2ノードのうち、前記複数の冗長データと同数のノードに前記複数の冗長データを分散して配置する場合、前記複数の冗長データが配置された各ノードは、当該ノードに配置された冗長データと、当該冗長データを生成または更新したときのデータセットの世代を識別する世代番号と、を対応づけて管理する。前記再構成したデータセットのデータが配置されたノードに障害が発生した場合、前記冗長データが配置された少なくとも一以上のノードは、前記複数の冗長データが配置された各ノードが管理する世代番号を取得して、他ノードで管理する世代番号が自ノードで管理する世代番号より小さいか否か判定する。当該少なくとも一以上のノードは、当該判定の結果、他ノードで管理する世代番号が自ノードで管理する世代番号より小さい場合、他ノードで管理する世代番号のうち、一番小さい世代番号の世代のデータセットにおける冗長データに、自ノードの冗長データをロールバックしてリビルド処理を実行する。一方、当該少なくとも一以上のノードは、当該判定の結果、他ノードで管理する世代番号が自ノードで管理する世代番号より小さくない場合、自ノードで管理する冗長データでリビルド処理を実行する。
本発明の実施形態の例として、以下の(1)〜(4)のステップを前記少なくとも1以上のコントローラに実行させるプログラム、または当該プログラムを記録したコンピュータ読み取り可能な記録媒体を含む。
(1)複数のデータと、前記複数のデータに対応する冗長データとからなる第1所定数のデータ要素で、データセットを構成する。
(2)前記データセットの前記第1所定数のデータ要素を、第1所定数の第1ノードに分散して配置する。
(3)前記データセットを構成するデータ要素の数を、前記第1所定数から第2所定数増加させる指示を受信すると、前記データセットの前記第1所定数のデータ要素と、第2所定数のゼロデータとを、新たなデータ要素としてデータセットを再構成する。
(4)前記再構成したデータセットのデータ要素を、前記第1所定数の前記第1ノードと第2所定数の第2ノードに分散させる配置であって、前記再構成したデータセットのデータ要素のうち、前記第2所定数の前記第2ノードにはゼロデータまたは前記冗長データを配置する。
本発明の実施形態の例として、複数のノードを含むシステムの制御方法であって、以下の(5)〜(8)のステップを有する制御方法を含む。
(5)複数のデータと、前記複数のデータに対応する冗長データとからなる第1所定数のデータ要素で、データセットを構成する。
(6)前記データセットの前記第1所定数のデータ要素を、前記複数のノードのうち、第1所定数の第1ノードに分散して配置する。
(7)前記データセットを構成するデータ要素の数を、前記第1所定数から第2所定数増加させる指示を受信すると、前記データセットの前記第1所定数のデータ要素と、第2所定数のゼロデータとを、新たなデータ要素としてデータセットを再構成する。
(8)前記再構成したデータセットのデータ要素を、前記第1所定数の前記第1ノードと第2所定数の第2ノードに分散させる配置であって、前記再構成したデータセットのデータ要素のうち、前記第2所定数の前記第2ノードにはゼロデータまたは前記冗長データを配置する。