説明

ストレージ制御方法、情報処理装置およびプログラム

【課題】データの移動量を低減できる。
【解決手段】制御部1bは、第1のノード2に割り当てるハッシュ値の範囲と第2のノード2aに割り当てるハッシュ値の範囲との境界を、第1のハッシュ値から第2のハッシュ値にシフトすることで、第1のノード2に割り当てるハッシュ値の範囲を拡大する。制御部1bは、第2のノード2aに格納されたデータの一部であって、キーから算出されるハッシュ値が第1のハッシュ値と第2のハッシュ値との間に属するデータを、第2のノード2aから第1のノード2に移動させる。

【発明の詳細な説明】
【技術分野】
【0001】
本発明はストレージ制御方法、情報処理装置およびプログラムに関する。
【背景技術】
【0002】
現在、分散ストレージシステムが利用されている。分散ストレージシステムは、ネットワークで接続された複数のストレージノードを備える。複数のストレージノードにデータを分散配置することで、データアクセスの高速化を図れる。
【0003】
分散ストレージシステムでは、ストレージノードに配置するデータの管理が行われる。例えば、サーバ装置がストレージ記憶装置の負荷を監視し、当該負荷に応じて、顧客データを別筐体のストレージ装置に再配置して、アクセスを分散する提案がある。また、例えば、ホスト計算機が、複数のストレージサブシステム上の物理ディスクを束ねた仮想ディスクを管理し、当該仮想ディスクへの入出力要求を制御する提案もある。
【0004】
ところで、KVS(Key - Value Store)と呼ばれる手法を用いた分散ストレージシステムがある。KVSでは、何れかのストレージノードに、データ(value)にキー(key)を付与した(key,value)のペアを保存する。保存したデータを取得する際は、キーを指定して、対応するデータを取得する。キーに応じて異なるストレージノードにデータを格納することで、データを分散配置する。
【0005】
KVSでは、キーから算出されるハッシュ値に応じて、データ格納先のストレージノードを判定することがある。各ストレージノードには、それぞれが担当するハッシュ値の範囲を割り当てておく。例えば、第1ノードにハッシュ値“11〜50”、第2ノードにハッシュ値“51〜90”などのように担当範囲が割り当てられる。この方法は、Consistent Hashingと呼ばれることもある。
【先行技術文献】
【特許文献】
【0006】
【特許文献1】特開2005−50007号公報
【特許文献2】特開2010−128630号公報
【発明の概要】
【発明が解決しようとする課題】
【0007】
分散ストレージシステムでは、各ストレージノードにハッシュ値の範囲を割り当てた後に、ストレージノードによってデータ量や受付アクセス数に偏りが生じることがある。その場合、偏りを解消するため、ハッシュ値の範囲の割り当てを変更したいことがある。
【0008】
しかし、あるストレージノードに対するハッシュ値の範囲の割り当てを一度解除して再定義するという方法を用いると、解除に伴うデータの退避および再定義に伴うデータの引き継ぎという大量のデータ移動が、ストレージノード間で発生する可能性がある。また、当該方法では、変更前に当該ストレージノードが保持しているデータであって変更後も引き続き保持するデータについても移動が発生してしまい、非効率的となる。
【0009】
一側面では、本発明は、データの移動量を低減できるストレージ制御方法、情報処理装置およびプログラムを提供することを目的とする。
【課題を解決するための手段】
【0010】
一実施態様では、複数のノードを有しておりキーと対応付けられたデータを当該キーから算出されるハッシュ値に応じたノードに格納するシステムが実行するストレージ制御方法が提供される。このストレージ制御方法では、第1のノードに割り当てるハッシュ値の範囲と第2のノードに割り当てるハッシュ値の範囲との境界を、第1のハッシュ値から第2のハッシュ値にシフトすることで、第1のノードに割り当てるハッシュ値の範囲を拡大する。第2のノードに格納されたデータの一部であって、キーから算出されるハッシュ値が第1のハッシュ値と第2のハッシュ値との間に属するデータを検索し、検索されたデータを第2のノードから第1のノードに移動する。
【0011】
また、一実施態様では、複数のノードを有しておりキーと対応付けられたデータを当該キーから算出されるハッシュ値に応じたノードに格納するシステムの制御に用いられる情報処理装置が提供される。この情報処理装置は、記憶部と制御部とを有する。記憶部は、複数のノードに割り当てたハッシュ値の範囲を示す情報を記憶する。制御部は、第1のノードに割り当てるハッシュ値の範囲と第2のノードに割り当てるハッシュ値の範囲との境界を第1のハッシュ値から第2のハッシュ値にシフトすることで、第1のノードに割り当てるハッシュ値の範囲を拡大し、第2のノードに格納されたデータの一部であって、キーから算出されるハッシュ値が第1のハッシュ値と第2のハッシュ値との間に属するデータを、第2のノードから第1のノードに移動させる。
【0012】
また、一実施態様では、コンピュータに実行させるプログラムであって、複数のノードを有しておりキーと対応付けられたデータを当該キーから算出されるハッシュ値に応じたノードに格納するシステムの制御に用いられるプログラムが提供される。
【発明の効果】
【0013】
一実施態様によれば、データの移動量を低減できる。
【図面の簡単な説明】
【0014】
【図1】第1の実施の形態の情報処理システムを示す図である。
【図2】第2の実施の形態の分散ストレージシステムを示す図である。
【図3】ストレージ制御装置のハードウェア例を示す図である。
【図4】第2の実施の形態のソフトウェア例を示すブロック図である。
【図5】ハッシュ値の担当範囲の割当例を示す図である。
【図6】担当管理テーブルの例を示す図である。
【図7】ノード利用管理テーブルの例を示す図である。
【図8】担当範囲を拡大する処理例を示すフローチャートである。
【図9】移設するハッシュ値範囲の例を示す図である。
【図10】Read要求受信時の処理例を示すフローチャートである。
【図11】Write要求受信時の処理例を示すフローチャートである。
【発明を実施するための形態】
【0015】
以下、本実施の形態を図面を参照して説明する。
[第1の実施の形態]
図1は、第1の実施の形態の情報処理システムを示す図である。この情報処理システムは、キーと対応付けられたデータを当該キーから算出されるハッシュ値に応じたノードに格納するシステムである。この情報処理システムは、情報処理装置1、第1のノード2および第2のノード2aを含む。情報処理装置1、第1のノード2および第2のノード2aは、ネットワークで接続されている。
【0016】
例えば、第1のノード2には、(key,value)のペアとして、(key1,value1)、(key2,value2)、(key3,value3)が格納されている。第1のノード2が担当するハッシュ値の範囲には、ハッシュ値H(key1),H(key2),H(key3)が含まれる。また、例えば、第2のノード2aには、(key,value)のペアとして、(key4,value4)、(key5,value5)、(key6,value6)が格納されている。第2のノード2aが担当するハッシュ値の範囲には、ハッシュ値H(key4),H(key5),H(key6)が含まれる。ここで、H(keyN)は、keyNから算出されたハッシュ値である(N=1,2,3,4,5,6)。第1のノード2および第2のノード2aにそれぞれ割り当てられたハッシュ値の担当範囲は隣接している。
【0017】
情報処理装置1は、CPU(Central Processing Unit)などのプロセッサとRAM(Random Access Memory)などのメモリとを備えてもよく、メモリに記憶されたプログラムをプロセッサが実行するコンピュータであってもよい。情報処理装置1は、記憶部1aおよび制御部1bを有する。
【0018】
記憶部1aは、第1のノード2および第2のノード2aに割り当てたハッシュ値の範囲を示す情報を記憶する。記憶部1aは、RAMやHDD(Hard Disk Drive)によって実装されてもよい。
【0019】
制御部1bは、記憶部1aを参照して、各ノードに割り当てるハッシュ値の範囲を変更する。制御部1bは、第1のノード2に割り当てるハッシュ値の範囲と第2のノード2aに割り当てるハッシュ値の範囲との境界を、第1のハッシュ値から第2のハッシュ値にシフトすることで、第1のノード2に割り当てるハッシュ値の範囲を拡大する。第1のハッシュ値は、H(key3)とH(key4)との間の値であるとする。また、第2のハッシュ値は、H(key4)とH(key5)との間の値であるとする。この場合、制御部1bが第1のノード2に割り当てるハッシュ値の範囲を拡大すると、第1のノード2の担当範囲にH(key4)が含まれることになる。
【0020】
制御部1bは、第2のノード2aに格納されたデータの一部であって、キーから算出されるハッシュ値が第1のハッシュ値と第2のハッシュ値との間に属するデータを検索し、検索されたデータを第2のノード2aから第1のノード2に移動する。例えば、制御部1bは、第1のハッシュ値と第2のハッシュ値との間に存在するハッシュ値H(key4)に対応する“value4”を検索する。制御部1bは、検索した“value4”を第1のノード2に移動する。
【0021】
なお、制御部1bは、移動対象のハッシュ値範囲を第2のノード2aに通知して、第2のノード2aに当該検索を行わせてもよい。また、第2のノード2aが、移動対象として検索した“value4”を第1のノード2に移動してもよい。すなわち、制御部1bは、検索されたデータの第1のノード2への移動を、第2のノード2aに行わせてもよい。
【0022】
情報処理装置1によれば、制御部1bにより、第1のノード2に割り当てるハッシュ値の範囲と第2のノード2aに割り当てるハッシュ値の範囲との境界が、第1のハッシュ値から第2のハッシュ値にシフトされることで、第1のノード2に割り当てるハッシュ値の範囲が拡大される。制御部1bにより、第2のノードに格納されたデータの一部であって、キーから算出されるハッシュ値が第1のハッシュ値と第2のハッシュ値との間に属するデータが検索され、検索されたデータが第2のノード2aから第1のノード2に移動される。これにより、第1のノード2および第2のノード2aの間で、移動するデータ量を低減できる。
【0023】
例えば、第1のノード2の担当範囲を拡大する際、第1のノード2の全データを第2のノード2aに移動して、第1のノード2の担当範囲を削除し、その後、第1のノード2に拡大後の担当範囲を追加する方法も考えられる。しかし、この方法では、元々第1のノード2に存在していたデータを第2のノード2aに移動し、担当範囲の再設定後に当該データを第2のノード2aから第1のノード2に移動する処理が生ずる。このため、元々第1のノード2に存在していたデータの無駄な移動が生じ、移動するデータ量が大きい。
【0024】
一方、情報処理装置1によれば、担当範囲の拡大によって、第1のノード2が新たに担当するハッシュ値範囲のデータを検索して、該データを第2のノード2aから第1のノード2に移動させる。このため、第1のノード2の担当範囲の削除/追加を行う場合に比べて、データの無駄な移動が生じない。例えば、元々第1のノード2に存在していたデータの移動が行われない。よって、移動するデータ量を低減でき、担当範囲を拡大する処理を効率的に実行できる。
【0025】
[第2の実施の形態]
図2は、第2の実施の形態の分散ストレージシステムを示す図である。第2の実施の形態の分散ストレージシステムは、KVSの手法によりデータを複数のストレージノードに分散配置する。第2の実施の形態の分散ストレージシステムは、ストレージ制御装置100、ストレージノード200,200a,200b、ディスク装置300,300a,300bおよびクライアント400を含む。
【0026】
ネットワーク10には、ストレージ制御装置100、ストレージノード200,200a,200bおよびクライアント400が接続されている。ネットワーク10はLAN(Local Area Network)でもよい。ネットワーク10はインターネットなどの広域ネットワークでもよい。
【0027】
ストレージ制御装置100は、ストレージノード200,200a,200bのハッシュ値の担当範囲の変更を制御するサーバコンピュータである。
ストレージノード200には、ディスク装置300が接続されている。ストレージノード200aには、ディスク装置300aが接続されている。ストレージノード200bには、ディスク装置300bが接続されている。ストレージノード200,200a,200bとディスク装置300,300a,300bとの間のインタフェースには、例えばSCSI(Small Computer System Interface)やファイバチャネル(Fibre Channel)などを用いてもよい。ストレージノード200,200a,200bは、それぞれディスク装置300,300a,300bからのデータの読出し(Read)、および、ディスク装置300,300a,300bへのデータの書込み(Write)を実行するサーバコンピュータである。
【0028】
ディスク装置300,300a,300bは、データを記憶する記憶装置である。ディスク装置300,300a,300bは、HDD(Hard Disk Drive)やSSD(Solid State Drive)などの記憶デバイスを備える。ディスク装置300,300a,300bは、ストレージノード200,200a,200bに内蔵されてもよい。
【0029】
クライアント400は、分散ストレージシステムに格納されたデータにアクセスするクライアントコンピュータである。例えば、クライアント400は、ユーザが操作する端末装置である。クライアント400は、ストレージノード200,200a,200bの何れかにデータの読出しを要求する(Read要求)。クライアント400は、ストレージノード200,200a,200bの何れかに、データの書込みを要求する(Write要求)。
【0030】
ここで、ディスク装置300,300a,300bは、キー(key)とデータ(value)のペア(key,value)を記憶する。ストレージノード200,200a,200bは、キーを指定したデータのRead要求があると、当該キーに対応するデータを読み出す。ストレージノード200,200a,200bは、キーを指定したデータのWrite要求があると、当該キーに対応するデータを更新する。このとき、ストレージノード200,200a,200bは、キーから算出されるハッシュ値に基づいて、アクセス対象のデータが何れのストレージノードの担当下にあるか判断する。
【0031】
キーに対するハッシュ値は、例えば、MD5(Message Digest algorithm 5)を用いて算出できる。SHA(Secure Hash Algorithm)など他のハッシュ関数を用いてもよい。
図3は、ストレージ制御装置のハードウェア例を示す図である。ストレージ制御装置100は、CPU101、RAM102、HDD103、画像信号処理部104、入力信号処理部105、ディスクドライブ106および通信部107を有する。各ユニットがストレージ制御装置100のバスに接続されている。ストレージノード200,200a,200bおよびクライアント400もストレージ制御装置100と同様のハードウェアを用いて実装できる。
【0032】
CPU101は、ストレージ制御装置100の情報処理を制御するプロセッサである。CPU101は、HDD103に記憶されているプログラムやデータの少なくとも一部を読み出し、RAM102に展開してプログラムを実行する。なお、ストレージ制御装置100は、複数のプロセッサを設けて、プログラムを分散して実行してもよい。
【0033】
RAM102は、CPU101が実行するプログラムや処理に用いるデータを一時的に記憶する揮発性メモリである。なお、ストレージ制御装置100は、RAM以外の種類のメモリを備えてもよく、複数個のメモリを備えていてもよい。
【0034】
HDD103は、OS(Operating System)プログラムやアプリケーションプログラムなどのプログラムおよびデータを記憶する不揮発性の記憶装置である。HDD103は、CPU101の命令に従って、内蔵の磁気ディスクに対してデータの読み書きを行う。なお、ストレージ制御装置100は、HDD以外の種類の不揮発性の記憶装置(例えば、SSDなど)を備えてもよく、複数の記憶装置を備えていてもよい。
【0035】
画像信号処理部104は、CPU101の命令に従って、ストレージ制御装置100に接続されたディスプレイ11に画像を出力する。ディスプレイ11としては、例えば、CRT(Cathode Ray Tube)ディスプレイや液晶ディスプレイを用いることができる。
【0036】
入力信号処理部105は、ストレージ制御装置100に接続された入力デバイス12から入力信号を取得し、CPU101に出力する。入力デバイス12としては、例えば、マウスやタッチパネルなどのポインティングデバイス、キーボードなどを用いることができる。
【0037】
ディスクドライブ106は、記録媒体13に記録されたプログラムやデータを読み取る駆動装置である。記録媒体13として、例えば、フレキシブルディスク(FD:Flexible Disk)やHDDなどの磁気ディスク、CD(Compact Disc)やDVD(Digital Versatile Disc)などの光ディスク、光磁気ディスク(MO:Magneto-Optical disk)を使用できる。ディスクドライブ106は、例えば、CPU101の命令に従って、記録媒体13から読み取ったプログラムやデータをRAM102またはHDD103に格納する。
【0038】
通信部107は、ネットワーク10を介してストレージノード200,200a,200bおよびクライアント400と通信を行う通信インタフェースである。通信部107は、有線通信インタフェースでもよいし、無線通信インタフェースでもよい。
【0039】
図4は、第2の実施の形態のソフトウェア例を示すブロック図である。図4に示すユニットの一部または全部は、ストレージ制御装置100、ストレージノード200およびクライアント400が実行するプログラムのモジュールであってもよい。また、図4に示すユニットの一部または全部は、FPGA(Field Programmable Gate Array)やASIC(Application Specific Integrated Circuit)などの電子回路であってもよい。ストレージノード200a,200bもストレージノード200と同様のユニットを用いて実装できる。
【0040】
ストレージ制御装置100は、記憶部110、ネットワークI/O(Input / Output)部120および担当範囲制御部130を有する。
記憶部110は、担当管理テーブルおよびノード利用管理テーブルを記憶する。担当管理テーブルは、ストレージノード200,200a,200bが担当するハッシュ値の範囲を定義したデータである。ノード利用管理テーブルは、ストレージノード200,200a,200bの利用状況を記録したデータである。記憶部110は、RAM102に確保された記憶領域でもよいし、HDD103に確保された記憶領域であってもよい。
【0041】
ネットワークI/O部120は、ストレージノード200,200a,200bから受信したデータを、担当範囲制御部130に出力する。ネットワークI/O部120は、担当範囲制御部130から取得したデータを、ストレージノード200,200a,200bに送信する。
【0042】
担当範囲制御部130は、ストレージノード200,200a,200bのハッシュ値の担当範囲の変更を制御する。担当範囲制御部130は、ストレージノード200,200a,200bの利用状況に応じて、または、システム管理者の操作入力に応じて、担当範囲の割り当てを変更する。担当範囲制御部130は、担当範囲の変更に伴い、ストレージノード間で移動させるデータを検索する。担当範囲制御部130は、移動させるデータが存在する場合、対象のストレージノード間で当該データを移動する。担当範囲制御部130は、担当範囲の変更に伴い、記憶部110に記憶された担当管理テーブルを更新する。担当範囲制御部130は、担当管理テーブルの更新内容を示す更新データをネットワークI/O部120に出力する。
【0043】
ストレージノード200は、記憶部210、ネットワークI/O部220、ディスクI/O部230、ノード一覧管理部240、担当ノード判定部250および監視部260を有する。
【0044】
記憶部210は、担当管理テーブルを記憶する。当該担当管理テーブルは、記憶部110に格納される担当管理テーブルと同じ内容である。記憶部210は、ストレージノード200上のRAMに確保された記憶領域でもよいし、ストレージノード200上のHDDに確保された記憶領域であってもよい。
【0045】
ネットワークI/O部220は、ストレージ制御装置100、ストレージノード200a,200bおよびクライアント400から受信したデータを、ディスクI/O部230および担当ノード判定部250に出力する。ネットワークI/O部220は、ディスクI/O部230、担当ノード判定部250および監視部260から取得したデータを、ストレージ制御装置100、ストレージノード200a,200bおよびクライアント400に送信する。
【0046】
ディスクI/O部230は、担当ノード判定部250の指示により、ディスク装置300からデータの読出しを行う。また、ディスクI/O部230は、担当ノード判定部250の指示により、ディスク装置300にデータの書込みを行う。
【0047】
ノード一覧管理部240は、ネットワークI/O部220がストレージ制御装置100から受信した更新データに基づいて、記憶部210に記憶された担当管理テーブルを更新する。ノード一覧管理部240は、担当ノード判定部250からの要求により、担当管理テーブルの内容を担当ノード判定部250に応答する。
【0048】
担当ノード判定部250は、ネットワークI/O部220がクライアント400から受信したRead要求に基づき、担当ノードを判定する。Read要求には、読出し対象のデータに対応するキーが含まれる。担当ノードとは、当該キーから算出されるハッシュ値を担当しているストレージノードである。担当ノード判定部250は、算出したハッシュ値とノード一覧管理部240から取得する担当管理テーブルとに基づいて、担当ノードを判定できる。担当ノード判定部250は、自ノードが担当ノードであれば、ディスクI/O部230に読出しを指示する。担当ノード判定部250は、自ノード以外のノードが担当ノードであれば、ネットワークI/O部220を介して、当該担当ノードにRead要求を転送する。
【0049】
監視部260は、ストレージノード200の利用状況を監視する。監視部260は、監視結果を含む監視データを、ネットワークI/O部220を介して、ストレージ制御装置100に定期的に送信する。利用状況には、例えば、ディスク装置300が記憶しているデータ量、ディスク装置300の空き容量およびディスク装置300へのアクセス数などが含まれる。
【0050】
クライアント400は、ネットワークI/O部410およびアクセス部420を有する。
ネットワークI/O部410は、アクセス部420からデータのRead要求やWrite要求を取得し、ストレージノード200,200a,200bの何れかに送信する。ネットワークI/O部410は、ストレージノード200,200a,200bからデータを受信すると、アクセス部420に出力する。
【0051】
アクセス部420は、読出し対象のデータのキーを含むRead要求を生成して、ネットワークI/O部410に出力する。アクセス部420は、更新対象のデータのキーを含むWrite要求を生成して、ネットワークI/O部410に出力する。
【0052】
なお、第2の実施の形態のストレージ制御装置100は、第1の実施の形態の情報処理装置1の一例である。担当範囲制御部130は、制御部1bの一例である。
図5は、ハッシュ値の担当範囲の割当例を示す図である。第2の実施の形態の分散ストレージシステムでは、利用可能なハッシュ値の範囲は“0〜99”である。ただし、“99”の次の値は“0”である。そのうちの複数の範囲がストレージノード200,200a,200bに割り当てられている。ここで、ラベル“A”は、ストレージノード200の識別情報である。ラベル“B”は、ストレージノード200aの識別情報である。ラベル“C”は、ストレージノード200bの識別情報である。各ラベルの位置は、各担当範囲の開始位置である。
【0053】
図5では、各ラベル位置に対応する値を含むハッシュ値範囲R1,R2,R3が示されている。ハッシュ値範囲R1は“10〜39”であり、ストレージノード200の担当範囲である。ハッシュ値範囲R2は“40〜89”であり、ストレージノード200aの担当範囲である。ハッシュ値範囲R3は“90〜99”、“0〜9”であり、ストレージノード200bの担当範囲である。ハッシュ値範囲R3は、“99”および“0”を跨いだ領域である。
【0054】
第2の実施の形態の分散ストレージシステムでは、担当範囲の一端の値を、ストレージノード200,200a,200bに対して指定することで、ストレージノード200,200a,200bの担当範囲を割り当てる。例えば、担当範囲の両端の値のうち小さい方(開始位置)を指定する場合、ストレージノード200にハッシュ値“10”を、ストレージノード200aにハッシュ値“40”を指定する。これにより、ストレージノード200の担当範囲が“10〜39”となる。ハッシュ値範囲R3のように、当該範囲が“0”を跨ぐ場合には、例外として、両端の値のうち大きい方が開始位置となる。この場合、例えば、ハッシュ値“90”を指定することで、“0”を跨いだ範囲を指定できる。
【0055】
なお、担当範囲の両端の値のうち大きい方(終了位置)を指定して、担当範囲を割り当ててもよい。例えば、ストレージノード200にハッシュ値“39”を、ストレージノード200aにハッシュ値“89”を、ストレージノード200bにハッシュ値“9”を指定する。すると、図5で示したハッシュ値範囲R1,R2,R3と同等の担当範囲を、ストレージノード200,200a,200bに割り当てることができる。この場合も、“0”を跨ぐ範囲については、例外として、両端の値のうち小さい方が終了位置となる。よって、両端の値のうち小さい方を指定することで、“0”を跨いだ範囲を指定できる。
【0056】
以下の説明では、ストレージノード200,200a,200bに、担当範囲の開始位置を指定することで、当該担当範囲を割り当てるものとする。ここで、ストレージノード200,200a,200bには、担当範囲を更に分割したブロック単位で担当範囲が割り当てられる。また、ストレージノード200,200a,200bの利用状況もブロック単位で管理される。
【0057】
図6は、担当管理テーブルの例を示す図である。担当管理テーブル111は、記憶部110に記憶される。また、担当管理テーブル111と同様の担当管理テーブルが、記憶部210およびストレージノード200a,200bにも格納される。担当管理テーブル111は、ブロック開始位置およびノードの項目を含む。
【0058】
ブロック開始位置の項目には、ブロックの開始位置に対応するハッシュ値が登録される。ノードの項目には、ストレージノード200,200a,200bのラベルが登録される。例えば、ブロック開始位置が“0”、“10”のレコードが存在する。この場合、前者のレコードは、ハッシュ値範囲“0〜9”のブロックが、ストレージノード200b(ラベル“C”)に割り当てられていることを示す。
【0059】
図7は、ノード利用管理テーブルの例を示す図である。ノード利用管理テーブル112は、記憶部110に記憶される。ノード利用管理テーブル112は、ブロック開始位置、データ量、空き容量、アクセス数および総転送量の項目を含む。
【0060】
ブロック開始位置の項目には、ブロックの開始位置に対応するハッシュ値が登録される。データ量の項目には、当該ブロックに記憶済のデータ量(例えば、GB(Giga Byte)単位)が登録される。空き容量の項目には、当該ブロックの空き容量(例えば、GB単位)が登録される。アクセス数の項目には、当該ブロックに対する読出し/書込みの総アクセス数が登録される。総転送量の項目には、当該ブロックに対する読出し/書込みに伴うデータの転送量(例えば、GB単位)の総和が登録される。
【0061】
図8は、担当範囲を拡大する処理例を示すフローチャートである。以下、図8に示す処理をステップ番号に沿って説明する。
(ステップS11)担当範囲制御部130は、ハッシュ値の担当範囲を拡大するストレージノードを決定する。例えば、担当範囲制御部130は、記憶部110に記憶されたノード利用管理テーブル112に基づいて、何れのストレージノードを対象とするか決定する。例えば、最もデータ量の小さいノードを選ぶ、最もデータ量の大きいノードの担当範囲に隣接する範囲を担当するノードを選ぶ、などの方法により対象を決定することが考えられる。あるいは、システム管理者の操作入力により指定されたノードを、担当範囲の拡大対象としてもよい。ここでは、ストレージノード200bを担当範囲の拡大対象に決定したとする。
【0062】
(ステップS12)担当範囲制御部130は、ノード利用管理テーブル112を参照して、ハッシュ値範囲R3の両端のうち拡大する側(開始位置側か終了位置側か)を決定する。例えば、データ量のより大きいストレージノードの担当範囲と隣接する側とする、予め定められた側(開始位置側)とする、などが考えられる。あるいは、システム管理者の操作入力により指定された側を拡大対象に決定してもよい。ここでは、ハッシュ値範囲R3の開始位置側を拡大する側に決定したとする。この場合、ハッシュ値範囲R3の開始位置(ハッシュ値範囲R2,R3の境界)をストレージノード200aが担当するハッシュ値範囲R2側へシフトして、ハッシュ値範囲R3を拡大することになる。
【0063】
(ステップS13)担当範囲制御部130は、記憶部110に記憶された担当管理テーブル111およびノード利用管理テーブル112に基づき、ハッシュ値範囲R3の開始位置のシフト量を決定する。例えば、ストレージノード200a,200bのデータ量が均等になる(あるいは、均等に近くなる)ブロック開始位置“70”をハッシュ値範囲R3の新たな開始位置とする(シフト量は“20”)。この場合、当該新たな開始位置“70”と元の開始位置“90”との間の範囲“70〜89”がストレージノード200aからストレージノード200bに移設する範囲である。また、例えば、担当するハッシュ値範囲に含まれるハッシュ値の個数に基づいて、シフト量を決定してもよい。例えば、移動後に各ノードが担当するハッシュ値範囲に含まれるハッシュ値の個数が均一になるようにシフト量を決定することが考えられる。
【0064】
(ステップS14)担当範囲制御部130は、担当管理テーブル111を更新する。具体的には、ブロック開始位置“70”、“80”の設定(ラベル“B”)をストレージノード200bのラベル“C”に変更する。担当範囲制御部130は、当該変更内容を示す更新データをネットワークI/O部120に出力する。ネットワークI/O部120は、更新データをストレージノード200,200a,200bに送信する。ストレージノード200,200a,200bは、更新データを受信すると、自ノードの担当管理テーブルを更新する。
【0065】
(ステップS15)担当範囲制御部130は、ステップS13で決定した範囲“70〜89”に属する差分のデータを検索し、ストレージノード200aからストレージノード200bに移動する。例えば、担当範囲制御部130は、ストレージノード200aに当該範囲にハッシュ値が属するデータを問い合わせて、ストレージノード200aからストレージノード200bに当該データを移動する。また、例えば、担当範囲制御部130は、ディスク装置300aにおける当該範囲に対応するアドレス(ディレクトリ名やセクタ番号など)をブロックに対応付けて管理してもよい。例えば、担当管理テーブル111の各ブロック開始位置に対応付けて、当該アドレスを登録することが考えられる。このようにすれば、担当範囲制御部130は、移動対象のデータの格納位置を当該アドレスに基づいて検索できる。担当範囲制御部130は、移動対象範囲をストレージノード200aに通知して、ストレージノード200aにより該移動対象範囲のデータをストレージノード200bへ移動させてもよい。
【0066】
このように、担当範囲制御部130は、ストレージノード200bに対してストレージノード200aとの境界側を、担当範囲を拡大させる側と決定する。担当範囲制御部130は、ハッシュ値範囲R3の開始位置(ハッシュ値範囲R2,R3の境界値)をハッシュ値範囲R2側にシフトさせる。シフト量は、ストレージノード200a,200bの利用状況により決定する。そして、シフト分のハッシュ値範囲に属するデータを、ストレージノード200aからストレージノード200bに移動する。
【0067】
なお、ステップS11〜S13では、上述した方法以外の方法で、担当を拡大するストレージノードおよび担当範囲の開始位置のシフト量を決定してもよい。例えば、次の(1)、(2)の何れかの方法を用いることも考えられる。
【0068】
(1)空き容量が少ないノードを担当範囲の拡大対象として、空き容量の多いノードからハッシュ値範囲の一部を移設するように決定する。そして、両ノードの空き容量が均等になるように開始位置のシフト量を決定する。各ノードの空き容量は、ノード利用管理テーブル112で照会できる(例えば、ノードごとにブロックの空き容量の和をとれば、ノードごとの空き容量の総和が得られる)。これにより、当該空き容量が少ないノードの空き容量の増加を図れる。
【0069】
(2)負荷の小さい(アクセス数や総転送量など)ノードを担当範囲の拡大対象として、負荷の大きいノードからハッシュ値範囲の一部を移設するように決定する。そして、両ノードの負荷が均等になるように開始位置のシフト量を決定する。各ノードの負荷は、ノード利用管理テーブル112で照会できる(例えば、ノードごとにブロックのアクセス数の和をとれば、ノードごとのアクセス数の総和が得られる)。これにより、各ノードの負荷分散を図れる。
【0070】
更に、例示した複数の方法を組み合わせてシフト量を決定してもよい。例えば、データ量を均等にするシフト量を決定した後、両ノードのアクセス数の差がより小さくなるようにシフト量を調整することも考えられる。例えば、まず、ハッシュ値範囲R3の開始位置を開始位置“70”に仮決定する(シフト量“20”に仮決定)。そして、ストレージノード200a,200bのアクセス数の差が小さくなるように、開始位置を“60”に決定する(シフト量“30”に決定)。
【0071】
なお、上記(2)では、負荷として、各ストレージノードのCPU使用率などの他の指標を用いてもよい。その場合、例えば、ストレージ制御装置100は、各ストレージノードからCPU使用率などの指標を収集する。
【0072】
また、担当範囲制御部130は、ブロック単位でデータの移動を行う。このため、ブロックを移設する順序を、任意に決定できる。例えば、対象ブロックごとの利用状況に基づいて順序を決定することが考えられる。より具体的には、現在アクセス中のデータを多く含むブロック程、後回しにすることが考えられる。また、例えば、システム管理者の操作入力により指定された順序とすることが考えられる。
【0073】
また、上記ステップS14,S15を逆の順序で行ってもよい。
図9は、移設するハッシュ値範囲の例を示す図である。図9では、図5に示したハッシュ値範囲R3をハッシュ値範囲R2側へシフト量“20”だけ拡大した場合を例示している。ハッシュ値範囲R2aは、ストレージノード200aの変更後の担当範囲である。ハッシュ値範囲R2aでは、ハッシュ値範囲R3の拡大に伴って、終了位置が“69”にシフトしている。
【0074】
ハッシュ値範囲R3aは、ストレージノード200bの変更後の担当範囲である。ハッシュ値範囲R3aでは、開始位置が“90”から“70”にシフトしている。
ハッシュ値範囲R2bは、ハッシュ値範囲R2,R3aの重なり合う領域であり、“70〜89”の範囲である。ハッシュ値範囲R2bは、ストレージノード200aからストレージノード200bに移設する範囲である。ハッシュ値範囲R2bに属するデータが、ストレージノード200aからストレージノード200bへの移動対象データである。
【0075】
このように、ストレージ制御装置100は、ハッシュ値範囲R3の開始位置(ハッシュ値範囲R2,R3の境界)をシフトさせることで、ハッシュ値範囲R3をハッシュ値範囲R3aへ拡大する。そして、ハッシュ値範囲R2bに属するデータをストレージノード200aからストレージノード200bへ移動する。
【0076】
ここで、例えば、ハッシュ値範囲R3を拡大する際、ハッシュ値範囲R3を削除して、ハッシュ値範囲R3のデータをストレージノード200aに移動してから、ストレージノード200bにハッシュ値範囲R3aを割り当てる方法も考えられる。この場合、ハッシュ値範囲R3に属する全データをストレージノード200aに移動する(ハッシュ値範囲R3に属していたデータはハッシュ値範囲R2に属することとなる)。そして、ハッシュ値範囲R3aの割当後、ハッシュ値範囲R3aに属するデータを、ストレージノード200aからストレージノード200bに移動する。しかし、この方法では、元々ストレージノード200bに存在していたデータ(ハッシュ値範囲R3に属していたデータ)の無駄な移動が生じ、移動するデータ量が大きい。
【0077】
一方、ストレージ制御装置100によれば、ハッシュ値範囲R3の削除を伴わないので、ハッシュ値範囲R3に属するデータのストレージノード200aへの移動が生じない。データの移動は、差分のデータ、すなわち、ハッシュ値範囲R2bに属するデータの移動で済む。よって、移動するデータ量を低減できる。ストレージノード200の担当範囲を拡大する処理を効率的に実行できる。
【0078】
なお、ストレージ制御装置100をストレージノード200,200a,200bとは別個に設ける場合を例示したが、担当範囲制御部130の機能をストレージノード200,200a,200bの何れかまたは全部に設けてもよい。何れかのストレージノードに担当範囲制御部130の機能を設ける場合、当該ストレージノードが他のストレージノードの情報を収集して、一元管理する。全部のストレージノードに担当範囲制御部130の機能を設ける場合、全部のストレージノードの情報を各ストレージノードで共有し、それぞれのストレージノードが、所定のタイミングで担当範囲制御部130の機能を発揮すればよい。所定のタイミングとしては、例えば、ストレージノードが自身の空き容量が閾値よりも小さくなったことを検知したタイミングが考えられる。この場合、当該ストレージノードは、自身の空き容量を増やすように担当範囲の拡大を行う。あるいは、所定のタイミングとしては、例えば、ストレージノードが自身の負荷(例えば、アクセス数)が閾値を上回ったことを検知したタイミングが考えられる。この場合、当該ストレージノードは、負荷が分散されるように担当範囲の拡大を行う。
【0079】
ここで、あるストレージノードの担当範囲の変更に伴うデータ移動の最中に、移設対象の範囲に属するデータへのクライアント400からのアクセスが発生することもある。このとき、ストレージノード200,200a,200bの担当管理テーブルには、変更後の担当範囲がデータ移動よりも先に登録されるので、アクセス先のノードに対象のキーに対応するデータが存在しないことがある。その場合にも、ストレージノード200,200a,200bは当該アクセスに適切に対処できることが望ましい。そこで、以下では、データ移動の最中にクライアント400からデータへのアクセスがあった場合の処理を説明する。まず、データのRead要求を受信した場合の処理例を説明する。
【0080】
図10は、Read要求受信時の処理例を示すフローチャートである。以下、図10に示す処理をステップ番号に沿って説明する。
(ステップS21)ネットワークI/O部220は、クライアント400からRead要求を受信する。ネットワークI/O部220は、担当ノード判定部250にRead要求を出力する。
【0081】
(ステップS22)担当ノード判定部250は、Read要求が自ノードへのアクセスか否かを判断する。自ノードへのアクセスである場合、処理をステップS24に進める。自ノード以外のノードへのアクセスである場合、処理をステップS23に進める。自ノードの担当範囲は、記憶部210に記憶された担当管理テーブルにより特定できる。自ノードへのアクセスか否かは、Read要求に含まれるキーから算出されるハッシュ値が、自ノードの担当範囲に属するか否かにより判断できる。ハッシュ値が自ノードの担当範囲に属する場合、自ノードへのアクセスである。ハッシュ値が自ノードの担当範囲に属さない場合、自ノード以外のノードへのアクセスである。
【0082】
(ステップS23)担当ノード判定部250は、アクセス対象のハッシュ値が属する範囲を担当する担当ノードを、担当管理テーブルを参照して特定する。担当ノード判定部250は、特定した担当ノードにRead要求を転送する。そして、処理を終了する。
【0083】
(ステップS24)担当ノード判定部250は、キーに対応するRead対象のデータが移動済であるか否かを判断する。移動済でない場合、処理をステップS25に進める。移動済である場合、処理をステップS26に進める。ここで、移動済でない場合とは、例えば、ストレージノード200の担当範囲を拡大済であるが、拡大した範囲に属する当該データのストレージノード200への移動が未完了である場合である。この場合、Read対象のデータは、当該データの移動元のストレージノードに存在している。
【0084】
(ステップS25)担当ノード判定部250は、当該データの移動元のストレージノード(移動元ノード)を、クライアント400に応答する。移動元ノードとは、担当範囲の拡大に伴って、ストレージノード200が現在通信している相手ノードである。クライアント400は、当該移動元ノードに、再度Read要求を送信する。そして、処理を終了する。
【0085】
(ステップS26)担当ノード判定部250は、キーに対応するデータの読出しをディスクI/O部230に指示する。ディスクI/O部230は、ディスク装置300から当該データの読出しを行う。
【0086】
(ステップS27)ディスクI/O部230は、読出したデータをネットワークI/O部220に出力する。ネットワークI/O部220は、ディスクI/O部230から取得した当該データを、クライアント400に送信する。
【0087】
このように、ストレージノード200,200a,200bは、Read要求があったときに、Read対象のデータが未移動である場合、移動元ノードを応答する。クライアント400は、当該応答に基づいて、移動元ノードに再度Read要求を送信し、当該データに適切にアクセスできる。
【0088】
なお、ステップS23において、Read要求を受信した担当ノードも、上記ステップS21〜S27の処理を行うことで、Read要求を適切に処理できる。
また、ステップS25において、Read要求を受信した移動元ノードも、上記ステップS21〜S27の処理を行うことで、Read要求を適切に処理できる。
【0089】
更に、ステップS25では、移動対象のデータに対するRead要求につき、移動元ノードを応答して、クライアント400にリトライさせる例を示した。一方、アクセスを受け付けたノードと移動元ノードとの間でRead要求を送受信して、Read対象のデータをクライアント400に応答してもよい。例えば、クライアント400からRead要求を受信したノードが、移動元ノードにRead要求を転送する。移動元ノードは、当該Read要求に応じたデータをクライアント400に応答する。
【0090】
次に、データのWrite要求を受信した場合の処理例を説明する。
図11は、Write要求受信時の処理例を示すフローチャートである。以下、図11に示す処理をステップ番号に沿って説明する。
【0091】
(ステップS31)ネットワークI/O部220は、クライアント400からWrite要求を受信する。ネットワークI/O部220は、担当ノード判定部250にWrite要求を出力する。
【0092】
(ステップS32)担当ノード判定部250は、Write要求が自ノードへのアクセスか否かを判断する。自ノードへのアクセスである場合、処理をステップS34に進める。自ノード以外のノードへのアクセスである場合、処理をステップS33に進める。
【0093】
(ステップS33)担当ノード判定部250は、アクセス対象のハッシュ値が属する範囲を担当する担当ノードを、記憶部210に記憶された担当管理テーブルを参照して特定する。担当ノード判定部250は、特定した担当ノードにWrite要求を転送する。そして、処理を終了する。
【0094】
(ステップS34)担当ノード判定部250は、キーに対応するデータの書込み(更新)をディスクI/O部230に指示する。ディスクI/O部230は、ディスク装置300に当該データの書込みを行う。ディスクI/O部230は、ネットワークI/O部220を介して、クライアント400に書込み完了を応答する。
【0095】
(ステップS35)担当ノード判定部250は、ステップS34で書込みを行ったデータがストレージノード200の担当範囲の拡大に伴うデータ移動の対象であるか否かを判断する。移動対象である場合、処理をステップS36に進める。移動対象でない場合、処理を終了する。例えば、担当ノード判定部250は、次の(1)〜(3)の条件が全て満たされるときに、当該データが移動対象であると判断できる。(1)自ノードが、担当範囲の拡大に伴い移動元ノードからデータを移動中である。(2)アクセス対象のキーから算出されるハッシュ値が拡大後の担当範囲に属する。(3)当該キーに対応するデータを移動元ノードから未だ移動していない。
【0096】
(ステップS36)担当ノード判定部250は、ステップS34で書込みを行ったデータを移動元ノードからの移動対象から除外する。例えば、担当ノード判定部250は、当該データに対応するキーのデータを、移動せずに削除するよう移動元ノードに依頼する。また、例えば、担当ノード判定部250は、当該キーのデータを移動元ノードから受信したとき、当該データを破棄する。
【0097】
このように、ストレージノード200,200a,200bは、Write要求があったときに、データの書込みを行い、移動元ノードから受信するデータによって、書き込んだデータが更新されないようにする。これにより、新しいデータが古いデータで上書きされるのを防止できる。
【0098】
なお、ステップS33において、Write要求を受信した担当ノードも、上記ステップS31〜S36の処理を行うことで、Write要求を適切に処理できる。
また、ステップS34では、更新対象のデータが未移動であれば、移動元ノードにWrite要求を転送して、移動元ノードにデータの更新を実行させてもよい。更に、ステップS34では、更新対象のデータが未移動であれば、当該データの移動を先に行ってから、当該データの更新を行ってもよい。
【0099】
更に、上述の例では、担当範囲を拡大したとき、ストレージノード200,200a,200bが保持する担当範囲テーブルを更新した後に、データの移動を行うものとしたが、これらの手順を逆の順序で行ってもよい。具体的には、担当範囲制御部130は、担当範囲を拡大する場合、データの移動を行ったあとに、ストレージノード200,200a,200bが保持する担当範囲テーブルを更新するようにしてもよい。
【0100】
この場合、移設中の範囲に属するデータに対してクライアント400からアクセスがあると、移動先のストレージノードに当該データが移動済で、アクセスを受けたストレージノードに当該データが存在しないことがある。その場合には、アクセスを受けたストレージノードが、移動先のストレージノードをクライアント400に応答すればよい。そうすれば、クライアント400は、移動先のストレージノードに対し、改めて当該データへアクセスできる。
【符号の説明】
【0101】
1 情報処理装置
1a 記憶部
1b 制御部
2 第1のノード
2a 第2のノード

【特許請求の範囲】
【請求項1】
複数のノードを有しておりキーと対応付けられたデータを当該キーから算出されるハッシュ値に応じたノードに格納するシステムが実行するストレージ制御方法であって、
第1のノードに割り当てるハッシュ値の範囲と第2のノードに割り当てるハッシュ値の範囲との境界を、第1のハッシュ値から第2のハッシュ値にシフトすることで、前記第1のノードに割り当てるハッシュ値の範囲を拡大し、
前記第2のノードに格納されたデータの一部であって、キーから算出されるハッシュ値が前記第1のハッシュ値と前記第2のハッシュ値との間に属するデータを検索し、検索されたデータを前記第2のノードから前記第1のノードに移動する、
ストレージ制御方法。
【請求項2】
前記複数のノードのデータ格納状況およびアクセス処理状況の少なくとも一方に基づいて、前記複数のノードの中から、割り当てるハッシュ値の範囲を拡大する前記第1のノードを選択する、請求項1記載のストレージ制御方法。
【請求項3】
前記複数のノードの中から前記第1のノードを選択し、割り当てられているハッシュ値の範囲が前記第1のノードと隣接するノードを前記第2のノードとして選択する、請求項1または2記載のストレージ制御方法。
【請求項4】
シフト後の境界である前記第2のハッシュ値を、前記第1および第2のノードに割り当てられているハッシュ値の個数に基づいて決定する、請求項1乃至3の何れか一項に記載のストレージ制御方法。
【請求項5】
データの移動が完了する前に、ハッシュ値が前記第1のハッシュ値と前記第2のハッシュ値との間に属するキーを指定したアクセスを、前記第1のノードで受け付け可能とし、
前記第1のノードにおいて、アクセスで指定されたキーに対応するデータが移動済みか否かを判定し、判定結果に応じた方法で当該アクセスを処理する、
請求項1乃至4の何れか一項に記載のストレージ制御方法。
【請求項6】
複数のノードを有しておりキーと対応付けられたデータを当該キーから算出されるハッシュ値に応じたノードに格納するシステムの制御に用いられる情報処理装置であって、
前記複数のノードに割り当てたハッシュ値の範囲を示す情報を記憶する記憶部と、
第1のノードに割り当てるハッシュ値の範囲と第2のノードに割り当てるハッシュ値の範囲との境界を第1のハッシュ値から第2のハッシュ値にシフトすることで、前記第1のノードに割り当てるハッシュ値の範囲を拡大し、前記第2のノードに格納されたデータの一部であって、キーから算出されるハッシュ値が前記第1のハッシュ値と前記第2のハッシュ値との間に属するデータを、前記第2のノードから前記第1のノードに移動させる制御部と、
を有する情報処理装置。
【請求項7】
複数のノードを有しておりキーと対応付けられたデータを当該キーから算出されるハッシュ値に応じたノードに格納するシステムの制御に用いられるプログラムであって、コンピュータに、
第1のノードに割り当てるハッシュ値の範囲と第2のノードに割り当てるハッシュ値の範囲との境界を、第1のハッシュ値から第2のハッシュ値にシフトすることで、前記第1のノードに割り当てるハッシュ値の範囲を拡大し、
前記第2のノードに格納されたデータの一部であって、キーから算出されるハッシュ値が前記第1のハッシュ値と前記第2のハッシュ値との間に属するデータを、前記第2のノードから前記第1のノードに移動させる、
処理を実行させるプログラム。

【図1】
image rotate

【図2】
image rotate

【図3】
image rotate

【図4】
image rotate

【図5】
image rotate

【図6】
image rotate

【図7】
image rotate

【図8】
image rotate

【図9】
image rotate

【図10】
image rotate

【図11】
image rotate