以下の説明では、「インターフェース装置」は、一つ以上の通信インターフェースデバイスでよい。一つ以上の通信インターフェースデバイスは、一つ以上の同種の通信インターフェースデバイス(例えば一つ以上のNIC(Network Interface Card))であってもよいし二つ以上の異種の通信インターフェースデバイス(例えばNICとHBA(Host Bus Adapter))であってもよい。
また、以下の説明では、「メモリ」は、一つ以上の記憶デバイスの一例である一つ以上のメモリデバイスであり、典型的には主記憶デバイスでよい。メモリにおける少なくとも一つのメモリデバイスは、揮発性メモリデバイスであってもよいし不揮発性メモリデバイスであってもよい。
また、以下の説明では、「永続記憶装置」は、一つ以上の記憶デバイスの一例である一つ以上の永続記憶デバイスでよい。永続記憶デバイスは、典型的には、不揮発性の記憶デバイス(例えば補助記憶デバイス)でよく、具体的には、例えば、HDD(Hard Disk Drive)、SSD(Solid State Drive)、又はNVMe(Non-Volatile Memory Express)ドライブでよい。
また、以下の説明では、「プロセッサ」は、一つ以上のプロセッサデバイスでよい。少なくとも一つのプロセッサデバイスは、典型的には、CPU(Central Processing Unit)のようなマイクロプロセッサデバイスでよいが、GPU(Graphics Processing Unit)のような他種のプロセッサデバイスでもよい。少なくとも一つのプロセッサデバイスは、シングルコアでもよいしマルチコアでもよい。少なくとも一つのプロセッサデバイスは、プロセッサコアでもよい。少なくとも一つのプロセッサデバイスは、処理の一部又は全部を行うハードウェア回路(例えばFPGA(Field-Programmable Gate Array)、CPLD(Complex Programmable Logic Device)又は又はASIC(Application Specific
Integrated Circuit))といった広義のプロセッサデバイスでもよい。
また、以下の説明では、「xxxテーブル」といった表現にて、入力に対して出力が得られる情報を説明することがあるが、当該情報は、どのような構造のデータでもよいし(例えば、構造化データでもよいし非構造化データでもよいし)、入力に対する出力を発生するニューラルネットワーク、遺伝的アルゴリズムやランダムフォレストに代表されるような学習モデルでもよい。従って、「xxxテーブル」を「xxx情報」と言うことができる。また、以下の説明において、各テーブルの構成は一例であり、一つのテーブルは、二つ以上のテーブルに分割されてもよいし、二つ以上のテーブルの全部又は一部が一つのテーブルであってもよい。
また、以下の説明では、「プログラム」を主語として処理を説明する場合があるが、プログラムは、プロセッサによって実行されることで、定められた処理を、適宜に記憶装置及び/又はインターフェース装置等を用いながら行うため、処理の主語が、プロセッサ(或いは、そのプロセッサを有するコントローラのようなデバイス)とされてもよい。プログラムは、プログラムソースから計算機のような装置にインストールされてもよい。プログラムソースは、例えば、プログラム配布サーバ又は計算機が読み取り可能な(例えば非一時的な)記録媒体であってもよい。また、以下の説明において、二つ以上のプログラムが一つのプログラムとして実現されてもよいし、一つのプログラムが二つ以上のプログラムとして実現されてもよい。
また、以下の説明では、同種の要素を区別しないで説明する場合には、参照符号を使用し、同種の要素を区別して説明する場合は、要素のID(例えば識別番号)を使用することがある。例えば、ノードを特に区別しないで説明する場合には、「ノード210」と記載し、個々のノードを区別して説明する場合には、「ノード1」、「ノード2」のように記載することがある。また、ノードv(vは0以上の整数)が有する要素の名称にvを付加することで、いずれのノードの要素であるか(或いは、いずれのノードに対応する要素であるか)を区別することができる。
また、以下の説明では、「セグメント」とは、永続記憶装置に基づく記憶領域の一例であり、ノード領域の一部でよい。セグメントに格納されるデータが、当該セグメントの基になっている永続記憶装置に格納されてよい。具体的には、セグメントには、ユーザデータセット又はパリティが格納されてよい。ユーザデータセットが格納されるセグメントを「ユーザセグメント」と言うことができ、パリティが格納されるセグメントを「パリティセグメント」と言うことができる。なお、「ユーザデータセット」とは、ライト要求に付随するデータ(ライト対象データ)の少なくとも一部を含むユーザデータグループ部分で構成されてよい。「ユーザデータグループ部分」とは、ユーザデータグループの一部であり、「ユーザデータグループ」とは、ストライプに格納される全ユーザデータセットの集合でよい。「パリティ」は、ユーザデータグループに基づき生成されるデータセットでよい。「データセット」とは、一つのセグメントに格納されるデータでよく、以下の説明では、ユーザデータセットとパリティの総称でよい。データセットは、セグメント単位のデータでよい。また、「セグメント」は、一つ以上のブロックで構成されてよい。
また、以下の説明では、「ノード領域」とは、一台のノードが提供する複数のセグメントの集合としての一つの論理記憶領域でよい。
また、以下の説明では、「ストライプ」とは、データ保護ポリシが適用されたデータ保護単位としての記憶領域グループでよく、例えば、nのノード領域の各々のセグメントで構成された記憶領域グループでよい。具体的には、例えば、ストライプは、nのセグメント(例えば同一論理アドレスのnのセグメント)で構成された記憶領域でよい。ストレージシステムが、N台のノード(Nは2以上の整数)で構成されている場合、nは、2以上且つN以下の整数でよい。
また、以下の説明では、「冗長構成領域」とは、Nのノード領域で構成された記憶領域でよい。
[第1の実施形態]
図1は、差分リビルドの概要の一例を示す。なお、図1の説明では、ノードvのうちセグメントwに属するセグメントを、「セグメントvw」と表現する。
ストレージシステム101を構成する複数台のノード(ストレージノード)210の一例として、ノード1~4がある。ストライプa~dの各々のデータ保護ポリシは、2D2Pであり、各ストライプは、ノード1~4が有する四つのセグメントから構成されている。ノード1~4の各々において所定のソフトウェアが実行されることで、ストレージシステム101がSDS(Software Defined Storage)として提供されてよい。
図1において、「P」及び「Q」は、それぞれパリティを表す。例えば、ストライプaに着目すると、ユーザセグメント1aには、ユーザデータセットAが格納されており、ユーザセグメント2aには、ユーザデータセットBが格納されており、パリティセグメント3aには、ユーザデータセットA及びBを用いて生成されたパリティPABが格納されており、パリティセグメント4aには、ユーザデータセットA及びBを用いて生成されたパリティQABが格納されている。本実施形態では、ノード1~4の各々が、ユーザセグメントもパリティセグメントも有するが、ストレージシステムは、ユーザセグメントを有するがパリティセグメントを有さないノードと、パリティセグメントを有するがユーザセグメントを有しないノードとで構成されてもよい。
ノード1~4の各々が、差分情報5を保持することができる。具体的には、例えば、いずれかのノード210に障害が生じた場合に、残りのノード210の各々が、差分管理のために差分情報5を保持する。差分情報5のうち、ユーザセグメント毎に差分有か否かを表す情報を含んだ情報がユーザ部差分情報であり、パリティセグメント毎に差分有か否かを表す情報を含んだ情報がパリティ部差分情報である。本実施形態では、ノードvのセグメント毎に差分有か否かを表す情報を含んだ差分情報5-vが、当該ノードvのメモリに保持されるが、ノードvについての差分情報5-vは、ノードvとは別のノード(例えばノード(v+1)又はノード(v-1))のメモリに保持されてもよい。また、本実施形態では、ユーザ部差分情報及びパリティ部差分情報のいずれにおいても、セグメント毎に差分有か否かを表す情報は、ビット(以下、差分ビット)である。差分ビット“1”が、差分有を表し、差分ビット“0”が、差分無を表す。本実施形態では、ユーザ部差分情報及びパリティ部差分情報も、セグメント毎の差分ビットで構成されたビットマップである。
ノード1~4のうち、ノード4が障害ノードであるとする。また、ノード4に障害がある間(ノード4が停止している間)、ノード1が、ホスト350からのライト要求(例えば、ノード1がオーナ権を持つボリューム又はストライプがライト先となるライト要求)に応答して、ユーザセグメント1aの旧ユーザデータセットAを新ユーザデータセットA´に更新したとする。この場合、ノード1が、差分情報5-1のユーザ部差分情報のうち、ユーザセグメント1aに対応した差分ビットを“1”に更新する。また、ノード1が、新ユーザデータセットA´と旧ユーザデータセットAとを用いて生成された中間データセットを生成し、ストライプaのうちパリティセグメント3aを有する生存ノード3に、中間データセットを送信する。ノード3が、ノード1から当該中間データセットを受信し、当該中間データセットと旧パリティPABとを用いて新パリティPA’Bを生成し、新パリティPA’Bをセグメント3aに格納する。ノード3は、差分情報5-3のパリティ部差分情報のうち、パリティセグメント3aに対応した差分ビットを“1”に更新する。
この後、ノード4が障害から回復したとする。この場合、回復したノード4について差分リビルドが行われる。
まず、ノード4が、差分情報5-4のうちのパリティ部差分情報を復元する。具体的には、ノード4は、ノード4のパリティセグメント毎に、当該パリティセグメントを含んだストライプにおける全ユーザセグメントの差分ビットのORを、当該パリティセグメントに対応した差分ビットとする。このため、パリティセグメント4a及び4bの各々について、下記の通りとなる。
・パリティセグメント4aに対応した差分ビットは“1”となる。なぜなら、パリティセグメント4aを含んだストライプaにおけるユーザセグメント1a及び2aのうち、ユーザセグメント1aに対応した差分ビットが“1”であるためである。
・パリティセグメント4bに対応した差分ビットは“0”となる。なぜなら、パリティセグメント4bを含んだストライプbにおけるユーザセグメント2b及び2cbのうち、いずれのユーザセグメントに対応した差分ビットも“0”であるためである。
このように、本実施形態によれば、パリティセグメントの差分ビットは、当該パリティセグメントを含んだストライプにおける全ユーザセグメントの差分ビットのORである。このため、パリティセグメントを含んだストライプにおけるユーザセグメント毎に差分ビットの複製(冗長化された差分ビット)を、当該パリティセグメントを有するノードのメモリで保持する必要は無い。このため、メモリ使用量が削減される。また、本実施形態によれば、冗長度kが適用されn台のノード210に基づくストライプに関し、いずれかのノード210が障害ノードとなった場合、ノード210の数は、n´(=n-1)となるが、当該ストライプのユーザセグメントに関する差分ビットは、(n´-1)台のノード210で保持されればよい。図1が示す例によれば、ユーザセグメント1aに関する差分ビットは、三台のノード1~3において(n´=3)、二台のノード1及び3に存在すればよい(ノード3では、ユーザセグメント1aに関する差分ビットは、ユーザセグメント1a及び1bの差分ビットのOR)。このため、ストレージシステム全体として、メモリ使用量が削減される。
差分情報5-4のパリティ部差分情報が復元された後、ノード4は、ノード4が有する複数のパリティセグメントのうち、差分ビットが“1”のパリティセグメントについてのみ、パリティを復元する(言い換えれば、差分ビットが“0”のパリティセグメントについては、復元はスキップされる)。例えば、ノード4は、ユーザセグメント1a及び2aからユーザデータセットA´及びBを読み出し、ユーザデータセットA´及びBを用いてパリティQA’Bを生成し、パリティQA’Bをセグメント4aに格納する。
なお、回復ノード4の各ユーザセグメントについては、当該ユーザセグメントを含むセグメントのいずれかのパリティセグメントに対応した差分ビットが“1”の場合、当該ユーザセグメントのユーザデータセットが実際には更新が無くても、当該ユーザセグメントに対応した差分ビットは“1”とされる。なぜなら、パリティセグメントが更新されたということは、同ストライプ内の全ユーザセグメントが更新された可能性があるためである。例えば、ノード4が障害である間に、ユーザセグメント3cのユーザデータセットEが更新されたためにパリティセグメント1c及び2cの各々について差分ビットが“1”とされたとする。ノード4が回復した場合には、パリティセグメント1c及び2cの差分ビットが“1”のため、ノード4は、差分情報5-4のユーザ部差分情報のうち、ユーザセグメント2cに対応した差分ビットを“1”とし、差分ビット“1”に対応したユーザセグメント2cからユーザデータセットFを復元する(読み出す)。
また、回復ノード4において復元されたデータセット(ユーザデータセット又はパリティ)の復元先は、復元前のデータセットが格納されているセグメント(記憶領域の一例)に限らず、回復ノード4(又は別ノード)における別セグメントでもよい。
図2は、ストレージシステム101の物理構成の一例を示す。
ストレージシステム101には、1以上のサイト201が設けられてもよい。各サイト201は、ネットワーク202を介して通信可能に接続される。ネットワーク202は、例えば、WAN(Wide Area Network)であるが、WANに限定するものではない。
サイト201は、データセンタ等であり、1以上のノード210を含んで構成される。
ノード210は、一般的なサーバ計算機の構成を備えてよい。ノード210は、例えば、1以上のプロセッサパッケージ213、1以上のドライブ214、1以上のポート215を含んで構成される。各構成要素は、内部バス216を介して接続されている。プロセッサパッケージ213は、プロセッサ211及びメモリ212等を含む。1以上のドライブ214は、永続記憶装置の一例である。1以上のポート215は、インターフェース装置の一例である。
プロセッサ211は、例えば、CPUであり、各種の処理を行う。
メモリ212は、ノード210の機能を実現する上で必要な制御用の情報を格納したり、データを格納したりする。また、メモリ212は、例えば、プロセッサ211により実行されるプログラムを格納する。メモリ212は、揮発性のDRAM(Dynamic Random Access Memory)であってもよいし、不揮発のSCMであってもよいし、その他の記憶デバイスであってもよい。
ドライブ214は、各種のデータ、プログラム等を記憶する。ドライブ214は、SAS(Serial Attached SCSI)又はSATA(Serial Advanced Technology Attachment)接続のHDDやSSD、NVMe接続のSSDの他、SCM等であってもよく、記憶デバイスの一例である。
ポート215は、ネットワーク220に接続され、サイト201内の他のノード210と通信可能に接続されている。ネットワーク220は、例えば、LAN(Local Area Network)であるが、LANに限定するものではない。
ストレージシステム101に係る物理構成は、上述の内容に限定されるものではない。例えば、ネットワーク202,220については、冗長化されていてもよい。また、例えば、ネットワーク220は、管理用のネットワークとストレージ用のネットワークとで分離してもよく、接続規格は、Ethernet(登録商標)、Infiniband、無線でもよく、接続トポロジも図2に示す構成に限定しない。
図3は、ストレージシステム101の論理構成の一例を示す。
ノード210は、ストレージプログラム360を備える。ストレージプログラム360は、パリティグループ310を構成する。
パリティグループ310は、冗長構成領域の一例である。パリティグループ310は、複数台のノード210のドライブ214に基づく物理チャンク311から構成される。パリティグループ310は、データをノード210間に跨り保護するグループであり、例えば、データ保護ポリシが2D1Pである場合、異なるノード210のドライブ214から確保した3つの物理チャンク311でパリティグループ310が構成される。データ保護ポリシとしては、二重化、EC(Erasure Coding)、MEC(Multi-stage Erasure Coding)等がある。
物理チャンク311は、ドライブ214が備える物理領域のうちの全部又は一部の領域であり、連続した領域である。物理チャンク311は、ユーザデータセットを記憶する物理領域(データ領域)と、パリティを記憶する物理領域(パリティ領域)とを含んで構成される。パリティは、ユーザデータセットを障害から復元するための冗長符号である。データ領域は、一つ以上のユーザセグメントで構成されてよい。パリティ領域は、一つ以上のパリティセグメントで構成されてよい。パリティグループ310において、ノード210毎に、当該ノード210が提供する一つ以上の物理チャンクが、ノード領域の一例である。
図3が示す例によれば、ユーザデータセット313-1及び313-2とパリティ313-3とが1つのストライプに格納される。ユーザデータセット313-1は、ホスト350のアプリケーション351(App B)が格納したデータを含む。ユーザデータセット313-2は、ホスト350のアプリケーション351(App C)が格納したデータを含む。
また、図3が示す例によれば、ホスト350のアプリケーション351(App A)から、障害が発生したノード0のユーザデータのリードが要求された場合、当該ユーザデータがあるストライプにおけるユーザデータセット312-1及びパリティ312-2からユーザデータセット361が復元され、復元されたユーザデータセット361に基づくユーザデータが、当該アプリケーション351に応答される。復元されたユーザデータセット361は、リビルドされたデータとして、ノード0の物理チャンク311に格納される。これにより、障害が発生したノード0のデータの2回目以降の読み込みオーバヘッドが削減され、スループットとレスポンスの向上が期待される。
パリティグループ310からは、論理チャンク321が切り出される。論理チャンク321は、各ノード210のストレージプール320に容量を割り当てる単位であり、一つ以上の物理チャンクのうちのデータ領域に対応する領域である。1つのパリティグループ310から1つの論理チャンク321が切り出されてもよいし、複数の論理チャンク321が切り出されてよい。
また、ストレージプログラム360は、ストレージプール320を構成する。ストレージプール320は、複数の論理チャンク321を含んで構成され、ストレージシステム101全体の容量を仮想化する。ストレージプログラム360は、アプリケーション351により利用される仮想ボリューム330をホスト350に提供する。仮想ボリューム330は、ボリューム(特に、ホスト350のような上位システムに提供されるオンラインボリューム)の一例である。仮想ボリューム330は、ストレージプール320に関連付けられる。このように、ストレージプログラム360は、利用者の要求に応じた容量を、ドライブ214に割り当てず、仮想ボリューム330として割り当てる。二台以上のノード210における二つ以上の仮想ボリューム330が同一のホスト350(同一のアプリケーション351)に提供されてよい。
例えば、ストレージプログラム360は、アプリケーション351からライト要求を受信した場合、当該ライト要求で指定されている領域を含むページ331にページ332が割り当てられていない場合、ストレージプール320からページ322を割り当てる。ページ322は、ストレージプール320の単位領域である。ページ322が、動的に、仮想ボリューム330に割り当てられる。つまり、本実施形態では、Thin Provisioningが採用される。ページ322は、物理チャンク311における領域が対応する。ページ322に入出力されるデータは、物理チャンク311に入出力される。なお、ライト要求のデータ(又は後述の中間データ)は、データの冗長化に係る他のノード210に転送されてパリティが更新される。
このように、ストレージプログラム360は、ドライブ214を共有のストレージプール320として管理し、仮想ボリューム330に書き込まれたデータ量に応じてドライブ214から容量を割り当てる。これにより、使用されないドライブ214の無駄をなくし、効率的な運用が行われる。
なお、データにアクセスするアプリケーション351は、ホスト350に設けられて動作するものであってもよいし、ストレージプログラム360と同一ノード210に設けられて動作するものであってもよいし、別のノード210に設けられて動作するものであってもよい。また、図3が示す例によれば、リビルド先は、障害が発生したノード210内であるが、それに代えて、障害が発生したノード210外(例えば生存ノード)でも構わない。
図4は、メモリ212内の情報(ドライブ214からメモリ212に読み出される情報)の一例を示す。なお、制御情報テーブル410、各種のプログラム(ストレージプログラム360等)は、実行中はメモリ212上に展開されるが、停電等に備えてドライブ214等の不揮発な領域に格納されている。
制御情報テーブル410には、クラスタ管理テーブル411、ストレージプール管理テーブル412、パリティグループ管理テーブル413及び差分情報管理テーブル414が含まれる。各テーブルについては、後述する。
ストレージプログラム360は、リード処理プログラム421、ライト処理プログラム422、コレクション処理プログラム423及びリビルド処理プログラム424を備える。ノード210の機能(リード処理プログラム421、ライト処理プログラム422、コレクション処理プログラム423及びリビルド処理プログラム424等)は、例えば、プロセッサ211がドライブ214に格納されたプログラムをメモリ212に読み出して実行すること(ソフトウェア)により実現されてもよいし、専用の回路等のハードウェアにより実現されてもよいし、ソフトウェアとハードウェアとが組み合わされて実現されてもよい。また、ノード210の機能の一部は、ノード210と通信可能な他のコンピュータにより実現されてもよい。
図5は、クラスタ管理テーブル411の一例を示す。
クラスタ管理テーブル411は、サイト201、ノード210及びドライブ214の構成を管理するための情報を格納する。
クラスタ管理テーブル411は、サイト構成管理テーブル510、ノード構成管理テーブル520及びドライブ構成管理テーブル530を含んで構成される。なお、ストレージシステム101は、サイト構成管理テーブル510を管理し、サイト201は、サイト201内の複数台のノード構成管理テーブル520を管理し、ノード210は、ノード210内の複数のドライブ構成管理テーブル530を管理する。
サイト構成管理テーブル510は、サイト201に係る構成(サイト201とノード210との関係等)を示す情報を格納する。より具体的には、サイト構成管理テーブル510は、サイト番号511と、状態512と、ノード番号リスト513とが対応付けられた情報を格納する。
サイト番号511は、サイト201を識別可能な識別情報である。状態512は、サイト201の状態を示す状態情報(Normal、Warning、Failure等)である。ノード番号リスト513は、サイト201に設けられるノード210を識別可能な識別情報である。
ノード構成管理テーブル520は、サイト201ごとに設けられ、サイト201に設けられるノード210に係る構成(ノード210とドライブ214との関係等)を示す情報を格納する。より具体的には、ノード構成管理テーブル520は、ノード番号521と、状態522と、ドライブ番号リスト523とが対応付けられた情報を格納する。
ノード番号521は、ノード210を識別可能な識別情報である。状態522は、ノード210の状態を示す状態情報(Normal、Warning、Failure等)である。ドライブ番号リスト523は、ノード210に設けられるドライブ214を識別可能な識別情報である。
ドライブ構成管理テーブル530は、ノード210ごとに設けられ、ノード210に設けられるドライブ214に係る構成を示す情報を格納する。より具体的には、ドライブ構成管理テーブル530は、ドライブ番号531と、状態532と、サイズ533(ブロック)とが対応付けられた情報を格納する。
ドライブ番号531は、ドライブ214を識別可能な識別情報である。状態532は、ドライブ214の状態を示す状態情報(Normal、Warning、Failure等)である。サイズ533は、ドライブ214の容量を示す情報(例えば、ブロックの数)である。例えば、ブロックは、固定サイズ(512byte等)である。
図6は、ストレージプール管理テーブル412の一例を示す。
ストレージプール管理テーブル412は、ストレージプール320が提供するシンプロビジョニング機能のための制御情報を格納する。
ストレージプール管理テーブル412は、ストレージプール情報テーブル610、仮想ボリューム管理テーブル620、及びページマッピングテーブル630を含んで構成される。
ストレージプール情報テーブル610は、ストレージプール320に係る情報を格納する。より具体的には、ストレージプール情報テーブル610は、ストレージプール番号611と、総容量612(ブロック)と、消費容量613(ブロック)とが対応付けられた情報を格納する。
ストレージプール番号611は、ストレージプール320を識別可能な識別情報である。総容量612は、ストレージプール320の総容量を示す情報(例えば、ブロックの数)である。消費容量613は、ストレージプール320で消費されている容量を示す情報(例えば、ブロックの数)である。
仮想ボリューム管理テーブル620は、仮想ボリューム330に係る情報(仮想ボリューム330と仮想ボリューム330を割り当てたストレージプール320との対応関係を示す情報等)を格納する。より具体的には、仮想ボリューム管理テーブル620は、仮想ボリューム番号621、サイズ622(ブロック)、及びストレージプール番号623が対応付けられた情報を格納する。
仮想ボリューム番号621は、仮想ボリューム330を識別可能な識別情報である。サイズ622(ブロック)は、仮想ボリューム330の容量を示す情報(例えば、ブロックの数)である。ストレージプール番号623は、仮想ボリューム330が属するストレージプール320を識別可能な識別情報である。
ページマッピングテーブル630は、仮想ボリューム330に割り当てたページ331に係る情報(ページ331と論理チャンク321との対応関係を示す情報等)を格納する。より具体的には、ページマッピングテーブル630は、ページ番号631、仮想ボリューム番号632、LBA(Logical Block Address)633、サイズ634(ブロック)、論理チャンク番号635、及びLBA636が対応付けられた情報を格納する。
ページ番号631は、ページ331を識別可能な識別情報である。仮想ボリューム番号632は、ページ331が割り当てられている仮想ボリューム330を識別可能な識別情報である。LBA633は、仮想ボリューム330におけるページ331の位置を特定可能な情報であり、例えば、仮想ボリューム330の最初のページ331から何番目であるかを示す情報である。なお、ページ331は、ストレージプログラム360が仮想ボリューム330にアクセスする単位である。サイズ634(ブロック)は、ページ331の容量を示す情報(ブロックの数)である。論理チャンク番号635は、ページ331に対応する論理チャンク321を識別可能な識別情報である。LBA636は、ストレージプール320における論理チャンク321の位置を特定可能な情報であり、例えば、ストレージプール320の最初の論理チャンク321から何番目であるかを示す情報である。
なお、サイズ634は、全てのページ331で同じであってもよいし、ページ331ごとに異なっていてもよい。
付言するならば、ストレージプログラム360は、仮想ボリューム330のアドレスからストレージプール320のアドレスへの変換を行う際にページマッピングテーブル630を参照する。また、ストレージプログラム360は、新規ライトを受領する度に、ページ331の割当て(ページマッピングテーブル630へのレコードの追加)を行う。
図7は、パリティグループ管理テーブル413の一例を示す。
パリティグループ管理テーブル413は、物理チャンク311と複数の物理チャンク311を組み合わせて構成したパリティグループ310(冗長化グループ)の構成を管理するための制御情報を格納する。
パリティグループ管理テーブル413は、論理チャンク管理テーブル710、パリティグループ管理テーブル720、及び物理チャンク管理テーブル730を含んで構成される。
論理チャンク管理テーブル710は、パリティグループ310から切り出された論理チャンク321に係る情報(論理チャンク情報)を格納する。より具体的には、論理チャンク管理テーブル710は、論理チャンク番号711と、サイズ712(ブロック)と、パリティグループ番号713とが対応付けられた情報を格納する。
論理チャンク番号711は、パリティグループ310から切り出された論理チャンク321を識別可能な識別情報である。サイズ712は、論理チャンク321の容量を示す情報(例えば、ブロックの数)である。パリティグループ番号713は、論理チャンク321が属するパリティグループ310を識別可能な識別情報である。
パリティグループ管理テーブル720は、パリティグループ310に係る情報(パリティグループ情報)を格納する。より具体的には、パリティグループ管理テーブル720は、パリティグループ番号721と、データ保護設定722と、物理チャンク番号723とが対応付けられた情報を格納する。
パリティグループ番号721は、パリティグループ310を識別可能な識別情報である。データ保護設定722は、パリティグループ310のデータ保護設定である。物理チャンク番号723は、パリティグループ310に割り当てられた物理チャンク311を識別可能な識別情報である。
物理チャンク管理テーブル730は、物理チャンク311に係る情報(開始オフセットからサイズ分だけドライブ214の物理領域を切り出して物理チャンク311として管理するための情報)を格納する。より具体的には、物理チャンク管理テーブル730は、物理チャンク番号731と、開始オフセット732と、サイズ733(ブロック)と、サイト番号/ノード番号/ドライブ番号734とが対応付けられた情報を格納する。
物理チャンク番号731は、物理チャンク311を識別可能な識別情報である。開始オフセット732は、ドライブ214から物理チャンク311を切り出すときの開始位置を示す情報である。サイズ733(ブロック)は、物理チャンク311の容量を示す情報(ブロックの数)である。サイト番号/ノード番号/ドライブ番号734は、物理チャンク311が切り出されている記憶資源を識別可能な識別情報(物理チャンク311がどのサイト201のどのノード210のどのドライブ214から切り出されているかを示す情報)である。
図8は、差分情報管理テーブル414の一例を示す。
差分情報管理テーブル414は、差分情報を管理するためのテーブルである。差分情報管理テーブル414は、物理チャンク番号801と、ユーザ部差分情報802と、パリティ部差分情報803とが対応付けられた情報を格納する。
物理チャンク番号801は、物理チャンク311を識別可能な識別情報である。ユーザ部差分情報802は、物理チャンク311におけるセグメント毎に当該セグメントが差分セグメントか否かを表す情報である。パリティ部差分情報803は、物理チャンク311のうちパリティセグメント毎に当該パリティセグメントが差分セグメントか否かを表す情報)である。
本実施形態では、物理チャンク311単位で差分情報が記録される、論理チャンク321又は仮想ボリュームの領域に紐づけて差分情報が記録されてもよい。差分情報では、単位サイズ(例えば32KB)の領域毎に差分ビットが含まれる。単位サイズの領域は、本実施形態ではセグメントである。セグメント毎に、差分ビットは、差分有(“1”)か否か(“0”)か、すなわち、当該セグメントが差分セグメントか否かを表す。
ノード210の物理チャンク311毎に、ユーザ部差分情報802におけるセグメント毎の差分ビットと、パリティ部差分情報803におけるパリティセグメント毎の差分ビットは、下記の通りである。
・ユーザ部差分情報802における差分ビットは、当該ノード210によりセグメントが更新されたか否かを表す。セグメントは、ユーザセグメントでもよいしパリティセグメントでもよい。
・パリティ部差分情報803における差分ビットは、二台以上の別ノード210からの差分ビット(ユーザ部差分情報802の差分ビット)のOR演算結果としての情報である。具体的には、パリティ部差分情報803において、差分ビットは、当該差分ビットに対応したパリティセグメントを含むストライプのうちの二つ以上のユーザセグメントを有する二台以上の別ノードからの差分ビットのOR演算の結果である。
以下、本実施形態で行われる処理の例を説明する。なお、以下の説明において、I/O(Input/Output)要求は、ライト要求又はリード要求である。I/O要求は、ホスト350(又は他種のI/O(Input/Output)要求ソース)から発行される。I/O要求では、I/O先(例えば、LUN(Logical Unit Number)のような仮想ボリューム番号、LBAのようなアドレス等)が指定されている。仮想ボリューム330単位で(又は仮想ボリューム330における領域単位で)、当該仮想ボリューム330(又は当該仮想ボリューム330における領域)のオーナ権を持つノードを表すオーナ権管理テーブルが存在してもよい。オーナ権管理テーブルは、各ノード210が保持してよい。I/O要求で指定されている領域のオーナ権を持つノードが、当該I/O要求を受けたノード210であれば、当該ノード210が、当該I/O要求を処理してよい。一方、I/O要求で指定されている領域のオーナ権を持つノードが、当該I/O要求を受けたノード210で無い場合、当該ノード210は、オーナ権管理テーブルを基に、当該領域のオーナ権を持つノード210に、当該I/O要求を転送してよい。オーナ権は、仮想ボリューム330に代えて又は加えて、ストライプ等の他のサイズの領域毎に設けられてもよい。オーナ権は、アクセス権と言い換えられてもよい。
図9は、リード処理プログラム421が行うリード処理のフローを示す。
リード処理プログラム421は、受信したリード要求で指定されているアクセス先LBAを参照し(S901)、ストレージプール管理テーブル412を基に、アクセス先LBAが属する領域(仮想ボリューム330における領域)にページ322が未割当か否かを判定する(S902)。S902の判定結果が真の場合(S902:Yes)、リード処理プログラム421は、ページ322が未割当であることを示す応答データ(例えば、全ビットの値が“0”のデータ)を生成し(S908)、当該応答データを、リード要求の送信元(例えばホスト350)に返却する(S909)。
S902の判定結果が偽の場合(S902:No)、リード処理プログラム421は、アクセス先LBAが属する領域に割り当てられているページ322における割当先アドレス(アクセス先LBAに対応したアドレス)をストレージプール管理テーブル412から取得する(S903)。リード処理プログラム421は、取得した割当先アドレスの排他を取得する(S904)。
リード処理プログラム421は、ストレージプール管理テーブル412及びクラスタ管理テーブル411を基に、取得した割当先アドレスが正常状態(“Normal”)か否かを判定する(S905)。S905の判定結果が真の場合(S905:Yes)、リード処理プログラム421は、自ノード(当該リード処理プログラム421を有するノード)のドライブ214からリード対象のデータを読み出し(S906)、S904で取得した排他を解放し(S907)、当該リード対象のデータを含む応答データを、リード要求の送信元(例えばホスト350)に返却する(S909)。S906では、アクセス先LBAに対応した領域であって自ノードの物理チャンク311における領域からデータが読み出される。
S905の判定結果が偽の場合(S905:No)、リード処理プログラム421は、差分情報管理テーブル414を基に、アクセス先LBAに対応した物理領域(物理チャンク311における領域)の差分ビット(ユーザ部差分情報802における差分ビット)が有効(“1”)か否か、つまり、当該物理領域が差分セグメントであるか否かを判定する(S910)。S910の判定結果が偽の場合(S910:No)、すなわち、割当先アドレスが正常状態ではないが、アクセス先LBAに対応した物理領域が差分セグメントではない場合、アクセス先LBAに対応した物理領域の基になっているドライブ214は、リビルド中の状態ではあるが、アクセス先LBAに対応した物理領域のデータについてはリビルド済である。このため、S906が行われる。
S910の判定結果が真の場合(S910:Yes)、リード処理プログラム421は、コレクション処理プログラム423に、コレクション処理(S911)の実行指示を出し、その後、S907及びS909を実行する。当該実行指示では、アクセス先LBAに対応した物理領域(つまり、どの物理領域についてコレクション処理を行うか)が指定されてよい。
図10は、コレクション処理プログラム423が行うコレクション処理のフローを示す。コレクション処理の実行指示に応答して、コレクション処理が行われる。当該実行指示には、物理領域(つまり、どの物理領域についてコレクション処理を行うか)が指定されているものとする。
コレクション処理プログラム423は、パリティグループ管理テーブル413を基に、対象物理領域(コレクション処理対象の物理領域)を含んだ物理チャンク311を有するパリティグループ310を特定する。コレクション処理プログラム423は、差分情報管理テーブル414を基に、対象物理領域における差分セグメント毎に、障害データセット(当該差分セグメントにおけるデータセット(ユーザデータセット又はパリティ))の復元に必要な全データセットを、特定されたパリティグループ310のうち、対象物理領域を含んだ物理チャンク311以外の物理チャンク311(つまり一台以上の別ノード210)から読み出す(S1001)。I/O範囲サイズ(入出力の単位サイズの一例)がセグメント(差分ビットに対応した単位領域の一例)と一致している場合、コレクション処理プログラム423は、対象物理領域における差分セグメント毎に、読み出されたデータセットを用いて、障害データセットを当該差分セグメントに復元し、当該差分セグメントに対応した差分ビットをクリアする(S1002)。差分ビットのクリアは、差分ビットを“1”から“0”に更新することである。
図11は、ライト処理プログラム422が行うライト処理のフローを示す。
ライト処理プログラム422は、受信したライト要求で指定されているアクセス先LBAを参照し(S1101)、ストレージプール管理テーブル412を基に、アクセス先LBAが属する領域(仮想ボリューム330における領域)にページ322が未割当か否かを判定する(S1102)。S1102の判定結果が真の場合(S1102:Yes)、ライト処理プログラム422は、空きページ322(いずれの仮想ボリューム330にも割り当てられていない割当て可能状態のページ322)をストレージプール管理テーブル412から特定し、特定したページ322を、アクセス先LBAが属する領域(仮想ボリューム330における領域)に割り当てる(S1103)。
S1102の判定結果が偽の場合(S1102:No)、又は、S1103の後、ライト処理プログラム422は、アクセス先LBAが属する領域に割り当てられているページ322における割当先アドレス(アクセス先LBAに対応したアドレス)をストレージプール管理テーブル412から取得する(S1104)。ライト処理プログラム422は、取得した割当先アドレスの排他を取得する(S1105)。
ライト処理プログラム422は、ストレージプール管理テーブル412及びクラスタ管理テーブル411を基に、取得した割当先アドレスが正常状態(“Normal”)か否かを判定する(S1106)。S1106の判定結果が真の場合(S1106:Yes)、ライト処理プログラム422は、自ノード(当該ライト処理プログラム422を有するノード)のドライブ214から旧ユーザデータセット(更新前ユーザデータセット)を読み出し(S1108)、読み出した旧ユーザデータセットを用いて中間ユーザデータセットを生成する(S1110)。「中間ユーザデータセット」は、ユーザデータセットを部分的に更新するときに作成する一時的なユーザデータセットであり、新旧の差分を示すユーザデータセットである。例えば、ストライプに、旧ユーザデータセットA1及びA2と旧パリティAPとが格納されている場合、中間ユーザデータセットは、次のように生成される。
・AP(旧パリティ)=A1(旧ユーザデータセット) XOR A2(旧ユーザデータセット)
・A1(新ユーザデータセット) XOR A1(旧ユーザデータセット)=M(中間データセット)
なお、新パリティについては、次のように求められる。
・AP(旧パリティ) XOR M(中間データセット)=AP(新パリティ)
S1106の判定結果が偽の場合(S1106:No)、ライト処理プログラム422は、差分情報管理テーブル414を基に、アクセス先LBAに対応した物理領域(物理チャンク311における領域)の差分ビット(ユーザ部差分情報802における差分ビット)が有効(“1”)か否か、つまり、当該物理領域が差分セグメントであるか否かを判定する(S1107)。S1107の判定結果が偽の場合(S1107:No)、すなわち、割当先アドレスが正常状態ではないが、アクセス先LBAに対応した物理領域が差分セグメントではない場合、アクセス先LBAに対応した物理領域の基になっているドライブ214は、リビルド中の状態ではあるが、アクセス先LBAに対応した物理領域のデータについてはリビルド済である。このため、S1108が行われる。
S1107の判定結果が真の場合(S1107:Yes)、ライト処理プログラム422は、コレクション処理プログラム423に、コレクション処理(S1109)の実行指示を出し、その後、S1110を実行する。当該実行指示では、アクセス先LBAに対応した物理領域(つまり、どの物理領域についてコレクション処理を行うか)が指定されてよい。コレクション処理の詳細は、図10を参照して説明した通りである。
S1110の後、ライト処理プログラム422は、アクセス先LBAに対応した物理領域におけるセグメントを含むストライプについて、パリティ格納ノード210(パリティセグメントを有するノード210)に、当該パリティセグメントにおけるパリティの更新要求を送信する(S1111)。ライト処理プログラム422は、新データセットを、自ノードの物理チャンク311(ドライブ214)に書き込む(S1112)。
S1111では、ストライプに複数のパリティセグメントがあれば、複数のパリティ格納ノードの各々に更新要求が送信される。更新要求では、パリティセグメントのアドレスが指定されてよい。また、更新要求は、パリティ更新に必要なデータセット(例えば、パリティセグメントを含むストライプに対応した中間データセット)と、パリティセグメントを含むストライプのうち自ノードのユーザセグメントを含む物理チャンク311に対応したユーザ部差分情報802の少なくとも一部(例えば、当該パリティセグメントを含むストライプのうち自ノードのユーザセグメントに対応した差分ビット)とを含む。
S1111で送信された更新要求に応答して、パリティ格納ノード210により、パリティ格納処理(S1120)が行われる。ライト処理プログラム422は、パリティ格納ノード210から、S1111で送信した更新要求に対する応答を受信する(S1113)。ライト処理プログラム422は、当該応答が、更新失敗を表すか否かを判定する(S1114)。
S1114の判定結果が真の場合(S1114:Yes)、ライト処理プログラム422は、アクセス先LBAに対応した物理領域(物理チャンク311における領域)の差分ビットが有効(“1”)とする(S1115)。これにより、差分情報管理テーブル414が更新される。ライト処理プログラム422は、差分情報管理テーブル414を直ちに(又は、ストレージシステム又は自ノードの計画停止時に(例えば、ユーザ操作による停止時に))メモリからドライブ214に書き込んでよい。これにより、停電等により差分情報管理テーブル414がメモリから消失しても差分情報管理テーブル414を復元できる。
S1114の判定結果が偽の場合(S1114:No)、又は、S1115の後、ライト処理プログラム422は、アクセス先LBAに対応した物理領域におけるセグメントを含むストライプについて、パリティ格納ノード210(パリティセグメントを有するノード210)に、最終更新結果を通知する(S1116)。最終更新結果の通知は、ストライプについて全てのデータセットの更新に成功したか否かを表す通知を含む。一つのデータセットについても更新が失敗であれば、最終更新結果の通知は、失敗を表す。S1116で送信された通知に応答して、パリティ格納ノード210により、最終更新結果処理(S1130)が行われる。
S1116の後、ライト処理プログラム422は、S1105で取得した排他を解放し(S1117)、ライト要求に対する応答を、当該ライト要求の送信元(例えばホスト350)に返却する(S1118)。
図12は、パリティ格納ノード210におけるライト処理プログラム422が行うパリティ格納処理のフローを示す。
ライト処理プログラム422は、パリティ更新要求を受信する(S1201)。ライト処理プログラム422は、受信したパリティ更新要求で指定されているアドレス(パリティセグメントのアドレス)について排他を取得する(S1202)。
ライト処理プログラム422は、ストレージプール管理テーブル412及びクラスタ管理テーブル411を基に、パリティセグメントのアドレスが正常状態(“Normal”)か否かを判定する(S1203)。S1203の判定結果が真の場合(S1203:Yes)、ライト処理プログラム422は、パリティセグメント(パリティ格納ノード210のドライブ214)から旧パリティを読み出し(S1206)、読み出した旧パリティと上記更新要求から取得される中間データセットとを用いて新パリティを生成し(S1207)、生成した新パリティをパリティセグメントに書き込む(S1208)。
ライト処理プログラム422は、パリティの更新(例えばS1208)に失敗した場合、パリティ更新先のパリティセグメントに対応した差分ビット(ユーザ部差分情報802における差分ビット)を有効(“1”)とする(S1210)。また、ライト処理プログラム422は、パリティ更新先のパリティセグメントを含むストライプにおける各ユーザセグメントに対応した差分ビット(ユーザ部差分情報802における差分ビットであり別ノード210からの差分ビット)のOR演算を行い、OR演算結果として、パリティ更新先のパリティセグメントに対応した差分ビット(パリティ部差分情報803における差分ビット)を格納する(S1211)。なお、ライト処理プログラム422は、差分情報管理テーブル414を、S1210及びS1211の少なくとも一つを行ったら直ちに(又は、ストレージシステム又は自ノードの計画停止時に(例えば、ユーザ操作による停止時に))メモリからドライブ214に書き込んでよい。これにより、停電等により差分情報管理テーブル414がメモリから消失しても差分情報管理テーブル414を復元できる。
S1203の判定結果が偽の場合(S1203:No)、ライト処理プログラム422は、差分情報管理テーブル414を基に、パリティ更新先のパリティセグメントの差分ビット(ユーザ部差分情報802における差分ビット)が有効(“1”)か否かを判定する(S1204)。S1204の判定結果が偽の場合(S1204:No)、すなわち、パリティ更新先のパリティセグメントが正常状態ではないが、当該パリティセグメントが差分セグメントではない場合、当該パリティセグメントの基になっているドライブ214は、リビルド中の状態ではあるが、当該パリティセグメントのパリティについてはリビルド済である。このため、S1206が行われる。
S1204の判定結果が真の場合(S1204:Yes)、ライト処理プログラム422は、S1201で受信したパリティ更新要求に対する応答に更新失敗を設定する(S1205)。
S1211又はS1205の後、ライト処理プログラム422は、S1202で取得した排他を解放し(S1212)、パリティ更新要求に対する応答を、当該更新要求の送信元(つまり別ノード210)に返却する(S1213)。
図13は、パリティ格納ノード210におけるライト処理プログラム422が行う最終更新結果処理のフローを示す。
ライト処理プログラム422は、最終更新結果の通知の受信に失敗した場合(S1301:No)、パリティ更新先のパリティセグメントの差分ビット(ユーザ部差分情報802における差分ビット)を有効(“1”)とする(S1303)。
ライト処理プログラム422は、最終更新結果の通知の受信に成功したが(S1301:Yes)、当該通知が失敗を表している場合(S1302:Yes)、パリティ更新先のパリティセグメントの差分ビット(ユーザ部差分情報802における差分ビット)を有効(“1”)とする(S1303)。ライト処理プログラム422は、最終更新結果の通知の受信に成功し(S1301:Yes)、当該通知が成功を表している場合(S1302:No)、S1303を行うことなく処理を終える。
図14は、リビルド処理プログラム424が行うリビルド処理のフローを示す。
リビルド処理プログラム424は、例えば、自ノード(当該リビルド処理プログラム424を有するノード)が障害から回復した場合に起動してよい。リビルド処理プログラム424は、自ノードのセグメント毎に、差分ビットが有効なセグメントのデータセットを復元し、リビルド先セグメントに書き込む。差分ビットが有効なセグメントを含むストライプ全体の状態が正常状態になった場合、リビルド処理プログラム424は、有効な差分ビットをクリア(無効化)する。具体的には、リビルド処理は、以下の通りである。
リビルド処理プログラム424は、全ての別ノードへ差分情報の取得要求を送信する(S1401)。取得要求では、差分情報の取得範囲(例えば、自ノードのリビルド対象領域に属する少なくとも一つの物理チャンク311の少なくとも一部の範囲)が指定されてよい。一つの別ノードを例に取る。別ノードにおけるリビルド処理プログラム424は、当該取得要求を受信し(S1415)、指定された範囲のユーザ部差分情報802を取得して応答に設定し(S1416)、当該応答を返却する(S1417)。
自ノードのリビルド処理プログラム424は、S1401での全ての送信先から応答を受信し(S1402)、リビルド対象領域の差分情報(例えば、リビルド対象領域に属する物理チャンク311のパリティ部差分情報803)を生成する(S1403)。
リビルド処理プログラム424は、リビルド対象領域から、このリビルド処理において未選択の物理チャンク311を一つ選択する(S1404)。リビルド処理プログラム424は、S1404で選択した物理チャンク311の先頭アドレスを取得する(S1405)。
リビルド処理プログラム424は、S1405(又は後述のS1418)で取得されたアドレスが属するセグメントである対象セグメントに対応した差分ビット(自ノードのユーザ部差分情報802及びパリティ部差分情報803における差分ビット)が有効か否かを判定する(S1406)。
S1406の判定結果が真の場合(S1406:Yes)、リビルド処理プログラム424は、対象セグメントの排他を取得する(S1407)。リビルド処理プログラム424は、コレクション処理プログラム423に、コレクション処理(S1408)の実行指示を出す。当該実行指示では、対象セグメントが指定されてよい。コレクション処理の詳細は、図10を参照して説明した通りである。リビルド処理プログラム424は、コレクション処理(1408)において復元されたデータセットをリビルド先領域へ書き込む(S1409)。
リビルド処理プログラム424は、対象セグメントを含むストライプにおける全セグメントが回復済(“Normal”)か否かを、クラスタ管理テーブル411を基に判定する(S1410)。S1410の判定結果が真の場合(S1410:Yes)、リビルド処理プログラム424は、対象セグメントに対応した差分ビットを無効(“0”)とし(S1411)、S1407で取得した排他を解放する(S1412)。なお、S1410では、リビルド処理プログラム424は、判定対象のストライプにおけるセグメント(部位)毎に、当該セグメントを有するリビルド中の他ノードに、当該セグメントが回復済か否かを問合せる(例えば同期的に問合せる)ことで、当該セグメントが回復済か否か判定してもよい。
S1412の後、S1406の判定結果が偽の場合(S1406:No)、又は、S1410の判定結果が偽の場合(S1410:No)、リビルド処理プログラム424は、パリティグループ管理テーブル413を基に、対象セグメントが、S1404で選択した物理チャンク311の終端のセグメントであるか否かを判定する(S1413)。S1413の判定結果が偽の場合(S1413:No)、リビルド処理プログラム424は、S1404で選択した物理チャンク311から、対象セグメントの次のセグメントのアドレスを取得し(S1418)、S1406の判定を行う。
S1413の判定結果が真の場合(S1413:Yes)、リビルド処理プログラム424は、リビルド対象領域の全チャンクが選択されたか否かを判定する(S1414)。S1414の判定結果が真の場合(S1414:Yes)、リビルド処理が終了する。
S1414の判定結果が偽の場合(S1414:No)、処理がS1404に戻る。
[第2の実施形態]
第2の実施形態を説明する。その際、第1の実施形態との相違点を主に説明し、第1の実施形態との共通点については説明を省略又は簡略する。
ノードvがオーナ権を持つ仮想ボリューム330を指定したライト要求をノード1が受信した場合、ノードvは、ライト要求に付随するユーザデータAを、ノード1のドライブ214に格納する。つまり、ノードvがオーナ権を持つ仮想ボリューム330を指定したI/O要求に従い入出力されるユーザデータはノードvのドライブ214に存在するといういわゆるデータローカリティが維持される。
このようなデータローカリティを維持しつつユーザデータAを冗長化するために、ノードvは、ユーザデータAを、jのユーザデータセットに分割し、(j×k)のデータセットの各々を、異なる別ノード210に転送する。つまり、ノードvから(j×k)台の別ノード210への転送が行われる。別の言い方をすれば、冗長化のためのデータ転送量(転送されるデータセットの数)が、(j×k)である。jは、ユーザデータセットの数であり、2以上の整数である。kは、パリティの数であり、1以上の整数である。例えば、データ保護ポリシが2D2Pの場合、(j×k)=(2×2)=4である。なお、ユーザデータAのサイズが、ユーザデータセットのサイズの整数倍でない場合、ユーザデータAから得られる一部のデータのサイズはユーザデータセットのサイズに満たないが、この場合、そのデータに所定のデータ(例えば全ビット“0”のデータ)が付加されることで、所定サイズのユーザデータセットが得られる。
本実施形態では、データローカリティを維持しつつユーザデータの冗長化のためのデータ転送量を削減することができる。具体的には、データ転送量を、(j+k-1)に削減することができる。例えば、データ保護ポリシが2D2Pの場合、データ転送量は、(j+k-1)=(2+2-1)=3に削減される。
図15は、第2の実施形態に係るノード間転送の概要の一例を示す。
四台のノード(ノード1~4)の各々が、2D2Pでデータを保護するようになっているが、データ転送量は、3で済む。以下、その詳細を説明する。なお、ノード210のメモリ212(図2参照)の一部領域が、キャッシュ領域(又はバッファ領域)といった一時格納領域である。メモリ212が、SSDやNVMeといった高速な不揮発メモリデバイスを含んでもよく、当該高速な不揮発メモリデバイスに基づく領域が、キャッシュ領域(又はバッファ領域)でよい。
ノードv(vは、1~4の任意の整数)のライト処理プログラム422は、受信したライト対象のユーザデータを二つのユーザデータセットdv1及びdv2に分割し、更に、ノード内冗長コードとして、一つのパリティpv1を生成する。パリティpv1は、一次的な冗長コード(Class1 Code)である。
次に、ノードvのライト処理プログラム422は、ユーザデータセットdv1及びdv2をノードvのドライブ214に格納し、ユーザデータセットdv1及びdv2及びパリティpv1を、別ノードのキャッシュ領域に転送する。v=1とした場合、ユーザデータセットd11がノード2に、ユーザデータセットd12がノード3に、パリティp11がノード4にそれぞれ転送される。このように、データ転送量は、3である。なお、この転送が完了した時点で、ノードvのライト処理プログラム422は、ライト要求に対する応答を返却してもよい。それに代えて、ノードvのライト処理プログラム422は、転送されたデータセットがドライブ214に書き込まれた場合に、ライト要求に対する応答を返却してもよい。
ノードvのライト処理プログラム422は、ライト要求の受信から応答返却までの処理とは非同期的に、ノードv以外の三台のノードから集約した三つのデータセット(二つのユーザデータセット及びパリティ)から、二次的な冗長コードであるパリティxv1及びxv2を生成し、ノードvのドライブ214に書き込み、キャッシュ領域(当該三つのデータセットが格納されている領域)を解放する。パリティxv1及びxv2は、二次的な冗長コード(Class2 Code)である。
例えば、ノード3のライト処理プログラム422は、ノード1からのユーザデータセットd12、ノード2からのユーザデータセットd21、及びノード4からのパリティp41から、パリティx31及びx32を生成し、パリティx31及びx32をノード3のドライブ214に書き込み、キャッシュ領域(ユーザデータセットd12及びd21とパリティp41とが格納された領域)を解放する。
図15は、2D2P冗長構成の例を示すが、本例の方法は、任意のjDkP構成に適用できる。すなわち、下記の通りである。
・ノードvのライト処理プログラム422は、ライト対象のユーザデータをノードvのドライブ214に格納すると共に、当該ユーザデータをjのユーザデータセットdv1、…、dvjに分割し、且つ、jのユーザデータセットdv1、…、dvjを基に(k-1)のパリティpv1、…、pv(k-1)を生成し、(j+k-1)のデータセットの各々を、ノードv以外の異なるノードに転送する。つまり、ノードvからノードv以外の(j+k-1)台のノードへの転送がされる。データ転送量は、(j+k-1)である。
・ノードvのライト処理プログラム422は、ノードv以外の(j+k-1)台のノードからの(j+k-1)のデータセット(jのユーザデータセットと(k-1)のパリティ)を基に、kのパリティxv1、…、xvkを生成する。ノードvのライト処理プログラム422は、kのパリティxv1、…、xvkを、ノードvのドライブ214に格納する。
また、図15では、RMW(Read-Modify-Write)で冗長コード(Class2 Code)が更新されてもよい。RMWで冗長コードが更新される場合、下記の通りである。
・ノードvのライト処理プログラム422は、ライト対象のユーザデータの書き込み先データをリードし、ライトデータとのXOR演算を行うことで中間データを生成する。そして、ノードvのライト処理プログラム422は、ライトデータをノードvのドライブ214に格納すると共に、当該中間データをjの中間データセットdv1´、…、dvj´に分割し、且つ、jの中間データセットdv1´、…、dvj´を基に(k-1)の中間パリティpv1、…、pv(k-1)を生成し、(j+k-1)の中間データセットの各々を、ノードv以外の異なるノードに転送する。
・ノードvのライト処理プログラム422は、中間データセットの一部を受信すると、格納されたkのパリティxv1、…、xvkをドライブから読み出し、中間データセットの一部と読み出したkのパリティとでlの新パリティxv1´、…、xvk´を計算し、ノードvのドライブ214に格納する。
図16は、第2の実施形態に係るコレクション処理の概要の一例を示す。
2D2Pにおいて、冗長度2と同数の二台のノード1及び2が故障したとする。この場合、生存ノード3において、故障ノード1のデータローカリティにより存在するユーザデータセットd11及びd12がリビルドされ、生存ノード4において、故障ノード2のデータローカリティにより存在するユーザデータセットd21及びd22がコレクションされる。いずれの故障ノードのデータローカリティにより存在するユーザデータセットが、いずれの生存ノードにおいてコレクションされてもよい。
ノード3及び4のうち、ノード3を例に取り、ユーザデータセットd11及びd12のコレクションを説明する。
まず、ノード3のコレクション処理プログラム423は、パリティx31及びx32(Class2 code)の生成に用いられたパリティp41(Class1 code)を復元する。具体的には、ノード3のリビルド処理プログラム424は、パリティp41の生成に用いられたユーザデータセットd41及びd42を生存ノード4から取得し、当該ユーザデータセットd41及びd42を用いてパリティp41を復元する(パリティp41がノード3のキャッシュ領域に残っていれば、パリティp41の復元はスキップされてよい)。
次に、ノード3のコレクショh処理プログラム423は、パリティx31及びx32(Class2 code)と、パリティp41とを用いて、パリティx31及びx32の生成に用いられたユーザデータセットd12及びd21を復元する。なお、ノード4では、ノード4のコレクション処理プログラム423が、パリティx41及びx42の生成に使用され生存ノード3に存在するデータセットd31をノード3から取得し、パリティx41及びx42とデータセットd31とを用いて、パリティx41及びx42の生成に用いられたユーザデータセットd22及びパリティp11を復元する。
最後に、ノード3のコレクション処理プログラム423は、ノード4において復元されたパリティp11をノード4から取得し、ユーザデータセットd12とパリティ11とを基にユーザデータセットd11を復元する。これにより、ノード3において、ユーザデータセットd11及びd12がリビルドされたことになる。
このように、冗長度kと同数のノードに障害が生じた場合、(n-k)台の生存ノードの各々において、当該生存ノードvのリビルド処理プログラム424が、当該生存ノードvのドライブ214にあるkのパリティxvを読み出す。また、生存ノードvのリビルド処理プログラム424が、kのパリティxvの生成に用いられた(k-1)のデータセット(ユーザデータセット又はパリティ)の各々を、当該データセット(又は当該データセットの生成に用いられたユーザデータセット)を格納する生存ノードから取得することで取得する。生存ノードvのリビルド処理プログラム424が、読み出されたkのパリティxvと、取得された(k-1)のデータセットとを用いて、jのユーザデータセットを復元する。生存ノードvのリビルド処理プログラム424は、復元されたjのユーザデータセットから、対象の障害ノードのユーザデータセット(リビルド対象のユーザデータセット)を取得し、且つ、別の生存ノードから、対象の障害ノードのユーザデータセットを取得する(又は、当該ユーザデータセットの復元に必要なパリティを取得することで、当該ユーザデータセットを取得する)。
このような第2の実施形態では、差分情報は、図17に例示する通りに管理される。ノードvとして、ノード4を例に取る。なお、データ保護ポリシは、2D2P(jDkPの一例)である。
ノード4のドライブ214に基づくセグメント毎に差分ビットを有する差分情報を、ノード4が保持する。ノード4におけるセグメントの更新権は、ノード4が有する。
二つのユーザデータセットd41及びd42の各々について、ユーザセグメントの差分ビットの管理は、第1の実施形態と同じである。
一方、二つのパリティx41及びx42は二つのパリティセグメントに格納されるが、二つのパリティセグメントの各々が差分セグメントであるか否かは、一つの差分ビットで管理される。具体的には、障害ノード1で生成されたパリティp11(Class1 code)を用いてパリティx41及びx42が更新され、パリティp11は、ユーザデータセットd11及びd12を用いて生成される。このため、パリティx41及びx42の差分ビットは、ユーザデータセットd11、d12、d22及びd31の差分ビットのOR演算結果となる。つまり、ユーザデータセットd11、d12、d22及びd31のいずれかが更新されると、パリティx41及びx42のいずれも更新されるため、ユーザデータセットd11、d12、d22及びd31のいずれかの差分ビットが有効となると、パリティx41及びx42に対応した差分ビットも有効となる。
なお、パリティx41及びx42に対応した差分ビットのクリア(無効化)は、ユーザデータセットd11、d12、d22及びd31の全てが回復した場合に行われる。また、第2の実施形態では、データセットd11、d12、d21、d22、d31、d32、d41及びd42が格納されるユーザ領域を含んだ記憶領域グループが、データ保護単位としての記憶領域グループ(例えば、ストライプ)でよい。
以上が、第2の実施形態の説明である。
以下、第1及び第2の実施形態の説明を総括する。総括は、上述の説明の補足説明を含んでもよいし、変形例の説明を含んでもよい。
ストレージシステム101を構成する複数台のノード210の各々が、プロセッサ211、メモリ212及び永続記憶装置(例えば複数のドライブ214)を備える。各ノード210について、当該ノード210の永続記憶装置に基づく記憶領域として、ユーザ領域とパリティ領域の少なくとも一つがある。ユーザ領域は、ユーザデータセットが格納される記憶領域である。パリティ領域は、パリティが格納される記憶領域である。ノード210のパリティ領域に格納されるパリティは、当該ノード210以外の二台以上のノード210の各々からのデータセットを用いて生成される。例えば、第1の実施形態では、ノードvにおいて、パリティは、ノードv以外の二台以上のノード210の各々からのユーザデータセットを用いて生成される。第2の実施形態では、ノードvにおいて、パリティxは、ノードv以外の二台以上のノード210の各々からのデータセット(ユーザデータセット、又は、パリティp)を用いて生成される。
ユーザ領域を有するノード210について、当該ノード210のユーザ領域毎に差分ビット(差分有か否かを表す情報の一例)を含んだユーザ部差分情報802がある。上述の実施形態では、ユーザ部差分情報802(及びパリティ部差分情報803)は、物理チャンク毎に存在するが、物理チャンク以外の単位で存在してもよい。ノード210のユーザ領域毎に、差分ビットは、障害ノードがある間に当該ノード210の当該ユーザ領域のユーザデータセットに更新が生じたことを意味する。
パリティ領域を有するノード210について、当該ノード210のパリティ領域毎に差分ビットを含んだパリティ部差分情報803がある。当該パリティ部差分情報803について、パリティ領域毎に、当該パリティ領域に対応した差分ビットは、当該パリティ領域に格納されているパリティの生成に用いられたいずれかのデータセットの記憶領域について差分有を表す情報がある場合に、“1”である。
このように、パリティ領域については、当該パリティ領域に格納されているパリティの生成に用いられた二つ以上のデータセットの記憶領域の差分ビットを基に決まる一つの差分ビットである、言い換えれば、当該二つ以上のデータセットの記憶領域の差分ビットが冗長化される必要が無い。結果として、差分リビルドのために各ノード210のメモリ212が保持すべき差分情報のサイズを低減する。なお、各ノード210について、差分情報(ユーザ部差分情報802及び/又はパリティ部差分情報803)は、当該ノード210のメモリ212に保持されてもよいし、当該ノード210以外のいずれかのノード210のメモリ212に保持されてもよい。
また、複数台のノード210のうちのいずれかのノードに障害が生じた場合に、障害ノード以外の各ノード210のメモリ212に、差分情報(ユーザ部差分情報802及び/又はパリティ部差分情報803)が保持されてよい。別の言い方をすれば、いずれのノード210にも障害が生じていない場合、いずれのノード210でも差分情報は保持されていなくてよい。
また、上述の実施形態において、ノード210の障害の例は、ノード210の少なくとも一部(例えば、I/O対象のデータの書込みに関するハードウェアやソフトウェア)の停止でよい。
ユーザ部差分情報802及びパリティ部差分情報803のいずれについても、当該差分情報をメモリ212に保持するノード210が、当該差分情報のうちの差分ビット“1”を、当該差分ビットに対応した記憶領域が属する記憶領域グループのうちの、全ての障害ノードにおける記憶領域のデータセットが復元された場合に、“0”に更新してよい。このように、記憶領域グループについて更新後データセットが反映された全ての復元データセットが得られたタイミングという適切なタイミングで、差分ビット“1”を、差分無を表す“0”に更新することができる。なお、二つ以上の記憶領域(例えば二つ以上のセグメント)で構成された物理チャンク毎に、ユーザ部差分情報802及びパリティ部差分情報803が存在してよく、ユーザ部差分情報802及びパリティ部差分情報803における差分ビット“1”は、物理チャンク単位で差分ビット“0”に更新されてよい。これにより、差分ビットのクリア(“0”へのリセット)の頻度を適切に低減することができる。
障害ノード210が障害から回復した場合、当該障害から回復したノードである回復ノード210の複数の記憶領域の各々について、当該記憶領域に対応した差分ビットが、当該記憶領域が属する記憶領域グループのうち当該記憶領域以外の二以上の記憶領域のうちの少なくとも一つの記憶領域が差分ビット“1”の場合に“1”とされ、当該回復ノード210の複数の記憶領域のうち、差分ビット“1”に対応の記憶領域毎に、当該回復ノードがデータセットを復元してよい。このように、各ノード210のメモリ212が保持すべき差分情報のサイズが低減されても差分リビルドが可能である。
各ノード210は、当該ノード210のメモリ212における差分情報(ユーザ部差分情報802及び/又はパリティ部差分情報803)を、特定の契機で、当該ノード210のメモリ212から当該ノード210の永続記憶装置に書き出してよい。これにより、メモリ212上の差分情報が永続記憶装置にバックアップされているため、停電等によりメモリ212から差分情報の少なくとも一部が消失しても、消失した情報を、永続記憶装置から復元することができる。各ノード210について、「特定の契機」は、当該ノード210の差分情報の更新時、又は、当該ノード210の計画停止時でよい。これにより、適切なタイミングでバックアップできる。バックアップの単位は、差分情報の一部(例えば更新部分のみ)又は全体でもよい。
パリティ領域を有するノード210のメモリ212が、当該ノード210のパリティ領域毎の差分ビットを含んだパリティ部差分情報803を保持してよい。これにより、パリティの生成に必要なデータセットの宛先も、当該パリティが格納されるパリティ領域に対応した差分ビットの通知先も、同一のノード210となる。結果として、転送効率が向上する。
例えば、第1の実施形態では、ストライプのデータ保護ポリシが、jDkPであり(jは2以上の整数、kは1以上の整数)でよい。当該ストライプが、jのユーザ領域とkのパリティ領域で構成されてよい。jのユーザ領域を有するj台のノードとkのパリティ領域を有するk台のノードとで構成された(j+k)台以上のノードのうちのいずれかが、障害ノードでよい。(j+k)台以上のノードのうちの障害ノード以外のノードである生存ノードの各々が、ライト先の記憶領域にデータセットを格納してよい。当該ライト先の記憶領域に対応した差分ビットが“1”となってよい。障害から回復した回復ノードが、当該回復ノードのパリティ領域毎に、当該パリティ領域を含むストライプにおける少なくとも一つのユーザ領域の差分ビットが“1”の場合、当該パリティ領域に対応した差分ビットを“1”に更新してよい。当該回復ノードは、当該パリティ領域に対応した差分ビットが“1”であれば、当該パリティ領域のパリティを、当該回復ノード以外のデータにおけるユーザデータセットを基に復元してよい。
ユーザ領域を有するノード210のメモリ212が、当該ノード210のユーザ領域毎の情報を含んだユーザ部差分情報802を保持してよい。これにより、当該ノード210のユーザ領域が更新された場合に迅速にユーザ部差分情報802を更新することができる。また、複数台のノード210の各々が、ボリューム330を提供し、当該ボリューム330を指定したライト要求に付随するユーザデータから得られた全てのユーザデータセットを、当該ノード210の永続記憶装置に格納してよい。これにより、各ノード210は、当該ノード210がオーナ権を有する領域に対するユーザデータの入出力を高速に行うことができる。
例えば、第2の実施形態では、データ保護ポリシが、jDkPであり(jは2以上の整数、kは1以上の整数)、ノードvは、下記を行ってよい。これにより、差分情報の削減とデータ転送量の削減との両方が可能である。
・ノードvは、ライト対象のユーザデータから得られたjのユーザデータセットを、当該ノードvの永続記憶装置に格納する。ノードvは、当該jのユーザデータセットを用いて、(k-1)のパリティである(k-1)の一次パリティを生成する。ノードvは、(j+k-1)のデータセット(当該jのユーザデータセットと当該(k-1)の一次パリティ)を、当該ノードv以外の(j+k-1)台のノードに転送する。
・ノードvは、当該ノードv以外の(j+k-1)台のノード210から得られた(j+k-1)のデータセットを用いて、kのパリティであるkの二次パリティを生成する。この「(j+k-1)のデータセット」は、当該ノードvのユーザデータセットを含まないjのユーザデータセットと、当該ノードvのパリティを含まない(k-1)のパリティとの集合である。ノードvは、当該kの二次パリティを、当該ノードvの永続記憶装置に格納する。ノードvは、当該kの二次パリティの生成に用いられた(j+k-1)のデータセットのうちのいずれかのデータセットの記憶領域について差分ビットが“1”である場合、当該ノードvのパリティ部差分情報803のうちの、当該kの二次パリティが格納されたkのパリティ領域に共通の差分ビットを、差分有を表す情報に更新する。
また、データ保護ポリシが、jDkPであり(jは2以上の整数、kは1以上の整数)、以下のように中間データセットが用いられてもよい。なお、下記の説明は、例えば、図3と、図15~図17とを参照することで、導き出せる事項である。
・ノードvは、ライト対象のユーザデータから得られたjのユーザデータセットを、当該ノードvの永続記憶装置に格納する。ノードvは、当該jのユーザデータセットと当該jのユーザデータセットの書き込み先に格納されたjの旧ユーザデータセットとで計算されたjの中間データセットを用いて、(k-1)の中間パリティである(k-1)の一次中間パリティを生成する。ノードvは、(j+k-1)のデータセット(当該jの中間データセットと当該(k-1)の一次中間パリティ)を、当該ノードv以外の(j+k-1)台のノードに転送する。
・ノードvは、当該ノードv以外の(j+k-1)台のノード210から得られた(j+k-1)のデータセットに基づくkの新二次パリティの書き込み先に対応するkの旧二次パリティを読み出す。この「(j+k-1)のデータセット」は、当該ノードvの中間データセットを含まないjの中間データセットと、当該ノードvの一次中間パリティを含まない(k-1)の中間パリティとの集合である。ノードvは、kの旧二次パリティと受信した(j+k-1)のデータセットとを用いて、kのパリティであるkの新二次パリティを生成し、当該kの新二次パリティを、当該ノードvの永続記憶装置に格納する。当該kの二次パリティの生成に用いられた(j+k-1)のデータセットのうちのいずれかのデータセットの記憶領域について差分ビットが“1”である場合、ノードvは、当該ノードvのパリティ部差分情報803のうちの、当該kの二次パリティが格納されたkのパリティ領域に共通の差分ビットを、差分有を表す情報に更新する。
なお、パリティ領域を有するノード210のパリティ部差分情報803について、パリティ領域毎に、当該パリティ領域に格納されているパリティの生成に用いられたいずれかのデータセットの記憶領域について差分ビットが“1”の場合、当該パリティ領域に対応した差分ビットは“1”でよい。
なお、例えば、差分情報のローカリティに関し、下記のような表現がされてよい。
[表現例]
それぞれプロセッサ、メモリ及び永続記憶装置を備える複数台のノードを備え、
前記複数台のノードの各々について、当該ノードの永続記憶装置に基づく記憶領域毎に差分有か否かを表す情報を含んだ差分情報があり、当該差分情報が、当該ノードのメモリに保持される、
ストレージシステム。
この表現例においても、差分情報は、上述の特定の契機でメモリから永続記憶装置に格納されてよい。また、回復ノードの各記憶領域について、当該記憶領域の差分有無情報(差分有か否かを表す情報)は、当該記憶領域が属する記憶領域グループのうち当該記憶領域以外の記憶領域のうちの少なくとも一つの記憶領域の差分有無情報が差分有を表している場合、差分有を表す情報とされてよい。
以上、幾つかの実施形態を説明したが、これらは本発明の説明のための例示であって、本発明の範囲をこれらの実施形態にのみ限定する趣旨ではない。本発明は、他の種々の形態でも実行することが可能である。