(57)【要約】【課題】上位装置からのＩ／Ｏ要求を処理するストレージ制御装置を効率的に決定すること。【解決手段】ストレージ制御装置１０１は、上位装置１０３からＩ／Ｏ要求を受け付ける。ストレージ制御装置１０１は、受け付けたＩ／Ｏ要求に含まれる論理アドレスと、ボリューム１１０の分割ブロックサイズ当たりの論理ブロック数と、ストレージ制御装置１０１−１〜１０１−ｎの装置数ｎとに基づいて、ストレージ制御装置１０１−１〜１０１−ｎからＩ／Ｏ要求を処理する担当装置を決定する。【選択図】図１
2018205936.tif 000002
【特許請求の範囲】
【請求項１】
ボリューム内の論理ブロックを指定する論理アドレスを含むＩ／Ｏ（Ｉｎｐｕｔ／Ｏｕｔｐｕｔ）要求を上位装置から受け付け、
受け付けた前記Ｉ／Ｏ要求に含まれる前記論理アドレスと、前記ボリュームを区切る分割ブロックサイズ当たりの論理ブロック数と、前記ボリュームに割り当てる物理記憶領域を有するストレージにアクセス可能な複数のストレージ制御装置の装置数とに基づいて、前記複数のストレージ制御装置から前記Ｉ／Ｏ要求を処理するストレージ制御装置を決定する、
制御部を有することを特徴とするストレージ制御装置。
【請求項２】
前記制御部は、
前記論理アドレスと、前記論理ブロック数と、前記ボリュームを識別するボリューム番号と、前記装置数とに基づいて、前記複数のストレージ制御装置から前記Ｉ／Ｏ要求を処理するストレージ制御装置を決定する、ことを特徴とする請求項１に記載のストレージ制御装置。
【請求項３】
前記論理アドレスは、ＬＢＡ（Ｌｏｇｉｃａｌ  Ｂｌｏｃｋ  Ａｄｄｒｅｓｓ）によって指定され、
前記制御部は、
前記Ｉ／Ｏ要求に含まれる前記ボリュームのＬＢＡと、前記分割ブロックサイズ当たりのＬＢＡ数と、前記ボリューム番号と、前記装置数とから、前記Ｉ／Ｏ要求を処理するストレージ制御装置を識別する装置番号を導出する数式を用いて、前記Ｉ／Ｏ要求を処理するストレージ制御装置を決定する、ことを特徴とする請求項２に記載のストレージ制御装置。
【請求項４】
前記制御部は、
決定した前記Ｉ／Ｏ要求を処理するストレージ制御装置が自装置であれば、前記Ｉ／Ｏ要求を処理し、
決定した前記Ｉ／Ｏ要求を処理するストレージ制御装置が他装置であれば、前記Ｉ／Ｏ要求を前記他装置に転送する、
ことを特徴とする請求項１〜３のいずれか一つに記載のストレージ制御装置。
【請求項５】
ボリューム内の論理ブロックを指定する論理アドレスを含むＩ／Ｏ要求を上位装置から受け付け、
受け付けた前記Ｉ／Ｏ要求に含まれる前記論理アドレスと、前記ボリュームを区切る分割ブロックサイズ当たりの論理ブロック数と、前記ボリュームに割り当てる物理記憶領域を有するストレージにアクセス可能な複数のストレージ制御装置の装置数とに基づいて、前記複数のストレージ制御装置から前記Ｉ／Ｏ要求を処理するストレージ制御装置を決定する、
処理をコンピュータに実行させることを特徴とするストレージ制御プログラム。
【請求項６】
複数のストレージ制御装置と、前記複数のストレージ制御装置がアクセス可能なストレージとを含むストレージシステムであって、
前記複数のストレージ制御装置のいずれかのストレージ制御装置が、
ボリューム内の論理ブロックを指定する論理アドレスを含むＩ／Ｏ要求を上位装置から受け付け、
受け付けた前記Ｉ／Ｏ要求に含まれる前記論理アドレスと、前記ボリュームを区切る分割ブロックサイズ当たりの論理ブロック数と、前記複数のストレージ制御装置の装置数とに基づいて、前記複数のストレージ制御装置から前記Ｉ／Ｏ要求を処理するストレージ制御装置を決定する、
ことを特徴とするストレージシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ストレージ制御装置、ストレージ制御プログラムおよびストレージシステムに関する。
【背景技術】
【０００２】
近年、顧客を取り巻くビジネスの状況は刻一刻と変化しており、新たな事業・サービスの開始や、既存サービスのワークロードの変化に対して、柔軟かつ俊敏に拡張できるストレージシステムが求められている。ストレージシステムの拡張方法としては、スケールアウトがある。スケールアウトでは、ノードを増設することで処理能力を向上させることができる。
【０００３】
先行技術としては、論理ボリュームの作成時に、割り当てた実記憶領域と対応付けた割当情報と、論理ブロックのブロックサイズの特定情報とを関連付けた管理情報を格納するアクセス制御装置がある。アクセス制御装置は、データアクセス要求が入力されると、データアクセス要求によって指定されるアクセス先に対応する管理情報に設定される論理ブロックのデータ長に基づき、データアクセス要求をスライスのブロック長に基づく記述に変換する。また、帯域幅、通信コストおよび書き込みを依頼するノードとストレージの間の物理的距離に基づいて、分散配置された各ストレージについて利用対象としての望ましさを示す評価値を算出し、評価値に基づいてストレージセットを選択する技術がある。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】国際公開第２００８／１３６０９７号
【特許文献２】特開２００４−１２６７１６号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
ストレージシステムにより提供される論理ボリュームに対する上位装置からのＩ／Ｏ（Ｉｎｐｕｔ／Ｏｕｔｐｕｔ）要求を、複数のノードで分散して処理することで、負荷の分散を行うことが考えられる。しかしながら、従来技術では、論理ボリューム内のどの領域をどのノードに担当させるのかを効率的に決めるのが難しい。
【０００６】
一つの側面では、本発明は、上位装置からのＩ／Ｏ要求を処理するストレージ制御装置を効率的に決定することを目的とする。
【課題を解決するための手段】
【０００７】
１つの実施態様では、ボリューム内の論理ブロックを指定する論理アドレスを含むＩ／Ｏ要求を上位装置から受け付け、受け付けた前記Ｉ／Ｏ要求に含まれる前記論理アドレスと、前記ボリュームを区切る分割ブロックサイズ当たりの論理ブロック数と、前記ボリュームに割り当てる物理記憶領域を有するストレージにアクセス可能な複数のストレージ制御装置の装置数とに基づいて、前記複数のストレージ制御装置から前記Ｉ／Ｏ要求を処理するストレージ制御装置を決定する、ストレージ制御装置が提供される。
【発明の効果】
【０００８】
本発明の一側面によれば、上位装置からのＩ／Ｏ要求を処理するストレージ制御装置を効率的に決定することができる。
【図面の簡単な説明】
【０００９】
【図１】図１は、実施の形態にかかるストレージ制御装置１０１の一実施例を示す説明図である。
【図２】図２は、ストレージシステム２００のシステム構成例を示す説明図である。
【図３】図３は、ノードＮのハードウェア構成例を示すブロック図である。
【図４】図４は、論物メタｍｔのフォーマット例を示す説明図である。
【図５】図５は、ノードＮの機能的構成例を示すブロック図である。
【図６】図６は、各ボリュームＶにおける担当ノードＮの配置例を示す説明図である。
【図７】図７は、Ｉ／Ｏ範囲が複数の分割ブロックに跨る場合の一例を示す説明図である。
【図８】図８は、ストレージシステム２００の動作例を示すシーケンス図である。
【図９】図９は、ノードＮのストレージ制御処理手順の一例を示すフローチャート（その１）である。
【図１０】図１０は、ノードＮのストレージ制御処理手順の一例を示すフローチャート（その２）である。
【発明を実施するための形態】
【００１０】
以下に図面を参照して、本発明にかかるストレージ制御装置、ストレージ制御プログラムおよびストレージシステムの実施の形態を詳細に説明する。
【００１１】
（実施の形態）
図１は、実施の形態にかかるストレージ制御装置１０１の一実施例を示す説明図である。図１において、ストレージ制御装置１０１−１〜１０１−ｎ（ｎは、２以上の自然数）は、ストレージ１０２にアクセス可能なコンピュータである。以下の説明では、ストレージ制御装置１０１−１〜１０１−ｎのうちの任意のストレージ制御装置を、「ストレージ制御装置１０１」と表記する場合がある。
【００１２】
また、ストレージ１０２は、データを記憶する１以上の記憶装置を含む。記憶装置は、例えば、フラッシュメモリ、ハードディスク、光ディスク、磁気テープなどである。上位装置１０３は、情報処理を行うコンピュータである。上位装置１０３は、例えば、業務処理を行う業務サーバである。
【００１３】
ストレージ制御装置１０１は、例えば、ＲＡＩＤ（Ｒｅｄｕｎｄａｎｔ  Ａｒｒａｙｓ  ｏｆ  Ｉｎｅｘｐｅｎｓｉｖｅ  Ｄｉｓｋｓ）構成の仮想化ストレージ装置に適用される。仮想化ストレージ装置は、シン・プロビジョニング（Ｔｈｉｎ  Ｐｒｏｖｉｓｉｏｎｉｎｇ）が適用されたストレージ装置である。
【００１４】
シン・プロビジョニングとは、ストレージリソースを仮想化して割り当てることで、ストレージの物理容量を削減するための技術である。シン・プロビジョニングが導入された環境では、ユーザの要求に応じた容量を物理ディスク等に割り当てず、「論理ボリューム（仮想ボリューム）」として割り当てる。物理ディスク等は共有のディスクプールとして管理され、論理ボリュームに書き込まれたデータ量に応じて物理ディスク等に容量が割り当てられる。
【００１５】
ここで、仮想化ストレージ装置において、サーバに業務ごとのボリュームを提供する場合を想定する。この場合、サーバからのＩ／Ｏ要求を複数のストレージ制御装置（例えば、ストレージ制御装置１０１−１〜１０１−ｎ）で負荷分散する方法として、例えば、ボリュームごとに、サーバからのＩ／Ｏ要求を処理するストレージ制御装置を決める方法がある。
【００１６】
ところが、この方法では、特定のストレージ制御装置で、その装置の能力を超えて業務負荷が高まると、レイテンシーが大きく劣化してしまう。また、業務や業務ボリュームが、ストレージ制御装置の装置数を超えて多数になると、どの業務をどのストレージ制御装置で動作させるかのストレージ設計が難しくなり、業務数の変動やワークロードの変化に対応することができなくなるおそれがある。
【００１７】
このため、各ボリュームについて、サーバからのＩ／Ｏ要求を複数のストレージ制御装置で分散して処理することで、負荷の分散を行い、安定した性能を維持することが考えられる。この方法では、ボリューム内のどの領域をどのストレージ制御装置に担当させるのかを決めることになる。
【００１８】
ボリューム内の各領域を担当するストレージ制御装置を決める方法としては、例えば、ボリューム内の各領域と、当該各領域を担当するストレージ制御装置との対応関係を記憶するテーブル等を予め用意することが考えられる。ところが、この方法では、Ｉ／Ｏ要求を受け付けた際に、その都度テーブル等を参照することになり、Ｉ／Ｏ処理にかかる処理時間の増加を招く。さらに、各ストレージ制御装置において、テーブル等を保持するための記憶領域を確保することになり、記憶容量不足を招くおそれがある。
【００１９】
そこで、本実施の形態では、論理ボリューム内のどの領域をどのストレージ制御装置１０１−１〜１０１−ｎに担当させるのかを効率的に決定することができるストレージ制御装置１０１について説明する。以下、ストレージ制御装置１０１の処理例について説明する。
【００２０】
（１）ストレージ制御装置１０１は、上位装置１０３からＩ／Ｏ要求を受け付ける。ここで、Ｉ／Ｏ要求は、ボリュームに対するリード要求またはライト要求である。ボリュームは、上位装置１０３に提供される論理ボリューム（仮想ボリューム）である。ストレージ１０２は、ボリュームに割り当てる物理記憶領域を有する。
【００２１】
Ｉ／Ｏ要求は、ボリューム内の論理ブロックを指定する論理アドレスを含む。論理ブロックは、所定容量で規定された管理単位の領域である。論理アドレスは、例えば、ＬＢＡ（Ｌｏｇｉｃａｌ  Ｂｌｏｃｋ  Ａｄｄｒｅｓｓ）によって指定される。１ＬＢＡは、例えば、５１２Ｂ（Ｂｙｔｅ）の領域（１論理ブロック）に相当する。
【００２２】
図１の例では、ストレージ制御装置１０１−１が、上位装置１０３からボリューム１１０のＬＢＡを含むＩ／Ｏ要求を受け付けた場合を想定する。
【００２３】
（２）ストレージ制御装置１０１は、ストレージ制御装置１０１−１〜１０１−ｎから、受け付けたＩ／Ｏ要求を処理するストレージ制御装置１０１を決定する。ここで、Ｉ／Ｏ要求を処理するとは、Ｉ／Ｏ要求されたデータの論理アドレスと物理アドレスとの対応関係を特定するメタデータからデータの物理位置を特定してアクセスを行うことである。
【００２４】
以下の説明では、上位装置１０３からのＩ／Ｏ要求を処理するストレージ制御装置１０１を「担当装置」と表記する場合がある。
【００２５】
具体的には、例えば、ストレージ制御装置１０１は、Ｉ／Ｏ要求に含まれる論理アドレスと、分割ブロックサイズ当たりの論理ブロック数と、ストレージ制御装置１０１−１〜１０１−ｎの装置数ｎとに基づいて、担当装置を決定する。ここで、分割ブロックサイズとは、ボリュームを区切って分割した分割ブロックのサイズである。
【００２６】
分割ブロックサイズは、任意に設定可能であり、Ｉ／Ｏ要求がストレージ制御装置１０１−１〜１０１−ｎにできるだけ分散されるような値に設定される。例えば、上位装置１０３から発行されるＩ／Ｏサイズは、最大でＩＮＱＵＩＲＹコマンドで返すサイズ（例えば、８ＭＢ）に分割される。このため、分割ブロックサイズを８ＭＢとすることにしてもよい。
【００２７】
また、分割ブロックサイズ当たりの論理ブロック数は、論理アドレスがＬＢＡによって指定されるとすると、分割ブロックサイズ当たりのＬＢＡ数、すなわち、１分割ブロック当たりのＬＢＡ数に相当する。一例として、分割ブロックサイズを「８ＭＢ」とし、１ＬＢＡを「５１２Ｂ」とする。この場合、分割ブロックサイズ当たりの論理ブロック数は、「８ＭＢ／５１２Ｂ」となる。
【００２８】
具体的には、例えば、ストレージ制御装置１０１は、下記式（１）を用いて、担当装置を決定することができる。下記式（１）は、Ｉ／Ｏ要求に含まれるボリュームのＬＢＡと、分割ブロックサイズ当たりのＬＢＡ数と、複数のストレージ制御装置１０１の装置数ｎとから、担当装置を識別する装置番号を導出する数式の一例である。
【００２９】
ただし、「／」は、商を求める演算子を表す。「％」は、余りを求める演算子を表す。ｌｂａは、Ｉ／Ｏ要求に含まれるボリュームのＬＢＡであり、例えば、論理アドレスとして指定される先頭のＬＢＡである。ｕｎｉｔ＿ｓｉｚｅは、分割ブロックサイズ当たりのＬＢＡ数である。担当装置番号は、担当装置の装置番号である。装置番号は、ストレージ制御装置１０１において内部的に管理される各ストレージ制御装置１０１−１〜１０１−ｎを識別する識別子であり、０から順に１ずつ増えていく整数である。各ストレージ制御装置１０１−１〜１０１−ｎには、０から順に１ずつ増えていく装置番号が振られている。図１中、「＃ｉ」の「ｉ」は、装置番号を示している（ｉ＝０，１，…，ｎ−１）。
【００３０】
担当装置番号＝（ｌｂａ／ｕｎｉｔ＿ｓｉｚｅ）％ｎ      ・・・（１）
【００３１】
一例として、ｌｂａを「５０」とし、ｕｎｉｔ＿ｓｉｚｅを「３０」とし、ｎを「４」とする。この場合、担当装置番号は、「１（＝（５０／３０）％４）」となる。このため、ストレージ制御装置１０１−１は、担当装置番号「１」のストレージ制御装置１０１、すなわち、ストレージ制御装置１０１−２を担当装置に決定する。
【００３２】
このように、ストレージ制御装置１０１によれば、上位装置１０３からのＩ／Ｏ要求に含まれる論理アドレスに応じて、ストレージ制御装置１０１−１〜１０１−ｎから担当装置を効率的に決定することができる。これにより、Ｉ／Ｏ処理にかかる負荷をストレージ制御装置１０１−１〜１０１−ｎで分散することが可能となる。
【００３３】
具体的には、例えば、ストレージ制御装置１０１は、上記式（１）を用いて、ボリューム１１０のＬＢＡから担当装置番号を求めることができる。このため、例えば、ボリューム１１０内の領域と当該領域を担当する担当装置との対応関係を示すテーブル等を用いる場合に比べて、Ｉ／Ｏ処理にかかる処理時間を削減することができるとともに、記憶容量の使用量を抑えることができる。
【００３４】
（ストレージシステム２００のシステム構成例）
つぎに、図１に示したストレージ制御装置１０１をストレージシステム２００に適用した場合について説明する。ストレージシステム２００は、例えば、ＲＡＩＤ５，６等の冗長化されたシステムである。ただし、以下の説明では、ストレージ制御装置１０１を「ノードＮ」と表記する場合がある。
【００３５】
図２は、ストレージシステム２００のシステム構成例を示す説明図である。図２において、ストレージシステム２００は、ノードブロックＮＢ１，ＮＢ２と、ドライブグループＤＧ１，ＤＧ２と、を含む。ノードブロックＮＢ１は、ノードＮ１と、ノードＮ２とを含む。ノードブロックＮＢ２は、ノードＮ３と、ノードＮ４とを含む。
【００３６】
ドライブグループＤＧ１，ＤＧ２は、ドライブｄの集合であり、例えば、６〜２４台のドライブｄを有する。ドライブｄは、ＳＳＤ（Ｓｏｌｉｄ  Ｓｔａｔｅ  Ｄｒｉｖｅ）である。ただし、ドライブｄとして、ＨＤＤ（Ｈａｒｄ  Ｄｉｓｋ  Ｄｒｉｖｅ）を用いることにしてもよい。図１に示したストレージ１０２は、例えば、ドライブグループＤＧ１，ＤＧ２に相当する。
【００３７】
ノードブロックＮＢ１内の各ノードＮ１，Ｎ２は、自配下のドライブグループＤＧ１の各ドライブｄに直接アクセス可能である。また、ノードブロックＮＢ２内の各ノードＮ３，Ｎ４は、自配下のドライブグループＤＧ２の各ドライブｄに直接アクセス可能である。各ノードＮ１〜Ｎ４は、構成情報やメタデータを有する。
【００３８】
構成情報は、例えば、ストレージシステム２００において作成された論理ボリュームや、ＲＡＩＤを構成するドライブｄについての種々の管理情報を含む。また、各ノードＮ１〜Ｎ４は、メタデータを用いてデータ（ユーザデータ）を管理する。メタデータは、データの論理アドレスと物理アドレスの対応関係を管理する論物メタｍｔを含む。論物メタｍｔのフォーマット例については、図４を用いて後述する。
【００３９】
ホスト装置２０１は、ストレージシステム２００により提供される論理ボリューム（仮想ボリューム）に対するデータのリード／ライトを要求するコンピュータである。例えば、ホスト装置２０１は、ストレージシステム２００を利用する業務サーバや、ストレージシステム２００を管理する管理サーバなどである。図１に示した上位装置１０３は、例えば、ホスト装置２０１に相当する。ストレージシステム２００は、Ａｃｔｉｖｅ／Ａｃｔｉｖｅ構成であり、各ノードＮ１〜Ｎ４のいずれでもホスト装置２０１からのＩ／Ｏ要求を受け付けることができる。
【００４０】
ストレージシステム２００において、各ノードＮ１〜Ｎ４とホスト装置２０１は、例えば、ＦＣ（Ｆｉｂｒｅ  Ｃｈａｎｎｅｌ）やｉＳＣＳＩ（Ｉｎｔｅｒｎｅｔ  Ｓｍａｌｌ  Ｃｏｍｐｕｔｅｒ  Ｓｙｓｔｅｍ  Ｉｎｔｅｒｆａｃｅ）で接続される。具体的には、例えば、各ノードＮ１〜Ｎ４は、ＥＣ−Ｈ（Ｅｘｐａｎｓｉｏｎ  Ｃａｒｄ  ｆｏｒ  Ｈｏｓｔ）を介してホスト装置２０１と相互に通信可能に接続される。また、ノードブロックＮＢ内のノードＮ間は、内部通信によって接続される。また、ノードブロックＮＢを跨いだノードＮ間は、例えば、ＥＣ−ＳＯ（Ｅｘｐａｎｓｉｏｎ  Ｃａｒｄ  ｆｏｒ  Ｓｃａｌｅ−Ｏｕｔ）を介して相互に通信可能に接続される。
【００４１】
また、ストレージシステム２００では、例えば、ＲＡＩＤユニットの単位でデータを管理する。シン・プロビジョニングの物理割当の単位は、一般に固定サイズのチャンク単位で行われ、１チャンクは１ＲＡＩＤユニットに該当する。以降の説明では、チャンクをＲＡＩＤユニットと呼称する。ＲＡＩＤユニットは、例えば、ドライブグループＤＧから割り当てられる２４ＭＢの連続な物理領域である。ＲＡＩＤユニットは、複数のユーザデータユニット(データログとも呼ばれる)を含む。ユーザデータユニットには、例えば、ドライブｄに書き込まれるデータの管理データと、ドライブｄに書き込まれるデータの圧縮データとが含まれる。
【００４２】
なお、図２の例では、ストレージシステム２００に含まれるノード数が４である場合を例に挙げて説明したが、ノード数は５以上であってもよい。また、ホスト装置２０１を１台のみ表記したが、ストレージシステム２００は、２台以上のホスト装置２０１で利用可能である。また、ここでは、冗長化のためにノードブロックＮＢに２つのノードＮが含まれる場合を例に挙げて説明したが、これに限らない。例えば、ノードブロックＮＢに含まれるノードＮの数は、１つであってもよく、また、３つ以上であってもよい。また、ストレージシステム２００には、例えば、ノードブロック単位でノードＮを増設可能である。
【００４３】
（ノードＮのハードウェア構成例）
図３は、ノードＮのハードウェア構成例を示すブロック図である。図３において、ノードＮは、ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）３０１と、メモリ３０２と、通信Ｉ／Ｆ（Ｉｎｔｅｒｆａｃｅ）３０３と、Ｉ／Ｏコントローラ３０４と、を有する。また、各構成部は、バス３００によってそれぞれ接続される。
【００４４】
ここで、ＣＰＵ３０１は、ノードＮの全体の制御を司る。メモリ３０２は、例えば、ＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）およびフラッシュＲＯＭなどを有する。具体的には、例えば、フラッシュＲＯＭやＲＯＭが各種プログラムを記憶し、ＲＡＭがＣＰＵ３０１のワークエリアとして使用される。メモリ３０２に記憶されるプログラムは、ＣＰＵ３０１にロードされることで、コーディングされている処理をＣＰＵ３０１に実行させる。ＲＡＭには、例えば、キャッシュメモリが含まれる。キャッシュメモリには、例えば、ホスト装置２０１から要求されるＩ／Ｏのデータが一時的に格納される。
【００４５】
通信Ｉ／Ｆ３０３は、通信回線を通じてネットワークに接続され、ネットワークを介して他のコンピュータ（例えば、図２に示したホスト装置２０１や他ノードＮ）に接続される。ネットワークは、例えば、ＬＡＮ（Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、ＷＡＮ（Ｗｉｄｅ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、インターネット、ＳＡＮ（Ｓｔｏｒａｇｅ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）などである。そして、通信Ｉ／Ｆ３０３は、ネットワークと装置内部とのインターフェースを司り、他のコンピュータからのデータの入出力を制御する。通信Ｉ／Ｆ３０３は、例えば、ＥＣ−Ｈ、ＥＣ−ＳＯなどを含む。
【００４６】
Ｉ／Ｏコントローラ３０４は、ＣＰＵ３０１の制御にしたがって、自配下のドライブグループＤＧ内の各ドライブｄ（図２参照）に対するアクセスを行う。Ｉ／Ｏコントローラ３０４は、例えば、ＰＣＩｅ（ＰＣＩ  Ｅｘｐｒｅｓｓ）スイッチを含む。
【００４７】
（論物メタｍｔのフォーマット例）
つぎに、ノードＮが用いる論物メタｍｔのフォーマット例について説明する。論物メタｍｔは、例えば、図３に示したノードＮのメモリ３０２に記憶される。
【００４８】
図４は、論物メタｍｔのフォーマット例を示す説明図である。図４において、論物メタｍｔは、データの論理アドレスと物理アドレスの対応関係を特定可能な情報である。論物メタｍｔは、例えば、８ＫＢのデータごとに管理される。
【００４９】
図４の例では、論物メタｍｔの大きさは、３２Ｂである。論物メタｍｔには、２ＢのＬＵＮと、６ＢのＬＢＡがデータの論理アドレスとして含まれる。また、論物メタｍｔには、２ＢのＣｏｍｐｒｅｓｓｉｏｎ  Ｂｙｔｅ  Ｃｏｕｎｔが、圧縮されたデータのバイト数として含まれる。また、論物メタｍｔには、２ＢのＮｏｄｅ  Ｎｏと、１ＢのＤｉｓｋ  Ｐｏｏｌ  Ｎｏと、４ＢのＲＡＩＤ  Ｕｎｉｔ  Ｎｏと、２ＢのＲＡＩＤ  Ｕｎｉｔ  Ｏｆｆｓｅｔ  ＬＢＡが物理アドレスとして含まれる。
【００５０】
Ｎｏｄｅ  Ｎｏは、データユニットを記憶するＲＡＩＤユニットが属するドライブグループＤＧを担当するノードＮを識別する番号である。Ｄｉｓｋ  Ｐｏｏｌ  Ｎｏは、データユニットを記憶するＲＡＩＤユニットが属するドライブグループＤＧを識別する番号である。ＲＡＩＤ  Ｕｎｉｔ  Ｎｏは、データユニットを記憶するＲＡＩＤユニットを識別する番号である。ＲＡＩＤ  Ｕｎｉｔ  Ｏｆｆｓｅｔ  ＬＢＡは、データユニットのＲＡＩＤユニット内でのアドレスである。
【００５１】
（ノードＮの機能的構成例）
図５は、ノードＮの機能的構成例を示すブロック図である。図５において、ノードＮは、受付部５０１と、決定部５０２と、転送部５０３と、処理部５０４と、を含む構成である。受付部５０１〜処理部５０４は制御部となる機能であり、具体的には、例えば、図３に示したメモリ３０２に記憶されたプログラムをＣＰＵ３０１に実行させることにより、または、通信Ｉ／Ｆ３０３、Ｉ／Ｏコントローラ３０４により、その機能を実現する。各機能部の処理結果は、例えば、メモリ３０２に記憶される。
【００５２】
受付部５０１は、ホスト装置２０１からＩ／Ｏ要求を受け付ける。ここで、Ｉ／Ｏ要求は、ボリュームＶに対するリード要求またはライト要求である。ボリュームＶは、ホスト装置２０１に提供される論理ボリューム（仮想ボリューム）である。ボリュームＶには、例えば、図２に示したドライブグループＤＧ１，ＤＧ２内のドライブｄの物理記憶領域が適宜割り当てられる。
【００５３】
Ｉ／Ｏ要求は、ボリュームＶ内の論理ブロックを指定する論理アドレスを含む。具体的には、例えば、Ｉ／Ｏ要求は、ボリュームＶのＬＵＮ（Ｌｏｇｉｃａｌ  Ｕｎｉｔ  Ｎｕｍｂｅｒ：論理ユニット番号）と、ボリュームＶのＬＢＡとを含む。ボリュームＶのＬＵＮは、ホスト装置２０１が用いるボリュームＶを識別する識別子である。ボリュームＶのＬＢＡは、アクセス先となるＬＢＡであり、例えば、ボリュームＶ内の先頭ＬＢＡおよびＬＢＡ範囲を示す。ＬＢＡ範囲は、先頭ＬＢＡから何ＬＢＡ分アクセスするのかの範囲を示す。ＬＢＡ範囲は、例えば、ＬＢＡ数によって示される。先頭ＬＢＡおよびアクセス範囲からＩ／Ｏ範囲（アクセス範囲）が特定される。
【００５４】
決定部５０２は、ノードＮ１〜Ｎ４から、受付部５０１によって受け付けたＩ／Ｏ要求を処理するノードＮを決定する。ここで、ノードＮ１〜Ｎ４は、ストレージシステム２００の構成要素となるノードＮの集合である。ただし、ストレージシステム２００には、５以上のノードＮが含まれていてもよい。
【００５５】
以下の説明では、Ｉ／Ｏ要求を処理するノードＮを「担当ノードＮ」と表記する場合がある。
【００５６】
具体的には、例えば、決定部５０２は、Ｉ／Ｏ要求に含まれる論理アドレスと、ボリュームＶの分割ブロックサイズ当たりの論理ブロック数と、ボリュームＶのボリューム番号と、ストレージシステム２００のノード数とに基づいて、担当ノードＮを決定する。分割ブロックサイズは、ボリュームＶを区切って分割した分割ブロックのサイズである。分割ブロックサイズは、例えば、８ＭＢである。
【００５７】
ボリューム番号は、ノードＮにおいて内部的に管理される各ボリュームＶを識別する識別子であり、０から順に１ずつ増えていく整数である。ボリューム番号は、例えば、ボリュームＶのＬＵＮをキーとして、構成情報から特定することができる。例えば、決定部５０２は、構成情報を参照して、Ｉ／Ｏ要求に含まれるボリュームＶのＬＵＮに対応するボリューム番号を特定する。
【００５８】
ストレージシステム２００のノード数は、ストレージシステム２００の構成要素となるノードＮ１〜Ｎ４の数である。すなわち、ノード数は、ボリュームＶが存在するプールを構成するノードＮの数である。プールは、例えば、複数のドライブｄから構成されるＲＡＩＤ６ベースの物理的な容量プールである。
【００５９】
より詳細に説明すると、決定部５０２は、例えば、下記式（２）および（３）を用いて、担当ノードＮを決定することができる。ただし、ｎｏｄｅは、担当ノードＮを識別するノード番号である。ノード番号は、ノードＮにおいて内部的に管理される各ノードＮ１〜Ｎ４を識別する識別子であり、０から順に１ずつ増えていく整数である。すなわち、ノード番号は、図１で説明した「装置番号」に相当する。ｕｎｉｔは、Ｉ／Ｏ要求に含まれるボリュームＶのＬＢＡがボリュームＶ内の何領域目（分割ブロック）になるかを示す。ｌｂａは、Ｉ／Ｏ要求に含まれるボリュームＶのＬＢＡを示す。ｌｂａは、例えば、アクセス先の先頭ＬＢＡである。ｕｎｉｔ＿ｓｉｚｅは、ボリュームＶの分割ブロックサイズ当たりのＬＢＡ数である。ｌｕｎは、ボリュームＶのボリューム番号である。ｎｏｄｅＣｎｔは、ストレージシステム２００の構成要素となるノードＮ１〜Ｎ４のノード数を示す。
【００６０】
ｎｏｄｅ＝（ｕｎｉｔ＋ｌｕｎ）％ｎｏｄｅＣｎｔ      ・・・（２）
ｕｎｉｔ＝ｌｂａ／ｕｎｉｔ＿ｓｉｚｅ      ・・・（３）
【００６１】
なお、上記式（２）および（３）を用いて決定される各ボリュームＶにおける担当ノードＮの配置例については、図６を用いて後述する。
【００６２】
ここで、Ｉ／Ｏ範囲がボリュームＶ内の複数の分割ブロックに跨る場合がある。例えば、ホスト装置２０１から発行されるＩ／Ｏサイズは、最大でＩＮＱＵＩＲＹコマンドで返すサイズ（８ＭＢ）に分割される。したがって、分割ブロックサイズを「８ＭＢ」とした場合、Ｉ／Ｏ範囲は、最大で２つの分割ブロックに跨ることになる。
【００６３】
このため、決定部５０２は、Ｉ／Ｏ範囲がボリュームＶの複数の分割ブロックに跨る場合は、Ｉ／Ｏ範囲を複数のＩ／Ｏ範囲に分割し、分割した複数のＩ／Ｏ範囲それぞれに対するＩ／Ｏ要求について、担当ノードＮを決定することにしてもよい。具体的には、例えば、決定部５０２は、Ｉ／Ｏ要求に含まれるボリュームＶの先頭ＬＢＡおよびＬＢＡ範囲と、分割ブロックサイズ当たりのＬＢＡ数とに基づいて、Ｉ／Ｏ範囲がボリュームＶの複数の分割ブロックに跨るか否かを判断する。
【００６４】
より詳細に説明すると、決定部５０２は、例えば、下記式（４）を用いて、ｕｎｉｔ＿ｃｎｔを算出する。ｕｎｉｔ＿ｃｎｔは、Ｉ／Ｏ範囲が跨る分割ブロックの数を示す。換言すれば、ｕｎｉｔ＿ｃｎｔは、Ｉ／Ｏ要求がいくつの担当ノードＮに分かれるのかを示す。ただし、ｓｔａｒｔ＿ｌｂａは、ボリュームＶの先頭ＬＢＡである。ｉｏ＿ｂｌｋ＿ｃｎｔは、ＬＢＡ範囲が示すＬＢＡ数である。ｕｎｉｔ＿ｓｉｚｅは、ボリュームＶの分割ブロックサイズ当たりのＬＢＡ数である。
【００６５】
ｕｎｉｔ＿ｃｎｔ
＝｛（ｓｔａｒｔ＿ｌｂａ＋ｉｏ＿ｂｌｋ＿ｃｎｔ−１）／ｕｎｉｔ＿ｓｉｚｅ｝−
（ｓｔａｒｔ＿ｌｂａ／ｕｎｉｔ＿ｓｉｚｅ）＋１      ・・・（４）
【００６６】
そして、決定部５０２は、算出したｕｎｉｔ＿ｃｎｔが「１」の場合、Ｉ／Ｏ範囲が複数の分割ブロックに跨らないと判断する。一方、ｕｎｉｔ＿ｃｎｔが「２」の場合、決定部５０２は、Ｉ／Ｏ範囲が複数の分割ブロックに跨ると判断する。ここで、Ｉ／Ｏ範囲が複数の分割ブロックに跨る場合、決定部５０２は、Ｉ／Ｏ範囲を複数のＩ／Ｏ範囲に分割し、分割した複数のＩ／Ｏ範囲それぞれに対するＩ／Ｏ要求について、担当ノードＮを決定する。
【００６７】
なお、Ｉ／Ｏ範囲がボリュームＶの複数の分割ブロックに跨る場合の担当ノードＮの決定例については、図７を用いて後述する。
【００６８】
転送部５０３は、決定された担当ノードＮが他ノードであれば、Ｉ／Ｏ要求を担当ノードＮに転送する。具体的には、例えば、転送部５０３は、Ｉ／Ｏ要求を担当ノードＮに転送して、Ｉ／Ｏ要求の処理依頼を行う。この結果、担当ノードＮにおいてＩ／Ｏ要求が処理される。例えば、Ｉ／Ｏ要求がリード要求の場合、転送部５０３は、担当ノードＮからデータを受信すると、受信したデータをホスト装置２０１に送信する。
【００６９】
処理部５０４は、決定された担当ノードＮが自装置であれば、Ｉ／Ｏ要求を処理する。具体的には、例えば、処理部５０４は、図４に示したような論物メタｍｔを参照して、Ｉ／Ｏ要求に含まれる論理アドレス（ＬＵＮ、ＬＢＡ）に基づいて、データの物理位置（物理アドレス）を特定する。
【００７０】
つぎに、処理部５０４は、特定した物理位置を物理担当ノードＮに通知する。物理担当ノードＮは、特定した物理位置のデータに直接アクセス可能なノードＮである。例えば、Ｉ／Ｏ要求がリード要求の場合、処理部５０４は、物理担当ノードＮからデータを受信すると、受信したデータをホスト装置２０１に送信する。ただし、自装置が物理担当ノードＮの場合には、処理部５０４が、データの読み出しを行う。
【００７１】
また、処理部５０４は、受付部５０１が、他ノードからＩ／Ｏ要求を受け付けた場合、当該Ｉ／Ｏ要求を処理して、他ノードＮに処理結果を通知する。すなわち、他ノードにおいて、ノードＮが担当ノードＮと決定された場合は、ノードＮは、ホスト装置２０１からのＩ／Ｏ要求を他ノードから受け付け、担当ノードＮとして当該Ｉ／Ｏ要求を処理する。
【００７２】
なお、ホスト装置２０１からのＩ／Ｏ要求に対するストレージシステム２００の動作例については、図８を用いて後述する。
【００７３】
（各ボリュームＶにおける担当ノードＮの配置例）
つぎに、図６を用いて、上記式（２）および（３）を用いて決定される各ボリュームＶにおける担当ノードＮの配置例について説明する。
【００７４】
図６は、各ボリュームＶにおける担当ノードＮの配置例を示す説明図である。図６において、ホスト装置２０１に提供される各ボリュームＶにおける分割ブロックごとの担当ノードＮが示されている。なお、図６中、ｎｏｄｅ＃の「＃」は、ノードＮのノード番号を示す。Ｖｏｌｕｍｅ＃の「＃」は、ボリュームＶのボリューム番号を示す。
【００７５】
図６に示すように、同一ボリュームＶ内では、分割ブロックサイズごとに担当ノードＮのノード番号が一つずつずれている。これにより、各ボリュームＶのＩ／Ｏ処理にかかる負荷をノードＮ１〜Ｎ４で分散することができ、ストレージシステム２００の安定した性能を維持することが可能となる。
【００７６】
また、ボリュームＶ間では、先頭分割ブロックの担当ノードＮのノード番号がずれている。これにより、ストレージシステム２００全体で負荷をより分散することができる。例えば、同一のホスト装置２０１や同一のＯＳ（Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ）から複数のボリュームＶにアクセスがあった際に、各ボリュームＶへのアクセスパターンが似たようなものとなることがある。例えば、各ボリュームＶの１分割ブロックにアクセスが集中することがある。このような場合であっても、ボリュームＶ間で始まりの担当ノードＮがずれているため、性能の低下を抑えることができる。
【００７７】
（Ｉ／Ｏ範囲が複数の分割ブロックに跨る場合の担当ノードＮの決定例）
つぎに、図７を用いて、Ｉ／Ｏ範囲がボリュームＶの複数の分割ブロックに跨る場合の担当ノードＮの決定例について説明する。
【００７８】
図７は、Ｉ／Ｏ範囲が複数の分割ブロックに跨る場合の一例を示す説明図である。図７において、Ｘは、ボリュームＶのボリューム番号を示す。Ｙは、ノード数を示す。図７の例では、Ｉ／Ｏ範囲が複数の分割ブロックに跨っているため、Ｉ／Ｏ処理が、ノード番号「（Ｙ−１）％Ｘ」の担当ノードＮと、ノード番号「Ｙ％Ｘ」の担当ノードＮとに分散される例である。ここでは、１ＬＢＡを「５１２Ｂ」とし、分割ブロックサイズを「８ＭＢ」とする。この場合、ｕｎｉｔ＿ｓｉｚｅは、「０ｘ４０００（＝１６３８４＝８＊１０２４＊１０２４／５１２）」となる。
【００７９】
以下、ボリューム番号「２」のボリュームＶに対して、１４ＭＢ目から４ＭＢ分のＩ／Ｏ要求（ＬＢＡ：０ｘ７０００〜０ｘ８ＦＦＦ）を受け付けた場合を例に挙げて、担当ノードＮの決定例について説明する。
【００８０】
まず、決定部５０２は、上記式（４）を用いて、ｕｎｉｔ＿ｃｎｔを算出する。ここで、ｎｏｄｅＣｎｔは、「４」である。また、ｓｔａｒｔ＿ｌｂａは、「０ｘ７０００」である。また、ｉｏ＿ｂｌｋ＿ｃｎｔは、「０ｘ２０００（＝０ｘ８ＦＦＦ−０ｘ７０００＋１）」である。このため、ｕｎｉｔ＿ｃｎｔは、「２（＝（（０ｘ７０００＋０ｘ２０００−１）／０ｘ４０００）−（０ｘ７０００／０ｘ４０００）＋１＝２−１＋１）」となる。
【００８１】
この場合、決定部５０２は、Ｉ／Ｏ範囲が２つの分割ブロックに跨ると判断する。そして、決定部５０２は、Ｉ／Ｏ範囲を２つのＩ／Ｏ範囲に分割し、分割した２つのＩ／Ｏ範囲それぞれに対するＩ／Ｏ要求について、担当ノードＮを決定する。具体的には、例えば、まず、決定部５０２は、１つ目の分割ブロックについて、ｌｂａ＿１、ｕｎｉｔ＿１、ｎｏｄｅ＿１およびｉｏ＿ｂｌｋ＿ｃｎｔ＿１を算出する。
【００８２】
ｌｂａ＿１は、１つ目の分割ブロック内のアクセス先の先頭ＬＢＡである。ｕｎｉｔ＿１は、１つ目の分割ブロックがボリュームＶ内の何領域目になるかを示す。ｎｏｄｅ＿１は、１つ目の分割ブロックの担当ノードＮのノード番号である。ｉｏ＿ｂｌｋ＿ｃｎｔ＿１は、１つ目の分割ブロック内のＩ／Ｏ範囲のＬＢＡ数を示す。算出結果は、以下の通りである。
【００８３】
ｌｂａ＿１
＝ｓｔａｒｔ＿ｌｂａ＝０ｘ７０００
ｕｎｉｔ＿１
＝ｌｂａ＿１／ｕｎｉｔ＿ｓｉｚｅ＝０ｘ７０００／０ｘ４０００＝１
ｎｏｄｅ＿１
＝（ｕｎｉｔ＿１＋ｌｕｎ）％ｎｏｄｅＣｎｔ＝（１＋２）％４＝３
ｉｏ＿ｂｌｋ＿ｃｎｔ＿１
＝（ｕｎｉｔ＿１＋１）＊ｕｎｉｔ＿ｓｉｚｅ−ｌｂａ＿１
＝（１＋１）＊０ｘ４０００−０ｘ７０００
＝０ｘ８０００−０ｘ７０００
＝０ｘ１０００
【００８４】
このため、１つ目の分割ブロックに対するＩ／Ｏ要求は、ＬＢＡ「０ｘ７０００」から０ｘ１０００ＬＢＡ分の範囲をＩ／Ｏ範囲とする、ノード番号「３」のノードＮに対するＩ／Ｏ要求となる。
【００８５】
つぎに、決定部５０２は、２つ目の分割ブロックについて、ｌｂａ＿２、ｕｎｉｔ＿２、ｎｏｄｅ＿２およびｉｏ＿ｂｌｋ＿ｃｎｔ＿２を算出する。
【００８６】
ｌｂａ＿２は、２つ目の分割ブロック内のアクセス先の先頭ＬＢＡである。ｕｎｉｔ＿２は、２つ目の分割ブロックがボリュームＶ内の何領域目になるかを示す。ｎｏｄｅ＿２は、２つ目の分割ブロックの担当ノードＮのノード番号である。ｉｏ＿ｂｌｋ＿ｃｎｔ＿２は、２つ目の分割ブロック内のＩ／Ｏ範囲のＬＢＡ数を示す。算出結果は、以下の通りである。
【００８７】
ｌｂａ＿２
＝ｌｂａ＿１＋ｉｏ＿ｂｌｋ＿ｃｎｔ＿１＝０ｘ８０００
ｕｎｉｔ＿２
＝ｌｂａ＿２／ｕｎｉｔ＿ｓｉｚｅ＝０ｘ８０００／０ｘ４０００＝２
ｎｏｄｅ＿２
＝（ｕｎｉｔ＿２＋ｌｕｎ）％ｎｏｄｅＣｎｔ＝（２＋２）％４＝０
ｉｏ＿ｂｌｋ＿ｃｎｔ＿２
＝ｓｔａｒｔ＿ｌｂａ＋ｉｏ＿ｂｌｋ＿ｃｎｔ−ｌｂａ＿２
＝０ｘ７０００＋０ｘ２０００−０ｘ８０００＝０ｘ１０００
【００８８】
このため、２つ目の分割ブロックに対するＩ／Ｏ要求は、ＬＢＡ「０ｘ８０００」から「０ｘ１０００」ＬＢＡ分の範囲をＩ／Ｏ範囲とする、ノード番号「０」のノードＮに対するＩ／Ｏ要求となる。これにより、ボリュームＶ内の複数の分割ブロックに跨るＩ／Ｏ要求についても対応することが可能となる。
【００８９】
（ストレージシステム２００の動作例）
つぎに、図８を用いて、ホスト装置２０１からのＩ／Ｏ要求に対するストレージシステム２００の動作例について説明する。ここでは、ホスト装置２０１からのＩ／Ｏ要求を受け付けるレシーブノードＮが、ノードＮ２である場合を想定する。また、ホスト装置２０１からのＩ／Ｏ要求として、ボリュームＶに対するリード要求を受け付ける場合を例に挙げて説明する。また、担当ノードＮを「論理担当ノードＮ」と表記する場合がある。
【００９０】
図８は、ストレージシステム２００の動作例を示すシーケンス図である。図８において、まず、ノードＮ２は、ホスト装置２０１からのリード要求を受け付ける（ステップＳ８０１）。つぎに、ノードＮ２は、受け付けたリード要求を処理する論理担当ノードＮを決定する（ステップＳ８０２）。
【００９１】
ここでは、論理担当ノードＮとして「ノードＮ４」が決定された場合を想定する。なお、論理担当ノードＮを決定する具体的な処理手順については、図９および図１０を用いて後述する。
【００９２】
そして、ノードＮ２は、受け付けたホスト装置２０１からのリード要求を、決定した論理担当ノードＮ４に転送する（ステップＳ８０３）。つぎに、論理担当ノードＮ４は、ノードＮ２（以下、「レシーブノードＮ２」）からＩ／Ｏ要求を受信すると、論物メタｍｔを参照して、受信したＩ／Ｏ要求に含まれる論理アドレスに基づいて、データの物理位置を特定する（ステップＳ８０４）。
【００９３】
ここでは、データの物理位置として、ノードＮ３が直接アクセス可能な物理位置が特定された場合を想定する。
【００９４】
そして、論理担当ノードＮ４は、特定した物理位置を物理担当ノードＮ３に通知する（ステップＳ８０５）。つぎに、物理担当ノードＮ３は、論理担当ノードＮ４から物理位置を受信すると、受信した物理位置のデータを自配下のドライブｄから読み出す（ステップＳ８０６）。そして、物理担当ノードＮ３は、読み出したデータを伸長して論理担当ノードＮ４に送信する（ステップＳ８０７）。
【００９５】
つぎに、論理担当ノードＮ４は、物理担当ノードＮ３からデータを受信すると、受信したデータをレシーブノードＮ２に転送する（ステップＳ８０８）。そして、レシーブノードＮ２は、論理担当ノードＮ４からデータを受信すると、受信したデータをホスト装置２０１に転送して（ステップＳ８０９）、本シーケンスによる一連の処理を終了する。
【００９６】
なお、ストレージシステム２００では、ノード数ｎ（ｎ＝４）に対して、（ｎ−１）／ｎの割合でノード間通信が発生する。このため、ストレージシステム２００では高速に通信可能なインターフェースを備えることにしてもよい。
【００９７】
（ノードＮのストレージ制御処理手順）
つぎに、図９および図１０を用いて、ノードＮのストレージ制御処理手順について説明する。ただし、ここでは、Ｉ／Ｏ範囲が、最大でボリュームＶ内の２つの分割ブロックに跨る場合を想定する。
【００９８】
図９および図１０は、ノードＮのストレージ制御処理手順の一例を示すフローチャートである。図９のフローチャートにおいて、まず、ノードＮは、ホスト装置２０１からＩ／Ｏ要求を受け付けたか否かを判断する（ステップＳ９０１）。ここで、ノードＮは、Ｉ／Ｏ要求を受け付けるのを待つ（ステップＳ９０１：Ｎｏ）。
【００９９】
そして、Ｉ／Ｏ要求を受け付けた場合（ステップＳ９０１：Ｙｅｓ）、ノードＮは、上記式（４）を用いて、ｕｎｉｔ＿ｃｎｔを算出する（ステップＳ９０２）。なお、ｕｎｉｔ＿ｃｎｔは、Ｉ／Ｏ範囲が跨る分割ブロックの数を示す。つぎに、ノードＮは、算出したｕｎｉｔ＿ｃｎｔが「１」であるか否かを判断する（ステップＳ９０３）。
【０１００】
ここで、ｕｎｉｔ＿ｃｎｔが「１」の場合（ステップＳ９０３：Ｙｅｓ）、ノードＮは、上記式（３）を用いて、ｕｎｉｔを算出する（ステップＳ９０４）。なお、ｕｎｉｔは、Ｉ／Ｏ要求に含まれるボリュームＶのＬＢＡがボリュームＶ内の何領域目（分割ブロック）になるかを示す。
【０１０１】
つぎに、ノードＮは、上記式（２）を用いて、ｎｏｄｅを算出する（ステップＳ９０５）。なお、ｎｏｄｅは、担当ノードＮのノード番号である。そして、ノードＮは、算出したｎｏｄｅから特定される担当ノードＮにＩ／Ｏ要求を転送して（ステップＳ９０６）、本フローチャートによる一連の処理を終了する。ただし、ｎｏｄｅが自ノードのノード番号には、ノードＮは、ホスト装置２０１からのＩ／Ｏ要求を自ノードで処理する。
【０１０２】
また、ステップＳ９０３において、ｕｎｉｔ＿ｃｎｔが「２」の場合（ステップＳ９０３：Ｎｏ）、ノードＮは、図１０に示すステップＳ１００１に移行する。
【０１０３】
図１０のフローチャートにおいて、まず、ノードＮは、ｌｂａ＿１を算出する（ステップＳ１００１）。なお、ｌｂａ＿１は、１つ目の分割ブロック内のアクセス先の先頭ＬＢＡである。つぎに、ノードＮは、ｕｎｉｔ＿１を算出する（ステップＳ１００２）。なお、ｕｎｉｔ＿１は、１つ目の分割ブロックがボリュームＶ内の何領域目になるかを示す。
【０１０４】
つぎに、ノードＮは、ｎｏｄｅ＿１を算出する（ステップＳ１００３）。なお、ｎｏｄｅ＿１は、１つ目の分割ブロックの担当ノードＮのノード番号である。つぎに、ノードＮは、ｉｏ＿ｂｌｋ＿ｃｎｔ＿１を算出する（ステップＳ１００４）。なお、ｉｏ＿ｂｌｋ＿ｃｎｔ＿１は、１つ目の分割ブロック内のＩ／Ｏ範囲のＬＢＡ数を示す。
【０１０５】
そして、ノードＮは、算出したｎｏｄｅ＿１から特定される担当ノードＮに、ｌｂａ＿１からｉｏ＿ｂｌｋ＿ｃｎｔ＿１のＬＢＡ分の範囲をＩ／Ｏ範囲とするＩ／Ｏ要求を転送する（ステップＳ１００５）。ただし、ｎｏｄｅ＿１が自ノードのノード番号には、ノードＮは、Ｉ／Ｏ要求を自ノードで処理する。
【０１０６】
つぎに、ノードＮは、ｌｂａ＿２を算出する（ステップＳ１００６）。なお、ｌｂａ＿２は、２つ目の分割ブロック内のアクセス先の先頭ＬＢＡである。つぎに、ノードＮは、ｕｎｉｔ＿２を算出する（ステップＳ１００７）。なお、ｕｎｉｔ＿２は、２つ目の分割ブロックがボリュームＶ内の何領域目になるかを示す。
【０１０７】
つぎに、ノードＮは、ｎｏｄｅ＿２を算出する（ステップＳ１００８）。なお、ｎｏｄｅ＿２は、２つ目の分割ブロックの担当ノードＮのノード番号である。つぎに、ノードＮは、ｉｏ＿ｂｌｋ＿ｃｎｔ＿２を算出する（ステップＳ１００９）。なお、ｉｏ＿ｂｌｋ＿ｃｎｔ＿２は、２つ目の分割ブロック内のＩ／Ｏ範囲のＬＢＡ数を示す。
【０１０８】
そして、ノードＮは、算出したｎｏｄｅ＿２から特定される担当ノードＮに、ｌｂａ＿２からｉｏ＿ｂｌｋ＿ｃｎｔ＿２のＬＢＡ分の範囲をＩ／Ｏ範囲とするＩ／Ｏ要求を転送して（ステップＳ１０１０）、本フローチャートによる一連の処理を終了する。ただし、ｎｏｄｅ＿２が自ノードのノード番号には、ノードＮは、Ｉ／Ｏ要求を自ノードで処理する。これにより、各ボリュームＶのＩ／Ｏ処理にかかる負荷をノードＮ１〜Ｎ４で適切に分散することが可能となる。
【０１０９】
以上説明したように、実施の形態にかかるノードＮによれば、ホスト装置２０１からのＩ／Ｏ要求を受け付け、該Ｉ／Ｏ要求に含まれるボリュームＶの論理アドレスに応じて、担当ノードＮを決定することができる。具体的には、例えば、ノードＮは、上記式（２）および（３）を用いて、ボリュームＶのＬＢＡと、分割ブロックサイズ当たりのＬＢＡ数と、ボリューム番号と、ストレージシステム２００のノード数とに基づいて、担当ノードＮを決定することができる。
【０１１０】
これにより、ノードＮ１〜Ｎ４で負荷分散してストレージシステム２００の安定した性能を維持するための担当ノードＮを効率的に決めることができる。具体的には、ボリュームＶ内の分割ブロック（特定サイズのＬＢＡ）ごとに担当ノードＮを割り振ることができる。このため、例えば、ランダムＩ／Ｏに対して負荷分散の効果がより期待できる。また、ボリュームＶ間において、先頭分割ブロックの担当ノードＮをずらすことができる。このため、例えば、各ボリュームＶの１分割ブロックにアクセスが集中するようなことがあっても、性能の低下を抑えることができる。
【０１１１】
また、ノードＮによれば、決定した担当ノードＮが自装置であれば、Ｉ／Ｏ要求を自ノードで処理し、決定した担当ノードＮが他ノードであれば、Ｉ／Ｏ要求を担当ノードＮに転送して処理させることができる。これにより、ホスト装置２０１からのＩ／Ｏ要求の処理にかかる負荷を分散することができる。
【０１１２】
また、ノードＮによれば、Ｉ／Ｏ要求に含まれるボリュームＶの先頭ＬＢＡおよびＬＢＡ範囲と、分割ブロックサイズ当たりのＬＢＡ数とに基づいて、Ｉ／Ｏ範囲がボリュームＶの複数の分割ブロックに跨るか否かを判断することができる。そして、ノードＮによれば、複数の分割ブロックに跨る場合には、Ｉ／Ｏ範囲を複数のＩ／Ｏ範囲に分割し、分割した複数のＩ／Ｏ範囲それぞれに対するＩ／Ｏ要求について、担当ノードＮを決定することができる。これにより、ボリュームＶ内の複数の分割ブロックに跨るＩ／Ｏ要求についても、Ｉ／Ｏ範囲を複数のＩ／Ｏ範囲に分割して、各Ｉ／Ｏ範囲を担当する担当ノードＮをそれぞれ決めることができる。
【０１１３】
これらのことから、実施の形態にかかるストレージシステム２００によれば、各ノードＮの負荷が均等に分散され、各ノードＮに必要とされる最大性能を低く抑えることができる。また、どの業務をどのノードＮで担当させるかをユーザが業務ごとに考える場合に比べて、ストレージ設計が容易になる。また、突発的に負荷が上昇しても、全ノードＮで負荷分散するため、新たな業務の追加やワークロードの変化に対応可能となり、ホットスポットを回避して安定した性能を提供することができる。また、ストレージやボリュームなどの設定変更を行うことなく、リニアに性能を向上させることができる。
【０１１４】
なお、本実施の形態で説明したストレージ制御方法は、予め用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。本ストレージ制御プログラムは、ハードディスク、フレキシブルディスク、ＣＤ−ＲＯＭ、ＭＯ（Ｍａｇｎｅｔｏ−Ｏｐｔｉｃａｌ  ｄｉｓｋ）、ＤＶＤ（Ｄｉｇｉｔａｌ  Ｖｅｒｓａｔｉｌｅ  Ｄｉｓｋ）、ＵＳＢ（Ｕｎｉｖｅｒｓａｌ  Ｓｅｒｉａｌ  Ｂｕｓ）メモリ等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また、本ストレージ制御プログラムは、インターネット等のネットワークを介して配布してもよい。
【０１１５】
また、本実施の形態で説明したノードＮ（ストレージ制御装置１０１）は、スタンダードセルやストラクチャードＡＳＩＣ（Ａｐｐｌｉｃａｔｉｏｎ  Ｓｐｅｃｉｆｉｃ  Ｉｎｔｅｇｒａｔｅｄ  Ｃｉｒｃｕｉｔ）などの特定用途向けＩＣ（以下、単に「ＡＳＩＣ」と称す。）やＦＰＧＡなどのＰＬＤ（Ｐｒｏｇｒａｍｍａｂｌｅ  Ｌｏｇｉｃ  Ｄｅｖｉｃｅ）によっても実現することができる。具体的には、例えば、上述したノードＮの機能（受付部５０１〜処理部５０４）をＨＤＬ記述によって機能定義し、そのＨＤＬ記述を論理合成してＡＳＩＣやＰＬＤに与えることにより、ノードＮ（ストレージ制御装置１０１）を製造することができる。
【０１１６】
上述した実施の形態に関し、さらに以下の付記を開示する。
【０１１７】
（付記１）ボリューム内の論理ブロックを指定する論理アドレスを含むＩ／Ｏ（Ｉｎｐｕｔ／Ｏｕｔｐｕｔ）要求を上位装置から受け付け、
受け付けた前記Ｉ／Ｏ要求に含まれる前記論理アドレスと、前記ボリュームを区切る分割ブロックサイズ当たりの論理ブロック数と、前記ボリュームに割り当てる物理記憶領域を有するストレージにアクセス可能な複数のストレージ制御装置の装置数とに基づいて、前記複数のストレージ制御装置から前記Ｉ／Ｏ要求を処理するストレージ制御装置を決定する、
制御部を有することを特徴とするストレージ制御装置。
【０１１８】
（付記２）前記制御部は、
前記論理アドレスと、前記論理ブロック数と、前記ボリュームを識別するボリューム番号と、前記装置数とに基づいて、前記複数のストレージ制御装置から前記Ｉ／Ｏ要求を処理するストレージ制御装置を決定する、ことを特徴とする付記１に記載のストレージ制御装置。
【０１１９】
（付記３）前記論理アドレスは、ＬＢＡ（Ｌｏｇｉｃａｌ  Ｂｌｏｃｋ  Ａｄｄｒｅｓｓ）によって指定され、
前記制御部は、
前記Ｉ／Ｏ要求に含まれる前記ボリュームのＬＢＡと、前記分割ブロックサイズ当たりのＬＢＡ数と、前記ボリューム番号と、前記装置数とから、前記Ｉ／Ｏ要求を処理するストレージ制御装置を識別する装置番号を導出する数式を用いて、前記Ｉ／Ｏ要求を処理するストレージ制御装置を決定する、ことを特徴とする付記２に記載のストレージ制御装置。
【０１２０】
（付記４）前記制御部は、
決定した前記Ｉ／Ｏ要求を処理するストレージ制御装置が自装置であれば、前記Ｉ／Ｏ要求を処理し、
決定した前記Ｉ／Ｏ要求を処理するストレージ制御装置が他装置であれば、前記Ｉ／Ｏ要求を前記他装置に転送する、
ことを特徴とする付記１〜３のいずれか一つに記載のストレージ制御装置。
【０１２１】
（付記５）前記論理アドレスは、ＬＢＡ（Ｌｏｇｉｃａｌ  Ｂｌｏｃｋ  Ａｄｄｒｅｓｓ）によって指定され、
前記制御部は、
前記Ｉ／Ｏ要求に含まれる前記ボリュームのＬＢＡと、前記分割ブロックサイズ当たりのＬＢＡ数と、前記装置数とから、前記Ｉ／Ｏ要求を処理するストレージ制御装置を識別する装置番号を導出する数式を用いて、前記Ｉ／Ｏ要求を処理するストレージ制御装置を決定する、ことを特徴とする付記１に記載のストレージ制御装置。
【０１２２】
（付記６）前記制御部は、
前記Ｉ／Ｏ要求に含まれる前記ボリュームの先頭ＬＢＡおよび範囲と、前記分割ブロックサイズ当たりのＬＢＡ数とに基づいて、Ｉ／Ｏ範囲が前記ボリュームの複数の分割ブロックに跨る場合は、前記Ｉ／Ｏ範囲を複数のＩ／Ｏ範囲に分割し、
分割した前記複数のＩ／Ｏ範囲それぞれに対するＩ／Ｏ要求について、前記複数のストレージ制御装置から当該Ｉ／Ｏ要求を処理するストレージ制御装置を決定する、
ことを特徴とする付記３または５に記載のストレージ制御装置。
【０１２３】
（付記７）前記制御部は、
前記上位装置からのＩ／Ｏ要求を他のストレージ制御装置から受け付けた場合、当該Ｉ／Ｏ要求を処理して、前記他のストレージ制御装置に処理結果を通知する、
ことを特徴とする付記１〜６のいずれか一つに記載のストレージ制御装置。
【０１２４】
（付記８）ボリューム内の論理ブロックを指定する論理アドレスを含むＩ／Ｏ要求を上位装置から受け付け、
受け付けた前記Ｉ／Ｏ要求に含まれる前記論理アドレスと、前記ボリュームを区切る分割ブロックサイズ当たりの論理ブロック数と、前記ボリュームに割り当てる物理記憶領域を有するストレージにアクセス可能な複数のストレージ制御装置の装置数とに基づいて、前記複数のストレージ制御装置から前記Ｉ／Ｏ要求を処理するストレージ制御装置を決定する、
処理をコンピュータに実行させることを特徴とするストレージ制御プログラム。
【０１２５】
（付記９）前記決定する処理は、
前記論理アドレスと、前記論理ブロック数と、前記ボリュームを識別するボリューム番号と、前記装置数とに基づいて、前記複数のストレージ制御装置から前記Ｉ／Ｏ要求を処理するストレージ制御装置を決定する、ことを特徴とする付記８に記載のストレージ制御プログラム。
【０１２６】
（付記１０）複数のストレージ制御装置と、前記複数のストレージ制御装置がアクセス可能なストレージとを含むストレージシステムであって、
前記複数のストレージ制御装置のいずれかのストレージ制御装置が、
ボリューム内の論理ブロックを指定する論理アドレスを含むＩ／Ｏ要求を上位装置から受け付け、
受け付けた前記Ｉ／Ｏ要求に含まれる前記論理アドレスと、前記ボリュームを区切る分割ブロックサイズ当たりの論理ブロック数と、前記複数のストレージ制御装置の装置数とに基づいて、前記複数のストレージ制御装置から前記Ｉ／Ｏ要求を処理するストレージ制御装置を決定する、
ことを特徴とするストレージシステム。
【０１２７】
（付記１１）前記ストレージ制御装置が、
前記論理アドレスと、前記論理ブロック数と、前記ボリュームを識別するボリューム番号と、前記装置数とに基づいて、前記複数のストレージ制御装置から前記Ｉ／Ｏ要求を処理するストレージ制御装置を決定する、ことを特徴とする付記１０に記載のストレージシステム。
【符号の説明】
【０１２８】
１０１，１０１−１〜１０１−ｎ  ストレージ制御装置
１０２  ストレージ
１０３  上位装置
１１０，Ｖ  ボリューム
２００  ストレージシステム
２０１  ホスト装置
３０１  ＣＰＵ
３０２  メモリ
３０３  通信Ｉ／Ｆ
３０４  Ｉ／Ｏコントローラ
５０１  受付部
５０２  決定部
５０３  転送部
５０４  処理部
ｄ  ドライブ
ＤＧ１，ＤＧ２  ドライブグループ
ｍｔ  論物メタ
Ｎ，Ｎ１〜Ｎ４  ノード
ＮＢ１，ＮＢ２  ノードブロック
【図１】
2018205936.tif 000003
【図２】
2018205936.tif 000004
【図３】
2018205936.tif 000005
【図４】
2018205936.tif 000006
【図５】
2018205936.tif 000007
【図６】
2018205936.tif 000008
【図７】
2018205936.tif 000009
【図８】
2018205936.tif 000010
【図９】
2018205936.tif 000011
【図１０】
2018205936.tif 000012