以下の説明では、「インタフェース部」は、一つ以上のインタフェースでよい。当該一つ以上のインタフェースは、一つ以上の同種の通信インタフェースデバイス(例えば一つ以上のNIC(Network Interface Card))であってもよいし二つ以上の異種の通信インタフェースデバイス(例えばNICとHBA(Host Bus Adapter))であってもよい。
また、以下の説明では、「メモリ部」は、一つ以上のメモリであり、典型的には主記憶デバイスでよい。
また、以下の説明では、「記憶デバイス部」は、一つ以上の記憶デバイスであり、典型的には補助記憶デバイスでよい。「記憶デバイス」は、記憶デバイスの一例であり、特に、物理的な記憶デバイスを意味し、典型的には、不揮発性の記憶デバイスである。
また、以下の説明では、「記憶部」は、メモリ部と記憶デバイス部の少なくとも一部とのうちの少なくとも一つ(典型的には少なくともメモリ部)である。
また、以下の説明では、「プロセッサ部」は、一つ以上のプロセッサである。少なくとも一つのプロセッサは、典型的には、CPU(Central Processing Unit)のようなマイクロプロセッサであるが、GPU(Graphics Processing Unit)のような他種のプロセッサでもよい。少なくとも一つのプロセッサは、シングルコアでもよいしマルチコアでもよい。少なくとも一つのプロセッサは、処理の一部又は全部を行うハードウェア回路(例えばFPGA(Field-Programmable Gate Array)又はASIC(Application Specific Integrated Circuit))といった広義のプロセッサでもよい。
また、以下の説明では、「xxxテーブル」といった表現にて、入力に対して出力が得られる情報を説明することがあるが、この種の情報は、どのような構造のデータでもよいし、入力に対する出力を発生するニューラルネットワークのような学習モデルでもよい。従って、「xxxテーブル」を「xxx情報」と言うことができる。また、以下の説明において、各テーブルの構成は一例であり、一つのテーブルは、二つ以上のテーブルに分割されてもよいし、二つ以上のテーブルの全部又は一部が一つのテーブルであってもよい。
また、以下の説明では、「kkk部」(インタフェース部、記憶部及びプロセッサ部を除く)の表現にて機能を説明することがあるが、機能は、一つ以上のコンピュータプログラムがプロセッサ部によって実行されることで実現されてもよいし、一つ以上のハードウェア回路(例えばFPGA又はASIC)によって実現されてもよい。プログラムがプロセッサ部によって実行されることで機能が実現される場合、定められた処理が、適宜に記憶部及び/又はインタフェース部等を用いながら行われるため、機能はプロセッサ部の少なくとも一部とされてもよい。機能(又はプログラム)を主語として説明された処理は、プロセッサ部あるいはそのプロセッサ部を有する装置が行う処理としてもよい。プログラムは、プログラムソースからインストールされてもよい。プログラムソースは、例えば、プログラム配布コンピュータ又はコンピュータが読み取り可能な記録媒体(例えば非一時的な記録媒体)であってもよい。各機能の説明は一例であり、複数の機能が一つの機能にまとめられたり、一つの機能が複数の機能に分割されたりしてもよい。
また、以下の説明では、「ストレージシステム」は、それぞれが記憶デバイス部を有する複数のストレージノードを備えたマルチノード構成のノード群(例えば分散システム)を含む。各ストレージノードは、一つ以上のRAID(Redundant Array of Independent (or Inexpensive) Disks)グループを備えたストレージ装置でもよいが、典型的には、汎用のコンピュータである。一つ以上のコンピュータの各々が所定のソフトウェアを実行することにより、当該一つ以上のコンピュータがSDx(Software-Defined anything)として構築されてもよい。SDxとしては、例えば、SDS(Software Defined Storage)又はSDDC(Software-defined Datacenter)を採用することができる。例えば、ストレージ機能を有するソフトウェアが一つ以上の汎用のコンピュータの各々で実行されることにより、SDSとしてのストレージシステムが構築されてもよい。また、少なくとも一つのコンピュータが、ホストコンピュータとしての一つ以上の仮想的なコンピュータと、ストレージシステムの記憶制御システム(典型的には、I/O要求に応答してデータを記憶デバイス部に対して入出力する装置)としての仮想的なコンピュータとが実行されてもよい。
また、以下の説明では、同種の要素を区別しないで説明する場合には、参照符号を使用し、同種の要素を区別して説明する場合には、要素の識別番号を使用することがある。例えば、ストレージノードを特に区別しないで説明する場合には、「ストレージノード200」と記載し、個々のストレージノードを区別して説明する場合には、「ストレージノード0」、「ストレージノード1」のように記載することがある。
以下、一実施例を説明する。
図20は、実施例の概要を示す図である。
ストレージシステム160が、ノード群165を有する。ノード群165は、複数のストレージノード200で構成される。ストレージノードを単に「ノード」と呼ぶことがある。複数のストレージノード200の各々が、当該ストレージノード200内の記憶デバイス部に基づくローカルプール263を有する。複数のストレージノード200は、複数のローカルプール263に基づく論理的な記憶領域であるグローバルプール280を提供する。
各ストレージノード200は、ストレージシステム160の上位システム820に提供されたボリューム262に格納されるデータを当該ストレージノード200におけるローカルプール263に格納する。上位システム820は、アプリケーションプログラム又はそれを実行するホストシステムのようなシステムであり、ボリューム262を指定したI/O(Input/Output)要求を発行するシステムである。
ストレージノード200から作成されるボリューム262の使用済み容量が当該ストレージノード200におけるローカルプール263の空き容量以下であるという容量関係を維持することが行われる。これにより、ライトエラーの発生頻度を下げることが可能である。
本実施例では、具体的には、作成されるボリューム262の容量を制限することで上記の容量関係を維持する維持方式Aと、ローカルプール263の空き容量を動的に変えることで上記の容量関係を維持する維持方式Bとのうちのいずれかが、ノード群165を管理するストレージ管理部810により実施される。維持方式AおよびBのいずれについても、ストレージ管理部810が、ボリュームを作成するノード200を選択する。ストレージ管理部810は、ストレージノード200と後述の管理ノード300とのうち少なくとも一つにより実現される。具体的には、例えば、ストレージシステム160は、ノード群165それ自体でもよいし、ノード群165の他に、ストレージ管理部810の少なくとも一部のような要素を含んでもよい。維持方式A及びBの一方が無くてもよい。ストレージ管理部810は、後述の図10Aに例示のプログラム、図10Bに例示のプログラム、図10A及び図10Bのいずれにも例示されていないプログラム、のうちの少なくとも一部を基に実現されてよい。
以下、本実施例を詳細に説明する。
図1は、本実施例に係るコンピュータシステムの構成を示す図である。
コンピュータシステムは、ストレージシステム160を含む。コンピュータシステムは、ストレージシステム160を管理する管理ノード300を更に含んでもよい。ストレージシステム160、管理ノード300及びホスト100が、ネットワーク400に接続される。
ホスト100は、上位システム820の一例であり、アプリケーションプログラムを実行するためのコンピュータである。ホスト100は、物理的なコンピュータでもよいし、仮想マシン(Virtual Machine)でもよいし、コンテナなどでもよい。図示していないが、ホスト100は、ストレージシステム160と接続するためのI/F(インタフェースデバイス)、CPU、メモリなどを搭載しアプリケーションを実行する。メモリはアプリケーションのプログラムを記録する。CPUは、アプリケーションのプログラムを実行する。I/Fはストレージノード200との間の通信を仲介する。
ストレージシステム160は、ノード群165を含む。ノード群165は、複数のストレージノード200から構成される。ストレージノード200は、典型的には汎用のコンピュータである。ホスト100同様に、ストレージノード200は、物理的なコンピュータでもよいし、仮想マシン(Virtual Machine)でもよいし、コンテナでもよいし、クラウド上で動作する仮想マシンなどにソフトウェアをインストールすることで構築されるソフトウェアデファインドのストレージノードでもよい。
図1は、ホスト100とストレージノード200を別のコンピュータとして記載しているが、物理的に同じコンピュータ上でストレージのソフトウェアとアプリケーションのソフトウェアが動作してもよい。
管理ノード300は、ストレージシステム160を管理するソフトウェアが実行されるノードである。
図1の例では、管理ノード300とストレージノード200は異なるノードとして記載しているが、一つのノードがストレージノード200と管理ノード300を兼ねてもよい。すなわち、一つのノードが、後述するデータを保存するための処理を実行し、加えて、ストレージシステム、ストレージノードを管理するための管理ソフトウェアを実行してもよい。
図2Aは、ストレージノード200の構成を示す図である。
ストレージノード200は、通信ポート250、CPU230、メモリ220、記憶デバイス210から構成される。これらのうちの少なくとも一つの資源は、ストレージノード200に一つ以上搭載され得る。一つ以上の記憶デバイス210が記憶デバイス部249である。
通信ポート250は、インタフェース部の一例であり、ネットワーク400を介してホスト100や管理ノード300と接続され、ホスト100や管理ノード300との通信を仲介する。図の例では、一つの通信ポート250をホスト100向けの通信と管理ノード300向けの通信で共有しているが、それぞれの通信に異なる通信ポートが設けられてもよい。
メモリ220は、メモリ部の一例であり、ストレージノードで使用される制御情報、ストレージノードが実行するプログラム、ホストがアクセスするデータのキャッシュを格納する。これ以外のデータをメモリ220は格納してもよい。メモリ220は、DRAM(Dynamic Random Access Memory)で構成されることが一般的であるが、それ以外の記憶メディアで構成されてもよい。例えば、MRAM(Magnetoresistive Random Access Memory)、ReRAM(Resistive Random Access Memory)、PCM(Phase-Change Memory)、又は、NAND型のフラッシュメモリでよい。
CPU230は、プロセッサ部の一例であり、メモリ220に格納された各種プログラムを実行することにより各種処理を実行する。また、CPU230は、メモリ220に格納されている各種情報を用いて各種処理を実行する。
記憶デバイス210は、物理的に記憶領域を有する装置である。例えば、記憶デバイス210は、HDD(Hard Disk Drive)、SSD(Solid State Drive)、DVD(Digital Versatile Disc)、及び、SCM(Storage Class Memory)のいずれでもよい。記憶デバイス210へアクセスするためのI/Fとして、例えばSAS(Serial Attached SCSI)、NVMe(Non-Volatile Memory Express)などがあるが、それ以外のI/Fが採用されてもよい。複数の記憶デバイス210は、同種の記憶デバイスでもよいし異種の記憶デバイスでもよい。一般に、マルチノード構成のストレージシステムでは、ノードの障害に備え、別のノードにデータの複製を格納することなどでデータを保護することが可能である。ノード内で一つ以上の記憶デバイスをパリティグループという単位でまとめて、RAID(Redundant Arrays of Independent Disks)のような高信頼化技術を使用してもよい。CPU230、メモリ220、通信ポート250及び記憶デバイス210は、内部ネットワーク240を介して相互に接続されている。図2Aの構成は、ストレージノード200の構成の一例であり、本発明は図の構成に限定されない。なお、図2Aに限らず、本発明は、他の図が示す構成や処理に限定されない。
図2Bは、管理ノード300の構成を示す図である。
管理ノード300は、CPU330、メモリ320、記憶デバイス310、入出力デバイス360及び保守ポート350を有する。CPU330、メモリ320、記憶デバイス310、入出力デバイス360及び保守ポート350は、内部ネットワーク340を介して相互に接続されている。
メモリ320及び記憶デバイス310が記憶部の一例である。メモリ320及び記憶デバイス310のうちの少なくともメモリ320は、管理ソフトウェア(管理用のソフトウェア)を記憶する。CPU330は、管理ソフトウェアを実行して管理処理を実行する。管理ソフトウェアは、例えば、図10Bに例示のプログラム233〜237を含んでよい。入出力デバイス360は、例えば、マウス、キーボード、ディスプレイ等により構成され、管理を行うオペレータによる各種指示入力を受け付けるとともに、各種情報をディスプレイに表示させる。保守ポート350は、ストレージノード200との間の通信を仲介する。
図3は、ストレージノード200内でのデータ保護及び容量割り当てを説明する図である。
複数のストレージノード200は、一つ以上の制御部クラスタを有する。各制御部クラスタは、状態がアクティブであるストレージ制御部(以下、アクティブ制御部)260Aと、それぞれ状態がスタンバイである一つ以上のストレージ制御部(以下、スタンバイ制御部)260Sとで構成される。アクティブ制御部260Aは、ボリューム262を提供する。アクティブ制御部260Aは、当該ボリューム262を指定したI/O要求を受け付けた場合、当該ボリューム262に対するI/O、具体的には、当該ボリューム262に関連付けられたローカルプール263に対するI/Oを行う。アクティブ制御部260Aが停止した場合、当該アクティブ制御部260Aに代わっていずれかのスタンバイ制御部260Sがアクティブとなるフェイルオーバーが行われる。
また、複数のストレージノード200の各々は、データ保護部270を有する。データ保護部270が、データ保護(本実施例では、データを自身のストレージノード200に格納することに加えて、データを複製し複製されたデータを別のストレージノード200に格納すること)を行う。
最初にデータ保護について説明する。
マルチノード構成のストレージシステムは、ノード障害を想定しストレージノード200間でのデータ保護を行う。データ保護の方法として、例えば、別のストレージノード200に複製データを保存する方法や、別のノードのデータとパリティを生成する方法などが考えられる。図3の例では、各ストレージノード200は、データの複製を別のノードに保存する。ノード間のデータ保護に加えて、ノード内でRAID等の方法を用いた更なるデータ保護が行われてもよい。ノード内でRAID等の方法を用いる場合、記憶デバイス210の一台が障害でノード間でのデータ復旧が不要となる。
図の例では、論理チャンク264と物理チャンク211を用いてデータをストレージノード200間で複製する方法が採用されている。「物理チャンク」とは、ストレージノード200内の記憶デバイス部249を一つ以上に分割して作成した小領域である。「論理チャンク」とは、一つ以上の物理チャンクが関連付けられた論理的な記憶領域である。論理チャンクはローカルプール263に関連付けられる。ホスト100からの書き込みデータは論理チャンク264に書き込まれる。図の例では、データ保護としてミラーリングが採用されているため、一つの論理チャンク264に二つの物理チャンク211が関連付けられる。データ保護部270は、論理チャンク264に書き込まれたデータを、当該論理チャンク264に関連付けられた二つの物理チャンク211に書き込む。結果として、データの複製(データ保護)が実現される。図3の例では、ストレージノード0内の或る物理チャンクとストレージノード1内の或る物理チャンクからストレージノード0内の或る論理チャンクが作成されている。ストレージノード0内の論理チャンク264について、ストレージノード0内の物理チャンク211に書き込まれたデータと、ストレージノード1内の物理チャンク211に書き込まれたデータのうち、後者のデータが、複製データである。
次に、ローカルプール263とボリューム262について説明する。
ローカルプール263は、一つ以上の論理チャンク264から成る論理的な記憶領域である。ボリューム262は、ホスト100が認識する論理的な記憶領域である。アクティブ制御部260Aは、ホスト100が認識する記憶領域であるボリュームに対するライト要求をホスト100から受け付けると、ローカルプール263から所定サイズの領域(例えば、論理チャンク264、又は、論理チャンク264よりも大きい又は小さい領域)をボリューム262に割り当て、当該領域にライト対象のデータを格納する。当該領域に格納されたデータは、データ保護部270が、当該領域が属する論理チャンク264と当該論理チャンク264に関連付いた物理チャンク211との対応関係に従い、当該データを、ストレージノード0内の物理チャンク211とストレージノード1内の物理チャンク211に書き込む。アクティブ制御部260Aはローカルプール263とボリューム262の管理を行う。論理チャンク264と物理チャンク211との対応関係は、データ保護の方式(例えば、パリティが不要なデータ保護であるのかパリティを必要とするデータ保護であるのか)に依存する。
ストレージノード0の障害時に、ストレージノード1が処理を引き継ぐため、ストレージノード1も、論理チャンク264に関する情報、ローカルプール263に関する情報、ボリューム262に関する情報を有する。ストレージノード0が障害となった場合、スタンバイ制御部0がアクティブ制御部0の処理を引き継ぐ(フェイルオーバー)。一つのアクティブ制御部260Aに対して複数個のスタンバイ制御部260Sが設定されてもよい。なお、ストレージ制御部0をアクティブ制御部とアクティブ制御部の組み合わせとしても、本発明は適用可能である。その場合、ストレージノード200間の排他機能や一貫性管理機能などが必要となる。
一つのストレージノード200に複数のストレージ制御部260があってもよい。図3の例では、ストレージ制御部0とストレージ制御部2がストレージノード0に配置されている。異なる複数の制御部クラスタについて、複数のアクティブ制御部260Aはリソース消費の集中を避けるために複数のストレージノード200に分散されていてもよい。また、異なる複数の制御部クラスタについて、複数のスタンバイ制御部260Sは複数のストレージノード200に分散されていてもよいし、一部のストレージノード200に集約されていてもよい。
上述した物理チャンク211、論理チャンク264、ローカルプール263及びアクティブ/スタンバイ構成を制御するために使用される制御情報(制御テーブル)を説明する。
図4は、物理チャンクテーブルの一例を示す図である。
物理チャンクテーブル231は、物理チャンク211に関する情報の一例である。物理チャンクテーブル231は、物理チャンク211毎にレコードを有する。各レコードは、物理チャンク番号401、記憶デバイス番号402、デバイス内オフセット403及びサイズ404といった情報を格納する。以下、一つの物理チャンク211を例に取る(図4の説明において「対象物理チャンク」)。
物理チャンク番号401は、対象物理チャンクを識別するための番号を示す。物理チャンク211は、ストレージノード200内の資源であり、物理チャンク番号401は、ストレージノード200内で非重複の番号である。記憶デバイス番号402は、対象物理チャンクが属する記憶デバイス210を識別するための番号である。デバイス内オフセット403は、対象物理チャンクの先頭が対応する記憶デバイスのアドレスを示す。最後に、サイズ404は、対象物理チャンクのサイズを示す。
図4の例では、物理チャンク番号0の物理チャンク先頭アドレスが、記憶デバイス番号0のアドレス0x0000であり、物理チャンクサイズが100GBである。
図5は、論理チャンクテーブルの一例を示す図である。
論理チャンクテーブル232は、論理チャンク264に関する情報の一例である。論理チャンクテーブル232は、論理チャンク264毎にレコードを有する。各レコードは、論理チャンク番号501、ノード番号(マスタ)502、物理チャンク番号(マスタ)503、ノード番号(ミラー)504、物理チャンク番号(ミラー)505、サイズ506、及び、ストレージ制御部番号507といった情報を格納する。以下、一つの論理チャンク264を例に取る(図5の説明において「対象論理チャンク」)。
論理チャンク番号501は、対象論理チャンクを識別するための番号である。論理チャンク264は、ストレージノード200内の資源であり、論理チャンク番号501は、ストレージノード200内で非重複の番号である。他のノードに容量を融通する場合などは、ストレージノード番号と組み合わせることで、ストレージシステム160内で対象論理チャンクを識別することが可能となる。
ノード番号(マスタ)502は、対象論理チャンクに関連付けられた二つの物理チャンク211のうちマスタの物理チャンク211を有するストレージノード(典型的には、対象論理チャンクを有するストレージノード自身)を識別するための番号である。物理チャンク番号(マスタ)503は、対象論理チャンクに関連付けられた上記マスタの物理チャンク211を識別するための番号である。ノード番号(ミラー)504は、対象論理チャンクに関連付けられた二つの物理チャンク211のうちミラーの物理チャンク211を有するストレージノード(典型的には、対象論理チャンクを有するストレージノードとは別のストレージノード)を識別するための番号である。物理チャンク番号(ミラー)505は、対象論理チャンクに関連付けられた二つの物理チャンク211のうち上記ミラーの物理チャンク211(障害に備えて複製されている(ミラーされている)データが格納される物理チャンク)を識別するための番号である。情報502〜505を参照することで、対象論理チャンクに関連付けられている二つの物理チャンクを識別することが可能となる。
サイズ506は、対象論理チャンクのサイズを示す。ストレージ制御部番号507は、対象論理チャンクを使用する(対象論理チャンクが割り当てられた)ストレージ制御部260の識別番号を示す。各レコードは、ストレージ制御部番号507に加えて、ローカルプール番号を格納してもよい。例えば、一つのストレージ制御部260が複数のローカルプール263を管理する場合、ローカルプール番号が必要となる。
図5の例では、論理チャンク0が、ストレージノード0の物理チャンク0とストレージノード1の物理チャンク0に対応しており、ストレージ制御部0に割り当てられている。
図5の例は、データを複製する場合の論理チャンクテーブルの一例を示している。ノード間でRAIDやErasure Codingを適用する場合、複数の物理チャンクをグルーピングし、グルーピングした複数の物理チャンクから複数の論理チャンクを作成してもよい。その場合、図5にはグルーピングされた物理チャンクの情報が格納される。
図6は、ローカルプールテーブルの一例を示す図である。
ローカルプールテーブル228は、一つ以上の論理チャンク264の容量を容量プールとするため、論理チャンク264との対応や、容量の割り当て先ボリューム262、割り当て状況などを管理する。ローカルプールテーブル228は、ボリューム262への割当ての単位領域であるページ毎にレコードを有する。各レコードは、ローカルプール番号601、容量602、使用済み容量603、論理チャンク番号604、ページ番号605、ページ割当状況606、及び、割当先ボリューム番号607といった情報を格納する。以下、一つのページを例に取る(図6の説明において「対象ページ」)。
ローカルプール番号601は、対象ページを含んだローカルプール263を識別するための番号を示す。ストレージ制御部260が複数のローカルプール263を管理する場合などに、ローカルプール番号601を用いてローカルプール263を識別することができる。
容量602は、対象ページを含んだローカルプール263の容量を示す。使用済み容量603は、対象ページを含んだローカルプール263の容量のうち、既に使用されている容量を示す。容量602は、論理チャンクサイズと論理チャンク数との積でよい。使用済み容量603は、ページ割当状況“済”の数とページサイズとの積でよい。
論理チャンク番号604は、対象ページを含んだ論理チャンク264(ローカルプールに登録されている論理チャンク264)の番号を示す。一つ以上の論理チャンク264がローカルプール263に登録される。論理チャンク264が一つもローカルプール263に登録されてない場合、ローカルプール263が未定義である。
「ページ」は、論理チャンク264を更に小さな領域に分割した領域であり、ボリュームへ記憶領域の割り当て単位である。割り当て単位を論理チャンクとする場合、ページは不要となる。その場合、ページ番号605及びページ割当状況606は不要となり、論理チャンクの割当状況(割当て済か否か)を示す情報が必要となる。ページ番号605は、対象ページを識別するための番号を示す。ページ割当状況606は、対象ページが割り当て済みであるか否かを示す。割当先ボリューム番号607は、対象ページが割り当てられているボリューム262の番号を示す。対象ページの割当状況が未割り当ての場合、対象ページについて割当先ボリューム番号607としては何も格納されないでよい(図6の例では、“−”)。
ローカルプールテーブル228は、ストレージ制御部260毎に存在するものとする。ローカルプールテーブル228の各レコードはストレージ制御部番号を有してもよい。
また、図示しないが、ボリューム262に関する情報の一例として、いずれのボリューム262のいずれのアドレスにいずれのページが割り当てられているかを示すボリュームテーブルが、各ストレージノード200に存在してもよい。アクティブ制御部260Aは、当該ボリュームテーブルを参照したり更新したりすることができる。アクティブ制御部260Aは、当該ボリュームテーブルを参照することで、ボリューム262のI/O先のアドレスに割り当てられているページを特定できる。
図7は、ストレージ制御部テーブルの一例を示す図である。
ストレージ制御部テーブル243は、ストレージ制御部260の配置を管理する。ストレージ制御部テーブル243は、ストレージ制御部260毎にレコードを有する。各レコードは、ストレージ制御部番号701、アクティブノード番号702、及びスタンバイノード番号703といった情報を格納する。以下、一つのストレージ制御部260を例に取る(図7の説明において「対象ストレージ制御部」)。
ストレージ制御部番号701は、対象ストレージ制御部を識別するための識別番号を示す。アクティブのストレージ制御部にもスタンバイのストレージ制御部にも同一の識別番号が割り当てられる。アクティブノード番号702は、対象ストレージ制御部としてのアクティブ制御部が配置されるストレージノード200の番号を示す。スタンバイノード番号703は、対象ストレージ制御部としてのスタンバイ制御部が配置されるストレージノード200の番号を示す。
図7の例では、ストレージノード0にアクティブ状態であるストレージ制御部0が配置され、ストレージノード1にスタンバイ状態であるストレージ制御部0が配置されている。
次に、マルチノード構成におけるグローバルプールについて説明する。
図8は、グローバルプールテーブルの一例を示す図である。
グローバルプールテーブル238は、グローバルプール280に属するローカルプール263に関する情報を管理する。グローバルプールテーブル238は、ローカルプール263毎にレコードを有する。各レコードは、グローバルプール番号801、容量802、使用済み容量803、ストレージ制御部番号804、及びローカルプール番号805といった情報を格納する。以下、一つのローカルプール263を例に取る(図8の説明において「対象ローカルプール」)。
グローバルプール番号801は、対象ローカルプールを含むグローバルプールを識別するための番号を示す。容量802は、対象ローカルプールを含むグローバルプールの容量を示す。使用済み容量802は、当該グローバルプールの容量のうち、既に使用されている容量を示す。ストレージ制御部番号804とローカルプール番号805は、対象ローカルプールを識別するための番号を示す。
この様に、各ストレージノード200は、グローバルプール280に属するローカルプール263を識別するためにローカルプール263をグローバルプール280と対応付けて管理する。
図9は、一比較例で生じ得る課題を説明する概念図である。
課題が発生するパターンとして、例えばケース(1)からケース(4)があり得る。ケース(1)から(4)は一例でありこの他の構成でも課題は発生し得る。
<ケース(1)>
本例は、各ストレージノード20の内部容量21が150TB、ローカルプール容量が100TB、グローバルプール容量が200TBであり、グローバルプールの空き容量が200TBの状態である。また、「内部容量」とは、ローカルプール23に提供可能な容量(例えば、ストレージノード20が内蔵する記憶デバイスの容量からローカルプール23に提供不可能な容量(例えば、他のノードのミラーデータを格納する容量や、ノード障害時に冗長化を再構築するための予備領域の容量)を除いた容量)である。ストレージシステムの利用者(例えばホスト100)は、空き容量200TBを認識するため、最大200TBのボリュームの作成指示を出す可能性がある。本例では、150TBのボリューム22の作成指示を受け、ストレージノード0に150TBのボリューム22が作成される。ホストから150TBのデータをボリューム22にライトするライト要求が受け付けられても、ローカルプール容量が100TBしかないため、全てのデータを格納することはできない。よって、そのようなライト要求の処理ではライトエラーが発生する。
ローカルプール容量が内部容量21を下回る理由を説明する。ローカルプール23の容量はローカルプールテーブルに登録可能な論理チャンク数と、論理チャンクのサイズとによって決まる。ストレージノード20に大容量の記憶デバイス部が搭載されているとしても、実際には全ての容量をローカルプールに登録することができない場合がある。
以上のように、本例では、ローカルプール容量を超えた容量のボリュームが作成されることが、ライトエラーが発生する原因となり得る。
<ケース(2)>
本例は、各ストレージノード20の内部容量21が150TB、ローカルプール容量が100TB、グローバルプール容量が200TBであり、ローカルプール23の半分である50TBが使用済みである。このため、ローカルプール23の空き容量は50TB、内部容量21の空き容量は100TBとなる。つまり、ローカルプール23に記載している“50TB”と内部容量21に記載している“100TB”はそれぞれ空き容量を示している。
グローバルプール容量は200TBで、グローバルプール28の空き容量は100TBの状態である。グローバルプール28の空き容量である100TBを認識する利用者から、70TBのボリュームの作成指示を受け、ストレージノード0に70TBのボリューム22が作成される。ホストから70TBのデータをボリューム22にライトするライト要求が受け付けられても、ローカルプール23の空き容量が50TBしかないため、全てのデータを格納することができない。よって、そのようなライト要求の処理ではライトエラーが発生する。
以上のように、本例では、ローカルプール容量は超えていないがローカルプールの空き容量を超えた容量のボリュームが作成されることが、ライトエラーが発生する原因となり得る。
<ケース(3)>
本例は、ストレージノード20の内部容量21が50TB、ローカルプール容量が50TB、グローバルプール容量が100TBであり、グローバルプール28の空き容量が100TBの状態である。グローバルプール28の空き容量である100TBを認識する利用者から、70TBのボリュームの作成指示を受け、ストレージノード0に70TBのボリューム22が作成される。ホストから70TBのデータをボリューム22にライトするライト要求が受け付けられても、内部容量21が50TBしかないため、全てのデータを格納することはできない。よって、そのようなライト要求の処理ではライトエラーが発生する。
本例では、内部容量21を超えた容量のボリュームが作成されることが、ライトエラーが発生する原因となり得る。
<ケース(4)>
本例は、各ストレージノード20の内部容量21が50TB、ローカルプール容量が50TB、グローバルプール容量が100TBであり、ローカルプール23の半分である25TBが使用済みである。このため、ローカルプール23の空き容量は25TB、内部容量21の空き容量は25TBとなる。グローバルプール容量は100TBで、グローバルプール28の空き容量は50TBの状態である。グローバルプール28の空き容量である50TBを認識する利用者から、50TBのボリュームの作成指示を受け、ストレージノード0に50TBのボリューム22が作成される。ホストから50TBのデータをボリューム22にライトするライト要求が受け付けられても、内部容量21の空き容量が25TBしかないため、全てのデータを格納することはできない。よって、そのようなライト要求の処理ではライトエラーが発生する。
以上のように、本例では、内部容量21の空き容量を超えた容量のボリュームが作成されることが、ライトエラーが発生する原因となり得る。
上述したように、各ストレージノード20が提供できる容量はグローバルプール28の容量よりも小さくなる可能性が高い。このため、グローバルプール28の容量を認識してボリューム22を作成する場合、ライトエラーが発生する可能性がある。
本実施例では、ケース(1)〜ケース(4)のようなパターンで発生する課題を解決することができる。以下、本実施例を更に説明する。
図10Aは、ストレージノード200のメモリ220に格納されている制御情報とプログラムを示している。
ローカル空き容量報告プログラム221、ボリューム作成プログラム222、チャンク作成プログラム223、チャンク貸出プログラム224、チャンク受取プログラム225、チャンク交換プログラム226、チャンク結合プログラム227及びライトプログラム245がメモリ220に格納される。これらのプログラムが行う処理は後述する。
また、ローカルプールテーブル228、ボリュームテーブル229、論理チャンクテーブル232、物理チャンクテーブル231、及び結合ボリュームテーブル246がメモリ220に格納される。ローカルプールテーブル228は、図6を参照して説明した通りである。ボリュームテーブル229は、図示はされていないが上述の通りであるし、或いは後述の通りであってもよい。論理チャンクテーブル232は、図5を参照して説明した通りである。物理チャンクテーブル231は、図4を参照して説明した通りである。結合ボリュームテーブル246は、後に図22を参照して説明する通りである。
図10Bは、管理ノード300のメモリ320に格納されている制御情報とプログラムを示している。
最大ボリューム容量取得プログラム233、容量情報取得プログラム234、ボリューム作成ノード決定プログラム(1)235、不足モニタリングプログラム(1)236、不足モニタリングプログラム(2)237、及びボリューム作成ノード決定プログラム(2)244がメモリ320に格納される。これらのプログラムが行う処理は後述する。
また、グローバルプールテーブル238、ローカル履歴テーブル239、ボリューム管理テーブル242、及びストレージ制御部テーブル243がメモリ320に格納される。グローバルプールテーブル238は、図8を参照して説明した通りである。ローカル履歴テーブル239及びボリューム管理テーブル242については後述する。ストレージ制御部テーブル243は、図7を参照して説明した通りである。
図10A及び図10Bに示したプログラム及びテーブルは一例である。実際には、これら以外のプログラムやテーブルも格納される。図10Aに例示した一つ以上のプログラムと図10Aに例示されていない一つ以上のプログラムとのうちの少なくとも一つのプログラムに基づき図3に示したストレージ制御部260やデータ保護部270が実現される。
ボリュームテーブル229とボリューム管理テーブル242の詳細説明は省略する。ボリュームテーブル229は、ボリューム番号、サイズ、ボリューム内アドレスとページの対応関係などを管理する。ボリューム管理テーブル242は、ボリューム番号、サイズ、ボリュームが配置されるストレージ制御部番号などを管理する。ボリューム管理テーブル242は、ボリュームテーブル229と同様に、ボリューム内アドレスとページの関係も管理してもよい。その場合、ボリュームテーブル229の更新内容がボリューム管理テーブル242に反映される。
図10A及び図10Bの例では、電源障害などに備え、テーブルやプログラムはメモリ220及び230に格納されるが、上述したテーブル及びプログラムの少なくとも一部が記憶デバイス部に格納されてもよい。記憶デバイス部に格納されたテーブルやプログラムがメモリにキャッシュされてもよい。テーブルやプログラムが記憶デバイス部とメモリの両方に格納されてもよい。
管理ノード300がローカルプールテーブル228、物理チャンクテーブル231、及び論理チャンクテーブル232といったテーブルのバックアップを格納してもよい。当該バックアップは、ストレージノード200のメモリ障害時など、制御情報のみが失われた場合のデータ回復に利用され得る。
ローカルプールテーブル228、ボリュームテーブル229、及び論理チャンクテーブル232といったテーブルはアクティブ制御部260Aとスタンバイ制御部260Sで複製される。これは、アクティブ制御部260Aが配置されるストレージノード200の障害などにより、処理を引き継ぐスタンバイ制御部260Sが処理を継続するためである。後述する説明において、上記テーブルを更新では、ノード間通信が行われアクティブ制御部260Aとスタンバイ制御部260Sの両方のテーブルが更新されるものとする。物理チャンクテーブル231は、ストレージノード200の物理的な資源を管理するため、複製する必要はない。
本実施例では、ストレージノード200から作成されるボリューム262の使用済み容量が当該ストレージノード200におけるローカルプール263の空き容量以下であるという容量関係が維持される。このような容量関係の維持の方式として、上述したように、作成されるボリューム262の容量を制限することで上記の容量関係を維持する維持方式Aと、ローカルプール263の空き容量を動的に変えることで上記の容量関係を維持する維持方式Bとがある。維持方式A及びBのうちの少なくとも一つを採用することができる。
以下、各維持方式を説明する。
<維持方式A>
維持方式Aの概要の一例は、以下の通りである。
すなわち、ストレージ管理部810は、グローバルプール280を構成する複数のローカルプール263がそれぞれ有する複数の空き容量のうちの最大の空き容量を提供する。これにより、当該最大の空き容量を受けた側(例えば利用者)は、作成可能なボリュームの最大容量を知ることができる。以って、作成されるボリューム262の容量を当該ボリューム262が作成されるストレージノード200におけるローカルプール263の空き容量以下に維持することが期待される。例えば、ストレージ管理部810は、グローバルプール280を構成する複数のローカルプール263の空き容量を複数のストレージノード200からそれぞれ収集し、収集された複数の空き容量のうちの最大の空き容量を特定し、特定された最大の空き容量を提供する(例えばホスト100に提供する)。
なお、最大の空き容量が提供された後に要求された容量のボリュームの作成先のストレージノード200は、要求された容量以上の空き容量を有するストレージノード200のうちのいずれか(例えば、上記要求された容量に最も近い空き容量を有するストレージノード)でよい。これにより、ライトエラーが発生することを回避できる。例えば、ストレージ管理部810は、上記複数の空き容量のうち、上記要求された容量以上のいずれかの空き容量を特定し、当該空き容量を有するストレージノードを、上記要求された容量のボリューム262の作成先として選択してよい。
また、上記要求された容量が上記作成先のストレージノードの空き容量を超える場合(例えば、作成先として選択された後にデータがローカルプール263に書き込まれたが故に空き容量が上記要求された容量未満になった場合)、上記作成先のストレージノードからボリューム作成要求に対するエラーが返ってよい。これにより、作成されるボリューム262の容量が当該ボリューム262の作成先のストレージノード200におけるローカルプール263の空き容量以下であることを維持することができる。なお、これは、上記最大の空き容量を超える容量のボリュームの作成が指示された場合にも有効である。
また、上記最大の空き容量は、作成可能なボリュームの容量の最大値、及び、グローバルプール280の空き容量、のうちの少なくとも一つとして提供される。これにより、要求可能なボリューム容量を、上記最大の空き容量以下に制限することができる。
以下、維持方式Aを詳細に説明する。
図11は、最大ボリューム容量取得プログラム233とローカル空き容量報告プログラム221の処理の一例を示す図である。
この処理は、最大容量取得指示(作成可能なボリュームの最大容量を取得するための指示)を利用者や上位管理ソフトウェアといった指示元から最大ボリューム容量が受領すると開始する。この処理では、ストレージノード200の状態から作成可能な最大容量が計算され、当該最大用容量が指示元に報告される。例えば、CLI(Command Line Interface)、GUI(Graphical User Interface)、REST API(Representational State Transfer Application programming interface)などを介して当該指示が受領される。
最大ボリューム容量取得プログラム233は、当該指示を受領すると、グローバルプール280に属する複数のローカルプール263を、グローバルプールテーブル238を参照することにより特定する(S100)。S100では、各ローカルプール263に対応したストレージ制御部番号804及びローカルプール番号805が特定される。
最大ボリューム容量取得プログラム233は、特定した複数のローカルプール263がそれぞれ配置される複数のストレージノード200に対し、容量情報取得指示(空き容量を示す情報を取得する指示)を発行し応答を待つ(S101)。容量情報取得指示は、例えば、特定されたローカルプール263の番号を含む(つまり、いずれのローカルプール263の空き容量が取得対象であるかが指定される)。
容量情報取得指示を受領したストレージノード200のローカル空き容量報告プログラム221は、当該指示に応答して、ローカルプールテーブル228から当該指示で指定されているローカルプール263の容量602及び使用済み容量603(空き容量=容量602−使用済み容量603)を特定し、特定した容量602及び使用済み容量603(又は空き容量)を示す容量情報を指示元へ報告し(S102)、処理を終了する(S103)。
ローカル空き容量報告プログラム221からの報告を受領した最大ボリューム容量取得プログラム233は、S100で特定した各ローカルプール263の容量情報をローカル履歴テーブル239に格納する(S104)。次に、最大ボリューム容量取得プログラム233は、S100で特定した複数のローカルプール263の空き容量のうちの最大値を計算(特定)し(S105)、上記最大容量取得指示の指示元に、当該最大値を、作成可能なボリュームの最大容量として報告し(S106)、処理を終了する(S107)。
上記の説明では、空き容量を、容量602−使用済み容量603によって計算した。これを、仕様上の最大ローカルプール容量−使用済み容量603によって計算してもよい。例えば、ローカルプール263に一つ100GBの論理チャンクを1000個登録可能な場合、仕様上の最大ローカルプール容量は100TBとなる。仕様上の最大ローカルプール容量は、当該ローカルプール263があるストレージノード200への記憶デバイス210の増設により実現できる容量である。また、両方の計算結果を利用者に提供してもよい。記憶デバイス210の増設を想定しない利用者は、容量602−使用済み容量603によって計算された値を参考にボリューム作成を実施できる。記憶デバイス210の増設を想定しない利用者は、仕様上の最大ローカルプール容量−使用済み容量603によって計算された値を参考にボリューム作成を実施できる。
この様に、各ノード200の空き容量の最大値を、作成可能なボリュームの最大容量とすることで、ライトエラーを発生させるような容量のボリュームの作成を回避することができる。ライトエラーを回避するために、図14に示す処理も行われる。
上記の計算結果(報告される最大容量)は、図9を例に取れば、ケース(1)の場合100TB、ケース(2)の場合50TB、ケース(3)の場合50TB、ケース(4)の場合25TBとなる。いずれのケースにおいてもライトエラーが発生することはない。
最大ボリューム容量取得プログラム233は、グローバルプール280に属する全てのローカルプール263がそれぞれ配置される全てのノード200と通信する。
図11の例では、最大容量取得指示を受領して管理ノード300が各ストレージノード200と通信を行っているが、最大ボリューム容量取得プログラム233は、ローカル履歴テーブル239を参照することで、各ストレージノード200と通信することなく、指示元に作成可能なボリュームの最大容量を報告してもよい。具体的には、例えば、ステップS100からS104が予め定期的に実行され、ローカル履歴テーブル239にローカルプールの容量情報が格納される。最大容量取得指示が受領された時、ステップS105からS107のみが実行される(つまり、各ストレージノード200との通信は不要である)。この様にすることで、容量情報取得操作の応答時間を短くすることができる。
S105では、最大ボリューム容量取得プログラム233は、ローカル履歴テーブル239から取得した容量及び使用済み容量を用いて、最大の空き容量を計算する。上述の説明では、ローカルプール263の容量情報が履歴として管理されるが、最新の容量情報のみが保持されてもよい。
図12は、ローカル履歴テーブル239の一例を示す図である。
ローカル履歴テーブル239は、グローバルプール280に属する各ローカルプールの容量情報を管理する。ローカル履歴テーブル239は、ローカルプール263毎にレコードを有する。各レコードは、時刻1201、ストレージ制御部番号1202、ローカルプール番号1203、容量1204、使用済み容量1205、登録済みチャンク数1206、ボリューム合計容量1207、及び内部容量1208といった情報を格納する。以下、一つのローカルプール263を例に取る(図12の説明において「対象ローカルプール」)。
時刻1201は、対象ローカルプールの容量情報が収集された時刻を示す。
ストレージ制御部番号1202及びローカルプール番号1203は、対象ローカルプールが割り当てられたストレージ制御部260の番号と、対象ローカルプール263の番号とをそれぞれ示す。ストレージ制御部番号1202及びローカルプール番号1203は、S100で特定されたストレージ制御部番号804及びローカルプール番号805と同じである。
情報1204〜1208は、上述の容量情報に含まれる情報でよい。具体的には、容量1204は、対象ローカルプールの容量602に相当する。使用済み容量1205は、対象ローカルプールの使用済み容量603に相当する。登録済みチャンク数1206は、対象ローカルプールに登録済みのチャンク数を示す。ボリューム合計容量1207は、対象ローカルプールに関連付けられている全ボリューム262の合計容量を示す。内部容量1208は、対象ローカルプール263を有するストレージノードの内部容量を示す。情報1204〜1208は、ステップS102で報告され、ステップS104でローカル履歴テーブル239に格納される。維持方式Aが採用されている場合、時刻1201、ストレージ制御部番号1202、ローカルプール番号1203、容量1204及び使用済み容量1205が使用される。維持方式Bが採用されている場合、その他の情報1206〜1208が使用される。なお、内部容量1208があれば、ローカルプールの容量又は空き容量よりも大きな容量を作成可能なボリュームの容量として報告されても、内部容量が枯渇しないような制御が行われることで(例えば、内部容量の空き容量がゼロになる前に記憶デバイスを追加するといった措置が取られることで)、ライトエラーが発生する可能性を低減することが期待できる。
図11では、利用者や上位管理ソフトウェアが作成可能なボリュームの最大容量が取得する。しかし、上位管理ソフトウェアとの間のインタフェースとして、作成可能なボリュームの最大容量を取得するインタフェースが存在しない場合があり得る。この様な場合は、上記最大容量が、グローバルプール280の空き容量として返されてよい。
図13は、容量情報取得プログラム234の処理の一例を示す図である。容量情報取得プログラム234は、グローバルプール280の容量情報を取得するためのプログラムである。
容量情報取得プログラム234は、グローバルプール280の容量情報取得の指示を受領するとステップS100からS104と同じ処理を実行することで、グローバルプール280に属する各ローカルプールの情報を各ストレージノード200から取得する(S200)。なお、最大ボリューム容量取得プログラム233と同様に、ローカル履歴テーブル239を参照することで各ストレージノード200との通信が回避されてもよい。
次に、容量情報取得プログラム234は、グローバルプール280に属する複数のローカルプールの空き容量のうちの最大値を計算し(S201)、グローバルプール280の使用済み容量803(図8参照)を、容量802から最大値(S201の計算結果)を減じた値に更新する(S202)。
最後に、容量情報取得プログラム234は、グローバルプール280の容量、空き容量、使用済み容量を含んだ容量情報を指示元に報告し(S203)、処理を終了する(S204)。
この様にすることで、図11で報告した作成可能なボリュームの最大容量をグローバルプールの空き容量として報告することができる。これによりライトエラーを発生させるような容量のボリュームが作成されることを回避することができる。
図11及び図13を参照して、ライトエラーを発生させる可能性がある容量のボリュームが作成されることを回避する処理を説明した。図11で報告されるボリューム容量、図13で報告される空きプール容量より小さい容量のボリュームを作成した場合でも、空き容量が少ないストレージノードがボリュームの作成先である場合、ライトエラーが発生してしまう可能性がある。
図14は、ボリューム作成ノード決定プログラム(1)235とボリューム作成プログラム222の処理の一例を示す図である。ボリューム作成ノード決定プログラム(1)235は、作成可能なボリュームの容量に基づき、ライトエラーが起こらないよう、ボリュームの作成先とするストレージ制御部(ストレージノード200)を決定する。ボリューム作成プログラム222は、指定されたボリュームを作成するプログラムである。
ボリューム作成ノード決定プログラム(1)235は、ボリューム作成要求を例えば利用者からGUI、CLI、または、API経由で受領し(S300)、ステップS100からS104と同じ処理を実行する(S301)。ローカル履歴テーブル239を参照することでステップS301の実行が回避されてもよい。
次に、ボリューム作成ノード決定プログラム(1)235は、指定されたボリューム容量以上の空き容量を有するローカルプール263をリストアップし(S302)、該当するローカルプール263が存在するか否かを判断する(S303)。もし、該当するローカルプール263が存在しない場合(S303:No)、作成可能容量を超えた容量が指定されていることをボリューム作成ノード決定プログラム(1)235がボリューム作成要求の送信元(例えば依頼者)に報告し(S313)、処理を終了する(S312)。本プログラムの一例では、作成可能容量を超えた容量が指定された場合、エラーを報告したが、ボリューム作成を実施してもよい。図11及び図12の処理で、作成可能なボリュームの最大容量を利用者に報告済みである。このため、その容量を超過したボリュームの作成指示を行った場合、ライト不可を許容したと考えることができる。また、ストレージノード200への記憶デバイス210の増設を行う利用者も存在するためである。
一方で、該当するローカルプール263が存在する場合(S303:Yes)、ボリューム作成ノード決定プログラム(1)235は、リストアップされた一つ以上のローカルプール263から一つのローカルプールを選択し、選択したローカルプールを有するストレージノード200にボリューム作成指示を発行する(S304)。リストアップされたどのローカルプール263も、指定ボリューム容量以上の空き容量を有するため、どのローカルプール263が選択されてもよい。例えば、最も空き容量が大きいローカルプール263が選択されてもよいし、ラウンドロビンなどの選択アルゴリズムによりローカルプール263が選択されてもよい。ボリューム作成指示では、例えば、選択されたローカルプール263の番号が指定される。
ボリューム作成指示を受領したストレージノード200のボリューム作成プログラム222は、指定ボリューム容量が空き容量(ボリューム作成指示から特定されるローカルプール263の容量602及び使用済み容量603から特定される空き容量)以下か否かを判断する(S306)。すなわち、指定ボリューム容量以上の空き容量を有するローカルプール263がリストアップされても、当該ローカルプール263を有するノード200のボリューム作成プログラム222は、ボリューム作成指示を受けたときに、当該ローカルプール263に指定ボリューム容量以上の空き容量があるか否かを判断する。当該ローカルプール263がリストアップされてから当該ローカルプール263を有するノード200がボリューム作成指示を受けるまでの間に、当該ローカルプール263の使用済み容量が増え、結果として、当該ローカルプール263の空き容量が、指定ボリューム容量未満になっている可能性があるからである。指定ボリューム容量が空き容量以下の場合(S306:Yes)、ボリューム作成プログラム222は、ボリュームテーブル229を更新することで、ボリューム作成を実行し(S307)、完了を報告する(完了応答を返す)(S309)。
指定ボリューム容量が空き容量より大きい場合(S306:No)、ボリューム作成プログラム222は、作成可能容量を超えた容量が指定されていることを報告する(失敗応答を返す)(S308)。
ボリューム作成プログラム222からの応答を受領したボリューム作成ノード決定プログラム(1)235は、ボリューム作成が成功したか否かを判断する(S310)。
ボリューム作成が失敗である場合(S310:No)、ボリューム作成ノード決定プログラム(1)235は、作成可能容量を超えた容量が指定されていることをボリューム作成要求の送信元に報告し(S313)、処理を終了する(S312)。指定ボリューム容量以上の空き容量を有する他のローカルプールがある場合、処理がステップS304に戻り、当該他のローカルプールを有するストレージノード200にボリューム作成指示が発行されてもよい。
一方、ボリューム作成が成功である場合(S310:Yes)、ボリューム作成ノード決定プログラム(1)235は、作成したボリュームに関する情報をボリューム管理テーブル242に登録し(S311)、処理を終了する(S312)。
図11又は図13に記載した処理と図14に記載した処理によりストレージノード200が提供可能な容量を超える容量のボリュームが作成されることによるライトエラーを回避することが可能となる。
図11又は図13の処理を行わず、図14の処理だけでもライトエラーを回避することができる。
<維持方式B>
ストレージ管理部810は、該当のストレージノード200についてチャンク追加を行う。チャンク追加は、当該ストレージノード200のローカルプール263に一つ以上の論理チャンク264を追加することである。これにより、当該ローカルプール263の空き容量が増えるので、当該ストレージノード200に作成されるボリュームの容量が当該ローカルプール263の空き容量以下であることを維持することができる。なお、各ストレージノード200では、当該ストレージノード200が有するローカルプール263を構成する論理チャンク264の数に上限がある。具体的には、例えば、ローカルプールテーブル228において、一つのローカルプール263についてレコードの数に上限がある。このため、ローカルプールテーブル228の肥大化が抑えられる。
チャンク追加として、第1のチャンク追加が採用されてよい。第1のチャンク追加において、追加される一つ以上の論理チャンク264の少なくとも一つは、相対的に大サイズの論理チャンク264(例えば、通常のサイズよりも大きなサイズの論理チャンク264)である。これにより、制限された論理チャンク数の範囲で、ローカルプール263の容量を大きな容量とすることができ、以って、上述の容量関係を維持することができる。
チャンク追加として、第2のチャンク追加が採用されてよい。第2のチャンク追加において、追加される一つ以上の論理チャンクの少なくとも一つは、上記該当のストレージノード200以外の少なくとも一つのストレージノード200から融通された論理チャンクである。これにより、該当のストレージノード200において論理チャンクや内部容量が不足していても、当該ストレージノード200について上述の容量関係を維持することができる。なお、融通される論理チャンクは、相対的に大サイズの論理チャンクであることが好ましい。制限された論理チャンク数の範囲で、ローカルプール263の容量を大きな容量とすることができるからである。しかし、論理チャンク264を提供する側のストレージノード200内の内部容量又はそれの空き容量が容量不足を意味する条件を満たす程に小さい場合、融通される論理チャンクは、通常サイズの論理チャンクでよい。また、内部容量が不足している場合などは、物理チャンクを融通することでも、当該ストレージノード200について上述の容量関係を維持することができる。
上述したいずれのチャンク追加においても、追加される一つ以上の論理チャンク264の各々は、チャンク追加の実行前に作成済みの論理チャンク264であってもよい。その場合、チャンク追加を迅速に完了することが期待される。
チャンク追加に代えて又は加えて、上述の容量関係を維持するために、ボリューム移行が行われてよい。具体的には、上述の該当のストレージノード200が有するローカルプール263に関連付いている少なくとも一つのボリューム262が、当該ローカルプール263の空き容量よりも大きな空き容量を持つローカルプール263に移行する。これにより、該当のストレージノード200内のローカルプール263の空き容量が増えるため、上述の容量関係を維持することができる。なお、ボリューム移行は、例えばストレージ管理部810により行われる。また、移行元のローカルプール263と移行先のローカルプール263は、同一のストレージノード200内にあってもよいし異なる複数のストレージノード200内にあってもよい。
チャンク追加及びボリューム移行の少なくとも一つに代えて又は加えて、上述の容量関係を維持するために、チャンク結合が行われる。チャンク結合とは、上述の該当のストレージノード200が有するローカルプール263の一部である二つ以上の論理チャンク264に代えて、当該二つ以上の論理チャンク264の各々よりも大サイズであり当該二つ以上の論理チャンク264内のデータを格納した論理チャンク264(つまり、当該二つ以上の論理チャンクを結合した一つの論理チャンク264)を、当該ローカルプール263の構成要素とすることである。これにより、制限された論理チャンク数の範囲で、ローカルプール263の容量を大きな容量とすることができ(データの移行に伴い空きとなった論理チャンクがローカルプール263から解放されれば登録可能チャンク数(論理チャンク数の上限と登録済みの論理チャンク数との差分(残数))が増えて)、以って、上述の容量関係を維持することができる。なお、チャンク結合は、例えばストレージ管理部810により行われる。
チャンク追加、ボリューム移行及びチャンク結合のうちの少なくとも一つが、該当のストレージノード200についての不足条件が満たされた場合に行われる。不足条件とは、ローカルプール263を構成する論理チャンクの数が当該ストレージノード200についての上限(論理チャンク数の上限)に近いとされた条件、言い換えれば、当該ローカルプール263の登録可能チャンク数が不足したと定義された条件である。不足条件が満たされたときにチャンク追加(特に大サイズの論理チャンク264の追加)、ボリューム移行及びチャンク結合の少なくとも一つが行われることで、制限された論理チャンク数の範囲で、上述の容量関係を維持することができる。なお、不足条件が満たされた場合に行われるチャンク追加において追加されるチャンクは、相対的に大サイズの論理チャンク264であることが好ましいが、不足条件が満たされていない間におけるローカルプール263を構成する各論理チャンク264のサイズは通常サイズ(相対的に小サイズ)であることが好ましい。或る論理チャンク264に対応した或る二つの物理チャンク211にI/Oが集中する、或いは、或る論理チャンク264について使用されない領域のサイズが大きいままであるといったことを避けるためである。
第二のチャンク追加及びボリューム移行のうちの少なくとも一つは、不足条件が満たされた場合に限らず、該当のストレージノード200内の内部容量(ローカルプール263の基になる容量)の空き容量が不足しているとされた条件が満たされた場合に行われてよい。このような場合に第二のチャンク追加が行われれば、追加された論理チャンク264に関しては、当該論理チャンク264にデータが書かれても内部容量の空き容量が消費はされないので、ライトエラーが発生する可能性を低減できる。また、このような場合にボリューム移行が行われれば、内部容量の空き容量が増えるので、ライトエラーが発生する可能性を低減できる。
チャンク追加、ボリューム移行及びチャンク結合のうちの少なくとも一つに代えて又は加えて、容量関係を維持するために、チャンク交換が行われる。チャンク交換とは、該当のストレージノード200が有するローカルプール263の一部である一つ以上の論理チャンク264を、当該一つ以上の論理チャンク264の各々よりもそれぞれ大サイズであり当該ストレージノード200以外のいずれかのストレージノード200が有する一つ以上の論理チャンク264と交換することである。これにより、該当のストレージノード200が有するローカルプール263に関し論理チャンク数がその上限に達しても、ローカルプール263の空き容量を増やすことができ、以って、上述の容量関係を維持することができる。なお、チャンク交換は、例えばストレージ管理部810により行われる。
以下、維持方式Bを詳細に説明する。
図15は、チャンク作成プログラム223の処理の一例を示す図である。本プログラム223は、チャンク作成時に、ローカルプール263へ登録できる論理チャンクの数が上限に達する場合、大きなサイズのチャンクを作成することで、論理チャンク数の上限の範囲でローカルプール容量を大きくする。
チャンク作成プログラム223は、チャンク作成指示を受領し(S400)、ローカルプールの登録可能チャンク数に関する「不足」があるか否かをチェックする(S401)。
S400については、管理ノード300がチャンク作成指示を送信してもよいし、図示していないがストレージノード200への記憶デバイス増設プログラムがチャンク作成指示を送信してもよいし、ストレージノード200が記憶デバイス210の増設や既設記憶デバイス210のチャンク未作成領域を検出したプログラムがチャンク作成指示を送信してもよい。また、論理チャンク264を作成するためノード番号(マスタ)とノード番号(ミラー)が指示元からパラメタとして渡される。
S401については、「不足」は、ローカルプール263の登録可能チャンク数が一定数以下、又は、論理チャンク数上限に対する登録可能チャンク数の比率が所定比率以下であること、と定義されてもよい。また、「不足」は、ローカルプール263の空き容量が一定以下であることと定義されてもよい。また、「不足」は、ローカルプール263に関する作成済みボリュームの合計容量が一定上であり、通常の論理チャンクサイズでは容量が不足であると定義されてもよい。例えば、論理チャンクサイズ1GBであり、1000個の論理チャンク264が登録できる場合、1000GB(=1GB×1000)がローカルプール263の容量となる。既に、当該ローカルプール263に関して合計1500GBの1以上のボリュームが作成されている場合、不足があると判断できる。上述の定義以外の定義が「不足」でもよい。
上記「不足」がある場合(S401:Yes)、チャンク作成プログラム223は、通常サイズより大サイズの物理チャンクを、マスタノード(パラメタとして指定されたノード番号(マスタ)のストレージノード)とミラーノード(パラメタとして指定されたノード番号(ミラー)のストレージノード)の各々から作成する(S402)。結果、マスタの物理チャンクとミラーの物理チャンクが作成される。
一方、上記「不足」がない場合(S401:No)、チャンク作成プログラム223は、通常サイズの物理チャンクを、マスタノード及びミラーノードの各々から作成する(S403)。
ステップS402又はS403で作成されたマスタの物理チャンクとミラーの物理チャンクに関する情報は、作成される論理チャンクに対応したレコード(論理チャンクテーブル232における新しいレコード)に登録される。
通常サイズは固定でもよいが、通常サイズより大きいサイズは固定であってもなくてもよい。後者の場合、例えば、必要なチャンクサイズが計算され、計算されたチャンクサイズが大サイズとされてもよい。具体的には、例えば、1GBのチャンクが900個作成済み、残りの作成可能チャンク数が100個、作成済みボリューム容量が1500GBの状態を考える。その場合、残り100個のチャンクで少なくとも600GBの容量を作成する必要があるため、チャンクサイズを6GBとする。なお、利用者や上位システムからチャンクサイズを受け付けるインタフェースをストレージ管理部810(例えばノード200又は300)が提供してもよい。当該インタフェースを介して、通常サイズと大サイズの両方のチャンクサイズが受け付けられてもよいし、大サイズのみが受け付けられてもよい。チャンクサイズの受け付けに関しては、図15に例示のチャンク作成に限定されず、他の処理に関しても適用されてもよい。
S402又はS403に続き、チャンク作成プログラム223は、ペア相手ノードの物理チャンク作成済みを確認する(S404)。ペア相手とは、ノード番号(マスタ)で識別されるストレージノードの場合、ノード番号(ミラー)で識別されるストレージノードのことである。
物理チャンク作成及びその確認後、チャンク作成プログラム223は、マスタの物理チャンクとミラーの物理チャンクが関連付けられた論理チャンク264を作成する(S405)。論理チャンク264の作成では、論理チャンクテーブル232に、当該論理チャンク264に対応した新しいレコードが登録される。
最後に、チャンク作成プログラム223は、ローカルプールテーブル228へ、作成された論理チャンク264に関する情報を登録し(S406)、処理を終了する(S407)。ローカルプールテーブル228への論理チャンク登録は、ローカルプールテーブル228への論理チャンク番号604、ページ番号605、ページ割当状況606、割当先ボリューム番号607の追加と、容量602の更新とを含む。
図15に示した処理に、下記のうちの少なくとも一つが採用されてよい。
・物理チャンク211の作成と、論理チャンク264の作成が、別々の契機で行われる。
・論理チャンク264の作成と、論理チャンク264のローカルプール263への登録とが、別々の契機で行われる。例えば、ローカルプール263の空き容量が不足に近づいたときローカルプール263へ論理チャンク264が登録されてもよい。その様にすることで、他のストレージノード200へ論理チャンクや物理チャンクを融通する時に、格納されているデータを他の論理チャンクや物理チャンクへ移動する必要がない。融通の迅速性を向上することができる。
上記の様にすることで、図9を例に取れば、ケース(1)やケース(2)に関して、100TB以上の容量のローカルプール263を作成可能となり、ライトエラーの発生を回避できる。
図15の例によれば、大サイズの物理チャンクが作成され、作成された大サイズの物理チャンクが関連付けられた論理チャンクが作成され、結果として、作成された論理チャンクは大サイズの論理チャンクであるが、大サイズの論理チャンクを作成する方法として、別の方法、例えば、通常サイズの複数の物理チャンクが関連付けられた大サイズの論理チャンクを作成する方法もある。具体的には、図5に示した論理チャンクテーブル232の一つの論理チャンク番号に1以上のノード番号(マスタ)、複数の物理チャンク番号(マスタ)、1以上のノード番号(ミラー)、物理チャンク番号(マスタ)と同数の物理チャンク番号(ミラー)を対応付ける。例えば、論理チャンク0に、マスタの物理チャンクとして、ノード0の物理チャンク0と物理チャンク1を関連付ける。これにより論理チャンクを修正することなくサイズ200GBの論理チャンク(通常サイズより大サイズの論理チャンクの一例)を作成することができる。当該別の方法が採用される場合、図15のステップS602で、通常サイズの物理チャンクが作成され、ステップS605で、一つの論理チャンク番号に対応付けられる複数の物理チャンクに関する情報が論理チャンクテーブル232に格納されてよい。
図16は、不足モニタリングプログラム(1)236の処理の一例を示す図である。本プログラム236は、各ローカルプール263の登録可能チャンク数をモニタし、登録可能チャンク数が不足している場合にボリュームを別のノード200に移行することでチャンク数不足を解消する。
不足モニタリングプログラム(1)236は、各ノード200のローカルプール263の容量、使用済み容量、登録済みチャンク数、ボリューム合計容量及び内部容量といった情報を収集し(S600)、収集した情報をローカル履歴テーブル239に格納する(S601)。
次に、不足モニタリングプログラム(1)236は、登録可能チャンク数が不足しているローカルプール263(例えば、登録可能な論理チャンク数の上限に対する登録済みチャンク数の割合が一定値を超えているローカルプール263)の有無をチェックする(S602)。登録可能チャンク数が不足しているローカルプール263が存在しない場合(S602:No)、不足モニタリングプログラム(1)236は、内部容量が不足しているローカルプール263(例えば、内部容量に対するそれの空き容量の割合が一定値未満のローカルプール263)が存在しているか否かをチェックする(S603)。内部容量が不足しているローカルプール263が存在しない場合(S603:No)、不足モニタリングプログラム(1)236は処理を終了する(S607)。
一方、S602:Yes又はS603:Yesの場合、不足モニタリングプログラム(1)236は、容量に空きがあるローカルプール263(例えば、容量に対する使用済み容量が一定値未満のローカルプール263)が存在するか否かをチェックする(S604)。ステップS602またはS603で特定したローカルプール263から移動される容量が追加されても、容量に空きがあるローカルプール263を検出する。この様にすることで、ボリュームのボリューム移行の頻発を回避できる。
容量に空きがあるローカルプール263が存在する場合(S604:Yes)、不足モニタリングプログラム(1)236は、移行元ローカルプール236(登録可能チャンク数、又は、内部容量が不足しているローカルプール263)から移行先ローカルプール236(容量に空きがあるローカルプール263)にボリュームを移行することの指示であるボリューム移行指示を送信する(S605)。当該指示の送信先は、移行元ローカルプール236と移行先ローカルプール236の少なくとも一つを有する一つ以上のストレージノード200の各々でよい。当該指示に応答して、移行元ローカルプール236から移行先ローカルプール236にボリュームが移行する。移行対象のボリュームの番号が、当該指示のパラメタとして指定されてよい。移行対象のボリュームは、移行元ローカルプール236に関して不足の度合に応じて決定されてよい。
一方で、容量に空きがあるローカルプールが存在しない場合(S604:No)、不足モニタリングプログラム(1)236は、アラートを例えば管理者又は利用者に報告する(S606)。アラートは、容量枯渇の通知としてのアラートでもよいし、記憶デバイスの追加やボリュームの削除を促すためのアラートでもよい。
最後に、不足モニタリングプログラム(1)236は処理を終了する(S607)。
ボリューム移行では、移行元から移行先に移行対象ボリューム内のデータが移行する。ボリューム移行のための機能として、Non-Disruptive Volume Migrationなどの機能が知られており、この様な機能を使用することができる。
上記の様にすることで、図9を例に取れば、ケース(2)やケース(4)に関して、ストレージノード0の使用済み容量を、ストレージノード1に移動することで、ストレージノード0に空き容量を作ることができる。
図17は、不足モニタリングプログラム(2)237、チャンク貸出プログラム224、及びチャンク受取プログラム225の処理の一例を示す図である。これらプログラムは、各ローカルプール263の登録可能チャンク数をモニタし、登録可能チャンク数が不足している場合に他のノードにある大サイズ(又は通常サイズ)の論理チャンクを融通することで容量不足を解消する。
不足モニタリングプログラム(2)237は、図16のステップS600からS603と同様の処理を実行する(S700)。ステップS602又はステップS603の結果のいずれかがYesの場合、ステップS701からS709が実行される。
不足モニタリングプログラム(2)237は、大サイズの論理チャンクを持つノード200を特定し(S701)、当該ノード200に、当該大サイズの論理チャンクの貸し出し指示を送信する(S702)。
論理チャンクの貸し出し指示を受領したストレージノード200のチャンク貸出プログラム224は、論理チャンクを貸し出し、完了を報告する(S703)。最後に、チャンク貸出プログラム224は処理を終了する(S704)。論理チャンクの貸し出しでは、論理チャンクテーブル232に、論理チャンクが貸し出したことが記録される。具体的には、例えば、論理チャンクテーブル232に、貸し出された論理チャンクに対応するレコードに、貸出先ストレージノード番号が格納されるものとする。ステップS703では、貸し出した論理チャンクに関して、論理チャンクテーブル232に格納されている情報が、指示元である管理ノード300に渡される。貸出先ストレージノード200は、S700において、不足ノード200(ステップS602又はステップS603の結果のいずれかがYesに該当するノード200)である。貸し出し指示で、当該不足ノード200に関する情報(例えばノード番号)がパラメタとして指定されていてよい。
チャンク貸出プログラム224から報告を受領した不足モニタリングプログラム(2)237は、不足ノード200にチャンク割り当て指示を送信する(S705)。この指示では、貸し出された論理チャンクに関する情報(貸し出し元のノード200における論理チャンクテーブル232に格納されている情報)がパラメタとして指定される。
チャンク割り当て指示を受領した不足ノード200のチャンク受取プログラム225は、貸し出された論理チャンクに関する情報を、不足ノード200における論理チャンクテーブル232に登録し、完了を報告する(S706)。S706では、チャンク受取プログラム225は、空いている論理チャンク番号を確保し、当該論理チャンク番号により識別されるレコードに、パラメタとして渡された情報(ノード番号(マスタ)、物理チャンク番号(マスタ)、ノード番号(ミラー)、物理チャンク番号(ミラー)、サイズ、割当先ストレージ制御部番号)を論理チャンクテーブル232に格納する。
最後に、チャンク受取プログラム225は、ローカルプール263へ、貸し出された論理チャンク264を登録し(S707)、処理を終了する(S708)。S707では、S706で論理チャンクテーブル232に登録された論理チャンクに関する情報が不足ノード200におけるローカルプールテーブル228に登録される。
チャンク受取プログラム225から報告を受領した不足モニタリングプログラム(2)237は、処理を終了する(S709)。
図17の例では、論理チャンク264を貸し出す処理を説明したが、物理チャンク211が貸し出されてもよい。その場合、物理チャンク211を受け取る不足ノード200は複数の貸し出された物理チャンク211を用いて論理チャンク264を作成する。物理チャンク211の貸し出しに伴い論理チャンクが不足ノード200に追加されることも、広義には、論理チャンク264の貸し出しに含まれてよい。
図17の例では、貸し出した論理チャンクの管理方法、受け取った論理チャンクの管理方法は一例であり、説明した方法以外の管理方法が採用されてもよい。
上記の様にすることで、図9を例に取れば、ケース(3)やケース(4)に関して、50TB以上のローカルプールを作成可能となり、ライトエラーの発生を回避できる。
不足モニタリングプログラム(1)236や不足モニタリングプログラム(2)237の結果、登録可能チャンク数が不足するローカルプール263が存在する場合、以降作成するチャンクのサイズが変更されてもよい。このため、管理ノード300は、今後作成するチャンクサイズを管理してもよい。新しいノード200をストレージシステム160に追加した場合や、ストレージノード200に新しい記憶デバイス210を追加した場合に、管理ノード300が管理しているチャンクサイズをチャンク作成プログラム223に通知してもよい。
また、貸し出される(融通される)チャンクのサイズは、大サイズに代えて、通常サイズでもよい。例えば、不足ノード200以外のいずれのノード200についても、内部容量の空き容量が不足している場合、不足ノード200以外のいずれかのノード200から貸し出されるチャンク(論理チャンク264又は物理チャンク211)のサイズは通常サイズでよい。
図18は、チャンク交換プログラム226の処理の一例である。本プログラム226は、ローカルプール263に登録済みの論理チャンスの数がその上限に達している場合(ローカルプールテーブル228に論理チャンクのレコードを追加できない場合)、登録済みの論理チャンクを減らし、別の大サイズの論理チャンクを登録することで、ローカルプール263の容量を増やす。本プログラム226は、例えば、図15のステップS406や図17のS707の代わりに実行される。
チャンク交換プログラム226は、ローカルプール263に論理チャンク264を追加可能か否かを判断する(S800)。この判断は、ローカルプールテーブル228に登録可能なレコード数がN個(Nは0以上の整数)であるか否かの判断でよい。この判断以外の判断が採用されてもよい。
ローカルプール263に論理チャンク264を追加可能な場合(S800:Yes)、チャンク交換プログラム226は、追加予定の論理チャンク264をローカルプール263に追加し(S803)、処理を終了する(S804)。
一方、ローカルプール263に論理チャンク264を追加不能な場合(S800:No)、チャンク交換プログラム226は、追加予定の論理チャンク264より小さい登録済みの論理チャンク264があるか否かを判断する(S801)。追加予定の論理チャンク264のサイズと、ローカルプール263に登録済みの各論理チャンク264のサイズは、論理チャンクテーブル232から特定される。
追加予定の論理チャンクより小さい登録済みの論理チャンク264がない場合(S801:No)、チャンク交換プログラム226は処理を終了する(S804)。
追加予定の論理チャンクより小さい登録済みの論理チャンクがある場合(S801:Yes)、チャンク交換プログラム226は、当該論理チャンクをローカルプール263から減設する(S802)。S802では、チャンク交換プログラム226は、当該論理チャンク264に格納されているデータを他の論理チャンク264へ移動する。具体的には、チャンク交換プログラム226は、ローカルプールテーブル228を基に、当該論理チャンク264のうちの割当済みページを特定する。チャンク交換プログラム226は、当該特定されたページに格納されているデータを、他の論理チャンク内のページにコピーする。チャンク交換プログラム226は、ボリュームテーブル229に格納するページ情報、移行元ページのページ割当状況606、及び、移行先ページのページ割当状況606を更新する。データのコピー量を少なくするため、減設対象の論理チャンクとして、割当済みページの数が最も少ない論理チャンクが選択されてもよい。
最後に、チャンク交換プログラム226は、追加予定の論理チャンクをローカルプールに追加し(S803)、処理を終了する(S804)。
上記の様にすることで、図9を例に取れば、ケース(1)やケース(2)に関して、100TB以上のローカルプールを作成可能となり、ライトエラーの発生を回避できる。
図19は、チャンク結合プログラム227の処理の一例である。本プログラム227は、ローカルプール263の登録済みチャンク数がその上限に達する場合、複数の論理チャンク264を結合することで一つの新しい論理チャンク264を作成し当該一つの論理チャンク264をローカルプール263へ登録する。
チャンク結合プログラム227は、ローカルプール263の登録可能チャンク数が不足しているか否かをチェックする(S900)。ローカルプール263の登録可能チャンク数が不足していない場合(S900:No)、チャンク結合プログラム227は処理を終了する(S909)。
ローカルプール263の登録可能チャンク数が不足している場合(S900:Yes)、チャンク結合プログラム227は、ローカルプール263から減設する複数の論理チャンク264を選択し(S901)、選択した複数の論理チャンク264をローカルプール263から減設する(S902)。後に行われる物理チャンク結合を容易にするため、物理チャンク211が連続する複数の論理チャンク264が選択されてもよい。減設処理は、図18のS802と同じである。
次に、チャンク結合プログラム227は、当該複数の論理チャンク264に関連付いた複数の物理チャンク211を有する複数のストレージノード200へチャンク結合指示を送信する(S903)。論理チャンクテーブル232を参照することで、チャンク結合指示の送信先となるストレージノード200(すなわち、減設対象として選択された複数の論理チャンク264に関連付いている複数の物理チャンク211を有する複数のストレージノード200の各々)を特定できる。通知を受領したストレージノード200は、ステップS904とS905を実行し、物理チャンク211を結合する。図19の例は、通知を出したストレージノード200も、減設対象の論理チャンク264の少なくとも一つに関連付いた物理チャンク211を有しているため、ステップS904とS905を実行する。
チャンク結合プログラム227は、論理チャンク264を削除し(S904)、物理チャンク211を結合する(S905)。論理チャンク264の削除は、論理チャンクテーブル232から減設対象の各論理チャンクのレコードを削除することである。記憶デバイス210上のアドレスが連続する複数の物理チャンクの場合、先頭の物理チャンクのサイズ404(図4参照)を更新し、後続の物理チャンクの情報を削除することで容易に物理チャンクを結合することができる。例えば、図4の例で、物理チャンク0及び1を結合する場合、チャンク結合プログラム227は、物理チャンク0のレコードのサイズ404を“200”に更新し、物理チャンク1のレコードを物理チャンクテーブル231から削除する。連続しない複数の物理チャンクも結合することができる。例えば、チャンク結合プログラム227は、異なる物理チャンク211の各々に同一の物理チャンク番号を付与する(つまり物理チャンク番号を共通とする)ことで結合できる。関連する物理チャンクであることを示すためにレコード間を関連付けるポインタ情報が物理チャンクテーブル231に格納されてもよい。例えば、図4の例で、チャンク結合プログラム227は、物理チャンク0及び3を結合する場合、物理チャンク3の物理チャンク番号を物理チャンク番号“0”に修正する。物理チャンクにアクセスするときは、チャンク内のオフセットを用いて、物理チャンクテーブル231のどのレコードであるかを特定できる。これ以外の方法で結合することも考えられる。
チャンク結合プログラム227は、各ストレージノード200の物理チャンク結合の完了を確認し(S906)、結合した物理チャンクを用いて論理チャンクを作成する(S907)。この処理は、論理チャンクテーブル232に、結合した物理チャンクの情報を含むレコードを登録することで実現される。S907で、複数の結合された物理チャンクが関連付けられた一つの論理チャンク264が生成される。
最後に、チャンク結合プログラム227は、作成した論理チャンク264をローカルプール263へ登録し(S908)、処理を終了する(S909)。作成した論理チャンク264のローカルプール263への登録は、ローカルプールテーブル228に論理チャンク番号604、ページ番号605、ページ割当状況606、及び割当先ボリューム番号607を格納することで実現される。
上記の様にすることで、図9を例に取れば、ケース(1)やケース(2)に関して、100TB以上のローカルプールを作成可能となり、ライトエラーの発生を回避できる。
図15と同様に、大サイズの物理チャンクを作成するのではなく大サイズの論理チャンクを作成することでも同様の効果を得ることができる。ステップS905において、チャンク結合プログラム227は、一つの論理チャンク番号に対して複数の物理チャンクを対応付ける情報を論理チャンクテーブル232に格納する。
維持方式Aおよび維持方式Bを併用することができる。
図9のケース(2)やケース(4)において、維持方式Aは、作成可能なボリュームの最大容量を50TB(ケース(2)の場合)または25TB(ケース(4)の場合)に制限する。維持方式Bで示した容量の融通やボリューム移行を用いることで、作成可能なボリュームの最大容量を、100TB(ケース(2)の場合)または50TB(ケース(4)の場合)に増やすことができる。作成可能なボリュームの最大容量の増加を指示するAPI、CLIやGUIを設けることができる。当該指示を受領し容量の融通やボリューム移行などの維持方式Bが実行される。作成可能なボリュームの最大容量がどの容量まで増やせるかをGUIやCLIで提供してもよい。
図9を参照して説明した比較例によれば、グローバルプール28としては空き容量があるがローカルプール23の空きが不足し、故に、ライト不可が発生し得る。各ローカルプール263の容量が小さい時にグローバルプール280の容量も小さく見せることができれば、ライト不可の発生頻度を下げることができる。なぜならば、グローバルプール280の容量が小さい場合、ドライブ追加といった対策を促すことができるためである。これは、ドライブ追加によりローカルプール263の空き容量が増加するため、維持方式Bの一種である。
各ローカルプール263の容量が小さい時にグローバルプール280の容量も小さく見せるために、各ローカルプール263の使用率(ローカルプール263の使用済み容量÷ローカルプール263の総容量)を平準化することが考えられる。平準化により、各ローカルプール263の使用率とグローバルプール280の使用率の乖離が小さくなる。ローカルプール263の使用率が小さいとき、ユーザが参照するグローバルプール280の使用率も小さくなる。
ボリューム作成ノード選択により各ローカルプール263の使用率を平準化できる。図21は、ボリューム作成ノード決定プログラム(2)に処理の一例を示す。
ボリューム作成ノード決定プログラム(2)は、各ローカルプール263の使用率を取得し(S1000)、取得された各使用率と、作成されるボリュームの容量とに基づき、ボリューム作成後の使用率の変動を計算する(S1001)。次に、ボリューム作成ノード決定プログラム(2)は、各ローカルプール263の使用率のバラツキが最も小さくなるローカルプール263を選択し(S1002)、選択したローカルプール263でのボリューム作成を指示する(S1003)。選択されたローカルプール263は、例えば、ローカルプール263毎に当該ローカルプール263からボリュームが作成されたと仮定した場合に得られるバラツキ(使用率のバラツキ)が、最も小さいローカルプール263である。最後に、ボリューム作成ノード決定プログラム(2)は、ボリューム作成完了報告を受領し(S1004)、処理を終了する(S1005)。この処理は、ローカルプール263の容量が異なるため、最も使用済み容量の小さいローカルプール263や最も空き容量の大きいローカルプール263にボリュームを作成する単純な方法とは異なる。
ステップS1001の計算について、作成するボリュームの容量と同じ容量がローカルプール263から消費されることを想定してもよい(以下の説明では、ローカルプール263の容量を適宜「物理容量」と言うことがある)。また、実際にボリュームサイズに対して書き込みが発生する領域の比率を考慮してローカルプール263から消費される物理容量を計算してもよい。書き込みが発生する領域の比率は、ノード群165の使用実績から計算された比率でもよいし、一般的に知られている比率でもよい。また、ローカルプール263の現在の使用済み容量に、作成するボリュームによりローカルプール263から消費される物理容量を加算することで、ボリューム作成後のローカルプー263ルの使用率を計算することができる。
例えば、ボリューム容量の50%の物理容量が消費されていることがノード群165の使用実績から判断されたと仮定する。100GBのボリュームを作成する場合、100GBの50%である50GBの物理容量の消費が予測される。ローカルプール容量が1000GBで既に500GB使用済みの場合、当該ボリュームの作成により使用済み容量が550GBとなり、使用率は55%となることが予測できる。消費される物理容量は、サーバからの書き込みだけでなく、データの圧縮や重複排除の効果を考慮して計算されてもよい。
ローカルプール263に作成直後のボリュームが多数存在する場合、ローカルプール263の現在の使用済み容量は大きく伸びる可能性がある。その場合、ボリューム作成後の使用率を正しく計算することは難しい。
例えば、ローカルプール容量が1000GBで既に500GB使用済みの状況を想定する。作成済みの100GBのボリュームで、消費される物理容量が10GBのボリュームがある場合、当該ボリュームは、今後40GBの物理容量を消費する可能性が高い。
これを避けるため、各ローカルプール263について、想定消費物理容量が管理されてもよい。ボリューム作成時、当該ボリュームについて想定される消費物理容量が、当該ボリュームが作成されるローカルプール263の想定消費物理容量に加算される。各ローカルプール263についての想定消費物理容量を、ステップS1001の計算において使用することができる。
ドライブ追加の様な対策を促す変形例として、最も使用率の高いローカルプール263の容量をグローバルプール280の容量としてユーザに提供することが採用されてもよい。また、グローバルプール280の使用率に加えて、最も使用率の高いローカルプール263の使用率もユーザに提供されてもよい。これらの使用率の提供と、上述したボリューム作成ノードの選択との両方が採用されてもよい。ロールプール263の使用率は、ローカルプールの空き容量率であってもよい。その場合、最も使用率の高いローカルプールは263の代わりに、最も空き容量率の小さいローカルプール263の空き容量率をユーザに提供することができる。なお、各ローカルプール263について、使用率は、ローカルプール263の容量に対する使用済み容量の割合でよく、空き容量率は、1から使用率を引いた値、言い換えれば、ローカルプール263の容量に対する空き容量の割合でよい。
維持方式として、チャンクの容量融通およびボリューム移行について述べた。ローカルプール263から作成した複数のボリューム262を統合し、結合したボリューム(以下、「結合ボリューム」と呼ぶ)をホストに提供する構成を考える。この構成において、結合前のボリューム262をストレージノード間で融通や移行する方式が考えられる。例えば、三つの100GBのボリューム262を結合することで300GBの結合ボリュームが作成される。ホスト100は、300GBの結合ボリュームを認識し、以後、当該結合ボリュームにアクセスすることができる。結合ボリュームを構成する二つ以上のボリュームは、一つのノード200にあってもよいし二つ以上のノード200にあってもよい。
ボリューム移行に対する利点を述べる。前述したボリューム移行の場合、ボリューム容量が一定でないため移行できないケースがある。例えば、500GBのボリューム262を移行するとき、あるストレージノード200に200GBの空き容量があり、別のストレージノード200に300GBの空き容量があっても、ボリューム262を移行することができない。これに対して、200GBのボリュームと300GBのボリュームとで構成された500GBの結合ボリュームがあれば、500GBのボリューム262を移行することができる。更に、結合ボリュームを構成するボリューム262が固定サイズ、または、サイズが小さい場合など、空き容量があるストレージノード200への移行は更に容易になる。
容量融通に対する利点を述べる。物理チャンクや論理チャンクを融通する場合、融通されたチャンクは、複数のページに分割され複数のボリュームに割り当てられる。すなわち、一つのチャンクには複数のボリューム262のデータが格納される。ボリューム262の削除などによりストレージノード200の空き容量が増加しても、融通された容量は他のボリュームのデータを格納している。このため、融通したチャンクを戻すことが難しい。戻すとは融通の解除のことである。当該チャンクからデータを追い出すなどの処理が発生してしまう。これに対して、結合ボリュームが削除された場合、当該結合ボリュームを構成するボリューム262が他のストレージノード200の容量であった場合、削除に伴い返却することが容易にできる。
図22は、結合ボリュームテーブル246の一例を示す図である。
結合ボリュームテーブル246は、結合ボリュームに関する情報の一例である。結合ボリュームテーブル246は、結合ボリュームの構成要素としてのボリューム毎にレコードを有する。各レコードは、結合ボリューム番号2201、結合ボリューム容量2202、ノード番号2203、ボリューム番号2204及びボリューム容量2205といった情報を格納する。以下、一つのボリュームを例に取る(図22の説明において「対象ボリューム」)。
結合ボリューム番号2201は、対象ボリュームを構成要素として有する結合ボリュームを識別するための番号(ストレージシステム160内でユニークな番号)を示す。結合ボリューム番号2201は、結合ボリュームそれ自体の番号とその他の情報(例えばノード番号)を含むことで、ストレージシステム160内でユニークな番号とされてもよい。結合ボリューム容量2202は、対象ボリュームを構成要素として有する結合ボリュームの容量を示す。ノード番号2203は、対象ボリュームを有するノード200の番号を示す。ボリューム番号2204は、対象ボリュームの番号を示す。ボリューム容量は、対象ボリュームの容量を示す。ストレージノード200が複数のローカルプール263を有する場合に備えて、各レコードがローカルプール番号を格納してもよい。
図22の例では、結合ボリューム0は、ノード00内のボリューム0と、ノード01内のボリューム1およびボリューム2とから構成されている。各ボリュームの容量が100GBであり、故に、結合ボリュームの容量は300GBである。
図23は、ライトプログラム245の一例を示す図である。
結合ボリュームを構成するボリューム262が他のストレージノード200に配置されている場合、ボリューム262を有するストレージノード200へライト要求を転送する。また、結合ボリュームを構成するボリューム262が他のストレージノード200に移行中であった場合、コピー状態に合わせたライト処理を実行する。ライトプログラム245は、結合ボリュームへのライト要求を受領し(S1100)、書き込み対象ボリューム262が自ノードにあるか否かを判断する(S1101)。ステップS1101では、ライトプログラム245は、ライト要求のライトアドレスが、結合ボリュームを構成するどのボリューム262のどのアドレスに対応するかを計算する。そして、ライトプログラム245は、書き込み対象となるボリューム262を有するストレージノード200を特定する。これらの処理は結合ボリュームテーブル246を参照することで実現される。
書き込み対象ボリューム262が自ノードに無い場合(S1101:No)、ライトプログラム245は、ボリューム262を有する他のストレージノード200へライト要求を転送し(S1102)、当該ライト要求の結果を受領しホスト100へ報告する(S1107)。
書き込み対象ボリューム262が自ノードにある場合(S1101:Yes)、ライトプログラム245は、書き込み対象ボリューム262が移行コピー中であるか否かを判断する(S1103)。移行コピー中でない場合(S1103:No)、ライトプログラム245は、ライト対象ボリューム262へライト処理を実行し(S1104)、ホスト100へ結果を報告する(S1107)。一方、移行コピー中であった場合(S1103:Yes)、ライトプログラム245は、ライト対象アドレスがコピーポインタ(現在コピーが完了しているアドレスを示すポインタ)以下か否かを判断する(S1105)。コピーポインタは、移行コピーが進むほどに大きい。
ライト対象アドレスがコピーポインタより大きい場合(S1105:No)、ライトプログラム245は、ライト対象ボリューム262へのライト処理を実行する(S1104)。ライト対象アドレスがコピーポインタ以下の場合(S1105:No)、ライトプログラム245はコピー元およびコピー先の両方にライト処理を実行する。これは、コピー処理が終わっているため、コピー元、およびコピー先を同一とするためである。最後に、ライトプログラム245は、ホスト100に結果を報告する(S1107)。
コピー処理は、結合ボリュームを構成するボリューム262を他のストレージノード200へ移行する処理である。コピー処理により、ストレージノード200の空き容量を増やすことができる。図16で述べたボリューム移行は、ホストが認識するボリューム262を移行したが、ここで述べる移行は結合ボリュームを構成するボリューム262を移行する。
コピー処理の処理内容について説明する。コピー処理は、容量の不足を検出するプログラム、例えば、不足モニタリングプログラム(1)236または不足モニタリングプログラム(2)から起動される。この時、移行元(コピー元)となるボリューム262の番号と、移行先(コピー先)とされるストレージノードの番号と、移行先とされるローカルプールの番号とが指定されるものとする。最初に、移行先のストレージノード200における移行先のローカルプールに移行先ボリューム262が作成される。コピー処理を起動するプログラムが移行先ボリュームを作成してもよい。コピー処理では、コピーポインタが終端アドレスを指すまで、コピーポインタが指すアドレスが属する領域について移行元ボリュームからデータをリードしリードしたデータを移行先ボリュームへライトすることと、それに伴いコピーポインタを進めることが繰り返される。コピーポインタが指すアドレスが属する領域は、例えば、1MBなどのコピーの処理単位のことである。ボリューム全体のコピーが終了した後、結合ボリュームテーブル246が更新される。具体的には、ノード番号2203及びボリューム番号2204が、移行先ボリュームのノード番号及びボリューム番号に更新される。
リード処理は、リード対象となるボリュームが自ストレージノード200の場合は、自ストレージノード200のボリューム262に対してリード処理を実行する。また、リード対象となるボリューム262が他ストレージノード200の場合は、他ストレージノード200へリード要求を転送することで実現される。図23のステップS1100、S1101、S1102、S1104、S1107に相当する処理ステップから構成される。なお、ステップ内の“ライト”を“リード”と読み替える。
利用者に提供する容量情報として、例えば、下記のうちの一つ以上の情報要素を含んだ情報、
・グローバルプール容量(ローカルプール容量の合計)、
・仕様上のグローバルプール容量(仕様上の最大ローカルプール容量とローカルプール数との積)、
・グローバルプールの使用済み容量、
・グローバルプールの空き容量、
・作成可能なボリュームの最大容量(ローカルプール容量からローカルプールの使用済み容量を引いた容量に基づき計算された容量)、
・作成可能なボリュームの最大容量(仕様上の最大ローカルプール容量からローカルプールの使用済み容量を引いた容量に基づき計算された容量)、
・作成可能なボリュームの最大容量の拡張可能容量、
・各ローカルプールの使用率のうち最大の使用率、
・各ローカルプールの空き容量率のうち最小の空き容量率、
がある。「作成可能なボリュームの最大容量の拡張可能容量」とは、ボリューム移行や容量の融通により、作成可能なボリュームの最大容量に加算可能な容量である。これらの情報要素を含んだ容量情報は、API、CLIおよびGUI等のインターフェース経由で利用者に提供することができる。ローカルプールの空き容量は、ローカルプール容量からローカルプール使用済み容量を引いた容量、又は、仕様上の最大ローカルプール容量からローカルプール使用済み容量を引いた容量に基づく。
作成可能なボリュームの最大容量は、プロセッサ資源の利用率を向上するために利用することができる。例えば、100GBの容量を持つストレージノード200が3台あると仮定する。この時、図17や図22で述べた容量の融通や結合ボリュームを用いることで、一つのストレージノードが200GBのボリューム262を作成し、ホスト100に提供することができる。しかし、ホスト100のI/O発行先(I/O要求の発行先)となるストレージノードはボリューム262を提供するストレージノード200のみとなり、他のストレージノード200のプロセッサ資源を有効活用できない。作成可能なボリュームの最大容量として100GBを利用者に提供することにより、100GBのボリューム262を3つ作成し、各ストレージノード200に配置することが可能となる。その場合、ホスト100のI/O発行先は全ストレージノード200となり、プロセッサ資源の利用率を上げることができる。
本発明の実施例を適用するか否かをシステム単位などに設定させてもよい。その実現のため、設定するためのインタフェースを設ける。本発明の実施例を適用することが設定されている場合、本実施例に係るボリューム作成処理やボリューム容量取得プログラムなどが行われる。システム単位でなくグローバルプール単位、ローカルプール単位などその他の単位が設定単位とされてもよい。これにより、利用者が、大サイズボリューム(ストレージシステム160から回答された容量を超えた容量のボリューム)の作成の抑止、又は、ライトエラーの発生のどちらかを選択することができる。維持方式Bに関し、大サイズチャンクの作成を実施するか否かを設定するためのインタフェースが設けられてもよい。
Thin ProvisioningボリュームとThick Provisioningボリュームで動作が変えられてもよい。Thin Provisioningボリュームが使われる場合、将来的なデータ量の予測が難しい場合など、Thin Provisioningを用いて大サイズのボリュームを作成したい場合がある。その場合、維持方式Aのように作成可能容量の制約を許容できない場合がある。このため、Thick Provisioningボリュームを作成する場合のみ維持方式Aを採用することが考えられる。Thick ProvisioningにはThin ProvisioningのFull Allocation指定も含めてもよい。Thin ProvisioningとThick Provisioningの動作をユーザが指定するインタフェースを設けてもよい。
以上、本発明の一実施例を説明したが、本発明は、この実施例に限定されるものでなく、その要旨を逸脱しない範囲で種々変更可能であることはいうまでもない。