(57)【特許請求の範囲】
【請求項１】
夫々２以上の異なる方向に相互に接続される複数の物理メモリノードと、
外部からの要求に応じてコマンドを発行するコントロールユニットと、
を備え、
各物理メモリノードは、他の物理メモリノードとともに複数の論理メモリノードのうちの一を構成し、
各論理メモリノードは、外部からライトされる第１データを第１の物理メモリノードに記憶し、前記第１データの冗長データである第２データを前記第１の物理メモリノードと異なる第２の物理メモリノードに記憶し、
前記コマンドは、前記複数の論理メモリノードのうちの一を指定する第１アドレスと、論理メモリノード毎に割り当てられたメモリ空間内の前記第１データの記憶位置を指定する第２アドレスと、を備え、
各論理メモリノードは、前記第１アドレスが自論理メモリノードを指定しない場合、前記コマンドを他の論理メモリノードに転送し、前記第１アドレスが自論理メモリノードを指定する場合、前記第２アドレスに基づいて前記第１の物理メモリノード内の前記第１データの第１の記憶位置を演算するとともに前記第１の記憶位置に記憶される第１データに対応する第２データの前記第２の物理メモリノード内の第２の記憶位置を演算し、演算された各記憶位置に前記コマンドに応じたアクセスを行う、
ことを特徴とするストレージシステム。 
【請求項２】
各論理メモリノードは、前記コマンドがリードコマンドである場合、前記第１の記憶位置から前記第１データをリードし、リードに失敗した場合、前記第２の記憶位置から前記第２データをリードし、前記リードされた第２データを用いて前記リードに失敗した第１データを復元する、
ことを特徴とする請求項１に記載のストレージシステム。 
【請求項３】
各論理メモリノードは、前記コマンドがライトコマンドである場合、前記第１の記憶位置に記憶される前記第１データを更新するとともに、前記第２の記憶位置に記憶される前記第２データを前記第１データの更新に応じて更新する、
ことを特徴とする請求項１に記載のストレージシステム。 
【請求項４】
各物理メモリノードは、前記第２アドレスに基づいて前記第１の記憶位置を演算し、前記第１アドレスと前記第１の記憶位置との対が自物理メモリノードを示す場合には、前記演算された第１の記憶位置に対して前記コマンドに応じたアクセスを行い、前記第１アドレスと前記第１の記憶位置との対が自物理メモリノードを示さない場合には、自物理メモリノードに隣接された他の物理メモリノードに前記コマンドを転送する、
ことを特徴とする請求項１に記載のストレージシステム。 
【請求項５】
各物理メモリノードは、前記第１アドレスと前記第１の記憶位置との対が自物理メモリノードを示し、かつ、前記コマンドがリードコマンドである場合、前記第１の記憶位置から前記第１データをリードし、リードに失敗した場合、前記第２の記憶位置を演算し、自物理メモリノードと同一の論理メモリノードに属する第２の物理メモリノード内の前記第２の記憶位置から前記第２データをリードし、前記リードされた第２データを用いて前記リードに失敗した第１データを復元する、
ことを特徴とする請求項４に記載のストレージシステム。 
【請求項６】
各物理メモリノードは、前記第１アドレスと前記第１の記憶位置との対が自物理メモリノードを示し、かつ、前記コマンドがライトコマンドである場合、前記第１の記憶位置に記憶される前記第１データを更新し、前記第２の記憶位置を演算し、自物理メモリノードと同一の論理メモリノードに属する第２の物理メモリノード内の前記第２の記憶位置に記憶される前記第２データを前記第１データの更新に応じて更新する、
ことを特徴とする請求項４に記載のストレージシステム。 
【請求項７】
着脱可能なブレード基盤を複数備え、
各論理メモリノードを構成する第１の物理メモリノードと第２の物理メモリノードとは、夫々異なるブレード基盤に実装される、
ことを特徴とする請求項１〜６の何れか一項に記載のストレージシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明の実施形態は、ストレージシステムに関する。
【背景技術】
【０００２】
近年、ストレージシステムを備えた複数台の情報処理装置を、相互にネットワークで接続して、一つの情報処理システムとして動作させる場合（例えばクラウドコンピューティング）が増加している。また、ストレージシステムとしても、従来型のＨＤＤを使用したものと比較してより高速な、ＤＲＡＭチップやＮＡＮＤフラッシュチップなどを多数並べてチップ間配線によって接続し、一つのストレージシステムとして用いられるものが存在する。
【０００３】
このような、複数の情報処理装置を接続して成る単一の情報システムでは、システムを構成する情報処理装置の台数を増やすことで性能向上が図られている。しかしながら、台数が増加した大規模な情報処理システムにおいては、管理などのために必要となる外部リソースが増大する、などの問題があった。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特表２０１２−５１８８４３号公報
【特許文献２】特表２００８−５３７２６５号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
本発明の一つの実施形態は、必要な外部リソースを可及的に少なくすることができるストレージシステムを提供することを目的とする。
【課題を解決するための手段】
【０００６】
本発明の一つの実施形態によれば、ストレージシステムは、夫々２以上の異なる方向に相互に接続される複数の物理メモリノードと、外部からの要求に応じてコマンドを発行するコントロールユニットと、を備える。各物理メモリノードは、他の物理メモリノードとともに複数の論理メモリノードのうちの一を構成する。各論理メモリノードは、外部からライトされる第１データを第１の物理メモリノードに記憶し、前記第１データの冗長データである第２データを前記第１の物理メモリノードと異なる第２の物理メモリノードに記憶する。前記コマンドは、前記複数の論理メモリノードのうちの一を指定する第１アドレスと、論理メモリノード毎に割り当てられたメモリ空間内の前記第１データの記憶位置を指定する第２アドレスと、を備える。各論理メモリノードは、前記第１アドレスが自論理メモリノードを指定しない場合、前記コマンドを他の論理メモリノードに転送する。各論理メモリノードは、前記第１アドレスが自論理メモリノードを指定する場合、前記第２アドレスに基づいて前記第１の物理メモリノード内の前記第１データの第１の記憶位置を演算するとともに前記第１の記憶位置に記憶される第１データに対応する第２データの前記第２の物理メモリノード内の第２の記憶位置を演算し、演算された各記憶位置に前記コマンドに応じたアクセスを行う。
【図面の簡単な説明】
【０００７】
【図１】図１は、第１の実施形態に係るストレージシステムの構成例を示す図である。
【図２】図２は、ＬＭＮの構成の一例を示す図である。
【図３】図３は、ＰＭＮの物理的な配置の一例を示す図である。
【図４】図４は、ＣＵの構成の一例を示す図である。
【図５】図５は、ＰＭＮの構成の一例を示す図である。
【図６】図６は、ＰＭＮのパッケージ構成の一例を示す図である。
【図７】図７は、メモリ構成に着目したＰＭＮの構成の一例を示す図である。
【図８】図８は、ＬＭＮ＿ＬＢＡから物理アドレスを正引き変換する処理を示す図である。
【図９】図９は、変換アルゴリズムの一例を説明する図である。
【図１０】図１０は、ＣＵからのパケットの受信時のコントローラの動作を示すフローチャートである。
【図１１】図１１は、ＣＵからのライトコマンドの処理例（第１のライト処理）を示すシーケンス図である。
【図１２】図１２は、ＣＵからのライトコマンドの別の処理例（第２のライト処理）を示すシーケンス図である。
【図１３】図１３は、ＣＵからのライトコマンドの別の処理例（第３のライト処理）を示すシーケンス図である。
【図１４】図１４は、ＣＵからのライトコマンドの別の処理例（第４のライト処理）を示すシーケンス図である。
【図１５】図１５は、ＣＵからのリードコマンドの処理例（第１のリード処理）を示すシーケンス図である。
【図１６】図１６は、ＣＵからのリードコマンドの別の処理例（第２のリード処理）を示すシーケンス図である。
【図１７】図１７は、ＣＵからのリードコマンドの別の処理例（第３のリード処理）を示すシーケンス図である。
【図１８】図１８は、第２の実施形態に係るストレージシステムの構成例を示す図である。
【図１９】図１９は、変換テーブルの構成例を示す図である。
【図２０】図２０は、変換テーブルの構成例を示す図である。
【図２１】図２１は、変換テーブルが記憶されるＭＮを示す図である。
【図２２】図２２は、メモリ構成に着目した第２の実施形態のＭＮの構成の一例を示す図である。
【図２３】図２３は、ＣＵからのリードコマンドの第２の実施形態の処理例を示すシーケンス図である。
【図２４】図２４は、ＣＵからのライトコマンドの第２の実施形態の処理例を示すシーケンス図である。
【図２５】図２５は、変換テーブルのエントリ数が所定値に達した場合の処理例を示すシーケンス図である。
【図２６】図２６は、リード処理の実行時におけるリードコマンドの転送経路を示す図である。
【図２７】図２７は、リード処理の実行時におけるデータの転送経路を示す図である。
【図２８】図２８は、ライト処理の実行時におけるＡＣＫの転送経路を示す図である。
【図２９】図２９は、第３の実施形態の変換テーブルの構成例を示す図である。
【図３０】図３０は、Root K2Kのエントリ数が所定値に達した場合の処理例を示すシーケンス図である。
【発明を実施するための形態】
【０００８】
以下に添付図面を参照して、実施形態にかかるストレージシステムを詳細に説明する。なお、これらの実施形態により本発明が限定されるものではない。
【０００９】
（第１の実施形態）
図１は、第１の実施形態に係るストレージシステムの構成例を示す図である。ストレージシステム１は、ネットワーク２を介して１以上のサーバ３に接続される。
【００１０】
サーバ３は、所定の処理を実行するコンピュータである。サーバ３は、典型的には、プロセッサ、メインメモリ、通信インターフェース、およびローカル入出力装置を備えて構成される。プロセッサは、各種プログラム（例えばデバイスドライバ、オペレーティングシステム（ＯＳ）、またはアプリケーションプログラム）をメインメモリに展開する。そしてプロセッサは、メインメモリに展開された各種プログラムを実行することによって、所定の処理を実現する。また、サーバ３は、所定の処理の一環として、データをストレージシステム１にライトしたりデータをストレージシステム１からリードしたりすることができる。即ち、サーバ３は、ストレージシステム１に対してホストとして機能する。なお、任意のコンピュータがストレージシステム１のホストとして機能することができる。
【００１１】
サーバ３によるストレージシステム１へのＩ／Ｏアクセスは、ネットワーク２を介して実行される。ネットワーク２の規格は任意である。ネットワーク２としては、例えばファイバーチャネル、イーサネット、ＳＡＮ(Storage Area Network)、またはＮＡＳ(Network Attached Storage)が適用可能である。ネットワーク２は、ネットワークスイッチ、ハブ、またはロードバランサを含む。
【００１２】
ストレージシステム１は、複数の論理メモリノード（ＬＭＮ）１１と、１以上のコントロールユニット（ＣＵ）１４と、を備える。ストレージシステム１は、複数のＬＭＮ１１にデータを分散して記憶することができる。図１の例においては、各ＬＭＮ１１は、矩形格子の格子点に配置される。各ＣＵ１４は、ＬＭＮ１１の配列の外周部に配置される。格子点の座標を座標（ｘ、ｙ）で示し、格子点に配置されるＬＭＮ１１の位置情報は、当該格子点の座標と対応して論理メモリノードアドレス（ｘ、ｙ）で示されるものとする。また、図１の例においては、左上隅に位置するＬＭＮ１１が原点の論理メモリノードアドレス（０、０）を有し、各ＬＭＮ１１を横方向（Ｘ方向）および縦方向（Ｙ方向）に移動することで、論理メモリノードアドレスが整数値で増減する。以降、論理メモリノードアドレスをＬＭＮＡと表記する。なお、各ＣＵ１４もＬＭＮＡを有していてもよい。例えば、原点のＬＭＮ１１に接続される２つのＣＵ１４のうち、Ｘ方向に接続されるＣＵ１４はＬＭＮＡ（−１、０）を有し、Ｙ方向に接続されるＣＵ１４はＬＭＮＡ（０、−１）を有してもよい。
【００１３】
各ＬＭＮ１１は、２以上の入出力ポート１６を備える。各ＬＭＮ１１は、２以上の異なる方向に隣接するＬＭＮ１１と、入出力ポート１６を介して接続される。図１において左上隅のＬＭＮＡ（０、０）で示されるＬＭＮ１１は、Ｘ方向に隣接するＬＭＮＡ（１、０）で表されるＬＭＮ１１と、Ｘ方向とは異なる方向であるＹ方向に隣接するＬＭＮＡ（０、１）で表されるＬＭＮ１１と、それぞれ接続される。また、図１においてＬＭＮＡ（１、１）で表されるＬＭＮ１１は、互いに異なる４の方向に隣接する、ＬＭＮＡ（１、０）、（０、１）、（２、１）および（１、２）でそれぞれ示される４のＬＭＮ１１に接続される。
【００１４】
図１では、各ＬＭＮ１１が矩形格子の格子点に配置されるように示したが、各ＬＭＮ１１の配置の様態は、この例に限定されない。すなわち、格子の形状は、格子点に配置される各ＬＭＮ１１が２以上の異なる方向に隣接するＬＭＮ１１と接続されればよく、例えば三角形、六角形などでもよい。また、図１では各ＬＭＮ１１が２次元状に配置されているが、各ＬＭＮ１１を３次元的に配置しても構わない。３次元的にＬＭＮ１１を配置した場合は、（ｘ、ｙ、ｚ）の３つの値で各ＬＭＮ１１を指定することができる。また、ＬＭＮ１１が２次元的に配置される場合には、対辺に位置するＬＭＮ１１同士を接続することによって、ＬＭＮ１１をトーラス状に接続するようにしてもよい。
【００１５】
図２は、ＬＭＮ１１の構成の一例を示す図である。ＬＭＮ１１は、３つの物理メモリノード（ＰＭＮ）２１−０〜２１−２を含んで構成される。同一のＬＭＮ１１を構成するＰＭＮ２１−０、ＰＭＮ２１−１、およびＰＭＮ２１−２は、アドレスＩＰＭＮＡを用いて夫々識別される。ここでは、ＰＭＮ２１−０にはＩＰＭＮＡ＝０が割り当てられ、ＰＭＮ２１−１にはＩＰＭＮＡ＝１が割り当てられ、ＰＭＮ２１−２にはＩＰＭＮＡ＝２が割り当てられているものとする。以降、ＰＭＮ２１−０〜ＰＭＮ２１−２を総称してＰＭＮ２１と表記することがある。
【００１６】
ＰＭＮ２１−０、ＰＭＮ２１−１、およびＰＭＮ２１−２は、Ｘ方向にこの順番で配置される。Ｘ方向に隣接する任意の２つのＰＭＮ２１は、同一のＬＭＮ１１に属するか互いに異なるＬＭＮ１１に属するかを問わず、入出力ポート１６を介して接続される。Ｘ方向に隣接する２つのＬＭＮ１１の夫々に属する３つのＰＭＮ２１は、入出力ポート１６を介して一対一で接続される。具体的には、Ｘ方向に隣接する２つのＬＭＮ１１の夫々に属するＰＭＮ２１−０は、入出力ポート１６を介して相互に接続される。Ｘ方向に隣接する２つのＬＭＮ１１の夫々に属するＰＭＮ２１−１は、入出力ポート１６を介して相互に接続される。Ｘ方向に隣接する２つのＬＭＮ１１の夫々に属するＰＭＮ２１−２は、入出力ポート１６を介して相互に接続される。このように、各ＰＭＮ２１は、夫々２以上の異なる方向に相互に接続され、他のＰＭＮ２１とともに複数のＬＭＮ１１のうちの１つを構成する。
【００１７】
なお、図１に示すＬＭＮ１１の配置は論理的なものであってよく、物理的な配置が必ずしもそのとおりになっていなくてもよい。また、図２に示すＰＭＮ２１の配置は、論理的なものであってもよく、物理的な配置が必ずしもそのとおりになっていなくてもよい。また、ＰＭＮ２１−０〜ＰＭＮ２１−２は、Ｘ方向でなくＹ方向に配置されてもよい。また、Ｘ方向に隣接する３つのＰＭＮ２１が１つのＬＭＮ１１を構成するとして説明するが、互いに隣接しない３つまたは３以外の複数のＰＭＮ２１が１つのＬＭＮ１１を構成するようにしてもよい。
【００１８】
また、ＬＭＮ１１は、冗長データを記憶することができる。具体的には、ＬＭＮ１１は、ＰＭＮ２１−０〜ＰＭＮ２１−２のうちの一部（第１の物理メモリノード）に外部からライトされるデータ（第１データ）を記憶し、ＰＭＮ２１−０〜ＰＭＮ２１−２のうちの第１の物理メモリノードと異なる第２の物理メモリノードに第１データの冗長データである第２データを記憶する。ここでは、冗長データの記憶方式として、ＰＭＮ２１−０〜ＰＭＮ２１−２はＲＡＩＤ５を構成するとして説明するが、ＰＭＮ２１−０〜ＰＭＮ２１−２はＲＡＩＤ５以外の記憶方式（例えばＲＡＩＤ０、ＲＡＩＤ２、ＲＡＩＤ６、ＲＡＩＤ−Ｚ、またはＲｅｅｄ  Ｓｏｌｏｍｏｎ符号）を構成してもよい。
【００１９】
図３は、ＰＭＮ２１の物理的な配置の一例を示す図である。ＰＭＮ２１はメモリノード基盤（ブレード基盤）２２の上に実装されており、ブレード基盤２２は着脱可能な様態で基盤２３上に実装されている。１つのブレード基盤２２には、３つのＰＭＮ２１がＹ方向に配置されて実装されている。そして、同一のＬＭＮ１１に属する３つのＰＭＮ２１は夫々異なる複数のブレード基盤２２に属する。ＰＭＮ２１間は、基盤配線２４、２５、２６を介して互いに電気的に接続される。なお、基盤配線２４、２５、２６は、入出力ポート１６を備える。同一のブレード基盤２２に実装された３つのＰＭＮ２１のうちの隣接する任意の２つのＰＭＮ２１は、ブレード基盤２２上の基盤配線２４を介して相互に接続される。異なるブレード基盤２２に属するＸ方向に隣接する任意の２つのＰＭＮ２１は、基盤配線２５を介して相互に接続される。なお、図示しないが、Ｙ方向にも複数のブレード基盤２２が配置される。異なるブレード基盤２２に属するＹ方向に隣接する任意の２つのＰＭＮ２１は、基盤配線２６を介して相互に接続される。基盤配線２５、２６は、着脱可能なコネクタを備えており、ブレード基盤２２が基盤２３からの着脱がコネクタの作用によって可能となっている。
【００２０】
同一のＬＭＮ１１に属するＰＭＮ２１は、それぞれ異なるブレード基盤２２に配置されるとともにＲＡＩＤ５を構成する。このため、ブレード基盤２２の交換が行われた場合であっても、旧ブレード基盤２２に実装されたＰＭＮ２１に記憶されるデータは、ＲＡＩＤ５を構成する他のＰＭＮ２１に記憶されるデータに基づいて復元され、新ブレード基盤２２に実装されたＰＭＮ２１に記憶させることが可能となる。したがって、１つのＰＭＮ２１が故障した場合、故障したＰＭＮ２１が実装されているブレード基盤２２を交換することで、ストレージシステム１に記憶されたデータを失うことなくデータの引き継ぎが可能となる。本実施形態においてはＲＡＩＤ５が採用されているため、同一のＬＭＮ１１あたり同時に１台までのＰＭＮ２１の故障に対応することができる。なお、ＲＡＩＤ６が採用される場合、同一のＬＭＮ１１あたり同時に２台までのＰＭＮ２１の故障に対応することが可能となる。
【００２１】
図１に示すように、各ＣＵ１４は、入出力ポート１６を介してＬＭＮ１１（より詳しくはＬＭＮ１１を構成するＰＭＮ２１）に接続される。このとき、ＬＭＮ１１同士の通信規格とＣＵ１４の通信規格とが異なる場合は、両者の間にアダプタを設けてもよい。図１の例では、ＣＵ１４は、各ＬＭＮ１１が配置される２次元の正方格子のＸ方向およびＹ方向それぞれの一方向の各端に、それぞれ接続されている。なお、Ｘ方向に接続されるＣＵ１４は、ＬＭＮ１１を構成する３つのＰＭＮ２１に接続されてもよいし、ＬＭＮ１１を構成する３つのＰＭＮ２１のうちの１に接続されてもよい。
【００２２】
ＣＵ１４は、サーバ３からの要求に応じて、ＰＭＮ２１が転送したり実行したりすることが可能なパケット形式のコマンドを生成する。そして、ＣＵ１４は、生成したコマンドを発行する。具体的には、ＣＵ１４は、生成したコマンドを、自ＣＵ１４に接続されているＰＭＮ２１に送信する。例えば、ＣＵ１４は、サーバ３からアクセス要求（リード要求またはライト要求）を受信したとき、要求されたアクセスを実行するためのコマンドを生成する。ＣＵ１４が生成するコマンドについては後述する。なお、ＣＵ１４が発行するコマンドと同じ形式のコマンドをサーバ３が発行し、ＣＵ１４はサーバ３が発行したコマンドを自ＣＵ１４に接続されているＰＭＮ２１に転送してもよい。
【００２３】
コマンドは、そのコマンドを受信したＰＭＮ２１が、自ＰＭＮ２１に隣接するＰＭＮ２１のうちから所定の転送アルゴリズム（後述する）に基づいて転送先のＰＭＮ２１を決定することで、ＰＭＮ２１間を転送されて、宛先のＰＭＮ２１に到達する。また、ＰＭＮ２１は、転送アルゴリズムに基づいて、故障または混雑しているＰＭＮ２１を迂回するようにルーティング先を決定することができる。
【００２４】
図４は、ＣＵ１４の構成の一例を示す図である。ＣＵ１４は、マイクロプロセッサ（ＭＰＵ）１１０、主記憶となるランダムアクセスメモリ（ＲＡＭ）１２０、第１のインターフェース装置１４０、第２のインターフェース装置１５０を備える。第１のインターフェース装置１４０は、ネットワーク２と通信するためのものである。第２のインターフェース装置１５０は、ＰＭＮ２１と通信をするためのものである。ＭＰＵ１１０、ＲＡＭ１２０、第１のインターフェース装置１４０および第２のインターフェース装置１５０は、互いにＢＵＳ１３０によって接続されている。ＣＵ１４は、パケット形式のコマンドを発行する。ＣＵ１４が発行するコマンドは、ＬＭＮ１１のうちの１つを指定するＬＭＮＡと、ＬＭＮ１１毎に割り当てられた、外部から指定可能なメモリ空間内における位置を指定するＬＭＮ＿ＬＢＡと、をアクセス先を示す情報として少なくとも含む。
【００２５】
なお、たとえばＣＵ１４は、ＰＭＮ２１の座標をＬＭＮ１１毎に管理するテーブルを記憶することでＬＭＮ１１を構成するＰＭＮ２１の動的な変更を実行してもよい。物理的に故障してアクセス不能となったＰＭＮ２１がある場合、ＣＵ１４が、故障したＰＭＮ２１とストレージシステム１内の空のＰＭＮ２１とでＬＭＮ１１の割り当てを論理的に組み替えることによって、ブレード基盤２２の交換を行うことなくストレージシステム１が運用を継続することが可能となる。
【００２６】
図５は、ＰＭＮ２１の構成の一例を示す図である。ＰＭＮ２１は、コントローラ２００と、ストレージメモリとしてのＮＡＮＤメモリ３００とを備える。なお、ストレージメモリとしては、ＮＡＮＤメモリ３００のほかに、ビットコストスケーラブルメモリ（ＢｉＣＳ）、磁気抵抗メモリ（ＭＲＡＭ）、相変化メモリ（ＰｃＲＡＭ）、または、抵抗変化型メモリ（ＲＲＡＭ（登録商標））等が適用可能である。
【００２７】
ＮＡＮＤメモリ３００は、４つのＮＡＮＤメモリチップ（ダイ）３０１を含んで構成される。各ＮＡＮＤメモリチップ３０１は、記憶領域を提供するメモリセルアレイを備える。コントローラ２００とＮＡＮＤメモリチップ３０１とは、１乃至複数のＩＯチャネルと、１乃至複数のチップイネーブル信号とで電気的に接続される。本実施形態においては、ＰＭＮ２１は、２対のＩＯチャネル（ｃｈ０、ｃｈ１）と、２対のチップイネーブル信号（ＣＥ０、ＣＥ１）とを備えることで、コントローラ２００は４つのＮＡＮＤメモリチップ３０１を夫々独立して選択することが可能となっている。なお、ＮＡＮＤメモリチップ３０１は、たとえばＬＵＮなどのようなアドレス信号で選択されるようにしてもよい。コントローラ２００は、複数のＩＯチャネルおよび複数のチップイネーブル信号を制御することによって、複数のＮＡＮＤメモリチップ３０１に対して並列にアクセスすることができる。
【００２８】
コントローラ２００は、４つの入出力ポート１６が接続される。コントローラ２００は、ＣＵ１４または他のＰＭＮ２１から入出力ポート１６を介してパケットを受信したり、ＣＵ１４または他のＰＭＮ２１に入出力ポート１６を介してパケットを送信したりする。コントローラ２００は、受信したパケットの宛先が自ＰＭＮ２１である場合には、そのパケット（そのパケットに記録されるコマンド）に応じた処理を実行する。例えば、コマンドがアクセスコマンド（リードコマンドまたはライトコマンド）である場合には、コントローラ２００はＮＡＮＤメモリ３００に対するアクセスを実行する。
【００２９】
図６は、ＰＭＮ２１のパッケージ構成の一例を示す図である。コントローラ２００は、１つのダイで構成される。そして、コントローラ２００と、各ＮＡＮＤメモリ３００とは、スタックされるとともに、樹脂を用いて１つのパッケージに封止される。つまり、各ＰＭＮ２１は夫々個別のパッケージとして構成される。
【００３０】
図７は、メモリ構成に着目したＰＭＮ２１の構成の一例を示す図である。コントローラ２００は、ＣＰＵ２１０およびランダムアクセスメモリ（ＲＡＭ）２２０を備える。ＮＡＮＤメモリ３００は、ＦＷ領域３１０、管理領域３２０、およびデータ領域３３０を備える。なお、各領域３１０〜３３０は、何れのＮＡＮＤメモリチップ３０１の記憶領域に確保されるかは任意である。ＦＷ領域３１０は、ファームウェアプログラム３１１を予め記憶する。管理領域３２０は、自ＰＭＮ２１が属するＬＭＮ１１のＬＭＮＡ３２１と、自ＰＭＮ２１に割り当てられたＩＰＭＮＡ３２２と、メタデータ３２３と、変換アルゴリズム３２４とを記憶する。
【００３１】
ＣＰＵ２１０は、ファームウェアプログラム３１１を実行することによって、コントローラ２００の機能を実現する。コントローラ２００の機能とは、例えば、パケットの送受信、コマンドの実行、ＮＡＮＤメモリ３００にライトするデータのＥＣＣ符号化、ＮＡＮＤメモリ３００からリードしたデータのＥＣＣ復号化、ウェアレベリング、およびコンパクションを含む。なお、ＥＣＣ符号の方式は任意である。例えば、Cyclic Redundancy Check(ＣＲＣ)符号、Bose-Chaudhuri-Hocquenghem (ＢＣＨ)符号、Reed-Solomon (ＲＳ)符号、またはLow-Density Parity-Check (ＬＤＰＣ)符号が採用可能である。また、本実施形態においては、ＣＰＵ２１０は、ＲＡＩＤ５を利用したエラー訂正を実現することができる。
【００３２】
ＲＡＭ２２０は、ＮＡＮＤメモリ３００にリード／ライトされるデータのバッファ、送受信されるパケットのバッファ、ファームウェアプログラム３１１の展開領域、または各種管理情報（ＬＭＮＡ３２１、ＩＰＭＮＡ３２２、メタデータ３２３、および変換アルゴリズム３２４）の展開領域として使用される。なお、ＲＡＭ２２０は、コントローラ２００の外部メモリとしてＰＭＮ２１内に具備されてもよい。
【００３３】
ＬＭＮＡは、各ＬＭＮ１１を全てのＬＭＮ１１のうちから一意に特定するための識別情報である。また、ＩＰＭＮＡは、各ＰＭＮ２１を同一のＬＭＮ１１に属する全てのＰＭＮ２１のうちから一意に特定するための識別情報である。即ち、ストレージシステム１に具備される各ＰＭＮ２１は、ＬＭＮＡとＩＰＭＮＡとの対によって一意に特定される。管理領域３２０には、例えばストレージシステム１の初期化時、またはブレード基盤２２の新規挿入時などのタイミングで、ＣＵ１４などによってＬＭＮＡ３２１およびＩＰＭＮＡ３２２が格納される。
【００３４】
変換アルゴリズム３２４は、パケットに記述されるＬＭＮ＿ＬＢＡからＩＰＭＮＡとＰＭＮ＿ＬＢＡとに変換するための演算方法を記述した情報である。変換アルゴリズム３２４は、少なくとも同一のＬＭＮ１１に属する全てのＰＭＮ２１間で共通化されている。変換アルゴリズム３２４は、ストレージシステム１に具備される全てのＰＭＮ２１間で共通化されてもよい。ＬＭＮ＿ＬＢＡは、１つのＬＭＮ１１が構成する記憶領域内の位置を論理的に示す情報である。ＰＭＮ＿ＬＢＡは、１つのＰＭＮ２１が構成する記憶領域内の位置を論理的に示す情報である。メタデータ３２３は、ＰＭＮ＿ＬＢＡとＮＡＮＤメモリ３００内の位置を物理的に示す情報（物理アドレス）との対応関係を記録した情報である。ＰＭＮ＿ＬＢＡと物理アドレスとの関係は、ライト、イレース、およびウェアレベリングによって刻々と変化する。ＣＰＵ２１０は、ＰＭＮ＿ＬＢＡと物理アドレスとの関係が変化する毎にメタデータ３２３を更新する。
【００３５】
図８は、ＬＭＮ＿ＬＢＡから物理アドレスを正引き変換する処理を示す図である。ＣＰＵ２１０が変換アルゴリズム３２４に従ってＬＭＮ＿ＬＢＡをＩＰＭＮＡとＰＭＮ＿ＬＢＡとに変換する。ＩＰＭＮＡとＰＭＮ＿ＬＢＡとが演算した後、ＣＰＵ２１０は、メタデータ３２３を参照してＰＭＮ＿ＬＢＡを物理アドレスに変換することができる。
【００３６】
図９は、変換アルゴリズム３２４の一例を説明する図である。この例においては、ＬＭＮ＿ＬＢＡが右方向に１ビットだけシフト演算され、シフト演算によって得られた値がＰＭＮ＿ＬＢＡとされる。また、ＬＭＮ＿ＬＢＡの値と、ＰＭＮ＿ＬＢＡと、の関係から、ＩＰＭＮＡが演算される。図９の表のカラムは、ＰＭＮ＿ＬＢＡの値を示し、ロウは、ＩＰＭＮＡの値を示し、各マスは、ＬＭＮ＿ＬＢＡの値を示す。なお、Ｐ（ａ、ｂ）は、ＬＭＮ＿ＬＢＡ＝ａの位置に記憶されるデータと、ＬＭＮ＿ＬＢＡ＝ｂの位置に記憶されるデータと、から演算されるパリティである。以降、ＬＭＮ＿ＬＢＡ＝ａ（またはＬＭＮ＿ＬＢＡ＝ａの位置に記憶されるデータ）と、ＬＭＮ＿ＬＢＡ＝ｂ（またはＬＭＮ＿ＬＢＡ＝ｂの位置に記憶されるデータ）と、Ｐ（ａ、ｂ）が記憶される位置（またはＰ（ａ、ｂ））と、からなるグループを、パリティグループと表記する。
【００３７】
例えば、図９に示す例によれば、ＩＰＭＮＡ＝１およびＰＭＮ＿ＬＢＡ＝２の対によって特定される位置には、ＬＭＮ＿ＬＢＡ＝４がマッピングされる。ＩＰＭＮＡ＝２およびＰＭＮ＿ＬＢＡ＝２の対によって特定される位置には、ＬＭＮ＿ＬＢＡ＝５がマッピングされる。そして、ＰＭＮ＿ＬＢＡ＝２およびＩＰＭＮＡ＝０の対によって特定される位置には、ＬＭＮ＿ＬＢＡ＝４の位置に記憶されるデータとＬＭＮ＿ＬＢＡ＝５の位置に記憶されるデータとから演算されるパリティが記憶される。このように、ＰＭＮ２１は、変換アルゴリズム３２４を用いることによって、ＬＭＮ＿ＬＢＡによって指定される位置だけでなく、その位置に格納されるデータと同一のパリティグループに属する、他のデータおよびパリティが格納される夫々の位置を、特定することができる。
【００３８】
なお、変換アルゴリズム３２４は、ＬＭＮ＿ＬＢＡから、外部からライトされた第１データが記憶される第１の物理メモリノード内における記憶位置と、当該第１データの冗長データである第２データが記憶される第２の物理メモリノード内における記憶位置と、の両方が演算可能であれば、上記の例だけに限定されない。
【００３９】
次に、第１の実施形態のストレージシステム１の動作を説明する。
【００４０】
図１０は、ＣＵ１４からのパケットの受信時のコントローラ２００の動作を示すフローチャートである。図１０に示すコントローラ２００の動作は、ＣＰＵ２１０がファームウェアプログラム３１１を実行することによって実現される。簡単のために、コントローラ２００を動作の主体として説明する。
【００４１】
コントローラ２００は、パケットを受信すると（Ｓ１）、パケットの宛て先は自ＰＭＮ２１が属するＬＭＮ１１であるか否かを判定する（Ｓ２）。具体的には、コントローラ２００は、パケットに記録されているＬＭＮＡと管理領域３２０に記憶されているＬＭＮＡ３２１とが一致する場合には、Ｓ２、Ｙｅｓと判定し、両者が一致しない場合には、Ｓ２、Ｎｏと判定することができる。
【００４２】
パケットの宛て先は自ＰＭＮ２１が属するＬＭＮ１１ではない場合（Ｓ２、Ｎｏ）、コントローラ２００は、自ＰＭＮ２１に隣接するＰＭＮ２１のうちの転送先のＰＭＮ２１を、予め定められた転送アルゴリズムに基づいて決定する（Ｓ３）。コントローラ２００は、例えば、宛先のＬＭＮ１１または宛先のＰＭＮ２１と自ＰＭＮ２１が属するＬＭＮ１１または自ＰＭＮ２１との位置関係に基づいて決定する。コントローラ２００は、例えば、自ＰＭＮ２１から宛先のＬＭＮ１１または宛先のＰＭＮ２１までの転送回数が最小となる経路上に位置するＰＭＮ２１を転送先のＰＭＮ２１に決定する。また、自ＰＭＮ２１に隣接するＰＭＮ２１のうちの転送回数が最小となる経路上に位置するＰＭＮ２１が故障していたりビジーであったりする場合には、コントローラ２００は、他のＰＭＮ２１を転送先に決定するようにしてもよい。Ｓ３の処理の後、コントローラ２００は、決定した転送先のＰＭＮ２１にパケットを転送し（Ｓ４）、動作を終了する。
【００４３】
パケットの宛て先は自ＰＭＮ２１が属するＬＭＮ１１である場合（Ｓ２、Ｙｅｓ）、コントローラ２００は、変換アルゴリズム３２４に基づいてＬＭＮ＿ＬＢＡからＩＰＭＮＡおよびＰＭＮ＿ＬＢＡを演算する（Ｓ５）。コントローラ２００は、演算されたＩＰＭＮＡと管理領域３２０に記憶されているＩＰＭＮＡ３２２とを比較することによって、パケットの宛て先は自ＰＭＮ２１であるか否かを判定する（Ｓ６）。コントローラ２００は、両者が一致する場合には、Ｓ６、Ｙｅｓと判定し、両者が一致しない場合には、Ｓ６、Ｎｏと判定することができる。
【００４４】
パケットの宛て先は自ＰＭＮ２１ではない場合（Ｓ６、Ｎｏ）、コントローラ２００は、Ｓ３の処理を実行する。パケットの宛て先は自ＰＭＮ２１である場合（Ｓ６、Ｙｅｓ）、コントローラ２００は、パケットに記録されているコマンドに応じた処理を実行し（Ｓ７）、動作を終了する。
【００４５】
図１１は、ＣＵ１４から発行されたライトコマンドの処理例（第１のライト処理）を示すシーケンス図である。なお、個々のＰＭＮ２１は、コントローラ２００によって実現される。簡単のために、ＰＭＮ２１−０〜ＰＭＮ２１−２を動作の主体として説明する。
【００４６】
まず、ＰＭＮ２１−０は、自ＰＭＮ２１−０宛てのライトコマンドを受信する（Ｓ１１）。Ｓ１１にて受信されるライトコマンドは、ＰＭＮ２１−０が属するＬＭＮ１１を特定するＬＭＮＡと、ＬＭＮ＿ＬＢＡ０と、Ｄａｔａ０とを少なくとも含む。ＬＭＮ＿ＬＢＡ０は、変換アルゴリズム３２４によってＩＰＭＮＡ＝０とＰＭＮ＿ＬＢＡ０とに変換されるものである。
【００４７】
続いて、ＰＭＮ２１−０は、ＬＭＮ＿ＬＢＡ０をＩＰＭＮＡ＝０とＰＭＮ＿ＬＢＡ０とに変換する（Ｓ１２）。なお、Ｓ１２は、Ｓ５において実行済みであるが、説明のために本図に加えられている。
【００４８】
続いて、ＰＭＮ２１−０は、Ｄａｔａ０と同一のパリティグループに属するＤａｔａ１をリードさせるとともにＤａｔａ１をＰＭＮ２１−２に送信させる、リードコマンドを生成してＰＭＮ２１−１に送信する（Ｓ１３）。また、ＰＭＮ２１−０は、パリティを更新せしめるパリティ更新コマンドを生成してＰＭＮ２１−２に送信する（Ｓ１４）。
【００４９】
なお、ＰＭＮ２１が生成するコマンドは、ＣＵ１４が生成するコマンドとアクセス先の表現方式が異なっていてもよい。ここでは一例として、ＰＭＮ２１が送信するパケットは、ＬＭＮＡとＩＰＭＮＡとＰＭＮ＿ＬＢＡとを用いてアクセス先を表現するものとする。図９の例に従えば、同一のパリティグループを構成する各位置のＰＭＮ＿ＬＢＡは共通である。よって、Ｓ１３において生成されるリードコマンドは、アクセス先を指定する情報として、ＩＰＭＮＡ＝１とＰＭＮ＿ＬＢＡ０とを少なくとも含む。また、Ｓ１４にて生成されるパリティ更新コマンドは、アクセス先を指定する情報として、ＩＰＭＮＡ＝２とＰＭＮ＿ＬＢＡ０とを少なくとも含む。なお、同一のパリティグループを構成するＤａｔａ０、Ｄａｔａ１、およびパリティＰの記憶位置を示すＰＭＮ＿ＬＢＡが夫々異なる場合には、ＰＭＮ２１−０は、Ｓ１３、Ｓ１４の処理の前に、変換アルゴリズム３２４に基づいてＬＭＮ＿ＬＢＡからＤａｔａ１およびパリティＰの記憶位置を示すＰＭＮ＿ＬＢＡを演算する。なお、Ｓ１４にて生成されるパリティ更新コマンドは、Ｄａｔａ０を含む。Ｄａｔａ０は、パリティＰの演算に必要となるからである。
【００５０】
ＰＭＮ２１−０は、Ｓ１３およびＳ１４の後、ＰＭＮ＿ＬＢＡ０が示す位置にＤａｔａ０をライトする（Ｓ１５）。
【００５１】
ＰＭＮ２１−１は、ＰＭＮ２１−０からリードコマンドを受信すると、ＰＭＮ＿ＬＢＡ０が示す位置からＤａｔａ１をリードする（Ｓ１６）。そして、ＰＭＮ２１−１は、Ｄａｔａ１をＰＭＮ２１−２に送信する（Ｓ１７）。
【００５２】
ＰＭＮ２１−２は、ＰＭＮ２１−０からパリティ更新コマンドを受信し、ＰＭＮ２１−１からＤａｔａ１を受信すると、Ｄａｔａ０およびＤａｔａ１からパリティＰを演算し（Ｓ１８）、演算したパリティＰをＰＭＮ＿ＬＢＡ０が示す位置に上書き形式でライトする（Ｓ１９）。
【００５３】
図１２は、ＣＵ１４からのライトコマンドの別の処理例（第２のライト処理）を示すシーケンス図である。Ｓ２１〜Ｓ２２の処理は、Ｓ１１〜Ｓ１２の処理と夫々同じである。Ｓ２２の処理の後、ＰＭＮ２１−０は、パリティ更新コマンドを生成してＰＭＮ２１−２に送信する（Ｓ２３）。そして、ＰＭＮ２１−０は、ＰＭＮ＿ＬＢＡ０が示す位置にＤａｔａ０をライトする（Ｓ２４）。
【００５４】
ＰＭＮ２１−２は、ＰＭＮ２１−０からパリティ更新コマンドを受信すると、Ｄａｔａ１をリードさせてＰＭＮ２１−２に送信させる、リードコマンドを生成してＰＭＮ２１−１に送信する（Ｓ２５）。
【００５５】
ＰＭＮ２１−１は、ＰＭＮ２１−２からリードコマンドを受信すると、ＰＭＮ＿ＬＢＡ０が示す位置からＤａｔａ１をリードする（Ｓ２６）。そして、ＰＭＮ２１−１は、Ｄａｔａ１をＰＭＮ２１−２に送信する（Ｓ２７）。
【００５６】
ＰＭＮ２１−２は、ＰＭＮ２１−１からＤａｔａ１を受信すると、Ｄａｔａ０およびＤａｔａ１からパリティＰを演算し（Ｓ２８）、演算したパリティＰをＰＭＮ＿ＬＢＡ０が示す位置にライトする（Ｓ２９）。
【００５７】
なお、ＰＭＮ２１−２は、ＰＭＮ２１−０からパリティ更新コマンドを受信した後、ＰＭＮ２１−１からのパリティ更新コマンドの受信を一定時間だけ待ち受けるようにしてもよい。ＰＭＮ２１−２は、待ち受け中にＰＭＮ２１−１からパリティ更新コマンドを受信した場合には、ＰＭＮ２１−１からＤａｔａ１をリードする処理を行うことなくパリティＰを演算することができる。
【００５８】
図１３は、ＣＵ１４からのライトコマンドの別の処理例（第３のライト処理）を示すシーケンス図である。Ｓ３１〜Ｓ３２の処理は、Ｓ１１〜Ｓ１２の処理と夫々同じである。Ｓ３２の処理の後、ＰＭＮ２１−０は、パリティ更新コマンドを生成してＰＭＮ２１−１に送信する（Ｓ３３）。なお、Ｓ３３において生成されるパリティ更新コマンドは、ＩＰＭＮＡ＝１とＰＭＮ＿ＬＢＡ０とがアクセス先を指定する情報として記録され、Ｄａｔａ０が記録される。そして、ＰＭＮ２１−０は、ＰＭＮ＿ＬＢＡ０が示す位置にＤａｔａ０をライトする（Ｓ３４）。
【００５９】
ＰＭＮ２１−１は、ＰＭＮ２１−０からパリティ更新コマンドを受信すると、ＰＭＮ＿ＬＢＡ０が示す位置からＤａｔａ１をリードする（Ｓ３５）。そして、ＰＭＮ２１−１は、Ｄａｔａ０およびＤａｔａ１からパリティＰを演算する（Ｓ３６）。そして、ＰＭＮ２１−１は、パリティ更新コマンドを生成してＰＭＮ２１−２に送信する（Ｓ３７）。Ｓ３７において生成されるパリティ更新コマンドは、ＩＰＭＮＡ＝２とＰＭＮ＿ＬＢＡ０とをアクセス先を指定する情報として含み、パリティＰを含む。即ち、Ｓ３７において生成されるパリティ更新コマンドは、ＰＭＮ＿ＬＢＡ０が示す位置にパリティＰをライトさせるライトコマンドに等しい。
【００６０】
ＰＭＮ２１−２は、ＰＭＮ２１−１からパリティ更新コマンドを受信すると、パリティＰをＰＭＮ＿ＬＢＡ０が示す位置にライトする（Ｓ３８）。
【００６１】
なお、ＰＭＮ２１−１は、ＰＭＮ２１−０からのパリティ更新コマンドを受信した後、Ｄａｔａ１をライトさせるＣＵ１４からライトコマンドの受信を一定時間だけ待ち受けるようにしてもよい。ＰＭＮ２１−１は、待ち受け中にＣＵ１４からライトコマンドを受信した場合には、Ｄａｔａ１をリードする処理を行うことなくパリティＰを演算することができる。また、ＰＭＮ２１−１は、パリティＰを演算しないで、Ｄａｔａ０およびＤａｔａ１をＰＭＮ２１−２に送信し、ＰＭＮ２１−２がパリティＰを演算してもよい。
【００６２】
図１４は、ＣＵ１４からのライトコマンドの別の処理例（第４のライト処理）を示すシーケンス図である。Ｓ４１〜Ｓ４２の処理は、Ｓ１１〜Ｓ１２の処理と夫々同じである。Ｓ４２の処理の後、ＰＭＮ２１−０は、Ｄａｔａ１をリードさせてＰＭＮ２１−０に送信させる、リードコマンドを生成してＰＭＮ２１−１に送信する（Ｓ４３）。そして、ＰＭＮ２１−０は、ＰＭＮ＿ＬＢＡ０が示す位置にＤａｔａ０をライトする（Ｓ４４）。
【００６３】
ＰＭＮ２１−１は、ＰＭＮ２１−０からリードコマンドを受信すると、ＰＭＮ＿ＬＢＡ０が示す位置からＤａｔａ１をリードする（Ｓ４５）。そして、ＰＭＮ２１−１は、Ｄａｔａ１をＰＭＮ２１−０に送信する（Ｓ４６）。
【００６４】
ＰＭＮ２１−０は、ＰＭＮ２１−１からＤａｔａ１を受信すると、Ｄａｔａ０およびＤａｔａ１からパリティＰを演算する（Ｓ４７）。そして、ＰＭＮ２１−０は、パリティ更新コマンドを生成してＰＭＮ２１−２に送信する（Ｓ４８）。Ｓ４８において生成されるパリティ更新コマンドは、Ｓ３７において生成されるパリティ更新コマンドと同様の構成を備える。
【００６５】
ＰＭＮ２１−２は、ＰＭＮ２１−０からパリティ更新コマンドを受信すると、パリティＰをＰＭＮ＿ＬＢＡ０が示す位置に上書き形式でライトする（Ｓ４９）。
【００６６】
なお、ＰＭＮ２１−０は、パリティＰを演算しないで、Ｄａｔａ０およびＤａｔａ１をＰＭＮ２１−２に送信し、ＰＭＮ２１−２がパリティＰを演算してもよい。
【００６７】
第１〜第４のライト処理に示すように、各ＬＭＮ１１は、ＰＭＮ＿ＬＢＡ０が示す位置に既にＤａｔａ０が記憶される場合には、既に記憶されるＤａｔａ０はライトコマンドが含むＤａｔａ０に更新され、対応するパリティＰがＤａｔａ０の更新に応じて更新される。また、第１〜第４のライト処理に示すように、同一のＬＭＮ１１内のＰＭＮ２１のうちの任意のＰＭＮ２１がパリティＰを演算することができる。
【００６８】
なお、ストレージシステム１は、サーバ３からＴＲＩＭ（削除通知）コマンドを受け付けることができるようにしてもよい。具体的には、ストレージシステム１がＴＲＩＭコマンドを受信すると、ＣＵ１４はそのＴＲＩＭコマンドを発行する。ＣＵ１４が発行するＴＲＩＭコマンドは、ＬＭＮＡと、削除先を指定するＬＭＮ＿ＬＢＡとを少なくとも備えている。ＴＲＩＭコマンドの宛て先のＰＭＮ２１は、メタデータ３４２に記録されているＬＭＮ＿ＬＢＡから変換されるＰＭＮ＿ＬＢＡと物理アドレスとの対応関係を無効化する。なお、ＴＲＩＭコマンドの宛て先のＰＭＮ２１がＰＭＮ＿ＬＢＡと物理アドレスとの対応関係を無効化した場合には、その旨を同一のパリティグループを構成する他のＰＭＮ２１に送信して、パリティＰが格納されるＰＭＮ＿ＬＢＡとパリティＰが格納される物理アドレスとの対応関係を無効化させるようにしてもよい。
【００６９】
図１５は、ＣＵ１４からのリードコマンドの処理例（第１のリード処理）を示すシーケンス図である。なお、ＰＭＮ２１−０は、リードコマンドの処理に成功した場合には、リードデータをＣＵ１４に送信する。ここでは、リードコマンドの処理に失敗した場合の処理を説明する。リードコマンドの処理に失敗する事例は、例えばリードデータの誤り訂正に失敗する事例を含む。
【００７０】
まず、ＰＭＮ２１−０は、自ＰＭＮ２１−０宛てのリードコマンドを受信する（Ｓ５１）。Ｓ５１にて受信されるリードコマンドは、ＰＭＮ２１−０が属するＬＭＮ１１を特定するＬＭＮＡと、ＬＭＮ＿ＬＢＡ０と、を少なくとも含む。ＬＭＮ＿ＬＢＡ０は、変換アルゴリズム３２４によってＩＰＭＮＡ＝０とＰＭＮ＿ＬＢＡ０とに変換されるものである。
【００７１】
続いて、ＰＭＮ２１−０は、ＬＭＮ＿ＬＢＡ０をＩＰＭＮＡ＝０とＰＭＮ＿ＬＢＡ０とに変換する（Ｓ５２）。なお、Ｓ５２は、Ｓ５において実行済みであるが、説明のために本図に加えられている。
【００７２】
ＰＭＮ２１−０は、リードコマンドの処理に失敗すると（Ｓ５３）、Ｄａｔａ１をリードさせてＰＭＮ２１−０に送信させる、リードコマンドを生成してＰＭＮ２１−１に送信する（Ｓ５４）。また、ＰＭＮ２１−０は、パリティＰをリードさせてＰＭＮ２１−０に送信させる、リードコマンドを生成してＰＭＮ２１−２に送信する（Ｓ５５）。
【００７３】
ＰＭＮ２１−１は、ＰＭＮ２１−０からリードコマンドを受信すると、ＰＭＮ＿ＬＢＡ０が示す位置からＤａｔａ１をリードする（Ｓ５６）。そして、ＰＭＮ２１−１は、Ｄａｔａ１をＰＭＮ２１−０に送信する（Ｓ５８）。また、ＰＭＮ２１−２は、ＰＭＮ２１−０からリードコマンドを受信すると、ＰＭＮ＿ＬＢＡ０が示す位置からパリティＰをリードする（Ｓ５７）。そして、ＰＭＮ２１−２は、パリティＰをＰＭＮ２１−０に送信する（Ｓ５９）。
【００７４】
ＰＭＮ２１−０は、ＰＭＮ２１−１からＤａｔａ１を受信し、ＰＭＮ２１−２からパリティＰを受信すると、Ｄａｔａ１およびパリティＰからＤａｔａ０を演算する（Ｓ６０）。そして、ＰＭＮ２１−０は、演算したＤａｔａ０をＣＵ１４に送信する（Ｓ６１）。また、ＰＭＮ２１−０は、演算したＤａｔａ０をＰＭＮ＿ＬＢＡ０が示す位置に上書き形式でライトする（Ｓ６２）。
【００７５】
図１６は、ＣＵ１４からのリードコマンドの別の処理例（第２のリード処理）を示すシーケンス図である。Ｓ７１〜Ｓ７３の処理は、Ｓ５１〜Ｓ５３の処理と夫々同じである。Ｓ７３の後、ＰＭＮ２１−０は、データを復元せしめるためのデータ復元コマンドを生成しＰＭＮ２１−２に送信する（Ｓ７４）。Ｓ７４にて生成されるデータ復元コマンドは、パリティグループを指定するとともにデータ復元コマンドの宛て先を示す情報として、ＩＰＭＮＡ＝２とＰＭＮ＿ＬＢＡ０とを少なくとも含む。また、Ｓ７４にて生成されるデータ復元コマンドは、復元対象がＰＭＮ２１−０に記憶されるＤａｔａ０である旨を示す情報を含んでいてもよい。
【００７６】
ＰＭＮ２１−２は、データ復元コマンドを受信すると、Ｄａｔａ１をリードさせてＰＭＮ２１−２に送信させる、リードコマンドを生成してＰＭＮ２１−１に送信する（Ｓ７５）。そして、ＰＭＮ２１−２は、ＰＭＮ＿ＬＢＡ０が示す位置からパリティＰをリードする（Ｓ７６）。
【００７７】
ＰＭＮ２１−１は、ＰＭＮ２１−２からリードコマンドを受信すると、ＰＭＮ＿ＬＢＡ０が示す位置からＤａｔａ１をリードする（Ｓ７７）。そして、ＰＭＮ２１−１は、Ｄａｔａ１をＰＭＮ２１−２に送信する（Ｓ７８）。
【００７８】
ＰＭＮ２１−２は、ＰＭＮ２１−１からＤａｔａ１を受信すると、Ｄａｔａ１およびパリティＰからＤａｔａ０を演算し（Ｓ７９）、演算したＤａｔａ０をＣＵ１４に送信する（Ｓ８０）。また、ＰＭＮ２１−２は、演算されたＤａｔａ０をＰＭＮ２１−０に送信する（Ｓ８１）。
【００７９】
ＰＭＮ２１−０は、ＰＭＮ２１−２からＤａｔａ０を受信すると、ＰＭＮ＿ＬＢＡ０が示す位置にＤａｔａ０を上書き形式でライトする（Ｓ８２）。
【００８０】
なお、演算されたＤａｔａ０をＰＭＮ２１−０がＣＵ１４に送信してもよい。
【００８１】
図１７は、ＣＵ１４からのリードコマンドの別の処理例（第３のリード処理）を示すシーケンス図である。Ｓ９１〜Ｓ９３の処理は、Ｓ５１〜Ｓ５３の処理と夫々同じである。Ｓ９３の後、ＰＭＮ２１−０は、データ復元コマンドを生成しＰＭＮ２１−１に送信する（Ｓ９４）。Ｓ９４にて生成されるデータ復元コマンドは、パリティグループを指定するとともにデータ復元コマンドの宛て先を示す情報として、ＩＰＭＮＡ＝１とＰＭＮ＿ＬＢＡ０とを少なくとも含む。
【００８２】
ＰＭＮ２１−１は、ＰＭＮ２１−０からデータ復元コマンドを受信すると、ＰＭＮ＿ＬＢＡ０が示す位置からＤａｔａ１をリードする（Ｓ９５）。そして、ＰＭＮ２１−１は、データ復元コマンドを生成しＰＭＮ２１−２に送信する（Ｓ９６）。Ｓ９６にて生成されるデータ復元コマンドは、パリティグループを指定するとともにデータ復元コマンドの宛て先を示す情報として、ＩＰＭＮＡ＝２とＰＭＮ＿ＬＢＡ０とを少なくとも含む。また、Ｓ９６にて生成されるデータ復元コマンドは、Ｄａｔａ１を含む。また、Ｓ９６にて生成されるデータ復元コマンドは、復元対象がＰＭＮ２１−０に記憶されるＤａｔａ０である旨を含んで構成されてもよい。
【００８３】
ＰＭＮ２１−２は、ＰＭＮ２１−１からデータ復元コマンドを受信すると、ＰＭＮ＿ＬＢＡ０が示す位置からパリティＰをリードする（Ｓ９７）。そして、ＰＭＮ２１−２は、Ｄａｔａ１およびパリティＰからＤａｔａ０を演算し（Ｓ９８）、演算したＤａｔａ０をＣＵ１４に送信する（Ｓ９９）。また、ＰＭＮ２１−２は、演算されたＤａｔａ０をＰＭＮ２１−０に送信する（Ｓ１００）。
【００８４】
ＰＭＮ２１−０は、ＰＭＮ２１−２からＤａｔａ０を受信すると、ＰＭＮ＿ＬＢＡ０が示す位置にＤａｔａ０を上書き形式でライトする（Ｓ１０１）。
【００８５】
なお、演算されたＤａｔａ０をＰＭＮ２１−０がＣＵ１４に送信してもよい。また、第１〜第３のリード処理に示すように、各ＬＭＮ１１は、Ｄａｔａ０のリードに失敗した場合には、Ｄａｔａ０に対応するパリティＰに基づいてＤａｔａ０を復元する。Ｄａｔａ０の復元は、同一のＬＭＮ１１内のＰＭＮ２１のうちの任意のＰＭＮ２１が実行することができる。
【００８６】
以上述べたように、第１の実施形態によれば、各ＰＭＮ２１は、他のＰＭＮ２１とともに複数のＬＭＮ１１のうちの一を構成する。各ＰＭＮ２１は、サーバ３からライトされるＤａｔａ０を第１のＰＭＮ２１に記憶し、Ｄａｔａ０の冗長データであるパリティＰを第１のＰＭＮ２１と異なる第２のＰＭＮ２１に記憶する。また、ＣＵ１４からのコマンドは、１つのＬＭＮ１１を指定するＬＭＮＡと、ＬＭＮ１１毎に割り当てられたメモリ空間内の位置を示すＬＭＮ＿ＬＢＡとを含む。各ＬＭＮ１１は、ＬＭＮＡが自ＬＭＮ１１を指定しない場合、コマンドを他のＬＭＮ１１に転送し、ＬＭＮＡが自ＬＭＮ１１を指定する場合、ＬＭＮ＿ＬＢＡに基づいて第１のＰＭＮ２１内のＤａｔａ０の記憶位置を演算するとともにＤａｔａ０に対応するパリティＰの第２のＰＭＮ１１内の記憶位置を演算し、演算された各記憶位置にコマンドに応じたアクセスを行う。ストレージシステム１は、損失したデータをサーバ３による冗長データの管理を必要とすることなく復元することができるので、第１の実施形態によれば、冗長データの管理を外部が実行する場合に比べて、必要な外部リソースを少なくすることができる。また、各ＬＭＮ１１が冗長データの管理を行うので、冗長データの管理がストレージシステム１内で分散される。これにより、冗長データの管理が集中して実行される場合に比べてスケールアウトによる性能向上が期待できる。
【００８７】
なお、冗長データの記憶方式がＲＡＩＤ１である場合には、サーバ３からライトされるデータの複製が冗長データとして用いられる。
【００８８】
また、各ＬＭＮ１１は、コマンドがリードコマンドである場合、第１のＰＭＮ２１からＤａｔａ０をリードし、リードに失敗した場合、第２のＰＭＮ２１からパリティＰをリードして、当該パリティＰを用いてＤａｔａ０を復元する。これにより、ストレージシステム１は、サーバ３による冗長データの管理にかかる処理を必要とすることなく、サーバ３からライトされたデータの復元を実行することが可能となる。
【００８９】
また、各ＬＭＮ１１は、コマンドがライトコマンドである場合、第１のＰＭＮ２１に記憶されるＤａｔａ０を更新し、第２のＰＭＮ２１に記憶されるパリティＰをＤａｔａ０の更新に応じて更新する。これにより、ストレージシステム１は、サーバ３による冗長データの管理にかかる処理を必要とすることなく、冗長データの管理を実行することが可能となる。
【００９０】
また、各ＰＭＮ２１は、ＬＭＮ＿ＬＢＡに基づいてＩＰＭＮＡとＰＭＮ＿ＬＢＡとを演算し、ＬＭＮＡとＩＰＭＮＡとの対が自ＰＭＮ２１を示す場合には、自ＰＭＮ２１が備えるＮＡＮＤメモリ３００に対してコマンドに応じたアクセスを行う。各ＰＭＮ２１は、ＬＭＮＡとＩＰＭＮＡとの対が自ＰＭＮ２１を示さない場合には、自ＰＭＮ２１に隣接した他のＰＭＮ２１にコマンドを転送する。これにより、コマンドは、所望のデータが記憶されるＰＭＮ２１に到達するように自動的に転送される。
【００９１】
また、各ＰＭＮ２１は、リードに失敗した場合またはライトを実行する場合には、第２のＰＭＮ２１内におけるパリティＰが記憶される記憶位置を演算することができる。図９の例に従えば、第２のＰＭＮ２１内におけるパリティＰの記憶位置は、第１のＰＭＮ２１内におけるＤａｔａ０の記憶位置と同一である。このように、各ＰＭＮ２１は、冗長データの記憶位置を演算する機能を備えているので、サーバ３による冗長データの管理を不要とすることができる。
【００９２】
また、各ＬＭＮ１１を構成する第１のＰＭＮ２１と第２のＰＭＮ２１とは、夫々異なるブレード基盤２２に実装されてもよい。これにより、１つのＰＭＮ２１が故障した場合、故障したＰＭＮ２１が実装されているブレード基盤２２を交換することで、ストレージシステム１に記憶されたデータを失うことなくデータの引き継ぎが可能となる。
【００９３】
（第２の実施形態）
図１８は、第２の実施形態に係るストレージシステムの構成例を示す図である。以降、第１の実施形態と同じ構成要素には、第１の実施形態と同一の符号を付して、重複する説明を省略する。
【００９４】
ストレージシステム４は、ネットワーク２を介して１以上のサーバ３に接続される。サーバ３は、データをストレージシステム４にライトしたりデータをストレージシステム４からリードしたりすることができる。即ち、サーバ３は、ストレージシステム４に対してホストとして機能する。なお、任意のコンピュータがストレージシステム４のホストとして機能することができる。サーバ３によるストレージシステム４へのＩ／Ｏアクセスは、ネットワーク２を介して実行される。
【００９５】
ストレージシステム４は、複数のメモリノード（ＭＮ）３１と、１以上のコントロールユニット（ＣＵ）１４と、を備える。ストレージシステム４は、複数のＭＮ３１にデータを分散して記憶することができる。図１８の例においては、各ＭＮ３１は、矩形格子の格子点に配置される。各ＣＵ１４は、ＭＮ３１の配列の外周部に配置される。格子点の座標を座標（ｘ、ｙ）で示し、格子点に配置されるＭＮ３１の位置情報は、当該格子点の座標と対応してノードアドレス（ｘ、ｙ）で示されるものとする。また、図１８の例においては、左上隅に位置するＭＮ３１が原点のノードアドレス（０、０）を有し、各ＭＮ３１を横方向（Ｘ方向）および縦方向（Ｙ方向）に移動することで、ノードアドレス（ＮＡ）が整数値で増減する。なお、各ＣＵ１４もＮＡを有していてもよい。例えば、原点のＭＮ３１に接続される２つのＣＵ１４のうち、Ｘ方向に接続されるＣＵ１４はＮＡ（−１、０）を有し、Ｙ方向に接続されるＣＵ１４はＮＡ（０、−１）を有してもよい。以降、ＮＡ（ｘD、ｙD）で表されるＭＮ３１を、ＭＮ（ｘD、ｙD）と表記することがある。
【００９６】
なお、各ＭＮ３１の配置の様態は、第１の実施形態における各ＬＭＮ１１の配置の様態と同様に、２次元の矩形格子の格子点に配置される様態だけに限定されない。また、簡単のために、ＭＮ３１はＬＭＮ１１を構成しないものとして説明する。なお、ノードアドレスをＬＭＮＡに、後述のデータアドレスをＬＭＮＡとＬＭＮ＿ＬＢＡとの組合せに、夫々置き換えることによって、第１の実施形態のようにＬＭＮ１１が構成される場合であっても第２の実施形態は適用可能である。
【００９７】
各ＭＮ３１は、２以上の入出力ポート１６を備える。各ＭＮ３１は、２以上の異なる方向に隣接するＭＮ３１またはＣＵ１４と、入出力ポート１６を介して接続される。図１８においてＭＮ（０、０）は、ＭＮ（１、０）、ＭＮ（０、１）、および２つのＣＵ１４と接続される。
【００９８】
第２の実施形態においては、サーバ３は、任意の文字列（キー）を用いてデータを指定することができる。サーバ３がストレージシステム４に対してストレージシステム４の内部で使用されるアドレス体系（後述のデータアドレスの表記方法）とは異なる独自のアドレス体系を用いてデータを指定する場合には、サーバ３が使用するアドレスをキーとして用いることもできる。キーは、ＣＵ１４においてハッシュ化され、ハッシュ化されたキーは、ＭＮ３１とそのＭＮ３１が備える記憶領域内の位置とを特定することができるアドレス（以降、データアドレス）に変換される。なお、ハッシュ化されたキーを単にキーと表記する。キーは、変換テーブルを用いてデータアドレスに変換される。
【００９９】
図１９および図２０は、変換テーブルの構成例を示す図である。変換テーブル３４３は、複数に分割されている。複数に分割された変換テーブル３４３は、木構造のリンク関係を構成する。最も下位の変換テーブル３４３（葉ノードの変換テーブル３４３）は、キーとデータアドレスとの対応関係が記録される。最も下位の変換テーブル３４３を除く変換テーブル３４３は、抽象化されたキーと子ノードの変換テーブル３４３を記憶するＭＮ３１のノードアドレスとの対応関係が記録される。上位側の変換テーブル３４３は、下位側の変換テーブル３４３よりもより抽象化されたキーが記録されている。上位側の変換テーブル３４３は、抽象化されたキー毎にエントリを備えることで、少ないエントリ数で多くのキーを管理することができる。下位側の変換テーブル３４３は、複数に分割されていることで、変換テーブル３４３毎のエントリ数が所定値以下に低減される。
【０１００】
図１９および図２０の例によれば、各変換テーブル３４３は、３階層の木構造のリンク関係で互いにリンクされている。根ノードの変換テーブル３４３を０階層目の変換テーブルとし、下位側に向かって階層値が整数値で増加するものとする。０階層目の変換テーブルは、最も抽象化されたキーと１階層の変換テーブルが記憶されるノードアドレスとの対応関係が記録される。抽象化とは、ここでは、キーを右にシフト演算することである。シフト演算によるシフト量が多いほどより抽象化される。１階層目の変換テーブルは、中程度に抽象化されたキーと２階層の変換テーブルが記憶されるノードアドレスとの対応関係が記録される。２階層目の変換テーブルは、まったく抽象化されていないキーとデータアドレスとの対応関係が記録される。以降、０階層目の変換テーブルをRoot K2K、０階層目の変換テーブルに記録されるキーを、ルートキー（Root key）と夫々表記することがある。また、１階層目の変換テーブルを2nd K2K、１階層目の変換テーブルに記録されるキーを、セカンドキー（2nd key）と夫々表記することがある。また、２階層目の変換テーブルをK2Aと表記することがある。
【０１０１】
なお、データアドレスは、ストレージシステム４内のＭＮ３１のうちの各ＭＮ３１と、ＭＮ３１毎のメモリ空間内の位置と、の両方が特定可能な情報であれば任意である。例えば、データアドレスは、ノードアドレスと、ＭＮ３１毎のＮＡＮＤメモリ３００内の位置を論理的または物理的に示すノード内アドレスと、を含んで構成される。ここでは、ノード内アドレスはＭＮ３１毎のＮＡＮＤメモリ３００内の位置を論理的に示すアドレスであって、ＭＮ３１においてメタデータ３２３に基づいてＮＡＮＤメモリ３００内の物理的な位置に変換されるものとする。
【０１０２】
図２１は、変換テーブルが記憶されるＭＮ３１を示す図である。上述のように変換テーブルが階層化される場合には、Root K2Kを記憶するＭＮ３１にアクセスが集中することになる。第２の実施形態においては、Root K2Kを記憶するＭＮ３１に対するアクセスを分散させるために、Root K2Kが多重化され、各Root K2Kは夫々異なるＭＮ３１に記憶される。Root K2Kを記憶する複数のＭＮ３１は、夫々特定のＭＮ３１に予め定められているとともに固定されている。多重化された各Root K2Kは、互いに同期される。なお、同期の方式は任意である。所定のタイミングで全てのRoot K2KがロックされてRoot K2K間の同期処理がなされてもよいし、何れのRoot K2KもロックされないでRoot K2K間で同期処理がなされてもよい。本図の例によれば、ＭＮ（０、０）、ＭＮ（４、０）およびＭＮ（０、２）に同一のRoot K2Kが記憶されている。
【０１０３】
図２２は、メモリ構成に着目した第２の実施形態のＭＮ３１の構成の一例を示す図である。ＭＮ３１は、コントローラ２００と、ストレージメモリとしてのＮＡＮＤメモリ３００とを備えている。コントローラ２００は、ＣＰＵ２１０およびＲＡＭ２２０を備える。
【０１０４】
ＮＡＮＤメモリ３００は、ＦＷ領域３１０、管理領域３４０、およびデータ領域３３０を備える。ＦＷ領域３１０は、ＣＰＵ２１０に実行されるファームウェアプログラム３１１が予め記憶される。管理領域３４０は、自ノードアドレス３４１と、上位ノードアドレス３４２と、変換テーブル３４３と、メタデータ３２３と、を記憶する。自ノードアドレス３４１は、自ＭＮ３１に割り当てられたノードアドレスである。上位ノードアドレス３４２は、自ＭＮ３１が記憶する変換テーブル３４３の親ノードの変換テーブル３４３を記憶するＭＮ３１を示すノードアドレスである。
【０１０５】
なお、本図は、2nd K2KまたはK2Aを記憶するＭＮ３１の構成を示している。Root K2Kを記憶するＭＮ３１は、Root K2Kは根ノードの変換テーブル３４３であるため、管理領域３４０に上位ノードアドレス３４２を記憶しない。また、変換テーブル３４３を記憶しないＭＮ３１は、管理領域３４０に上位ノードアドレス３４２を記憶しない。
【０１０６】
図２３は、ＣＵ１４からのリードコマンドの第２の実施形態の処理例を示すシーケンス図である。ここでは、Root K2Kを記憶するＭＮ３１に符号３１−０を付し、2nd K2Kを記憶するＭＮ３１に符号３１−１を付し、K2Aを記憶するＭＮ３１に符号３１−２を付すことによって、階層が異なる変換テーブルを記憶する複数のＭＮ３１を互いに区別する。
【０１０７】
まず、ＣＵ１４は、ＭＮ３１−０を宛て先としてリードコマンドを送信する（Ｓ２０１）。なお、Ｓ２０１にて送信されるリードコマンドは、宛て先を示す情報としてのノードアドレスＮＡ１と、keyとを含む。ノードアドレスＮＡ１は、複数のＭＮ３１−０のうちの１つに割り当てられたノードアドレスである。また、Ｓ２０１にて送信されるリードコマンドは、送り元を示す情報としてノードアドレスＮＡ０を含むが、ここでは省略する。ノードアドレスＮＡ０はそのリードコマンドの送り元のＣＵ１４に割り当てられたノードアドレスである。なお、ＣＵ１４が複数のＭＮ３１−０のうちの宛て先のＭＮ３１−０を１つ決定する方式は任意である。
【０１０８】
なお、各ＭＮ３１は、コマンドを受信した場合、宛て先のノードアドレスまたはデータアドレスと、自ノードアドレス３４１と、を比較することによって、自ＭＮ３１がコマンドの宛て先であるか否かを判定する。宛て先がデータアドレスで示される場合には、各ＭＮ３１は、宛て先のデータアドレスからノードアドレスを演算して、演算されたノードアドレスと自ノードアドレス３４１とを比較する。各ＭＮ３１は、自身が宛て先ではない場合は、自身に隣接するＭＮ３１にそのコマンドを転送する。転送先のＭＮ３１は、ノードアドレスが物理的な配置位置を示す場合には、宛て先のノードアドレスと自ノードアドレス３４１との間の位置関係に応じて決定される。例えば、各ＭＮ３１は、自身から宛て先のＭＮ３１までのコマンドの転送回数が最小となるように転送先のＭＮ３１を決定する。また、各ＭＮ３１は、自身から宛て先のＭＮ３１までのコマンドの転送回数が最小となるＭＮ３１が故障していたりビジーであったりする場合、当該ＭＮ３１を迂回するように転送先のＭＮ３１を決定する。
【０１０９】
ノードアドレスＮＡ１が割り当てられたＭＮ３１−０は、ＣＵ１４から送信されたリードコマンドを受信すると、keyを用いてRoot K2Kを検索することによって、ノードアドレスＮＡ２を取得する（Ｓ２０２）。そして、ＭＮ３１−０は、宛て先をノードアドレスＮＡ２に書き換えて、リードコマンドを送信する（Ｓ２０３）。
【０１１０】
ノードアドレスＮＡ２が割り当てられたＭＮ３１−１は、ＭＮ３１−０から送信されたリードコマンドを受信すると、keyを用いて2nd K2Kを検索することによって、ノードアドレスＮＡ３を取得する（Ｓ２０４）。そして、ＭＮ３１−１は、宛て先をノードアドレスＮＡ３に書き換えて、リードコマンドを送信する（Ｓ２０５）。
【０１１１】
ノードアドレスＮＡ３が割り当てられたＭＮ３１−２は、ＭＮ３１−１から送信されたリードコマンドを受信すると、keyを用いてK2Aを検索することによって、データアドレスＤＡを取得する（Ｓ２０６）。そして、ＭＮ３１−２は、宛て先をデータアドレスＤＡに書き換えて、リードコマンドを送信する（Ｓ２０７）。
【０１１２】
データアドレスＤＡによって特定されるＭＮ３１は、ＭＮ３１−２からリードコマンドを受信すると、データアドレスＤＡが示す位置からＤａｔａ０をリードする（Ｓ２０８）。そして、データアドレスＤＡによって特定されるＭＮ３１は、Ｄａｔａ０をＣＵ１４を宛て先として送信する（Ｓ２０９）。
【０１１３】
図２４は、ＣＵ１４からのライトコマンドの第２の実施形態の処理例を示すシーケンス図である。まず、ＣＵ１４は、１つのＭＮ３１−０を宛て先としてライトコマンドを送信する（Ｓ２１１）。なお、Ｓ２１１にて送信されるライトコマンドは、宛て先を示す情報としてのノードアドレスＮＡ１と、keyと、ライトデータＤａｔａ０とを含む。
【０１１４】
ノードアドレスＮＡ１が割り当てられたＭＮ３１−０は、ＣＵ１４から送信されたライトコマンドを受信すると、keyを用いてRoot K2Kを検索することによって、ノードアドレスＮＡ２を取得する（Ｓ２１２）。そして、ＭＮ３１−０は、宛て先をノードアドレスＮＡ２に書き換えて、ライトコマンドを送信する（Ｓ２１３）。
【０１１５】
ノードアドレスＮＡ２が割り当てられたＭＮ３１−１は、ＭＮ３１−０から送信されたライトコマンドを受信すると、keyを用いて2nd K2Kを検索することによって、ノードアドレスＮＡ３を取得する（Ｓ２１４）。そして、ＭＮ３１−１は、宛て先をノードアドレスＮＡ３に書き換えて、ライトコマンドを送信する（Ｓ２１５）。
【０１１６】
ノードアドレスＮＡ３が割り当てられたＭＮ３１−２は、ＭＮ３１−１から送信されたライトコマンドを受信すると、keyを用いてK2Aを検索することによって、データアドレスＤＡを取得する（Ｓ２１６）。そして、ＭＮ３１−２は、宛て先をデータアドレスＤＡに書き換えて、ライトコマンドを送信する（Ｓ２１７）。なお、Ｓ２１７にて送信されるライトコマンドは、送り元を示す情報としてのノードアドレスＮＡ３を含んでいてもよい。
【０１１７】
データアドレスＤＡによって特定されるＭＮ３１は、ＭＮ３１−２から送信されたライトコマンドを受信すると、データアドレスＤＡが示す位置にＤａｔａ０をライトする（Ｓ２１８）。そして、データアドレスＤＡによって特定されるＭＮ３１は、Ｄａｔａ０を正しく受け取った旨を示す情報であるＡＣＫを、Ｓ２１７のライトコマンドを送信したＭＮ３１−２を宛て先として送信する（Ｓ２１９）。
【０１１８】
なお、データアドレスＤＡによって特定されるＭＮ３１は、書き込み先のノード内アドレスが変化したり、記憶容量が足りなくなったりした場合には、その旨の通知をＳ２１７のライトコマンドを送信したＭＮ３１−２を宛て先として送信することができる。通知を受信したＭＮ３１−２は、Ｄａｔａ０を分割して、分割されたＤａｔａ０の一部をデータアドレスＤＡによって特定されるＭＮ３１に送り、他の部分を別のＭＮ３１に送るようにしてもよい。また、通知を受信したＭＮ３１−２は、Ｄａｔａ０を別のＭＮ３１に送るようにしてもよい。通知を受信したＭＮ３１−２は、Ｄａｔａ０の書き込み先のデータアドレスを変更した場合には、データアドレスの変更に応じてK2Aを更新する。また、ＭＮ３１−２は、Ｄａｔａ０を分割したり、新規のkeyが指定されたりした場合には、K2Aのエントリを新規作成することができる。エントリが新規作成された場合には、K2Aのエントリ数が増加することとなる。
【０１１９】
図２５は、変換テーブルのエントリ数が所定値に達した場合の処理を示すシーケンス図である。ここでは、K2Aのエントリが所定値に達した場合の処理を説明するが、2nd K2Kのエントリが所定値に達した場合においても同様の処理が実行される。
【０１２０】
ＭＮ３１−２は、K2Aのエントリ数が所定値に達すると（Ｓ２２１）、entry0を選択する（Ｓ２２２）。entry0は、K2Aを構成するエントリのうちの分割対象のエントリである。なお、分割対象のエントリは複数選択されてもよい。
【０１２１】
続いて、ＭＮ３１−２は、上位ノードアドレス３４２を参照することによって、ノードアドレスＮＡ２を取得する（Ｓ２２３）。ＭＮ３１−２は、分割依頼コマンドを生成しノードアドレスＮＡ２を宛て先として送信する（Ｓ２２４）。Ｓ２２４において生成される分割依頼コマンドは、entry0を含む。
【０１２２】
ノードアドレスＮＡ２が割り当てられたＭＮ３１−１は、分割依頼コマンドを受信すると、新たにK2Aを記憶させるＭＮ３１を決定する（Ｓ２２５）。なお、新たにK2Aを記憶させるＭＮ３１を決定する方式は任意である。例えば、変換テーブルを記憶しないＭＮ３１のうちから新たにK2Aを記憶させるＭＮ３１を決定する。決定されたＭＮ３１のノードアドレスをＮＡ５とする。
【０１２３】
続いて、ＭＮ３１−１は、entry0からなるK2Aを新規に生成する（Ｓ２２６）。そして、ＭＮ３１−１は、ノードアドレスＮＡ５が割り当てられたＭＮ３１の管理領域３４０に、上位ノードアドレス３４２としてノードアドレスＮＡ２を、変換テーブル３４３としてＳ２２６において生成されたK2Aを、夫々記憶させる、登録コマンドを生成し送信する（Ｓ２２７）。
【０１２４】
続いて、ＭＮ３１−１は、2nd K2Kを更新する（Ｓ２２８）。そして、ノードアドレスＮＡ５が割り当てられたＭＮ３１は、ノードアドレスＮＡ５を上位ノードアドレス３４２として、送信されてきたK2Aを変換テーブル３４３として、自身が備える管理領域３４０に夫々格納する（Ｓ２２９）。以降、ノードアドレスＮＡ５が割り当てられたＭＮ３１は、K2Aを記憶するＭＮ３１として機能する。
【０１２５】
このように、変換テーブル３４３のエントリが溢れた場合には、溢れた変換テーブル３４３のうちの一部が分割されて夫々異なるＭＮ３１に記憶される。なお、溢れた変換テーブル３４３の分割は、溢れた変換テーブル３４３の親ノードの変換テーブル３４３が実行してもよい。なお、2nd K2Kは、Ｓ２２８においてエントリがさらに追加される。
【０１２６】
また、内部ノードの変換テーブル３４３（ここでは2nd K2K）が溢れた場合においても、K2Aが溢れた場合と同様に、溢れた2nd K2Kが分割されて夫々異なるＭＮ３１に記憶される。内部ノードの変換テーブル３４３が分割されると、当該分割された変換テーブル３４３の子ノードの変換テーブル３４３を記憶するＭＮ３１に設定された上位ノードアドレス３４２が変更される必要がある。上位ノードアドレス３４２の変更は、例えば、分割された変換テーブル３４３を記憶するＭＮ３１が、分割された変換テーブル３４３の子ノードの変換テーブル３４３に、管理領域３４０内の情報を更新させる登録更新コマンドを送信することによって実行される。また、上位ノードアドレス３４２の変更は、分割された変換テーブル３４３の親ノードの変換テーブル３４３を記憶するＭＮ３１が、分割された変換テーブル３４３の子ノードの変換テーブル３４３に、登録更新コマンドを送信することによって実行されてもよい。
【０１２７】
図２６は、リード処理の実行時におけるリードコマンドの転送経路を示す図である。サーバ３からデータリードのリクエストが入力されると、ＣＵ１４はＭＮ（４、０）を宛て先とするリードコマンドを生成してＭＮ（３、０）に転送する。ＭＮ（３、０）が受信したリードコマンドは、ＭＮ（４、０）に転送される。ＭＮ（４、０）は、リードコマンドに含まれるキーに基づいて2nd K2Kを記憶するＭＮ（２、１）を特定する。そして、ＭＮ（４、０）は、リードコマンドの宛て先をＭＮ（２、１）に書き換えてＭＮ（３、０）に転送する。ＭＮ（３、０）が再び受信したリードコマンドは、ＭＮ（２、０）を経由してＭＮ（２、１）に転送される。ＭＮ（２、１）は、リードコマンドに含まれるキーに基づいてK2Aを記憶するＭＮ（３、２）を特定する。そして、ＭＮ（２、１）は、リードコマンドの宛て先をＭＮ（３、２）に書き換えてＭＮ（２、２）に転送する。ＭＮ（２、２）が受信したリードコマンドは、ＭＮ（３、２）に転送される。ＭＮ（３、２）は、リードコマンドに含まれるキーに基づいてデータアドレスを特定する。そして、ＭＮ（３、２）は、リードコマンドの宛て先を、特定したデータアドレスに書き換えてＭＮ（４、２）に転送する。ＭＮ（４、２）が受信したリードコマンドは、ＭＮ（５、２）に転送される。ＭＮ（５、２）は、データアドレスが示す位置からデータをリードする。
【０１２８】
図２７は、リード処理の実行時におけるデータの転送経路を示す図である。ＭＮ（５、２）は、リードしたデータをリードコマンドの送り元のＣＵ１４を宛て先としてＭＮ（４、２）に転送する。ＭＮ（４、２）が受信したデータは、ＭＮ（３、２）、ＭＮ（３、１）、およびＭＮ（３、０）をこの順番で経由して、リードコマンドの送り元のＣＵ１４に転送される。ＣＵ１４は、受信したデータをサーバ３に送信する。リードしたデータの転送経路は、リードコマンドの転送経路をたどらなくてもよく、また、ＭＮ（４、０）や2nd K2Kを記憶するＭＮ（２、１）やＫ２Ａを記憶するＭＮ（３、２）を経由しなくてもよい。また、ＭＮ（５、２）は、リードコマンドの送り元ではないＣＵ１４を宛先としてリードしたデータを送信してもよい。
【０１２９】
ライト処理の実行時におけるライトコマンドの転送経路は、リードコマンドの転送経路と同様であるので、説明を省略する。
【０１３０】
図２８は、ライト処理の実行時におけるＡＣＫの転送経路を示す図である。図示するように、ＭＮ（５、２）は、データアドレスが示す位置にデータをライトした後、ＭＮ（３、２）を宛て先とするＡＣＫを生成してＭＮ（４、２）に転送する。ＭＮ（４、２）が受信したＡＣＫは、ＭＮ（３、２）に転送される。あるいは、ＭＮ（５、２）は、ＣＵ１４を宛先としてＡＣＫを送信してもよく、このときにはＡＣＫはＭＮ（３、２）を経由しなくてもよい。
【０１３１】
以上述べたように、第２の実施形態によれば、キーとデータアドレスとの対応関係が記録される変換テーブル３４３が、木構造のリンク関係を構成する複数の変換テーブル３４３に分割され、分割された複数の変換テーブル３４３は、夫々異なるＭＮ３１に記憶される。変換テーブル３４３を記憶する各ＭＮ３１は、自ＭＮ３１を宛て先とするコマンドを受信すると、コマンドに含まれるキーを用いて変換テーブル３４３を検索し、検索されたアドレスを宛て先としてコマンドを転送する。ここで、根ノードの変換テーブル３４３は、複数に複製されて、夫々異なるＭＮ３１に記憶される。ＣＵ１４は、根ノードの変換テーブル３４３を記憶するＭＮ３１−０のうちの１つを最初の宛て先としてコマンドを送信する。これにより、サーバ３はキーを指定する一回のＩ／Ｏアクセスでストレージシステム４に記憶されるデータにアクセスすることができる。即ち、サーバ３がストレージシステム４に対し、キーをデータアドレスに変換するためのＩ／Ｏアクセスを行った後に変換されたデータアドレスにＩ／Ｏアクセスする場合に比べて、サーバ３とストレージシステム４との間のＩ／Ｏアクセスの回数を低減することができる。即ち、第２の実施形態によれば、ネットワーク２の負荷が低減されるので、必要な外部リソースを少なくすることができる。また、キーからデータアドレスへの変換が分散されて実行されるので、変換が集中して実行される場合に比べてスケールアウトによる性能向上が期待できる。
【０１３２】
また、第２の実施形態によれば、根ノードの変換テーブル３４３が多重化されて夫々異なるＭＮ３１に記憶されるので、根ノードの変換テーブル３４３が多重化されていない場合に比べて根ノードの変換テーブル３４３を記憶するＭＮ３１−０に対するアクセスを分散させることができる。したがって、根ノードの変換テーブル３４３を記憶するＭＮ３１−０にアクセスが集中することによる性能低下を抑制することができる。また、木構造のリンク関係を有する複数の変換テーブル３４３が夫々異なるＭＮ３１に分散して記憶されるため、データアドレスを検索する処理が複数のＭＮ３１によって分散して実行される。このため、データアドレスの検索能力が向上する。
【０１３３】
（第３の実施形態）
例えばＢ木のように、階層の深さが変化する木構造が知られている。木構造の根ノードのオーダー（オーダーはエントリ数に等しい）が所定値に達した場合には、根ノードが分割されて階層の深さが一段分だけ増加する。第３の実施形態によれば、変換テーブルが複数に階層化されるとともに、変換テーブルの階層の深さが可変に構成されている。なお、第３の実施形態のストレージシステムが備える構成要素は、検索テーブルの構成を除いて第２の実施形態と同様である。ここでは、第２の実施形態の構成要素と同一の名称および符号を用いて説明する。
【０１３４】
図２９は、第３の実施形態の変換テーブルの構成例を示す図である。第３の実施形態によれば、特定のＭＮ３１に、Root K2Kを記憶するＭＮ３１−０のノードアドレスを示すルートポインタ（Root pointer）のリストが記憶される。ルートポインタのリストは、複数に複製され、夫々異なるＭＮ３１に記憶される。ルートポインタを記憶する複数のＭＮ３１は、夫々特定のＭＮ３１に予め定められているとともに固定されている。なお、Root K2Kは多重化され、各Root K2Kは夫々異なるＭＮ３１（ＭＮ３１−０）に記憶される。また、第３の実施形態においては、ＭＮ３１−０は、ルートポインタを記憶するＭＮ３１のうちの少なくとも１つのノードアドレスである上位ノードアドレス３４２を管理領域３４０に記憶する。
【０１３５】
図３０は、Root K2Kのエントリ数が所定値に達した場合の処理を示すシーケンス図である。ここでは、ルートポインタを記憶するＭＮ３１に符号３１−３を付すことによって、変換テーブルを記憶するＭＮ３１および変換テーブルを記憶しないＭＮ３１と区別する。
【０１３６】
まず、ＭＮ３１−０は、Root K2Kのエントリ数が所定値を越えると（Ｓ３０１）、上位ノードアドレス３４２を参照することによって、ノードアドレスＮＡ６を取得する（Ｓ３０２）。ＭＮ３１−０は、ノードアドレスＮＡ６を宛て先を示す情報とする分割依頼コマンドを生成し送信する（Ｓ３０３）。Ｓ３０３において生成される分割依頼コマンドは、Root K2Kを含む。ノードアドレスＮＡ６は、ＭＮ３１−３のうちの１つに割り当てられたノードアドレスである。なお、ノードアドレスＮＡ６が割り当てられたＭＮ３１−３が記憶するルートポインタは、この時点においてはノードアドレスＮＡ１を示している。
【０１３７】
ノードアドレスＮＡ６が割り当てられたＭＮ３１−３は、分割依頼コマンドを受信すると、新規にRoot K2Kを記憶させるＭＮ３１と新規に2nd K2Kを記憶させるＭＮ３１とを夫々決定する（Ｓ３０４）。新規にRoot K2Kを記憶させるＭＮ３１のノードアドレスをＮＡ７、新規に2nd K2Kを記憶させるＭＮ３１のノードアドレスをＮＡ８とする。
【０１３８】
続いて、ＭＮ３１−３は、Root K2Kを２つの2nd K2Kに分割し（Ｓ３０５）、当該分割を反映したRoot K2Kを新規に生成する（Ｓ３０６）。そして、ＭＮ３１−３は、ノードアドレスＮＡ７が割り当てられたＭＮ３１およびノードアドレスＮＡ８が割り当てられたＭＮ３１を宛て先として、夫々登録コマンドを送信する（Ｓ３０７、Ｓ３０８）。また、ＭＮ３１−３は、ＭＮ３１−０を宛て先として登録更新コマンドを送信する（Ｓ３０９）。ノードアドレスＮＡ７が割り当てられたＭＮ３１に送信される登録コマンドは、上位ノードアドレス３４２としてノードアドレスＮＡ６を、変換テーブル３４３としてＳ３０６において新規に生成されたRoot K2Kを、夫々記憶させるコマンドである。ノードアドレスＮＡ8８が割り当てられたＭＮ３１に送信される登録コマンドは、上位ノードアドレス３４２としてノードアドレスＮＡ７を、変換テーブル３４３としてＳ３０５において生成された２つの2nd K2Kのうちの一方を、夫々記憶させるコマンドである。Ｓ３０９にて生成される登録更新コマンドは、上位ノードアドレス３４２をノードアドレスＮＡ７に、変換テーブル３４３をＳ３０５において生成された２つの2nd K2Kのうちの他方に、夫々更新させるコマンドである。
【０１３９】
続いて、ＭＮ３１−３は、Root pointerをノードアドレスＮＡ１からノードアドレスＮＡ７に更新する（Ｓ３１０）。
【０１４０】
ノードアドレスＮＡ７が割り当てられたＭＮ３１は、登録コマンドを受信すると、ノードアドレスＮＡ６を上位ノードアドレス３４２として、送信されてきたRoot K2Kを変換テーブル３４３として、自身が備える管理領域３４０に夫々格納する（Ｓ３１１）。以降、ノードアドレスＮＡ７が割り当てられたＭＮ３１は、Root K2Kを記憶するＭＮ３１として機能する。
【０１４１】
ノードアドレスＮＡ８が割り当てられたＭＮ３１は、登録コマンドを受信すると、ノードアドレスＮＡ７を上位ノードアドレス３４２として、送信されてきた2nd K2Kを変換テーブル３４３として、自身が備える管理領域３４０に夫々格納する（Ｓ３１２）。以降、ノードアドレスＮＡ８が割り当てられたＭＮ３１は、2nd K2Kを記憶するＭＮ３１として機能する。
【０１４２】
ＭＮ３１−０は、登録更新コマンドを受信すると、上位ノードアドレス３４２をノードアドレスＮＡ６からノードアドレスＮＡ７に、変換テーブル３４３をRoot K2Kから2nd K2Kに、夫々更新する（Ｓ３１３）。ＭＮ３１−０は、以降、2nd K2Kを記憶するＭＮ３１として機能する。
【０１４３】
このように、第３の実施形態によれば、根ノードの変換テーブル３４３を記憶するＭＮ３１−０を示すRoot pointerが多重化されて夫々異なるＭＮ３１−３に記憶される。これにより、ストレージシステム４は、Ｂ木のように階層数が変化する木構造のリンク関係を有する複数の変換テーブル３４３を用いてデータアドレスの検索を行うことができるようになる。また、Root pointerは多重化されて夫々異なるＭＮ３１−３に記憶されるので、Root pointerを記憶するＭＮ３１−３に対するアクセスを分散させることができるので、ＭＮ３１−３に対してアクセスが集中することによる性能低下を抑制することができる。
【０１４４】
また、ＭＮ３１−３は、Root K2Kのエントリ数が所定数に達したとき、Root K2Kを複数の2nd K2Kに分割するとともに新たなRoot K2Kを生成し、分割された夫々の2nd K2Kと新たに生成されたRoot K2Kとを夫々異なるＭＮ３１に記憶させる。これにより、ストレージシステム４は、複数の変換テーブル３４３が構成する木構造の階層数を変更することが可能となる。
【０１４５】
なお、第２の実施形態または第３の実施形態のストレージシステム４は、同一階層の変換テーブル３４３間でエントリの受け渡しが可能に構成されてもよい。例えば、ｉ階層目の変換テーブル３４３を記憶するＭＮ２１は、親ノードの変換テーブル３４３を記憶するＭＮ２１にエントリを送信する。エントリを受信したＭＮ２１は、自ＭＮ２１が記憶する変換テーブル３４３の子ノードの変換テーブル３４３を記憶する複数のＭＮ２１のうちから１つを選択して、選択したＭＮ２１に登録更新コマンドを送信してエントリを追加させる。また、ｉ階層目の変換テーブル３４３を記憶するＭＮ２１は、子ノードの複数の変換テーブル３４３を監視して、１つの子ノードの変換テーブル３４３からエントリを削除して、他の子ノードの変換テーブル３４３に前記削除したエントリを追加してもよい。
【０１４６】
本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。
【符号の説明】
【０１４７】
１，４  ストレージシステム、２  ネットワーク、３  サーバ、１１  論理メモリノード、１６  入出力ポート、２１  物理メモリノード、２２  ブレード基盤、３１  メモリノード、３２４  変換アルゴリズム、３４２  上位ノードアドレス、３４３  変換テーブル。
【図１】
0005902137.tif 000002
【図２】
0005902137.tif 000003
【図３】
0005902137.tif 000004
【図４】
0005902137.tif 000005
【図５】
0005902137.tif 000006
【図６】
0005902137.tif 000007
【図７】
0005902137.tif 000008
【図８】
0005902137.tif 000009
【図９】
0005902137.tif 000010
【図１０】
0005902137.tif 000011
【図１１】
0005902137.tif 000012
【図１２】
0005902137.tif 000013
【図１３】
0005902137.tif 000014
【図１４】
0005902137.tif 000015
【図１５】
0005902137.tif 000016
【図１６】
0005902137.tif 000017
【図１７】
0005902137.tif 000018
【図１８】
0005902137.tif 000019
【図１９】
0005902137.tif 000020
【図２０】
0005902137.tif 000021
【図２１】
0005902137.tif 000022
【図２２】
0005902137.tif 000023
【図２３】
0005902137.tif 000024
【図２４】
0005902137.tif 000025
【図２５】
0005902137.tif 000026
【図２６】
0005902137.tif 000027
【図２７】
0005902137.tif 000028
【図２８】
0005902137.tif 000029
【図２９】
0005902137.tif 000030
【図３０】
0005902137.tif 000031