まず、本発明の技術コンセプトを簡単に説明する。本発明は、データを保存する2次記憶領域を分散させ、かつデータの特徴に応じて、保存先の2次記憶領域を選択する。さらに、データを格納する2次記憶領域を、分散化したノード(以下、ストレージノードという。)として実装することで、領域を追加しやすくし、利用の変化に対応しやすくする。例えば、各ストレージノードにデータ長に応じた記憶領域を用意させ、データ長に応じて格納先とするノードを使い分けることで、フラグメントの発生を抑制できる。
システム内のデータの一貫性を保ったまま、このように分散化されたストレージノードへのアクセスを可能にするために、本発明では、データをアクセスする際に物理アドレスの代わりに独自の固有のIDを用いるオブジェクトストレージへのアクセス方法を利用する。
より具体的には、データの格納先を特定するための固有のIDとして、ハッシュ関数への入力であるキーを用いる(以下、IDやキーという語のみでは分かりにくい場合には、ユーザキーとも記述する)。また、このような固有のIDを用いることによって、ユーザ側は、このIDを指定してアクセスするだけで、データの実際の格納位置やアクセス手段を知らなくても実データに到達できる。また、システム内でデータの格納先をメタデータと切り離した形で管理できるので、データ領域の拡張性が容易に得られる。なお、本発明の方法であれば、ストレージノードの上位層にあたるノードがその固有のID(ユーザキー)とメタデータとを対応づけて管理しておけばよい。ストレージノード側でユーザキーに対応したデータを格納、取得できるように構成すればよく、ストレージノードのデータ格納方法をファイルシステムとは別の形態、例えば、DBとすることもできる。
また、本発明では、オブジェクトストレージへのアクセス方法にさらなる応用を加え、実データのある2次記憶装置側(ストレージ側)と、ユーザからのアクセスを受け付ける側(アクセス処理側)とに層を分け、かつそれぞれの層を分散化させる。これにより、運用中であってもデータの格納領域を個別に調整できるようにする。また、データの格納領域に至るまでの経路上での最適化など、データの特徴に応じた効率的な格納処理を提供できるようにする。
さらに、前段のアクセス処理側の層を担当するノード(以下、フロントノードという。)を並列アクセス可能なように設計し、フロントノードの追加や削除で分散性の調整を行えるようにする。
以下、本発明の実施形態を図面を参照して説明する。図1は、本発明の第1の実施形態のストレージシステムの概略構成図である。図1に示すストレージシステム1000は、大きく分けると、最初にアクセスされ、ユーザ1003からデータの格納要求や格納したデータの読出要求を受け付けるノードであるフロントノード101を1つ以上含むフロントノード群1001と、実際にデータを2次記憶装置に格納するノードであるストレージノード102を1つ以上含むストレージノード群1002とを備える。
ユーザ1003は、データやデータに結び付いたキーを使った操作を、フロントノード群1001に含まれるいずれかのフロントノード101に行うことで、データを格納したり、格納したデータを読み出したりできる。ここで、ユーザ1003とは、データの格納要求やデータの読出要求を行う外部のインスタンスの総称として用いてる。ユーザ1003は、例えば、上位層のアプリケーションであってもよいし、ネットワークを介して接続されるユーザ端末などのコンピュータであってもよい。
各フロントノード101及び各ストレージノード102は、例えば、プログラムに従って動作するCPUなどの情報処理装置と、メモリなどの主記憶装置(1次記憶装置)と、HDDなどの2次記憶装置と、ネットワークインタフェース部とを備えた計算機によって実現される。なお、フロントノード101は、2次記憶装置を直接実装せずに、外部の2次記憶装置を利用する形態であってもよい。
このように、本実施形態のストレージシステムは、データやデータに結び付いたキーを使った操作を行うことでデータを格納するストレージ機能を、フロントノード101とアクセスノード102の2層のレイヤに分けて、各々を分散ノードとして実装している。
ストレージノード102は、データの特徴に対応づけて複数用意され、各々が対応するデータの特徴に対して好適とされる記憶領域を提供可能なように各種パラメータが設定されている。
また、フロントノード101も複数用意され、ユーザ1003から受け付けたアクセスを分散して処理する。より具体的には、フロントノード101は、ユーザ1003からアクセスを受け付けて、受け付けたアクセス処理を担当するフロントノードを決定する機能と、担当フロントノードとしてアクセス処理の依頼を受けた場合に、データの特性に応じたストレージノードを選択し、選択したストレージノードに対してアクセスを実際に行う機能とを有することにより複数のクライアントからの並列アクセスが可能な構成としている。
以下、図2〜図31を参照して、このようなストレージシステムの構成および動作についてより具体的に説明する。図2は、本実施形態のストレージシステムの他の構成例を示すブロック図である。図2に示すストレージシステム2000は、フロントノード群2001とストレージノード群2002と、ノードID管理サーバ204とを備えている。また、図2では、ユーザ1003の一例として、クライアント端末2003が示されている。なお、図2にはフロントノード群2001が3つのフロントノード201を含み、ストレージノード群2002が3つのストレージノード202を含む例が示されているが、フロントノード201およびストレージノード202の数はこの限りではない。フロントノード群2001が1つ以上のフロントノード201を含み、ストレージノード群2002が1つ以上のストレージノード202を含んでいればよい。
各フロントノード201は、少なくとも他のフロントノード201と、1つ以上のストレージノード202と、ノードID管理サーバ204と通信可能に接続される。また、各ストレージノード202は、少なくとも1つ以上のフロントノード201と、ノードID管理サーバ204と通信可能に接続される。
以下、図中においてフロントノードAと名付けられているフロントノードをフロントノード201A、フロントノードBと名付けられているフロントノードをフロントノード201B、フロントノードCと名付けられているフロントノードをフロントノード201Cと記す場合がある。また、図中においてストレージノード1と名付けられているストレージノードをストレージノード202−1、ストレージノード2と名付けられているストレージノードをストレージノード202−2、ストレージノード3と名付けられているストレージノードをストレージノード202−3と記す場合がある。
フロントノード201の役割は、クライアント端末2003その他ユーザ(他の端末およびアプリケーション層を含む)からのアクセスを補助することと、データのキャッシュを一定期間保持し応答性能を向上させることにある。以下では、ユーザの代表として、クライアント端末2003から要求があった場合を例に用いて説明する。
また、それぞれのフロントノード201は、フロントノードIDと呼ぶ識別子を持つ。この値は、ノードの登録時に決定する。本実施形態では、各フロントノードが後述のノードID管理サーバ204に登録コマンドを発行し、戻り値としてフロントノードIDを受け取る例を示すが、フロントノードIDの取得方法はこの限りではない。例えば、管理者によって予め記憶領域に記憶されたものを起動時に読み出してもよい。また、以下に示す例では、Consistent Hashingと呼ばれるハッシュ法を利用してノードの担当範囲を決定する方法を用いるため、フロントノードIDを、後述するキーIDやコンテンツIDの空間と同一の範囲とする。なお、Consistent Hashingについては後述する。フロントノードIDは、例えば、キーIDおよびコンテンツIDの空間範囲として「SHA−1(Secure Hash Algorithm−1)」と呼ばれるハッシュ関数のハッシュ空間を用いる場合、SHA−1というハッシュ関数のハッシュ空間と同じ空間範囲である、0以上かつ2160−1以下の値とすればよい。
図3は、フロントノード201のより詳細な構成例を示すブロック図である。図3に示すように、フロントノード201は、クライアント端末2003からのアクセスを受け付けて後述する処理を実行する制御部11と、ネットワークインタフェース部12と、キーIDテーブルと呼ぶ管理テーブルの保持領域131およびキャッシュエリア132を少なくとも記憶領域に含む1次記憶装置13と、保存用キーIDテーブルの保持領域141を少なくとも記憶領域に含む2次記憶装置14とを有していてもよい。
なお、保存用キーIDテーブルは、1次記憶装置13が保持するキーIDテーブルの退避用のテーブルである。このように、キーIDテーブルの内容は、更新などが行われると適時2次記憶装置14に保存用キーIDテーブルとして記憶され、データが保全されることが好ましい。
また、図4は、キーIDテーブルのデータ構造の一例を示す説明図である。図4に示すように、キーIDテーブルは、キーIDと、キーと、メタデータと、データアドレスと、コンテンツIDと、有効期間とを含んでいてもよい。ここで、「キーID」には、ユーザが指定したキーを元に変換したハッシュ値を登録する。また、「キー」にはユーザから指定されたキー、より具体的にはリクエスト時に渡されたキーを登録する。また、「データアドレス」には、クライアント端末2003から渡されたデータを記憶させた1次記憶装置13上のキャッシュエリア132内のアドレスを登録する。また、「メタデータ」には、更新日時やデータなど、クライアント端末2003から渡されたデータに関連づけるメタデータを登録する。なお、本実施形態では、メタデータに、ストレージノードの分散化において着目するデータの特徴を含ませる。なお、本例では、着目するデータの特徴として、「データ長」を含む。以下、着目するデータの特徴のことを「着目データ特徴」という場合がある。また、その着目データ特徴の具体的な内容を指して「着目データ特徴の値」という場合がある。なお、ここでいう「着目データ特徴の値」には定量的でない内容も含まれる。また、「有効期間」には、当該フロントノード201におけるキャッシュデータの有効期間を登録する。なお、本例では、キャッシュエリア132内のデータのキャッシュとしての有効時間を保持するものとする。
キャッシュエリア132は、1次記憶装置13内に確保したテンポラリのデータ格納用の領域であり、ユーザとのデータの受け渡しに利用する。このエリアにあるデータの有効か無効かの判断にキーIDテーブルの「有効期間」エントリを使用する。
また、図5は、フロントノード201の制御部11の機能面における構成例を示すブロック図である。図5に示すように、フロントノード201の制御部11は、アクセス要求受付手段1111と担当フロントノード検索手段1112とを有する受付フロントノード処理部111と、アクセス要求受付手段1121と担当ストレージノード検索手段1122とを有する担当フロントノード処理部112とを含んでいてもよい。なお、これら各手段の動作については後述する。
次に、ストレージノード202について説明する。ストレージノード202の役割は、クライアント端末2003から渡されたデータを2次記憶装置に保存することにある。本発明では、フラグメントの発生を抑制するために、各ノードの構成をより着目データ特徴に合わせたものにするのが好ましい。
以下に示す例では、格納されるデータの大きさに着目しているため、各ストレージノード202の2次記憶装置をあらかじめいくつかの単位に分割しておく。そして、これをフラグメント対策に利用する。すなわち、本例では、データ長ごとに専用の保存領域を設定し、使うようにする。
また、本実施形態では、フロントノード201とストレージノード202との間に、格納するデータの特性に応じた通信手段を設ける。通信手段としては、例えば、TCP/IPを使うEthernet(登録商標)やRDMA(Remote Direct Memory Access)通信が使えるInfiniBandなどが挙げられる。
データ長が小さい場合は、TCP/IPネットワーク通信でも構わないが、データ長が大きくなるとより効率的に転送を行える通信手段を用いることが好ましい。本例では、データ長ごとに格納するストレージノード202が分けられるので、大きなデータを格納するストレージノード202との経路上で通信手段や通信方法の最適化を行うことができる。例えば、TCP/IPネットワークではMTU(Maximum transmission Unit)長をEthernetの標準の1500から9000などのように大きくしたり、InfiniBandを使ったRDMA通信でデータを転送するなど、通信路を変更すればデータ特性に応じた効率的なアクセス手段を提供できる。
例えば、MTUを通常時の1500から9000に大きくした場合、1通信パケットあたりのデータサイズが大きくなるので、同じサイズのデータをやりとりする場合に、Ethernetのフレーム数を最大6倍削減できる。すると、通信パケットを処理していた分のCPUの負荷が減少でき、他の処理に費やすことができる。
また、それぞれのストレージノード202は、ストレージノードIDと呼ぶ識別子を持つ。この値は、フロントノード201同様、ノード登録時に決定する。本実施形態では、各ストレージノードが後述のノードID管理サーバ204に登録コマンドを発行し、戻り値としてストレージノードIDを受け取る例を示すが、ストレージノードIDの取得方法はこの限りではない。例えば、管理者によって予め記憶領域に記憶されたものを起動時に読み出してもよい。また、以下に示す例では、後述するConsistent Hashingと呼ばれるハッシュ法を利用してノードの担当範囲を決定する方法を用いるため、ストレージノードIDも、キーIDやコンテンツIDの空間と同一の範囲としている。
図6は、ストレージノード202のより詳細な構成例を示すブロック図である。図6に示すように、ストレージノード202は、フロントノード201からのアクセスを受け付けて後述する処理を実行する制御部21と、ネットワークインタフェース部22と、コンテンツIDテーブルと呼ぶ管理テーブルの保持領域231およびワークエリア232を少なくとも記憶領域に含む1次記憶装置23と、保存用コンテンツIDテーブルの保持領域241とデータ格納領域242とを少なくとも記憶領域に含む2次記憶装置24とを有していてもよい。
なお、2次記憶装置上にある保持領域241に保持される保存用コンテンツIDテーブルは、1次記憶装置23が保持するコンテンツIDテーブルの退避用のテーブルである。このように、コンテンツIDテーブルの内容は、更新などが行われると適時2次記憶装置24に保存用コンテンツIDテーブルとして記憶し、データを保全することが好ましい。また、データ格納領域242は、実データを保存するための領域である。本実施形態では、各ストレージノード202のデータ格納領域242のセグメントサイズ(クラスタサイズ)を、保存するデータ長に応じて設定する。例えば、図1におけるストレージノード202−1ではクラスタサイズを256MBとし、ストレージノード202−2ではクラスタサイズを128MBとし、ストレージノード202−3ではクラスタサイズを64MBとする、といった設定を行う。なお、ストレージノードをいくつかのグループに分け、グループごとにクラスタサイズを設定することも可能である。すなわち、同じクラスタサイズのストレージノードが複数あってもよい。
また、通信などデータの受け渡しにメモリが必要な際は、ワークエリア232を利用すればよい。通常のOSでは、汎用的にメモリの割り当てが可能なため、ワークエリア232を特に意識して割り当てなくても実現可能である。
また、図7は、コンテンツIDテーブルのデータ構造の一例を示す説明図である。図7に示すように、コンテンツIDテーブルは、コンテンツIDと、データアドレスと、メタデータとを含んでいてもよい。ここで、「コンテンツID」には、格納したデータから算出したハッシュ値、いわゆる「メッセージダイジェスト」を登録する。また、「メタデータ」には、データ長、更新日時などデータに関連ついたメタデータを登録する。既に説明したように、本実施形態において、当該メタデータは着目データ特徴を含む。なお、本例では、着目データ特徴として、データ長をメタデータに含む。メタデータは、例えば、データ格納時にデータとともに渡されたものを登録すればよい。なお、当該ストレージノードで必要とされるデータを付加したものを、当該ストレージノードにおけるデータのメタデータとして登録してもよい。また、「データアドレス」には、当該ストレージノード202の2次記憶装置24に格納したデータの格納先アドレスを登録する。
あるデータを与えると対応したデータよりも小さな値を返すものをハッシュ関数と呼ぶ。また、ハッシュ関数により得た値をハッシュ値と呼ぶ。ハッシュ関数として、MD5(Message Digest Algorithm 5)やSHA−1と呼ばれるものが広く使われている。ハッシュ値をデータの区別をするために使用した場合に、そのハッシュ値をメッセージダイジェストと呼ぶ場合がある。
また、SHA−1アルゴリズムは、NIST(National Institute of Standards and technology:アメリカ国立標準技術研究所)によって「FIPS PUB 180−1」として公開されている。また、同様のものが、IETF(Internet Engineering Task Force)により、「RFC3174」として公開されている。このアルゴリズムは、あるデータに対し、2の160乗までの数値でハッシュ値を得ることができる。すなわち、データを2の160乗の空間にマッピングできる。SHA−1は、ハッシュ値がハッシュ空間上に一様に分布するという特性があるため、メッセージダイジェスト用途に広く利用されている。
本実施形態では、格納されるデータにつき、SHA−1を用いてハッシュ値を作成し、この値をコンテンツIDとする。そして、このコンテンツIDは、そのデータを格納したストレージノード202においてデータアドレスと紐付けされて保持される。記憶領域から取り出す際に必要となるデータサイズは、メタデータとして同時に紐付ける。メタデータは必要に応じて種類を増やしてもよい。
また、図8は、ストレージノード202の制御部21の機能面における構成例を示すブロック図である。図8に示すように、ストレージノード202の制御部21は、アクセス要求受付手段211と、アクセス実行手段212とを含んでいてもよい。これら各手段の動作については後述する。
次に、ノードID管理サーバ204について説明する。ノードID管理サーバ204は、各フロントノード201を識別するフロントノードIDと、各ストレージノード202を識別するストレージノードIDを管理するためのサーバである。なお、ノードID管理サーバ204は、実現の簡便化のために導入したものであって、ChordなどのP2P(Peer to Peer)技術を用いて各ノードが他のノードとの間の情報を交換できるモジュール等を有していれば省略することも可能である。なお、Chordとは、分散ハッシュテーブルを複数のピアで管理するための代表的なアルゴリズムの1つである。
ノードID管理サーバ204は、フロントノード管理テーブルと、ストレージノード管理テーブルとを保持し、各ノードからの求めに応じてこれらテーブル内の情報またはテーブル内の情報に基づく情報を提供する。ノードID管理サーバ204は、例えば、プログラムに従って動作するCPUなどの情報処理装置と、メモリなどの主記憶装置(1次記憶装置)と、HDD(Hard Disk Drive)などの2次記憶装置と、NIC(Network Interface Card)などの通信装置を制御するネットワークインタフェース部とを備えた計算機によって実現される。
フロントノード管理テーブルは、当該ストレージシステムが備えるフロントノードを管理するために用いられるテーブルである。フロントノード管理テーブルは、例えば、当該ストレージシステムが備えるフロントノード201について、フロントノードIDとIPアドレスとを含む情報を保持するテーブルであってもよい。なお、本例では、フロントノードと他のフロントノード間、フロントノードとストレージノード間、およびノードID管理サーバとフロントノード間、ノードID管理サーバとストレージノード間で情報をやりとりするために一般的に普及しているTCP/IPネットワーク通信を用いることを想定しているが、各経路の通信手段はこの限りではない。例えば、フロントノード−ストレージノード間の通信に、InfiniBandを利用することも考えられる。フロントノード管理テーブルは、IPアドレスに加えてまたはIPアドレスの代わりに、他のノードが当該フロントノードと通信するために必要な情報を含んでいてもよい。
また、ストレージノード管理テーブルは、当該ストレージシステムが備えるストレージノードを管理するために用いられるテーブルである。ストレージノード管理テーブルは、例えば、当該ストレージシステムが備えるストレージノード202について、ストレージノードIDとIPアドレスとを含む情報を保持するテーブルであってもよい。なお、ストレージノード管理テーブルも同様に、IPアドレスに加えてまたはIPアドレスの代わりに、他のノードが当該ストレージノードと通信するために必要な情報を含んでいてもよい。また、管理者のノードの把握を容易にするために、当該ストレージノードが対応可能な着目データ特徴に関する情報を含んでいてもよい。
次に、本実施形態の動作について説明する。本実施形態では、システムの立ち上げ時に、最初にノードID管理サーバ204を立ち上げた後、各ストレージノード202、各フロントノード201の順で立ち上げることが好ましい。なお、立ち上げの順序はこの限りではない。
図9は、ノードID管理サーバ204の動作の一例を示すフローチャートである。図9に示す例では、ノードID管理サーバ204は、立ち上がるとノードID管理プログラムを実行する(ステップS11)。ノードID管理サーバ204は、ノードID管理プログラムに従って、以下の処理を行う(ステップS12〜S13)。なお、ノードID管理サーバ204は、ステップS12の前に、初期化処理として、フロントノード管理テーブルとストレージノード管理テーブルのクリアを行った後、前回までに使用し保存していたデータ内容があれば復帰させる。他、通信用のソケットの作成など初期化処理を行う。
ステップS12では、ノードID管理サーバ204は、ノードID管理プログラムに従い、ノードの死亡を監視するノード死活監視プログラムをフロントノード用とストレージノード用の2つ起動する。ノードID管理サーバ204は、ノード死活監視プログラムを起動した後は、ノードの登録要求等のリクエストを待ち受ける(ステップS13)。
また、ノードID管理サーバ204は、終了のシグナルを受けると、フロントノード管理テーブルとストレージノード管理テーブルの内容を2次記憶装置に保存し、別に立ち上げたノード死活監視プログラムを含めたノードID管理プログラムを終了させる(ステップS14のYes,S15)。
図10は、ノードID管理サーバ204によるノード死活監視処理の処理フローの一例を示すフローチャートである。当該処理フローは、例えば、ノード死活監視プログラムに従って実行される。ノードID管理サーバ204は、ノード死活監視プログラムに従って、登録されたノードが活きているか、活きていないかを監視する。フロントノードを監視するノード死活監視プログラムでは、フロントノード管理テーブルを使用する。また、ストレージノードを監視するノード死活監視プログラムでは、ストレージノード管理テーブルを使用する。両者は同様の動きを行い、応答のあるノードの情報を各管理テーブル上に維持する。
死活監視は、対象ノードにネットワーク通信を行い、応答があるか否かを確認することによって行う。もし対象ノードから応答がなければ、管理テーブル上からそのノードに関するエントリを削除する。以下、この行為をPINGと呼ぶ。
図10に示す例では、まず、ノードID管理サーバ204は、全ての対象ノードにPINGを出した状態であるか否かを確認し、全ての対象ノードにPINGを出した状態であれば、一定時間の休止を行う(ステップS1101のYes,S1102)。なお、起動直後は、フロントノードおよびストレージノードの立ち上げを待つために、全ての対象ノードにPINGを出した状態であるとし、一定時間の休止を行う。
一定時間が経過し休止があけると、ノードID管理サーバ204は、対象とする管理テーブルに、登録されたノードがあれば一つ取り出し(ステップS1103)、当該ノードに対してPINGを実行する(ステップS1104)。具体的には、登録されたノードに対して小データを送り、応答が返ってくれば活きていると判断する(ステップS1105,S1101に戻る)。なお、登録されたノードが1つもなければ、再びステップS1102に戻り、再び一定時間休止する。
もし応答がなければ、登録されたノードの情報を管理テーブルから削除する(ステップS1106)。
1つのノードに対するPING処理が完了すると、ノードID管理サーバ204は、次の選択していないノードを選択し、PING処理を実行する(ステップS1101に戻り、S1103に進む)。これをテーブル上の全登録ノードに対して実行し、活きているノードの情報を管理テーブル上に維持する。
そして、全ての対象ノードに対してPINGの実行をし終えると、一定時間休止する(ステップS1102)。休止があけると上記の処理を繰り返し行う。これにより、ノードID管理サーバ204が起動中は、定期的にノード死活監視が動作する。
次に、ノードID管理サーバ204によるリクエスト待ち受け処理(図9のステップS13)について説明する。図11は、ノードID管理サーバ204によるリクエスト待ち受け処理の処理フローの一例を示すフローチャートである。図11に示すように、ノードID管理サーバ204は、リクエスト待ちうけ状態にある時に(ステップS1201)、ネットワーク通信、もしくはその他の通信手段を介してリクエストを受け取ると、受け取ったリクエストを処理する。より具体的には、受け取ったリクエストの種類を確認して、対応する処理を行い、再びリクエスト待ちうけ状態に戻る(ステップS1202〜S1214、ステップS1201に戻る)。
本実施形態では、ノードID管理サーバ204は、ADD_FRONT_NODEリクエストと、ADD_STORAGE_NODEリクエストと、FIND_FRONT_NODEリクエストと、FIND_STORAGE_NODEリクエストと、NEXT_FRONT_NODEリクエストと、NEXT_STORAGE_NODEリクエストとを受け付ける。
例えば、ノードID管理サーバ204は、ADD_FRONT_NODEリクエストを受け付けると、フロントノード登録処理を行う(ステップS1203のYes,S1204)。
ノードID管理サーバ204は、ADD_STORAGE_NODEリクエストを受け付けると、ストレージノード登録処理を行う(ステップS1205のYes,S1206)。
また、ノードID管理サーバ204は、FIND_FRONT_NODEリクエストを受け付けると、担当フロントノード捜索処理を行う(ステップS1207のYes,S1208)。
また、ノードID管理サーバ204は、FIND_STORAGE_NODEリクエストを受け付けると、担当ストレージノード捜索処理を行う(ステップS1209のYes,S1210)。
また、ノードID管理サーバ204は、NEXT_FRONT_NODEリクエストを受け付けると、次フロントノード捜索処理を行う(ステップS1211のYes,S1212)。
また、ノードID管理サーバ204は、NEXT_STORAGE_NODEリクエストを受け付けると、次ストレージノード捜索処理を行う(ステップS1213のYes,S1214)。
以下、ノードID管理サーバ204が行う各リクエスト処理について説明する。図12は、ノードID管理サーバ204によるフロントノード登録処理の処理フローの一例を示すフローチャートである。ノードID管理サーバ204は、リクエストがADD_FRONT_NODEリクエストであった場合、フロントノード登録処理を行う。なお、当該リクエストは、各フロントノード201が起動時にノードID管理サーバ204に送信する。このリクエストでは、要求元のフロントノードからフロントノードIDとIPアドレスが渡される。
図12に示す例では、ノードID管理サーバ204は、渡されたフロントノードIDとIPアドレスを、フロントノード管理テーブルに格納する(ステップS1301)。そして、正常に格納できたら成功を、できなかったら失敗を、要求元のフロントノードに返却する(ステップS1302)。ADD_FRONT_NODEリクエストを受け付けることにより、ノードID管理サーバ204は、当該ストレージシステムが備えるフロントノードを把握する。また別の実装方法として、リクエストの際にフロントノード201からノードID管理サーバ204へ、自身(フロントノード)のIPアドレスを渡し、フロントノードの登録が成功した際に、ノード管理サーバ204から決定したフロントノードIDを返却する登録方法であってもよい。
また、図13は、ノードID管理サーバ204によるストレージノード登録処理の処理フローの一例を示すフローチャートである。ノードID管理サーバ204は、リクエストがADD_STORAGE_NODEリクエストであった場合、ストレージノード登録処理を行う。なお、当該リクエストは、各ストレージノード202が起動時にノードID管理サーバ204に送信する。このリクエストでは、要求元のストレージノードからストレージノードIDとIPアドレスと、当該ストレージノードが対応している着目データ特徴に関する情報(以下、対応特徴という。)が渡される。なお、対応特徴は着目データ特徴について複数の内容や範囲を示すものであってもよい。当該ストレージノード登録処理では、ストレージノードの登録ともに担当分けを行う。
図13に示す例では、ノードID管理サーバ204は、渡された対応特徴の内容から当該ストレージノードが所属するクラスを判別して、所属するクラスのストレージノード管理テーブルに、ストレージノードID、対応特徴、IPアドレスを登録する(ステップS1401,S1402)。そして、正常に格納できたら成功を、できなかったら失敗を、要求元のフロントノードに返却する(ステップS1403)。ADD_STORAGE_NODEリクエストを受け付けることにより、ノードID管理サーバ204は、当該ストレージシステムが備えるストレージノードとそのストレージノードが対応している着目データ特徴の値等を把握する。また別の実装方法として、リクエストの際にストレージノード202からノードID管理サーバ204へ、自身(ストレージノード)のIPアドレスと対応特徴を渡し、ストレージノードの登録が成功した際に、ノードID管理サーバ204から、決定したストレージノードIDを返却する登録方法でもよい。
図14は、ノードの担当分けの方法を概念的に示す説明図である。図14に示すように、ノードID管理サーバ204は、例えば、ストレージノードの担当分けを、着目データ特徴(本例では、データ長)に基づいて管理空間を分類することにより行ってもよい。このような場合、ノードID管理サーバ204は、着目データ特徴をその内容に応じて2以上のクラスに分類したクラスごとにストレージノード管理テーブルを持つようにしてもよい。
図15は、Consistent Hashingのモデル図である。図15に示すように、Consistent Hashingでは、ハッシュ空間を円周上に配置する。ここで、ハッシュ関数をSHA−1とした時、ハッシュ値は0≦x≦2160−1になる。ある特別なハッシュ値A,Bが存在したとき、Bの担当範囲をA<x,x≦B(なお、0≦x≦2160−1)を満たすxと定める。ただし、ハッシュ値D,Aが存在したとして、A<DかつDが最も大きな特別なハッシュ値でAが最も小さな特別なハッシュ値の場合は、D<x<2160−1,0≦x≦Aの値を担当範囲とする。直感的に説明すると、図15に示す円環上に配置されたハッシュ値を、右回りに担当していく構造である。ノードに対して特別なハッシュ値を割り当て、データを識別するIDにハッシュ値を割り当てると、Consistent Hashingのアルゴリズムを利用してデータの担当範囲を決定できる。なお、ノードが追加されたときは、加わった先の左右に位置するA、Bの範囲を分割する形で担当範囲を変更でき、右回り上に位置するノード以外の他の部分に対しては影響を与えない。また、ノードが削除されたときは、削除されたノードに対応するIDをBとすると、Bの右隣のCへ担当範囲が拡大するが、全体には波及せず、局所的な影響に留まる。このように、Consistent Hashingのアルゴリズムを利用すれば、ノード数が変化してもキャッシュが全て無効化するようなことにはならない。
なお、担当範囲の割り当てを他の特徴と合わせて行いたい場合は、他の特徴の分布を含めた多次元の管理空間を用意し、各特徴の値に応じてクラスを分類すればよい。
また、図16は、ノードID管理サーバ204による担当フロントノード捜索処理の処理フローの一例を示すフローチャートである。ノードID管理サーバ204は、リクエストがFIND_FRONT_NODEリクエストであった場合、担当フロントノード捜索処理を行う。このリクエストでは、要求元のフロントノードからキーIDが渡される。渡されるキーIDは、ユーザが指定したキーを元に変換したハッシュ値である。このリクエストは、各フロントノード201がキーIDを元に担当するフロントノードを割り出すのに使用される。
図16に示す例では、ノードID管理サーバ204は、渡されたキーIDを元に、このキーIDを担当するフロントノード201を決定する(ステップS1501)。本例では、フロントノード管理テーブルからConsistent Hashingに基づき担当フロントノード201を決定する。より具体的には、フロントノードIDがマッピングされたハッシュ空間においてキーIDが示すハッシュ値を担当範囲とする特別なハッシュ値(ここでは、フロントノードID)を有するフロントノードを、担当フロントノードに決定する。
担当フロントノードが見つかった場合には、ノードID管理サーバ204は、その担当フロントノード201のIPアドレスを返り値として、要求元のフロントノード201に送信する(ステップS1502)。担当ノードが見つからなかった場合には、失敗を返す。
また、図17は、ノードID管理サーバ204による担当ストレージノード捜索処理の処理フローの一例を示すフローチャートである。ノードID管理サーバ204は、リクエストがFIND_STORAGE_NODEリクエストであった場合、担当ストレージノード捜索処理を行う。このリクエストは、担当フロントノードを割り当てられたフロントノード201が、割り当てられたアクセス要求(データ格納要求またはデータ読出要求)を実際に行うストレージノードの情報を得るために使用される。このリクエストでは、要求元のフロントノードからコンテンツIDと着目データ特徴の値が渡される。渡されるコンテンツIDは、データ格納要求の場合は格納対象であるデータから作成されるハッシュ値である。また、データ読出要求の場合はユーザから指定されたキーと紐づけてキーIDテーブルに保持されていたコンテンツIDであって、当該データの格納時に登録されたコンテンツIDである。本実施形態におけるコンテンツIDは、担当ストレージノードの担当を決めるハッシュ値である。また、着目データ特徴の値は、要求されたデータが有する着目データ特徴の内容(本例では、データ長)である。
図17に示す例では、ノードID管理サーバ204は、まず渡された着目データ特徴の値を元に、この着目データ特徴の値が属するクラスを判別する(ステップS1601)。次いで、渡されたコンテンツIDを元に、当該クラスにおいて、このコンテンツIDを担当するストレージノード202を決定する(ステップS1602)。本例では、クラス毎に用意したストレージノード管理テーブルからConsistent Hashingに基づき、担当ストレージノードを決定する。より具体的には、そのクラスに属するストレージノードのストレージノードIDが割り当てられているハッシュ空間においてコンテンツIDが示すハッシュ値を担当範囲とする特別なハッシュ値(ここでは、ストレージノードID)を有するストレージノードを、担当ストレージノードに決定する。ここで、判別したクラスを担当するストレージノードが1つもない場合は、失敗を返却する。なお、失敗を返却せずに、別のクラスから捜索するなど別の方法を行ってもよい。
担当ストレージノードが見つかった場合には、ノードID管理サーバ204は、その担当ストレージノード202のIPアドレスを返り値として、要求元のフロントノード201に送信する(ステップS1603)。担当ノードが見つからなかった場合には、失敗を返す。
また、ノードID管理サーバ204は、リクエストがNEXT_FRONT_NODEリクエストであった場合、次フロントノード捜索処理を行う。なお、当該リクエストは、各フロントノード201が、冗長化を行う場合に他のフロントノードの情報を得るために使用されることが考えられる。このリクエストでは、起点とするフロントノードID(例えば、自フロントノードのフロントノードID)が渡される。
次フロントノード捜索処理では、例えば、ノードID管理サーバ204は、渡されたフロントノードIDを元にフロントノード管理テーブルを検索して、このフロントノードの次のフロントノードIDを持つフロントノードがいるかどうかを判定する。もし存在すればそのフロントノードのIPアドレスを返す。もし見つからなかったら失敗を返す。次フロントノードIDの検索は、例えば、渡されたフロントノードIDに+1した値をキーIDとして、そのキーIDの担当フロントノードを捜索することにより行ってもよい。なお、+1した値が2160−1より大きくなった場合は0とする。
また、ノードID管理サーバ204は、リクエストがNEXT_STORAGE_NODEリクエストであった場合、次ストレージノード捜索処理を行う。なお、当該リクエストは、各フロントノード201または各ストレージノード202が、冗長化を行う場合に他のストレージノードの情報を得るために使用されることが考えられる。このリクエストでは、起点とするストレージノードID(例えば、自ストレージノードのストレージノードIDや担当ストレージノードのストレージノードIDなど)と着目データ特徴の値とが渡される。
次ストレージノード捜索処理では、例えば、ノードID管理サーバ204は、渡されたストレージノードIDと着目データ特徴の値とを元に、着目データ特徴のクラス毎に用意したストレージノード管理テーブルを検索して、渡された着目データ特徴の値が属するクラスを担当し、かつ渡されたストレージノードIDの次のストレージノードIDを持つストレージノードがいるかどうかを判定する。もし存在すればそのストレージノードのIPアドレスを返す。もし見つからなかったら失敗を返す。次ストレージノードIDの検索は、例えば、渡されたストレージノードIDに+1した値をコンテンツIDとして、そのコンテンツIDの担当ストレージノードを捜索することにより行ってもよい。なお、+1した値が2160−1より大きくなった場合は0とする。
次に、フロントノード201の動作について説明する。図18は、フロントノード201の動作の一例を示すフローチャートである。図18に示す例では、フロントノード201は、立ち上がると、フロントノードのサービスプログラムが起動される(ステップS21)。そして、フロントノード201は、サービスプログラムに従って以下の処理を行う(ステップS22〜S27)。なお、フロントノード201は、まず初期化処理として、キーIDテーブルなどのメモリをクリアし、過去に保存していた情報があればメモリ上へ展開し状態を復帰する。また、他のノードと情報をやりとりできるようネットワーク通信用ソケットを作成する。
必要な初期化が終わると、フロントノード201は、自身のノードIDをIPアドレスなどの当該フロントノード201に固有な情報を元にSHA−1等のアルゴリズムを用いて決定する(ステップS22)。
次いで、フロントノード201は、決定したフロントノードIDと、自身のIPアドレスなどの情報を引数に、ノードID管理サーバ204に登録要求(ADD_FRONT_NODEリクエスト)を行う(ステップS23)。なお、フロントノードIDを決定する際にIPアドレスの他に、MACアドレスなどノードが持つ固有な情報を含めてもよい。また、他にノードID管理サーバ204に登録しておく情報があれば追加する。ここで、もし登録が失敗した場合、エラー処理を行って終了してもよい(ステップS24のNo)。例えば、フロントノード201は、サービスプログラムを終了させて、当該フロントノード201ではサービスを提供しないようにする。
登録が成功した場合は、次回以降同じノードIDを利用できるように、登録完了したノードIDを2次記憶装置に記憶させる(ステップS25)。そして、フロントノード201は、クライアント端末2003や他のフロントノード201からの要求を待ち受ける状態に入る(ステップS26,S27)。本例では、まず受付フロントノード用のリクエスト待ち受け処理を実行し(ステップS26)、その後で担当フロントノード用のリクエスト待ち受け処理を実行する(ステップS27)。そして、この2つの待ち受け処理を終了割り込みを受信するまで繰り返す。なお、受付フロントノード用と担当フロントノード用とを区別せずに、1つのリクエスト待ち受け処理で、すべてのリクエストを待ち受けるようにしてもよい。
また、フロントノード201は、終了割り込みを受け付けると終了処理を実行する(ステップS28,S29)。ここでは、次回立ち上げた時に同じデータ内容で動作できるようキーIDテーブルを2次記憶装置に保存し、プログラムを終了する。
次に、フロントノード201によるリクエスト待ち受け処理(図18のステップS26,S27)について説明する。図19は、フロントノード201による受付フロントノード用リクエスト待ち受け処理の処理フローの一例を示すフローチャートである。当該処理では、クライアント端末2003から、データの格納を要求するSETリクエストと、格納済みデータの読み出しを要求するGETリクエストとを少なくとも受け付ける。SETリクエストには、ユーザが指定したキーと格納したいデータとが渡される。また、GETリクエストには、ユーザが指定したキーが渡される。
図19に示すように、フロントノード201(より具体的には、受付フロントノード処理部111のアクセス要求受付手段1111)は、クライアント端末2003に対する受付フロントノードとしてリクエスト待ちうけ状態にある時に(ステップS2101)、ネットワーク通信その他の通信手段を介してクライアント端末2003からのリクエストを受け取る(ステップS2102)。
クライアント端末2003からのリクエストを受け付けると、フロントノード201(より具体的には、受付フロントノード処理部111の担当フロントノード検索手段1112)は、まず受け取ったリクエストに含まれるキーを元にキーIDを算出する(ステップS2103)。ここでは、キーIDとして、ユーザが指定したキーを元にハッシュ関数を用いてメッセージダイジェストとなるハッシュ値を求める。ただし、ユーザが指定したキーをそのまま使うと他のユーザが同じキーを使った場合に値が被るため、ユーザ名+ホームディレクトリ+ユーザ指定のキーといったように、固有な値となるよう、予め定めたルールに基づいてキーに情報を足したものに対しハッシュ値を求める。求めたハッシュ値から以下のようにして担当するフロンドノードが分かる。
本例では、算出したキーIDを元に、担当フロントノードを検索する(ステップS2104)。ここで、担当フロントノード検索手段1112は、例えば、算出したキーIDを含むFIND_FRONT_NODEリクエストをノードID管理サーバ204に送信してもよい。担当フロントノードが見つかると、担当フロントノード検索手段1112は、見つかった担当フロントノード201に、クライアント端末から受け付けたリクエスト内容を転送する(ステップS2105)。
その後、所定の時間、担当フロントノードからリクエストの処理結果の返信を待ち、処理結果を受け取ると、要求元のクライアント端末2003に結果を返却する(ステップS2106,S2107)。
また、図20は、フロントノード201による担当フロントノード用リクエスト待ち受け処理の処理フローの一例を示すフローチャートである。当該処理では、受付フロントノードから転送される、データの格納を要求するSETリクエストと、格納済みデータの読み出しを要求するGETリクエストとを少なくとも受け付ける。なお、図20に示す例では、さらに、他のフロントノードから要求されるリクエストであり、当該フロントノードの退避用キーIDテーブルの読み出しを要求するリクエストであるHAVE_CACHEリクエストを受け付けている。SETリクエストには、キーと格納したいデータとが渡される。また、GETリクエストには、キーが渡される。また、HAVE_CACHEリクエストには、例えば、エントリ単位の読み出しであればキーやキーIDが渡され、テーブル単位の読み出しであればフロントノードIDが渡される。
図20に示すように、フロントノード201(より具体的には、担当フロントノード処理部112のアクセス要求受付手段1121)は、担当フロントノードとしてリクエスト待ちうけ状態にある時に(ステップS2201)、ネットワーク通信その他の通信手段を介して他のノードからリクエストを受け取ると、受け取ったリクエストを処理する(ステップS2202〜S2208)。より具体的には、受け取ったリクエストの種類を確認して、対応する処理を行う。
アクセス要求受付手段1121は、受け付けたリクエストがSETリクエストであった場合、SETリクエスト受付処理を実行する(ステップS2203のYes,S2204)。
また、アクセス要求受付手段1122は、受け付けたリクエストがGETリクエストであった場合、GETリクエスト受付処理を実行する(ステップS2205のYes,S2206)。
また、アクセス要求受付手段1122は、受け付けたリクエストがHAVE_CACHEリクエストであった場合、CACHEリクエスト受付処理を実行する(ステップS2207のYes,S2207)。
以下、担当フロントノードとして動作するフロントノード201が行う各リクエスト処理について説明する。図21は、担当フロントノードとしてのフロントノード201によるSETリクエスト受付処理の処理フローの一例を示すフローチャートである。当該SETリクエスト受付処理では、担当ストレージノード処理部112の担当ストレージノード検索手段1122が、次の処理を行う。なお、このリクエストでは、ユーザが指定したキーと格納対象のデータ(メタデータを含む)とが渡される。なお、格納対象のデータとともにメタデータの全てまたは一部を渡してもよい。
担当ストレージノード検索手段1122は、SETリクエストを受け付けると(ステップS2301)、引数で渡されたユーザ指定キーと、上記と同じ方法により算出したキーIDと、メタデータと、有効期間と、1次記憶装置上にキャッシュとして保存したデータのアドレスとを対応づけて、キーIDテーブルに登録する(ステップS2302,S2303)。また、データに対しメッセージダイジェスト値を算出しコンテンツIDとする。
次いで、得たコンテンツIDとメタデータに含まれる着目データ特徴の値(本例では、データ長)とを元に、今回のリクエストの担当となるストレージノードを検索する(ステップS2304)。ここでは、コンテンツIDと着目データ特徴の値とを引数に、ノードID管理サーバ204にFIND_STORAGE_NODEリクエストを送信することにより、担当ストレージノードのIPアドレスを得る。
担当ストレージノードが見つかると、担当ストレージノード検索手段1122は、見つかった担当ストレージノード202に、SETリクエストを発行し、結果を待つ(ステップS2305)。正常に書き込めた旨の結果を得ると、担当ストレージノード検索手段1122は、キーIDテーブルの内容を更新する(ステップS2306,S2307)。ここでは、更新日時などのメタデータを更新する。
次いで、担当ストレージノード検索手段1122は、必要に応じてキーIDテーブル上の情報を冗長化する(ステップS2308)。これは、担当フロントノードが破損した場合でもデータを書き込んだストレージノード202にアクセスできるようにするための処理である。当該処理では、Consistent Hashingの隣のノードにキーIDテーブルの内容を残すために、コピー処理を実行する。具体的には、自ノードのフロントノードIDを引数に、ノードID管理サーバ204にNEXT_FRONT_NDEリクエストを送信し、隣の担当フロントノードの情報(IPアドレス)を得る。得た情報を元に、隣の担当フロントノードにアクセスし、キーIDテーブルに保存した今回のデータ(ただし、データアドレスは0でクリアされたもの)をコピーする。これを冗長化したい回数分、繰り返す。
最後に、要求元のフロントノード(受付フロントノード)に、書き込み結果を返す(ステップS2309)。
また、図22は、担当フロントノードとしてのフロントノード201によるGETリクエスト受付処理の処理フローの一例を示すフローチャートである。当該GETリクエスト受付処理では、担当ストレージノード処理部112の担当ストレージノード検索手段1122が、次の処理を行う。なお、このリクエストでは、ユーザが指定したキーが渡される。
担当ストレージノード検索手段1122は、GETリクエストを受け付けると(ステップS2401)、引数で渡されたユーザ指定キーを元に、上記と同じ方法によりキーIDを算出して、算出されたキーIDがキーIDテーブルに登録されているか否かを確認する(ステップS2402)。キーIDテーブルに登録されている場合(ステップS2403のYes)、キャッシュの有効期間内であるか確認する(ステップS2404)。もしキャッシュの有効期間内であってデータアドレスが有効なアドレスを示していれば、キャッシュエリアから該当データを読み出し、要求元のフロントノード(受付フロントノード)に返却する(ステップS2405,S2410)。なお、このケースが最もアクセス応答が早い。
一方、キーIDテーブルに指定されたキーのキーIDが登録されていない場合(ステップS2403のNo)、近隣のフロントノードに当該キーIDに関するエントリが保全されていないかを問い合わせる(ステップS2411)。この問い合わせは、例えば、自身のフロントノードIDを引数に、ノードID管理サーバ204にNEXT_FRONT_NODEリクエストを送信し、得たIPアドレスにHAVE_CACHEリクエストを送信することにより行う。HAVE_CACHEリクエストには、算出したキーIDを指定する。冗長化された情報が問い合わせたフロントノードに保持されていれば、担当ストレージノードが捜索できるコンテンツIDと着目データ特徴の値とを得ることができる。
また、キャッシュの有効期間外であっても、キーIDテーブルに今回のキーIDを含むエントリが登録されていれば、そこからコンテンツIDと着目データ特徴の値を得ることができる。
コンテンツIDと着目データ特徴の値とを得ると、担当ストレージノード検索手段1122は、得たコンテンツIDと着目データ特徴の値(本例では、データ長)とを元に、リクエストされたデータを格納している担当ストレージノードを検索する(ステップS2406)。ここでは、コンテンツIDと着目データ特徴の値とを引数に、ノードID管理サーバ204にFIND_STORAGE_NODEリクエストを送信することにより、担当ストレージノードのIPアドレスを得る。
担当ストレージノードが見つかると、担当ストレージノード検索手段1122は、見つかった担当ストレージノード202に、コンテンツIDを指定したGETリクエストを発行し、結果を待つ(ステップS2407)。正常に読み込めた旨の結果を得ると、担当ストレージノード検索手段1122は、キーIDテーブルの内容およびキャッシュエリアを更新する(ステップS2408,S2409)。ここでは、読み出したデータをキャッシュエリアに記憶させるとともに、更新日時、データアドレスなどのメタデータを更新する。
そして、要求元のフロントノード(受付フロントノード)に、読み出し結果を返す(ステップS2410)。
次に、ストレージノード202の動作について説明する。図23は、ストレージノード202の動作の一例を示すフローチャートである。図23に示す例では、ストレージノード202は、立ち上がると、ストレージノードのサービスプログラムが起動される(ステップS31)。そして、ストレージノード202は、サービスプログラムに従って以下の処理を行う(ステップS32〜S36)。なお、ストレージノード202は、まず初期化処理として、コンテンツIDテーブルなどのメモリをクリアし、過去に保存していた情報があればメモリ上へ展開し状態を復帰する。また、他のノードと情報をやりとりできるようネットワーク通信用ソケットを作成する。必要であれば、InfiniBandなどの通信手段も起動する。
必要な初期化が終わると、ストレージノード202は、自身のノードIDをIPアドレスなどの当該ストレージノード202に固有な情報を元にSHA−1等のアルゴリズムを用いて決定する(ステップS32)。
次いで、ストレージノード202は、決定したストレージノードIDと、自身のIPアドレスなどの情報を引数に、ノードID管理サーバ204に登録要求(ADD_STORAGE_NODEリクエスト)を行う(ステップS33)。なおノードID管理サーバ204に当該ストレージノード202を初めて登録する前に、対応特徴に応じた初期化やチューニングを行っておく必要がある。本実施例で着目しているデータの特徴はデータ長のため、2次記憶装置に対し、担当するデータ長に応じたセグメントサイズで保存領域を分割しておく。また必要に応じて、フロントノードとのパスでMTUサイズを変えるなどのチューニングを行ってもよい。ストレージノードの登録要求には、IPアドレスの他に、MACアドレスなどのノードが持つ固有な情報を含めてもよい。また、他にノードID管理サーバ204に登録しておく情報があれば追加する。ここで、もし登録が失敗した場合、エラー処理を行って終了してもよい(ステップS34のNo)。例えば、ストレージノード202は、サービスプログラムを終了させて、当該ストレージノード202ではサービスを提供しない。
登録が成功した場合は、次回以降同じノードIDを利用できるように、登録完了したノードIDを2次記憶装置に記憶させる(ステップS35)。そして、ストレージノード202は、フロントノード201からの要求を待ち受ける状態に入る(ステップS36)。
また、ストレージノード202は、終了割り込みを受け付けると終了処理を実行する(ステップS37,S38)。ここでは、次回立ち上げた時に同じデータ内容で動作できるようコンテンツIDテーブルを2次記憶装置に保存し、プログラムを終了する。
次に、ストレージノード202によるリクエスト待ち受け処理(図23のステップS36)について説明する。図24は、ストレージノード202によるリクエスト待ち受け処理の処理フローの一例を示すフローチャートである。当該処理では、フロントノード201から、データの格納を要求するSETリクエストと、格納済みデータの読み出しを要求するGETリクエストとを少なくとも受け付ける。SETリクエストには、格納したいデータ(メタデータを含む)が渡される。なお、コンテンツIDを含んでいてもよい。また、GETリクエストには、コンテンツIDが渡される。
図24に示すように、ストレージノード202(より具体的には、アクセス要求受付手段211)は、リクエスト待ちうけ状態にある時に(ステップS3101)、ネットワーク通信その他の通信手段を介してフロントノード201からリクエストを受け取ると、受け取ったリクエストを処理する(ステップS3102〜S3106)。より具体的には、受け取ったリクエストの種類を確認して、対応する処理を行う。
アクセス要求受付手段211は、受け付けたリクエストがSETリクエストであった場合、SETリクエスト受付処理を実行する(ステップS3103のYes,S3104)。
また、アクセス要求受付手段211は、受け付けたリクエストがGETリクエストであった場合、GETリクエスト受付処理を実行する(ステップS3105のYes,S3106)。
以下、ストレージノード202が行う各リクエスト処理について説明する。図25は、ストレージノード202によるSETリクエスト受付処理の処理フローの一例を示すフローチャートである。当該SETリクエスト受付処理では、アクセス実行手段212が、次の処理を行う。なお、このリクエストでは、格納対象のデータ(メタデータを含む)が渡される。
アクセス実行手段212は、引数で渡されたデータからコンテンツIDを算出する(ステップS3201)。ここでは、データに対しメッセージダイジェスト値を算出しコンテンツIDとする。
次いで、受け取ったデータを2次記憶装置に格納する(ステップS3202)。格納しおえると、コンテンツIDテーブルを更新する(ステップS3203)。ここでは、コンテンツIDと、データの格納先アドレスとを含む情報をコンテンツIDテーブルに登録する。
最後に、要求元のフロントノード(担当フロントノード)に、書き込み結果を返す(ステップS3204)。
また、図26は、ストレージノード202によるGETリクエスト受付処理の処理フローの一例を示すフローチャートである。当該GETリクエスト受付処理では、アクセス実行手段212が、次の処理を行う。なお、このリクエストでは、取得するデータの識別子としてコンテンツIDが渡される。
アクセス実行手段212は、引数で渡されたコンテンツIDをキーに自身が持つコンテンツIDテーブルを参照する(ステップS3301)。そのコンテンツIDに関するエントリが存在すれば、データの格納先である2次記憶装置内のアドレスとデータ長とが得られるので、データを読み出す(ステップS3302)。そして、読み出したデータを要求元の担当フロントノードにネットワークインタフェース部を通して送信する(ステップS3303)。このとき、正常に読みだせたか否かを示す読み出し結果の情報を含めてもよい。
次に、本実施形態のストレージシステム全体の動作について簡単に説明する。本実施形態のストレージシステムの動作は、大別すると、立ち上げ動作と、データ格納動作と、データ読出動作と、ノードの追加や削除等の構成変更動作とに分かれる。
図27は、本実施形態のストレージシステムの立ち上げ動作の一例を示すシーケンス図である。図27に示す例では、フロントノードA(201A)、フロントノードB(201B)、ストレージノード1(202−1)およびストレージノード2(202−2)がそれぞれノードID管理サーバ(204)に登録要求を行っている(Seq01,03,05,07)。そして、ノードID管理サーバ204がそれぞれに返信を行っている(Seq02,04,06,08)。本実施形態では、ストレージノードが1つ以上と、フロントノードが1つ以上運用状態に入るとユーザからの操作を受け付けられるようになる。
また、図28は、本実施形態のストレージシステムのデータ格納動作の一例を示すシーケンス図である。図28に示す例では、クライアント端末2003は、フロントノード201AにSETリクエストを送信する(Seq11)。クライアント端末2003からのアクセスを分散させるために、DNSを利用してDNSラウンドロビンでアクセス先となるフロントノードを決定してもよい。
SETリクエストを受け付けたフロントノード201Aでは、渡されたキーを元にキーIDを算出した上で、ノードID管理サーバ204にFIND_FRONT_NODEリクエストを送信し、担当フロントノードのIPアドレスを得る(Seq12,13)。本例では、フロントノード201BのIPアドレスを得る。
担当フロントノードのIPアドレスを得たフロントノード201Aは、担当フロントノードであるフロントノード201Bに、受け付けたSETリクエストを転送する(Seq14)。
SETリクエストを受信したフロントノード201Bは、渡されたキーからキーIDを算出するとともに、データからコンテンツIDを算出し、算出したコンテンツIDと着目データ特徴の値(本例では、データ長)を引数に、ノードID管理サーバ204にFIND_STORAGE_NODEリクエストを送信する(Seq15)。本例では、担当ストレージノードのIPアドレスとしてストレージノード202−1のIPアドレスを得る(Seq16)。
担当ストレージノードのIPアドレスを得たフロントノード201Bは、担当ストレージノードであるストレージノード202−1に、SETリクエストを送信する(Seq17)。
SETリクエストを受けたストレージノード202−1は、渡されたデータを2次記憶装置に格納し、応答を返す(Seq17,18)。このとき、担当ストレージサーバ202−1は、受け付けたSETリクエストに含まれるデータからコンテンツIDを算出し、算出したコンテンツIDとデータの格納先とを紐づけて、コンテンツIDテーブルに登録する。
担当ストレージノードであるストレージノード202−1から正常書き込みの旨の応答を受けると、担当フロントノード201Bは、キャッシュエリアにデータを記憶させるとともに、指定されたキーと、キーIDと、コンテンツIDと、メタデータと、キャッシュエリアのデータアドレスとを紐づけて、キーIDテーブルに登録する。
そして、要求元であり受付フロントノードであるフロントノード201Aに処理結果を送信する(Seq19)。
担当フロントノードであるフロントノード201Bから処理結果を受け付けたフロントノード201Aは、要求元のクライアント端末2003に処理結果を送信する(Seq20)。
また、図29は、本実施形態のストレージシステムのデータ読出動作の一例を示すシーケンス図である。図29に示す例では、クライアント端末2003は、フロントノード201AにGETリクエストを送信する(Seq31)。クライアント端末2003から最初のアクセスを行うフロントノードは、例えば、DNSを利用してDNSラウンドロビンでアクセス先となるフロントノードを決定してもよい。
GETリクエストを受け付けたフロントノード201Aでは、渡されたキーを元にキーIDを算出した上で、ノードID管理サーバ204にFIND_FRONT_NODEリクエストを送信し、担当フロントノードのIPアドレスを得る(Seq32,33)。本例では、フロントノード201BのIPアドレスを得る。
担当フロントノードのIPアドレスを得たフロントノード201Aは、担当フロントノードであるフロントノード201Bに、受け付けたGETリクエストを転送する(Seq34)。
GETリクエストを受信したフロントノードであるフロントノード201Bは、渡されたキーからキーIDを算出し、算出したキーIDに紐づいているコンテンツIDおよび着目データ特徴の値(本例では、データ長)を得て、これらを引数にノードID管理サーバ204にFIND_STORAGE_NODEリクエストを送信する(Seq35)。本例では、担当ストレージノードのIPアドレスとして、ストレージノード202−1のIPアドレスを得る(Seq36)。
担当ストレージノードのIPアドレスを得たフロントノード201Bは、担当ストレージノードであるストレージノード202−1に、GETリクエストを送信する(Seq37)。
GETリクエストを受けたストレージノード202−1は、渡されたコンテンツIDを元にデータの格納先アドレスを得て、2次記憶装置からデータを読み出す。そして、読み出したデータを含む応答を、要求元であるフロントノード201Bに送信する(Seq38)。
担当ストレージノードであるストレージノード202−1から応答を受けると、フロントノード201Bは、キャッシュエリアにデータを記憶させるとともに、指定されたキーと、キーIDと、コンテンツIDと、メタデータと、キャッシュエリアのデータアドレスとを紐づけて、キーIDテーブルに登録する。
そして、要求元であり受付フロントノードであるフロントノード201Aに処理結果を送信する(Seq39)。
担当フロントノードであるフロントノード201Bから処理結果を受け付けたフロントノード201Aは、要求元のクライアント端末2003に処理結果を送信する(Seq40)。
また、図30は、本実施形態のストレージシステムのフロントノード201の追加動作の一例を示すシーケンス図である。図30に示す例は、フロントノード201Aが新たに追加される場合の動作の一例を示している。図30に示す例では、まず追加予定のフロントノード201Aが、自ノードのノードIDを指定してノードID管理サーバ204に隣のフロントノードの捜索要求を行う(Seq51)。ここでいう隣のノードとは、担当を決めるIDのハッシュ空間上で、自ノードのIDの次に大きいノードIDをもつノードのことであり、フロントノード201Aが追加されることによって担当範囲が変わる(減る)ノードである。これにより、フロントノード201BのIPアドレスを得る。
フロントノード201Aは、得たIPアドレスを用いてフロントノード201BにキーIDテーブルのコピーを要求する(Seq53)。これにより、フロントノード201Bが担当していたデータの登録先を特定可能な情報を得る。得た情報は、データアドレスを無効にした上で、当該フロントノード201AのキーIDテーブルに登録する。データアドレスの無効は、有効期間を無効な値にすることで実現できる。
以上の処理を終了しおえたら、ノードID管理サーバ204にノードの登録処理を行う(Seq54)。ノードID管理サーバ204では、新たにフロントノード201Aが追加されたことにより、これまでフロントノード201Bが担当していた範囲の一部をフロントノード201Aの担当範囲に割り当てなおす。すでに格納済みのデータの担当範囲も変わることがあるが、キーIDテーブルがコピーされているので、フロントノード201Aが担当フロントノードに任命されてもデータの格納先に到達できる。具体的には、Consistent Hashingで割り当ての変更を実現できる。
なお、ノードを削除する場合は、上述した冗長化処理を隣のフロントノードに行ったうえで、ノードID管理サーバ204に削除の旨を通知すればよい。なお、通知しなくても定期的に行われる死活監視処理に応答がないことによって削除されたことがわかるので、ノードID管理サーバ204は、削除を認識した時点でそのノードが担当していた範囲を他のノードに割り当てなおせばよい。
なお、図31は、本実施形態のストレージシステムのストレージノード202の追加動作の一例を示すシーケンス図であるが、コピー対象がコンテンツIDテーブルおよびデータ格納領域である点と、ノードID管理サーバ204へのリクエストがADD_STORAGE_NODEリクエストである点以外は、着目データ特徴の担当クラス毎にフロントノードの場合と同じようにすればよいため説明を省略する。
以上のように、本実施形態によれば、データの特徴に応じて格納先(ストレージノード202)を選択でき、またストレージノード毎に調整が可能であるので、データ特性に応じた効果的な保存が可能である。また、本実施形態によれば、ストレージノードの2次記憶装置のブロックサイズを変えたものを複数用意しておけば、データ長というデータの特徴に応じて格納先となるストレージノードを振り分けることができる。このようなデータ格納方法を用いればフラグメントの発生が抑止できる。この他にもHDDやSSD(Solid State Drive)などの2次記憶装置の種類や、ATA(Advanced Technology Attachment)、SCCI(Small Computer System Interface)、SATA(Serial−ATA)やSAS(Serial Attached SCSI)などのインタフェースを変更し、アクセスが早いが容量の小さいものとアクセスが遅いが容量の大きいものを用意するといった、データサイズによる使い分けや、コストパフォーマンスを考慮するといった応用例も実施できる。
また、本実施形態によれば、フロントノードとストレージノードの2層に分け、それぞれを分散させているので、担当フロントノードとストレージノード間の経路や転送手法を個別に調整することが可能である。例えば、小サイズのデータの場合はEthernetで標準的なMTU 1500のネットワーク通信で行い、大きなサイズのデータをやりとりする経路はMTU 9000のネットワーク通信を行う。レスポンス性能を重視する場合はInfiniBandによるRDMAやメッセージパッシングを行う、といった通信経路の個別の調整も可能である。なお、このような個別調整は、フロントノードとストレージノード間のパスを、データの特徴に応じて結びつけておくことによって簡単に可能である。
また、2層化構造であっても、フロントノードによりアクセス先の解決が行われるため、どのフロントノードにアクセスしても目的のデータに到達することが可能である。
フロントノードにデータをキャッシュする仕組みを備えており、参照系の閲覧速度の向上が期待できる。
なお、上述した構成や方法以外にも、例えば、担当フロントノードにおけるキーIDテーブルの保持機能をDBによって実現し、それ以外の機能(担当ストレージノードを検索する機能や、リクエストを担当ストレージノードに送信する機能等)は受付フロントノードが行うような構成であってもよい。
また、ノードID管理サーバ204を省略する場合は、各フロントノードが、ノードID管理サーバ204が行っていた機能(ノードの死活監視機能および担当先決定機能)を有し、それぞれがアクセス先を決定すればよい。具体的には、各フロントノードが、死活監視モジュールを有し、周辺のノードに死活監視を行ってどのようなIDを有するフロントノードおよびストレージノードがいるかを管理する。また、各フロントノードが、ハッシュ値に基づく担当先決定モジュールを有し、管理しているノードのIDを元に担当先を決定してもよい。なお、各フロントノードが各々担当先を決定するため、ノードの追加や削除のタイミングによっては担当先とされたノードに必要とされるキーIDやコンテンツIDがないことも考えられるが、各ノードが周辺ノードにキャッシュを問い合わせる機能を有していれば、他のノードから情報を得ることができる。
また、上記例では、着目データ特徴としてデータ長を用いる場合を例に示したが、用いるデータの特徴はこの限りではない。例えば、更新日時または作成日時を着目データ特徴として用いてもよい。一つの仮定として、新しいデータは再びアクセスされる可能性が高いと考える。この仮定に基づき、新しいデータを格納するストレージノードの格納媒体をSSDに変更する、といった個別の調整を行ってもよい。また、フロントノードと該当ストレージノード間を10Gbit Etherのように早い回線を設置しておいてもよい。また、逆に、古いデータを格納するストレージノードのHDDを信頼性がSCSIよりも劣るSATAインタフェースのHDDを採用し、アクセスノードとの接続も100Mbit Etherのようにしてコストを軽減することも考えられる。
さらに他の例として、ユーザID等のユーザの識別子を着目データ特徴として用いてもよい。作成ユーザによりプライオリティを付与するのに利用できる。上級職のユーザのデータはアクセス性能が高く記憶領域が冗長化されたストレージノードに格納するようにし、その他のユーザのデータは一般のストレージノードを利用するといったように分割してもよい。
また、本実施形態では、2層化構造をとっているので、フロントノードの追加や削除によって分散性の調整を行うことができる。例えば、フロントノードを増やせば、ユーザからアクセスできるノードの数を増やすことができる。また、担当フロントノードも増えるため、フロントノードが担当するキーIDの範囲が少なくなり、分散性が増す。
次に、本発明によるストレージシステムの最小構成について説明する。図32は、本発明によるストレージシステムの最小の構成例を示すブロック図である。図132に示すように、本発明によるストレージシステムは、最小の構成要素として、フロントノード500と、ストレージノード600とを備える。また、フロントノード500は、受付処理分散手段501と、ストレージノード決定手段502とを含む。また、ストレージノード600は、2次記憶装置601と、要求受付処理手段602とを含む。
図32に示す最小構成のストレージシステムでは、1つ以上のフロントノード500が、ユーザからのアクセス要求を最初に受け付ける。
また、ストレージノード600の2次記憶装置601が、データを格納するための記憶領域を有する。また、ストレージノード600の要求受付処理手段602が、要求を受け付けて2次記憶装置へのデータの格納または2次記憶装置からのデータの読み出しを行う。また、ストレージノード600は、予め格納対象とされるデータが有する所定の特徴がとりうる内容の少なくとも1つと対応づけられている。
また、フロントノード500の受付処理分散手段501が、ユーザからのアクセス要求を受け付け、受け付けたアクセス要求に対する処理を実行する担当を各フロントノード間で分散させる。また、ストレージノード決定手段502が、ユーザから受け付けたアクセス要求に対する処理を実行する担当となった場合に、要求されたデータが有する特徴に基づいて1のストレージノードを担当ストレージノードに決定し、決定した担当ストレージノードに対して、データの格納要求またはデータの読出要求を送信する。
従って、最小構成のストレージシステムによれば、データの格納領域を適宜調整することで、フラグメントの発生を防止またはより効果的に抑制できる。
以上、実施形態及び実施例を参照して本願発明を説明したが、本願発明は上記実施形態に限定されるものではない。本願発明の構成や詳細には、本願発明のスコープ内で当業者が理解し得る様々な変更をすることができる。
また、上記の実施形態の一部または全部は、以下の付記のようにも記載されうるが、以下には限られない。
(付記1)ユーザからのアクセス要求を最初に受け付ける1つ以上のフロントノード(例えば、フロントノード101,201)と、要求に応じて2次記憶装置へのデータの格納または2次記憶装置からのデータの読み出しを行う1つ以上のストレージノード(例えば、ストレージノード102,202)とを備え、各ストレージノードは、データを格納するための記憶領域を有する2次記憶装置(例えば、2次記憶装置24)と、要求を受け付けて2次記憶装置へのデータの格納または2次記憶装置からのデータの読み出しを行う要求受付処理手段(例えば、制御部21)とを含み、各ストレージノードは、予め格納対象とされるデータが有する所定の特徴がとりうる内容の少なくとも1つと対応づけられており、各フロントノードは、ユーザからのアクセス要求を受け付け、受け付けたアクセス要求に対する処理を実行する担当を各フロントノード間で分散させる受付処理分散手段(例えば、受付フロントノード処理部111)と、担当となった場合に、要求されたデータが有する特徴に基づいて1のストレージノードを担当ストレージノードに決定し、決定した担当ストレージノードに対して、データの格納要求またはデータの読出要求を送信するストレージノード決定手段(例えば、担当フロントノード処理部112)とを含むことを特徴とするストレージシステム。
(付記2)各フロントノードは、当該フロントノードを介して過去にストレージノードの2次記憶装置に書き込んだデータを一時的に保持するキャッシュエリアを有する付記1に記載のストレージシステム。
(付記3)データを識別するためのIDに、所定のサイズのハッシュ空間を有するハッシュ関数により得られるハッシュ値であるメッセージダイジェスト値が用いられ、各ストレージノードは、当該ノードを識別するためのストレージノードIDとして、ハッシュ空間と同じ空間範囲のハッシュ空間上にマッピングされるハッシュ値であって各ストレージノード間で互いに異なるハッシュ値が割り当てられている付記1または付記2に記載のストレージシステム。
(付記4)データの特徴をその内容に応じて2以上のクラスに分けたクラス毎にハッシュ空間を用意し、クラス別のハッシュ空間上に、各ストレージノードを、当該ストレージノードが対応しているデータの特徴の内容に応じて割り当て、クラス別のハッシュ空間におけるストレージノードの割り当て状況を基に、ストレージノードを担当ストレージノードに決定する付記3に記載のストレージシステム。
(付記5)データの特徴がデータ長であり、各ストレージノードは、所定のデータ長に応じたブロックサイズに分割された記憶領域を有しており、ストレージノード決定手段は、要求されたデータのデータ長に基づいて、当該データ長に応じたブロックサイズに分割された記憶領域を有するストレージノードを担当ストレージノードに決定する付記1から付記4のうちのいずれかに記載のストレージシステム。
(付記6)ストレージノード決定手段は、要求されたデータのデータ長に応じた通信方法またはアクセス手段を用いて、担当ストレージノードにデータの格納要求またはデータの読出要求を送信する付記5に記載のストレージシステム。