(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】
(24)【登録日】2024-11-28
(45)【発行日】2024-12-06
(54)【発明の名称】分散型ストレージシステム
(51)【国際特許分類】
G06F 3/06 20060101AFI20241129BHJP
G06F 13/10 20060101ALI20241129BHJP
G06F 11/10 20060101ALI20241129BHJP
G06F 11/20 20060101ALI20241129BHJP
【FI】
G06F3/06 305C
G06F3/06 301X
G06F13/10 340A
G06F11/10 680
G06F11/20 656
(21)【出願番号】P 2023110180
(22)【出願日】2023-07-04
(62)【分割の表示】P 2021021418の分割
【原出願日】2015-09-30
【審査請求日】2023-07-04
(31)【優先権主張番号】PCT/JP2014/076105
(32)【優先日】2014-09-30
(33)【優先権主張国・地域又は機関】JP
(73)【特許権者】
【識別番号】524132520
【氏名又は名称】日立ヴァンタラ株式会社
(74)【代理人】
【識別番号】110001678
【氏名又は名称】藤央弁理士法人
(72)【発明者】
【氏名】圷 弘明
(72)【発明者】
【氏名】川村 俊二
(72)【発明者】
【氏名】安永 浩太
(72)【発明者】
【氏名】山本 貴大
(72)【発明者】
【氏名】河村 篤志
【審査官】田名網 忠雄
(56)【参考文献】
【文献】特開2008-134988(JP,A)
【文献】特表2008-511064(JP,A)
【文献】特開2013-037611(JP,A)
(58)【調査した分野】(Int.Cl.,DB名)
G06F 3/06- 3/08
G06F 13/10-13/14
G06F 11/10
G06F 11/20
(57)【特許請求の範囲】
【請求項1】
分散型ストレージシステムであって、
ネットワークを介して通信する複数のサイトを含み、
前記複数のサイトそれぞれは、
複数のノードと、
データを格納するストレージデバイスと、を含み、
前記複数のサイトの内の第1のサイトの第1のノードは、
上位装置からライト要求とともに
第1ユーザデータを受信し、前記
第1ユーザデータを前記第1のサイトのストレージデバイスに格納し、
前記
第1ユーザデータの冗長データを他のサイトに格納するための
第1データを、前記複数のサイトの内の第2のサイトに送信し、
前記複数のサイトの第3のサイトの第3のノードは、上位装置から受信した第2ユーザデータの冗長データを他のサイトに格納するための第2データを、前記第2のサイトに送信し、
前記第2のサイトの第2のノードは、
前記第1データ
及び前記第2データに基づいてパリティを
生成して前記第2のサイトのストレージデバイスに格納し、
前記第1のサイトの第1のノードは、前記上位装置から前記
第1ユーザデータに対するリード要求を受信し、前記
第1ユーザデータを前記第1のサイトのストレージデバイスから読み出して前記上位装置に送信する
ことを特徴とする分散型ストレージシステム。
【請求項2】
請求項1に記載の分散型ストレージシステムであって、
前記複数のサイトそれぞれの状態を記憶したサイト状態管理情報を含み、
前記第2のサイトの第2のノードは、
前記サイト状態管理情報を参照して前記第1のサイトの障害を検知し、
前記障害を検知した場合に、前記第2のサイトに格納したパリティを用いて、前記第1のサイトに格納した第1ユーザデータをリビルドする
ことを特徴とする分散型ストレージシステム。
【請求項3】
請求項1に記載の分散型ストレージシステムであって、
前記第1のサイトの第1のノードは、
前記ライト要求及び前記第1ユーザデータの受信と同期して、前記第1データを、前記第2のサイトに送信する
ことを特徴とする分散型ストレージシステム。
【請求項4】
請求項1に記載の分散型ストレージシステムであって、
前記ライト要求がデータを更新することを示す場合、前記第1のサイトの第1のノードは、更新前のデータを読み出せるように、前記第1のサイトのストレージデバイスの前記更新前のデータとは別の記憶領域に、受信した前記第1ユーザデータを格納し、
前記ライト要求及び前記第1ユーザデータの受信とは非同期で、前記第1データを、前記第2のサイトに送信する
ことを特徴とする分散型ストレージシステム。
【請求項5】
分散型ストレージシステムにおけるデータ処理方法であって、
前記分散型ストレージシステムは、ネットワークを介して通信する複数のサイトを含み、
前記複数のサイトそれぞれは、複数のノードと、データを格納するストレージデバイスとを含み、
前記データ処理方法は、
前記複数のサイトの内の第1のサイトの第1のノードが、
上位装置からライト要求とともに第1ユーザデータを受信し、前記受信した第1ユーザデータを前記第1のサイトのストレージデバイスに格納し、
前記第1ユーザデータの冗長データを他のサイトに格納するための第1データを、前記複数のサイトの内の第2のサイトに送信し、
前記複数のサイトの内の第3のサイトの第3のノードが、上位装置から受信した第2ユーザデータの冗長データを他のサイトに格納するための第2データを、前記第2のサイトに送信し、
前記複数のサイトの内の第2のサイトの第2のノードが、前記第1データ及び前記第2データに基づいてパリティを生成して前記第2のサイトのストレージデバイスに格納し、
前記第1のサイトの第1のノードが、前記上位装置から前記第1ユーザデータに対するリード要求を受信し、前記第1ユーザデータを前記第1のサイトのストレージデバイスから読み出して前記上位装置に送信する
ことを特徴とするデータ処理方法。
【発明の詳細な説明】
【参照による取り込み】
【0001】
本出願は、2014年9月30日に出願された国際出願であるPCT/JP2014/076105の優先権を主張し、その内容を参照することにより、本出願に取り込む。
【技術分野】
【0002】
本発明は、分散型ストレージシステムに関する。
【背景技術】
【0003】
IT投資額が横ばいになる一方で、データ量の増大化が進んでいる。ストレージのコスト低減がますます重要となってきている。例えば、分散型ストレージシステムの一つとして、多数の汎用サーバをネットワークにより接続しストレージプールを生成する、ServerSAN型ストレージシステムが、将来に普及すると見られている。特に、大規模なビッグデータ分析等のためにサーバノードに高速なSSDを搭載し高性能な分析を狙うシステムにおいて、ServerSAN型ストレージシステムは、有効なソリューションであると考えられる。
【0004】
本技術分野の背景技術として、米国特許7546342号(特許文献1)がある。この公報には、「Webサイトに関連付けられる各ファイルの相対的重要度を計算する。この
相対的重要度を用い、サーバ・アレイ、ピア・ツー・ピア・ネットワークなどの、コンピュータ・クラスタ内の複数デバイスに分配されるコンテンツの複数の部分集合を計算する。この部分集合は、1つまたは複数のファイルの一部分を含むパケットにイレージャ・コーディング方式を使用して作成された符号化メッセージを含むことができる。ファイル取得時、一定数のはっきりと識別可能な符号化メッセージがこの方式に基づいてデバイスから取得される。ファイルはこのメッセージを使用して再作成される。複数デバイスのコンテンツ保持により、Webサイトは、著しく高速に取得され、どのコンピューティング・デバイスも大量の記憶域または帯域幅を必要とせずに、信頼性が向上する。」と記載されている(要約参照)。
【先行技術文献】
【特許文献】
【0005】
【発明の概要】
【発明が解決しようとする課題】
【0006】
従来のServerSAN型ストレージシステムは、サーバノードそれぞれに直結されたローカルストレージデバイスを最終格納場所として使用し、ライトデータ及びその冗長データを複数サーバノードに分散させることでデータを保護する。具体的には、ホストからのライトデータを複数データブロックに分割し、分割したデータブロックからErasure Codeにより冗長コードを生成し、複数サーバノードに分割したデータブロックと冗長コードとを均等分散させる。
【0007】
このように、従来のServerSAN型ストレージシステムは、ホストから受信したライトデータを、複数サーバノードに分散させる。従って、アプリケーションプログラムが、ServerSAN型ストレージからデータを読み出すとき、データブロックがサーバノード間のネットワーク上を転送される。よってネットワークのスループットがボトルネックとなって、データへのアクセスレイテンシがネットワークを介さない場合よりも増加する場合がある。
【課題を解決するための手段】
【0008】
本発明の代表的な一例は、分散型ストレージシステムであって、ネットワークを介して通信する複数のサイトを含み、前記複数のサイトそれぞれは、複数のノードと、データを格納するストレージデバイスを含み、前記複数のサイトの内の第1のサイトの第1のノードは、上位装置からライト要求とともにユーザデータを受信し、前記受信したユーザデータを前記第1のサイトのストレージデバイスに格納し、前記第1のサイトに格納するユーザデータの冗長データを他のサイトに格納するためのデータを、前記複数のサイトの内の第2のサイトに送信し、前記第2のサイトの第2のノードは、前記第1のサイトの第1のノードから前記冗長データを他のサイトに格納するためのデータを受信し、前記冗長データを他のサイトに格納するためのデータから得られる冗長データを前記第2のサイトのストレージデバイスに格納し、前記第1のサイトの第1のノードは、前記上位装置から前記ユーザデータに対するリード要求を受信し、前記ユーザデータを前記第1のサイトのストレージデバイスから読み出して前記上位装置に送信する。
【発明の効果】
【0009】
本発明の一態様によれば、ストレージシステムにおいて、高信頼性を図ることができる。
【図面の簡単な説明】
【0010】
【
図1】分散型ストレージシステムのライト処理の概要を示す。
【
図2】分散型ストレージシステムにおける複数保護レイヤのマッピングイメージ例を示す。
【
図3】分散型ストレージシステムのシステム構成例を示す。
【
図4】分散型ストレージシステムの制御のための情報を示す。
【
図5A】仮想ボリューム管理テーブルの構成例を示す。
【
図5B】プールボリューム管理テーブルの構成例を示す。
【
図5D】ドライブ状態管理テーブルの構成例を示す。
【
図6A】ページマッピングテーブルの構成例を示す。
【
図7B】ジオ静的マッピングテーブルの構成例を示す。
【
図7C】コンシステントハッシングテーブルの構成例を示す。
【
図8】ログ構造化マッピングテーブルの構成例を示す。
【
図9】ローカル領域制御テーブル214の構成例を示す。
【
図11】サイト保護レイヤのマッピングイメージを示す。
【
図12A】分散型ストレージシステムにおける、ノードの状態遷移を示す。
【
図12B】分散型ストレージシステムにおける、サイトの状態遷移を示す。
【
図13】分散型ストレージシステムの一つノードにおける、仮想プロビジョニングレイヤの論理構成例を示す。
【
図14】分散型ストレージシステムにおける複数ノードのページマッピングの例を示す。
【
図15】分散型ストレージシステムのリード処理のフローチャートを示す。
【
図17】非同期ライト処理のフローチャートを示す。
【
図19】容量枯渇管理の処理のフローチャートを示す。
【
図21】退避リビルド処理のフローチャートを示す。
【
図22】データリシンク処理のフローチャートを示す。
【
図23】再配置及びリバランス処理のフローチャートを示す。
【
図24A】再配置における自己閾値の決定方法の一例を示す。
【
図24B】再配置における自己閾値の決定方法の一例を示す。
【
図25B】ノードを追加した場合のストライプタイプの追加及びストライプの再配置一例を示す。
【
図26】コマンドラインの管理I/Fの一例を示す。
【
図27】分散型ストレージシステムのGUIの管理I/Fの例を示す。
【
図28】分散型ストレージシステムのハードウェア構成例を示す。
【
図29】実施形態2において、冗長化のためのノード間の転送を効率化する方法を示す。
【
図30】実施形態2において、
図29を参照して説明した冗長化のためのノード間の転送を効率化する方法における、データ復元方法を示す。
【
図31】実施形態3において、分散型ストレージシステムのハードウェア構成例を示す。
【
図33】実施形態3において、ストレージシステムの制御のためにドライブで管理するテーブル構造を示す。
【
図34】実施形態3において、計算機ノードとフラッシュドライブとの間の通信インタフェースを示している。
【
図35】実施形態3において、計算機ノードがDドライブから最新データを読み込む処理のフローチャートを示す。
【
図36】実施形態3において、旧データのリード処理を示している。
【
図37】実施形態3において、計算機ノードがDドライブへデータを書き込む処理のフローチャートを示す。
【
図38】実施形態3において、同期ライト処理において各ドライブへデータのライト処理を並行に実施した場合の処理フローを示している。
【
図39】実施形態3において、ガベージコレクション処理のフローチャートを示す。
【
図40】実施形態4において、分散型ストレージシステムのハードウェア構成例を示す。
【
図42】実施形態4において、計算機ノードとドライブとの間の通信インタフェースを示している。
【
図43】実施形態4での同期ライト処理のフローチャートを示している。
【
図44】実施形態4での非同期ライト処理のフローチャートを示している。
【
図45】実施形態4でのガベージコレクション処理のフローチャートを示している。
【発明を実施するための形態】
【0011】
本発明の実施形態について、図面を参照して説明する。尚、以下に説明する実施形態は特許請求の範囲にかかる発明を限定するものではなく、また実施形態の中で説明されている特徴の組み合わせの全てが発明の解決手段に必須であるとは限らない。
【0012】
以下の説明では、「テーブル」、「リスト」、「キュー」等の表現にて各種情報を説明することがあるが、各種情報は、これら以外のデータ構造で表現されていても良い。データ構造に依存しないことを示すために「XXテーブル」、「XXリスト」等を「XX情報」と呼ぶことがある。各情報の内容を説明する際に、「識別情報」、「識別子」、「名」、「ID」、「番号」等の表現を用いるが、これらについてはお互いに置換が可能である。
【0013】
<実施形態1>
概要
本実施形態は、分散型ストレージシステムを開示する。分散型ストレージシステムは、それぞれがストレージデバイスを含む複数の計算機ノードをネットワークにより接続して構成される。分散型ストレージシステムは、複数の計算機ノードのストレージデバイスによってストレージプールを実現する仮想的なストレージシステムを実現する。
【0014】
一例の分散型ストレージシステムにおいて、計算機ノードは、ホストからのライトデータを自系のストレージデバイスに格納し、さらに、計算機ノード障害時のデータ保護のために、当該ライトデータを他の計算機ノードに転送する。ここで、当該他の計算機ノードを転送先計算機ノードと呼ぶ。
【0015】
転送先計算機ノードは、複数の異なる計算機ノードから転送されたライトデータから、冗長コードを生成する。転送先計算機ノードは、生成された冗長コードを自系のストレージデバイスに格納する。
【0016】
このように、なるべくデータをライト要求を受けたノード内に配置することで、読み出し時のノード間通信を不要とし、高速な読み出しを可能とする。一方で、計算機ノード間の冗長コードをライト要求を受けたノードとは異なるノードにて生成することで、小オーバヘッドでのデータ保護を実現する。特に、信頼性の低い多数のノードにて分散型ストレージシステムを構築する場合には、読み出し性能を維持しつつも冗長性を担保する本願構成は有効である。
【0017】
また、特に分析系のアプリケーションを本発明による分散型ストレージシステムで動作させる場合、各計算機ノードは、分析対象データを自ノードの記憶領域にまとまって格納できているケースが多い。これにより、データ分析のためのロード時間が削減され、ビジネスアジリティが向上し、ストレージコストが低減される。
【0018】
一例において、分散型ストレージシステムは仮想ボリュームをホストに提供する。分散型ストレージシステムは、ライトアクセスがあった仮想ページに対して、プールボリュームから論理ページを割り当てる。プールボリュームは論理ボリュームであり、プールボリュームの論理記憶領域に対して、ストレージデバイスの物理記憶領域が割り当てられている。
【0019】
計算機ノードは、分散型ストレージシステムのネットワーク帯域と、ホストからの仮想ページ毎の当該計算機ノードへのアクセス頻度に基づき、自系のストレージデバイスから論理ページを割り当てる仮想ページを選択する。例えば、計算機ノードは、分散型ストレージシステムのネットワーク帯域に基づき閾値を決定し、当該閾値よりアクセス頻度が高い論理ページを自系のストレージデバイスに配置する。これにより、ネットワークボトルネックを回避しつつ、高速にページアクセス可能なページ配置を実現できる。
【0020】
一例において、計算機ノードは、仮想ページのロケーションをアプリケーションプログラムやユーザが指定するためのインタフェースを有する。仮想ページは、例えば、仮想ボリュームの論理アドレスで指定される。仮想ページのロケーションは、当該仮想ページのデータが格納される計算機ノードで示される。仮想ページのロケーションを指定するインタフェースを設けることで、仮想ページ提供先に最適化したページ配置を実施することができる。
【0021】
本実施形態において、分散型ネットワークシステムは、上記複数構成例の全てを同時に含むことができ、また、一部の構成のみを含んでいてもよい。
【0022】
用語の説明
本開示において、ストレージデバイスは、1台のHDDやSSD等の1台のストレージドライブ及び複数台のストレージドライブを含むRAID装置、及び複数のRAID装置を含む。ストライプ又はストライプデータは、データ保護のための冗長コードの生成の元となるデータユニットである。ストライプを、冗長コードと差別化するためにユーザデータと呼ぶことがある。ストライプは、計算機ノード内のストレージデバイスに格納されると共に、他の計算機ノードにおける冗長コードの生成において使用される。
【0023】
ストライプタイプは、冗長コードを生成するストライプのクラスである。ストライプが属するストライプタイプは、例えば、当該ストライプの論理アドレスと当該ストライプを格納する計算機ノードとによって決定される。ストライプタイプの識別子であるストライプタイプ番号は、対応する計算機ノードのグループを示す。一つのストライプは、異なる保護レイヤそれぞれのストライプタイプに属することができる。ホストは、ストレージシステムにアクセスする計算機、当該計算機で動作するプロセッサ又は当該プロセッサが実行するプログラムである。
【0024】
図1は、本実施形態の一例に係る分散型ストレージシステムのライト処理の概要を示す。計算機ノード101A、101B及び101Cは同一計算機ドメイン(以下においてドメインとも呼ぶ)に含まれる。以下説明する例において、ドメインはサイトと対応づけられているとする。計算機ノード101D、計算機ノード101Eは、他の計算機ノードとは異なるサイトに配置されている。計算機ノード101A~101Eは、ネットワークを介して通信する。以下において、計算機ノードを、単にノードとも呼ぶ。
【0025】
ノード101A~101Eの各計算機ノードは、キャッシュ181及びストレージドライブ113を含む。ノード101A~101Eの各ノードは、ボリューム1303を提供する。
【0026】
ノード101Aは、ホストから受信したライトデータDATA1(1501A)を自系のキャッシュ181に格納し、さらに、自系のストレージドライブ113に格納する。ライトデータDATA1はストライプである。
【0027】
ノード101Aは、ライトデータDATA1からノード冗長コードPを生成し、自系のストレージドライブ113に格納する。ノード冗長コードは、自系のストレージデバイスに格納されるデータユニットから生成される冗長コードであり、符号Pで示される。ノード101Aは、自系のキャッシュ181内のライトデータDATA1を、他のノード101Bのキャッシュ181に転送する。
【0028】
ノード101Cは、外部装置から受信したライトデータDATA2(1501B)を自系のキャッシュ181に格納し、さらに、自系のストレージドライブ113に格納する。ライトデータDATA2はストライプである。ノード101Cは、ライトデータDATA2からノード内冗長コードPを生成し、自系のストレージドライブ113に格納する。ノード101Cは、自系のキャッシュ181内のライトデータDATA2を、他のノード101Bのキャッシュ181に転送する。
【0029】
ノード101Bは、ノード障害時のデータ保護のために、自系のキャッシュ181に格納されているデータDATA1、DATA2から、サイト冗長コードQ(1502B)を生成し、自系のストレージドライブ113に格納する。サイト冗長コードは、サイト内におけるノード間冗長コードであり、符号Qで示される。サイト冗長コードQは、ノード冗長コードPとは異なる保護レイヤに属する。
【0030】
ノード101Eは、ホストから受信したライトデータDATA3(1501C)を自系のキャッシュ181に格納し、さらに、自系のストレージドライブ113に格納する。ライトデータDATA3はストライプである。ノード101Eは、ライトデータDATA3からノード冗長コードPを生成し、自系のストレージドライブ113に格納する。
【0031】
ノード101Aは、自系のキャッシュ181内のライトデータDATA1を、他のノード101Dのキャッシュ181に転送する。ノード101Eは、自系のキャッシュ181内のライトデータDATA3を、他のノード101Dのキャッシュ181に転送する。
【0032】
ノード101Dは、ノード障害時のデータ保護のために、自系のキャッシュ181に格納されているデータDATA1、DATA3から、ジオ冗長コードR(1502C)を生成し、自系のストレージドライブ113に格納する。ジオ冗長コードは、異なるサイトのノード間の冗長コードであり、符号Rで示される。ジオ冗長コードRは、ノード冗長コードP及びサイト冗長コードQと異なる保護レイヤに属する。
【0033】
図2は、分散型ストレージシステムにおける複数保護レイヤのマッピングイメージ例を示す。
図2は、同一サイトのノード間で冗長化しつつ、サイト間で冗長化を実施するイメージを示している。例えば、データセンタ内のノード間で第1の冗長化が図られ、さらに、別の拠点間との冗長化も図ることで多重のレイヤでデータを保護して、システムの信頼性を向上させることができる。
図2において、一部要素のみが符号で示されており、同一種類の要素の符号は一部省略されている。
図2において、四角柱はノードを表し、破線矩形はサイト(ドメイン)を表し、ノード内の矩形はストライプ又はストライプのアドレス
(データ位置)を表す。
図2は、4つのサイト102を示し、各サイトにおいて4つのノードが配置されている。
図2は、複数ストライプから生成される冗長コードを示していない。
【0034】
ストライプ103における数字(X_Y)は、当該ストライプ103が属するストライプタイプの識別子を示す。Xはサイト内のノード間ストライプタイプ(サイトストライプタイプ)の識別子であり、Yはサイト間のストライプタイプ(ジオストライプタイプ)の識別子である。
【0035】
一つのストライプ103は、一つのサイトストライプタイプ及び一つのジオストライプタイプに属する。例えば、ノード101A1が格納するストライプ1_Aは、サイトストライプタイプ1001及びジオストライプタイプ1002に属している。
【0036】
サイトストライプタイプ1001に属するストライプは、ノード101A1のストライプ1_A、ノード101A2のストライプ1_D、ノード101A3のストライプ1_Cである。これらストライプを保持していない同一サイト内のノード101A4は、これらストライプの冗長コードを生成し、保持する。
【0037】
ジオストライプタイプ1002に属するストライプは、ノード101A1のストライプ1_A、ノード101B1のストライプ1_A、ノード101C2のストライプ2_Aである。これらノードと異なるサイトのノード101D4は、これらストライプの冗長コードを生成し、保持する。
【0038】
上記構成において、複数ノードが、それぞれ、受信し、保持するストライプ(データユニット)を一つの転送先ノードに転送し、当該転送先ノードが転送されたデータユニットから冗長コードを生成し保持する。ストライプと冗長コードが異なるノードに格納されており、ノード障害に対するデータ保護を実現する。
【0039】
ホスト命令を受信したノードは、サイト冗長コード又はジオ冗長コードを生成するために旧データを読み出すことなく、受信したライトデータを他ノードに送信する。したがって、ライト命令に対するレスポンス性能が向上する。また、冗長コード生成のためのストライプ移動はキャッシュ間でなされ、ドライブ113が介在しないため、ドライブ113がフラッシュ媒体を使用する場合、ライト量低減により寿命を向上できる。
【0040】
ノードは、ホストから受信したストライプを分割することなく自系のストレージデバイスに格納するため、リードにおけるレスポンスタイム及びネットワークトラヒックを低減する。また、冗長コードの転送が不要であり、ネットワークトラヒックを低減する。
【0041】
さらに、上記構成は、一つのストライプが複数の保護レイヤに属するため、システムの障害耐性を高めることができる。なお、分散型ストレージシステムは、サイト内又はサイト間のノード間冗長コードのみを生成する単一保護レイヤで構成されていてもよい。
【0042】
図3は、分散型ストレージシステムのシステム構成例を示す。ノード101は、例えば一般的なサーバ計算機の構成を有している。ノード101のハードウェア構成は特に限定されない。ノード101は、ネットワーク103を介して他のノード101とポート106を通じて接続する。ネットワーク103は、例えばInfiniBandや、イーサネット(登録商標)などにより構成される。
【0043】
複数のノード101は、ドメイン102を形成する。ドメイン102は、例えば地理的な地域と対応させてもよいし、仮想的又は物理的なネットワーク103のトポロジと対応
させてもよい。ネットワーク104は、複数のドメイン102を接続する。以下において、ドメインは地理的な離れたサイトに対応づけられているとする。
【0044】
ノード101の内部構成は、内部ネットワーク112を介してポート106、プロセッサパッケージ111、ディスクドライブ(以下においてドライブとも呼ぶ)113を接続する。プロセッサパッケージ111は、メモリ118、プロセッサ119を含む。
【0045】
メモリ118は、プロセッサ119がリードやライト命令を処理し、またストレージの機能を実行する上で、必要な制御用の情報を格納し、またストレージのキャッシュデータを格納する。また、メモリ118は、例えばプロセッサ119により実行するプログラムを格納する。メモリ118は、揮発性のDRAMであってもよいし、不揮発のSCM(Storage Class Memory)などを用いてもよい。
【0046】
ドライブ113は、例えば、FC(Fibre Channel)、SAS(Serial Attached SCSI)、SATA(Serial Advanced Technology Attachment)などのインタフェースを持つハードディスクドライブや、SSD(Solid State Drive)などにより構成する。
【0047】
NAND、PRAM、ReRAMなどのSCMを用いてもよいし、揮発性のメモリを用いてもよい。揮発性メモリを使用する場合、バッテリによってストレージデバイスを不揮発化してもよい。
【0048】
前述したさまざまな種類のドライブは、性能が異なる。例えば、HDDと比較し、SSDのスループット性能が高い。ノード101は、複数の種類のドライブ113を含む。本例のノード101は、異なる種類のドライブ113を近い性能を持つドライブ群に分類して、階層115、116を形成する。
【0049】
階層間の関係は、階層の性能により定義される。性能は、アクセス性能や耐障害性能を含む。以下に説明する例において、Tier1からTier2、Tier3の順で、階層のアクセス性能が低下する。また、以下に説明する例において、各階層におけるドライブ群のそれぞれが、RAIDを構成する。なお、
図3が例示する階層数は2であるが、階層数は設計に依存する。また、高アクセス性能の階層をキャッシュとして使用してもよい。ドライブ、RAID、階層及びそれらの集合は、それぞれストレージデバイスである。
【0050】
図4は、分散型ストレージシステムの制御のための情報を示す。メモリ118は、
図4に示す情報に加え、ストレージ機能を実現するストレージプログラム、OS、インタフェースプログラムを含む、各種プログラムを格納する。メモリ118は、さらに、業務を実行するアプリケーションプログラムを格納することがある。
【0051】
保護レイヤ情報201は、データ保護に関する情報である。仮想化プロビジョニング情報202は、仮想ボリュームのプロビジョニングに関する情報である。キャッシュ情報204は、キャッシュ181に関する情報である。構成情報203は、分散型ストレージシステムの構成に関する情報である。
【0052】
保護レイヤ情報201は、保護レイヤ番号1、番号2、番号3それぞれの、静的マッピングテーブル210、211、212を含む。保護レイヤ情報201は、さらに、ログ構造化マッピングテーブル213と、ローカル領域制御テーブル214とを含む。
【0053】
仮想化プロビジョニング情報202は、ページマッピングテーブル215と、ページ負荷頻度テーブル216と、ページ負荷分布テーブル217を含む。構成情報203は、仮
想ボリューム管理テーブル218とプールボリューム管理テーブル219と、ドライブ管理テーブル220とを含む。構成情報203は、さらに、ドライブ状態管理テーブル221と、ノード状態管理テーブル222と、サイト状態管理テーブル223とを含む。
【0054】
上述した情報の全部又は一部のコピーは、ドライブ113に同期又は非同期に保存されてもよい。ノード101は、例えばプール毎に上記情報を保持してもよい。一つのプールは、1又は複数論理ボリュームで構成される。この論理ボリュームをプールボリュームとも呼ぶ。一つのプールは、1又は複数階層で構成される。以下に説明する例では、プールは3階層で構成される、つまり、3階層のプールボリュームで構成される。プールボリュームの実体は、ドライブ113の記憶領域である。プールボリュームは他のノード101のドライブの記憶領域が割り当てられることも可能である。
【0055】
以下において、ノード101が保持する情報を示すテーブルの構成例を説明する。各テーブルにおいて、一部のエントリのみが示されている。各テーブルにおいて、空白のセルは、データの記載が省略されたセルである。テーブルのセルにおいて、「0x」は、16進数の数字を示す。ドライブ番号はノード内で一意であり、ノード番号はサイト内で一意である。サイト番号はシステム内で一意である。
【0056】
図5A~
図5Fは、構成情報203に含まれる情報を示すテーブルの構成例を示す。
図5A~
図5Cは、異なる記憶リソース種別の管理情報を示す。
図5Aは、仮想ボリューム管理テーブル218の構成例を示す。仮想ボリューム管理テーブル218は、仮想ボリュームの情報を示す。
【0057】
本例において、仮想ボリューム管理テーブル218は、当該情報218を保持するノード101が提供する仮想ボリュームの情報示す。ノード101は、提供する仮想ボリュームへのアクセスを受け付ける。仮想ボリューム管理テーブル218は、障害発生にそなえ、自ノードがオーナではない仮想ボリュームの情報を保持してもよい。
【0058】
仮想ボリューム管理テーブル218は、各仮想ボリュームのサイズ(容量)、各仮想ボリュームを提供するノード(オーナノード)のノード番号のリストを含む。さらに、保護レイヤそれぞれの冗長コードの生成及び書き込みが、ライトデータの自系のストレージデバイスへの書き込みと同期か非同期かを示す情報を含む。仮想ボリュームのサイズは、割り当てられている論理ページの総量ではなく、仮想ボリュームの仮想容量(最大容量)を示す。同期/非同期の情報は、保護レイヤ毎に与えられる。
【0059】
図5Bは、プールボリューム管理テーブル219の構成例を示す。プールボリューム管理テーブル219は、プールボリュームの情報を示す。本例において、プールボリューム管理テーブル219は、当該情報219を保持するノード101及び当該ノード101が属する他ノード101が提供するプールボリュームの情報示す。プールボリューム管理テーブル219は、各プールボリュームのサイズ(容量)、各プールボリュームを提供するノードのノード番号の情報を含む。
【0060】
図5Cは、ドライブ管理テーブル220の構成例を示す。ドライブ管理テーブル220は、各プールボリュームに割り当てられるドライブを示す。本例において、ドライブ管理テーブル220は、当該情報220を保持するノード101が含む自系のドライブ113の情報示す。
【0061】
ドライブ管理テーブル220は、プールボリューム毎に、ドライブの種類(SSDやNL-SASドライブなど)、ストライピングしているドライブ番号の組(RAIDを構成するドライブ番号の組)、ドライブのサイズ(容量)の情報を持つ。ストライピングを実
施しない場合、プールボリュームに対して一つのドライブのみが割り当てられる。なお、一つのドライブの異なる領域は、異なるプールボリュームに割り当てられ得る。
【0062】
図5D~
図5Fは、ノード101のそれぞれが保持する、分散型ストレージシステムにおける障害管理情報を示す。
【0063】
図5Dは、ドライブ状態管理テーブル221の構成例を示す。ドライブ状態管理テーブル221は、ノード101内の自系のドライブ113それぞれの状態及びエラーカウントを示す。
【0064】
図5Eは、ノード状態管理テーブル221の構成例を示す。ノード状態管理テーブル221は、自系サイト102における他ノード101それぞれの状態及びエラーカウントを示す。ノード101の自系サイト10cは、当該ノード101が属するサイト102である。ノード101は、他ノード101との通信においてエラーを検出すると、エラーカウントをインクリメントする。
【0065】
図5Fは、サイト状態管理テーブル223の構成例を示す。サイト状態管理テーブル222は、サイト毎の状態及びエラーカウントを示す。本例において、ノード101は他サイト102の代表ノードとのみ通信できるとする。そのため、代表ノード101のエラーは、当該サイトのエラーを意味する。
【0066】
ノード101のプロセッサ119は、自系のドライブ113又は他ノード101との通信においてエラーを検出すると、保持する管理情報221~223においてエラーカウントをインクリメントする。
【0067】
いずれかのハードウェアリソース(ドライブ、ノード又はサイト)におけるエラーカウントが第1閾値に達すると、プロセッサ119は、当該リソースの状態を正常状態から警告状態に変化させる。さらに、エラーカウントが第1閾値に達すると、プロセッサ119は、当該リソースの状態を警告状態から閉塞状態に変化させる。警告状態と閉塞状態は、異常状態である。
【0068】
各ノード101は、いずれかのハードウェアリソースの異常状態を検出すると、当該情報を他のノード101に通知する。具体的には、ノード101は、所属サイト102内の全ノード101及び他サイト102の代表ノード101に通知する。代表ノード101は、所属サイト102内の他のノードに当該情報を通知する。これにより、異常状態ハードウェアリソースの情報をノード間で共有できる。異常状態ドライブの情報はノード間で共有されなくてもよい。
【0069】
ノード101は、エラーカウントの情報を共有してもよい。例えば、各ノード101は、他ノード又は他サイトとの通信エラーを検出すると、自系の管理情報を更新すると共に、当該更新情報を他ノード101にブロードキャストする。ノード101は、自ノードのエラーカウントに加え、他ノード101によるエラーカウントに基づき、異常状態の判定を行ってもよい。
【0070】
ノード101が他サイト102の各ノード101と通信する構成において、ノード101は、他のサイト102のノード101との通信エラーをカウントしてもよい。サイトエラーカウントは、例えば、当該サイト102における全ノード101のエラーカウントに総計である。
【0071】
図6A~
図6Cは、仮想化プロビジョニング情報202に含まれる情報を示す。
図6A
は、ページマッピングテーブル215の構成例を示す。ページマッピングテーブル215は、仮想ボリュームの仮想ページとプールボリュームの論理ページとの対応関係を保持する。
【0072】
本例において、ページマッピングテーブル215は、当該情報215を保持するノード101が提供する仮想ボリュームの情報を保持している。仮想ページは、後述する自系のプールボリューム1303Cを介して又は直接に、他ノード101のプールボリューム1303Bの論理ページに割り当てられることがある。ページマッピングテーブル215は、仮想ページと、自系プールボリューム1303C又は他ノード101のプールボリューム1303Bとの関係を示す。
【0073】
ページマッピングテーブル215は、仮想ボリュームの仮想ページの先頭LBA(Logical Block Address)とアドレス範囲と、仮想ページの先頭LBAに対応するプールボリュームの論理ページの先頭LBAと、を保持する。
【0074】
図6Bは、ページ負荷頻度テーブル216の構成例を示す。ページ負荷頻度テーブル216は、仮想ページ毎のI/O頻度(アクセス頻度)の履歴を保持する。具体的には、仮想ボリュームの仮想ページの先頭LBA及びアドレス範囲と、当該領域に対するアクセス頻度と、を保持する。
【0075】
ページ負荷頻度テーブル216は、プールボリュームからユーザデータ(ライトデータ)を格納する論理ページが割り当てられている仮想ページの情報を保持する。したがって、ページ負荷頻度テーブル216は、仮想ページに割り当てられている論理ページのアクセス頻度も示す。ページ負荷頻度テーブル216は、当該テーブル216を保持するノード101が提供する仮想ボリュームの情報を保持する。また、ページ負荷頻度テーブル216は、当該テーブル216を保持するノードが自ノード及び他ノードから受けたアクセスの情報を保持する。
【0076】
アクセス頻度の情報は、アクセス元のノード毎に取得、管理されてもよく、リードアクセスとライトアクセスとに分けて取得、管理されてもよい。ノード101は、シーケンシャルとランダムアクセスを分離してアクセス頻度の情報を取得、管理してもよいし、複数の計測周期で、アクセス頻度の情報を取得、管理してもよい。
【0077】
図6Cは、ページ負荷分布テーブル217の構成例を示す。ページ負荷分布テーブル217は、仮想ページ毎のアクセス頻度を複数レベルに分割し、レベル毎のページ量を示す。つまり、ページ負荷分布テーブル217は、アクセス頻度(I/O頻度)に対するページ量の分布を示す。ページ負荷分布テーブル217は、ページ負荷分布の履歴を示す。
【0078】
ノード101は、複数の保護レイヤそれぞれのページ負荷分布テーブル217を保持する。例えば、ページ負荷分布テーブル217は、ノード内でのページ毎のアクセス頻度の情報の他、サイト内の全ノードにおけるページ毎のアクセス頻度の情報、複数サイトに跨るシステム内の全ノードにおけるページ毎のアクセス頻度の情報を保持してもよい。ノード101は、自ノード及び他のノードから取得したページ負荷頻度テーブル216から、ページ負荷分布テーブル217を生成できる。
【0079】
例えば、複数ノード101が一つの仮想ボリュームを提供する場合、複数ノード101それぞれが、同一仮想ページに対するアクセスを受信する。したがって、仮想ボリュームのオーナノード全てにおける一つの仮想ページへのアクセスの総計が、当該仮想ページへの全アクセスを示す。
【0080】
ページ負荷分布テーブル217は、ページ負荷頻度テーブル216と比較して情報量が少なく、基本的にノード101の記憶容量(論理ページ量)に依存しない。したがって、ページ負荷分布テーブル217は、多数のノード101間で共有することができる。さらに、複数ノード101でのアクセス頻度レベル毎のページ数を加算することで、サイト全体又はシステム全体のページ負荷分布情報など、複数ノード101に跨るページ負荷分布を生成することができる。アクセス元のノード101毎にページ負荷分布テーブル217を作成してもよい。
【0081】
ページ負荷頻度テーブル216は、高アクセス頻度(高負荷)のページの上位リスト(例えばLossy Count Methodを使用)と、ノード又はノード群の記憶領域を所定区間数で分割して得られる分割区域毎のアクセス頻度(ページ負荷)のリストとの、2種類のリストで構成するのが効率的である。高負荷ページの上位リストのみでは、OLTPデータベースによく見られるランダム負荷が広い場合に、上位リストが飽和し、リストに含めるべきページが含まれない場合がある。
【0082】
一方で、記憶領域の分割区域毎のページ負荷のリストのみでは、特定のページの負荷が非常に高く、メモリ制約により区域数が少ない場合、区域の幅が広すぎてページ負荷が平滑化されてしまい、ページ毎の負荷の特徴が失われてしまう場合がある。したがって、上記2種類のリストを共に持つのが効率的である。
【0083】
ノード101は、所定周期(例えば、1週間)毎の履歴テーブル216、217を持ってもよい。本例は、ブロックストレージにおけるマッピングテーブル(LBAで管理)について記載しているが、一般的に知られたファイルストレージ(例えばNFS/CIFS:Network File System/Common Internet FileSystem)やオブジェクトストレージ(例えばREST:Representational State Transfer)においても、ノード101は、同様な情報を保持することできる。
【0084】
ファイルストレージにおいて、管理情報は、ファイルとページを対応させてもよいし、ファイルを分割した小領域をページと対応させてもよい。また、オブジェクトストレージにおいて、管理情報は、オブジェクトとページ対応させてもよいし、オブジェクトを分割した小領域をページと対応させてもよい。
【0085】
図7A~7Cは、データ保護レイヤ情報201における、静的マッピングテーブルの例を示す。保護レイヤ番号1はノード101内の保護レイヤであり、各ノード101が、自ノードのノード静的マッピングテーブル210を保持している。ノード静的マッピングテーブル210の図は省略した。
図7A~7Cのテーブルは、例えば、サイト番号0のサイトに属しノード番号0のノード101に、保持される。
【0086】
図7Aは、保護レイヤ番号2(サイト)の静的マッピングテーブル211の構成例を示す。サイト静的マッピングテーブル211は、サイト102内のノード101間で共有される情報である。サイト静的マッピングテーブル211は、サイトストライプタイプ番号毎に、対応するストライプ(ユーザデータ/ライトデータ)を格納するデータノードのノード番号と、ストライプから生成される冗長コードを格納する冗長コードノードのノード番号の関係を保持する。
【0087】
サイトストライプタイプ番号は、サイト内のストライプタイプの識別情報である。ストライプタイプは、ストライプのクラスであり、ストライプタイプ内の複数ストライプから1又は複数冗長コードが生成される。ストライプは、予め定められたサイズのデータユニットである。
【0088】
各ストライプが属するストライプタイプの決定方法及び冗長コードの生成方法は後述する。ストライプタイプ番号は、ストライプタイプに含まれるユーザデータ及び冗長コードを格納するノード101のグループも示す。
【0089】
サイトストライプに属する異なるデータノードからの複数ストライプから、冗長コードが生成される。
図7Aの例において、二つの冗長コードが生成され、それぞれ異なるノード101に格納される。冗長コードの数は設計に依存する。複数冗長コードは、例えば、Erasure Codingにより生成される。サイト静的マッピングテーブル211は、メモリ上の制約やセキュリティ上の制約がなければ、サイト間で共有されてもよい。
【0090】
本例において、一つのストライプは、単一のサイトストライプタイプに属する。
図7Aに例示するように、一つのノードが格納するストライプは、異なるストライプタイプに属し得る。例えば、
図7Aの例において、ノード0x00が格納するあるストライプはサイトストライプタイプ0x0000に属し、他のストライプはサイトストライプタイプ0x0001に属する。
【0091】
図7B、
図7Cは、保護レイヤ番号3(ジオ)の静的マッピングテーブル212に含まれる、ジオ静的マッピングテーブル212A及びコンシステントハッシングテーブル212Bの構成例を示す。ジオ静的マッピングテーブル212Aは、基本的にサイト静的マッピングテーブル211と同様の構成を有する。ジオ静的マッピングテーブル212Aは、サイト間で共有される。
【0092】
ジオ静的マッピングテーブル212Aは、ジオストライプタイプ番号毎に、対応するストライプが配置されるデータサイトのサイト番号と、冗長コードが配置される冗長コードサイトのサイト番号の関係を保持する。データサイトそれぞれの一つのノード101がストライプを格納する。また、冗長コードサイトそれぞれの一つのノード101が、冗長コードを格納する。
【0093】
コンシステントハッシングテーブル212Bは、冗長コードサイト内で冗長コードを格納するノード101を特定するための情報を示す。サイト102それぞれが、固有のコンシステントハッシングテーブル212Bを保持する。コンシステントハッシングテーブル212Bの情報は、サイト毎に異なる。
【0094】
コンシステントハッシングテーブル212Bは、当該冗長コードサイト内のノード101のノード番号と、ノード101が冗長コード(1)を格納する場合のハッシュ値と、ノード101が冗長コード(2)を格納する場合のハッシュ値と、の関係を示す。ハッシュ値は、他のサイト102からストライプと共に転送される転送元に関する情報に基づき算出される。算出されたハッシュ値に対応づけられているノード101に当該ストライプは転送され、当該転送先ノード101が冗長コードを生成、格納する。
【0095】
図7A~7Cを参照して説明した静的マッピングテーブルは、ノード/サイト障害時に、スペア領域にユーザデータ(ストライプ)及び冗長コードの格納先を変更する場合に、変更される。さらに、ノードやサイトの増設/減設時に変更される。
【0096】
ノード101は、故障したノード/サイトの情報から一意に静的マッピングテーブルを変更できるように、同一の計算論理を共有してもよい。これにより、ノード101は、保持する静的マッピングテーブルを変更した後、当該静的マッピングテーブルをマルチキャスト送信する必要がなくなり、ネットワークの負荷を低減できる。
【0097】
静的マッピングテーブルによりストライプタイプに属するノードを予め定義することで、データ回復の点から適切な冗長構成を実現することができる。一つノードのデータを異なるストライプタイプの含めると共に、一つノードが属するストライプタイプ数を規定することで、ノード閉塞時のデータ回復可能性を高めることができる。なお、サイト静的マッピングテーブル211の使用方法は、
図11を参照して後述される。
【0098】
図8は、データ保護レイヤ情報201におけるログ構造化マッピングテーブル213の構成例を示す。
図8において、矢印はポインタを表す。ログ構造化マッピングテーブル213は、データマッピングテーブル701、ジオ/サイト/ノードコードマッピングテーブル702、及び逆マッピングテーブル703を含む。
【0099】
データマッピングテーブル701は、当該テーブル701を保持するノード101が格自系のストレージデバイス(ドライブ113)に格納しているユーザデータ(ストライプ)を管理する。ノード101は、ストライプのプールボリュームの格納アドレス(論理アドレス)から、当該ストライプを格納するドライブ113(物理ストレージデバイス)の格納アドレス(物理アドレス)を知ることができる。
【0100】
データマッピングテーブル701は、プールボリュームにおけるユーザデータ(ストライプ)の格納アドレス(論理アドレス)と、ドライブ113の物理記憶領域における格納アドレス(物理アドレス)とを対応づける。
【0101】
ストライプのプールボリュームの格納アドレスは、プールボリュームのLDEV番号、ストライプのストライプ番号で指定され、さらに、ストライプ内の各ブロックがLBAのオフセットで指定される。ストライプサイズは一定である。ストライプ番号は、例えば、floor(LBA/ストライプ長)により算出される。物理記憶領域の格納アドレスは、ドライブ番号、LBA、及びデータ長で指定される。
【0102】
図8の例において、一つのストライプが二つの物理領域(ブロック)に分かれて格納されている。データマッピングテーブル701は、LDEV番号0、ストライプ番号0、ストライプ内LBAオフセット0のデータは、ドライブ番号0x43、LBA0x0003、データ長8の領域に格納されていることを示す。さらに、LDEV番号0、ストライプ番号0、ストライプ内LBAオフセット1のデータは、ドライブ番号0x42、LBA0x0007、データ長8の領域に格納されていることを示す。
【0103】
物理記憶領域は、さらに、格納しているデータの状態を示す情報を格納する。状態情報は、データが対応する冗長コードノードにコピー済(転送済)であるか否かを示す。後述するように、ライトデータ(ストライプ)は、Sync/Asyncの設定に従って、ライトデータ(ストライプ)のホストライト処理と同期又は非同期に、冗長コード生成のために冗長コードノードに転送される。
【0104】
冗長コードマッピングテーブル702は、当該テーブル701を保持するノード101が自系のストレージデバイス(ドライブ113)に格納している冗長コードを管理する。管理される冗長コードは、サイト間冗長コード(ジオ冗長コードR)、サイト内冗長コード(サイト冗長コードQ)及びノード内冗長コード(ノード冗長コードQ)を含む。ノード101は、ストライプを格納するプールボリュームの論理アドレスから、当該ストライプの冗長コードの物理アドレスを知ることができる。
【0105】
冗長コードマッピングテーブル702は、冗長コードの生成に使用されたストライプのプールボリュームの論理アドレスと、ドライブ113(自系のストレージデバイス)の物理記憶領域の物理アドレスとを対応づける。冗長コードは、複数のストライプを元にした
演算(例えばxor)で生成される。したがって、冗長コードの物理アドレスに対して、複数のストライプの論理アドレスが関連付けられる。
【0106】
図8は、二つのストライプから一つの冗長コードを生成する例を示す。
図8の例において、冗長コードマッピングテーブル702は、一つのジオ冗長コードの物理アドレスと、当該ジオ冗長コードの生成に使用された二つのストライプの論理アドレスとの関係を示す。ストライプの論理アドレスは、サイト、ノード、プールボリュームの識別子及びボリューム内アドレスで示される。ジオ冗長コードは、物理記憶領域において、二つのアドレス領域(ブロック)に分かれて格納されている。
【0107】
例えば、サイト番号4、ノード番号3、LDEV番号7、ストライプ番号8のストライプにおけるLBAオフセット0のブロックと、サイト番号6、ノード番号5、LDEV番号4、ストライプ番号13のストライプにおけるLBAオフセット0のブロックから生成されたジオ冗長コードのブロックは、ドライブ番号0x40、LBA0x0020、データ長8の領域に格納されている。
【0108】
本例の分散型ストレージシステムは、ログ構造化方式でデータを格納する。ログ構造化方式は、論理アドレスのデータが新たなデータで更新される場合に、物理アドレスのデータを新たなデータ更新することなく、新たなデータを新たな物理アドレスに追記する。不要なデータは、適宜消去される。ログ構造化方式により、ノード冗長コードPの更新のための読み出しが不要であり、ドライブ113へのライト処理の時間を短縮できる。分散型ストレージシステムは、ログ構造化方式を実装しなくてもよい。
【0109】
したがって、論理アドレスのデータとして、旧データと新データとが物理記憶領域に格納され得る。ログ構造化マッピングテーブル213は、論理アドレスと最新データの物理アドレスとの関係の他、論理アドレスと旧データの物理アドレスとの関係の情報、データの世代管理情報を保持する。複数ストライプから生成される冗長コードの世代管理の情報は、冗長コード生成に使用された各ストライプの世代情報を示す。
【0110】
また、データマッピングテーブル701や冗長コードマッピングテーブル702に、データ保障コード(ライトシーケンス番号、CRC等)を付加してもよい。本情報を付加することで、本マッピングテーブルの情報をアドレス変換時に1回参照するだけで、データの整合性をチェックできる。
【0111】
逆マッピングテーブル703は、上記テーブル701、702の逆変換テーブルである。つまり、逆マッピングテーブルは、物理領域のアドレスからプールボリュームのアドレスへの変換のために参照される。逆マッピングテーブル703は、物理領域においてデータを格納するアドレス領域731のそれぞれに対応する論理アドレスを示すテーブル732を含む。
【0112】
テーブル732のそれぞれは、データのタイプ(ストライプ/ジオコード/サイトコード/ノードコード)、インデックス数(リファレンスの個数)、更新日時、リファレンス(対応するプールボリューム領域、サイト番号、ノード番号など)を含む。
【0113】
例えば、
図8は、一例として、ジオ冗長コードを格納する物理アドレスに対応する論理アドレスの情報を示す。本例は、
図8における冗長コードマッピングテーブル702の例と一致している。データタイプはジオ冗長コードであり、インデックス数は2である。これは、ジオ冗長コードの生成に二つのストライプが使用されていることを示す。
【0114】
リファレンスは、ジオ冗長コードの生成に使用されたストライプの格納先論理アドレス
を示す。論理アドレスは、サイト番号、ノード番号、LDEV番号及びストライプ番号及びオフセットで示されている。
【0115】
上述のように、冗長コードの元となるストライプそれぞれの転送元アドレスと冗長コードの物理アドレスとを関連付けて管理することで、様々なストライプ組み合わせの冗長コードを適切に管理することができる。
【0116】
ドライブ113が不揮発媒体を含む場合、ノードは、ユーザデータのドライブライト時に同期して逆マッピングテーブル703に更新情報を追記してもよい。これにより、不測の電源消失時のデータ復旧を可能とする。ノード101は、メモリ118に格納し、ユーザデータのドライブライトとは非同期に、ドライブ113内の逆マッピングテーブル703を更新してもよい。不測の電源消失時のデータ復旧を可能とするために、逆マッピングテーブル703は、ライトシーケンス番号を保持してもよい。逆マッピングテーブル703は、最新データの情報に加え旧データの情報も保持してもよい。
【0117】
図9は、ローカル領域制御テーブル214の構成例を示す。
図9において、矢印はポインタを表す。ローカル領域制御テーブル214は、有効リスト801A、無効リスト801B、フリーリスト801C、ローカル領域量テーブル802を含む。ローカル領域制御テーブル214は、ノード101内にあるドライブ113の領域を管理する。リスト801A~801内の矢印はポインタである。リスト801A~801において、各領域はドライブ番号及びドライブ内のLBAで示される。
【0118】
有効リスト801Aは、有効領域のリストである。有効領域は、最新のユーザデータ又は最新の冗長データを格納する領域である。
図9の例において、ドライブ番号0のドライブ113において、LBA0、4、5のブロックは、それぞれ、有効データを格納している。
【0119】
無効リスト801Bは、無効領域のリストである。無効領域は、古いユーザデータ又は古い冗長コードを格納する領域である。古く、無効な冗長コードは、当該冗長コードの生成に使用されている全ストライプが無効である冗長コードである。
図9の例において、ドライブ番号0のドライブ113において、LBA1、3、7のブロックは、それぞれ、無効データを格納している。フリーリスト801Cは、未使用領域のリストである。
【0120】
ローカル領域量テーブル802は、各ストライプタイプ、ノード冗長コード、サイト冗長コード、ジオ冗長コード、スペア領域の目標使用量、実際使用量、有効領域の量を管理する。ノード101は、階層毎にローカル領域量テーブル802を保持する。ローカル領域量テーブル802の各エントリは、全階層の総量を示してもよい。ストライプタイプ及び冗長コードそれぞれの量を個別に管理することで、各種データのための量を適切に制御できる。プロセッサ119は、ホストI/Oと同期又は非同期に、ローカル領域制御テーブル214を更新する。
【0121】
例えば、ローカル領域量テーブル802は、自ノード101が所属するストライプタイプのエントリのみを保持する。ローカル領域量テーブル802は、他ノード101から転送されたデータの使用量を管理するため、自ノード101が属さないストライプタイプのデータのためのエントリを含んでもよい。
【0122】
図10は、キャッシュ情報204の例を示す。ノード101は、それぞれ、固有のキャッシュ情報204を保持する。キャッシュ情報204は、データダーティキュー900、コードダーティキュー901、クリーンキュー902、フリーキュー903、中間ダーティキュー904を含む。ダーティキュー900、901、904は、ドライブ113に未
反映なキャッシュ181上のデータを示す。
【0123】
キューにおけるセルはエントリを示し、エントリの情報は、キャッシュビットマップテーブル905内の情報に対応し、キャッシュビットマップテーブル905から選択された情報を格納する。キュー内の矢印は、エントリ間をつなぐポインタを表す。黒丸は始点である。
【0124】
データダーティキュー900は、自系のドライブ113に格納されるホストからのライトデータ(ストライプ)を示す。ライトデータは、いずれかのサイトストライプタイプに属する。データダーティキュー900は、当該ノード101がデータノードとして属するサイトストライプタイプ毎のキューを含む。
【0125】
コードダーティキュー901は、ドライブ113に未反映なキャッシュ181上の、冗長コード生成ためのストライプを指す。当該ストライプ及び当該ストライプから生成される冗長コードは、ダーティデータである。
【0126】
コードダーティキュー901は、冗長コード生成のために他ノードから受信したストライプのためのキューを含む。ノード101は、複数保護レイヤに属するため、異なる保護レイヤのストライプタイプのキューが用意される。
図10の例においては、サイトストライプタイプ及びジオストライプタイプのキューが示されている。ストライプタイプとデータ位置(ノード)との組毎のダーティキューが使用される。
【0127】
各キューは、対応ストライプタイプに属し、対応ノードの物理領域に格納されるデータのリストを示す。「SITE STRIPETYPE#0、0」のキューは、サイトストライプタイプ番号0のサイトストライプに属し、ノード番号0のノードに格納されるデータのためのキューである。
【0128】
中間ダーティキュー904は、ドライブ113に未反映なキャッシュ181上の中間コードを指す。中間コードは、新ストライプと旧ストライプから生成されるデータである。例えば、新ストライプと旧ストライプのxorである。中間コードは、新ストライプと旧ストライプの差分データであり、ノード101は、中間コードを使用してドライブ113に格納されている旧ストライプの冗長コードを、新ストライプの冗長コードに更新することができる。中間コードの使用方法の詳細は後述する。
【0129】
中間ダーティキュー904の構成は、ダーティキュー901における冗長コード用のキューと同様である。つまり、本例において、ストライプタイプとデータ位置(ノード)との組毎のキューが使用される。ノード101は、複数保護レイヤに属するため、異なる保護レイヤのストライプタイプのキューが用意される。
図10の例においては、サイトストライプタイプとジオストライプタイプのキューが示されている。
【0130】
クリーンキュー902は、ドライブ113に反映済みのキャッシュ181上のデータを指す。フリーキュー903は、使用されていないキャッシュ181の領域を指す。
【0131】
キャッシュビットマップテーブル905は、データの論理アドレス、キャッシュアドレス(メモリ上の位置)、サイズと、ダーティビットマップ、及びステージングビットマップを含む。例えば、一つのエントリは、キャッシュ181内の所定サイズの一スロットの情報を示す。
【0132】
論理アドレスは、
図8を参照して説明したストライプの論理アドレスが対応する。他ノード101から転送されたストライプの論理アドレスは、例えば、サイト番号、ノード番
号、LDEV番号、及びLBA、オフセットを含む。ダーティビットマップは、その領域のどの部分がダーティ状態かを示す。ステージングビットマップは、当該領域のどの部分がキャッシュ181上にステージング済みかを示す。たとえば、1ビットはドライブ113の1ブロックに対応する。
【0133】
図11は、サイト保護レイヤ(レイヤ番号2)のマッピングイメージを示す。基本的に、ノード保護レイヤ(レイヤ番号1)及びジオ保護レイヤ(レイヤ番号3)のマッピングイメージも同様である。以下において、ストライプタイプのサイクル数はc、冗長コード数(パリティ数)はp、ストライプ数(データ数)はdと表される。
【0134】
図11の例において、サイクル数は5、冗長コード数は1、ストライプ数は3である。具体的には、一つのサイトストライプタイプにおいて、最大三つのストライプから一つの冗長コードが生成され、サイトストライプタイプ内のノードに格納される。後述するように、冗長コードは、3以下のいずれかの数のストライプから生成される。複数冗長コードが生成される場合、異なる冗長コードノードに分散格納される。
【0135】
表621は、ストライプタイプのデータノードと冗長コードノードとを示す。列はそれぞれ、ノード番号0~8のノードに対応する。ノード番号0~8のノードの物理記憶領域を示す円柱622のそれぞれの容量は、円柱の高さで示されている。
【0136】
表621において、セル内の数字はストライプタイプ番号を示す。D領域内のセルは、データノードが属するストライプタイプ番号を示す。Q領域内のセルは、冗長コードノードが属するストライプタイプ番号を示す。
【0137】
S領域のセルは、スペアノードが属するストライプタイプ番号及び格納するデータ種別(ストライプ/冗長コード)を示す。スペアノードは、ノードにおいて障害が発生した場合に、当該ノードのデータを一時的に格納するノードである。これにより、ノード障害時に、冗長度が回復される。
【0138】
ライトデータのストライプタイプ番号は、当該ライトデータのストライプ番号及び当該ライトデータを受信し、格納するノードのノード番号により決定される。具体的には、ノード101は、(ライトデータの論理アドレス値÷ストライプサイズ)によりストライプ番号を決定する。本例において、論理アドレスは、プールボリューム内の論理アドレスである。仮想ボリューム内の論理アドレスを使用してもよい。さらに、ノード101は、(ストライプ番号modc)により、当該ライトデータの行番号を算出する。
【0139】
ノード101は、レイヤ番号2のサイト静的マッピングテーブル211を参照して、自装置のノード番号と算出した行番号から、ストライプタイプ番号を決定する。例えば、ノード101は、サイト静的マッピングテーブル211において、データノードとして自ノード番号を含むエントリを選択し、行番号が示す順番のエントリのサイトストライプタイプ番号を、当該ライトデータのサイトストライプタイプ番号と決定する。
【0140】
さらに、ノード101は、レイヤ番号2のサイト静的マッピングテーブル211を参照して、ストライプが属するライトストライプタイプの冗長コードノードを決定する。この点は、後述するライト処理の説明において改めて説明する。
【0141】
図11において、例えば、ノード番号0、5、7のノードにおける行番号0のストライプは、ストライプタイプ番号0のストライプタイプに属する。ノード番号1、3、8のノードにおける行番号4のストライプは、ストライプタイプ番号13のストライプタイプに属する。
【0142】
さらに、ストライプタイプ番号0のストライプタイプに属する冗長コードノードのノード番号は1であり、ストライプタイプ番号13のストライプタイプに属する冗長コードノードのノード番号は4である。いくつかのノードは、複数のストライプタイプの冗長コードを格納する。
【0143】
図11の例において、D領域におけるストライプの分散は均等である。ノードの記憶容量によって、ストライプタイプのデータノード数を変化させてもよい。また、ノードの総数が少ない場合や端数が発生する場合に、一部のストライプタイプの冗長コード数を減らしてもよい。異なるストライプタイプは異なるアルゴリズムにより冗長化を行ってよい。
【0144】
ストライプタイプ内の冗長コードノードは、当該ストライプタイプのデータノードと異なるノードから選択される。冗長コードノードには、データノードからのデータライトが集中する。したがって、冗長コードができるだけ均等に配置されるように、冗長コードノードが選択される。これにより、ノード101の寿命が平準化される。ドライブ113がSSDである場合に特に有効である。ノード間において寿命が偏った場合には、平準化するように冗長コードQの配置を変更してもよい。
【0145】
スペアノードは、ノード障害が発生したときに、冗長度を回復するための一時的な格納先である。冗長コードを格納するスペアノードは、同一ストライプタイプのデータノードとは異なるノードから選択される。
図10の例において、ノード番号6のノードにおいて障害が発生している。ストライプ又は冗長コードのストライプタイプ番号に対応づけられたスペアノードが、対応するストライプ又は冗長コードを一時的に格納する。
【0146】
例えば、ノード番号0のノードは、ノード番号6のノードが格納していたストライプタイプ番号2のストライプを格納する。ノード番号7のノードは、ノード番号6のノードが格納していたストライプタイプ番号3の冗長コードQを格納する。データの回復は、当該データを格納するノード又は異なるノードが実行する。スペアノードに格納されるデータ(ストライプ及び冗長コード)は、ノード回復時やノード増設時に、スペアノードから一つのノードに戻される。
【0147】
上記例において、ストライプタイプは、プールボリュームのLDEV番号に依存せず、プールボリューム内のアドレスにより決定される。異なるプールボリュームの同一ボリューム内アドレスのデータは、同一のストライプタイプの属する。一つのプールボリュームのアドレス領域は、複数のストライプタイプに分類される。後述するように、冗長コードノードは、ストライプのボリューム内アドレスに依存することなく、同一ストライプタイプ内のストライプから、任意数の任意のストライプを選択し、選択したストライプから冗長コードを生成する。
【0148】
図12Aは、分散型ストレージシステムにおける、ノード101の状態遷移を示す。
図12Bは、分散型ストレージシステムにおける、サイト102の状態遷移を示す。基本的に、各保護レイヤにおいて、状態遷移は同様である。
【0149】
通常状態は、初期状態及び動作中の通常状態を示す。状態は、ドライブ障害が発生した場合にリビルド中状態に移行する。ノード101は、リビルド中に、コレクションリード・ライトにより、アプリケーションのI/Oを受け付けることができる。
【0150】
閉塞状態において、ノード101はダウンしており、I/Oを実行できない。しかし、ドライブ113は故障していない場合がある。その場合、閉塞を起こしたノード101に閉塞発生後に新規にライトされたデータのみを反映するデータリシンクにより、データを
復旧し、閉塞状態を通常状態に変化させることができる。
【0151】
図13は、分散型ストレージシステムの一つノード101における、仮想プロビジョニングレイヤの論理構成例を示す。仮想ボリューム1301A、1301Bは、ホスト(同一ノード又は他ノード)ら認識される仮想的な記憶領域であり、ホストからリード又はライト命令が発行される際に対象となるボリュームである。
【0152】
プール1306は、1以上のプールボリュームにより構成される。
図13の例においては、プール1306は、プールボリューム1303A~1303Fを含む。プール1306は、他ノードのプールボリュームを含んでもよい。プールボリューム1303A~1303Fは、ドライブ113の記憶領域によって構成される。具体的には、プロセッサ119は、プールボリュームの論理アドレスと、ドライブ113の物理アドレスの対応関係を管理することにより、論理的なプールボリュームを構成する。詳細については後述する。
【0153】
ストレージ管理者は、入出力デバイスを介したプロセッサ119への指示により、プール1306上に、複数の仮想ボリュームを作成することができる。プロセッサ119は、仮想ボリュームにおいてライト命令が発行された記憶領域にのみ、プール1306から実記憶領域を割り当てる。
【0154】
図13の例において、仮想ボリューム1301Aは仮想ページ1302A、1302B、1302Cを含み、それぞれに、論理ページ1304A、1304E、1304Cが割り当てられている。仮想ボリューム1301Bは仮想ページ1302D、1302Eを含み、それぞれに、論理ページ1304D、1304Fが割り当てられている。
【0155】
論理ページは動的に仮想ページに割り当てられる。例えば、仮想ボリューム1301Aの仮想ページ1302Aに、初めてライト命令が発行された際に、プロセッサ119は、プールボリューム1303Aの未使用の領域(論理ページ1304A)と対応づける(対応づけ1305A)。次回の同ページへのリード/ライト命令に対しても、プロセッサ119は、対応づけ1305Aに基づき、プールボリューム1303Aの論理ページ1304Aに対するI/O処理を実行する。
【0156】
上記動作により、ノード101が、あたかも仮想ボリュームに対してI/O処理(アクセス処理)を実行しているように、ホストに見せることができる。仮想ボリュームを用いて、使用する領域にのみプールボリュームの領域を割り当てることにより、限られた記憶領域を効率的に使用できる。プロセッサ119は、仮想ページに割り当てられている論理ページの全データが消去されると、当該仮想ページと論理ページの対応づけを解消し、当該論理ページを未使用ページとして管理する。これにより、限られた記憶領域をより効率的に使用できる。
【0157】
プール1306は、複数の階層115、116、117からなる。本例において、プール1306は、SSD階層115(TIER1)、SAS階層116(TIER2)、SATA階層117(TIER3)の3階層を持つ。SSD階層115の性能が最も高く、SATA階層117の性能が最も低い。プールボリュームは、階層115、116、117に分類され、プールボリュームいずれかの階層に属する。プールボリューム1303Aは階層115に属し、プールボリューム1303B、1303Cは階層116に属し、プールボリューム1303D、1303Eは、階層117に属する。
【0158】
各仮想ページは、ホストからのI/O処理の特性を有する。例えば、I/O頻度(アクセス頻度)が高い仮想ページと低い仮想ページが存在する。これをアクセスローカリティと呼ぶ。I/O頻度が高い仮想ページを上位階層に配置する、つまり、I/O頻度が高い
仮想ページを上位階層の論理ページに割り当てる。これにより、システム全体の性能を向上ができる。なお、仮想ページがいずれかの階層の論理ページに割り当てられているとき、当該仮想ページは階層に割り当てられている又はプールボリュームに割り当てられている、とも表現される。
【0159】
例えば、100IOPSを処理できるSSD階層115と、10IOPS処理できるSAS階層116がプール1306に存在し、20IOPSの特性を持つ仮想ページ1302Aと、50IOPSの特性を持つ仮想ページ1302Cがあるとする。ページ1302AがSSD階層115に割り当てられ、ページ1302CがSAS階層116に割り当てられているとする。SAS階層116は最大で10IOPSの性能しか発揮できないため、ノード101は、全体として10+20=30IOPSの性能しか発揮できない。この状態をネック状態と呼ぶ。
【0160】
仮想ページ1302Cの割り当てを、SAS階層116から、SSD階層115へプロモーションすることができれば、ノード101は、全体として50+20=70IOPSの性能を発揮できる。以上のように、I/O頻度が高い仮想ページを上位階層に割り当てることで、システム全体の性能を向上することができる。
【0161】
上記プロモーションは、論理ページ1304Cのデータを未使用の論理ページ1304Bにコピーし、仮想ページ1302Cと論理ページ1304Cとの対応づけ(1305C)を、仮想ページ1302Cと論理ページ1304Bとの対応づけ(1305B)に変更する。ページのデモーションも、同様に実行可能である。
【0162】
グラフ271は、ページのI/O頻度(I/O負荷)の分布を表す。プロセッサ119は、ページ負荷分布テーブル217から、当該グラフ271を示す負荷分布データを作成することができる。分布ライン1309は、I/O頻度の多い順番にページを並べたときの、各ページのI/O数を表す線である。つまり、I/O数の多いページが左側に、I/O頻度が少ないページが右側に位置する。階層割り当て閾値1308A、1308Bは、どのI/O頻度のページをどの階層に割り当てるかを決める閾値である。
【0163】
前述した通り、I/O頻度が高いページを上位階層に割り当てることで、システム全体の性能を向上することができる。したがって、I/O頻度の高い順番で上位階層から仮想ページを割り当てられる。ストレージシステムを起動した後、ページ負荷分布271を未作成の段階時、階層割り当て閾値1308A、1308Bの初期値は、例えば0でもよい。
【0164】
例えば、プロセッサ119は、階層割り当て閾値1308Aと分布ライン1309の交点から、最もI/O頻度が高いページ範囲1310Aに属するページを、SSD階層115に割り当てる。プロセッサ119は、階層割り当て閾値1308Aと分布ライン1309の交点から階層割り当て閾値1308Bと分布ライン1309の交点までの範囲210Bに属するページを、SAS階層116に割り当てる。プロセッサ119は、階層割り当て閾値1308Bと分布ライン1309の交点から最小のI/O頻度のページまでは、SATA階層117に割り当てる。
【0165】
ストレージ管理者は、階層割り当て閾値1308A、1308Bの値を指定してもよいし、プロセッサ119は、階層割り当て閾値1308A、1308Bの値を計算してもよい。例えば、プロセッサ119は、仮想ページのI/O頻度分布、階層の容量、及び当該階層のドライブ性能に基づき、当該階層を定義する階層割り当て閾値を決定してもよい。階層のドライブ性能は、例えば、当該階層における単位時間当たりのIOデータ量により予め定義されている。
【0166】
図14は、分散型ストレージシステムにおける複数ノードのページマッピングの例を示す。
図14において、分散型ストレージシステムは、仮想ボリューム1301A~1301Cを提供する。ノード101Aは仮想ボリューム1301Aを提供する。ノード101Bは、仮想ボリューム1301A、1301Bを提供する。ノード101Nは、仮想ボリューム1301Cを提供する。
【0167】
ノード101(ノード101A~101Nの任意ノード)は、二種類のボリュームを保持し得る。一つは、自系のドライブ113の記憶領域からなるプールボリューム1303Aである。プールボリューム1303Aが格納するデータは、自系のドライブ113に配置される。
【0168】
他の一つは、他のノード101のプールボリューム1303Bをストレートマッピングするボリューム1303Cである。ボリューム1303Cは、プールボリュームとして管理される。ノード101は、プールボリューム1303Cを介して、他系のプールボリューム1303BのI/O処理を行うことができる。
【0169】
この機能は、ストレージ外部接続機能として知られている。ノード101は、ボリューム1303Cのアクセス先アドレスを、他系のプールボリューム1303Bのアドレスに変換して、当該他系のノード101にコマンドを送信する。ノード101は、自系のプールボリューム1303Cと他系のプールボリューム1303Bとの間の不図示のアドレスマッピングテーブルを保持する。
【0170】
プロセッサ119は、自系でのホストアクセス量が多い仮想ページを、Ownのプールボリューム1303Aにマッピングし、他系でのホストアクセス量が多い仮想ページを、当該他系のプールボリューム1303Bにマッピングする。これにより、ホストへレスポンスタイムを短縮する。他系のプールボリューム1303Bに割り当てられた仮想ページのデータは、他系のドライブ113に格納される。
【0171】
各ノード101は、ネットワーク性能及び各階層の自系のドライブ性能に基づき、マッピングする他系のプールボリュームの数や、他系のプールボリュームに割り当てる仮想ページを選択し、ネットワークがボトルネックとならないように論理ページを配置する。この配置の詳細は
図23、24A、24Bを参照して後述する。
【0172】
分散型ストレージシステムは、システム全体で記憶容量を管理し、各ノード101のプールボリュームの数を、仮想ボリュームのページ使用容量に応じて増減させてもよい。ノード101は、プールボリューム1303Aを、仮想ボリュームとしてストレートマッピングによって使用してもよい。これにより、マッピングテーブルのメモリ使用量を削減でき、性能及び可用性を高めることができる。
【0173】
図15は、分散型ストレージシステムのリード処理のフローチャートを示す。プロセッサ119は、受信したリード命令の指定アドレスに対して、アクセス先仮想ページがプールボリュームに未割り当てか否かを、ページマッピングテーブル215を参照して判定する(S501)。指定アドレスは、例えば、仮想ボリューム番号及び論理アドレスで指定される。LBAは、開始LBA及びブロック長で表わされる。
【0174】
仮想ページが未割り当ての場合(S501:Y)、プロセッサ119は、排他が必要か否か判定する(S506)。プロセッサ119は、仮想ボリューム管理テーブル218を参照し、仮想ボリュームのオーナノードが自ノードのみの場合に排他不要と判定する。
【0175】
排他が必要の場合(S506:Y)は、プロセッサ119は、排他を取得して(S507)、再度、仮想ページがプールボリュームに未割り当てか否かを判定する(S508)。排他方法の一例において、プロセッサ119は、リードアドレスから一意に決まる代表ノードをハッシュ関数を使用して特定し、代表ノードに調停を依頼し、代表ノードが調停を行う。
【0176】
仮想ページが割り当て済みの場合(S508:N)、プロセッサ119は、排他を解除し(S512)、ステップS502に進む。仮想ページが論理ページに未割り当てである場合(S508:Y)、プロセッサ119は、ゼロデータを返し(S509)、ステップS506の判定と同様に排他要否を判定する(S510)。排他が必要である場合(S510:Y)には、排他がすでに取得されているため、プロセッサ119は、排他を解放する(S511)。
【0177】
ステップS501において仮想ページが割り当て済みであり(S501:N)、且つ仮想ページがプールボリュームに割り当てられている場合(S502:Y)、プロセッサ119は、自系のキャッシュ領域を確保し、当該プールボリュームからデータをリードして、当該リードデータ返す(S504)。プロセッサ119は、プールボリューム管理テーブル219及び不図示の外部接続管理情報を参照して、仮想ページが自系のプールボリュームに割り当てられているか否か判定する。
【0178】
仮想ページが自系のプールボリューム1303Cを介して他ノード101のプールボリューム1303Bに割り当てられる場合、当該仮想ページは他系のプールボリュームに割り当てられていると判定される。
【0179】
キャッシュ領域の確保において、プロセッサ119は、キャッシュ情報204を参照して、対象論理アドレスに対応付けられているキャッシュ領域を特定する。対応するキャッシュ領域が存在しない場合、プロセッサ119は、フリーキュー903から新たな領域を確保する。フリーキュー903が空の場合、プロセッサ119は、クリーンキュー902から新たな領域を確保する。クリーンキュー902が空の場合、プロセッサ119は、ダーティキュー900、901又は904内の領域をデステージしてフリー領域に変化させる。
【0180】
アクセス先仮想ページが他系のプールボリュームに割り当てられている場合(S502:N)、プロセッサ119は、当該他のノード101にリード命令を転送する(S505)。プロセッサ119は、自系ではリードデータをキャッシュしない。つまり、仮想ページの割り当て先が他ノードであれば、プロセッサ119は、リードデータを自系メモリ118にキャッシュせず(リードスルー)、他ノード101がリードデータをキャッシュする。
【0181】
図16は、同期ライト処理のフローチャートを示す。本処理は、ホスト(例えばアプリケーションプログラム)からライト命令が発行された場合に実行される。本処理は、自系のプールボリュームにライトデータを格納することに加え、サイト冗長コード(ノード間冗長コード)及びジオ冗長コード(サイト間冗長コード)を生成するために、他ノード101にライトデータを転送する。
【0182】
ライト命令を受けたノード101のプロセッサ119は、ページが未割り当てかどうかを判定する(S601)。具体的には、プロセッサ119は、ページマッピングテーブル215を参照し、ライト命令の指定アドレス(仮想ボリューム番号及びLBA)から、対応するプールボリューム番号とLBAを検索する。プロセッサ119は、対応するアドレス情報の有無で、仮想ページが未割り当てか否かを判定する。
【0183】
本例のシステムでは、複数のアプリケーションが起動されており、システム内の少なくとも1つのノードがそれぞれのアプリケーションを動作させている。ここで、データの読み出し要求は、そもそも当該データのライト命令を受けたノードに出されることが多いと考えられる。よって本願では、ノードはライト要求を受けた場合にそのライト要求のデータを当該ノードの記憶領域に優先して格納する。これにより、リード要求に対して当該ノードから読み出しできる確率が高まり、読み出し要求に高速に応えることが可能となる。
【0184】
但し、ノード101に接続されたドライブ113の性能がネットワーク103の性能に対して低い場合は、多数のノードにデータを分散させたほうが、システムとしてのスループットを向上できる場合がある。以上のことを考慮し、ネットワーク103の性能やノード101に接続されたドライブ113の性能に応じて、割り当て先の記憶領域を、ラウンドロビン等の技法を用いて変更してもよい。また上述の割り当て方針は、性能という指標に基づくだけでなく、ドライブ113としてフラッシュを用いた場合には寿命などの指標を用いて、コスト対効果を効率化することも考えられる。
【0185】
仮想ページが未割り当ての場合(S601:Y)、プロセッサ119は、仮想ページをプールボリュームに割り当てる処理を実行する。プロセッサ119は、まずページマッピングテーブル215の更新の排他が必要か否か判定する(S611)。排他を取得する理由は、他ノード101で同時に仮想ページを割り当てる場合に、仮想ページに対して、複数の異なるプールボリュームの領域が割り当てられることを防ぐためである。
【0186】
プロセッサ119は、仮想ボリューム管理テーブル218を参照し、オーナノードに自ノード以外が含まれている場合は、排他が必要であると判定し、オーナノードが自ノードのみである場合、排他が不要であると判定する。排他が必要と判定した場合(S611:Y)、プロセッサ119は、排他を取得する(S612)。排他の取得方法は、
図16で説明したリード処理において示した方法と同様である。
【0187】
次に、プロセッサ119は、仮想ページが未割り当てか否かを、再度判定する(S613)。これは、ステップS601で仮想ページが割り当て済みか否かを判定した後、ステップS612で排他を取得する前に、他ノードによって排他が取得されている可能性があるからである。
【0188】
ページが未割り当てである場合(S613:Y)、プロセッサ119は、仮想ページを割り当てるプールボリュームを決定する(S614)。プロセッサ119は、まず自系のプールボリュームに空きページがあるかどうかをチェックする。
【0189】
具体的には、ローカル領域量テーブル802の目標量と使用量を参照し、ライトデータのストライプタイプのエントリにおいて、使用量が目標量より少ないかを判定する。使用量が目標量より少ない場合、プロセッサ119は、当該仮想ページを自系のプールボリュームに割り当てる。例えば、ノード101は不図示のローカル領域階層管理情報を保持し、空きページを含む最上位階層のプールボリュームを選択する。
【0190】
空き領域が自系に存在しない場合、プロセッサ119は、他系(他ノード)のプールボリュームをローカルにマウントし、その領域にページを割り当てる。プールボリュームを決定すると、プロセッサ119は、当該プールボリュームに仮想ページを割り当てる(S615)。具体的には、プロセッサ119は、ページマッピングテーブル215の対応関係を更新する。
【0191】
本ステップにより、ライト要求を受けたノードが既に多くの記憶容量を消費している場
合や、ノードのドライブ113の性能が不足している場合には、他のノードの記憶領域を利用することによって、ライト要求受けたノードの性能劣化を防止してシステム全体の容量効率と性能維持を図る。
【0192】
次に、プロセッサ119は、排他が必要か否かを判定する(S616)。この判定は、ステップS611と同様である。排他が必要な場合(S616:Y)、プロセッサ119は、取得済みの排他を解放する(S618)。排他が不要な場合(S616:N)、プロセッサ119は、ステップS602に進む。
【0193】
プロセッサ119は、ライト命令の仮想ボリュームにおける論理アドレス(仮想ページ)が、自系プールボリュームに割り当てられているかを、ページマッピングテーブル215を参照して判定する(ステップ602)。
【0194】
自系プールボリュームに割り当てられていない場合(S602:N)、プロセッサ119は、他ノード101にライト命令を転送する(S603)。他ノード101は、本フローチャートに従ったライト処理を実行する。データコヒーレンシの維持のため、プロセッサ119は、自系でライトデータをキャッシュしない。
【0195】
仮想ページが自系プールボリュームに割り当てられている場合(S602:Y)、プロセッサ119は、保護レイヤ毎のライト処理を開始する(S604~S610)。例えば、分散型ストレージシステムが三つの保護レイヤで構成されているとする。それらは、例えば、ノード保護レイヤ、サイト保護レイヤ、ジオ保護レイヤである。プロセッサ119は、3レイヤで計3回処理を繰り返す。なお、本例において、ノード保護レイヤは、同期ライトに設定されている。
【0196】
プロセッサ119は、当該レイヤが同期ライト対象かどうかを判定する(S604)。具体的には、プロセッサ119は、仮想ボリューム管理テーブル218において、ライト対象の仮想ボリュームに対応するSync/Asyncフィールドを参照して判定する。
【0197】
同期ライトの対象ではない場合(S604:N)、プロセッサ119は、ライトデータ(ストライプ)を他ノード101に転送することなく、データマッピングテーブル701の領域の状態フィールドに”未完了”と記録する。状態フィールドは、各保護レイヤの状態を示す。状態フィールドが”未完了”を示すキャッシュ181上のデータは、転送まで維持される。
【0198】
プロセッサ119は、全ての保護レイヤが完了したかを判定し(S608)、完了していたら本処理を終了する。完了していない場合(S608:N)、プロセッサ119は、次の保護レイヤの処理をステップS604から繰り返す。同期ライト対象の場合(S604:Y)、プロセッサ119は、自系のキャッシュ領域181において、キャッシュ確保を実施する(S605)。その方法は、
図15を参照して説明した方法と同様である。
【0199】
次に、プロセッサ119は、中間コードを転送するか否か判定する(S606)。中間コードは、旧データ(今までの最新データ)と新データ(今回書き込むデータ)の更新差分を表す。例えばRAID5に相当する冗長データの場合、中間コードは、旧データと新データのxor値である。その他、Erasure Codingを用いる場合、プロセッサ119は、行列の係数を乗算した複数のxor結果を生成してもよい。
【0200】
中間コード転送の要否の判定基準としていくつかの基準を使用することができる。例えば、プロセッサ119は、転送先ノード101の冗長コード領域の残量が閾値より少ないとき、中間コード転送要と判定する。これにより、転送先ノードで必要な冗長コードを確
実に格納できる。プロセッサ119は、転送先ノード101のローカル領域量の情報を転送先ノード101から取得する。
【0201】
プロセッサ119は、自系においてキャッシュヒット時のレスポンス低減効果が小さい場合に、中間コードを生成してもよい。例えば、自系において書き込むモードが設定されているとき、自系において所定の低レイテンシドライブが使用されているとき、自系が閾値より高い負荷状態の時、又は、ノード間通信距離が閾値より長いとき、プロセッサ119は、中間コードを転送する。
【0202】
または、プロセッサ119は、ドライブ113のライト寿命が十分ある場合に、中間コードを転送する。なお、書き込むモードにおいて、プロセッサ119は、ライトデータをキャッシュ181からドライブ113にデステージした後に、ホストに完了応答を返す。
【0203】
中間コード転送要と判定した場合(S606:Y)、プロセッサ119は、キャッシュ181上のストライプ(ライトデータ)とドライブ133から読み出した旧ストライプとから中間コードを生成し(S609)、対象ノード(転送先ノード)のキャッシュ181に中間コードを書き込む(S610)。
【0204】
プロセッサ119は、中間コードの対象ノード(転送先ノード)を以下の方法で特定する。プロセッサ119は、下記式により、行番号(
図11におけるD領域の縦軸の値)を算出する。行番号の算出方法は、
図11を参照したストライプの行番号の算出方法と同様である。
(アドレス値/ストライプサイズ)modc
【0205】
プロセッサ119は、算出した行番号と自ノード番号とから、当該保護レイヤの静的マッピングテーブルを参照して、ストライプタイプ番号(
図11における図中のセル内の数字)を決定する。
【0206】
プロセッサ119は、当該保護レイヤの静的マッピングテーブルを参照して、ストライプタイプ番号から、転送先ノード101を決定する。プロセッサ119は、転送先ノード101の宛先に、自アドレス情報(サイト番号、ノード番号、LDEV番号、LBA、TL(Transfer Length))及び中間コードであることを示す識別子と共に、中間コードを転送する。LDEV番号はプールボリュームの識別子である。
【0207】
プロセッサ119は、例えば、レイヤ番号2の静的マッピングテーブル211を参照して、サイト冗長コードQを最終的に格納する冗長コードノードを、転送先ノードと決定する。
【0208】
プロセッサ119は、例えば、レイヤ番号3の静的マッピングテーブル212Aを参照して、転送先サイト(ジオ冗長コードRの格納サイト)を決定する。例えば、サイトの代表ノード101が予め設定されており、プロセッサ119は、当該代表ノード101に上記付随しデータと共に、中間コードを転送する。
【0209】
代表ノード101は、ハッシュ関数を使用して転送元アドレス情報からハッシュ値を算出する。代表ノード101は、コンシステントハッシングテーブル212Bを参照し、算出したハッシュ値から、転送先ノード101を決定する。当該ノード101が、ジオ冗長Rの最終的な格納ノード(冗長コードノード)である。
【0210】
代表ノード101を介したデータ転送方法は、2回のデータ転送を必要とする点、代表ノード101へのアクセス集中、代表ノード101の障害による可用性低下の問題がある
。したがって、複数代表ノード101を用意してラウンドロビンに転送先代表ノード101を選択してもよい。
【0211】
プロセッサ119は、代表ノード101に代わり、直接にジオ冗長コードRを格納する他サイトノードを決定してもよい。具体的には、転送元ノード101は、転送先サイトのコンシステントハッシングテーブル212Bを予め保持し、プロセッサ119は、当該テーブルに従って転送先ノード101を決定する。
【0212】
各ノード101が他サイトのコンシステントハッシングテーブル212Bを保持する場合、コンシステントハッシングテーブル212Bのサイト間の同期がオーバヘッドとなる。そのため、分散型ストレージシステムは、排他更新による密な同期をせず、定期的に更新を行ってもよい。その場合、他サイトから中間コードを受信した宛先ノード101が、正しい宛先であるかを、自サイトのコンシステントハッシングテーブル212Bを参照して判定し、転送先が間違っていた場合、正しいノード101に受信データを転送してもよい。
【0213】
転送先ノード101において、中間コードと同一転送元アドレスのダーティデータが存在する場合、転送先ノード101のプロセッサ119は、中間コードとそのダーティデータのxorを算出して、キャッシュ181上のデータを更新する。転送先ノード101のプロセッサ119は、当該中間コードに関するキャッシュ情報を、中間ダーティキュー904に接続する。転送先ノード101は、同一冗長コードの元となる異なる転送元からの中間コードのxorを算出して、キャッシュ181上のデータを更新してもよい。
【0214】
ステップS606において、中間コードを転送しないと判定した場合(S606:N)、プロセッサ119は、対象ノード(転送先)のキャッシュ181に、ライトデータを書き込む(S607)。本例は、ライトデータを基本的にアクセスを受けたノードに優先して格納する。上述のように、ライト先とは別の対象ノード(転送先)にデータを転送することで、キャッシュ上で冗長性を担保した状態となる。さらに、別途、ノード間の冗長データを生成することで冗長性を維持したまま冗長コードのためのストレージ容量を削減し、効率化する。
【0215】
転送先ノード101の決定方法及びデータ転送方法は、ステップS610における方法と同じである。転送元ノード101は、転送先ノードに、転送データの自アドレス情報(サイト番号、ノード番号、LDEV番号、LBA、TL)と通常データであることを示す識別子と共に、ライトデータを転送する。転送先ノード101において、プロセッサ119は、ライトデータに対応するキャッシュ情報を、対応する冗長コードのダーティキュー901に接続する。
【0216】
ライト流量の低減を目的とし、自系のプールボリュームではなく、他系のプールボリュームへのライトデータのライトにおいて、従来のErasure Coding方式を採用してもよい。従来のErasure Coding方式は、ライトデータをストライプ分割し、分割したデータで冗長データを生成し、分割データと冗長データを複数のノードに分散して格納する。
【0217】
冗長コードにエンコード方式の情報を含めることで、いずれの冗長コード生成方法を使用しているかを判定できるようにしてもよい。従来のErasure Coding方式の適用先は、他系からのリードによってネットワークがボトルネックとならないデータのみに限定してもよい。
【0218】
図17は、非同期ライト処理のフローチャートを示す。本処理は、ホストI/Oとは非
同期に実行され、Asyncが指定された保護レイヤで、まだ他系に転送されていないデータを転送する。
図17におけるステップS702~S708は、
図16におけるステップS605~S608と同様である。ここでは、差分のみを説明する。各ノード101において、プロセッサ119は、ページマッピングテーブル215を参照し、登録されている全仮想ボリュームについて、本処理を実行する。
【0219】
プロセッサ119は、対象の仮想ページが非同期ライトの対象であるかを判定する(S701)。具体的には、プロセッサ119は、データマッピングテーブル701において、仮想ページに対応するプールボリューム上の領域の状態をチェックする。当該保護レイヤにおいて、”未完了”の状態であれば、プロセッサ119は、非同期ライト対象と判定し(S701:Y)、ステップS702に進む。
【0220】
全ての仮想ページの処理が終了したら(S709:Y)、プロセッサ119は、本フローを終了する。プロセッサ119は、非同期ライト処理を周期的に実行してもよいし、常時実行してもよい。プロセッサ119は、”未完了”状態のページ量に応じて本処理の実行頻度やデータ転送速度を動的に変更してもよい。
【0221】
図18は、デステージ処理のフローチャートを示す。本処理はキャッシュ181上にダーティデータ、つまり、ドライブ113に未反映のデータが存在する場合に、ホストI/Oと非同期で実行される。冗長データの生成は、基本的に各ノード内で処理が完結する(ノード内で別の送り主からのデータ同士で冗長データを生成する)ため、冗長データの生成のためのノード間の通信量を低減できる。また、冗長データの送り先は、静的マッピングテーブル211によって多数のノード間で分散しているため、デステージ処を効率的に分散処理することが出来る。
【0222】
キャッシュ181には、2種類のダーティデータが存在する。一つは、自系のドライブ113に格納されるライトデータである。他の一つは、冗長データ生成のために他ノード101から転送されたデータである。ここで、他ノードから転送されたデータは、中間コードを含む。
【0223】
ダーティデータは、データダーティキュー900、コードダーティキュー901及び中間ダーティキュー904で管理されている。
図18のフローチャートは、データダーティキュー900及びコードダーティキュー901で管理されているダーティデータのデステージを示す。
【0224】
本処理が開始されると、プロセッサ119は、データダーティキュー900及びコードダーティキュー901を参照し、対象のダーティデータを見つける。プロセッサ119は、対象データが、自系のドライブ113に格納するライトデータか否かを判定する(S801)。対象データがデータダーティキュー900によって示されている場合、対象データはライトデータである。
【0225】
対象データがライトデータの場合(S801:Y)、プロセッサ119は、当該ライトデータを自系のドライブ113に書き込む(S808)。データは、ログ構造化形式で格納される。ライトデータをドライブ113にログ構造化形式で格納する際に、プロセッサ119は、
図8で示すように、プールボリュームにおける論理アドレスとドライブ113における物理アドレスとの対応関係及びデータの状態を、データマッピングテーブル701に記録する。
【0226】
さらに、プロセッサ119は、逆マッピングテーブル703において、プールボリュームにおける論理アドレスとドライブ113における物理アドレスとの対応関係を記録する
。ドライブ113に空き領域が無い場合、プロセッサ119は、
図19を参照して述べる容量枯渇管理処理を実行してからドライブ113へのデータのライトを実行してもよい。
【0227】
プロセッサ119は、全ダーティデータを処理したかどうかを判定する(S806)。全ダーティデータの処理が終了している場合(S806:Y)、プロセッサ119は、本フローを終了する。
【0228】
対象データがライトデータではない場合、つまり、対象データが冗長コード生成のためのストライプである場合(S801:N)、プロセッサ119は、同一ストライプタイプのダーティデータを見つける(S802)。
【0229】
具体的には、プロセッサ119は、コードダーティキュー901における対象データのキューにおいて、対象データを含む、異なるノード101から転送された複数のストライプを取得する。プロセッサ119は、ユーザ指定されたデータ保護の方針(XDYP:最大Data数Xに対して冗長データ数Y)に従い、できるだけX個のストライプを取得する。データ保護方針のユーザ指定については、
図27を参照して後述する。
【0230】
具体的には、プロセッサ119は、サイト静的マッピングテーブル211又はジオ静的マッピングテーブル212Aが示すデータノードのID数を超えない範囲で、できるだけ多くのストライプを選択する。これにより、できるだけユーザ指定を満たす冗長化を行う。選択するストライプの転送元ノードは、全て異なる。対象データのキューが、当該ストライプタイプに属する全データノードそれぞれからのストライプを示す場合、プロセッサ119は、全データノードからのストライプを選択する。ストライプの選択において、転送元での論理アドレスは問わない。
【0231】
このように、冗長コード生成の要素となるストライプの数は固定されておらず、不定である。また、冗長コード生成の要素となるストライプの論理アドレスの組も不定である。これにより、転送されたストライプのみから効率的に冗長コードを生成できる。コードダーティキュー901において、同一ストライプタイプの他ノード101からのストライプが存在しない場合、プロセッサ119は、単一対象データを冗長コードとして、ドライブ113に格納してもよい。
【0232】
また、同期ライト処理時に、冗長コード生成先のノードにライトデータを転送する場合、その時点では転送元ノードのドライブに、対応するライトデータがデステージされていないタイミングで、新たに同期ライト処理が発生すると、キャッシュ上でライトデータが新しく上書きされ、データの復元ができなくなる可能性がある。
【0233】
このため、冗長データ格納先ノードでは、転送元ノードがデステージ完了したデータのみ冗長データの生成に使用しなければならない。この実現のために、転送元ノードがデステージした旨を、冗長データ格納先ノードに通知し、その通知を受け取った場合のみ冗長データ格納先ノードでのデステージ対象としてもよい。また、上記は転送元ノードでのデステージタイミングで冗長データ格納先ノードにデータ転送するようにしてもよい。また、キャッシュ上のデータ更新時に上書きしないように(例えばログバッファ形式で保存)してもよい。
【0234】
プロセッサ119は、中間ダーティキュー904における同一ストライプタイプのキューからダーティデータを見つけてもよい。プロセッサ119は、ドライブ113に格納されている対応冗長コードと中間コードのxorを算出して冗長コードを更新する。更新された冗長コードが、対象データの転送元ノード101とは異なるノード101のストライプのみから生成されている場合、プロセッサ119は、対象データと更新冗長コードから
新たな冗長コードを生成する。
【0235】
プロセッサ119は、できるだけ旧データ(旧ストライプ)の比率が大きくなるように、冗長コードを生成するストライプを選択してもよい。プロセッサ119は、旧ストライプのみで冗長コードを生成できる場合、そのようにストライプを選択する。冗長コード生成における旧データの比率を大きくすることで、当該冗長コードが無効データとなる時期を早め、冗長コード格納領域の空き容量を効率的に増加させることができる。
【0236】
プロセッサ119は、選択したストライプから冗長コードを算出し、ドライブ113に書き込む(S803)。ドライブ113へのライトは、ステップS808と基本的には同様にログ構造化形式による追記である。これにより、旧データの読み出しを省略し、高速及び効率的な冗長コードの生成及びドライブライト処理を実現する。
【0237】
プロセッサ119は、データマッピングテーブル701ではなく、冗長コードマッピングテーブル702に算出した冗長コードの格納先の物理領域とプールボリュームのページの対応関係を記録する。プロセッサ119は、さらに、逆マッピングテーブル703において、プールボリュームにおける論理アドレスとドライブ113における物理アドレスとの対応関係を記録する。冗長コードは複数ストライプから生成されるため、マッピングテーブルは、一つの物理アドレスに対して複数の参照を持つ。
【0238】
プロセッサ119は、冗長コードをドライブ113にライトしたら、転送元ノード101に通知する(S805)。転送元ノード101は、データマッピングテーブル701における対象データの対象レイヤの状態を“完了”に変化させる。状態フィールドは、ノード障害時に当該データを再転送対象とするかどうかを判定するために参照される。全ダーティを処理完了したら(S806:Y)、プロセッサ119は、本フローを終了する。
【0239】
また、Erasure Codingなど2個以上の冗長コードを持つ符号化を用いる場合、それぞれの冗長コードを生成する複数のノードにおいて、独立に別々のデータの組み合わせで冗長コードを生成すると、データ復元が困難(MDS性が失われる、復元のための計算量が増大化する等)となる場合がある。
【0240】
そこで、1個目の冗長コードを生成するノードで冗長コードを生成した後、静的マッピングテーブル211を参照して2個目以降の冗長コードを生成するノードを特定し、1個目の冗長コードを生成するノードにて冗長コードを生成したデータのアドレスの組を、2個目以降の冗長コードを生成するノードに通知する。
【0241】
2個目以降の冗長コードを生成するノードは、通知されたデータのアドレスの組で2個目以降の冗長コードを生成するようにすることで、MDS性を保ち、データ復元を可能とすることが出来る。また、その他の方法として、1個目の冗長コードを生成するノードが2個目以降の冗長コードを生成し、冗長コードを対応するノードに転送するようにして、実現する方法も考えられる。
【0242】
中間コードのデステージにおいて、プロセッサ119は、ドライブ113に格納されている旧冗長コードと、中間コードとから新たな冗長コードを生成し、ドライブ113における旧冗長コードにオーバー書き込む。オーバーライトのため、マッピングテーブルは変わらない。中間コードによる冗長コードの更新は、旧データのリードを必要とするが、冗長コードノードにおけるローカル領域使用量を低減できる。
【0243】
中間ダーティキュー904に、一つの冗長コードに対する複数の中間コードが存在する場合、プロセッサ119は、全中間コードのxorを算出して新中間コードを生成、当該
新中間コードによって冗長コードを更新する。同一冗長コードに対応する中間コードは、同一論理アドレスの異なる世代のデータ及び異なるノード101の中間コードを含む。
【0244】
例えば、旧冗長コードがAxorBであるとする。同一冗長コードに対応する中間コードの例は、中間コードAxorA‘、中間コードBxorB‘、中間コードA‘xorA‘‘である。ここで、A‘‘が最新データであり、A‘最古データである。また、データBが新データであり、データB’が旧データである。
【0245】
プロセッサ119は、冗長コードマッピングテーブル702を使用して、中間ダーティキュー904から選択した中間コードの冗長コードの物理アドレスを知ることができる。さらに、プロセッサ119は、逆マッピングテーブル703を使用して、当該冗長コードに対応する中間コードの論理アドレスを特定することができる。
【0246】
冗長コード更新の具体例を、以下に示す。以下では、リードソロモン符号を用いたRAID6(ガロア係数:A1~A3)を例に挙げる。
【0247】
(1)コードダーティキュー901
プロセッサ119は、ダーティキュー901からX1~X3のダーティデータを選択し、下記の式で、冗長コードP1又はP2を算出する。
P1=X1xorX2xorX3
P2=(X1*A1)xor(X2*A2)xor(X3*A3)
冗長コードP1、P2は、それぞれ、自系のストレージデバイスの新規領域にライトされる。
【0248】
(2)中間ダーティキュー904
プロセッサ119は、中間ダーティキュー904から、自系のドライブ113にライト済みの旧冗長データP1’又はP2’に対応する新らたな中間ダーティデータM1、M2を抽出する。中間ダーティデータの個数は2とは限らない。プロセッサ119は、下記の式で新中間コードMP1又はMP2を算出する。
MP1=M1xorM2
MP2=(M1*A1)xor(M2*A2)
【0249】
プロセッサ119は、下記の式で新たな冗長コードP1又はP2を算出する。
P1=P1’xorMP1
P2=P2’xorMP2
新冗長コードP1、P2は、を旧領域(P1’、P2’)にオーバーライトされる。
【0250】
上述のように、冗長コードノード101は、一つのストライプタイプ内のストライプから動的にストライプを選択し、選択したストライプから冗長コードを生成する。これにより、既存冗長コードを読み出すことなく、転送されたストライプから効率的に冗長コードを生成することができる。
【0251】
本例におけるストライプの動的な選択は、選択するストライプの組み合わせ及びストライプ数の少なくとも一方が不定である選択である。上記例は、ストライプ数及びアドレス組み合わせの双方から独立してストライプを選択するが、その一方が固定されていてもよい。ここで、アドレス組み合わせにおけるアドレスは、ノード、ボリューム及びボリューム内アドレスで指定されるアドレスである。
【0252】
冗長コードのドライブライトに、ログ構造化方式が適用されてなくてもよい。つまり、ノード101は、旧冗長コードと同一アドレス組み合わせから生成した新冗長コードロー
カル領域に追記することなく、旧冗長コードを新冗長コードに書き換えてもよい。ログ構造化方式が採用されない構成において、既存の全冗長コードと異なるアドレス組み合わせの冗長コードは、ローカル領域に追記される。
【0253】
上記例は、予め定義されたストライプタイプ内のストライプのみから冗長コードを生成する。これと異なり、システムは、ストライプタイプを定義することなく、任意のストライプの組み合わせから冗長コードを生成してもよい。
【0254】
図19は、容量枯渇管理の処理のフローチャートを示す。本処理は、ドライブ113上のデータ量が設定された目標量を超えている場合に、データの消去を試みる。これにより、必要なデータを限られた領域に格納できる。消去されるデータの種類は、ライトデータ(ストライプ)と冗長コードである。本処理はホストI/Oとは非同期に実施してもよい。使用量と目標量の関係は、ローカル領域量テーブル802に示される。
【0255】
なお、
図19のフローチャートは、冗長コード領域及びデータストライプ領域のデータ消去に適用され、スペア領域におけるデータ消去には適用されない。階層毎にローカル領域量テーブル802が使用されている場合、階層毎に本処理が実行される。
【0256】
プロセッサ119は、ローカル領域量テーブル802を参照し、選択した対象データタイプの使用量が、目標量を超過しているかどうかをチェックする(S901)。対象データタイプの使用量が超過している場合(S901:Y)、プロセッサ119は、対象データタイプが、冗長コードタイプか否か判定する(S902)。
【0257】
本例おいて、ローカル領域量テーブル802に示されるように、データタイプは、冗長コードタイプ、ライトデータタイプ(ストライプタイプ)及びスペア領域上のデータタイプに分類される。さらに、冗長コードタイプは、ノード冗長コード、サイト冗長コード、ジオ冗長コードの各タイプ分類され、ライトデータタイプは、各サイトストライプタイプに分類される。
【0258】
使用量を超過しているデータタイプがいずれかの冗長コードタイプである場合(S902:Y)、プロセッサ119は、無効リスト801B及びログ構造化マッピングテーブル213を参照して、当該冗長コードタイプの冗長コードを検索する(S907)。無効冗長コードは、算出元の全ストライプが無効の冗長コードである。算出元の全ストライプ算出元の全ストライプが更新済みの旧データであり、当該冗長コードは消去可能である。
【0259】
対象冗長コードタイプの無効冗長コードがある場合(S907:Y)、プロセッサ119は、その領域を開放する(S908)。領域開放は、冗長コードマッピングテーブル702における対象領域の物理アドレスとプールボリュームの論理アドレスの関係を削除し、無効リスト801Bから対象領域を削除してフリーリスト801Cに再接続し、ローカル領域量テーブル802において対応する冗長コードタイプの領域使用量を削減する。
【0260】
対象冗長コードタイプの無効冗長コードがない場合(S907:N)、プロセッサ119は、冗長コードのマージ処理を実行する(S909)。本処理により、冗長コードの使用量を削減できる。
【0261】
例えば、冗長コードP1=X’xorY’xorZと(’は無効データを表す)、冗長コードP2=JxorKxorL’が存在し、JとKとZがそれぞれ別ノードに存在するストライプである場合、プロセッサ119は、P1xorP2xorX’xorY’xorL’により、新たな冗長コードP3=JxorKxorZを算出ができる。
【0262】
プロセッサ119はログ構造化マッピングテーブル213を参照して、冗長コードを構成するストライプの論理アドレス及び世代情報を取得する。プロセッサ119は、X’、Y’、L’を、他ノード101から取得する。
【0263】
プロセッサ119は、上記冗長コードP1、P2の領域を開放し、新たな冗長コードP3をドライブ113に書き込むことで、冗長コードによる使用量を削減できる。冗長コードによる使用量の削減量が大きくなるように、冗長コードを優先的に選んで、実施してもよい。
【0264】
マージ処理後、プロセッサ119は、対象冗長コードタイプによる使用量が目標量を超過しているかを再チェックする(S910)。使用量が目標量を超過している場合(S910:Y)、プロセッサ119は、リバランス処理を実行する(S906)。後述するように、リバランス処理は、プールボリューム間でページ使用量を調整する。例えば、データを他階層のプールボリューム又は他ノード101のプールボリューム(他系プールボリューム)に移動する。リバランス実行後、プロセッサ119は、ステップS901に進む。対象冗長コードタイプの使用量が目標量を超過していない場合(S910:N)、プロセッサ119は、ステップS901に進む。
【0265】
対象データタイプが冗長コードタイプではない、つまりいずれかのストライプタイプである場合(S902:N)、プロセッサ119は、対象ストライプタイプにおいて、消去可能なライトデータ(ストライプ)があるかを判定する(S903)。消去可能なストライプは、更新済みの旧ストライプであり、無効ストライプである。プロセッサ119は、無効リスト801B及びログ構造化マッピングテーブル213を参照して、当該ストライプタイプの無効ストライプを検索する。
【0266】
消去可能なストライプがある場合(S903:Y)、プロセッサ119は、冗長コードのクリーンアップ処理を実施する(S904)。この処理は、消去しようとしているストライプに対応する冗長コードのクリーンアップを実施する。サイト冗長コード及びジオ冗長コードの双方のクリーンアップが実施される。具体的には、各保護レイヤにおいて、以下のステップが実行される。
【0267】
(1)プロセッサ119は、消去対象ストライプの冗長コードノード101に、消去対象ストライプを含む冗長コードがあるかを問い合わせる。対象ストライプは、例えば、サイト番号、ノード番号、LDEV番号及びLBAにより指定される。
【0268】
(2)問い合わせ先冗長コードノード101ノードにおいて消去対象ストライプを含む冗長コードがある場合、プロセッサ119は、消去対象ストライプを、当該冗長コードノード101に送信する。冗長コードが存在しない場合、当該処理は終了する。
【0269】
(3)冗長コードノード101は、受け取った消去対象ストライプによって現在冗長コードから消去対象ストライプを消去することで、新しい冗長コードを生成する。例えば、冗長コードノード101は、消去対象ストライプと旧冗長コードのxorを計算し、新冗長コードを生成する。冗長コードノード101は、ドライブ113に格納されている旧冗長コードを、新冗長コードでオーバー書き込む。
【0270】
上記ストライプ消去に伴う冗長コードの更新により、冗長コードの生成元ストライプの消去によって、当該冗長コードの他のストライプの冗長度が減少することを防ぐ。
【0271】
冗長コードノードが冗長コードを消去する場合、当該冗長コードノードに対応するストライプが最新バージョンであるか問い合わせてもよい。ストライプは、逆マッピングテー
ブル703が示す論理アドレスで指定される。対応ストライプが最新バージョンである場合、冗長コードノードは、当該ストライプの新たな冗長コードを再生成する。
【0272】
次に、プロセッサ119は、対象領域を開放する(S905)。これはステップS908と同様である。その後、プロセッサ119は、ステップS901に戻る。
【0273】
スペア領域の使用量が目標量を超えている場合、例えば、プロセッサ119は、
図19のフローチャートにおけるストライプの消去を行った後、冗長コードの消去を実行し、さらに、リバランスを実行する。ストライプ消去と冗長コード消去順は逆でもよい。いずれかのステップで使用量が目標量以下になった場合、その後のステップは不要である。
【0274】
図20は、容量枯渇管理の処理の概念を示す。本図は、冗長コードのクリーンアップ処理を示している。ノード101Aは、書き込むストライプ781を、ノード101Bに転送する(T212)。ノード101Cと101Dも、同様に、ストライプ782、783をノード101Bに転送する。転送ストライプ781~783を、それぞれZ、D、Jで表している。
【0275】
ここで、ノード101Aのドライブ113が枯渇した場合、つまり、ノード101Aのドライブ113における使用量が閾値を超えた場合、ノード101Aは、古いデータを消去しようとする。古いストライプをX’’とする。X’やX’’などは、過去データ(無効データ)を表し、Xは現在データを表す。
【0276】
過去ストライプのみによって生成された冗長コードは、もはや保持する意味がなく、消去できる。しかし、現在ストライプを含むストライプセットから生成された冗長コードは、消去できない。また、そのような冗長コードがある場合に、その冗長コードの生成に使用した過去ストライプはドライブから消去できない。ストライプを復元不能となってしまうためである。
【0277】
したがって、ノードは、過去ストライプを消す前に、そのストライプの冗長コードを格納しているノードに、ストライプを送信し、クリーンアップする。例えば、
図20において、ノード101Bに、X’’xorCxorHという冗長コードが存在する。ノード101Aは、過去ストライプX’’を消去する前に、過去ストライプX’’をノード101Bに送信する(T202)。
【0278】
ノード101Bは、過去ストライプX’’と、冗長コードX’’xorCxorHから、X’’xorCxorHxorX’’によりCxorHを算出する。その後、ノード101Aは、ドライブ113の過去ストライプX’’を消去する。
【0279】
図21は、退避リビルド処理のフローチャートを示す。本処理は、分散型ストレージシステム内で異常が発生すると、異常に対応すべき各ノード101により実行される。各ノード101のプロセッサ119は、保護レイヤ毎の状態制御テーブル、具体的には、ドライブ状態管理テーブル221、ノード状態管理テーブル222、サイト状態管理テーブル223を参照することで、異常発生を検知できる。上述のように、いずれかのノード101が検出した異常についての情報は、システム内で共有される。
【0280】
図21において、ノード101は、異常リソース(ドライブ、ノード、サイトなど)が閉塞かどうかを判定する(S211)。リソースの状態には3種類ある。“通常”状態と“閉塞”状態と“警告”状態である。ノード101は、保護レイヤ毎の状態管理テーブルを参照することで異常リソースの状態を判定できる。
【0281】
図11を参照して説明したように、ノードやサイト等いずれかのリソースで障害が発生した場合、当該リソースが保持するデータをリビルドするノード(スペアノード)は、予め設定されている。各ノード101は、自ノードがスペアノードとなるリソース及びリビルドすべきデータを示す情報を保持しており、プロセッサ119は、自ノードが対応するリソースの閉塞状態を検知すると、必要なデータをリビルドする。
【0282】
状態管理テーブルにおける状態が“閉塞”の場合、プロセッサ119は、異常リソースの状態が閉塞であると判定し(S211:Y)、優先リビルドを実行する(S212)。優先リビルドは、当該保護レイヤにおいて冗長度の低いストライプタイプのデータから順番にリビルドを実行する。
【0283】
リビルドは、消失したデータを残っているストライプ及び冗長データから回復する。ノード101は、各保護レイヤの静的マッピングテーブル210~212を参照して、エラーリソースが格納しているデータの消失により冗長度が低下するストライプタイプ及びその冗長度数を知る。
【0284】
ノード101は、互いに実行する処理及び当該処理の進捗を通知し、他のノード101によるより低い冗長度の優先リビルドの完了を待つ。例えば、ノード101は、他のノード101が冗長度0のストライプタイプのリビルド完了を待って、冗長度1のストライプタイプのリビルドを開始する。これにより、冗長度0のストライプタイプのリビルド時間が、冗長度1のストライプタイプのリビルドにより長時間化することを避けることができる。
【0285】
MDS(Maximum Distance Separable)性を持つErasure Coding手法を用いると、任意の冗長度個数のデータの消失に対してデータ復旧可能であることが、一般に知られている。
【0286】
基本的に、リビルドされたデータを自系のストレージデバイスに保持するスペアノードが、冗長コードとストライプをリードし、当該データをリビルドする。スペアノードが高負荷の場合は、他ノードがデータをリビルドして、スペアノードに転送してもよい。
【0287】
また、障害ノードのデータが不要な場合、例えば、仮想ボリュームのオーナがない場合、スペアノードでリビルドすることなく、冗長コードの変更のみ行ってもよい。例えば、スペアノードは、ゼロデータをライトし、冗長コードノードは、旧冗長コードの消失ストライプ以外のストライプとゼロデータによって新たな冗長コードを生成する。
【0288】
閉塞リソースにより消失した上位保護レイヤの冗長コードは、再生成される。例えば、あるノードのドライブで障害発生した場合、当該ノード101は、当該ノード101内のサイト冗長コードとジオ冗長コードを再生成する。当該ノード101は、他のノード101に、サイト冗長コードとジオ冗長コードそれぞれの生成に必要なストライプを転送することを要求する。ノード101は、冗長コードマッピングテーブル702及び逆マッピングテーブル703からストライプを保持するノードを特定できる。
【0289】
ノード内で、サイト冗長コードとジオ冗長コードを冗長化してもよい。冗長化によるオーバヘッド(プロセッサ処理時間、ストレージ容量、フラッシュメディア寿命消費など)が増加するが、ドライブ障害におけるノード間通信が不要となる。また、ノードは、優先リビルドの実行後に、静的マッピングテーブル210~212における該当ストライプタイプの登録ノードを、スペアノードによって更新する。
【0290】
また、旧データ(新データがライトされたデータ)については、そのデータを用いて冗
長コードを生成している場合、その冗長コードに対応した複数のデータのうち、新データのみをパリティ格納ノードでダーティ化することで、冗長コードを再生成する必要がある。
【0291】
各ノード101は、当該保護レイヤの全ストライプタイプの冗長度が回復したかどうかをチェックする(S213)。ノード101は、データ回復の完了を互いに通知する。当該保護レイヤにおける全ストライプタイプの冗長度が回復すると、処理は、ステップS214に進む。すべてのレイヤで処理が完了していない場合(S214:N)、分散型ストレージシステムは、より上位の保護レイヤについて、ステップS211から再度実行する。
【0292】
すべてのレイヤの処理が完了すると(S214:Y)、分散型ストレージシステムは、仮想ボリュームのオーナの見直しを実施する(S215)。具体的には、あるノード101が閉塞になった場合、予め定められた他のノード101が、そのノード101で持っていた仮想ボリュームを引き継ぐ。
【0293】
ステップS211で閉塞ではないと判定された場合(S211:N)、つまり状態が“警告”の場合、ノード101は、データ退避が必要か否かを判定する(S216)。この要否は、分散型ストレージシステム内でデータ消失が発生するリスクの度合に基づき判定される。
【0294】
一般的に、“警告”状態となったドライブは、“正常”のドライブと比較し、故障する確率が高くなることが知られている。しかし、“警告”状態となっても、そのドライブが故障しない場合もある。したがって、ストレージシステムの負荷上昇と退避処理によるデータ消失のリスク回避とのトレードオフとなる。
【0295】
例えば、システム冗長度が2の場合に、2個以上のドライブが“警告”状態となった場合、警告状態のストライプが多いストライプタイプのデータから優先して退避すると、退避のための移動データ量を削減でき、効率的である。ここでシステム冗長度は、システム全体で最小の冗長度数である。
【0296】
一例において、ノード101は、N個以上のリソースが“警告”状態となった場合に、ステップS216で退避要であると判定する。Nはシステム冗長度に基づき予め設定されている整数である。退避が必要と判定した場合(S216:Y)、ノード101は、優先退避を実行する(S217)。
【0297】
優先退避は、警告状態となっているリソースに格納されたデータにおいて冗長度の低いデータを、予め定められているスペア領域にコピーする。データの退避先は、リビルドと同様である。退避先のデータ領域(スペア領域)において、LRUキャッシュのように、警告が発生するたびに退避データが上書きされてもよい。
【0298】
上記例は、ストライプタイプの冗長度数に基づいて実行優先度を決定するが、ノード101は、ストライプ及び冗長コードの冗長度数に基づいて実行優先度を決定してもよい。ストライプ及び冗長コードは、複数保護レイヤに属し、それらの総冗長度数が当該データの冗長度数である。これにより、リビルド/退避処理の進行と共に、システム冗長度を上げることができる。
【0299】
上述のように、ノード(サイト)が閉塞となった場合に、他のノード(サイト)で処理を継続するために、仮想ボリュームのオーナをあらかじめ分配しておく。例えば、サイト内に異なるノード及び他サイトのノードが、それぞれ、同一仮想ボリュームのオーナと設
定される。
【0300】
リビルドや退避の高速化のために、保護レイヤを跨いで、リビルド処理や退避処理を実行してもよい。例えば、あるドライブが故障してリビルド処理を実行する場合、ノード内でリビルド処理を実行するのに加え、それと同時にノード間の冗長コードを用いてドライブのデータを修復する。これにより、より多くのドライブから同時にデータを読み出すことが出来、リビルドを高速に実行することができる。保護レイヤを跨いで回復するかどうかは、ネットワーク負荷、許容負荷などに応じて、実行の度合いを調整してもよい。
【0301】
図22は、データリシンク処理のフローチャートを示す。本処理は、電断時の復活処理又はコピーバック処理として実行される。コピーバック処理は、リビルド後、リソース交換後のスペア領域のデータから新リソースへのコピー処理である。本処理の実行完了後、リソースの状態は、正常状態となる。
【0302】
本処理を実行しているノード101のプロセッサ119は、実行すべき処理が、復活処理かどうかを判定する(S221)。具体的には、プロセッサ119は、自ノードが新しいノードであるか、又は電断などの障害から復旧している状態であるかを判定する。障害から復旧している場合は、プロセッサ119は、復活処理であると判定する(S221:Y)。
【0303】
より具体的には、プロセッサ119は、分散型ストレージシステム内の共有情報として、LANコントローラのmacアドレスのようにノード毎に一意に決まる識別子とノード番号の対応テーブルを保持し、当該対応テーブルを参照して、自ノードのストレージシステムへの登録の有無を判定する。
【0304】
復活処理である場合(S221:Y)、プロセッサ119は、回復が必要な領域を検査する。具体的な回復要の領域を検査する方法は、冗長コードについては、他ノード101のデータマッピングテーブル701の状態を参照し、未反映状態の冗長コードのストライプを、他ノード101から取得する。冗長コードがスペア領域にリビルドされている場合、プロセッサ119は、当該冗長コードを取得する。
【0305】
ライトデータ(ストライプ)については、他ノード101は、障害発生後にライトされた差分をビットマップで管理している。プロセッサ119は、その差分のみをスペア領域からコピーバックして回復する。また、プロセッサ119は、自系の逆マッピングテーブル703を参照して最終の更新時刻を特定し、その最終更新時刻以降にライトされた有効データを他ノード101に要求してもよい。このように、プロセッサ119は、回復対象のライトデータ(ストライプ)及び冗長コードを決め、領域回復処理を実行する(S225)。
【0306】
実行すべき処理が、復活処理ではない場合(S221:N)、プロセッサ119は、コピーバック処理を実行する。プロセッサ119は、スペア領域にリビルドされたライトデータ(ストライプ)及び冗長コードをコピーバックする。プロセッサ119は、当該処理を保護レイヤ階層毎に実行する。上位のレイヤについては、冗長コードのコピーのみ実行される。すべてのレイヤで処理が完了したら(S227:Y)、本フローは終了する。
【0307】
図23は、再配置処理のフローチャートを示す。本処理は、分散型ストレージシステムのページ配置を最適化する。本処理は、分散型ストレージシステムに新たにリソースを追加する場合、リソースを減設する場合、一部のプールボリュームの容量が枯渇している場合、負荷の変化を見直す一定周期毎、等に、各関連ノード101により実行される。
【0308】
本処理が開始されると、プロセッサ119は、各仮想ページの全I/O負荷を示すページ負荷分布テーブル217を基に、プールの全体閾値を算出する(S231)。仮想ページの全I/O負荷は、当該仮想ページの全オーナノードにおけるホストアクセスによる負荷の総計である。一方、各オーナノードにおける仮想ページへのホストアクセスによるI/O負荷を自系負荷と呼ぶ。仮想ページのI/O負荷は、例えば、I/O頻度で表わされる。
【0309】
全体閾値は、
図13の説明における、階層割り当て閾値と同様の方法で算出できる。各全体閾値は、階層間の境界ページI/O頻度を示す。プールにおける各階層の容量及びI/O性能は、各階層の全プールボリュームの容量及びI/O性能から決定される。不図示の管理情報によって、プールボリューム階層、容量及びI/O性能は管理される。
【0310】
次に、プロセッサ119は、各仮想ページの全I/O負荷を示すページ負荷分布テーブル217及び自ノードの自系負荷を示すページ負荷分布テーブル217を基に、各階層における自系閾値を算出する(S232)。自系閾値は、全体閾値により決定された階層内の仮想ページにおいて、自ノードに当該データを配置する仮想ページの境界I/O頻度を示す。
【0311】
図24A及び
図24Bは、それぞれ、自己閾値の決定方法の例を示す。
図24A及び
図24Bのグラフの見方は、
図13におけるグラフ271と同様である。縦軸はページのI/O頻度で示されるページI/O負荷を示し、横軸は自系I/O負荷の高い順番に並べた仮想ページを示す。
【0312】
図24A、24Bは、それぞれ、一つの階層における全I/O負荷ライン241及び自系I/O負荷ライン242を示す。上述のように、各階層に割り当てられる仮想ページは、仮想ページの全I/O負荷と全体閾値とで決定される。
【0313】
図24A、24Bは、それぞれ、自ノード101がオーナの仮想ページにおいて、一つの仮想に割り当てられる仮想ページのI/O負荷分布を示す。自ノード101がオーナの仮想ページは、自系プールボリュームに割り当てられている仮想ページに加え、他系プールボリュームに割り当てられている仮想ページを含み得る。
【0314】
図24A、24Bは、それぞれ、自系閾値246を示す。自系閾値246よりの高い自系I/O負荷の仮想ページは、自系プールボリュームに割り当てられる。現在他系プールボリュームに割り当てられている仮想ページのデータは、自系ドライブ113に移動される。
【0315】
自系閾値246以下の自系I/O負荷の仮想ページは、自系プールボリューム又は他系プールボリュームに割り当てられる。具体的には、プロセッサ119は、現在他系プールボリュームに割り当てられている仮想ページは、そのまま他系プールボリュームに割り当てられると判定する。プロセッサ119は、現在自系プールボリュームに割り当てられている仮想ページは、自系プールボリュームの空き容量に応じて、当該データを他ノード101に移動するか(リバランス)否か判定する。詳細は後述する。
【0316】
図24A、24Bは、それぞれ、容量限界243、ドライブ性能限界244、及び許容ネットワーク限界245を示す。プロセッサ119は、自系プールボリュームに割り当てる仮想ページがこれら限界値内となるように、自系閾値246を決定する。
【0317】
本例において、プロセッサ119は、容量限界243、ドライブ性能限界244、及び許容ネットワーク限界245の最小値と自系I/O負荷ライン242との交点のページI
/O負荷を、自系閾値246と決定する。
図24Aにおいてドライブ性能限界244が最小値であり、
図24Bにおいて許容ネットワーク限界245が最小値である。
【0318】
容量限界243は、自系配置可能な容量限界を示す。容量限界243は、ノード101の自系プールボリューム容量とページサイズから、予め定められた式により決定される。自系プールボリュームに割り当てられる全仮想ページのサイズが、当該自系プールボリューム容量内となるように、ドライブ性能限界244が決定される。自系プールボリューム容量は、自系ドライブ113から形成されているプールボリュームの容量である。
【0319】
ドライブ性能限界244は、自系プールボリュームのアクセス性能と全I/O負荷ライン241とから、予め定められた式により決定される。プールボリュームのアクセス性能は、例えば、単位時間当たりのI/O量で示される。自系プールボリュームに割り当てられる仮想ページの全I/O負荷の総和が、当該自系プールボリュームのアクセス性能内となるように、ドライブ性能限界244が決定される。
図24Aにおけるハッチング領域は、自系プールボリュームに割り当てられる仮想ページの全I/O負荷の総和を示す。
【0320】
一方、
図24Bにおいて、ハッチング領域は、他系I/O負荷の総和、つまり、(全I/O負荷-自系I/O負荷)を示す。許容ネットワーク限界245は、当該他系I/O負荷の総和と自系ネットワーク性能とから予め定められた式により決定される。ネットワーク性能は、例えば、単位時間当たりのI/O量で示される。
【0321】
仮想ページを自系プールボリュームに割り当てる場合、ノード101は、当該仮想ページの他系アクセスを、ネットワークを介して受信する。したがって、プロセッサ119は、他系I/O負荷が自系ネットワーク性能内となるように、ネットワーク限界245を決定する。
【0322】
上述のように、ドライブ性能及びネットワーク性能に基づき自系閾値を決定することで、ホストI/Oにおけるデータ転送におけるボトルネックの発生を抑制することができる。特にドライブ性能限界244を使用することで、他ノードに配置されるデータによるネットワーク上のボトルネック発生を効果的に抑制できる。なお、容量限界243は必須であるが、ドライブ性能限界244及び許容ネットワーク限界245は使用しなくてもよい。
【0323】
次に、プロセッサ119は、プールにおけるプールボリューム構成を見直す(S233)。プロセッサ119は、ステップS232における自系閾値の決定において、各階層において自系プールボリュームに割りあてる仮想ページ(自系仮想ページ)の総容量及び総I/O負荷を算出している。
【0324】
プロセッサ119は、これらの値と、各階層における自系ドライブ113の容量及び性能に基づいて、他系のプールボリューム1303Bにマッピングするプールボリューム1303Cの数を決定する。自系仮想ページ総容量又は総I/O負荷に対して自系ドライブ113の容量又は性能が不足する場合、プロセッサ119は、プールボリューム1303Cの数を増加させる。
【0325】
次に、プロセッサ119は、自ノード101がオーナである仮想ボリュームの仮想ページを順次選択して、以下のステップを繰り返し実行する。
【0326】
まず、プロセッサ119は、当該仮想ページのデータを他系プールボリュームから自系プールボリュームに移動する必要があるか判定する(S234)。具体的には、プロセッサは、全体閾値から当該仮想ボリュームの階層を決定し、さらに、自系閾値から当該仮想
ページを自系プールボリュームに割り当てるか判定する。上述のように、プロセッサ119は、自系閾値よりI/O負荷が大きい仮想ページは、自系プールボリュームに割り当てると判定する。プロセッサ119は、自系閾値以下のI/O負荷の仮想ページは自系ボリュームに割り当てる必要がない、と判定する。
【0327】
当該仮想ページを自系プールボリュームに割り当てると判定され、かつ、当該仮想ページが現在他系プールボリュームに割り当てられている場合、プロセッサ119は、当該仮想ページのデータを他系プールボリュームから自系プールボリュームに移動する必要があると判定する。
【0328】
当該仮想ページを自系プールボリュームに割り当てる必要がないと判定された場合、又は当該仮想ページが現在自系のプールボリュームに割り当てられている場合、プロセッサ119は、当該仮想ページのデータを自系プールボリュームに移動する必要はないと判定する。
【0329】
データ移動が必要と判定された場合(S234:Y)、プロセッサ119は、当該仮想ページのデータを自系プールボリューム(自系ドライブ113)に移動する(S235)。当該移動は、仮想ページの必要な階層移動を含む。
【0330】
具体的な手順は、以下のステップを含む。ステップ1は、データを自系のキャッシュ181にステージングする。ステップ2は、ページマッピングテーブル215の当該仮想ページの対応するプールボリューム領域を自系のプールボリュームに変更する。
【0331】
ステップ3は、データを自系プールボリュームにデステージする。ステップ4は、キャッシュ領域を開放する。ステップ5は、元の割り当てられていた他系プールボリュームのページ領域をクリアして(例えば、ゼロデータライト)フリー化する。つまり、当該ステップは、当該領域をローカル領域制御テーブル214のフリーリスト801Cに接続し、ローカル領域量テーブル802の使用量と有効量を削減する。
【0332】
このように、各ノード101が、自己閾値を使用して自系プールボリュームに移動する仮想ページを決定することで、当該仮想ページが複数のノード101に所有されている場合に、当該仮想ページのデータを保持する一つのノードが決定される。
【0333】
例えば、現在仮想ページのデータを保持しているノード101と他ノード101のそれぞれが当該仮想ページを自系プールボリュームに割り当てると判定した場合、他ノード101にデータは移動される。したがって、仮想ページのデータを保持するノード101と異なるノードであって、当該現在仮想ページを自系プールボリュームに割り当てると最後に判定したノード101が、当該仮想ページのデータを保持する。
【0334】
当該仮想ページのデータを自系プールボリュームに移動する必要はないと判定された場合(S234:N)、プロセッサ119は、階層移動が必要かどうかを判定する(S236)。当該仮想ページは自系プールボリュームに割り当てることが必要であると判定され、現在自系プールボリュームに割り当てらており、さらに、現在の階層が全体閾値から決定された階層と異なる場合、プロセッサ119は、階層移動が必要と判定する。
【0335】
階層移動が必要と判定された場合(S236:Y)、プロセッサ119は、階層移動を実行する(S237)。階層移動の具体的な方法は、ステップS235と基本的には同様の方法で実現される。
【0336】
階層移動が不要と判定された場合(S236:N)、プロセッサ119は、当該仮想ペ
ージのリバランスが必要かどうかを判定する(S238)。本例において、仮想ページのリバランスは、当該仮想ページのデータを、現在プールボリュームから他系プールボリュームに移動する。
【0337】
プロセッサ119は、当該仮想ページは自系プールボリュームに割り当てる必要がなく、かつ、当該仮想ページが現在割り当てられている自系プールボリュームが枯渇していると判定した場合、当該仮想ページを他系プールボリュームに割り当てるリバランスが必要であると判定する。
【0338】
プロセッサ119は、当該階層のローカル領域量テーブル802を参照して、当該仮想ページのエントリの領域が枯渇(不足)しているか判定する。例えば、目標量から有効量を引いた値が閾値未満である場合、当該領域が枯渇していると判定される。
【0339】
リバランスが必要と判定された場合(S238:Y)、プロセッサ119は、当該仮想ページのデータを、自系プールボリューム(自ノード)から他系プールボリューム(他ノード)に移動する(S239)。リバランスのページ移動の具体的な方法は、ステップS235と基本的には同様の方法で実現される。
【0340】
プロセッサ119は、他ノード101に問い合わせを行い、又は、他ノードからローカル領域量テーブル802の情報を取得して、当該仮想ページのデータを格納する枯渇していない領域を有する他ノード101を選択する。
【0341】
あるノード101が枯渇していない領域を有するか否かの判定は、当該ノード101における当該階層のローカル領域量テーブル802に基づく。移動先ノード101は、例えば、当該仮想ページのオーナノード及び当該仮想ページのストライプタイプに属するノードの中から選択される。
【0342】
未処理の仮想ページが残っている場合(S240:N)、プロセッサ119はステップS234に戻る。全仮想ページの処理が終了すると(S240:Y)、プロセッサ119は、本処理を終了する。
【0343】
図25Aは、構成変更処理のフローチャートを示す。本処理は、分散型ストレージシステムの構成を変更する際に実行される。例えば、分散型ストレージシステムに新たにリソースを追加する場合に、各ノードが実行する。
【0344】
本処理が開始されると、プロセッサ119は、当該保護レイヤの静的マッピングテーブルを変更する(S251)。例えば、ノードが追加される場合、サイト保護レイヤの各ノード101は、ストライプタイプ数を増やし、複数ストライプタイプそれぞれのデータノード及び冗長コードノードを変更する。例えば、一つのノード101がストライプタイプの新たなノード構成を決定し、それに従って、各ノード101が静的マッピングテーブルを更新する。
【0345】
ノード101は、現在のマッピングテーブル211の一部のストライプタイプに対応したストライプノードの一部を新らたに増設するノードに変更し、前記一部のノードを複数選択して新たなストライプタイプに含める。
【0346】
図25Bは、ノードを追加した場合のストライプタイプの追加及びストライプの再配置一例を示す。ノード101A~101Dは既存ノードであり、ノード101Eが追加ノードである。各ノード内の矩形はストライプのデータ位置(アドレス)を示し、矩形内の数字はストライプタイプ番号を示す。ストライプタイプ1~ストライプタイプ5が既存のス
トライプタイプであり、ストライプタイプ6が追加ストライプタイプである。
【0347】
追加前において、ノード101Eのストライプアドレスはいずれのストライプタイプにも属しておらず、矩形内は空である。既存ノードの一部であるノード101A、101C、101Dの一部のストライプアドレスの属するストライプタイプが、ストライプタイプ6に変更されている。追加されたノード101Eのストライプアドレスの一部は、既存ノードにおいて変更されたストライプタイプ2、3、4に割り当てられている。
【0348】
このように、一つのストライプタイプのストライプを異なるノードに分散することで、ノード障害に対する耐性を高める。追加されるノードと既存ノード間で、サイト冗長コードQの使用量ができるだけ均一となるように、冗長コードノードが最決定される。
【0349】
上記例ではノード増設を説明したが、ドライブ増設やサイト増設においても、同様に構成変更処理を実行することができる。
【0350】
次に、各ノード101は、ローカル領域量テーブル802における目標量の再計算を実行する(S252)。例えば、
図9のローカル領域量テーブル802に示すように、目標量の再計算は、各サイトストライプタイプ、各保護レイヤの冗長コード、及びスペア領域の目標容量を決定する。各保護レイヤの冗長コードの目標容量は、例えば、ユーザ指定された(
図27で説明)データ保護の方針(XDYP:最大Data数X、冗長コード数Y)に従い、例えば次式から決定される。
【0351】
目標容量
=全体容量×Max(Y÷リソース数、Y÷(X+Y))
(但し、リソース数>Y)
【0352】
全体容量は、ノード101のローカル領域の全体容量あり、Max(A、B)はA及びBの内の最大値であり、リソース数は保護レイヤにおけるリソースの数である。ノード保護レイヤにおいてリソース数はノード内のドライブ数であり、サイト保護レイヤにおいてリソース数はサイト内ノード数である。
【0353】
例えば、スペア領域の目標量は固定値であり、各サイトストライプタイプの目標量は、全容量の残量の等分である。
【0354】
次に、冗長コードのリバランスを実行する(S253)。これは、変更前と変更後の保護レイヤの静的マッピングテーブルの差分に対して、冗長コードの付け替え処理を実行する。具体的には、差分データ(中間コード)を冗長コードノードに送信し、冗長コードノードは中間データにより旧冗長コードを更新する。なお、冗長コードのリバランスを実施する代わりに、以前の保護レイヤの静的マッピングテーブルを記録しておき、冗長コードの対応関係を保持してもよい。
【0355】
最後に、プロセッサ119は、ページのリバランス、再配置を実行する(S254)。本処理は、新規に追加したノードやドライブに対してページの再配置を実行する。具体的な方法は、
図23を参照して説明した通りである。なお、冗長コード及びスペア領域の設定した目標が達成できない場合に、目標量をフィードバック制御等の知られた手法により徐々に削減してもよい。本構成により、システム全体の性能を考慮しつつ、システムを構成する各ノードに配置すべきデータを制御することが可能となる。
【0356】
図26は、コマンドラインの管理I/Fの一例を示す。同一ノード101上で、アプリケーションプログラム2601、API2603、及びソフトウェアで実現されるストレ
ージ装置2602が動作している。
【0357】
アプリケーションプログラム2601は、API2603を通じて、ストレージ装置2602に対して、自系論理ページに割り当てる仮想ボリューム内の仮想ページを指定する。アプリケーションプログラム2601は、例えば、仮想ボリューム番号、LBA、データ長により仮想ページを指定する。これにより、ページ単位で指定可能である。
【0358】
ストレージ装置2602は、指定された仮想ページに割り当てられている論理ページのノードを、ページマッピングテーブル215を参照して決定する。指定仮想ページに他ノードのプールボリュームの論理ページが割り当てられ、他ノードのドライブに該当データが格納されている場合、ストレージ装置2602は、当該他ノードから該当データを読み出し、自系のプールボリュームの論理ページに指定仮想ページを割り当て、自系のドライブにデータを格納する。また、上述のAPI2603によって指定されたストレージ領域にページが割り当てられていない場合、ライト要求に応じてページの新規割り当てを実施する際に、自系のドライブにデータを格納するようにする。
【0359】
本構成により、次に自系でアプリケーションプログラム2601が使用する論理ページを自系に事前に配置しておくことができ、アプリケーションに最適なページ配置が実現できる。
【0360】
ノード101は、ユーザインタフェースを介して、ユーザから、自系論理ページ(自系のストレージデバイス)に割り当てる仮想ボリューム内の仮想ページの指定を受け付けてもよい。上述のように、仮想ページは、仮想ボリュームの識別子及び当該仮想ボリューム内の論理アドレスで示される。さらに、ノード101は、仮想ページの他ノードの論理ページへの割り当て指示を受け付けてもよい。
【0361】
図27は、分散型ストレージシステムのGUIの管理I/Fの例を示す。GUI2701は、本分散型ストレージシステムの各種設定をユーザが実施するためのI/Fである。ノード101は、入出力デバイスを介して、ユーザからの各種設定を受け付ける。
【0362】
GUI2701は、保護レイヤ毎のリソース指定(2702A~C)受け付け、階層的設定を可能としている。例えば、サイト2702Aが指定された場合、GUI2701は、指定されたサイトの各ノード(2702B)の選択を受け付ける。ノードが指定された場合、GUI2701は、指定されたノード内のボリューム(2702C)についての設定を受け付ける。
【0363】
サイト間、ノード間、ボリュームで共通に設定される項目について説明する。ネットワーク性能は、ネットワーク帯域の情報である。AUTOが指定された場合は、各ノード101は、ネットワーク帯域を計測した結果から、自動的にネットワーク帯域を決定する。ユーザが指定した場合、各ノードは、ページ配置の決定において、指定されたネットワーク帯域を使用する。
【0364】
故障閾値は、リソースへの通信エラー等が発生した場合に、当該リソースを閉塞と判定するエラー回数を示す。テイクオーバは、リソースで障害が発生した場合のテイクオーバ先のリソースを指定する。複数のテイクオーバ先が選択され得る。ユーザがテイクオーバ先を指定しない場合、ストレージシステムが自動的に選んでもよい。
【0365】
保護レイヤ毎に指定できる設定として、プロテクションポリシがある。保護レイヤ毎のデータ保護の方針(XDYP:最大Data数X、冗長コード数Y)指定できる。ノード数がX+Yに満たない場合、リソースのストレージ容量が異なる場合などは、ストレージ
システムは、実構成内においてこれらに近い値を使用する。
【0366】
仮想ボリューム毎に指定できる設定として、同期・非同期情報がある。仮想ボリューム毎に、保護レイヤ毎に同期でコピーするか、非同期でコピーするかを指定できる。各保護レイヤのコピー無効化が指定可能である。
【0367】
例えば、ジオ保護レイヤのコピーを無効とする、という設定がなされる。その場合は、サイト障害時に仮想ボリュームのリビルドが不可となり、サイト障害時のリビルドはスキップされる。以上のように、重要なデータはサイト間で非同期コピーを行い、さらに重要なデータは同期コピーを行う、という運用が可能である。
【0368】
キャッシュモードは、“書き込む”及び“ライトバック”が選択できる。書き込むモードは、ライトデータをキャッシュに格納すると同時に、ドライブへの反映を実施したうえで、ホスト(アプリケーションプログラム)にライト完了を通知する。ライトバックモードは、ライトデータをキャッシュに格納すると、ホスト(アプリケーションプログラム)にライト完了を通知する。
【0369】
使用ノードの指定により、仮想ボリュームをマウントするノードが設定される。本設定は、仮想ボリューム管理テーブル218に反映される。
【0370】
図28は、分散型ストレージシステムのハードウェア構成例を示す。
図1が示す構成例の差は、複数ノード101間でバックエンドスイッチ2801が共有されている点である。バックエンドスイッチ2801を介して共有されているドライブ113は、バックエンドスイッチ2801を共有している各ノード101が他ノードを介することなくアクセス可能であり、各ノード101が管理するローカルドライブである。このように、一つのドライブ113は、バックエンドスイッチ2801を介して複数ノード101に含まれ得る。
【0371】
共有バックエンド構成の場合、共有範囲をドメインと定義し、ドメイン内とドメイン間でデータ保護を多次元化してもよい。また、転送の帯域幅に応じて、帯域幅の比較的に広い区間でドメインを定義してもよい。
【0372】
<実施形態2>
図29は、冗長化のためのノード間の転送を効率化する方法を示す。上述した方法では、ノードに対するライト量に対して、冗長度に比例して転送量が増加する。例えば、
図1の例において、2ノード障害時にデータを回復するためには、1個のノードから、2個のノードのキャッシュメモリ181に対してライトデータが転送される。
【0373】
例えば、ノード101Aに書き込まれたライトデータDATA1(1501A)は、ノード101Bとノード101Dのキャッシュメモリ181に転送される。つまり、この例においては、ノードに対するライト量の2倍のネットワーク転送が発生する。以下において、他のノードでの冗長コード生成のための転送量を削減する方法を述べる。
【0374】
図29は、ノード101Aから101Dまでの4ノードにおいて、2D2P冗長構成でデータを保護する例を示している。つまり、本システムは、2ノード障害時に全てのデータを回復できる冗長性を持つ。
【0375】
例えば、ノード101Aは、受信したデータ長の長いライトデータを二つのブロック(d1、d2ブロック)2901、2902に分割し、さらに、ノード内冗長コードとして、二つのパリティ(p、qパリティ)2903、2904を生成する。パリティもデータ
ブロックである。また、データブロックはデータユニットを含む上位語である。pパリティ2901及びqパリティ2902は、一次的な冗長コード(Class1 Code)である。次に、ノード101Aは、ライトデータ及びパリティを、ノード101B~101Dのキャッシュ(バッファ)に分散コピーする。一つ又は複数のデータブロックの組み合わせは、データブロックである。
【0376】
本例は、一つのライトデータブロック(d2ブロック)2902及び二つのパリティ(p、qパリティ)2903、2904を、3ノード101B~101Dに、分散コピーする。コピーが完了した時点で、必要な冗長性が得られている(2ノード障害時のデータ回復が可能)ため、同期的なライト処理が完了する。
【0377】
同様に、ノード101B~101Dは、それぞれ、受信したライトデータを二つのブロック(d1、d2ブロック)に分割し、さらに、p、qパリティを生成する。ノード101B~101Dは、それぞれ、一つのライトデータブロック(d2データブロック)及び二つのパリティ(p、qパリティ)を、他の三つのノードのキャッシュ(バッファ)に、分散コピーする。各ノードは、他の三つのノードそれぞれからのデータブロック(ライトデータ又はパリティ)をキャッシュに格納する。
【0378】
ノード101A~101Dは、それぞれ、非同期的に、他の三つのノードから集約したデータブロック(それぞれライトデータ又はパリティ)から、二次的な冗長コード(x1、y1パリティ)を生成し、ローカルドライブに書き込み、キャッシュを解放する。当該冗長コード(x1、y1パリティ)を、Class2 Codeと呼ぶ。Class2 Codeは、
図1で説明した冗長符号に対応する。
【0379】
例えば、ノード101Cは、ノード101Aからpパリティ2903、ノード101Bからpパリティ2905、及びノード101Dからqパリティ2906を受信する。ノード101Cは、それらから、x1パリティ2908及びy1パリティ2909を生成してローカルドライブに書き込み、キャッシュを解放する。
【0380】
また、ノード101A~101Dは、それぞれ、ライトデータ(d1+d2)をローカルドライブに書き込み、キャッシュを解放する。例えば、ノード101Aは、d1ブロック2901及びd2ブロック2902をローカルドライブに書き込み、キャッシュを解放する。
【0381】
図1の例は、2ノード障害時にデータ回復を可能とするためには、ライトデータ(d1+d2)を他の2ノードに転送する。これに対して、本例は、ライトデータの一部(d2)と、ライトデータから生成した一次的冗長コード(p、qパリティ)を他ノードに転送する。したがって、要求される冗長性を維持しつつ、ノード間のデータ転送を効率化することができる。また、ストライプのデータ(d1+d2)が全てローカルドライブに格納される。
【0382】
図29は、2D2P冗長構成の例を示すが、本例の方法は、任意のmDnP構成(m、nは自然数)に適用できる。ライトデータ(mD)は、ローカルドライブに格納され、冗長度を1減らした状態(冗長度がn-1)のデータが他ノードに転送される。
【0383】
例えば、3D2P構成(d1、d2、d3、p、q)において、ライトデータ(d1+d2+d3)はローカルドライブに格納され、データブロックd2、d3、p、qが異なるノードにそれぞれ転送される。転送されるデータブロックの組はこれに限定されず、例えば、データブロックd1、d2、d3、pが他ノードに転送されてもよい。
【0384】
本例の方法と、実施形態1で述べた、一つのストライプタイプ内のストライプから動的にストライプを選択し、選択したストライプから冗長コードを生成し、それらについての情報をメタデータ(例えばログ構造化マッピングテーブル213)として格納する方法とを組み合わせることにより、リードモディファイライト及びネットワークの転送量を低減でき、ライト処理の高性能を実現できる。また、本例の方法は、本例前で述べた複数の保護レイヤを有するシステムに適用できる。
【0385】
また、受信したライトデータのデータ長が短い場合(例えばランダムライト)は、冗長化のためのデータ転送は、ネットワークの帯域への影響が小さい。そのため、データ長が閾値より大きい場合(シーケンシャルライト)のみ、本例の冗長化処理を実行してもよい。データ長が閾値以下の場合、例えば、
図1に示す方法が適用される。
【0386】
これにより、プロセッサ処理とネットワーク帯域の利用率を向上できる。この場合、システムは、メタデータ(例えばログ構造化マッピングテーブル213)に、Class2 Codeの生成方法を適用しているか否かを示す情報を付加し、当該情報に従ってデータの処理を切り替えてもよい。また、Class1 codeを、ノード内パリティとしてローカルドライブに書き込み、パリティ生成の処理を効率化してもよい。
【0387】
図30は、
図29を参照して説明した冗長化のためのノード間の転送を効率化する方法における、データ復元方法を示す。
図30は、ノード101A及び101Bが故障し、ライトデータを復元する例を示す。
【0388】
ノード101C及び101Dは、それぞれClass2 codeから、Class1 codeを復元し、さらに、Class1 codeからノード101A及び101Bのユーザデータを復元する。
【0389】
具体的には、ノード101Cは、ノード101Dから取得したノード101Dのqパリティと、ローカルのx1、y1パリティとから、ノード101A及び101Bのpパリティを復元する。ノード101Dは、ノード101Dのユーザデータ(ローカルユーザデータ)からノード101Dのqパリティ(ローカルにパリティを保存していれば、それで代用してもよい)を生成する。
【0390】
ノード101Dは、ノード101Cから取得したノード101Cのqパリティと、ローカルのx1、y1パリティとから、ノード101A及び101Bのqパリティを復元する。ノード101Cは、ノード101Cのライトデータからノード101Cのqパリティを生成する。
【0391】
さらに、ノード101Cは、ノード101Dから取得したノード101Aのqパリティと、復元したノード101Aのpパリティと、から、ノード101Aのユーザデータd1、d2を復元する。ノード101Dは、ノード101Cから取得したノード101Bのpパリティと、復元したノード101Bのqパリティと、から、ノード101Bのユーザデータd1、d2を復元する。以上のように、2段階の復元処理により、ライトデータを回復することができる。
【0392】
<実施形態3>
(ログ構造(ドライブ)+パリティ生成(ドライブ)オフロード方式)
図31は、分散型ストレージシステムのハードウェア構成例を示す。
図3が示す構成例との主な差は、ネットワーク104により接続された計算機ノード101のバックエンドポートが、仮想的又は物理的なネットワーク103を介して複数のフラッシュドライブ3105に接続されている点である。一つのサイトには、1又は複数の計算機ノード101
が設置されている。
【0393】
計算機ノード101は、他の計算器ノードを介することなく、ネットワーク103を介してフラッシュドライブ3105それぞれと通信可能であり、ローカルドライブとして使用できる。一つのフラッシュドライブ3105は、一つの計算機ノード101とのみ通信する。
【0394】
バックエンドネットワーク103は、複数の計算機ノード101を相互接続してもよく、バックエンドネットワーク103が接続された計算機ノード101間は、バックエンドネットワーク103を使用して通信する。バックエンドネットワーク103で接続されていないノード間の通信は、例えば、外部ネットワーク104を使用する。
【0395】
ストレージドライブの一例であるフラッシュドライブ3105は、計算機ノード101と接続するためのI/F3101、データを一時的に格納するバッファメモリ3102、フラッシュドライブ3105を制御する内部プロセッサ3103、及びデータを格納する複数のフラッシュメモリ3104を含んで構成される。
【0396】
(概要)
図32は、本例の概要を示す。本例は、パリティ生成処理、及びログ構造化形式でのデータ格納処理をフラッシュドライブで実施する。これにより、計算機ノードは、冗長コードの生成及びログ構造化形式を意識することなく、ライト処理を実施できるため、ライト処理の時間を短縮できる。
【0397】
計算機ノード101は、例えば、実施形態1において説明した静的マッピングテーブル(例えばサイト静的マッピングテーブル211)を使用して、ライトデータと冗長コードそれぞれを格納するドライブを決定する。実施形態1の計算機ノードに代えて、ドライブが決定される。例えば、
図32に示す2台のDドライブ3219、P1ドライブ3220及びP2ドライブ3221が、一つのストライプタイプのデータドライブ及び冗長コードドライブに対応する。
【0398】
例えば、計算機ノード101は、ホストからのライトデータのアクセス先(例えば、ボリューム識別子及びボリューム内アドレス)に基づき静的マッピングテーブルのエントリを選択し、当該エントリが示す複数ドライブを、ライトデータ及び冗長コードを格納するドライブと決定する。サイト間保護レイヤが存在する場合、計算機ノード101は、他サイトの計算器ノード101にライトデータを転送する。ホストプログラムは、例えば、計算機ノード101内で実行されている。
【0399】
例えば、計算機ノード101は、ライトデータのドライブへのライト時、ライトデータを格納する一つのドライブ(Dドライブ)3219と、メインパリティを格納する一つのドライブ(P1ドライブ)3220へデータをライト(二重書き)する。このとき、計算機ノード101は、Dドライブ3219に対して、通常のライトコマンド(D_WRITE)による書き込みを行い(3210)、Dドライブ3219のデータバッファ3202を介して、データを媒体(LBA領域)3204へ書き込む。
【0400】
計算機ノード101は、P1ドライブ3220に対してパリティライトコマンド(P_WRITE)を発行し、Dドライブ3219に格納したデータの格納先情報とセットでデータを書き込む(3211)。パリティ生成バッファ3203へデータを書き込んだ後、P1ドライブ3220は、ドライブ内部でP1パリティ3207を生成し、媒体3204へP1パリティ3207を書き込む。
【0401】
P1ドライブ3220は、実施形態1のストライプタイプの冗長コード生成について説明したように、パリティ生成バッファ3203に書き込まれたデータブロックを動的に組合せ、P1パリティ3227を生成する。P1ドライブ3220は、P1パリティ3207を生成したデータの格納先の情報をメタデータ3209として、メタデータ格納域3205へ書き込む。
【0402】
例えば、パリティ数が2である場合、計算機ノード101は、Dドライブ3219とP1ドライブ3220に加え、2つ目以降のパリティであるサブパリティ(P2パリティ)を格納するドライブ(P2ドライブ)3221へ、データをライト(三重書き)する。P2ドライブ3221は、P1ドライブ3220と同様に、データをパリティ生成バッファ3203へ格納し、パリティ生成バッファ3203に書き込まれたデータブロックを動的に組合せ、P2パリティ3227を生成する。
【0403】
P2パリティを生成する際、P1ドライブ3220とP2ドライブ3221で生成するパリティのデータブロック組合せは同一である必要がある。P1ドライブ3220がP1パリティを生成後、P1ドライブ3220は、P1パリティを生成したデータブロックの組合せを、計算機ノード101を介して(P_GET、P_PUSH)、P2ドライブ3221へ通知する(3215)。その後、P2ドライブ3221は、通知されたデータブロックの組合せでP2パリティを生成する。
【0404】
計算機ノード101は、最新データのリード時、通常のリードコマンド(D_READ)でDドライブ3219から最新データ3206を読み込む(3212)。また、計算機ノード101は、旧データ3208を読み込むリードコマンド(OLD_D_READ)により、Dドライブ3219から旧データ3208を読み込む(3213)。
【0405】
計算機ノード101は、ログ構造化形式で書き込むための領域を確保するため、ドライブ3219~3221の使用量(空き容量)を監視し、必要に応じてガベージコレクション処理を実施する。計算機ノード101の容量管理ジョブ3201は、ライト完了後又は定期的にドライブ使用量(空き容量)を取得するコマンド(STAT_GET)を発行し、ドライブ使用量(ドライブ空き容量)を監視し、検出する(3214)。使用量が閾値より大きく(空き容量が閾値より小さく)、ドライブ空き容量の枯渇を検知した場合、計算機ノード101は、ガベージコレクション処理を実施する。
【0406】
ガベージコレクション処理は、P2ドライブ3221へ削除対象パリティを探索するコマンド(SEARCH)を発行し(3218)、ドライブ3221から削除対象パリティの格納先情報と削除対象パリティを構成するデータの情報を取得する。次に、パリティ構成データ情報からパリティを構成するデータが最新データか否かを判定し、最新データを、P1ドライブ3220へ転送し、再ダーティ化する。パリティ構成データ情報は、パリティの生成で使用されたデータブロックそれぞれの情報を示す。パリティを構成する全ての最新データを再ダーティ化した後、パリティを削除、旧データを無効化するコマンド(INVALID)を発行し(3217)、旧データを削除する。
【0407】
(ドライブ内のデータ管理構造)
図33は、ストレージシステムの制御のためにドライブ3105で管理するテーブル構造を示す。フラッシュメモリ3104は、ログ構造に関する情報である論物変換表3301、ログ変換表3302、データ保護に関する情報であるパリティーデータ変換表3307、データーパリティ変換表3308、及びアドレス識別子フリーキュー3309を格納する。
【0408】
論物変換表3301は、ドライブ3105が計算機ノード101に提供する論理アドレ
ス3302と、物理記憶領域に格納されたデータの物理アドレス3303との、対応関係を示す。
【0409】
ログ変換表3304は、データを一意に識別するためのアドレス識別子3305と、論物変換情報を格納しているログ情報3306との、対応関係を示す。ドライブ3105は、データが書き込まれる度に、更新した論物変換情報をログ情報として、アドレス識別子を付与し、管理する。他ドライブが保持するパリティを構成するデータの情報は、アドレス識別子で保持する。
【0410】
これにより、ドライブ3105が行うガベージコレクション処理やウェアレベリング処理により、自ドライブに格納するデータの物理アドレスが変更されても、他ドライブへ変更後の物理アドレスを通知しなくてよいため、ドライブ間の通信オーバヘッドを削減できる。
【0411】
パリティ-データ変換表3307は、自ドライブのパリティを格納している物理記憶領域のアドレス(LBA、データ長)と、パリティを生成した他ドライブのデータの物理記憶領域のアドレス(ドライブ番号、LBA、データ長、アドレス識別子)との、対応関係を示す。
【0412】
パリティは、複数のデータを元にした演算で生成するため、一個のパリティに対して、複数の他ドライブ上のデータ格納先の論理アドレスが対応する。また、ログストラクチャ形式でデータを格納するため、論理アドレスのデータは、旧データのアドレスも含みうる。このため、パリティを生成したデータの格納先を一意に判別できるように、アドレス識別子が同時に格納される。
【0413】
データ-パリティ変換表3308は、上述したパリティーデータ変換表の逆変換表である。他ドライブのデータを格納している物理記憶領域のアドレス(LBA、ドライブ番号)と、自ドライブのパリティを格納している物理記憶領域のアドレスとの、対応関係を示す。
【0414】
他ドライブに障害が発生し、データを復旧する必要がある場合、ドライブ3105は、データ-パリティ変換表3308により、他ドライブ上のデータの復旧に必要なパリティを格納している物理記憶領域のアドレスを特定する。また、パリティ-データ変換表3307により、データの復旧に必要な他ドライブのデータを格納している物理記憶領域のアドレスを特定することができる。
【0415】
アドレス識別子フリーキュー3309は、後述するライト処理を並列に実行する際に使用されるキューであり、未使用のアドレス識別子を格納している。計算機ノード101は、データを書き込むとき、アドレス識別子フリーキュー3309の先頭からアドレス識別子を取得(デキュー)し、アドレス識別子とともにドライブ3105へデータのライト処理を発行する。
【0416】
ドライブ3105は、ログ変換表3304へログ情報を指定されたアドレス識別子で格納する。また、計算機ノード101は、旧データがinvalidateされる契機で、invalidateされたアドレス識別子を、アドレス識別子フリーキュー3309の末尾へ登録(エンキュー)する。
【0417】
(I/F一覧)
図34は、計算機ノード101とフラッシュドライブ3105との間の通信インタフェースを示している。D_WRITEコマンド3401は、Dドライブ3219のドライブ
番号、LBA、データ転送長を引数とし、Dドライブ3219へ書き込みを行う。その後、ログ構造のメタデータであるアドレス識別子を出力する。
【0418】
アドレス識別子は、ドライブに格納されたデータに対応付けられた不変な識別子である。具体的には、アドレス識別子は、ドライブ内の論理アドレスと物理アドレスとのマッピング情報に付与する、ドライブ内で一意な識別子である。
【0419】
P_WRITEコマンド3402は、パリティを格納するP1ドライブ3220又はP2ドライブ3221のドライブ番号、データ転送長、データ格納情報を引数とし、ドライブへ書き込みを行う。データ格納情報は、Dドライブのドライブ番号、LBA、アドレス識別子からなる。
【0420】
D_READコマンド3403は、ドライブ番号、LBA、データ転送長を引数とし、Dドライブ3219から最新データを読み出す。OLD_D_READコマンド3404は、ドライブ番号、アドレス識別子、データ転送長を引数とし、Dドライブ3219から旧データを読み出すコマンドである。
【0421】
P_GETコマンド3405は、Dドライブのドライブ番号を引数とし、引数で指定したP1ドライブ3220から非同期デステージ処理で生成されたパリティで、P2ドライブ3221への未通知のパリティ構成データ情報を出力する。パリティ構成データ情報は、パリティの生成で使用されたデータブロックそれぞれのDドライブのドライブ番号、LBA、アドレス識別子からなる。
【0422】
P_PUSHコマンド3406は、P1ドライブ3220のドライブ番号と、パリティ構成データ情報を引数とし、P2ドライブ3221へパリティ構成データ情報を通知する。パリティ構成データ情報は、Dドライブのドライブ番号、LBA、アドレス識別子からなる。
【0423】
STAT_GETコマンド3407は、ドライブ番号を引数として、引数で指定されたドライブの使用量の情報を出力する。STAT_GETコマンド3407は、ドライブの容量枯渇監視に使用される。INVALIDコマンド3408は、ガベージコレクション処理時、Dドライブ3219のドライブ番号、アドレス識別子を引数とし、不要となった旧データを無効化する。
【0424】
SEARCHコマンド3409は、ガベージコレクション処理時、P1ドライブ3220へ削除対象パリティの探索を依頼し、探索結果として、削除対象パリティの情報と、削除対象パリティのパリティ構成データ情報を出力する。削除対象パリティ情報は、P1ドライブ3220のドライブ番号とLBAからなり、削除対象パリティ構成データ情報は、Dドライブのドライブ番号、LBA、アドレス識別子、及び最新データか否かの情報からなる。
【0425】
以上のコマンドにより、計算機ノード101とドライブ3105間で通信を行い、処理を実現する。
【0426】
(リード処理)
(最新データのリード)
図35は、計算機ノード101がDドライブ3219から最新データを読み込む処理のフローチャートを示す。本処理は、ホストからリード命令を受領した場合に実行される(S3501)。
【0427】
まず、ホストからリード命令を受領した計算機ノード101のプロセッサ119は、キャッシュ上にデータが存在するかどうか確認する(S3502)。キャッシュ上にデータが存在する場合(S3502:Y)、プロセッサ119は、ホストへキャッシュ上のデータを返却する(S3510)。
【0428】
キャッシュ上にデータが存在しない場合(S3502:N)、プロセッサ119は、キャッシュを確保(S3503)した後、Dドライブ3219へD_READコマンドを発行する(S3504)。
【0429】
Dドライブ3219は、D_READコマンドを受領すると(S3505)、論物変換表3301を参照してデータを格納している物理アドレスを取得する(S3506)。次に、Dドライブ3219は、フラッシュメモリ(媒体)3104からデータをリードし(S3507)、計算機ノード101へ結果を返却する(S3508)。計算機ノード101は、Dドライブ3219からD_READの結果を受け取ると(S3509)、結果をホストへ返却する(S3510)。
【0430】
(旧データのリード)
図36は、旧データのリード処理を示している。旧データのリード処理では、まず計算機ノード101は、OLD_D_READコマンドをDドライブ3219へ発行する(S3601)。Dドライブ3219は、OLD_D_READコマンドを受領すると(S3602)、指定されたアドレス識別子に対応する旧データを格納している物理アドレスを、ログ変換表3304から取得する(S3603)。
【0431】
次に、Dドライブ3219は、フラッシュメモリ(媒体)3104から旧データをリードし(S3604)、計算機ノード101へ結果を返却する(S3605)。計算機ノード101は、Dドライブ3219からOLD_D_READの結果を受け取る(S3606)。
【0432】
(ライト処理)
図37は、計算機ノード101がDドライブ3219へデータを書き込む処理のフローチャートを示す。ライト処理は、二つの処理を含む。一の処理は、ホストへライト結果を返却するまでの同期ライト処理である。もう一つの処理は、ドライブ内のパリティ生成バッファに蓄積されたデータからパリティを生成し、媒体へ格納する非同期ライト処理である。
【0433】
まず、同期ライト処理について説明する。本処理は、ホストからライト命令を受領した場合に実行する。本処理は、Dドライブ3219へライトデータを格納し、且つパリティを生成するドライブ(P1ドライブ3220とP2ドライブ3221)へ、アドレス識別子とセットでデータを書き込む。
【0434】
計算機ノード101のプロセッサ119は、ホストからライト命令を受領すると(S3701)、Dドライブ3219へD_WRITEコマンドを発行する(S3702)。D_WRITEコマンドは、ライトデータを含む。Dドライブ3219は、D_WRITEコマンドを受け取ると(S3703)、フラッシュメモリ(媒体)3104へ、ライトデータをログ構造形式でライトし(S3704)、さらに、Dドライブ3219は、メタデータ(論物変換表3301とログ変換表3304)を更新する(S3705)。Dドライブ3219は、データ格納先のアドレス識別子を計算機ノード101へ返却する(S3706)。
【0435】
計算機ノード101は、Dドライブ3219からD_WRITEの結果を受け取ると(
S3707)、Dドライブ3219へのデータ格納情報とセットで、P1ドライブ3220へP_WRITEコマンドを発行する(S3708)。
【0436】
P1ドライブ3220は、P_WRITEコマンドを受け取ると(S3709)、ドライブのパリティ生成バッファ3203へライトデータを格納し(S3710)、計算機ノード101へ結果を返却する(S3711)。
【0437】
計算機ノード101は、P1ドライブ3220からP_WRITEコマンドの結果を受け取ると(S3712)、Dドライブ3219へのデータ格納情報とセットで、P2ドライブ3221へP_WRITEコマンドを発行する(S3713)。
【0438】
P2ドライブ3221は、P_WRITEコマンドを受け取ると(S3714)、パリティ生成バッファ3203へライトデータをライトし(S3715)、計算機ノード101へ結果を返却する(S3716)。計算機ノード101は、P2ドライブ3221からP_WRITEコマンドの結果を受け取ると(S3717)、ホストへ結果を返却する(S3718)。
【0439】
上述の同期ライト処理を繰り返し実行した結果、P1ドライブ3220のパリティ生成バッファ3203内に所定数のデータが蓄積する、又は、所定時間が経過すると、P1ドライブ3220は、内部で非同期ライト処理を実施する(S3719)。
【0440】
まず、P1ドライブ3220は、パリティ生成バッファ3203に蓄積されたデータから動的にデータブロックを選択して、P1パリティを生成する(S3720)。次に、メタデータ(パリティ-データ変換表3307及びデーターパリティ変換表3308)を更新し(S3721)、P1パリティをフラッシュメモリ(媒体)3104へ書き込む(S3722)。
【0441】
次に、計算機ノード101は、P_GETコマンドにより、P1パリティのパリティ構成データ情報を、P1ドライブ3220から取得する(S3723、S3724)。計算機ノード101は、P1ドライブ3220より取得したパリティ構成データ情報を、P2ドライブ3221へP_PUSHコマンドにより通知する(S3725)。
【0442】
P2ドライブ3221は、計算機ノード101からP_PUSHコマンドを受信すると、受信したパリティ構成データ情報に基づきP2パリティを生成し(S3726)、メタデータ(P2パリティのパリティ-データ変換表3307及びデータ-パリティ変換表3308)を更新し(S3727)、P2パリティをフラッシュメモリ(媒体)3104へ書き込む(S3728)。
【0443】
図38は、同期ライト処理において各ドライブへデータのライト処理を並行に実施した場合の処理フローを示している。
図37との差は、計算機ノード101がドライブ3219~3221へ、使用するアドレス識別子を指定することで、Dドライブ3219の応答を待たずに、パリティを生成するドライブ3220、3221へライトコマンドを発行している点である。
【0444】
また、Dドライブ3219へのライトは、D_WRITEコマンド3401ではなく、アドレス識別子を指定し書き込むためのD_WRITE2コマンド3805を使用する。D_WRITE2コマンド3805は、Dドライブ3219のドライブ番号、LBA、データ転送長、アドレス識別子を引数とし、Dドライブ3219へ書き込みを行うためのコマンドである。
【0445】
計算機ノード101は、ホストからライト命令を受領すると(S3701)、アドレス識別子フリーキュー3309の先頭からアドレス識別子を取得し(S3801)、アドレス識別子フリーキュー3309の先頭ポインタを更新する(S3802)。次に、計算機ノード101は、取得したアドレス識別子を引数とし、Dドライブ3219へD_WRITE2コマンドを発行する(S3803)。
【0446】
計算機ノード101は、P1ドライブ3220とP2ドライブ3221へ、取得したアドレス識別子をデータ格納情報に指定し、P_WRITEコマンドを発行する(S3708、S3713)。
【0447】
Dドライブ3219は、指定されたアドレス識別子を使用し、ログ変換表3304へログ情報を格納する。P1ドライブ3220、及びP2ドライブ3221は、
図37と同様に各々処理を実行した後、計算機ノード101へ結果を返却する(S3703~S3706、S3709~S3711、S3714~S3716)。
【0448】
計算機ノード101は、全ドライブ3219~3221から結果を受信するまで、待機する(S3804)。全ドライブ3219~3221から結果を受信すると、計算機ノード101は、ホストへ結果を返却する(S3718)。
【0449】
P1ドライブ3220とP2ドライブ3221は、
図37のS3719~S3728で説明した処理と同様に、非同期でパリティを生成し、フラッシュメモリ(媒体)3104へ格納する。以上のように、各ドライブで並行してライト処理を行うことで、ホストへの応答時間を短縮できる。
【0450】
(ガベージコレクション処理)
図39は、ガベージコレクション処理のフローチャートを示す。本処理は、ドライブに格納されたデータ量が予め設定された目標容量(閾値)を超えた場合に、不要なデータを消去する。これにより、必要なデータを限られた領域に格納できる。消去されるデータの種類は、ライトデータとパリティである。本処理は、ホストI/Oと同期して実行されてもよいし、ホストI/Oと非同期で実行されてもよい。
【0451】
計算機ノード101は、Dドライブ3219の使用量が目標量を超過しているかどうかをチェックする(S3901)。具体的には、計算機ノード101は、容量管理ジョブ3201の監視結果から、使用量がターゲット容量を超えているかどうかにより判定する。なお、容量管理ジョブ3201の監視結果は、ローカル領域量テーブル802により管理されてもよい。
【0452】
ドライブ使用量が目標容量を超えている場合(S3901:Y)、計算機ノード101は、ガベージコレクション処理を開始する。ガベージコレクション処理では、計算機ノード101は、容量枯渇を検出したDドライブ3219のデータから生成されたP1パリティを格納するP1ドライブ3220に対して、削除対象P1パリティを探索するSERCHコマンドを発行する。
【0453】
P1ドライブ3220は、SERCHコマンドを受信すると、パリティ-データ変換表3307を参照し、引数で指定されたドライブ番号をパリティ構成データ情報として持つP1パリティを探索する。対象P1パリティを見つけると、P1ドライブ3220は、次にデータ-パリティ変換表3308を参照し、探索結果のデータが旧データかどうか確認する。
【0454】
確認の結果、データが旧データであった場合、P1ドライブ3220は、当該P1パリ
ティを削除対象パリティと判定する。次に、P1ドライブ3220は、当該P1パリティを構成する全データの新旧を、データ-パリティ変換表3308を参照して確認し、計算機ノード101へ、結果(削除対象パリティと削除対象パリティ構成データ情報)を返却する(S3902)。
【0455】
次に、計算機ノード101は、返却された削除対象パリティ構成データ情報から、P1パリティを構成する各データの新旧情報を確認し、削除対象P1パリティが即時削除可能か判定する(S3903)。P1パリティを構成するデータが全て旧データである場合(S3903:Y)、計算機ノード101は、当該P1パリティを削除し(S3906)、さらに、当該P1パリティを構成するデータを、INVALIDコマンドによりデータ格納先のDドライブ3219から削除する(S3907)。
【0456】
ライト処理の並列化を行っている場合、計算機ノード101は、INVALIDコマンドの結果を受信すると、アドレス識別子フリーキュー3309の末尾にINVALIDしたアドレス識別子を登録(エンキュー)する。また、計算機ノード101は、P2ドライブ3221に対しても、同一データの組合せで構成されるP2パリティを削除することを指示する。
【0457】
次に、P1パリティを構成するデータに最新データが含まれる場合(S3903:N)、計算機ノード101は、D_READコマンドによって最新データをDドライブ3219からリードし、P_WRITEコマンドにより、P1ドライブ3220とP2ドライブ3221へデータ格納情報とセットで書き込む(S3905、S3908)。
【0458】
ライト後、計算機ノード101は、P1ドライブ3220とP2ドライブ3221から旧P1パリティ、旧P2パリティを削除し(S3906、S3909)、またINVALIDコマンドによりDドライブ3219から旧データを削除する(S3907)。以上の処理を繰り返し、パリティとデータの削除を行う。
【0459】
また、P1ドライブ3220は、
図37で説明した非同期ライト処理により、新P1パリティを生成し、メタデータを更新し、新P1パリティをフラッシュメモリ(媒体)3104へ格納する。P2ドライブ3221も同様に非同期ライト処理により、新P2パリティを生成し、メタデータを更新し、新P2パリティをフラッシュメモリ(媒体)3104へ格納する。
【0460】
<実施形態4>
(ログ構造(ドライブ)+パリティ生成(コントローラ)オフロード方式)
図40は、分散型ストレージシステムのハードウェア構成例を示す。実施形態3との差は、計算機ノード101内部に、パリティ生成処理部を実装している点である。パリティ生成処理部は、ハードウェア又はソフトウェアで実装できる。ストレージシステムは、複数の計算機ノード101を含んで構成されており、各計算機ノード101は、内部に、パリティを生成する機能を持つ、パリティ生成処理部4006を含む。
【0461】
また、各計算機ノード101は、フロントエンドネットワーク4002により、ホスト計算機4001へ接続されており、計算機ノード101間は、内部ネットワーク4003で接続され、計算機ノード101とドライブ3105は、バックエンドネットワーク4004で接続されている。複数の計算機ノード101が、一つのドライブ3105にアクセスできる。
【0462】
(概要)
図41は、本例の概要を示す。実施形態3との差は、パリティ生成処理を計算機ノード
が実施するため、P1ドライブ3220とP2ドライブ3221は、I/O非同期でパリティを生成する必要がない点である。このため、パリティ数が2以上の場合、P1パリティのパリティ構成データ情報をP2ドライブ3221へ通知する必要がなく、計算機ノード101とドライブ3219~3221の処理負荷を削減でき、ライト処理時間を短縮できる。
【0463】
具体的には、ライト処理は、ホストから受け取ったデータを計算機ノード101内のパリティ生成バッファ4101へ格納し、パリティ生成バッファ4101からパリティ生成処理部4006へパリティ生成処理を依頼する(4101)。次に、パリティ生成処理部4006はパリティを生成し、生成したパリティを、パリティを格納するドライブへ書き込む(4102)。
【0464】
また、ガベージコレクション処理での、実施形態3との差は、削除対象パリティを構成するデータに最新データが含まれる場合、最新データをDドライブ3219から読み出した後、パリティ生成処理部4006へデータを転送し、新パリティを生成する点である。リード処理は、実施形態3と同様である。
【0465】
(I/F一覧)
図42は、計算機ノード101とドライブ3219~3221との間の通信インタフェースを示している。実施形態3におけるP_WRITEコマンド3402の代わりに、P_WRITE2コマンド4201がある。
【0466】
P_WRITE2コマンド4201は、ドライブ番号、LBA、データ転送長、パリティ構成データ情報の配列を引数とし、パリティをドライブに書き込む。パリティ構成データ情報は、ドライブ番号、LBA、アドレス識別子からなる。つまり、P_WRITE2コマンド4201は、複数のデータ格納先を、パリティ構成データ情報として、パリティと共にドライブへ書き込む。
【0467】
(ライト処理)
(同期ライト処理)
本例のライト処理は、実施形態3と同様に、同期ライト処理と非同期ライト処理とを含む。
図43は、本例での同期ライト処理のフローチャートを示している。まず、ホストからライト命令を受領すると(S4301)、計算機ノード101は、Dドライブ3219へD_WRITEコマンドを発行する(S4302)。
【0468】
Dドライブ3219は、D_WRITEコマンドを受領すると(S4303)、データをフラッシュメモリ(媒体)3104にライトし(S4304)、メタデータ(論物変換表3301とログ変換表3304)を更新し(S4305)、計算機ノード101へ結果(アドレス識別子)を返却する(S4306)。
【0469】
次に、計算機ノード101は、Dドライブ3219から結果を受領すると(S4307)、データを、計算機ノード101内にあるパリティ生成バッファ4101へ格納し(S4308)、ホストへ結果を返す(S4309)。
【0470】
なお、同期ライト処理は、
図38で説明したようにアドレス識別子フリーキュー3309とD_WRITE2コマンド3805を使用することで、Dドライブ3219へのデータの書き込みと、パリティ生成バッファへ4101のデータの格納を並列に実行してもよい。
【0471】
(非同期ライト処理)
図44は、本例での非同期ライト処理のフローチャートを示している。同期ライト処理を繰り返し実行した結果、パリティ生成バッファ4101内に所定数のデータが蓄積する、又は、所定時間が経過すると、計算機ノード101は、非同期ライト処理を実施する(S4401)。
【0472】
計算機ノード101のメイン処理部4405は、パリティ生成バッファ4101に蓄積されたデータからパリティ生成対象のデータを、パリティ生成処理部4006へ転送する(S4402)。メイン処理部4405は、例えば、プログラムに従って動作するプロセッサ119により実現される。パリティ生成処理部4006は、データを受信すると(S4403)、受信したデータをその内部バッファへ格納する(S4404)。
【0473】
次に、パリティ生成処理部4006は、受信したデータで、P1パリティとP2パリティを生成し(S4405)、生成したパリティをメイン処理部4405へ転送する(S4406)。
【0474】
メイン処理部4405は、パリティ生成処理部4006から、P1パリティとP2パリティを受信すると(S4407)、P_WRITEコマンドにより、パリティを構成するデータ情報とともにP1ドライブ3220とP2ドライブ3221へ書き込む(S4408)。
【0475】
P1ドライブ3220は、P_WRITEコマンドを受信すると(S4409)、フラッシュメモリ(媒体)3104へパリティを書き込み(S4410)、メタデータ(パリティ-データ変換表3307とデータ-パリティ変換表3308)を更新し(S4411)、結果を計算機ノード101へ返却する(S4412)。
【0476】
一方、P2ドライブ3221も、P1ドライブ3220と同様の処理を行い、計算機ノード101へ結果を返却する(S4413~S4416)。メイン処理部4405は、P1ドライブ3220とP2ドライブ3221から結果を受領すると、処理を終了する(S4417)。
【0477】
(ガベージコレクション処理)
図45は、本実施形態のガベージコレクション処理のフローチャートを示している。ステップS4201~S4204、S4207は、ステップS3901~S3904、S3907に対応する。
【0478】
実施形態3との主な差は、削除対象パリティを構成するデータのうち最新データを、計算機ノード101のパリティ生成バッファ4101へ格納する点である(S4501)。これにより、実施形態3のようにドライブへデータを再度書き込む必要がなく、ガベージコレクションの処理性能を向上できる。また、ステップS4501、S4206は、P1パリティ格納ドライブ及びP2パリティ格納ドライブに対して実行される。
【0479】
パリティ生成バッファ4101内に所定数のデータが蓄積する、又は所定時間が経過すると、計算機ノード101は、
図44で説明した非同期ライト処理を実施し、新パリティを生成した後、パリティをドライブへ書き込む。
【0480】
以上の例は、冗長コードとデータのアドレッシングの対応関係を各ノードにおいて管理する。他の例において、2種類の仮想的な空間を用意して、その仮想的な空間の対応関係を動的に変えることで、データ保護技術を実施してもよい。具体的には、システムは、上位論理装置に提供する第1の仮想空間と、物理記憶領域上の冗長コードとデータの記憶アドレスと静的に対応づけられた第2の仮想空間と、を準備する。システムは、第1の仮想
空間と第2の仮想空間とを動的に対応付けることで、複数ノードからのデータより冗長コードデータ生成を可能とする。
【0481】
この場合、システムは、ストライプタイプを構成する複数ノード間で、書き込み先ポインタなどを共有する。書き込み先ポインタは、複数ノード間で第2の仮想空間に対してログ形式でインクリメンタルに追記していく想定で、その書き込みの現在位置を表すポインタである。
【0482】
さらに、システムは、当該書き込み先ポインタが一致するように、つまり、複数ノードからの各データとそれらに対応する冗長コードからなる複数のデータが第2の仮想空間上の所定の領域に対応づけられて書きこまれるように、第1の仮想空間と第2の仮想空間との間の対応づけを制御する。
【0483】
本開示のデータ保護技術及びデータ配置技術は、キャッシュ上の複数の異なるノードから転送されたデータユニット(データブロック)の組から、冗長コードを動的に生成する。つまり、コードダーティキュー901で管理されるデータのうち、同じストライプタイプデータを任意に選択する(
図18のS802)結果、一つのノードが生成するノード間冗長コード組み合わせを構成するデータブロックの論理アドレスは一つの組み合わせに固定されず、2以上の組み合わせを許容することになる。
【0484】
一方で、本開示においては
図8に示すように各データブロックとその転送元アドレスとを関連づけて管理することで、動的な論理アドレスの組み合わせでの冗長コード生成を許容する。更に、冗長コード生成のために用いられるデータの数も特定の値に限定されず、動的に変更されうる。以上の構成により、小オーバヘッドのデータ保護を実現しつつ、ネットワークボトルネックを回避し、高速にローカルアクセスが可能なデータ配置を実現する。また、ドライブがSSDの場合は、ライト量を削減でき、長寿命化を実現できる。
【0485】
本開示のデータ保護技術及びデータ配置技術により、ローカルリードに適したデータ配置とデータ保護の両立を可能とし、ネットワークによるボトルネックを回避できる。さらに、ローカルストレージデバイスに格納するデータの管理情報は自系内で保持可能であるので、仮想ボリュームとプールボリュームの情報を少数ノードの共有に閉じることができ、共有する情報を低減する。これにより、ノード数に依存しない高いスケーラビリティを実現できる。また、高いスケーラビリティにより、システム構築にかかるネットワークのコストを低減することができる。
【0486】
なお、分散型ストレージシステムにおける上記複数機能は、独立に実装することができる。例えば、冗長コードの生成機能、再配置機能、及びページ配置ノードの指定を受け付ける機能のうちの一つのみが分散型ストレージシステムに実装しなくてもよい。ノード構成は、上記計算機構成に限定されない。上記ノード保護レイヤは省略されてもよい。さらに、サイト保護レイヤ又はサイト保護レイヤの一方のみが実装されてもよい。
【0487】
なお、本発明は上記した実施例に限定されるものではなく、様々な変形例が含まれる。例えば、
図3に示すドライブ113は計算機ノード101の筐体内に存在する必要はなく、各プロセッサが自系のストレージデバイスであって、管理対象であると認識していれば良い。上記した実施例は本発明を分かりやすく説明するために詳細に説明したものであり、必ずしも説明したすべての構成を備えるものに限定されるものではない。また、ある実施例の構成の一部を他の実施例の構成に置き換えることが可能であり、また、ある実施例の構成に他の実施例の構成を加えることも可能である。また、各実施例の構成の一部について、他の構成の追加・削除・置換をすることが可能である。
【0488】
また、上記の各構成・機能・処理部等は、それらの一部又は全部を、例えば集積回路で設計する等によりハードウェアで実現してもよい。また、上記の各構成、機能等は、プロセッサがそれぞれの機能を実現するプログラムを解釈し、実行することによりソフトウェアで実現してもよい。各機能を実現するプログラム、テーブル、ファイル等の情報は、メモリや、ハードディスク、SSD等の記録装置、または、ICカード、SDカード等の記録媒体に置くことができる。
【0489】
また、制御線や情報線は説明上必要と考えられるものを示しており、製品上必ずしもすべての制御線や情報線を示しているとは限らない。実際には殆どすべての構成が相互に接続されていると考えてもよい。
【0490】
特許請求範囲に記載されている構成に加え、本開示の特徴の概要を以下に記載する。
(1-1)
ストレージシステムは、1以上の計算機と、複数のストレージドライブと、を含み、
前記1以上の計算機は、ライトデータブロックを格納するデータドライブ及び前記ライトデータブロックの冗長コードを格納する第1冗長コードドライブを決定し、
前記1以上の計算機は、前記ライトデータブロックを前記データドライブ及び前記第1冗長コードドライブにそれぞれ送信し、
前記データドライブは、前記ライトデータブロックを記憶媒体に格納し、
前記第1冗長コードドライブは、前記1以上の計算機から受信した複数のライトデータブロックを使用して冗長コードを生成し、記憶媒体に格納する。
(1-2)
前記第1冗長コードドライブは、
受信したライトデータブロックそれぞれのライト先に基づいて、前記受信したライトデータブロックそれぞれが属するストライプタイプを決定し、
同一ストライプタイプに含まれる複数のライトデータブロックから冗長コードを生成する。
(1-3)
前記第1冗長コードドライブは、
前記1以上の計算機から、前記ライトデータブロックの格納先情報をさらに受信し、
前記冗長コードの格納先と前記ライトデータブロックの格納先との関係を管理する。
(1-4)
前記1以上の計算機は、前記ライトデータブロックを、前記ライトデータブロックの格納先情報と共に、第2冗長コードドライブにさらに送信し、
前記第2冗長コードドライブは、前記第1冗長コードドライブにおいて冗長コードの生成で使用されたデータブロックの情報を示す構成情報を取得し、前記構成情報に従って選択したデータブロックを使用して冗長コードを生成する。
(1-5)
ストレージシステムは、計算機と、複数のストレージドライブと、を含み、
前記計算機は、ライトデータブロックを格納するデータドライブ及び前記ライトデータブロックの冗長コードを格納する冗長コードドライブを決定し、
前記計算機は、前記ライトデータブロックを前記データドライブに送信し、
前記データドライブは、前記ライトデータブロックを記憶媒体に格納し、
前記計算機は、前記ライトデータを使用して冗長コードを生成し、
前記計算機は、前記冗長コードと、前記冗長コードの生成で使用されたデータブロックの情報を示す構成情報と、を前記冗長コードドライブに送信し、
前記冗長コードドライブは、前記冗長コードを記憶媒体に格納し、
前記冗長コードドライブは、前記冗長コードの格納先と前記ライトデータブロックの格納先との関係を管理する。
(2-1)
分散型ストレージシステムであって、
ネットワークを介して通信する複数のノードと、
前記分散型ストレージシステムは更に複数のストレージデバイスと、を含み、
少なくとも3以上のノードを含む第1ノードグループが予め定義されており、
前記第1ノードグループのノードそれぞれは、その管理しているストレージデバイスに格納するデータを、前記第1ノードグループに属する他ノードに送信し、
前記第1ノードグループの第1ノードは、前記第1ノードグループの2以上の他ノードから、データを受信し、
前記第1ノードは、前記2以上の他ノードから受信したデータの組み合わせを使用して冗長コードを生成し、
前記第1ノードは、前記生成した冗長コードを、前記冗長コードを生成したデータを格納するストレージデバイスとは異なるストレージデバイスに格納し、
前記第1ノードが生成する冗長コードのうち、少なくとも二つの冗長コードのデータ組み合わせは、構成するデータの論理アドレスの組み合わせが異なる、分散型ストレージシステム。
(2-2)
2-1に記載の分散型ストレージシステムであって、
前記第1ノードグループのノードそれぞれは、前記管理しているストレージデバイスに格納するデータから、ノード内冗長コードを生成する、分散型ストレージシステム。
(2-3)
2-1に記載の分散型ストレージシステムであって、
前記第1ノードは、
キャッシュを含み、
前記2以上の他ノードから受信したデータを前記キャッシュに一時的に格納し、
前記キャッシュに一時的に格納した前記データからデータを選択し、
前記選択したデータから一つの冗長コードを生成する、分散型ストレージシステム。
(2-4)
2-1に記載の分散型ストレージシステムであって、
前記第1ノードは、前記冗長コードそれぞれと、前記冗長コードそれぞれの生成に使用したデータの送信元ノードそれぞれにおける論理アドレス情報とを、関連付けて管理する、分散型ストレージシステム。
(2-5)
2-1に記載の分散型ストレージシステムであって、
前記冗長コードそれぞれを生成するデータの数は不定である、分散型ストレージシステム。
(2-6)
請求項1に記載の分散型ストレージシステムであって、
前記複数のノードにおいて、少なくとも3以上のノードを含む第2ノードグループ及び第3ノードグループが予め定義されており、
前記第2ノードグループに属する第2ノードは、
前記第1ノードグループに属するノード及び前記第3ノードグループに属するノードから受信したデータを使用して第2レベル冗長コードを生成し、
前記第2レベル冗長コードを、前記第2ノードが管理するストレージデバイスに格納する、分散型ストレージシステム。
(2-7)
2-1に記載の分散型ストレージシステムであって、
前記第1ノードは、前記冗長コードを格納する領域が閾値に達した後、
前記領域に格納されている第1冗長コードと第2冗長コードを選択し、
前記第1冗長コードと前記第2冗長コードをマージして、異なるノードのみから送信されたデータの第3冗長コードを生成し、
前記第1冗長コードと前記第2冗長コードとを消去して前記第3冗長コードを前記領域に格納する、分散型ストレージシステム。
(2-8)
2-1に記載の分散型ストレージシステムであって、
前記第1ノードに第1データを送信した前記第1ノードグループに属する第2ノードは、前記第1データを前記第2ノードが管理するストレージでバイスから消去する前に、前記第1データを前記第1ノードに送信し、
前記第1ノードは、前記第1データを使用して、前記第1データを使用して生成した第1冗長コードを更新する、分散型ストレージシステム。
(2-9)
2-1に記載の分散型ストレージシステムであって、
前記第1ノードグループに属し、前記第1ノードに第1データを送信した第2ノードは、
前記第1データの更新データと、前記第1データとを使用して、中間データを生成し、前記中間データを前記第1ノードに送信し、
前記第1ノードは、前記中間データを使用して前記第1データを使用して生成した冗長コードを更新する、分散型ストレージシステム。
(2-10)
2-2に記載の分散型ストレージシステムであって、
前記第1ノードは、
前記管理しているストレージデバイスに格納するデータを分割して、ノード内冗長コードを生成し、
前記分割したデータの少なくとも一部、及び、前記ノード内冗長コードを、前記第1ノードグループの他ノードに送信し、
前記第1ノードが生成する冗長コードに使用されるデータの組み合わせは、他のノードから送信されたノード内冗長コードを含む、分散型ストレージシステム。
(2-11)
2-1に記載の分散型ストレージシステムであって、
前記第1ノードグループに属する複数のノードが格納するデータを使用して冗長コードを生成するノードは、前記第1ノードグループにおいて分散されている、分散型ストレージシステム。
(2-12)
ネットワークを介して通信する複数ノードを含む分散型ストレージシステムにおける一つのノードにおいて実行されるデータ制御方法であって、
前記分散型ストレージシステムは更に複数のストレージデバイスを含み、
少なくとも3以上のノードを含む第1ノードグループが予め定義されており、
前記データ制御方法は、
管理するストレージデバイスに格納するデータを、前記第1ノードグループに属する他ノードに送信し、
前記第1ノードグループに属する2以上の他ノードから受信したデータの組み合わせを使用して冗長コードを生成し、
前記生成した冗長コードを、前記冗長コードを生成したデータを格納するストレージデバイスとは異なるストレージデバイスに、格納する、ことを含み、
生成する冗長コードのうち、少なくとも二つの冗長コードを生成するデータ組み合わせは、構成するデータの論理アドレスの組み合わせが異なる、方法。
(2-13)
2-12に記載の方法であって、
前記管理しているストレージデバイスに格納するデータから、ノード内冗長コードを生成することをさらに含む、方法。
(2-14)
2-12に記載の方法であって、
前記2以上の他ノードから受信したデータをキャッシュに一時的に格納し、
前記キャッシュに一時的に格納した前記データからデータを選択し、
前記選択したデータから一つの冗長コードを生成する、方法。
(2-15)
2-12に記載の方法であって、
前記冗長コードそれぞれと、前記冗長コードそれぞれの生成に使用したデータの送信元ノードそれぞれにおける論理アドレス情報とを、関連付けて管理する、方法。
(3-1)
分散型ストレージシステムであって、
ネットワークを介して通信する複数のノードを有し、
前記複数のノードそれぞれは、データを格納するストレージデバイスを有し、
前記複数のノードのうちの第1のノードは、
上位装置からライト要求とともに複数のユーザデータを受信し、
前記受信した複数のユーザデータに基づいて、第1の冗長コードを生成し、
前記生成した第1の冗長コードと、前記第1の冗長コードの生成の基になった複数のユーザデータとを、前記複数のノード内のそれぞれ異なる複数の他ノードに送信するとともに前記受信した複数のユーザデータを、前記第1のノードのストレージデバイスに格納し、
前記複数のノードのうちの第2のノードは、
前記複数のノード内のそれぞれ異なる複数の他ノードから、ユーザデータ及び第1の冗長コードを受信し、
前記複数の他ノードから受信したユーザデータ及び前記第1の冗長コードに基づいて、第2の冗長コードを生成し、
前記第2の冗長コードを、前記第2のノードのストレージデバイスに格納することを特徴とする分散型ストレージシステム。
(3-2)
3-1に記載の分散型ストレージシステムであって、
各々の前記ノードが、前記第1のノード及び前記第2のノードとしての機能を有することを特徴とする分散型ストレージシステム。
(3-3)
3-2に記載の分散型ストレージシステムであって、
前記第2のノードは、前記受信したユーザデータまたは/及び前記第1の冗長コードを、自ノードの前記ストレージデバイスに格納しないことを特徴とする分散型ストレージシステム。
(3-4)
3-2に記載の分散型ストレージシステムであって、
前記第1のノードが他ノードに送信する前記ユーザデータ及び第1の冗長コードの数は、受信したユーザデータ及び生成した第1の冗長コードの数よりも少ないことを特徴とする分散型ストレージシステム。
(3-5)
3-2に記載の分散型ストレージシステムであって、
前記第1の冗長コードは、同じ複数の前記ユーザデータから複数生成されることを特徴とする分散型ストレージシステム。
(3-6)
3-2に記載の分散型ストレージシステムであって、
前記第2の冗長コードは、同じ前記ユーザデータまたは/及び前記第1の冗長コードから複数生成されることを特徴とする分散型ストレージシステム。
(3-7)
ネットワークを介して通信する複数のノードを有し、前記複数のノードは、それぞれデータを格納するストレージデバイスを有する分散型ストレージシステムにおけるデータ処
理方法であって、
前記複数のノードのうちの第1のノードは、
上位装置からライト要求とともに複数のユーザデータを受信し、
前記受信した複数のユーザデータに基づいて、第1の冗長コードを生成し、
前記生成した第1の冗長コードと、前記第1の冗長コードの生成の基になった複数のユーザデータとを、前記複数のノード内のそれぞれ異なる複数の他ノードに送信し、
前記受信した複数のユーザデータを、前記第1のノードのストレージデバイスに格納し、
前記複数のノードのうちの第2のノードは、
前記複数のノード内のそれぞれ異なる複数の他ノードから、ユーザデータまたは/及び第1の冗長コードを受信し、
前記複数の他ノードから受信したユーザデータまたは/及び前記第1の冗長コードに基づいて、第2の冗長コードを生成し、
前記第2の冗長コードを、前記第2のノードのストレージデバイスに格納することを特徴とするデータ処理方法。
(4-1)
複数のノードを含む分散ストレージシステムであって、
データを格納する記憶装置と、
前記記憶装置に入出力するデータを処理するプロセッサと、を含み、
前記プロセッサは、
入出力要求元に提供する論理アドレスと、前記記憶装置での格納位置にかかる物理アドレスとを、対応付けて管理し、
1つの論理アドレスに対して複数の物理アドレスを対応付けることで、データが更新された場合に更新後のデータ及び更新前のデータを選択的に読み出し可能である、
分散ストレージシステム。
(4-2)
4-1に記載の分散ストレージシステムであって、
前記プロセッサは、前記論理アドレスにかかるデータを更新する場合に、更新にかかる更新データを、更新前データの物理ドレスとは異なる物理アドレスに格納して、前記論理アドレスと前記更新データを格納した物理アドレスとの対応付けを追加する、
分散ストレージシステム。
(4-3)
4-2に記載の分散ストレージシステムであって、
前記1つの論理アドレスと前記複数の物理アドレスそれぞれとの対応付けは、識別子により管理され、
前記識別子を用いることで、更新前のデータを読み出し可能である、
分散ストレージシステム。
(4-4)
4-3に記載の分散ストレージシステムであって、
リード要求に識別子が含まれない場合、前記プロセッサは、前記論理アドレスに対して複数のデータのうち最新のデータを読み出す、
分散ストレージシステム。
(4-5)
4-1に記載の分散ストレージシステムであって、
前記ノードの記憶装置は、データと、複数の異なるノードに格納されたデータに基づき生成されたパリティとを、格納し、
前記データが更新される場合に、更新データは、更新前の前記データを格納するノードと前記データにかかるパリティを格納するノードとに送信され、
前記更新前のデータを格納するノードのプロセッサと前記データにかかるパリティを格納するノードのプロセッサとは、非同期で前記データ及びパリティを更新する、
分散ストレージシステム。
(4-6)
4-5に記載の分散ストレージシステムであって、
前記更新前のデータを格納するノードのプロセッサと前記データにかかるパリティを格納するノードのプロセッサとは、順番に非同期で前記データ及びパリティを更新する、
分散ストレージシステム。
(4-7)
4-5に記載の分散ストレージシステムであって、
前記更新前のデータを格納するノードのプロセッサと前記データにかかるパリティを格納するノードのプロセッサとは、並列に前記データ及びパリティを更新する、
分散ストレージシステム。
(4-8)
4-5に記載の分散ストレージシステムであって、
複数の異なるノードに格納されたデータに基づき複数のパリティが生成され、前記複数のパリティは異なるノードに格納される、
分散ストレージシステム。
(4-9)
4-5に記載の分散ストレージシステムであって、
格納している前記データを更新するための更新データを受信したノードのプロセッサは、前記更新データを、更新前データの物理ドレスとは異なる物理アドレスに格納して、前記論理アドレスと前記更新データを格納した物理アドレスとの対応付けを追加し、
格納している前記パリティを更新するための更新データを受信したノードのプロセッサは、前記更新データと更新前パリティとに基づき更新パリティを生成し、更新前パリティの物理ドレスとは異なる物理アドレスに格納して、前記論理アドレスと前記更新パリティを格納した物理アドレスとの対応付けを追加する、
分散ストレージシステム。
(4-10)
4-5に記載の分散ストレージシステムであって、
前記パリティをデータ修復に用いる複数のデータに、それぞれの論理アドレスの置ける最新のデータが含まれていないことを確認した場合に、前記パリティを削除する、
分散ストレージシステム。
(4-11)
4-5に記載の分散ストレージシステムであって、
前記更新データの書き込みとは非同期で、前記パリティを生成する元となった複数のデータそれぞれが論理アドレスにおいて最新のデータであるか確認することで、前記パリティの更新要否を判断し、パリティの更新を行う、
分散ストレージシステム。
(4-12)
複数のノードを含む分散ストレージシステムにおいてデータを管理する方法であって、
入出力要求元に提供する論理アドレスと、記憶装置での格納位置にかかる物理アドレスとを、対応付けて管理し、
1つの論理アドレスに対して複数の物理アドレスを対応付けることで、データが更新された場合に更新後のデータ及び更新前のデータを選択的に読み出し可能である、
方法。