(57)【要約】【課題】分散キーバリューストアで用いられる各装置の負荷を分散できる負荷分散システムを提供する。【解決手段】  クライアントノード８０は、検索命令を構造化した構文木およびインデックスを、そのインデックスから特定したストアノード９０に送信するインデックス送信手段８１を含む。ストアノード９０は、キーに対応するバリュー、または、インデックスに対応する１つ以上のキーまたは１つ以上のインデックスを検索する検索手段９１と、命令実行手段９２とを含む。命令実行手段９２は、キーまたはインデックスを受信したときにそのキーまたはインデックスを検索手段９１に送信して対応するキーまたはインデックスを検索させる。命令実行手段９２は、キーまたはインデックスに対応するバリューの取得命令が受信した構文木に含まれている場合、そのキーまたはインデックスから特定されるストアノード９０にキーまたはインデックスと構文木とを送信する。【選択図】図６
2015072563.tif 000002
【特許請求の範囲】
【請求項１】
検索命令を処理するクライアントノードと、
キーバリュー形式でデータを格納するストレージから、キーに対応するバリューを検索する１以上のストアノードとを備え、
前記クライアントノードは、
前記バリューに対応するデータとして前記ストレージに格納された１つ以上のキーまたは１つ以上のインデックスの特定に用いられるインデックスから前記ストアノードを特定し、前記検索命令を構造化した構文木および前記インデックスを、特定されたストアノードに送信するインデックス送信手段を含み、
前記ストアノードは、
キーに対応するバリュー、または、前記インデックスに対応する１つ以上のキーまたは１つ以上のインデックスを検索する検索手段と、
受信した構文木に基づいて前記命令を実行する命令実行手段とを含み、
前記命令実行手段は、キーまたはインデックスを受信したときに当該キーまたはインデックスを前記検索手段に送信して対応するキーまたはインデックスを検索させ、キーまたはインデックスに対応するバリューの取得命令が受信した構文木に含まれている場合、当該キーまたはインデックスから特定されるストアノードにキーまたはインデックスと前記構文木とを送信する
ことを特徴とする負荷分散システム。
【請求項２】
インデックス送信手段は、送信するインデックスに対応するデータの取得命令を除いた構文木および当該インデックスを送信し、
命令実行手段は、キーまたはインデックスから特定されるストアノードに、当該キーまたはインデックスに対応するデータの取得命令を除いた構文木および当該キーまたはインデックスを送信する
請求項１記載の負荷分散システム。
【請求項３】
命令実行手段は、構文木を送信した装置に処理結果を送信する
請求項１または請求項２記載の負荷分散システム。
【請求項４】
クライアントノードは、
キーに対応するバリューの取得命令を含む構文木を検索命令から生成する構文解析手段を含む
請求項１から請求項３のうちのいずれか１項に記載の負荷分散システム。
【請求項５】
キーバリュー形式でデータを格納するストレージから、キーに対応するバリューを検索する１以上のストアノードを備え、
前記ストアノードは、
前記バリューに対応するデータとして前記ストレージに格納された１つ以上のキーまたは１つ以上のインデックスの特定に用いられるインデックスから前記ストアノードを特定し、検索命令を構造化した構文木および前記インデックスを、特定されたストアノードに送信する送信手段と、
受信した構文木に基づいて前記命令を実行する命令実行手段と、
前記インデックスに対応する１つ以上のキーまたは１つ以上のインデックスを検索する検索手段とを含み、
前記送信手段は、キーに対応するバリューの取得命令が受信した構文木に含まれている場合、キーまたはインデックスから特定されるストアノードにキーまたはインデックスと前記構文木とを送信し、
前記命令実行手段は、前記キーまたはインデックスを受信したときに当該キーまたはインデックスを前記検索手段に送信し、
前記検索手段は、前記キーまたはインデックスに対応するバリューを検索する
ことを特徴とする負荷分散システム。
【請求項６】
送信手段は、送信するインデックスに対応するデータの取得命令を除いた構文木および当該インデックスを送信し、キーまたはインデックスから特定されるストアノードに、当該キーまたはインデックスに対応するデータの取得命令を除いた構文木および当該キーまたはインデックスを送信する
請求項５記載の負荷分散システム。
【請求項７】
キーバリュー形式でデータを格納するストレージから、キーに対応するバリューを検索する１以上のストアノードに対する検索命令を処理するクライアントノードが、前記バリューに対応するデータとして前記ストレージに格納された１つ以上のキーまたは１つ以上のインデックスの特定に用いられるインデックスから前記ストアノードを特定し、
前記クライアントノードが、前記検索命令を構造化した構文木および前記インデックスを、特定されたストアノードに送信し、
前記ストアノードが、前記インデックスに対応する１つ以上のキーまたは１つ以上のインデックスを検索し、
前記ストアノードが、キーまたはインデックスに対応するバリューの取得命令が受信した構文木に含まれている場合、当該キーまたはインデックスから特定されるストアノードにキーまたはインデックスと前記構文木とを送信し、
前記ストアノードが、前記キーまたはインデックスを受信したときに当該キーまたはインデックスに対応するバリューを検索する
ことを特徴とする負荷分散方法。
【請求項８】
クライアントノードが、送信するインデックスに対応するデータの取得命令を除いた構文木および当該インデックスを送信し、
ストアノードが、キーまたはインデックスから特定されるストアノードに、当該キーまたはインデックスに対応するデータの取得命令を除いた構文木および当該キーまたはインデックスを送信する
請求項７記載の負荷分散方法。
【請求項９】
キーバリュー形式でデータを格納するストレージからキーに対応するバリューを検索する１以上のストアノードが、前記バリューに対応するデータとして前記ストレージに格納された１つ以上のキーまたは１つ以上のインデックスの特定に用いられるインデックスから前記ストアノードを特定し、
前記ストアノードが、検索命令を構造化した構文木および前記インデックスを、特定されたストアノードに送信し、
前記ストアノードが、前記インデックスに対応する１つ以上のキーまたは１つ以上のインデックスを検索し、
前記ストアノードが、キーに対応するバリューの取得命令が受信した構文木に含まれている場合、キーまたはインデックスから特定されるストアノードにキーまたはインデックスと前記構文木とを送信し、
前記ストアノードが、前記キーまたはインデックスを受信したときに当該キーまたはインデックスに対応するバリューを検索する
ことを特徴とする負荷分散方法。
【請求項１０】
ストアノードが、送信するインデックスに対応するデータの取得命令を除いた構文木および当該インデックスを送信し、キーまたはインデックスから特定されるストアノードに、当該キーまたはインデックスに対応するデータの取得命令を除いた構文木および当該キーまたはインデックスを送信する
請求項９記載の負荷分散方法。
【請求項１１】
キーバリュー形式でデータを格納するストレージからキーに対応するバリューを検索するコンピュータに適用される負荷分散プログラムであって、
前記コンピュータに、
前記バリューに対応するデータとして前記ストレージに格納された１つ以上のキーまたは１つ以上のインデックスの特定に用いられるインデックスから前記コンピュータを特定し、検索命令を構造化した構文木および前記インデックスを、特定された前記コンピュータに送信する送信処理、および、
前記インデックスに対応する１つ以上のキーまたは１つ以上のインデックスを検索する検索処理を実行させ、
前記送信処理で、キーに対応するバリューの取得命令が受信した構文木に含まれている場合、キーまたはインデックスから特定される前記コンピュータにキーまたはインデックスと前記構文木とを送信させ、
前記検索処理で、前記キーまたはインデックスを受信したときに当該キーまたはインデックスに対応するバリューを検索させる
ための負荷分散プログラム。
【請求項１２】
コンピュータに、
送信処理で、送信するインデックスに対応するデータの取得命令を除いた構文木および当該インデックスを送信させ、キーまたはインデックスから特定されるコンピュータに、当該キーまたはインデックスに対応するデータの取得命令を除いた構文木および当該キーまたはインデックスを送信させる
請求項１１記載の負荷分散プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、複数の装置にデータが分散して格納されている場合に各装置の負荷を分散する負荷分散システム、負荷分散方法および負荷分散プログラムに関する。
【背景技術】
【０００２】
データの保存および管理を行う方式として、キーバリューストアが知られている。キーバリューストアでは、キーとバリューのペアが格納される。ここで、バリューは、検索対象とする文字列等のデータであり、キーは、バリューを特定するために用いられる情報である。すなわち、キーバリューストアは、キーを指定するとバリューを取得できる単純な方式により実現される。また、キーバリューストアの中でも、複数のサーバや記憶装置などに分散してデータを保存する方式は、分散キーバリューストアと呼ばれている。
【０００３】
特許文献１には、キーバリューストアによる制限を課せずにデータを扱う分散型データベースシステムが記載されている。特許文献１に記載された分散型データベースシステムでは、クライアントノードが、キー情報とデータのペアおよびキー情報とプログラム情報のペアを、キー情報に基づいて特定されるデータベースノードへ送信する。データベースノードは、キー情報とペアで格納されているデータに対して、プログラム情報に従ってプログラムを実行し、その実行結果をクライアントノードへ送信する。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開２０１２−１０８８８９号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
単純なキーバリューストアは、キーを指定してバリューを取得する機能を有する。一方、単純なキーバリューストアでは、全件検索や範囲検索などの機能は提供されない。なお、データ構造を変更して範囲検索を実現するキーバリューストアも想定されるが、以下の説明では、キーを指定して、そのキーに対応するバリューを取得する方式をキーバリューストアと定義する。
【０００６】
このようなキーバリューストアで全件検索や範囲検索を行おうとする場合、複数のキーを特定するための構造として、インデックスを用いることがある。以下、全件検索や範囲検索を実現するためのデータ構造のことも、インデックスと記すことがある。
【０００７】
図８は、分散キーバリューストアにおいてインデックスを用いて範囲検索を行う方法の例を示す説明図である。クライアント６０は、ユーザから検索の指示を受信すると、その検索の対象からインデックス（図８に示す例では、ｉｎｄｅｘ１）を特定し、インデックスが格納されたストア６１に、そのインデックスに対応するキーの取得を依頼する。
【０００８】
ストア６１から検索結果を受け取ると、クライアント６０は、その検索結果のバリュー解析を行い、複数のキー（図８に示す例では、ｋｅｙ１，ｋｅｙ２，ｋｅｙ３）を抽出する。そして、クライアント６０は、抽出したキーが格納されたストア（ストア６１，ストア６２）を特定して、キーごとに特定されるストアに、対応するバリューの取得を依頼する。
【０００９】
しかし、図８に例示する方法の場合、クライアント６０は、全てのキーについて、バリューの検索を対応するストアに指示する必要がある。そのため、アプリケーションを実行するクライアント６０に、ＣＰＵ（Central Processing Unit ）負荷が集中してしまうという問題がある。
【００１０】
また、特許文献１に記載された分散型データベースシステムでは、データベースノードにプログラム情報を送信してプログラムを実行させることにより、クライアントノードの負荷を軽減させている。しかし、特許文献１に記載された分散型データベースシステムも、キー情報ごとにデータベースノードに対する処理を実行する必要があるため、クライアント側の負荷を十分分散できているとは言い難い。
【００１１】
そこで、本発明は、分散キーバリューストアで用いられる各装置の負荷を分散できる負荷分散システム、負荷分散方法および負荷分散プログラムを提供することを目的とする。
【課題を解決するための手段】
【００１２】
本発明による負荷分散システムは、検索命令を処理するクライアントノードと、キーバリュー形式でデータを格納するストレージから、キーに対応するバリューを検索する１以上のストアノードとを備え、クライアントノードが、バリューに対応するデータとしてストレージに格納された１つ以上のキーまたは１つ以上のインデックスの特定に用いられるインデックスからストアノードを特定し、検索命令を構造化した構文木およびインデックスを、特定されたストアノードに送信するインデックス送信手段を含み、ストアノードが、キーに対応するバリュー、または、インデックスに対応する１つ以上のキーまたは１つ以上のインデックスを検索する検索手段と、受信した構文木に基づいて命令を実行する命令実行手段とを含み、命令実行手段が、キーまたはインデックスを受信したときにそのキーまたはインデックスを検索手段に送信して対応するキーまたはインデックスを検索させ、キーまたはインデックスに対応するバリューの取得命令が受信した構文木に含まれている場合、そのキーまたはインデックスから特定されるストアノードにキーまたはインデックスと構文木とを送信することを特徴とする。
【００１３】
本発明による他の負荷分散システムは、キーバリュー形式でデータを格納するストレージから、キーに対応するバリューを検索する１以上のストアノードを備え、ストアノードが、バリューに対応するデータとしてストレージに格納された１つ以上のキーまたは１つ以上のインデックスの特定に用いられるインデックスからストアノードを特定し、検索命令を構造化した構文木およびインデックスを、特定されたストアノードに送信する送信手段と、受信した構文木に基づいて命令を実行する命令実行手段と、インデックスに対応する１つ以上のキーまたは１つ以上のインデックスを検索する検索手段とを含み、送信手段が、キーに対応するバリューの取得命令が受信した構文木に含まれている場合、キーまたはインデックスから特定されるストアノードにキーまたはインデックスと構文木とを送信し、命令実行手段が、キーまたはインデックスを受信したときにそのキーまたはインデックスを検索手段に送信し、検索手段は、キーまたはインデックスに対応するバリューを検索することを特徴とする。
【００１４】
本発明による負荷分散方法は、キーバリュー形式でデータを格納するストレージから、キーに対応するバリューを検索する１以上のストアノードに対する検索命令を処理するクライアントノードが、バリューに対応するデータとしてストレージに格納された１つ以上のキーまたは１つ以上のインデックスの特定に用いられるインデックスからストアノードを特定し、クライアントノードが、検索命令を構造化した構文木およびインデックスを、特定されたストアノードに送信し、ストアノードが、インデックスに対応する１つ以上のキーまたは１つ以上のインデックスを検索し、ストアノードが、キーまたはインデックスに対応するバリューの取得命令が受信した構文木に含まれている場合、そのキーまたはインデックスから特定されるストアノードにキーまたはインデックスと構文木とを送信し、ストアノードが、キーまたはインデックスを受信したときにそのキーまたはインデックスに対応するバリューを検索することを特徴とする。
【００１５】
本発明による他の負荷分散方法は、キーバリュー形式でデータを格納するストレージからキーに対応するバリューを検索する１以上のストアノードが、バリューに対応するデータとしてストレージに格納された１つ以上のキーまたは１つ以上のインデックスの特定に用いられるインデックスからストアノードを特定し、ストアノードが、検索命令を構造化した構文木およびインデックスを、特定されたストアノードに送信し、ストアノードが、インデックスに対応する１つ以上のキーまたは１つ以上のインデックスを検索し、ストアノードが、キーに対応するバリューの取得命令が受信した構文木に含まれている場合、キーまたはインデックスから特定されるストアノードにキーまたはインデックスと構文木とを送信し、ストアノードが、キーまたはインデックスを受信したときにそのキーまたはインデックスに対応するバリューを検索することを特徴とする。
【００１６】
本発明による負荷分散プログラムは、キーバリュー形式でデータを格納するストレージからキーに対応するバリューを検索するコンピュータに適用される負荷分散プログラムであって、コンピュータに、バリューに対応するデータとしてストレージに格納された１つ以上のキーまたは１つ以上のインデックスの特定に用いられるインデックスからコンピュータを特定し、検索命令を構造化した構文木およびインデックスを、特定されたコンピュータに送信する送信処理、および、インデックスに対応する１つ以上のキーまたは１つ以上のインデックスを検索する検索処理を実行させ、送信処理で、キーに対応するバリューの取得命令が受信した構文木に含まれている場合、キーまたはインデックスから特定されるコンピュータにキーまたはインデックスと構文木とを送信させ、検索処理で、キーまたはインデックスを受信したときにそのキーまたはインデックスに対応するバリューを検索させることを特徴とする。
【発明の効果】
【００１７】
本発明によれば、分散キーバリューストアで用いられる各装置の負荷を分散できる。
【図面の簡単な説明】
【００１８】
【図１】本発明による負荷分散システムの一実施形態を示すブロック図である。
【図２】構文木の一例である。
【図３】負荷分散システムの動作例を示すフローチャートである。
【図４】負荷分散システムの動作の具体例を示す説明図である。
【図５】本発明による負荷分散システムの変形例を示すブロック図である。
【図６】本発明による負荷分散システムの概要を示すブロック図である。
【図７】本発明による負荷分散システムの他の概要を示すブロック図である。
【図８】分散キーバリューストアにおいてインデックスを用いて範囲検索を行う方法の例を示す説明図である。
【発明を実施するための形態】
【００１９】
以下、本発明の実施形態を図面を参照して説明する。
【００２０】
図１は、本発明による負荷分散システムの一実施形態を示すブロック図である。本実施形態の負荷分散システムは、クライアント１０と、ストア２１１〜２１ｎとを備えている。ストア２１１〜２１ｎは、それぞれ、データ記憶部３１１〜３１ｎに接続される装置である。データ記憶部３１１〜３１ｎは、それぞれストア２１１〜２１ｎに含まれていてもよいし、通信ネットワークを介して接続された他の装置に備えられていてもよい。
【００２１】
本実施形態のデータ記憶部３１１〜３１ｎは、キーバリュー形式のデータを格納する。具体的には、データ記憶部３１１〜３１ｎは、検索対象の値（バリュー）を、その値に割り当てられるキーと対応付けて記憶する。さらに、データ記憶部３１１〜３１ｎは、１つ以上のキーを、そのキー群に割り当てられるインデックスと対応付けて記憶する。さらに、データ記憶部３１１〜３１ｎは、１つ以上のインデックスを、そのインデックス群に割り当てられる他のインデックスと対応付けて記憶してもよい。言い換えると、データ記憶部３１１〜３１ｎは、１つ以上のキーの集合をバリューとして格納し、そのキーの集合を特定するキーとして、インデックスが対応づけられる。さらに、データ記憶部３１１〜３１ｎは、１つ以上のインデックスの集合をバリューとして格納し、そのインデックスの集合を特定するキーとして、他のインデックスが対応づけられていてもよい。
【００２２】
例えば、キーバリュー形式のデータを［ｋｅｙ］［ｖａｌｕｅ］と表わすとする。このとき、データ記憶部３１１〜３１ｎは、以下に例示するデータを記憶してもよい。
【００２３】
［ｉｎｄｅｘ１］［ｉｎｄｅｘ１−１  ｉｎｄｅｘ１−２  ｉｎｄｅｘ１−３］
［ｉｎｄｅｘ１−１］［ｋｅｙ１  ｋｅｙ２］
［ｉｎｄｅｘ１−２］［ｋｅｙ３  ｋｅｙ４］
［ｉｎｄｅｘ１−３］［ｋｅｙ５  ｋｅｙ６］
［ｋｅｙ１］［ｖａｌｕｅ１］
［ｋｅｙ２］［ｖａｌｕｅ２］
［ｋｅｙ３］［ｖａｌｕｅ３］
［ｋｅｙ４］［ｖａｌｕｅ４］
［ｋｅｙ５］［ｖａｌｕｅ５］
［ｋｅｙ６］［ｖａｌｕｅ６］
【００２４】
ここで、ｋｅｙ１〜ｋｅｙ６は、それぞれ、バリューであるｖａｌｕｅ１〜ｖａｌｕｅ６に対して割り当てられたキーである。また、ｉｎｄｅｘ１−１〜３は、それぞれ、バリューに相当するｋｅｙ１とｋｅｙ２、ｋｅｙ３とｋｅｙ４、および、ｋｅｙ５とｋｅｙ６に対して割り当てられたキーに相当するインデックスである。また、ｉｎｄｅｘ１は、バリューに相当するｉｎｄｅｘ１−１〜３に対して割り当てられたキーに相当するインデックスである。このように、インデックスであっても、キーバリュー形式のデータとして格納される場合には、データとして扱うことができる。以下の説明では、インデックスのことをインデックス情報と記すこともある。
【００２５】
ストア２１１〜２１ｎが、データ記憶部３１１〜３１ｎを含んでいる場合、ストア２１１〜２１ｎがキーバリュー形式のデータを格納しているということもできる。また、この場合、ストア２１１〜２１ｎは、キーバリュー形式のデータを格納するストレージということもできる。
【００２６】
上述するように、検索対象の値（バリュー）ごとにキーが割り当てられる。ストア２１１〜２１ｎ（具体的には、データ記憶部３１１〜３１ｎ）は、キーに基づいて定められる規則に従って値（バリュー）を格納する。そのため、各装置は、キーをもとにストアを特定することで、特定したストアに対して値（バリュー）の取得を指示できる。キーを格納するための規則は任意であり、例えば、ｈａｓｈ関数を用いた規則が挙げられる。
【００２７】
同様に、複数のキーに対してインデックスが割り当てられる。具体的には、データ記憶部３１１〜３１ｎは、インデックス構造自体を、キーバリューストア上の１レコードとして管理する。この構造は、例えば、各レコードへの参照（すなわち、キー）を並べたリストにより実現される。ストア２１１〜２１ｎ（具体的には、データ記憶部３１１〜３１ｎ）は、インデックス情報に基づいて定められる規則に従って複数のキーを格納する。そのため、各装置は、インデックス情報をもとにストアを特定することで、特定したストアに対して複数のキーの取得を指示できる。
【００２８】
また、複数のインデックスに対して他のインデックスが割り当てられてもよい。複数のキーに対してインデックスが割り当てられる場合と同様に、データ記憶部３１１〜３１ｎは、インデックス構造自体を、キーバリューストア上の１レコードとして管理すればよい。
【００２９】
なお、図１に示す例では、負荷分散システムが、ストアおよびデータ記憶部を、それぞれ２つずつ備えている場合を例示しているが、ストアおよびデータ記憶部の数は２つに限定されず、３つ以上であってもよい。また、各データ記憶部が、インデックスを記憶していてもよい。
【００３０】
クライアント１０は、ユーザ等からの検索指示を受け付け、最終的な検索結果を提示する装置である。クライアント１０は、構文解析部１１と、命令実行部１２とを含む。
【００３１】
構文解析部１１は、検索命令を解析して構文木を生成する。ここで、構文木とは、値（バリュー）の検索に用いられる命令を構造化した情報である。以下の説明では、複数のキーを特定するためのインデックス情報は、ユーザの検索指示に基づいて予め生成されているものとする。なお、構文解析部１１が、ユーザからの検索指示を解析して、検索命令とインデックス情報とを生成してもよい。
【００３２】
以下、構文解析部１１が構文解析を行う一例を説明する。ここでは、ユーザの検索指示に対するインデックス情報（ｉｎｄｅｘ１）は特定されているものとする。また、インデックス情報からは、複数のキーが特定されるものとする。まず、解析に用いられる命令が定義される。ここでは、命令は、以下に例示する内容を示すものとする。
【００３３】
（戻り値１，…，戻り値Ｎ）：オペレーション名（引数１，…，引数Ｎ）
【００３４】
本例では、以下の３つの命令（１）〜（３）が予め定義される。
【００３５】
（１） data:get(data)
（２） (data1, ..., dataN):split(data)
（３） (data1, ..., dataN):loop(operation1, data1, ..., dataN)
【００３６】
命令（１）は、引数に指定されたdataをもとに、対応するdataを取得することを示している。なお、本実施形態において、引数に指定されたdataがキーに相当し、取得するdataが値（バリュー）に相当する。この命令は、キーまたはインデックス情報に基づいてバリューを取得する命令であり、以下の説明では、この命令のことをデータ取得命令またはget オペレーションと記すこともある。
【００３７】
命令（２）は、dataを一定の規則に基づいて、複数のdataに変換することを示している。変換するための一定の規則は任意であり、ここでは詳細な説明は省略する。
【００３８】
命令（３）は、operation1で指定された命令を、引数をdata1 からdataN まで変えて実行することを示している。
【００３９】
構文解析部１１は、上記で定義された命令（１）〜（３）を与えられると、対応する構文木を生成する。例えば、ｉｎｄｅｘ１で特定されるデータを全て取得する場合、以下の命令が与えられる。
【００４０】
loop(get,split(get("index1")))
【００４１】
そのため、構文解析部１１は、この命令を解析して構文木を生成する。図２は、構文解析部１１が生成する構文木の一例である。本例では、構文解析部１１は、図２に例示する構文木を生成する。
【００４２】
ただし、構文解析部１１が行う構文解析の方法は、上記方法に限定されない。構文解析部１１は、ユーザから広く知られた他の方法を用いて構文木を生成してもよい。また、上記説明では、インデックス情報から、複数のキーが特定されるものとしているが、インデックス情報から、複数のインデックス情報が特定される場合、各インデックス情報について、複数のキーを特定する上記命令を繰り返せばよい。
【００４３】
命令実行部１２は、構文解析部１１が検索命令を解析することにより生成された構文木に従って命令を実行する。具体的には、命令実行部１２は、まず、インデックス情報に基づいてストア２１１〜２１ｎから、一のストアを特定する。命令実行部１２は、構文木に、例えば図２に例示するget オペレーションが含まれている場合に、そのget オペレーションの引数に与えられたdataに基づいて、処理を依頼するストアを特定する。
【００４４】
例えば、図１に例示する各ストアに、それぞれ互いに独立した自然数が０からＮ（Ｎは、ストア数−１）まで付与されており、クライアント１０（具体的には、命令実行部１２）は、その付与された値を知っているとする。この場合、命令実行部１２は、「ｈａｓｈ（引数）  ｍｏｄ  ストア数」を計算した結果の値と一致するストアにデータが格納されていると判断し、そのストアにdataを送信してもよい。ただし、ストアの特定方法は、この方法に限定されない。なお、命令実行部１２は、上述するsplit やloopなどの命令も、上記定義に従い、一般的な方法に従って実行すればよい。
【００４５】
そして、命令実行部１２は、特定したストアに対して、構文木とインデックス情報とを送信する。命令実行部１２は、インデックス情報が格納される規則に基づいてストアを特定すればよい。以下の説明では、命令実行部１２が構文木およびインデックス情報を送信するストアを、ストア２１１として説明する。
【００４６】
ここで、命令実行部１２は、構文木およびインデックス情報をストア２１１に送信する際、構文解析部１１によって生成された構文木のうち、get オペレーションより上位に存在する構文木と、引数（data）とをストア２１１に送信する。すなわち、命令実行部１２は、送信するインデックスの取得命令を除いた構文木をストア２１１に送信する。
【００４７】
ストア２１１〜２１ｎは、それぞれ、命令実行部２２と、データ取得部２３とを含む。
【００４８】
命令実行部２２は、キーまたはインデックス情報を他の装置から受信すると、そのキーまたはインデックス情報を、同一ストア内のデータ取得部２３に送信する。また、命令実行部２２は、受信した構文木と、データ取得部２３が取得した情報とに基づいて、後続の処理を実行する。そして、命令実行部２２は、構文木を送信した装置に処理結果（具体的には、検索結果）を返信する。
【００４９】
データ取得部２３は、命令実行部２２からキーを受信すると、対応する値（バリュー）をデータ記憶部３１１から取得する。そして、データ取得部２３は、取得した値（バリュー）を命令実行部２２に送信する。また、データ取得部２３は、命令実行部２２からインデックス情報を受信すると、対応する複数のキーをデータ記憶部３１１から取得し、命令実行部２２に送信する。
【００５０】
また、命令実行部２２は、受信した構文木に、キーに対応する値（バリュー）の取得命令（get オペレーション）が含まれている場合、そのキーから特定されるストアに構文木およびキーを送信する。なお、命令実行部２２が受信するキーには、キーまたはインデックス情報が含まれる。キーまたはインデックス情報からストアを特定する方法は、命令実行部１２がストアを特定する方法と同様である。なお、そのキーまたはインデックス情報が自身のストアに格納されている場合、命令実行部２２は、キーまたはインデックス情報と構文木とをデータ取得部２３に送信すればよい。
【００５１】
例えば、一般的な構成では、各ストアは、構文木を他のストアに送信する処理を行う命令実行部２２を備えていない。すなわち、一般的な構成では、クライアント１０のみが命令実行部１２を備えている。そのため、構文木にget オペレーションが含まれている場合、命令実行部１２が、各ストアのデータ取得部２３にdataを送信して、データの検索指示を行っていた。
【００５２】
しかし、本実施形態では、クライアント１０は、構文解析部１１による処理と、命令実行部１２によるストアの特定処理およびデータの送信処理とを実行すればよいため、クライアント１０の負荷を低減できる。また、本実施形態では、命令実行部２２がキーまたはインデックス情報から特定されるストアにキーまたはインデックス情報と構文木とを送信する。そのため、１つのストアに処理負荷が集中することを抑制できるため、負荷分散を実現できる。
【００５３】
なお、本実施形態では、構文木とインデックス情報とが命令実行部１２からストア２１１に送信されるが、送信される構文木には、インデックス情報の取得命令は除かれている。そのため、ストア２１１の命令実行部２２は、そのインデックス情報に対応する複数のキーまたはインデックス情報の取得指示を、同一ストア内のデータ取得部２３にすることになる。
【００５４】
次に、本実施形態の負荷分散システムの動作を説明する。図３は、本実施形態の負荷分散システムの動作例を示すフローチャートである。図３に示す例では、検索指示から対象とする複数のキーを特定するためのインデックス情報は特定されているものとする。
【００５５】
まず、構文解析部１１は、検索命令から構文木を生成する（ステップＳ１１）。命令実行部１２は、インデックス情報が格納されているストアを、そのインデックス情報から特定し（ステップＳ１２）、構文木とインデックス情報とを、特定したストア２１１に送信する（ステップＳ１３）。
【００５６】
次に、ストア２１１の命令実行部２２は、受信したインデックス情報をデータ取得部２３に送信し、データ取得部２３は、インデックス情報に対応する複数のキーを取得する（ステップＳ１４）。命令実行部２２は、取得した複数のキーを構文木に基づいて順に処理する。
【００５７】
具体的には、命令実行部２２は、取得したキーの取得命令が構文木に存在する場合（ステップＳ１５におけるＹｅｓ）、そのキーから特定されるストアに、そのキーおよび構文木を送信する（ステップＳ１６）。なお、このとき、そのキーを取得する取得命令より上位に存在する構文木を送信する。キーおよびその構文木を受信したストアのデータ取得部２３は、キーに対応する値（バリュー）を取得し、構文木を送信した装置（ストア）に値を返信する（ステップＳ１７）。以下、ステップＳ１５以降の処理が繰り返される。
【００５８】
一方、取得したキーの取得命令が構文木に存在しない場合（ステップＳ１５におけるＮｏ）、命令実行部２２は、取得した値（バリュー）を、クライアント１０（具体的には、命令実行部１２）に返信する（ステップＳ１８）。
【００５９】
なお、ステップＳ１４において、データ取得部２３が複数のキーの代わりに複数のインデックス情報を取得した場合、命令実行部２２は、取得した複数のインデックスについて、ステップＳ１３以降の処理を繰り返せばよい。
【００６０】
次に、本実施形態の具体例を説明する。図４は、本実施形態の負荷分散システムの動作の具体例を示す説明図である。図４に示す例では、検索対象の値に対応するキーを特定するためのインデックス「ｉｎｄｅｘ１」が、ストア２１１に格納されているものとする。
【００６１】
クライアント１０の命令実行部１２は、構文解析部１１が解析した構文木とｉｎｄｅｘ１とを、ストア２１１に送信する（ステップＳ２１）。ストア２１１の命令実行部２２は、自身のデータ取得部２３に受信したｉｎｄｅｘ１を送信し、データ取得部２３は、ｉｎｄｅｘ１に対応する複数のキー「ｋｅｙ１，ｋｅｙ２，ｋｅｙ３」を取得する（ステップＳ２２）。
【００６２】
ストア２１１の命令実行部２２は、ｋｅｙ１、ｋｅｙ２およびｋｅｙ３で特定される値（バリュー）の取得処理を行う。ここで、ｋｅｙ１に対応する値（バリュー）は、ストア２１２に格納され、ｋｅｙ２に対応する値（バリュー）は、ストア２１１に格納され、ｋｅｙ３に対応する値（バリュー）は、ストア２１３に格納されているものとする。
【００６３】
このとき、命令実行部２２は、構文木およびｋｅｙ１をストア２１２に送信する（ステップＳ２３）。同様に、命令実行部２２は、構文木およびｋｅｙ３をストア２１３に送信する（ステップＳ２４）。なお、ｋｅｙ２は、自身のストアに格納されているため、命令実行部２２は、構文木およびｋｅｙ２を自身のデータ取得部２３に送信すればよい。
【００６４】
ストア２１１の命令実行部２２は、自身のデータ取得部２３にｋｅｙ２を送信し、データ取得部２３は、ｋｅｙ２に対応する値（バリュー）「ｖａｌｕｅ２」を取得する（ステップＳ２５）。
【００６５】
また、ストア２１２の命令実行部２２は、受信したｋｅｙ１を自身のデータ取得部２３に送信し、データ取得部２３は、ｋｅｙ１に対応する値（バリュー）「ｖａｌｕｅ１」を取得する（ステップＳ２６）。そして、ストア２１２の命令実行部２２は、取得された「ｖａｌｕｅ１」をストア２１１の命令実行部２２に返信する。
【００６６】
同様に、ストア２１３の命令実行部２２は、受信したｋｅｙ３を自身のデータ取得部２３に送信し、データ取得部２３は、ｋｅｙ３に対応する値（バリュー）「ｖａｌｕｅ３」を取得する（ステップＳ２７）。そして、ストア２１３の命令実行部２２は、取得された「ｖａｌｕｅ３」をストア２１１の命令実行部２２に返信する。
【００６７】
ストア２１１の命令実行部２２は、各ストアから返信されたバリュー「ｖａｌｕｅ１，ｖａｌｕｅ２，ｖａｌｕｅ３」をクライアント１０の命令実行部１２に返信する（ステップＳ２８）。
【００６８】
なお、図５に示す例では、ｉｎｄｅｘ１に複数のキー「ｋｅｙ１，ｋｅｙ２，ｋｅｙ３」が対応付けられている場合を例示した。例えば、ｉｎｄｅｘ１に複数のインデックス情報「ｉｎｄｅｘ１−１，ｉｎｄｅｘ１−２，ｉｎｄｅｘ１−３」が対応付けられているとする。この場合、ストア２１１の命令実行部２２は、クライアント１０の命令実行部１２と同様に、各インデックスが格納されているストアを特定し、そのストアにそれぞれインデックス情報を送信し、そのインデックス情報に対応するキーの検索を依頼すればよい。
【００６９】
以上に示すように、クライアントとストアとで、処理が分散して行われるため、処理負荷を分散させることが可能になる。すなわち、本実施形態によれば、クライアント１０の命令実行部１２が、インデックス情報からストアを特定し、特定したストアに構文木およびインデックス情報を送信する。ストア２１１の命令実行部２２が、インデックス情報に対応する１つ以上のキーまたは１つ以上のインデックス情報をデータ記憶部３１１から検索する。また、命令実行部２２は、キーまたはインデックス情報に対応するバリューの取得命令が受信した構文木に含まれている場合、キーまたはインデックス情報から特定されるストアにキーまたはインデックス情報と構文木とを送信し、受信したストアの命令実行部２２が、受信したキーまたはインデックス情報に対応するバリューを検索する。よって、分散キーバリューストアで用いられる各装置の負荷を分散できる。
【００７０】
次に、本実施形態の変形例を説明する。
上記実施形態では、クライアント１０の命令実行部１２とストア２１１〜２１ｎの命令実行部２２とが、それぞれ有すべき機能について説明したが、命令実行部１２と命令実行部２２が、同じ機能を有していてもよい。
【００７１】
図５は、本実施形態の負荷分散システムの変形例を示すブロック図である。本変形例の負荷分散システムは、複数のデータ検索装置４１１〜４１ｎを備えている。
【００７２】
各データ検索装置４１１〜４１ｎは、構文解析部４２と、命令実行部４３と、データ取得部４４と、データ記憶部５１１〜５１ｎとを備えている。なお、データ記憶部５１１〜５１ｎは、他の装置に含まれていてもよい。データ取得部４４とデータ記憶部５１１〜５１ｎは、それぞれ、上記実施形態のデータ取得部２３と、データ記憶部３１１〜３１ｎに対応する。
【００７３】
構文解析部４２の内容は、上記実施形態の構文解析部１１と同様である。具体的には、各データ検索装置４１１〜４１ｎのうち、検索命令を受信したデータ検索装置の構文解析部４２が、上記実施形態の構文解析部１１と同様の処理を行えばよい。すなわち、構文解析部４２は、構文木と、インデックス情報またはキーを命令実行部４３に送信する。
【００７４】
命令実行部４３は、上記実施形態の命令実行部１２または命令実行部２２と同様である。すなわち、命令実行部４３は、構文解析部４２からインデックス情報を受信すると、そのインデックス情報に基づいて送信先のストアを特定し、インデックス情報と構文木とを、その特定したストアに送信する。
【００７５】
また、命令実行部４３は、他のストアの命令実行部４３からキーまたはインデックス情報と、構文木を受信すると、受信したキーまたはインデックス情報をデータ取得部４４に送信する。データ取得部４４は、受信したキーまたはインデックス情報から、対応する値（バリュー）または、複数のキーを取得する。
【００７６】
さらに、命令実行部４３は、受信した構文木に、キーまたはインデックス情報に対応する値（バリュー）の取得命令（get オペレーション）が含まれている場合、そのキーまたはインデックス情報から特定されるストアに、キーまたはインデックス情報と構文木とを送信する。なお、命令実行部４３は、上記実施形態と同様に、get オペレーション以外の命令も実行する。
【００７７】
構文解析部４２と、命令実行部４３と、データ取得部４４とは、プログラム（負荷分散プログラム）に従って動作するコンピュータのＣＰＵによって実現される。例えば、プログラムは、データ検索装置４１１〜４１ｎの記憶部（図示せず）に記憶され、ＣＰＵは、そのプログラムを読み込み、プログラムに従って、構文解析部４２、命令実行部４３およびデータ取得部４４として動作してもよい。
【００７８】
また、構文解析部４２と、命令実行部４３と、データ取得部４４とは、それぞれが専用のハードウェアで実現されていてもよい。
【００７９】
このような構成であっても、１つのデータ検索装置に負荷が集中することを抑制できるため、分散キーバリューストアで用いられる各装置の負荷を分散できる。
【００８０】
次に、本発明の概要を説明する。図６は、本発明による負荷分散システムの概要を示すブロック図である。図６に例示する負荷分散システムは、検索命令を処理するクライアントノード８０（例えば、クライアント１０）と、キーバリュー形式のデータを格納するストレージ（例えば、データ記憶部３１１〜３１ｎ）から、キーに対応するバリューを検索する１以上のストアノード９０（例えば、ストア２１１〜２１ｎ）とを備えている。
【００８１】
クライアントノード８０は、バリューに対応するデータとしてストレージに格納された１つ以上のキーまたは１つ以上のインデックスの特定に用いられるインデックス（例えば、インデックス情報）から（例えば、ｈａｓｈ関数等を用いて）ストアノード９０を特定し、検索命令を構造化した構文木およびインデックスを、特定されたストアノード９０に送信するインデックス送信手段８１（例えば、命令実行部１２）を含む。
【００８２】
ストアノード９０は、キーに対応するバリュー、または、インデックスに対応する１つ以上のキーまたは１つ以上のインデックスを検索する検索手段９１（例えば、データ取得部２３）と、受信した構文木に基づいて命令を実行する命令実行手段９２（例えば、命令実行部２２）とを含む。
【００８３】
命令実行手段９２は、キーまたはインデックスを受信したときにそのキーまたはインデックスを検索手段９１に送信して対応するキーまたはインデックスを検索させる。また、命令実行手段９２は、キーまたはインデックスに対応するバリューの取得命令（例えば、get オペレーション）が受信した構文木に含まれている場合、そのキーまたはインデックスから特定されるストアノード９０にキーまたはインデックスと構文木とを送信する。
【００８４】
以上のような構成により、分散キーバリューストアで用いられる各装置の負荷を分散できる。
【００８５】
また、インデックス送信手段８１は、送信するインデックスに対応するデータの取得命令を除いた構文木およびそのインデックスを送信し、命令実行手段９２は、キーまたはインデックスから特定されるストアノード９０に、そのキーまたはインデックスに対応するデータの取得命令を除いた構文木およびそのキーまたはインデックスを送信してもよい。
【００８６】
また、命令実行手段９２は、構文木を送信した装置に処理結果を送信してもよい。
【００８７】
また、クライアントノード８０は、キーに対応するバリューの取得命令を含む構文木を検索命令から生成する構文解析手段（例えば、構文解析部１１）を含んでいてもよい。
【００８８】
また、図７は、本発明による負荷分散システムの他の概要を示すブロック図である。図７に例示する負荷分散システムは、キーバリュー形式でデータを格納するストレージ（例えば、データ記憶部５１１〜５１ｎ）から、キーに対応するバリューを検索する１以上のストアノード７０（例えば、データ検索装置４１１〜４１ｎ）を備えている。
【００８９】
ストアノード７０は、バリューに対応するデータとしてストレージに格納された１つ以上のキーまたは１つ以上のインデックスの特定に用いられるインデックスからストアノード７０を特定し、検索命令を構造化した構文木およびインデックスを、特定されたストアノードに送信する送信手段７１（例えば、命令実行部４３）と、受信した構文木に基づいて命令を実行する命令実行手段７２（例えば、命令実行部４３）と、インデックスに対応する１つ以上のキーまたは１つ以上のインデックスを検索する検索手段７３（例えば、データ取得部４４）とを含む。
【００９０】
送信手段７１は、キーに対応するバリューの取得命令が受信した構文木に含まれている場合、キーまたはインデックスから特定されるストアノード７０に、キーまたはインデックスと構文木とを送信し、命令実行手段７２は、キーまたはインデックスを受信したときに、そのキーまたはインデックスを検索手段７３に送信し、検索手段７３は、キーまたはインデックスに対応するバリュー（例えば、キーまたはインデックス）を検索する。
【００９１】
以上のような構成であっても、分散キーバリューストアで用いられる各装置の負荷を分散できる。
【００９２】
また、送信手段７１は、送信するインデックスに対応するデータの取得命令を除いた構文木およびそのインデックスを送信し、キーまたはインデックスから特定されるストアノードに、そのキーまたはインデックスに対応するデータの取得命令を除いた構文木およびそのキーまたはインデックスを送信してもよい。
【符号の説明】
【００９３】
１０  クライアント
１１  構文解析部
１２  命令実行部
２１１〜２１ｎ  ストア
２２  命令実行部
２３  データ取得部
３１１〜３１ｎ  データ記憶部
４１１〜４１ｎ  データ検索装置
４２  構文解析部
４３  命令実行部
４４  データ取得部
５１１〜５１ｎ  データ記憶部
【図１】
2015072563.tif 000003
【図２】
2015072563.tif 000004
【図３】
2015072563.tif 000005
【図４】
2015072563.tif 000006
【図５】
2015072563.tif 000007
【図６】
2015072563.tif 000008
【図７】
2015072563.tif 000009
【図８】
2015072563.tif 000010