以下、本発明の一実施形態について、図面を参照して説明する。なお、以下に説明する実施形態は、特許請求の範囲にかかる発明を限定するものではなく、また実施形態の中で説明されている特徴の組み合わせの全てが発明の解決手段に必須であるとは限らない。以下の説明では、「テーブル」、「リスト」、「キュー」等の表現にて各種情報を説明する事があるが、各種情報は、これら以外のデータ構造で表現されていてもよい。データ構造に依存しないことを示すために「XXテーブル」、「XXリスト」等を「XX情報」と呼ぶことがある。各情報の内容を説明する際に、「識別情報」、「識別子」、「名」、「ID」、「番号」等の表現を用いるが、これらについては互いに置換が可能である。
本実施形態では、分散型ストレージシステムを開示する。まず、この分散型ストレージシステムについて基本的な説明を行う。
分散型ストレージシステムは、それぞれがストレージデバイス及びプロセッサ等を含む複数のストレージ用の計算機が互いにネットワークで接続されて構成される。各計算機は、ネットワークの中でノードあるいは計算機ノードとも呼ばれる。分散型ストレージシステムを構成する各計算機は、特にストレージノードとも呼ばれ、コンピュートクラスタを構成する各計算機は、コンピュートノードとも呼ばれる。
分散型ストレージシステムを構成するストレージノードには、ストレージノードを管理及び制御するためのOS(Operating System)がインストールされており、そのOS上にストレージシステムの機能を持ったストレージソフトウェアを動作させることで、分散型ストレージシステムが構成される。ストレージソフトウェアは、OS上でコンテナの形態で動作させることによっても、分散型ストレージシステムを構成することができる。コンテナとは、1以上のソフトウェア及び構成情報をパッケージ化する仕組みである。また、ストレージノードにVMM(Virtual Machine Monitor)をインストールし、OS及びソフトウェアをVM(Virtual Machine)として動作させて、分散型ストレージシステムを構成することもできる。
また、本発明は、HCI(Hyper-Converged Infrastructure)と呼ばれるシステムを構成する場合にも、適用可能である。HCIは、各ノードにインストールされたOSもしくはハイパーバイザの上に、ストレージソフトウェアの他、アプリケーション、ミドルウェア、管理ソフト、及びコンテナを動作させることで、1つのノードで複数の処理を実施することを可能にしたシステムである。
分散型ストレージシステムは、複数のストレージノード上のストレージデバイスの容量を仮想化したストレージプール及び論理ボリューム(単にボリュームとも呼ぶ)をホスト(コンピュートノード)に提供する。ホストが何れかのストレージノードに対してIO(Input/Output)を発行すると、分散型ストレージシステムは、IOコマンドが指定するデータを保持するストレージノードにIOコマンドを転送することで、データへのアクセスをホストに提供する。この特徴により、分散型ストレージシステムは、ホストからのIOコマンドを停止させることなく、各ストレージノード間でボリュームを移動することができる。
分散型ストレージシステムの管理者は、ネットワークを介して管理用コマンドを分散型ストレージに対して発行することで、ボリュームの作成、削除、移動等の処理を実施することができる。また、分散型ストレージシステムは、ネットワークを介して、分散型ストレージシステムが送信する情報を提供することで、分散型ストレージシステムにおけるドライブの使用状況やプロセッサの使用状況等、分散型ストレージシステムの状態を管理者や管理ツールに対して通知することができる。
以下、本実施形態に係る分散型ストレージシステム1について詳しく説明する。
(1)システム構成
図1は、本発明の一実施形態に係る分散型ストレージシステム1の構成例を示すブロック図である。図1に示すように、分散型ストレージシステム1は、複数のストレージノード10(または、ノードと称する)をネットワーク20Aによって互いに接続して構成される。各ストレージノード10のハードウェア構成は特に限定されないが、例えば図1に示したストレージノード10Aのように、CPU(Central Processing Unit)11、メモリ12、ネットワークインタフェース13、ドライブインタフェース14、ドライブ15、及び内部ネットワーク16等を有する。例えばストレージノード10Aは、ネットワークインタフェース13Aを介してネットワーク20Aに接続し、他のストレージノード10B、10Cと通信する。なお、本実施形態の説明において、分散型ストレージシステム1の内部構成として「ノード」と表記する場合、特段の断りがない限り、当該「ノード」は「ストレージノード10」であると解してよい。
なお、図1には図示を省略しているが、分散型ストレージシステム1を構成する複数のストレージノード10を接続するネットワーク20Aは、同階層または階層の異なる複数のネットワーク20が接続して構成されてもよい。そしてこれら複数のネットワーク20Aの間の地理的な距離は限定されない。また、図1では、分散型ストレージシステム1を構成するストレージノード10の一例としてストレージノード10A~10Cを示したが、本実施形態に係る分散型ストレージシステム1は、任意の数のストレージノード10を備える構成であってよい。したがって、例えば、ストレージノード10A~10Cが接続するネットワーク20が、地理的に十分に離れた場所で構成された別のネットワーク20に接続され、この別のネットワーク20にストレージノード10Dやストレージノード10Eが接続されているとすれば、災害対策として、ストレージノード10A~10Cのデータをストレージノード10D、10Eにも格納することが可能である。
ホストコンピュータ30A,30Bは、ネットワーク20Bを介して分散型ストレージシステムにアクセスする。本実施例では、ストレージノード10同士の通信用と、ホストコンピュータ30との通信用にそれぞれネットワーク20を構築する形態をとっているが、同一のネットワークとする事も可能である。また、図1では、分散型ストレージシステム1を構成するノードをすべてストレージノード10としているが、本実施形態で分散型ストレージシステム1を構成可能なノードは、ストレージノードに限定されるものではなく、例えば、コンピューティングの機能を同じノード上で動作させるHCIノード等であってもよい。
図2は、分散型ストレージシステム1を構成する各ノードのソフトウェアスタックの例を示す図である。図2に示すように、1のストレージノード10では、ハードウェアを制御するためのハイパーバイザ21が動作しており、その上には、1つ以上のゲストOS22(個別にはゲストOS22A,22B)が動作している。各ゲストOS22の上には、ストレージ制御ソフト23または管理ソフト24を動作させることが可能である。ハイパーバイザ21の上には、コンピューティングソフトを動作させることも可能であり、その場合は、HCIとしてシステムを構成する事も可能である。
なお、ストレージ制御ソフト23及び管理ソフト24は、必ずしもすべてのストレージノード10で動作させる必要はない。また、管理ソフト24は、ストレージノードとは異なるサーバの上で動作させることも可能である。
図3は、ボリューム100に対するデータ管理領域の関係を説明するための図である。図3では、分散型ストレージシステム1で形成されるボリューム100(個別にはボリューム100A,100B)について、各ボリューム100の分散型ストレージシステム1におけるデータ管理領域の関係例が示されている。
ボリューム100は、分散型ストレージシステム1がホストコンピュータ30に見せるデータ管理領域である。サブボリューム110は、各ストレージノード10においてストレージ制御ソフト23が管理するデータ管理領域であり、ボリューム100は、1以上のサブボリューム110に対応付けられる。
ストレージ制御ソフト23は、サブボリューム110ごとに管理情報を保持している。1のストレージノード10においてストレージ制御ソフト23が管理するサブボリューム110の数が増加すると、作成、更新、または削除などの操作時間が増大するため、各ストレージノード10が作成するサブボリューム110の数は少ないことが望ましい。しかしながら、各ストレージノード10のサブボリューム110の数が少ない場合は、以下に説明するようにボリュームのスケールアウト処理が問題になる。
ボリュームのスケールアウト処理とは、分散型ストレージシステム1に新たにストレージノード10を増設した際に、増設したストレージノード10に、ボリューム100のデータの一部を移行することで、IO処理による負荷をオフロードすることである。このとき、各ストレージノード10に属するサブボリューム110の数が少ない場合、すなわち1つのサブボリューム110あたりの容量が大きい場合は、移行自体の負荷が大きかったり、容量が大きいことで移行先のリソースを圧迫することになったりして、増設したストレージノード10に対してデータの一部を柔軟に移行することができないという問題が想定される。
上記のようなボリュームのスケールアウト処理における問題を解決するために、本実施形態に係る分散型ストレージシステム1では、スライス120の概念を導入する。
スライス120は、ボリュームに記憶されるデータの管理サイズ(例えば1バイト)よりも大きく、サブボリューム110のサイズ(例えば、後述する図9の場合、最小で32TB)より小さい、固定サイズのデータ領域であり、後述する図9のデータ領域管理テーブル420のスライス管理テーブル423を参照すると、100GBのサイズとされる。図3に示したように、ボリューム100は、スライス120の単位で各サブボリューム110にマッピングされる。すなわち、サブボリューム110の実質的な容量は、各サブボリューム110に割り当てられたスライス120の合計値(以後、合計スライスサイズとも称する)によって定義され、言い換えれば、ボリューム100の容量と同じサイズである。具体的には例えば、図3の場合、ストレージノード10B~10Cに跨って形成されるボリューム100Bは、「12」~「23」の12個のスライス120に相当する容量を有する。ストレージノード10B~10Cには、ボリューム100Bと同じサイズのサブボリューム110B~110Dが1つずつ形成され、各サブボリューム110B~110Dは、12個のスライス120に細分化される。そして、ボリューム100の論理領域は、各サブボリューム110B~110Dのスライス120を部分的に割り当てて(例えば4個ずつスライス120を割り当てて)構成される。
また、スライス120のサブボリューム110へのマッピングは、ボリューム100とサブボリューム110を定義した際に、例えばストレージ制御ソフト23によって、静的に決定される。すなわち、IOのたびにスライス120のマッピング処理が実行されるわけではない。したがって、動的なマッピングに比べて、スライス120は、高速なアクセスが可能となる。
分散型ストレージシステム1は、このようなスライス120の概念を導入することで、ストレージノード10を増設した場合、増設したストレージノード10上のサブボリューム110に対して1以上のスライス120を移行することにより、各ストレージノード10に作成するサブボリューム110の数を少なくしたまま(原則として1つ)、柔軟なスケールアウト処理を実現することができる。
このとき、サブボリューム110のサイズをボリューム100と同じサイズにしておくことで、ボリューム100にかかるすべてのスライス120を1つのサブボリュームに移動させることにも対応可能となり、スライス120の移行に対してサブボリューム110のサイズを変更する必要がなくなるため、スライス120を各サブボリューム110の間で柔軟に移動することが可能となる。このような方式の場合でも、いわゆるシンプロビジョニングと呼ばれる既知の技術を用いることで、サブボリューム110のサイズは、サブボリューム110に論理的な空間を定義するだけであるため、物理容量を不要に消費することはない。
スライス120のサイズの決め方としては、例えば、想定されるサブボリューム110の数から計算されるデータ領域管理テーブルのサイズが、各ストレージノード10が搭載するメモリ12のサイズに収まるようにする、等の方法をとることができる。
そして、スライス120は、物理的なデータ領域であるページ130に細分化される。シンプロビジョニングの技術では、あるデータ領域に初めて書き込みがされた場合に、論理的なデータ領域に対して物理的なデータ領域が動的に割り当てられる。このときに割り当てる単位が「ページ」である。
図3には、1つのストレージノード10Aで形成されるボリューム100Aと、複数のストレージノード10B,10C,10Dに跨って形成されるボリューム100Bとが示されている。ボリューム100Aは、1のサブボリューム110Aに対応付けられ、ボリューム100Bは、サブボリューム110B,110C,110Dに対応付けられている。
ボリューム100Aのように、1つのボリューム100に属する全てのスライス120が1つのサブボリューム110にのみマッピングされるボリュームを、ローカライズドボリュームと呼ぶ。また、ボリューム100Bのように、1つのボリューム100に属するスライス120が複数のボリューム100にマッピングされるボリュームを、スケーラブルボリュームと呼ぶ。
ローカライズドボリュームの利点は、1つのノードだけでIO処理が実行されるため、CPU処理時間が比較的短く、またノードを跨いだデータの転送が起きないため、レイテンシを短くできることである。スケーラブルボリュームの利点は、1つのボリュームのIO処理を複数のノードで実行するため、ボリュームのスループットがスケールすることである。
図4は、メモリ12上に格納されるプログラム及びテーブルの一例を示す図である。各テーブルの詳細は後述するため、ここでは概要を説明する。
図4に示すように、ストレージノード10のメモリ12上には、ストレージ制御プログラム200、クラスタ内制御情報テーブル300、及びノード内制御情報テーブル400が記憶されている。
ストレージ制御プログラム200は、各ストレージノード10で動作し、ストレージノード10ごとに同一のストレージ機能を提供する。ストレージ制御プログラム200には、リードライト処理プログラム210、ボリューム管理プログラム220、クラスタ管理プログラム230、及びリバランス処理プログラム240が含まれる。
リードライト処理プログラム210は、ホストコンピュータ30が発行したリード/ライトコマンドに対応する処理を実行するプログラムである。例えば、SCSI(Small Computer System Interface)のようなプロトコルに従い、ホストコンピュータ30が分散型ストレージシステム1のデータにアクセスする場合に、リードライト処理プログラム210は、そのプロトコルに従ったデータのリードまたはライトを提供する。
ボリューム管理プログラム220は、ストレージ管理者が指示するボリューム管理コマンド(例えば、ボリューム作成、ボリューム削除、ボリューム設定変更など)に応じて動作するプログラムである。
クラスタ管理プログラム230は、ストレージ管理者が指示するクラスタ管理コマンド(例えば、クラスタ作成、ノード増設/減設、クラスタのポリシー設定変更など)に応じて動作するプログラムである。
リバランス処理プログラム240は、リバランス処理を実行するプログラムである。リバランス処理とは、あるストレージノード10でシステム負荷やデータ容量の使用量が閾値を超えた場合に、データを適切な別のノードに移行する処理である。
但し、リバランス処理の実行の基準とされる上記閾値の決定方法は、特に限定されない。具体的には例えば、ストレージノード10におけるリソース利用率について、80%のような絶対値を閾値に設定することや、リソース利用率の全ノードの平均値に対して20%以上大きいなどの相対値を閾値に設定することなど、複数の設定方法が考えられる。なお、ストレージノード10におけるリソース利用率には、CPU使用率またはネットワーク帯域使用率などの負荷に関する利用率だけでなく、ドライブの容量使用率なども含めることができる。
なお、上記の説明では、ストレージ制御プログラム200は、各ストレージノード10に保持されるとしたが、分散型ストレージシステム1において全体的な処理が必要な場合には、マスタノードの概念を利用してもよい。一般に、マスタノードは、複数のノード(ストレージノード10)のうちから適当に指定され、マスタノードが利用不可になった場合は、別ノードがマスタノードに代替して全体的な処理を行う。これらの技術は広く知られた既存技術であるため、詳細な説明は省略する。
クラスタ内制御情報テーブル300は、分散型ストレージシステム1のクラスタの構成や設定に関する制御情報を管理するテーブルであり、各ストレージノード10の間で共有される。つまり、どのストレージノード10で動作するストレージ制御プログラム200がアクセスしても同じ情報が参照できるように、各ストレージノード10におけるクラスタ内制御情報テーブル300は情報の一貫性が保たれている。クラスタ内制御情報テーブル300には、クラスタ構成管理テーブル310、リバランスポリシー管理テーブル320、及びクラスタプール管理テーブル330が含まれる。
クラスタ構成管理テーブル310は、分散型ストレージシステム1を構成するストレージノード10の一覧、及びストレージノード10が備えるハードウェア構成などを管理するテーブルである。
リバランスポリシー管理テーブル320は、分散型ストレージシステム1におけるリバランスポリシーの設定を管理するテーブルである。リバランスポリシーとは、リバランス処理において、ユーザの運用ポリシーを反映するために用意される設定である。
クラスタプール管理テーブル330は、クラスタ全体において容量を管理するための管理用テーブルであって、各ストレージプールにおける容量の状況を示す。
ノード内制御情報テーブル400は、各ストレージノード10の制御情報を管理するテーブルである。ノード内制御情報テーブル400には、ノードプール管理テーブル410、データ領域管理テーブル420、ホストパス管理テーブル430、HWモニタ情報管理テーブル440、及びデータ領域モニタ情報管理テーブル450が含まれる。
ノードプール管理テーブル410は、各ストレージノード10の容量を管理するテーブルで、クラスタプール管理テーブル330がストレージプールごとの容量の状況を示すのに対して、本テーブルはストレージノード10ごとの容量の状況を示す。
データ領域管理テーブル420は、ボリューム100、サブボリューム110、スライス120、及びページ130などの各データ領域を管理するテーブルであって、各データ領域のIDやサイズなどの情報を管理する他、データ領域同士の関係性も管理する。
ホストパス管理テーブル430は、ホストコンピュータ30と各ストレージノード10との間に張られるパスの情報を管理するテーブルである。
HWモニタ情報管理テーブル440は、各ストレージノード10に搭載されたHW(ハードウェア)の負荷状況を示す。
データ領域モニタ情報管理テーブル450は、サブボリューム110及びスライス120のデータ領域ごとの負荷状況を示す。
(2)データ構造
(2-1)クラスタ内制御情報テーブル300
図5は、クラスタ構成管理テーブル310の構成例を示す図である。クラスタ構成管理テーブル310は、クラスタ内制御情報テーブル300に属し、ストレージノード10間で共有される情報を管理するテーブルである。
図5に示すように、クラスタ構成管理テーブル310は、内部的にサイト構成管理テーブル311、ノード構成管理テーブル312、ドライブ構成管理テーブル313、及びCPU構成管理テーブル314を備える。
サイトとは、例えば、データセンターや、サーバラックの位置など、ユーザが定義した場所を示す概念である。分散型ストレージシステム1では、サイト構成管理テーブル311によってサイトの状態を管理することにより、複数のサイトに配置されたストレージノード10で構成されたクラスタを定義することが可能である。
サイト構成管理テーブル311は、分散型ストレージシステム1のクラスタに含まれるサイトとその状態を管理する。サイト構成管理テーブル311は、サイトID3111、状態3112、及びノードIDリスト3113のフィールドを有して構成される。
サイトID3111フィールドは、サイトを識別する識別子(サイトID)を管理する。状態3112フィールドは、各サイトの状態を管理する。具体的には、状態3112フィールドの値が「Normal」である場合は、対象サイトが正常状態にあることを表し、「Warning」である場合は、対象サイト内のコンポーネントで部分的に障害が発生するなどして冗長度が低下している状態、言い換えると「部分的な障害状態」であることを表す。
ノードIDリスト3113フィールドは、各サイトに含まれるストレージノード10のIDを管理する。ノードIDリスト3113フィールドにおける各IDは、後述するノード構成管理テーブル312のノードID3121フィールドのレコードに対応する。
ノード構成管理テーブル312は、各ストレージノード10の状態、及び各ストレージノード10に搭載されるドライブ15やCPU11などのリソースIDを管理する。ノード構成管理テーブル312は、ノードID3121、状態3122、ドライブIDリスト3123、及びCPU IDリスト3124のフィールドを有して構成される。
ノードID3121フィールドは、ノードを識別する識別子(ノードID)を管理する。状態3122フィールドは、各ノードの状態を管理する。具体的には、状態3122フィールドの値が「Normal」である場合は、対象ノードが「正常状態」にあることを表し、「Failure」である場合は、故障などによって対象ノードが「停止状態」にあることを表す。
ドライブIDリスト3123フィールドは、各ストレージノード10に搭載されたドライブ15を識別する識別子(ドライブID)を管理する。ドライブIDリスト3123フィールドにおける各IDは、後述するドライブ構成管理テーブル313のドライブID3131フィールドのレコードに対応する。
CPU IDリスト3124フィールドは、各ストレージノード10に搭載されたCPU11を識別する識別子(CPU ID)を管理する。CPU IDリスト3124フィールドにおける各IDは、後述するCPU構成管理テーブル314のCPU ID3141フィールドのレコードに対応する。
ドライブ構成管理テーブル313は、ノード構成管理テーブル312で管理されるノードごとに、当該ノードが備えるドライブ15の構成を管理するテーブルであって、ドライブID3131、状態3132、及びサイズ3133のフィールドを有して構成される。
ドライブID3131フィールドは、ドライブ15を識別するドライブIDを管理する。状態3132フィールドは、ドライブ15の状態を管理する。サイズ3133フィールドは、ドライブ15の容量(サイズ)を管理する。
CPU構成管理テーブル314は、ノード構成管理テーブル312で管理されるノードごとに、当該ノードが備えるCPU11の構成を管理するテーブルであって、CPU ID3141、状態3142、周波数3143、及び物理コア数3144のフィールドを有して構成される。
CPU ID3141フィールドは、CPU11を識別するCPU IDを管理する。状態3142フィールドは、CPU11の状態を管理する。周波数3143フィールドは、CPU11のクロック周波数を管理する。物理コア数3144フィールドは、CPU11の物理コア数を管理する。
なお、図5では、ドライブ15の構成管理テーブルとしてドライブ構成管理テーブル313を、CPU11の構成管理テーブルとしてCPU構成管理テーブル314を示したが、実際のクラスタ構成管理テーブル310には、メモリ12やネットワークカードなどのリソースを管理する構成管理テーブルも含まれてよい。
図6は、リバランスポリシー管理テーブル320の構成例を示す図である。リバランスポリシー管理テーブル320は、クラスタ内制御情報テーブル300に属し、ストレージノード10間で共有される情報を管理するテーブルである。
リバランスポリシーとは、リバランス処理におけるユーザの運用に関する方針を反映することを目的として設定される項目である。図6には、例として、複数のポリシーを示しているが、これらは必要十分なものではなく、この他のポリシーを設定してもよいし、一部のポリシーがなくてもよい。
例えば、特定の用途のボリューム100では、前述したように、いずれかのストレージノード10のパラメタ(CPU使用率、ネットワーク帯域使用率、ドライブ容量使用率など)が閾値を超えた際に、リバランス処理が実施される。その際、リバランス処理プログラム240は、リバランスポリシーに従って、当該ストレージノード10に属するボリューム100、サブボリューム110、及びスライス120をそれぞれ選択し、さらに移行先のノードを選択した後に、スライス120の移行を実行する。
リバランスポリシー管理テーブル320は、ポリシー3201及び設定3202のフィールドを有して構成される。ポリシー3201フィールドは、リバランス処理に適用されるポリシーを管理する。設定3202フィールドは、各ポリシーの設定内容を管理する。図6の場合、ポリシー3201フィールドには、「優先ボリュームポリシー」、「優先サブボリュームポリシー(容量)」、「優先サブボリュームポリシー(負荷)」、「スライス選択ポリシー」、及び「移行先ノード選択ポリシー」の5種類のポリシーが記載されている。
優先ボリュームポリシーとは、リバランス処理を実行する際に、どのようなボリューム100を優先的に選択するかのポリシーである。例えば、スケーラブルボリューム(ボリューム100B)を優先的に選択する場合は、「優先ボリュームポリシー」の設定3202から「1.スケーラブルボリュームを優先」が設定される。
優先サブボリュームポリシー(容量)とは、選択されたボリューム100を構成するサブボリューム110の中で、データ容量の観点からどのようなサブボリューム110を優先的に選択するかのポリシーである。例えば、容量使用率の高いサブボリューム110を優先的に解決したい場合は、「優先サブボリュームポリシー(容量)」の設定3202から「1.容量使用率の高いサブボリュームを優先」が設定される。
優先サブボリュームポリシー(負荷)とは、選択されたボリューム100を構成するサブボリューム110の中で、システム負荷の観点からどのようなサブボリューム110を優先的に選択するかのポリシーである。例えば、負荷の高いサブボリューム110を優先的に解決したい場合は、「優先サブボリュームポリシー(負荷)」の設定3202から「1.高負荷のサブボリュームを優先」が設定される。
スライス選択ポリシーとは、リバランス処理を実行する際、選択されたサブボリューム110において、どのスライス120を優先的に選択するかのポリシーである。例えば、最も負荷の高いスライス120を優先的に選択して移行したい場合は、「スライス選択ポリシー」の設定3202から「1.高負荷スライスを優先」が設定される。
移行先ノード選択ポリシーとは、選択されたスライス120を移行する先のノードをどのように選択するかのポリシーである。例えば、「1.閾値超過したパラメタが最も小さいノードを優先」を設定しているときに、ストレージノード10のドライブ容量使用率が閾値を超えたことを契機としてリバランス処理が実行される場合には、ドライブ容量使用率が最も小さいノードが移行先として選択されることになる。
図7は、クラスタプール管理テーブル330の構成例を示す図である。クラスタプール管理テーブル330は、クラスタ内制御情報テーブル300に属し、ストレージノード10間で共有される情報を管理するテーブルである。
クラスタプール管理テーブル330は、クラスタ全体での容量を管理するためのテーブルであり、各ストレージプールの容量状況を示す。
プールには、ノードプールとストレージプールとがある。ノードプールが、各ストレージノード10が備えるドライブ容量を合計した容量を持つプールであるのに対し、ストレージプールは、複数のノードプールを合計した容量を持つプールである。ストレージノード10の数が大量な場合、ノードごとの容量管理を行うと運用が煩雑になる。そこで本実施形態に係る分散型ストレージシステム1では、ストレージプールという上位の概念を導入することにより、全体的な運用を単純にすることを可能にする。
クラスタプール管理テーブル330は、ストレージプールID3301、全容量3302、使用容量3303、及びノードIDリスト3304のフィールドを有して構成される。ストレージプールID3301フィールドは、ストレージプールを識別する識別子(ストレージプールID)を管理する。全容量3302フィールドは、ストレージプールにおける全容量を管理し、使用容量3303フィールドは、ストレージプールで使用中の使用容量を管理する。また、ノードIDリスト3304フィールドは、ストレージプールを共有するストレージノード10のノードIDを管理する。
なお、図7のクラスタプール管理テーブル330に記載された値は、図3に示した分散型ストレージシステム1の構成に対応するものではない。一方、図5、図6、図8~図12に例示した各テーブルの値は、概ね、図3に示した分散型ストレージシステム1の構成に対応するようにしている。
(2-2)ノード内制御情報テーブル400
図8は、ノードプール管理テーブル410の構成例を示す図である。ノードプール管理テーブル410は、ノード内制御情報テーブル400に属し、各ストレージノード10内でのみ管理される情報を管理するテーブルである。
ノードプール管理テーブル410は、各ノードプールの容量状況を示す。図7に示したクラスタプール管理テーブル330の説明で前述したように、ノードプールとは、ストレージノード10ごとのドライブ容量を合計した容量を持つプールである。
ノードプール管理テーブル410は、ノードプールID4101、ノードID4102、全容量4103、及び使用容量4104のフィールドを有して構成される。ノードプールID4101フィールドは、ノードプールを識別する識別子(ノードプールID)を管理する。ノードID4102フィールドは、ノードプールを共有するストレージノード10のノードIDを管理する。全容量4103フィールドは、ノードプールの全容量を管理し、使用容量4104フィールドは、ノードプールで使用中の使用容量を管理する。
図9は、データ領域管理テーブル420の構成例を示す図である。データ領域管理テーブル420は、ノード内制御情報テーブル400に属し、各ストレージノード10内でのみ管理される情報を管理するテーブルである。
図9に示すように、データ領域管理テーブル420は、内部的に、ボリューム管理テーブル421、サブボリューム管理テーブル422、スライス管理テーブル423、及びページ管理テーブル424を備える。
ボリューム管理テーブル421は、分散型ストレージシステム1に形成されるボリューム100の構成情報を管理するテーブルであり、ボリュームID4211、属性4212、サイズ4213、及び分散ノード数4214のフィールドを有して構成される。
ボリュームID4211フィールドは、ボリューム100を識別する識別子(ボリュームID)を管理する。属性4212フィールドは、ボリューム100の属性(ローカライズドボリュームであるか、スケーラブルボリュームであるか)を管理する。サイズ4213フィールドは、ボリューム100の容量(サイズ)を管理する。分散ノード数4214フィールドは、ボリューム100の分散数、すなわち、1つのボリューム100がいくつのノード上のサブボリューム110から構成されるかを示す値、を管理する。属性4212フィールドの値が「ローカライズド」である場合、分散数は「1」となり、属性4212フィールドの値が「スケーラブル」である場合、クラスタが備えるノード数やユーザの設定などから分散数が定まる。
サブボリューム管理テーブル422は、ボリューム100に属する各サブボリューム110の構成情報を管理するテーブルであり、サブボリュームID4221、サイズ4222、ボリュームID4223、ノードID4224、及びサブボリューム管理情報テーブルID4225のフィールドを有して構成される。
サブボリュームID4221フィールドは、サブボリューム110を識別する識別子(サブボリュームID)を管理する。サイズ4222フィールドは、サブボリューム110の容量(サイズ)を管理する。ボリュームID4223フィールドは、サブボリューム110が属するボリューム100のボリュームIDを管理する。ノードID4224フィールドは、サブボリューム110が形成されるストレージノード10のノードIDを管理する。サブボリューム管理情報テーブルID4225フィールドは、サブボリューム110を管理するための制御情報を格納するサブボリューム管理情報テーブルの識別子を管理する。なお、サブボリューム管理情報テーブルは、ストレージ制御ソフト23が実装する機能の適用有無や上記機能に関する設定情報を管理するテーブルであるが、ストレージ制御ソフト23の実装形態によってその内容が異なるため、図示による説明を省略する。サブボリューム110内のスライス120に対しては、サブボリューム110に従って機能の適用有無や上記機能に関する設定情報が設定される。
スライス管理テーブル423は、サブボリューム110に割り当てられたスライス120の構成情報を管理するテーブルであり、スライスID4231、サイズ4232、ページ割当済サイズ4233、ページ割当ビットマップ4234、サブボリュームID4235、サブボリュームLBA4236、ボリュームID4237、及びボリュームLBA4238のフィールドを有して構成される。
スライスID4231フィールドは、各スライス120を識別する識別子(スライスID)を管理する。サイズ4232フィールドは、スライス120の容量(サイズ)を管理する。
ページ割当済サイズ4233フィールドは、スライス120でページ130が既に割り当たっているサイズを管理する。ページ割当ビットマップ4234フィールドは、スライス120で割り当たっているページ130を示すビットマップを管理する。ビットマップは具体的には、割り当て済みのページを「1」で示し、未割り当てのページを「0」で示す。
サブボリュームID4235フィールドは、スライス120が属するサブボリューム110のサブボリュームIDを管理する。サブボリュームLBA4236フィールドは、スライス120が属するサブボリューム110における当該スライス120の位置を示すLBA(Logical Block Address)を管理する。ボリュームID4237フィールドは、スライス120が属するボリューム100のボリュームIDを管理する。ボリュームLBA4238フィールドは、スライス120が属するボリューム100における当該スライス120の位置を示すLBAを管理する。
ページ管理テーブル424は、スライス120に対応する物理的なデータ領域であるページ130の構成情報を管理するテーブルであり、ページID4241、サイズ4242、スライスID4243、サブボリュームID4244、及びサブボリュームLBA4245のフィールドを有して構成される。
ページID4241フィールドは、各ページ130を識別する識別子(ページID)を管理する。サイズ4242フィールドは、ページ130の容量(サイズ)を管理する。
スライスID4243フィールドは、ページ130に対応するスライス120のスライスIDを管理する。本実施形態では、一例として、1つのページ130の物理的容量と1つのスライス120の論理的容量とを同じサイズとすることにより、スライス120にページ130を割り当てるとき、対応関係を有するスライス120とページ130とを1対1で管理することができる。
サブボリュームID4244フィールドは、ページ130が割り当てられたサブボリューム110のサブボリュームIDを管理する。サブボリュームLBA4245フィールドは、ページ130が割り当てられたサブボリューム110における当該スライス120の位置を示すLBAを管理する。
図10は、ホストパス管理テーブル430の構成例を示す図である。ホストパス管理テーブル430は、ノード内制御情報テーブル400に属し、各ストレージノード内でのみ管理される情報を管理するテーブルである。
ホストパス管理テーブル430は、ホストパスを管理するテーブルであり、ホストパスID4301、サブボリュームID4302、イニシエータID4303、ALUA設定4304、及び接続ノードID4305のフィールドを有して構成される。ホストパスとは、ホストコンピュータ30上のイニシエータから各ストレージノード10に属するサブボリューム110との間で論理的に定義される経路である。
ホストパスID4301フィールドは、ホストパスを識別する識別子(ホストパスID)を管理する。サブボリュームID4302フィールドは、ホストパスの端点となるサブボリューム110のサブボリュームIDを管理する。イニシエータID4303フィールドは、ホストパスの端点となるイニシエータを識別する識別子(イニシエータID)を管理する。
ALUA設定4304フィールドは、ホストパスにおけるALUA(Asymmetric Logical Unit Access)の設定を管理する。AULAの設定とは、各イニシエータからサブボリューム110に対するホストパスのうち優先的に使用されるパスの設定である。例えば、ボリューム100Aのように、1つのサブボリューム110に全てのスライス120がマッピングされているローカライズドボリュームに対しては、当該サブボリューム110に対するホストパスのみを「Optimize(最適化)」に設定することで、ストレージノード10の間での転送を抑止することができ、ストレージの性能向上につながる。
接続ノードID4305フィールドは、ホストパスが接続されるストレージノード10のノードIDを管理する。
図11は、HWモニタ情報管理テーブル440の構成例を示す図である。HWモニタ情報管理テーブル440は、ノード内制御情報テーブル400に属し、各ストレージノード10内でのみ管理される情報を管理するテーブルである。
HWモニタ情報管理テーブル440は、各ストレージノード10に搭載されるハードウェアのモニタ情報を、後述する内部テーブルに格納する。分散型ストレージシステム1は、このようなHWモニタ情報管理テーブル440で管理するモニタ情報に基づいて、ストレージノード10に搭載された各HWの負荷を監視することができ、当該監視において負荷の閾値超過を検出することで、適切なタイミングでリバランス処理を実行することができる。なお、HWモニタ情報管理テーブル440が備える内部テーブルの情報は、クラスタ管理プログラム230のモニタ機能によって定期的に更新される。更新時、各テーブルには、モニタ機能が参照した瞬間の値を格納するとしてもよいし、一定期間の平均値や中央値を格納するなどとしてもよい。
図11に示すように、HWモニタ情報管理テーブル440は、内部的に、CPUモニタ情報管理テーブル441、ドライブモニタ情報管理テーブル442、ネットワークモニタ情報管理テーブル443、及びホストパスモニタ情報管理テーブル444を備える。
CPUモニタ情報管理テーブル441は、ストレージノード10が備えるCPU11のモニタ情報を管理するためのテーブルであり、CPU ID4411、及び使用率4412のフィールドを有して構成される。
CPU ID4411フィールドは、各CPU11を識別する識別子(CPU ID)を管理する。使用率4412フィールドは、各CPU11のCPU使用率を管理する。
ドライブモニタ情報管理テーブル442は、ストレージノード10が備えるドライブ15のモニタ情報を管理するためのテーブルであり、ドライブID4421、リードIOPS4422、ライトIOPS4423、リード転送量4424、ライト転送量4425、及び使用率4426のフィールドを有して構成される。
ドライブID4421フィールドは、各ストレージノード10に搭載されたドライブ15を識別する識別子(ドライブID)を管理する。リードIOPS4422フィールドは、リードIO処理時のドライブ15におけるIOPS(Input/Output Per Second)を管理する。ライトIOPS4423フィールドは、ライトIO処理時のドライブ15におけるIOPSを管理する。リード転送量4424フィールドは、リードIO処理時のドライブ15におけるデータ転送速度(リード転送量)を管理する。ライト転送量4425フィールドは、ライトIO処理時のドライブ15におけるデータ転速度(ライト転送量)を管理する。使用率4426フィールドは、ドライブ15の容量使用率を管理する。
ネットワークモニタ情報管理テーブル443は、ネットワークI/F13A及びネットワーク20Aを介してストレージノード10の間で通信される転送量(本例では、転送速度によって転送量を表している)のモニタ情報を管理するためのテーブルである。ネットワークモニタ情報管理テーブル443は、ネットワークI/F ID4431、送信転送量4432、受信転送量4433、及び最大転送量4434のフィールドを有して構成される。
ネットワークI/F ID4431フィールドは、各ネットワークI/F13Aを識別する識別子(ネットワークI/F ID)を管理する。送信転送量4432フィールドは、ネットワークI/F13Aを経由するストレージノード10間の通信におけるデータ送信時の転送速度(送信転送量)を管理する。受信転送量4433フィールドは、ネットワークI/F13Aを経由するストレージノード10間の通信におけるデータ受信時の転送速度(受信転送量)を管理する。最大転送量4434フィールドは、ネットワークI/F13Aを経由する通信における転送速度の最高速度(最大転送量)を管理する。
ホストパスモニタ情報管理テーブル444は、各サブボリューム110とホストコンピュータ30に属するイニシエータとの間に張られるホストパス上で通信される転送量のモニタ情報を管理するためのテーブルである。ホストパスモニタ情報管理テーブル444は、ホストパスID4441、リードIOPS4442、ライトIOPS4443、リード転送量4444、及びライト転送量4445のフィールドを有して構成される。
ホストパスID4441フィールドは、ホストパスを識別するホストパスIDを管理する。ホストパスIDフィールドにおける各IDは、ホストパス管理テーブル430のホストパスID4301フィールドのレコードに対応する。リードIOPS4442フィールドは、リードIO処理時のホストパスにおけるIOPSを管理する。ライトIOPS4443フィールドは、ライトIO処理のホストパスにおけるIOPSを管理する。リード転送量4444フィールドは、リードIO処理時のホストパスにおけるデータ転送速度(リード転送量)を管理する。ライト転送量4445フィールドは、ライトIO処理時のホストパスにおけるデータ転送速度(ライト転送量)を管理する。
図12は、データ領域モニタ情報管理テーブル450の構成例を示す図である。データ領域モニタ情報管理テーブル450は、ノード内制御情報テーブル400に属し、各ストレージノード10内でのみ管理される情報を管理するテーブルである。
データ領域モニタ情報管理テーブル450は、サブボリューム110及びスライス120といったデータ領域ごとの負荷情報を管理するテーブルであって、図12に示すように、内部的に、サブボリュームモニタ情報管理テーブル451、及びスライスモニタ情報管理テーブル452を備える。
データ領域モニタ情報管理テーブル450がデータ領域ごとの負荷情報を管理することにより、分散型ストレージシステム1は、リバランス処理の際に、高負荷なデータ領域や低負荷なデータ領域など、ユーザのリバランスポリシーに応じて適切なデータ領域を選択することができる。なお、データ領域モニタ情報管理テーブル450は、例えばストレージ制御ソフト23が提供するコンポーネントによって明示的に更新される。
サブボリュームモニタ情報管理テーブル451は、サブボリューム110ごとのIO処理による負荷を管理するテーブルであって、サブボリュームID4511、リードIOPS4512、ライトIOPS4513、リード転送量4514、及びライト転送量4515のフィールドを有して構成される。
サブボリュームID4511フィールドは、サブボリューム110を識別するサブボリュームIDを管理する。リードIOPS4512フィールドは、リードIO処理時のサブボリューム110におけるIOPSを管理する。ライトIOPS4513フィールドは、ライトIO処理時のサブボリューム110におけるIOPSを管理する。リード転送量4514フィールドは、リードIO処理時のサブボリューム110におけるデータ転送速度(リード転送量)を管理する。ライト転送量4515フィールドは、ライトIO処理時のサブボリューム110におけるデータ転送速度(ライト転送量)を管理する。
スライスモニタ情報管理テーブル452は、スライス120の負荷情報を管理するテーブルであって、スライスID4521、リードIOPS4522、ライトIOPS4523、リード転送量4524、及びライト転送量4525のフィールドを有して構成される。
スライスID4521フィールドは、スライス120を識別するスライスIDを管理する。リードIOPS4522フィールドは、リードIO処理時のスライス120におけるIOPSを管理する。ライトIOPS4523フィールドは、ライトIO処理時のスライス120におけるIOPSを管理する。リード転送量4524フィールドは、リードIO処理時のスライス120におけるデータ転送速度(リード転送量)を管理する。ライト転送量4525フィールドは、ライトIO処理時のスライス120におけるデータ転送速度(ライト転送量)を管理する。
(3)処理
以下では、本実施形態に係る分散型ストレージシステム1において実行される、データ処理またはデータ領域管理処理として、ボリューム作成処理、ライトIO処理、リードIO処理、リバランス処理、ノード増減設処理、及びボリュームサイズ変更処理について、その処理手順例を詳しく説明する。各処理の説明では、必要に応じて、図1~図12を参照しながら説明した構成及びテーブル等のデータを用いる。
(3-1)ボリューム作成処理
図13は、ボリューム作成処理の処理手順例を示すフローチャートである。ボリューム作成処理は、ボリューム管理プログラム220が実行する処理の1つである。
ユーザ(分散型ストレージシステム1の管理者)は、不図示の管理コンソールを操作するなどにより、例えばHTTPなどのデータ転送のプロトコルを介して、分散型ストレージシステム1にコマンドを送信して、ボリューム100の作成を指示することができる。このとき、コマンドを受け取った分散型ストレージシステム1では、管理コンソールで指定されたノード(あるいは、マスタノードの役割を持つストレージノード10)の制御部(不図示)が、HTTP等によって指示されたコマンドを解釈し、ボリューム管理プログラム220によるボリューム作成処理を呼び出す。
図13によればまず、ボリューム管理プログラム220は、ユーザから作成を指定されたボリューム100の属性がスケーラブルボリュームであるか否かを判定する(ステップS101)。スケーラブルボリュームの作成が指定された場合は(ステップS101のYES)、ステップS102に進み、スケーラブルボリュームの作成が指定されていない、すなわち、ローカライズドボリュームの作成が指定された場合は(ステップS101のNO)、ステップS108に進む。
ステップS102では、ボリューム管理プログラム220は、解釈したコマンドの内容に基づいて、作成するスケーラブルボリュームのサイズ及び分散ノード数を取得する。但し、分散ノード数は、コマンドによって指定される方式でもよいし、クラスタのポリシーで一意に決定される方式でもよい。後者の方式では例えば、クラスタに属するノード数、ホストコンピュータ30とストレージノード10との間に定義できる最大ホストパス数などに基づいて、分散ノード数を一意に決定することができる。
次に、ボリューム管理プログラム220は、ノードプール管理テーブル410を参照し、各ストレージノード10に属するノードプールの空き容量を取得する(ステップS103)。
次に、ボリューム管理プログラム220は、サブボリューム110を作成するノード(ストレージノード10)と、当該ノードに割り当てる合計スライスサイズとを決定する(ステップS104)。
ここで、ステップS104の処理を補足して説明する。
図3を参照しながら前述したように、サブボリューム110に割り当てられるスライス120の合計サイズ(合計スライスサイズ)は、各サブボリューム110における実質的な容量を意味する。そこで、ステップS104においてボリューム管理プログラム220は、ボリューム100の形成においてストレージノード10の間の偏りをなくすため、できるだけ均等になるように、各ストレージノード10に割り当てる合計スライスサイズを決定する。具体的には例えば、サイズが80TBで分散ノード数が8のスケーラブルボリュームを作成する場合には、1つのノードに割り当てられる合計スライスサイズは、10TBずつとなることが望ましい。
前述のように望ましい合計スライスサイズを決定すると、次に、ボリューム管理プログラム220は、作成するストレージノード10を決定する。前述した具体例を用いると、ボリューム管理プログラム220は、ステップS102で取得したノードプールの空き容量に基づいて、10TB以上の空き容量を有するストレージノード10を優先的に、サブボリューム110を作成するノードとして選択する。
但し、サブボリューム110を作成するノードの決定において、一部のノードプールの空き容量が望ましい容量(具体例では10TB)に満たない場合には、ボリューム管理プログラム220は、不足する分の容量を他のノードで均等に分配する。例えば、前述した具体例のように8つのノードに跨って合計80TBのスケーラブルボリュームを作成するときに、3TBしか空き容量がないノードにサブボリューム110を作成する必要がある場合には、不足する7TBを他のノードで均等に分配することにより、11TBを割り当てる7つのノードと、3TBを割り当てる1つのノードとを決定することができる。
なお、上記の補足説明では、各ストレージノード10に割り当てる合計スライスサイズを決定してから、サブボリューム110を作成するストレージノード10を決定したが、ステップS104では、これらの処理の実行順序を入れ替えてもよい。また、上記の補足説明では、容量の観点からできるだけ均等な分配を行う方法を説明したが、負荷の観点から均等な分配を行うようにしてもよいし、容量及び負荷をともに考慮して均等な分配を行うようにしてもよい。
ステップS104の終了後、あるいは、後述するステップS110の終了後、ボリューム管理プログラム220は、ステップS105またはステップS110で決定した各ストレージノード10に対して、サブボリューム110を定義する(ステップS105)。このとき、図3を参照して説明したように、サブボリューム110のサイズは、ボリューム100と同じサイズで論理的な空間を定義する。
次に、ボリューム管理プログラム220は、ステップS105で作成したサブボリューム110に対して割り当てるスライス120のアドレスを決定する(ステップS106)。アドレスは機械的に割り当てられると考えてよい。
そして、ボリューム管理プログラム220は、ステップS106までの処理で決定された、ボリューム100、サブボリューム110、及びスライス120の情報を、データ領域管理テーブル420に反映して更新し(ステップS107)、ボリューム作成処理を終了する。
一方、ボリューム作成指示のコマンドにおいてローカライズドボリュームの作成が指定された場合は、ステップS101でNOと判定され、ステップS108の処理が行われる。ステップS108では、ボリューム管理プログラム220は、解釈したコマンドの内容に基づいて、作成するローカライズドボリュームのサイズを取得する。ローカライズドボリュームの場合は、分散ノード数は1に固定される。
次に、ボリューム管理プログラム220は、ステップS103と同様にして、ノードプール管理テーブル410を参照し、各ストレージノード10に属するノードプールの空き容量を取得する(ステップS109)。
次に、ボリューム管理プログラム220は、ステップS104におけるノードの決定と同様な方法で、サブボリューム110を作成する1つのノードを決定する(ステップS110)。なお、ローカライズドボリュームを作成する際は、サブボリューム110の作成数も1つに固定されるため、合計スライスサイズを決定する処理は不要となる。
ステップS110の処理後は、ステップS105に進み、上述したステップS105~S107の処理を行う。すなわち、ボリューム管理プログラム220は、ステップS110で決定したストレージノード10にサブボリューム110を作成し(ステップS105)、サブボリューム110に割り当てるスライスのアドレスを決定し(ステップS106)、諸情報をデータ領域管理テーブル420に反映し(ステップS107)、ボリューム作成処理を終了する。
以上のようにボリューム作成処理が実行されることにより、ボリューム管理プログラム220は、スケーラブルボリュームまたはローカライズドボリュームの属性を問わず、ユーザ(管理者)による指示に応じて、ストレージノード10の間の偏りを抑えながら、ボリューム100を作成することができる。
(3-2)ライトIO処理
図14は、ライトIO処理の処理手順例を示すフローチャートである。ライトIO処理は、リードライト処理プログラム210が実行する処理の1つである。リードライト処理プログラム210によるライトIO処理は、ホストコンピュータ30から発行されたSCSIのライトコマンドを処理するために呼び出される。SCSIのライトコマンドは、任意のデータをボリューム100の所望のアドレス(LBA)に書き込もうとする際に、ホストコンピュータ30から発行されるコマンドであって、分散型ストレージシステム1のノード(例えば、マスタノードの役割を有するストレージノード10)に送信される。
図14によればまず、リードライト処理プログラム210は、受信したライトコマンドを解析することで、アクセス対象のボリューム100のID及びLBAと、アクセス長とを特定し、特定した情報を用いてデータ領域管理テーブル420のスライス管理テーブル423を参照することにより、アクセス対象のボリューム100及びそのLBAに該当するスライス120を特定する(ステップS201)。図9の説明で前述したように、スライス管理テーブル423において、ボリュームID4237フィールドは、スライス120が属するボリューム100のボリュームIDを管理し、ボリュームLBA4238フィールドは、スライス120が属するボリューム100における当該スライス120の位置を示すLBAを管理している。
なお、ステップS201では、アクセス対象のLBAやアクセス長によっては、複数のスライス120がアクセス対象に該当する場合があり得る。その場合でも、リードライト処理プログラム210は、ステップS202以降の処理を順次実行する。
ステップS202では、リードライト処理プログラム210は、サブボリューム管理テーブル422及びスライス管理テーブル423を参照して、ステップS201で特定したアクセス対象のスライスが自ノードにあるか否かを判定する。自ノードとは、当該ステップの処理を実行しているリードライト処理プログラム210がメモリ12に格納されているストレージノード10を意味する。アクセス対象のスライスが自ノードにある場合は(ステップS202のYES)、ステップS204に進み、アクセス対象のスライスが自ノードにない場合は(ステップS202のNO)、ステップS203に進む。
ステップS203では、リードライト処理プログラム210は、アクセス対象のスライス120が存在するストレージノード10に、ライトコマンドを転送する。その後、当該コマンドを受け取ったストレージノード10において、リードライト処理プログラム210によるライトIO処理が呼び出され、図14のフローチャートに沿って、ステップS201から処理が実行される。
ステップS204では、リードライト処理プログラム210は、自ノードに格納されたページ管理テーブル424を参照し、アクセス対象のスライス120に対応するページ130を特定する。
次に、リードライト処理プログラム210は、ステップS204におけるページ130の特定において、アクセス対象のデータ領域に、既にページ130が割り当っているか否かを判定する(ステップS205)。アクセス対象のデータ領域にページ130が割り当て済みの場合は(ステップS205のYES)、ステップS207に進み、アクセス対象のデータ領域にページ130が未割り当ての場合は(ステップS205のNO)、ステップS206に進む。
ステップS206では、リードライト処理プログラム210は、アクセス対象のデータ領域に、新規にページ130を割り当てる。前述したように、ページ130の割り当てには、シンプロビジョニングの技術を用いることができ、あるデータ領域に初めて書き込みがなされた場合に、論理的なデータ領域(スライス120)に対して物理的なデータ領域(ページ130)が動的に割り当てられる。すなわち、リードライト処理プログラム210は、アクセス対象のスライス120にある論理的なアドレス空間に対して、ドライブ15の物理的なアドレスを割り当てる。その後、ステップS207に進む。
ステップS207では、リードライト処理プログラム210は、ライトコマンドによって発行されたデータをドライブ15におけるアクセス対象のデータ領域(すなわち、ページ130)に書き込む。
そして、リードライト処理プログラム210は、ステップS207におけるドライブ15へのデータの書き込み完了を確認後に、ホストコンピュータ30にライト結果を応答する処理を実行し(ステップS208)、ライトIO処理を終了する。
なお、ステップS203の処理によってライトコマンドが別のストレージノード10から転送されて、転送先のストレージノード10で図14の処理が実行されてステップS208に至った場合は、転送先のリードライト処理プログラム210は、転送元のストレージノード10にライト結果の応答を送信し、転送元のストレージノード10を経由してホストコンピュータ30に応答を返す。
以上のようにライトIO処理が実行されることにより、アクセス対象のスライス120を有するストレージノード10のリードライト処理プログラム210は、ライトコマンドに応じて、自ノードのドライブ15(詳細には、アクセス対象のスライス120に対応して割り当てられたページ130)に、データを書き込むことができる。
(3-3)リードIO処理
図15は、リードIO処理の処理手順例を示すフローチャートである。リードIO処理は、リードライト処理プログラム210が実行する処理の1つである。リードライト処理プログラム210によるリードIO処理は、ホストコンピュータ30から発行されたSCSIのリードコマンドを処理するために呼び出される。SCSIのリードコマンドは、ボリューム100の任意のアドレス(LBA)に格納された所望のデータを読み出そうとする際に、ホストコンピュータ30から発行されるコマンドであって、分散型ストレージシステム1のノード(例えば、マスタノードの役割を有するストレージノード10)に送信される。
図15によればまず、リードライト処理プログラム210は、図14に示したライトIO処理のステップS201~S204と同様の処理を行う(ステップS301~S304)。
すなわち、ステップS301において、リードライト処理プログラム210は、受信したリードコマンドを解析して、アクセス対象のボリューム100のID及びLBAと、アクセス長とを特定し、特定した情報を用いて、アクセス対象に該当するスライス120を特定する。そして、ステップS302では、リードライト処理プログラム210は、アクセス対象のスライス120が自ノードにあるか否かを判定する。アクセス対象のスライス120が自ノードにない場合は、ステップS303において、該当するノードにリードコマンドを転送し、転送先のノードでリードIO処理が呼び出されて以降の処理が行われる。一方、アクセス対象のスライス120が自ノードにある場合は、ページ管理テーブル424を参照し、アクセス対象のスライス120に対応するページ130を特定する。
ステップS304の処理後、リードライト処理プログラム210は、ステップS304で特定したページ130にアクセスし、アクセス対象のデータ領域に格納されているデータをドライブ15から読み出す(ステップS305)。なお、図示は省略するが、アクセス対象のデータ領域にページ130が未割り当てである場合は、リードライト処理プログラム210は、リード結果として「0」のデータを返す。
そして、リードライト処理プログラム210は、ステップS305におけるドライブ15からのデータの読み出し完了を確認後に、ホストコンピュータ30にリード結果を応答する処理を実行し(ステップS306)、リードIO処理を終了する。
なお、ステップS303の処理によってリードコマンドが別のストレージノード10から転送されて、転送先のストレージノード10で図15の処理が実行されてステップS306に至った場合は、転送先のリードライト処理プログラム210は、転送元のストレージノード10にリード結果の応答を送信し、転送元のストレージノード10を経由してホストコンピュータ30に応答を返す。
以上のようにリードIO処理が実行されることにより、アクセス対象のスライス120を有するストレージノード10のリードライト処理プログラム210は、リードコマンドに応じて、自ノードのドライブ15(詳細には、アクセス対象のスライス120に対応するページ130)から、データを読み出し、応答することができる。
(3-4)リバランス処理
図16は、リバランス処理の処理手順例を示すフローチャートである。リバランス処理は、リバランス処理プログラム240が実行する処理の1つである。いずれかのストレージノード10で負荷や容量が所定の閾値を超えたことが検出されたときに、リバランス処理プログラム240によるリバランス処理が呼び出される。
分散型ストレージシステム1では、例えば、マスタノードのリバランス処理プログラム240が、周期的に各ノードのリバランス処理プログラム240に閾値の超過をチェックさせる。そして、何れかのノードで閾値の超過が検出された場合に、マスタノードのリバランス処理プログラム240が主導して、図16の処理を行う。
図16のステップS401において、リバランス処理プログラム240は、ノードプール管理テーブル410及びHWモニタ情報管理テーブル440を参照して、閾値を超過したパラメタが、容量であるか否かを判定する(ステップS401)。すなわち、リバランス処理プログラム240は、ノードプール管理テーブル410のパラメタが閾値超過している場合は容量が閾値を超過していると判断でき、HWモニタ情報管理テーブル440のいずれかのリソースが閾値超過している場合は負荷が閾値を超過していると判断できる。
そして、容量が閾値を超過したと判定した場合(ステップS401のYES)、リバランス処理プログラム240は、容量の観点からボリューム100のデータをノード間で再分配する「容量リバランス処理」を呼び出して実行し(ステップS402)、その完了後にリバランス処理を終了する。一方、負荷が閾値を超過したと判定した場合(ステップS401のNO)、リバランス処理プログラム240は、負荷の観点からボリューム100のデータをノード間で再分配する「負荷リバランス処理」を呼び出して実行し(ステップS403)、その完了後にリバランス処理を終了する。
図17は、容量リバランス処理の処理手順例を示すフローチャートである。容量リバランス処理は、図16のステップS402に相当する処理であって、リバランス処理プログラム240が実行する処理の1つである。前述したように、容量リバランス処理は、容量のパラメタが閾値を超過した場合に、リバランス処理から呼び出される。
図17によればまず、リバランス処理プログラム240は、容量の閾値超過が起きているストレージノード10を特定する(ステップS411)。具体的には、ステップS411においてリバランス処理プログラム240は、ノードプール管理テーブル410を参照し、使用容量4104フィールドの値を全容量4103フィールドの値で割ることによって、プールノードごとの容量使用率を計算する。そして、計算した容量使用率が閾値を超えているノードプールのIDを特定し(ノードプールID4101フィールド)、該当するレコードのノードID4102フィールドの値(ノードID)を確認することで、容量の閾値超過が起きているストレージノード10を特定する。
次に、リバランス処理プログラム240は、ステップS411で特定したストレージノード10に属するボリューム100のうちから、リバランスポリシー管理テーブル320の「優先ボリュームポリシー」の設定に従って、1つのボリューム100を選択する(ステップS412)。
次に、リバランス処理プログラム240は、ステップS412で選択したボリューム100がスケーラブルボリュームであるか否かを判定する(ステップS413)。スケーラブルボリュームである場合は(ステップS413のYES)、ステップS414に進み、スケーラブルボリュームではない、すなわちローカライズドボリュームである場合は(ステップS413のNO)、ステップS417に進む。
ステップS412で選択したボリューム100がスケーラブルボリュームである場合に実行されるステップS414では、リバランス処理プログラム240は、ステップS412で選択したボリューム100に属するサブボリューム110のうちから、リバランスポリシー管理テーブル320の「優先サブボリュームポリシー(容量)」の設定に従って、1つのサブボリューム110を選択する。
次いで、リバランス処理プログラム240は、ステップS414で選択したサブボリューム110に割り当てられたスライス120のうち、ページ130が未割り当てのスライス120を別のノード(ストレージノード10)に移行する(ステップS415)。ステップS415において、ページ130が未割り当てのスライス120は、スライス管理テーブル423のページ割当済サイズ4233フィールドに基づいて判定することができ、リバランス処理プログラム240は、該当する全てのスライス120を、選択中のボリューム100を共有する別のストレージノード10においてなるべく均等な数になるように、移行する。
ここで、ステップS415において上記の処理を行う理由を詳しく説明する。ページ130が未割り当てのスライス120によって管理される領域には、データがまだ格納されていないため、当該スライス120を別のストレージノード10に移行する際は、データの転送は不要で、スライス120の割り当てに関する制御情報のみを更新(書き換え)すればよい。そのため、スライス120の移行によるオーバヘッドが小さい。加えて、ページ130が未割り当てのスライス120を予め別のストレージノード10に移行しておくことで、容量が閾値を超えたストレージノード10に対して、将来の新規ライトが行われる確率を低減することができる。
ステップS415の処理後、リバランス処理プログラム240は、ステップS414で選択したサブボリューム110に属し、かつページ130が割り当て済みのスライス120のうちから、リバランスポリシー管理テーブル320の「スライス選択ポリシー」に従って選択されるスライス120を、リバランスポリシー管理テーブル320の「移行先ノード選択ポリシー」の設定に従って選択されるストレージノード10(移行先ノード)に移行する(ステップS416)。
ステップS416の処理によって、スライス120に割り当てられたデータの少なくとも一部が、別のストレージノード10に移行され、この結果、移行元のストレージノード10におけるノードプールの使用容量を低減することができる。なお、ステップS416の処理は、移行元のストレージノード10(言い換えれば、ステップS411で選択されたストレージノード10)におけるノードプールの使用容量が閾値を下回るまで、繰り返し実行され、その完了後に、ステップS418に進む。
一方、ステップS412で選択したボリューム100がローカライズドボリュームである場合、当該ボリューム100に属するスライス120は1つのサブボリューム110にマッピングされるため、ノード間でスライス120の配置を変更することはできない。
そこで、ステップS413のNOを経て移行するステップS417では、リバランス処理プログラム240は、サブボリューム110の単位で、サブボリューム110及びボリューム100を移行先ノードに移行する。
具体的には、ステップS417において、リバランス処理プログラム240は、ステップS412で選択したボリューム100に属するサブボリューム110のうちから、リバランスポリシー管理テーブル320の「優先サブボリュームポリシー」の設定に従って、移行させるサブボリューム110を選択し、当該サブボリューム110を、リバランスポリシー管理テーブル320の「移行先ノード選択ポリシー」の設定に従って選択されるストレージノード10(移行先ノード)に移行する。ステップS417の完了後は、ステップS418に進む。
そしてステップS418では、リバランス処理プログラム240は、容量が閾値を超過している他のストレージノード10が存在しないかを判定し、該当する他のストレージノード10が存在しない場合は(ステップS418のYES)、容量リバランス処理を終了する。
一方、ステップS418において容量が閾値を超過している他のストレージノード10が存在する場合は(ステップS418のNO)、ステップS411に戻り、リバランス処理プログラム240は、上述した処理を繰り返す。但し、この繰り返しの処理においては、既に移行する対象のスライス120がないサブボリューム110やボリューム100は、リバランスポリシーに従った選択の対象から除外し、リバランスポリシーで次に優先されるサブボリューム110やボリューム100が選択されるものとする。
以上のように容量リバランス処理が実行されることにより、リバランス処理プログラム240は、容量が閾値を超過しているノードのデータを別ノードに移行して、容量の閾値超過を解消することができる。
なお、図6に示したリバランスポリシー管理テーブル320では、「スライス選択ポリシー」の設定として、「1.高負荷スライスを優先」と「2.低負荷スライスを優先」とが用意されていたが、何れが設定されるかは、ユーザによる指定またはシステムによる選択によって、任意に決定されてよい。具体的には、一般的な容量リバランス処理では、「2.低負荷スライスを優先」が設定されることが好ましい。但し、リバランス処理において、容量リバランス処理と後述する負荷リバランス処理と組み合わせて実行する場合には、「1.高負荷スライスを優先」が設定されることが好ましいこともある。
図18は、負荷リバランス処理の処理手順例を示すフローチャートである。負荷リバランス処理は、図16のステップS403に相当する処理であって、リバランス処理プログラム240が実行する処理の1つである。前述したように、負荷リバランス処理は、負荷のパラメタが閾値を超過した場合に、リバランス処理から呼び出される。
図18によればまず、リバランス処理プログラム240は、負荷の閾値超過が起きているストレージノード10を特定する(ステップS421)。具体的には、ステップS421においてリバランス処理プログラム240は、各ストレージノード10においてHWモニタ情報管理テーブル440が備える各テーブルを参照し、閾値を超過しているストレージノード10及びHWを特定する。
次に、リバランス処理プログラム240は、ステップS421で特定したストレージノード10に属するボリューム100のサブボリューム110のうちから、リバランスポリシー管理テーブル320の「優先サブボリュームポリシー(負荷)」の設定に従って、1つのサブボリューム110を選択する(ステップS422)。
なお、「優先サブボリュームポリシー(負荷)」の設定に従ってサブボリューム110の選択する際は、各サブボリュームの負荷状況を判断する必要があるが、これはサブボリュームモニタ情報管理テーブル451を参照することによって可能である。具体的には例えば、「優先サブボリュームポリシー(負荷)」の設定内容が「1.高負荷のサブボリュームを優先」であった場合は、サブボリュームモニタ情報管理テーブル451が管理する各サブボリューム110の情報を参照し、負荷が最も大きいサブボリューム110を選択すればよい。
次に、リバランス処理プログラム240は、ステップS422で選択したサブボリューム110が属するボリューム100がスケーラブルボリュームであるか否かを判定する(ステップS423)。スケーラブルボリュームである場合は(ステップS423のYES)、ステップS424に進み、スケーラブルボリュームではない、すなわちローカライズドボリュームである場合は(ステップS423のNO)、ステップS426に進む。
ステップS422で選択したサブボリューム110が属するボリューム100がスケーラブルボリュームである場合に実行されるステップS424では、リバランス処理プログラム240は、上記サブボリューム110に属するスライス120のうちから、リバランスポリシー管理テーブル320の「スライス選択ポリシー」の設定に従って、スライス120を選択する。
なお、「スライス選択ポリシー」の設定に従ってサブボリューム110の選択する際は、各スライスの負荷状況を判断する必要があるが、これはスライスモニタ情報管理テーブル452を参照することによって可能である。具体的には例えば、「スライス選択ポリシー」の設定内容が「1.高負荷スライスを優先」であった場合は、スライスモニタ情報管理テーブル452が管理する各スライス120の情報を参照し、負荷が最も大きいスライス120を選択すればよい。
次いで、リバランス処理プログラム240は、ステップS424で選択したスライス120を移行先ノードに移行する(ステップS425)。このとき、移行先のストレージノード10は、リバランスポリシー管理テーブル320の「移行先ノード選択ポリシー」の設定に従って選択される。具体的には例えば、「移行先ノード選択ポリシー」の設定内容が「1.閾値超過したパラメタが最も小さいノードを優先」であり、ステップS421で特定したストレージノード10におけるCPUモニタ情報管理テーブル441が管理するCPU11の負荷が閾値を超えている場合には、別のストレージノード10のうちで最もCPU11の負荷が小さいストレージノード10が、移行先ノードとして選択される。ステップS425の処理後は、ステップS427に進む。
一方、ステップS422で選択したサブボリューム110が属するボリューム100がローカライズドボリュームである場合に実行されるステップS426では、リバランス処理プログラム240は、上記サブボリューム110及び上記ボリューム100を移行先ノードに移行する。このとき、移行先のストレージノード10は、ステップS425と同様に、リバランスポリシー管理テーブル320の「移行先ノード選択ポリシー」の設定に従って選択される。ステップS426の処理後は、ステップS427に進む。
そしてステップS427では、リバランス処理プログラム240は、負荷が閾値を超過している他のストレージノード10が存在しないかを判定し、該当する他のストレージノード10が存在しない場合は(ステップS427のYES)、負荷リバランス処理を終了する。
一方、ステップS427において負荷が閾値を超過している他のストレージノード10が存在する場合は(ステップS427のNO)、ステップS421に戻り、リバランス処理プログラム240は、上述した処理を繰り返す。但し、この繰り返しの処理においては、既に移行する対象のスライス120がないサブボリューム110やボリューム100は、リバランスポリシーに従った選択の対象から除外し、リバランスポリシーで次に優先されるサブボリューム110やボリューム100が選択されるものとする。
以上のように負荷リバランス処理が実行されることにより、リバランス処理プログラム240は、負荷が閾値を超過しているノードのデータを別ノードに移行して、負荷の閾値超過を解消することができる。
なお、図6に示したリバランスポリシー管理テーブル320では、「スライス選択ポリシー」の設定として、「1.高負荷スライスを優先」と「2.低負荷スライスを優先」とが用意されていたが、何れが設定されるかは、ユーザによる指定またはシステムによる選択によって、任意に決定されてよい。
具体的には、負荷リバランス処理において、「1.高負荷スライスを優先」が設定される場合には、高負荷のスライス120から優先して別ノードに移行できることから、移行の際にコスト(システム性能への負荷)は掛かるものの、閾値超過の状態を早期に分散させることができる。一方、負荷リバランス処理において、「2.低負荷スライスを優先」が設定される場合には、低負荷のスライス120から優先して別ノードに移行できることから、リバランス全体に要する移行時間は掛かるものの、移行時のシステム性能の低下を抑える効果に期待できる。すなわち、「スライス選択ポリシー」における上記2つの設定による効果はトレードオフの関係にあり、システムの運用スタイルやユーザの要望に応じて設定されることが好ましい。
(3-5)ノード増減設処理
図19は、ノード増減設処理の処理手順例を示すフローチャートである。ノード増減設処理は、クラスタにノードを追加またはクラスタからノードを削除する処理であって、クラスタ管理プログラム230が実行する処理の1つである。
ノード増減設処理において、クラスタ管理プログラム230は、ノード(ストレージノード10)の追加または削除に合わせて、スケーラブルボリュームの分散ノード数を再計算し、分散ノード数に変更が生じた場合は、スケーラブルボリュームのスライスの割り当てを、変更後の分散ノード数に合わせて変更する。
図19によればまず、ストレージノード10が、ノードの増設または減設を指示する増減設指示を受領する(ステップS501)。ノードの増減設指示は、クラスタの何れのノードで受信してもよく、指示を受信したノードは、クラスタ管理プログラム230を実行する構成管理のマスタノードに、受領した指示を転送する。
次に、マスタノードのクラスタ管理プログラム230が、後述するステップS504の分散ノード数変更処理による処理が行われていないスケーラブルボリュームを1つ選択する(ステップS502)。以降のステップS503及びステップS504の処理は、ステップS502で選択したスケーラブルボリュームについての処理となる。
次に、クラスタ管理プログラム230は、分散型ストレージシステム1においてクラスタを構成するノード数に合わせて、スケーラブルボリュームの分散ノード数を再計算する(ステップS503)。具体的には例えば、クラスタ管理プログラム230は、分散ノード数の最大値をボリューム100に設定しておき、ノードを増設した場合には、ボリューム100の分散ノード数が当該最大値に到達するまでは、クラスタを構成するノード数と同じ値となるように分散ノード数を決定する。また、ノードを減設した場合には、減設後のノード数と同じ値となるように分散ノード数を決定する。
次に、クラスタ管理プログラム230は、ステップS502で選択したスケーラブルボリュームについてステップS503で再計算した分散ノード数が再計算前の分散ノード数とは異なる場合に、当該スケーラブルボリュームのスライス120の割り当てを、再計算した分散ノード数に合わせて変更する(ステップS504)。以下では、ステップS504の処理を「分散ノード数変更処理」と称し、その詳細な処理手順は、図20を参照しながら後述する。
そして、ステップS504の処理後、クラスタ管理プログラム230は、クラスタ内の全てのスケーラブルボリュームに対して分散ノード数変更処理を完了したか否かを判定する(ステップS505)。未処理のスケーラブルボリュームが存在する場合には(ステップS305のNO)、ステップS502に戻り、処理を繰り返す。一方、未処理のスケーラブルボリュームが存在しない場合は(ステップS305のYES)、ノード増減設処理を終了する。
図20は、分散ノード数変更処理の処理手順例を示すフローチャートである。前述したように、図20に示す分散ノード数変更処理は、図19のステップS504の処理に相当し、クラスタ管理プログラム230によって実行される。なお、図20に示す分散ノード数変更処理は、後述する図21のボリュームサイズ変更処理のなかでも呼び出されて実行される。
図20に示したように、クラスタ管理プログラム230は、まず、図19のステップS503で再計算した分散ノード数と、再計算前の分散ノード数とを比較し、同値でないか否かを判定する(ステップS511)。
なお、ステップS511の時点では、再計算した分散ノード数は、新たな分散ノード数として更新されていないが、説明の便宜上、図20及びその説明では、再計算した分散ノード数を「変更後」の分散ノード数、再計算前の分散ノード数を「変更前」の分散ノード数と表記することがある。すなわち、ステップS511では、クラスタ管理プログラム230は、変更前と変更後の分散ノード数が同値でないか否かを判定する。
ステップS511において変更後の分散ノード数が変更前の分散ノード数と同値ではない場合は(ステップS511のYES)、ステップS512に進む。一方、変更後の分散ノード数が変更前の分散ノード数と同値、すなわち、再計算によって分散ノード数に変化がない場合は(ステップS511のNO)、スライス120の割り当てを変更する必要がないので、分散ノード数変更処理を終了する。
ステップS512では、クラスタ管理プログラム230は、現在処理対象としているスケーラブルボリューム(図19のステップS502で選択したスケーラブルボリューム)について、ボリューム管理テーブル421の分散ノード数4214フィールドの値を、図19のステップS503で再計算した分散ノード数で更新する。
次に、クラスタ管理プログラム230は、変更後の分散ノード数が変更前の分散ノード数よりも大きいか否かを判定する(ステップS513)。
ステップS513において変更後の分散ノード数が変更前の分散ノード数よりも大きい場合(ステップS513のYES)、クラスタ管理プログラム230は、以下のステップS514~S517の処理を行うことにより、処理対象のスケーラブルボリュームのスライス120の一部を新たな分散先ノードに移動し、ボリューム100をスケールアウトする。
まずステップS514において、クラスタ管理プログラム230は、ボリューム領域の分散をスケールアウトするため、新たな分散先となるノードを選択する。新たな分散先のノードは、各ノードの空き容量や負荷状況を加味して選択される。例えば、空き容量が多く、かつ負荷が低いノードが選択される。
次いでステップS515において、クラスタ管理プログラム230は、ステップS514で選択した新たな分散先ノードに、サブボリューム110を作成する。
次いでステップS516において、クラスタ管理プログラム230は、既存のサブボリューム110のうちから、ステップS515で作成したサブボリューム110に移動するスライス120を選択する。新たなサブボリューム110に移動するスライス120は、既存の各サブボリューム110から均等な数となるように選択されることが好ましい。
そしてステップS517において、クラスタ管理プログラム230は、既存のサブボリューム110からステップS515で作成したサブボリューム110へ、ステップS516で選択したスライス120を移動することにより、ボリューム100をスケールアウトすることができる。
一方、ステップS513において変更後の分散ノード数が変更前の分散ノード数以下の場合には(ステップS513のNO)、クラスタ管理プログラム230は、以下のステップS518~S520の処理を行うことにより、処理対象のスケーラブルボリュームに属するサブボリューム110のうちから1つのサブボリューム110を選択し、当該サブボリューム110のスライス120を全て既存の分散先ノードに移動し、ボリューム100をスケールインする。
まずステップS518において、クラスタ管理プログラム230は、ボリューム領域の分散をスケールインするため、サブボリューム110の分散先から除外するノード(除外ノード)を選択する。除外ノードは、各ノードの空き容量や負荷状況を加味して選択される。例えば、空き容量が少なく、かつ負荷が高いノードが選択される。
次いでステップS519において、クラスタ管理プログラム230は、ステップS518で選択した除外ノードのサブボリューム110から、残りの分散先ノードにスライス120を移動する。このとき、クラスタ管理プログラム230は、移動後に、残りの分散先ノードの各サブボリューム110に均等な数が割り当たるように、スライス120の移動先を選択することが好ましい。
そしてステップS520において、クラスタ管理プログラム230は、ステップS518で選択した除外ノードにおけるサブボリューム110を削除することにより、ボリューム100をスケールインすることができる。
最後に、上記したステップS517またはステップS520の完了した後、クラスタ管理プログラム230は、スケールアウト(ステップS514~S517)またはスケールイン(ステップS518~S520)の処理によって変更があったボリューム100、サブボリューム110、及びスライス120の情報を、データ領域管理テーブル420が備える各テーブルに反映して更新し(ステップS521)、分散ノード数変更処理を終了する。
以上、図19及び図20に示した処理が実行されることにより、クラスタ管理プログラム230は、分散型ストレージシステム1における計算機ノード(ストレージノード10)の増設または減設時に、各計算機ノードにおけるサブボリューム110の数を1に固定したまま、計算機ノードの設置数に応じて柔軟に、ボリューム100をスケールアウトまたはスケールインすることができる。
(3-6)ボリュームサイズ変更処理
図21は、ボリュームサイズ変更処理の処理手順例を示すフローチャートである。ボリュームサイズ変更処理は、指定されたボリューム100のサイズを変更(拡張または収縮)する処理であって、主にボリューム管理プログラム220が実行する。なお、ステップS609の処理はクラスタ管理プログラム230が実行される。
ボリュームサイズ変更処理において、ボリューム管理プログラム220は、ボリューム100のサイズ変更に合わせてスケーラブルボリュームの分散ノード数を再計算し、分散ノード数に変更があった場合は、スケーラブルボリュームのスライス120の割り当てを再計算した分散ノード数に合わせて変更する。
図21によればまず、ボリューム管理プログラム220は、ボリューム100のサイズ変更指示を受領する。ボリューム100のサイズ変更指示は、クラスタの何れのノードで受信してもよく、指示を受信したノードは、ボリューム管理プログラム220を実行する構成管理のマスタノードに、受領した指示を転送する。
次に、マスタノードのボリューム管理プログラム220は、ステップS601で受領したサイズ変更指示においてボリュームサイズが変更前と変更後とで変化しているか否かを判定する(ステップS602)。ボリュームサイズの変更がない場合は(ステップS602のNO)、特段の処理が必要ないため、ボリュームサイズ変更処理を終了する。ボリュームサイズに変更がある場合は(ステップS602のYES)、ステップS603に進む。
ステップS603では、ボリューム管理プログラム220は、サイズ変更指示において変更後のボリュームサイズが変更前よりも大きいか否かを判定する。ボリュームサイズが大きくなる場合は(ステップS603のYES)、ステップS604~S605の処理を行うことにより、ボリュームサイズを拡張する。一方、ボリュームサイズが小さくなる場合は(ステップS603のNO)、ステップS606~S607の処理を行うことにより、ボリュームサイズの収縮を行う。
ステップS604では、ボリューム管理プログラム220は、サイズ変更指示の対象とされたスケーラブルボリュームの各サブボリューム110のサイズを拡張する。このとき例えば、各サブボリューム110の合計サイズが拡張後のスケーラブルボリュームと同じサイズになるように拡張する。
次のステップS605では、ボリューム管理プログラム220は、ステップS604で拡張したサブボリューム110に対して、拡張したサイズ分だけ新規のスライス120を割り当てる。ステップS605において、ボリューム管理プログラム220は、例えば、各サブボリューム110に均等な数が割り当るように、割り当てるスライス120の数を決定する。具体的には、スライス120の割り当て数は、スケーラブルボリュームの拡張サイズを分散ノード数で割ることによって算出できる。ステップS605の処理後は、ステップS608に進む。
ステップS606では、ボリューム管理プログラム220は、ボリューム100のアドレス末尾から、収縮するサイズ分だけスライス120を削除する。
次のステップS607では、ボリューム管理プログラム220は、サイズ変更指示の対象とされたスケーラブルボリュームの各サブボリューム110のサイズを収縮する。このとき例えば、各サブボリューム110の合計サイズが収縮後のスケーラブルボリュームと同じサイズになるように収縮する。ステップS607の処理後は、ステップS608に進む。
ステップS608では、ボリューム管理プログラム220は、サイズ変更指示の対象とされたスケーラブルボリュームについて、変更後のボリュームサイズに合わせて分散ノード数を再計算する。例えば、ボリューム100のサイズ拡張の結果、サブボリューム110に割り当てたスライス120の合計サイズが、1つのノード単位でサブボリューム110に提供可能な容量を超えた場合には、分散ノード数を増やすことで、容量の枯渇が発生しないようにする。また例えば、ボリューム100のサイズ収縮の結果、サブボリューム110から削除したスライス120の合計サイズが、1つのノード単位でサブボリューム110に提供可能な容量を超えた場合には、分散ノード数を減らすことで、過剰なノード分散を抑制する。
その後、ボリューム管理プログラム220は、クラスタ管理プログラム230を呼び出し、ステップS608で再計算した分散ノード数を用いて、前述した分散ノード数変更処理(図20参照)を実行させることにより、再計算後の分散ノード数に応じたスライス120の割り当てを実行する(ステップS609)。そしてステップS609の完了後、ボリュームサイズ変更処理を終了する。
以上、図21に示した処理が実行されることにより、ボリューム管理プログラム220及びクラスタ管理プログラム230は、ボリューム100のサイズ変更指示に応じて、スケーラブルボリューム(ボリューム100)の拡張または収縮を行うとともに、拡張または収縮に伴う構成変更に合わせて分散ノード数を再計算し、再計算後の分散ノード数に応じてスライス120の移動を行うことにより、ボリューム100を形成するノード間で容量及び/または負荷が分散するようにスライス120を配置することができる。
以上に説明したように、本実施形態に係る分散型ストレージシステム1は、ボリューム100を構成するサブボリューム110の領域を複数のスライス120に分割し、スライス単位で複数の計算機ノード(ストレージノード10)に割り当て、ボリューム100へのアクセス負荷をモニタリングし、モニタ情報(HWモニタ情報管理テーブル440、データ領域モニタ情報管理テーブル450)を管理する。また、ボリューム100を構成するサブボリューム110は、1つの計算機ノード当たりに1つとすることにより、各計算機ノード上で動作するストレージ制御ソフトウェア(ストレージ制御プログラム200)による管理性能の低下を防ぐことができる。詳しく説明すると、各ストレージノード10において、当該ストレージノード10上で動作するストレージ制御プログラム200が管理するサブボリューム110の個数が一定(この場合は1)とされることにより、1つの計算機ノードにおけるサブボリューム110の個数が増加することによってその制御情報が増大し、ストレージ制御プログラム200の処理量が増大してしまう、という管理性能の低下を防ぐことができる。さらに、ボリューム100を構成するサブボリューム110のサイズをボリューム100と同じサイズとすることにより、1つの計算機ノードにおけるサブボリューム110のサイズが増加した場合にストレージノード10間でデータを柔軟に融通することが困難になるといった問題を解消し、柔軟なスケールアウト処理の実現に貢献する。そして、本実施形態に係る分散型ストレージシステム1は、上位モニタ情報において、アクセス負荷が低く、1つの計算機ノードでボリューム100が要求する性能を提供できる場合には、ボリューム100を構成するスライス120を1つの計算機ノードに集約するように割り当てを制御する(ローカライズドボリューム)。一方、アクセス負荷が高く、1つの計算機ノードでボリューム100が要求する性能を提供できない場合には、ボリューム100を構成するスライス120を複数の計算機ノードに分散して割り当てるように制御する(スケーラブルボリューム)。また、ホスト(ホストコンピュータ30)がボリューム100のデータにアクセスする際は、各計算機ノードがアクセス先のデータを格納するスライス120がどの計算機ノードに割り当てられているかを判定することで、アクセス時の負荷が特定の計算機ノードに偏らないようにする。
本実施形態に係る分散型ストレージシステム1は、上記のように構成されることで、アクセス負荷が1つの計算機ノードで充足する場合は、必ずローカルストレージ(ドライブ15)のデータに対してアクセスできるため、ホストに対して高速に応答することができる。また、アクセス負荷が1つの計算機ノードでは充足しない場合には、複数の計算機ノードでアクセスを処理することで、ホストに対して高いスループット(IOPS:Input/Output Per Second)を提供することができる。また、これらの制御は、ユーザが意識することなく分散型ストレージシステム1が自動で行うため、ユーザは、例えば特許文献1に開示されたストレージシステムと同様の運用負荷で上記の利益を得ることができる。
また、本実施形態に係る分散型ストレージシステム1は、何れかの計算機ノード(ストレージノード10)においてボリューム100の容量または負荷に関する所定パラメタが閾値を超えた場合には、容量または負荷の観点に基づくリバランス処理を実行することにより、パラメタが閾値超過したノードのボリュームデータを別ノードに移行して、閾値の超過状態を解消することができる。すなわち、1または複数のノードに跨って形成される1つのボリュームに対して、アクセス負荷に応じて、応答時間及びスループットを自動で好適な状態に変更することができる。
また、本実施形態に係る分散型ストレージシステム1では、計算機ノードの増設または減設が行われる際には、ノード増減設処理を実行することにより、ノード数の変化に応じてボリューム100の分散ノード数を再計算し、分散先の各ノードのサブボリューム110に対して、偏りが生じないようにスライス120を割り当てる。かくして、分散型ストレージシステム1は、計算機ノードの追加(または削除)に応じて、ボリュームの容量及び/または性能をスケールアウト(またはスケールイン)することができる。
また、本実施形態に係る分散型ストレージシステムで1は、ボリューム100のサイズを変更する際に、ボリュームサイズ変更処理を実行することで、変更されるサイズに応じて、ボリューム100におけるサブボリューム110の構成、及びスライス120の割り当てを自動的に調整することができる。かくして、ボリューム100のサイズ変更に応じて、ノード間で容量及び/または負荷を好適に分散させてボリューム100を形成することができる。
なお、本発明は上記した実施形態に限定されるものではなく、様々な変形例が含まれる。例えば、上記した実施形態は本発明を分かりやすく説明するために詳細に説明したものであり、必ずしも説明した全ての構成を備えるものに限定されるものではない。また、実施形態の構成の一部について、他の構成の追加・削除・置換をすることが可能である。
また、上記の各構成、機能、処理部、処理手段等は、それらの一部又は全部を、例えば集積回路で設計する等によりハードウェアで実現してもよい。また、上記の各構成、機能等は、プロセッサがそれぞれの機能を実現するプログラムを解釈し、実行することによりソフトウェアで実現してもよい。各機能を実現するプログラム、テーブル、ファイル等の情報は、メモリや、ハードディスク、SSD(Solid State Drive)等の記録装置、または、ICカード、SDカード、DVD等の記録媒体に置くことができる。
また、図面において制御線や情報線は説明上必要と考えられるものを示しており、製品上必ずしも全ての制御線や情報線を示しているとは限らない。実際にはほとんど全ての構成が相互に接続されていると考えてもよい。