(57)【特許請求の範囲】
【請求項１】
複数のサーバと通信する負荷分散装置であって、
当該負荷分散装置は、複数の異なるハッシュ値計算部を備えた処理部と、通信部とを備えており、
前記処理部は、読み取り入力クエリを受信した際、前記読み取り入力クエリのキーを取得し、
前記複数の異なるハッシュ値計算部のいずれかを決定し、前記決定したハッシュ値計算部により、前記読み取り入力クエリのキーから第１のハッシュ値を計算し、
前記通信部によって前記第１のハッシュ値に対応する第１のサーバをロックし、前記読み取り入力クエリを送信したのち、前記第１のサーバのロックを解除する、
ことを特徴とするデータベースの負荷分散装置。
【請求項２】
前記処理部は更に、乱数計算部を備えており、
前記処理部は、前記複数の異なるハッシュ値計算部のいずれかを、前記乱数計算部が出力する乱数によって決定する、
ことを特徴とする請求項１に記載のデータベースの負荷分散装置。
【請求項３】
前記通信部は、
前記第１のサーバを同期でロックしたのち、非同期で前記読み取り入力クエリを送信し、非同期で前記第１のサーバのロックを解除する、
ことを特徴とする請求項１または請求項２に記載のデータベースの負荷分散装置。
【請求項４】
前記処理部は、書き込み入力クエリを受信した際、前記書き込み入力クエリのキーを取得し、
前記複数の異なるハッシュ値計算部により、前記書き込み入力クエリのキーに基づく第２のハッシュ値配列を計算し、
前記通信部によって前記第２のハッシュ値配列の各要素に対応する第２のサーバ群を順番にロックし、前記書き込み入力クエリを送信したのち、前記第２のサーバ群のロックを解除する、
ことを特徴とする請求項１ないし請求項３のいずれか１項に記載のデータベースの負荷分散装置。
【請求項５】
前記通信部は、
前記第２のサーバ群を順番に同期でロックしたのち、非同期で前記書き込み入力クエリを送信し、非同期で前記第２のサーバ群のロックを解除する、
ことを特徴とする請求項４に記載のデータベースの負荷分散装置。
【請求項６】
前記処理部は更に、コンシステントハッシュ計算部を備えており、
前記第１のハッシュ値を計算した際、
前記コンシステントハッシュ計算部により、前記第１のハッシュ値をコンシステントハッシュの環に配置して前記第１のサーバを決定し、前記通信部によって前記第１のサーバをロックし、前記読み取り入力クエリを送信したのち、前記第１のサーバのロックを解除し、
前記第２のハッシュ値配列を計算した際、
前記コンシステントハッシュ計算部により、前記第２のハッシュ値配列をコンシステントハッシュの環に配置して前記第２のサーバ群と当該第２のサーバ群の順番とを決定し、前記通信部によって前記第２のサーバ群を順番にロックし、前記書き込み入力クエリを送信したのち、前記第２のサーバ群のロックを解除する、
ことを特徴とする請求項４または請求項５に記載のデータベースの負荷分散装置。
【請求項７】
前記処理部は更に、
前記第２のハッシュ値配列を計算した際、前記第２のハッシュ値配列をソートし、
前記コンシステントハッシュ計算部により、ソートした前記第２のハッシュ値配列をコンシステントハッシュの環に配置して第３のサーバ群と当該第３のサーバ群の順番を決定し、前記通信部によって前記第３のサーバ群を順番にロックし、前記書き込み入力クエリを送信したのち、前記第３のサーバ群のロックを解除する、
ことを特徴とする請求項６に記載のデータベースの負荷分散装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ネットワーク上に分散配置されたサーバをクラスタ化してデータを格納するデータベースの負荷分散装置に関する。
【背景技術】
【０００２】
近年、コンピュータのクラウド化に伴い、Ｗｅｂ側でのサービス提供が多くなってきている。Ｗｅｂ側のサービスの提供に於いては、ユーザも非常に膨大となることから、単位時間当たりのクエリ処理量に着目し、分散データベースシステムを導入する企業が増えている。特に、ボトルネックとなり易いデータベース（ＤＢ：DataBase）分野では、旧来のRelational DataBase（ＲＤＢ）から、ＮｏＳＱＬ型のデータベースシステムへの移行が増えている。
【０００３】
ＲＤＢの技術では、Row（行）、Column（列）からなる２次元のテーブル構造でデータを表現している。そして、ＳＱＬ（Structured Query Language）言語などによるクエリによって、この二次元テーブル構造のデータに対して、JOIN（結合）や正規化などの操作を実行することにより、検索などの処理を実現するものである。
【０００４】
ＲＤＢでは、このようなテーブル構造をベースとした処理を行っているため、データの一貫性は保持し易い。しかし、サーバの台数を増加させてスループットなどの性能を高める、いわゆるスケーラビリティの効果を得にくいという問題がある。
【０００５】
ＮｏＳＱＬ型のデータベースシステムは、スケーラビリティを享受することを最大の目標としている。ＮｏＳＱＬ型のデータベースシステムは、ハッシュ関数と相性が良いKey Value Store（ＫＶＳ）形式のインタフェースが多い。ＫＶＳ形式のインタフェースは、検索対象のValueにKeyを予め設定し、そのKeyに対してハッシュ関数を適用して検索を行うことで、Ｏ（１）またはＯ（ｌｏｇ（Ｎ））の計算量でのvalue検索を可能としている。ＫＶＳ形式のインタフェースを有するＮｏＳＱＬ型のデータベースシステムでは、ＲＤＢのようにテーブル構造のデータを持っていない。
非特許文献１には、コンシステントハッシュを利用したＮｏＳＱＬ型のデータベースシステムの発明が記載されている。
【先行技術文献】
【非特許文献】
【０００６】
【非特許文献１】Giuseppe DeCandia, Deniz Hastorun, Madan Jampani, Gunavardhan Kakulapati, Avinash Lakshman,Alex Pilchin, Swaminathan Sivasubramanian, Peter Vosshall, and Werner Vogels、”Dynamo: Amazon’s Highly Available Key-value Store”、SOSP’07、October 14-17, 2007、[平成２３年８月２日検索]、インターネット(URL:http://www.allthingsdistributed.com/files/amazon-dynamo-sosp2007.pdf)
【発明の概要】
【発明が解決しようとする課題】
【０００７】
ＮｏＳＱＬ型のデータベースシステムでは、クエリのアクセス毎に、そのアクセスを、データの在処であるサーバに振り分けているだけである。そのため、同一のデータに集中的にアクセスが発生する場合には処理が分散できずにタイムアウトが発生し、見かけの処理能力が低くなる虞がある。
【０００８】
たとえば、ＮｏＳＱＬ型のデータベースシステムを、公衆電話網システムに於ける電話番号の検索に適用した場合、チケット予約センタのように、いわゆる企画型輻輳が発生し易い電話番号のkeyにアクセスが集中する虞がある。このアクセスの集中により、この電話番号を格納している特定サーバの処理能力の限界を超えてしまう虞がある。これは、従来のＮｏＳＱＬ型のデータベースシステムが、同じkeyに対しては、単一のハッシュ値しか与えないことに起因している。
【０００９】
分散データベースシステムでは、冗長化のため、多重に同一の複製データを保持している。しかし、これらの複製データが使用されるのは故障時だけであり、それ以外はアクセスされることはない。
そこで、本発明は、この冗長化のための複製データにアクセス可能とし、処理能力を増大させるデータベースの負荷分散装置を提供することを課題とする。
【課題を解決するための手段】
【００１０】
前記した課題を解決するため、請求項１に記載の発明では、複数のサーバと通信する負荷分散装置であって、当該負荷分散装置は、複数の異なるハッシュ値計算部を備えた処理部と、通信部とを備えており、前記処理部は、読み取り入力クエリを受信した際、前記読み取り入力クエリのキーを取得し、前記複数の異なるハッシュ値計算部のいずれかを決定し、前記決定したハッシュ値計算部により、前記読み取り入力クエリのキーから第１のハッシュ値を計算し、前記通信部によって前記第１のハッシュ値に対応する第１のサーバをロックし、前記読み取り入力クエリを送信したのち、前記第１のサーバのロックを解除する、ことを特徴とするデータベースの負荷分散装置とした。
【００１１】
このようにすることで、本発明によれば、データの読み取りの際には、冗長化のための複製データを格納しているいずれかのサーバを決定し、アクセスを分散させている。これにより、特定のデータにアクセスが集中する場合でも、このアクセスを分散させることができ、システム全体として高いスループットを維持することができる。
【００１２】
請求項２に記載の発明では、前記処理部は更に、乱数計算部を備えており、前記処理部は、前記複数の異なるハッシュ値計算部のいずれかを、前記乱数計算部が出力する乱数によって決定する、ことを特徴とする請求項１に記載のデータベースの負荷分散装置とした。
【００１３】
このようにすることで、本発明によれば、データの読み取りの際には、複数の異なるハッシュ値計算部のうちいずれかを乱数で決定している。そして、決定したハッシュ値計算部のハッシュ値ｈによって、冗長化のための複製データを格納しているいずれかのサーバを決定している。これにより、乱数でアクセスを分散させることができ、自動アクセスソフトウェア（いわゆるロボット）などによる繰り返しのアクセスが同一のサーバに集中することを抑止することができる。
【００１４】
請求項３に記載の発明では、前記通信部は、前記第１のサーバを同期でロックしたのち、非同期で前記読み取り入力クエリを送信し、非同期で前記第１のサーバのロックを解除する、ことを特徴とする請求項１または請求項２に記載のデータベースの負荷分散装置とした。
【００１５】
このようにすることで、本発明によれば、データの読み取りの際には、対象サーバを同期でロックしたのち、非同期で入力クエリをサーバに送信したのち、非同期でサーバ群のロックを解除している。これにより、各サーバからの応答を待たずにサーバ群に入力クエリを送信できるので、高速に処理することができる。
【００１６】
請求項４に記載の発明では、前記処理部は、書き込み入力クエリを受信した際、前記書き込み入力クエリのキーを取得し、前記複数の異なるハッシュ値計算部により、前記書き込み入力クエリのキーに基づく第２のハッシュ値配列を計算し、前記通信部によって前記第２のハッシュ値配列の各要素に対応する第２のサーバ群を順番にロックし、前記書き込み入力クエリを送信したのち、前記第２のサーバ群のロックを解除する、ことを特徴とする請求項１ないし請求項３のいずれか１項に記載のデータベースの負荷分散装置とした。
【００１７】
このようにすることで、本発明によれば、データの書き込みの際には、データを複製して複数のサーバに格納している。これにより、耐障害性を高めることができる。
【００１８】
更に、データの書き込みの際には、このデータのキーを複数のハッシュ関数によって複数のハッシュ値ｈを計算し、これらハッシュ値ｈに基いて第２のサーバ群と当該第２のサーバ群の順番を決定し、決定した第２のサーバ群をロックしている。これにより、データの読み取りと競合した場合のデータの不整合を抑止することができる。
【００１９】
複数のハッシュ関数の順番は、全ての負荷分散装置に於いて同一である。どの負荷分散装置であっても、同一のキーを有するデータの書き込みの際に、同一の順番で同一の第２のサーバ群をロックする。これにより、複数の負荷分散装置が、互いに異なるサーバをロックし、相手がロックしているサーバのロック解除を両方で待っている状態、いわゆるデッドロック状態が発生することを抑止することができる。
【００２０】
請求項５に記載の発明では、前記通信部は、前記第２のサーバ群を順番に同期でロックしたのち、非同期で前記書き込み入力クエリを送信し、非同期で前記第２のサーバ群のロックを解除する、ことを特徴とする請求項４に記載のデータベースの負荷分散装置とした。
【００２１】
このようにすることで、本発明によれば、データの書き込みの際には、第２のサーバ群を同期でロックしたのち、非同期で入力クエリを第２のサーバ群に送信したのち、非同期で第２のサーバ群のロックを解除している。これにより、各サーバからの応答を待たずに第２のサーバ群に入力クエリを送信できるので、高速に処理することができる。
【００２２】
請求項６に記載の発明では、前記処理部は更に、コンシステントハッシュ計算部を備えており、前記第１のハッシュ値を計算した際、前記コンシステントハッシュ計算部により、前記第１のハッシュ値をコンシステントハッシュの環に配置して前記第１のサーバを決定し、前記通信部によって前記第１のサーバをロックし、前記読み取り入力クエリを送信したのち、前記第１のサーバのロックを解除し、前記第２のハッシュ値配列を計算した際、前記コンシステントハッシュ計算部により、前記第２のハッシュ値配列をコンシステントハッシュの環に配置して前記第２のサーバ群と当該第２のサーバ群の順番とを決定し、前記通信部によって前記第２のサーバ群を順番にロックし、前記書き込み入力クエリを送信したのち、前記第２のサーバ群のロックを解除する、ことを特徴とする請求項４または請求項５に記載のデータベースの負荷分散装置とした。
【００２３】
このようにすることで、本発明によれば、データの読み取りと書込みの際には、ハッシュ関数によってハッシュ値ｈを計算し、このハッシュ値ｈをコンシステントハッシュの環に配置して、対象サーバ（第１のサーバまたは第２のサーバ群）を決定している。これにより、サーバの増設と減設の際に、どのサーバにどのデータを移動すればよいかを、コンシステントハッシュの環に基いて容易に決定することができる。
【００２４】
請求項７に記載の発明では、前記処理部は更に、前記第２のハッシュ値配列を計算した際、前記第２のハッシュ値配列をソートし、前記コンシステントハッシュ計算部により、ソートした前記第２のハッシュ値配列をコンシステントハッシュの環に配置して第３のサーバ群と当該第３のサーバ群の順番を決定し、前記通信部によって前記第３のサーバ群を順番にロックし、前記書き込み入力クエリを送信したのち、前記第３のサーバ群のロックを解除する、ことを特徴とする請求項６に記載のデータベースの負荷分散装置とした。
【００２５】
このようにすることで、本発明によれば、全てのハッシュ値ｈをソートし、このソートした順番のハッシュ値ｈに対応する第３のサーバ群にアクセスしている。これにより、データの複製に限られず、如何なるデータ集合の更新においても、第３のサーバ群へのアクセス順番を一意に決定し、デッドロックを回避することができる。
【発明の効果】
【００２６】
本発明に係るデータベースの負荷分散装置によれば、この冗長化のための複製データにアクセス可能となるので、処理能力を増大させることができる。
【図面の簡単な説明】
【００２７】
【図１】第１の実施形態に於けるデータベースクラスタシステムの概要を示す図である。
【図２】第１の実施形態に於けるデータベースクラスタシステムを示す構成図である。
【図３】第１の実施形態に於けるディスパッチャを示す概略の構成図である。
【図４】第１の実施形態に於けるハッシュ関数とコンシステントハッシュの環を示す図である。
【図５】第１の実施形態に於ける入出力データの例を示す図である。
【図６】第１の実施形態に於ける書き込みの際の動作例を示す図である。
【図７】第１の実施形態に於ける読み取りの際の動作例を示す図である。
【図８】第１の実施形態に於ける書き込みの例を示すシーケンス図である。
【図９】第１の実施形態に於ける書き込みの競合の例を示すシーケンス図である。
【図１０】第１の実施形態に於ける書き込みと読み取りの競合の例を示すシーケンス図である。
【図１１】第１の実施形態に於けるディスパッチャの動作を示すフローチャートである。
【図１２】第２の実施形態に於けるディスパッチャの動作を示すフローチャートである。
【発明を実施するための形態】
【００２８】
以降、本発明を実施するための形態を、図を参照して詳細に説明する。
【００２９】
（第１の実施形態の構成）
図１は、第１の実施形態に於けるデータベースクラスタシステムの概要を示す図である。
データベースクラスタシステム１０は、ネットワーク１００を介して、外部システム９０であるオペレータシステム、または、入出力端末８０と接続されている。
【００３０】
データベースクラスタシステム１０は、外部システム９０や入出力端末８０からの入力データ（入力クエリ）を受け取る。そして、この入力データ（入力クエリ）に基いてデータの保存、更新、検索などを行い、その結果を出力データ（応答）として、外部システム９０や入出力端末８０に送信する。
【００３１】
図２は、第１の実施形態に於けるデータベースクラスタシステムを示す構成図である。
データベースクラスタシステム１０は、図面に於いて「Ｂ」と表記されているロードバランサ（Balancer）１３と、図面に於いて「Ｄ」と表記されている複数のディスパッチャ（Dispatcher）１４−ｎ（ｎは自然数）と、複数のサーバ１５−ｎとを有している。例えば、サーバ１５−１は、図面に於いて「Ｐ」と表記されているプロセッサ（Processor）１６−１と、図面に於いて「Ｓ」と表記されているストレージ（Storage）１７−１とを有している。他のサーバ１５−２，１５−３なども同様の構成を有している。データベースクラスタシステム１０は更に、後述する図６に示すように、サーバ１５−０，１５−４，１５−５，１５−６と、ディスパッチャ１４−０，１４−４，１４−５，１４−６とを有している。
この図２では、そのうち、サーバ１５−１〜１５−３と、ディスパッチャ１４−１〜１４−３とを図示し、それ以外の図示を省略している。
【００３２】
ロードバランサ１３は、入力装置１１から入力データ（入力クエリ）を取得し、出力データ（応答）を出力装置１２に送信する。また、ロードバランサ１３は、ラウンドロビンなどにより、入力クエリを複数のディスパッチャ１４−０〜１４−６のいずれかに振り分ける。ここで、入力装置１１および出力装置１２は、前述した図１に示す外部システム９０や入出力端末８０のことをいう。データベースクラスタシステム１０に対する入力クエリとは、例えば、ＳＱＬのクエリやＸＣＡＰ（XML Configuration Access Protocol）のような、データベースからデータを取得するための要求のことである。
【００３３】
負荷分散装置であるディスパッチャ１４−１は、それぞれ複数のプロセッサ１６−０〜１６−６と接続されており、ロードバランサ１３から取得した書き込み入力クエリと読み取り入力クエリを、サーバ１５−０（プロセッサ１６−０）〜サーバ１５−６（プロセッサ１６−６）のいずれかに振り分ける。このディスパッチャ１４−１は、入力クエリを解析してキーを取得し、複数のハッシュ関数によりハッシュ値ｈを計算し、コンシステントハッシュの環を適用してデータの格納先であるサーバ１５−ｎを決定し、その入力クエリを送信する。他のディスパッチャ１４−２，１４−３なども同様に構成されている。なお、ディスパッチャ１４−ｎの詳細な構成を処理については、ディスパッチャ１４−１を例として、後述する図３で詳細に説明する。
【００３４】
プロセッサ１６−１は、複数のディスパッチャ１４−ｎおよび自身が制御するストレージ１７−１と接続されており、ディスパッチャ１４−ｎから入力クエリを受信し、その入力クエリに従い、ストレージ１７−１に新規に入力データを保存し、既存データを更新し、既存データを検索する制御を実行する。他のプロセッサ１６−２，１６−３などもプロセッサ１６−１と同様に構成されている。
【００３５】
ストレージ１７−１は、実際にデータを保存する記憶手段であり、第１の実施形態では、各データがＸＭＬ（Extensible Markup Language）ファイルで保存されている。他のストレージ１７−２，１７−３などもストレージ１７−１と同様に構成されている。第１の実施形態に於いて、このプロセッサ１６−ｎとストレージ１７−ｎの組を、１つのサーバ１５−ｎとして説明する。
【００３６】
図３は、第１の実施形態に於けるディスパッチャを示す概略の構成図である。ここでは、ディスパッチャ１４−１を例に説明する。
ディスパッチャ１４−１は、処理部２１と、記憶部２２と、通信部２３とを備えている。ディスパッチャ１４−１は、ロードバランサ１３（図２）および複数のプロセッサ１６−ｎ（図２）と通信可能に接続され、ロードバランサ１３（図２）から取得した入力クエリを、プロセッサ１６−ｎ（図２）のいずれかに振り分ける負荷分散装置である。
通信部２３は、通信回線を介して情報を送受信する通信インタフェースによって構成され、内部バスなどを介して処理部２１に接続されている。
【００３７】
通信部２３は、ロードバランサ１３（図２）や、各プロセッサ１６−ｎ（図２）との間の情報の送受信を行う。例えば、通信部２３は、ロードバランサ１３（図２）が送信した入力クエリを受信し、各プロセッサ１６−ｎ（図２）に対し、その入力クエリを送信する。また、通信部２３は、ストレージ１７−ｎ（図２）に保存されていたデータなどの検索結果をプロセッサ１６−ｎ（図２）から受信し、ロードバランサ１３（図２）に対して送信する。
【００３８】
処理部２１は、クエリ解析部２４と、サーバ決定処理部２５とを備えており、ディスパッチャ１４−１全体を制御する。この処理部２１は、例えば、ディスパッチャ１４−１の記憶部２２に格納されたプログラムをＣＰＵ（Central Processing Unit）が記憶部２２のＲＡＭ（Random Access Memory）に展開して実行することによって実現される。
【００３９】
記憶部２２は、ハードディスク、フラッシュメモリ、ＲＡＭなどの記憶装置からなり、各サーバ１５−ｎ（図２）のＩＤなどを記憶している。サーバ１５−ｎ（図２）のＩＤは、このサーバ１５−ｎ（図２）を一意に識別可能な情報であり、第１の実施形態では、０〜６の数字が用いられている。しかし、これに限られず、このサーバ１５−ｎ（図２）のＩＰ（Internet Protocol）アドレス、または、ＭＡＣ（Media Access Control address）アドレスなどを用いてもよい。
【００４０】
クエリ解析部２４は、通信部２３から入力クエリを受け取り、そのクエリの内容を構文解析する。例えば、クエリ解析部２４は、その入力クエリが、ストレージ１７−ｎ（図２）に格納されたデータに対する読み取り要求（GET）、新規のデータの書き込み要求（PUT）、既存データの更新要求（UPDATE）のいずれであるかを解析する。当該入力クエリがGETであるときには更に、（ａ）keyの完全一致検索、（ｂ）keyの範囲検索、（ｃ）valueの完全一致検索、（ｄ）valueの範囲検索のいずれであるかを解析する。クエリ解析部２４は、これらの解析結果を、サーバ決定処理部２５に引き渡す。
【００４１】
サーバ決定処理部２５は、乱数計算部２６と、複数の異なるハッシュ値計算部である第１ハッシュ値計算部２７−１〜第３ハッシュ値計算部２７−３と、コンシステントハッシュ計算部２８とを備えている。しかし、これに限られず、このサーバ決定処理部２５は、振り分け対象サーバ数に対応するＭ個のハッシュ関数計算部を有していてもよい。なお、振り分け対象サーバ数Ｍは、２以上かつサーバ１５−ｎ（図２）の台数以下である。
【００４２】
サーバ決定処理部２５は、クエリ解析部２４から取得した解析結果に基き、ハッシュ関数のうちいずれかを選択し、コンシステントハッシュの環を適用して、振り分け先となるサーバ１５−ｎを決定する。
【００４３】
乱数計算部２６は、このサーバ決定処理部２５が有している３個のハッシュ関数を選択するため、０以上かつ３未満の乱数ｒを出力する。しかし、これに限られず、このサーバ決定処理部２５がＭ個のハッシュ関数を有しているとき、乱数計算部２６は、これらを選択するため、０以上かつＭ未満の乱数ｒを出力してもよい。
【００４４】
第１ハッシュ値計算部２７−１〜第３ハッシュ値計算部２７−３は、それぞれ別のハッシュ関数によってハッシュ値ｈを計算する。第１ハッシュ値計算部２７−１は、全てのディスパッチャ１４−１〜１４−３に於いて、同一の入力値ｘに対して同一の出力値（ハッシュ値ｈ）を計算する。これにより、どのディスパッチャ１４−１〜１４−３の第１ハッシュ値計算部２７−１で計算しても、入力クエリのキーに基いて、一意にサーバ１５−ｎを決定することができる。第２ハッシュ値計算部２７−２、第３ハッシュ値計算部２７−３も、第１ハッシュ値計算部２７−１と同様である。
コンシステントハッシュ計算部２８は、前述したハッシュ値ｈをコンシステントハッシュの環に適用し、ハッシュ値ｈに対応したサーバ１５−ｎを決定する。
【００４５】
図４（ａ），（ｂ）は、第１の実施形態に於けるハッシュ関数とコンシステントハッシュの環を示す図である。
図４（ａ）は、例えば、第１ハッシュ値計算部２７−１（図３）が有しているハッシュ関数の入力値ｘと出力値であるハッシュ値ｈとの関係を示す図である。縦軸は出力値であるハッシュ値ｈを示し、横軸は入力値ｘを示している。
【００４６】
このハッシュ関数によれば、入力値ｘに対して、出力値であるハッシュ値ｈは離散的な値となる。つまり、入力クエリが有するキーを入力値ｘとして計算したとき、ハッシュ値ｈは離散的な値となる。このハッシュ値ｈを基に、サーバ１５−ｎを決定する。これにより、２つの入力クエリのキーがそれぞれ異なると、ハッシュ値ｈはそれぞれ飛び離れた値となる。これらハッシュ値ｈに対応したサーバに、それぞれの入力クエリの処理を行わせる。これにより、それぞれの入力クエリのキーの処理を、各サーバ１５−ｎに分散することができる。
【００４７】
図４（ｂ）は、コンシステントハッシュの環を示す図である。時計まわりの矢印は、前述したハッシュ値ｈを示し、環上の点の番号ｎは、サーバ１５−０〜１５−６（図６）のＩＤを０から６の番号で示している。
【００４８】
ハッシュ値ｈを、コンシステントハッシュの環に適用して配置する。このコンシステントハッシュの環状領域には、ノードと呼ばれる担当領域が決まっている。ハッシュ値ｈが与えられたとき、どこのノード（担当領域）に入るかによって、対象サーバが決定される。
【００４９】
ハッシュ値ｈが、ｎ＝０の点に配置されていたとき、および、ｎ＝０の点からｎ＝１の点の間に配置されていたときには、ＩＤが０のサーバ１５−０（図６）を対象サーバに決定する。
【００５０】
ハッシュ値ｈが、ｎ＝１の点に配置されていたとき、および、ｎ＝１の点からｎ＝２の点の間に配置されていたときには、ＩＤが１のサーバ１５−１（図６）を対象サーバに決定する。
【００５１】
ハッシュ値ｈが、ｎ＝２の点に配置されていたとき、および、ｎ＝２の点からｎ＝３の点の間に配置されていたときには、ＩＤが２のサーバ１５−２（図６）を対象サーバに決定する。
【００５２】
ハッシュ値ｈが、ｎ＝３の点に配置されていたとき、および、ｎ＝３の点からｎ＝４の点の間に配置されていたときには、ＩＤが３のサーバ１５−３（図６）を対象サーバに決定する。
【００５３】
ハッシュ値ｈが、ｎ＝４の点に配置されていたとき、および、ｎ＝４の点からｎ＝５の点の間に配置されていたときには、ＩＤが４のサーバ１５−４（図６）を対象サーバに決定する。
【００５４】
ハッシュ値ｈが、ｎ＝５の点に配置されていたとき、および、ｎ＝５の点からｎ＝６の点の間に配置されていたときには、ＩＤが５のサーバ１５−５（図６）を対象サーバに決定する。
【００５５】
ハッシュ値ｈが、ｎ＝６の点に配置されていたとき、および、ｎ＝６の点からｎ＝０の点の間に配置されていたときには、ＩＤが５のサーバ１５−６（図６）を対象サーバに決定する。
【００５６】
図５は、第１の実施形態に於ける入出力データの例を示す図である。
入出力ファイル２００は、ＸＭＬ形式で記載されており、keyとvalueの４つのタグ要素（name，location，phone，charge）を有している。
【００５７】
Keyは、「a0123」が付与されている。
Valueのnameタグには「ono」が格納されている。Valueのlocationタグには「tokyo」が格納されている。Valueのphoneタグには「0333331111」が格納されている。Valueのchargeタグには「3500」が格納されている。
【００５８】
（第１の実施形態の動作）
図６は、第１の実施形態に於ける書き込みの際の動作例を示す図である。
データベースクラスタシステム１０は、７台のサーバ１５−０〜１５−６を備えている。このサーバ１５−０〜１５−６は、それぞれ、ディスパッチャ１４−０〜１４−６と、プロセッサ１６−０〜１６−６と、ストレージ１７−０〜１７−６とを備えている。サーバ１５−０のＩＤは０であり、以降、サーバ１５−１〜１５−６のＩＤは、１〜６である。
【００５９】
書き込みの際、ロードバランサ１３は、前述した外部システム９０（図１）または入出力端末８０（図１）から「PUT」の入力クエリ（書き込み入力クエリ）を受信する。このロードバランサ１３は、ラウンドロビンなどの処理によりディスパッチャ１４−０〜１４−６のいずれかを選択し、選択したディスパッチャ１４−ｎに、この「PUT」の入力クエリを送信する。図６では、ディスパッチャ１４−３に送信している。
【００６０】
ディスパッチャ１４−３は、ロードバランサ１３から「PUT」の入力クエリを受信すると、クエリ解析部２４によって、当該入力クエリを解析する。この解析結果に基き、サーバ決定処理部２５（図３）によってサーバ１５−１（プロセッサ１６−１）、サーバ１５−３（プロセッサ１６−３）、サーバ１５−６（プロセッサ１６−６）と、その順番を決定して、この「PUT」の入力クエリを送信する。
【００６１】
サーバ１５−１のプロセッサ１６−１は、ディスパッチャ１４−３から「PUT」の入力クエリを受信すると、その「PUT」の入力クエリに従い、ストレージ１７−１に、新規データである入出力ファイル２００を保存する。そののち、ストレージ１７−１は、プロセッサ１６−１に応答を送信する。プロセッサ１６−１は、ディスパッチャ１４−３に応答を送信する。
サーバ１５−３のプロセッサ１６−３とサーバ１５−６のプロセッサ１６−６も、前述したサーバ１５−１のプロセッサ１６−１と同様に動作する。
【００６２】
ディスパッチャ１４−３は、プロセッサ１６−１，１６−３，１６−６の全てから応答を受信したならば、ロードバランサ１３に応答を送信する。ロードバランサ１３は、この「PUT」の入力クエリを送信した外部システム９０（図１）または入出力端末８０（図１）に、新規データを保存した旨の応答を送信する。これにより、データベースクラスタシステム１０は、データの書き込み処理を行うことができる。
【００６３】
図７は、第１の実施形態に於ける読み取りの際の動作例を示す図である。
データベースクラスタシステム１０は、７台のサーバ１５−０〜１５−６を備えている。このサーバ１５−０〜１５−６は、それぞれディスパッチャ１４−０〜１４−６を備えている。ストレージ１７−１，１７−３，１７−６には、入出力ファイル２００が格納されている。
【００６４】
読み取りの際に、ロードバランサ１３は、前述した外部システム９０（図１）または入出力端末８０（図１）から「GET」の入力クエリ（読み取り入力クエリ）を受信する。このロードバランサ１３は、この「GET」の入力クエリをディスパッチャ１４−０〜１４−６のいずれかに送信する。図７の左側の例では、ディスパッチャ１４−２に「GET」の入力クエリを送信している。図７の中央の例では、ディスパッチャ１４−４に「GET」の入力クエリを送信している。図７の右側の例では、ディスパッチャ１４−６に「GET」の入力クエリを送信している。
【００６５】
図７の左側の例に於いて、ディスパッチャ１４−２は、ロードバランサ１３から「GET」の入力クエリを受信すると、クエリ解析部２４によって、当該入力クエリを解析する。この解析結果に基き、サーバ決定処理部２５（図３）によって、この「GET」の入力クエリのキーに対応するサーバ１５−１，１５−６，１５−３からサーバ１５−１を決定し、この「GET」の入力クエリを送信する。
【００６６】
サーバ１５−１のプロセッサ１６−１は、ディスパッチャ１４−２から「GET」の入力クエリを受信すると、その「GET」の入力クエリに従い、ストレージ１７−１から入出力ファイル２００を読み取る。プロセッサ１６−１は、ディスパッチャ１４−２に入出力ファイル２００を含んだ応答を送信する。
【００６７】
ディスパッチャ１４−２は、プロセッサ１６−１から、入出力ファイル２００を含んだ応答を受信したならば、この応答をロードバランサ１３に送信する。ロードバランサ１３は、この「GET」の入力クエリを送信した外部システム９０（図１）または入出力端末８０（図１）に、入出力ファイル２００を含んだ応答を送信する。
【００６８】
図７の中央の例に於いて、ディスパッチャ１４−４は、ロードバランサ１３から「GET」の入力クエリを受信すると、クエリ解析部２４によって、当該入力クエリを解析する。この解析結果に基き、サーバ決定処理部２５（図３）によって、この「GET」の入力クエリのキーに対応するサーバ１５−１，１５−６，１５−３からサーバ１５−３（プロセッサ１６−３）を決定し、この「GET」の入力クエリを送信する。
【００６９】
サーバ１５−３のプロセッサ１６−３は、ディスパッチャ１４−４から「GET」の入力クエリを受信すると、その「GET」の入力クエリに従い、ストレージ１７−３から入出力ファイル２００を読み取る。プロセッサ１６−３は、ディスパッチャ１４−４に入出力ファイル２００を含んだ応答を送信する。
【００７０】
ディスパッチャ１４−４は、プロセッサ１６−３から、入出力ファイル２００を含んだ応答を受信したならば、この応答をロードバランサ１３に送信する。ロードバランサ１３は、この「GET」の入力クエリを送信した外部システム９０（図１）または入出力端末８０（図１）に、入出力ファイル２００を含んだ応答を送信する。
【００７１】
図７の右側の例に於いて、ディスパッチャ１４−６は、ロードバランサ１３から「GET」の入力クエリを受信すると、クエリ解析部２４によって、当該入力クエリを解析する。この解析結果に基き、サーバ決定処理部２５（図３）によって、この「GET」の入力クエリのキーに対応するサーバ１５−１，１５−６，１５−３からサーバ１５−６を決定し、この「GET」の入力クエリを送信する。
【００７２】
サーバ１５−６のプロセッサ１６−６は、ディスパッチャ１４−６から「GET」の入力クエリを受信すると、その「GET」の入力クエリに従い、ストレージ１７−６から入出力ファイル２００を読み取る。プロセッサ１６−６は、ディスパッチャ１４−６に入出力ファイル２００を含んだ応答を送信する。
【００７３】
ディスパッチャ１４−６は、プロセッサ１６−６から、入出力ファイル２００を含んだ応答を受信したならば、この応答をロードバランサ１３に送信する。ロードバランサ１３は、この「GET」の入力クエリを送信した外部システム９０（図１）または入出力端末８０（図１）に、入出力ファイル２００を含んだ応答を送信する。
【００７４】
図８は、第１の実施形態に於ける書き込みの例を示すシーケンス図である。
処理を開始すると、シーケンスＱ１０に於いて、入出力端末８０は、ロードバランサ１３に対して、「PUT」の入力クエリを送信する。この入力クエリは、書き込みクエリであることを示す「PUT」の情報と、入力ファイルのキーである「a0123」の情報と、入力ファイル「a0123.xml」のファイル本体の情報とを含んでいる。
【００７５】
シーケンスＱ１１に於いて、ロードバランサ１３は、例えば、ディスパッチャ１４−１に対して、当該「PUT」の入力クエリを送信する。ディスパッチャ１４−１は、当該「PUT」の入力クエリを受信すると、第１ハッシュ値計算部２７−１〜第３ハッシュ値計算部２７−３（図３）により、キーである「a0123」の情報に基き、それぞれのハッシュ値を計算する。ここで計算された３つのハッシュ値は、第２のハッシュ値配列である。
【００７６】
シーケンスＱ１２に於いて、ディスパッチャ１４−１の通信部２３（図３）は、サーバ１５−１に対して、ロック取得コマンドを同期で送信する。サーバ１５−１は、第２のハッシュ値配列の最初の要素に対応するサーバである。
【００７７】
ここで、「ロック取得コマンドを同期で送信する」とは、ロック取得コマンドの送信側（ディスパッチャ１４−１）が、このロック取得コマンドの応答を待ってから、自身の作業を続行することを言う。
【００７８】
シーケンスＱ１３に於いて、サーバ１５−１は、ディスパッチャ１４−１に対して、ロック取得コマンドに対する応答を送信する。以降、サーバ１５−１は、ディスパッチャ１４−１が、この取得したロックを解除するまで、新たなロック取得コマンドには応答しなくなる。
【００７９】
シーケンスＱ１４に於いて、ディスパッチャ１４−１の通信部２３（図３）は、サーバ１５−６に対して、ロック取得コマンドを同期で送信する。サーバ１５−６は、第２のハッシュ値配列の２番目の要素に対応するサーバである。
【００８０】
シーケンスＱ１５に於いて、サーバ１５−３は、ディスパッチャ１４−１に対して、ロック取得コマンドに対する応答を送信する。以降、サーバ１５−６は、ディスパッチャ１４−１が、この取得したロックを解除するまで、新たなロック取得コマンドには応答しなくなる。
【００８１】
シーケンスＱ１６に於いて、ディスパッチャ１４−１の通信部２３（図３）は、サーバ１５−３に対して、ロック取得コマンドを同期で送信する。サーバ１５−３は、第２のハッシュ値配列の３番目の要素に対応するサーバである。すなわち、第２のハッシュ値配列の各要素に対応する第２のサーバ群は、サーバ１５−１，１５−６，１５−３である。
【００８２】
シーケンスＱ１７に於いて、サーバ１５−３は、ディスパッチャ１４−１に対して、ロック取得コマンドに対する応答を送信する。以降、サーバ１５−３は、ディスパッチャ１４−１が、この取得したロックを解除するまで、新たなロック取得コマンドには応答しなくなる。
【００８３】
シーケンスＱ１８に於いて、ディスパッチャ１４−１の通信部２３（図３）は、サーバ１５−１に対して、入力クエリを非同期で送信する。サーバ１５−１のプロセッサ１６−１は、ストレージ１７−１に、この入力クエリが含んでいる入力ファイル「a0123.xml」を書き込む。
【００８４】
ここで、「入力クエリを非同期で送信する」とは、入力クエリの送信側（ディスパッチャ１４−１）が、この入力クエリの応答を待つことなく、自身の作業を続行することを言う。
【００８５】
シーケンスＱ１９に於いて、ディスパッチャ１４−１の通信部２３（図３）は、サーバ１５−３に対して、入力クエリを非同期で送信する。サーバ１５−３のプロセッサ１６−３は、ストレージ１７−３に、この入力クエリが含んでいる入力ファイル「a0123.xml」を書き込む。
【００８６】
シーケンスＱ２０に於いて、ディスパッチャ１４−１の通信部２３（図３）は、サーバ１５−６に対して、入力クエリを非同期で送信する。サーバ１５−６のプロセッサ１６−６は、ストレージ１７−６に、この入力クエリが含んでいる入力ファイル「a0123.xml」を書き込む。
【００８７】
シーケンスＱ２１に於いて、サーバ１５−１は、ディスパッチャ１４−１に対して、入力クエリに対する応答を送信する。
シーケンスＱ２２に於いて、サーバ１５−３は、ディスパッチャ１４−１に対して、入力クエリに対する応答を送信する。
シーケンスＱ２３に於いて、サーバ１５−６は、ディスパッチャ１４−１に対して、入力クエリに対する応答を送信する。
【００８８】
シーケンスＱ２４に於いて、ディスパッチャ１４−１の通信部２３（図３）は、サーバ１５−１に対して、ロック解除コマンドを非同期で送信する。サーバ１５−１は、ロックを解除し、新たなロック取得コマンドに応答可能な状態となる。
【００８９】
シーケンスＱ２５に於いて、ディスパッチャ１４−１の通信部２３（図３）は、サーバ１５−３に対して、ロック解除コマンドを非同期で送信する。サーバ１５−３は、ロックを解除し、新たなロック取得コマンドに応答可能な状態となる。
【００９０】
シーケンスＱ２６に於いて、ディスパッチャ１４−１の通信部２３（図３）は、サーバ１５−６に対して、ロック解除コマンドを非同期で送信する。サーバ１５−６は、ロックを解除し、新たなロック取得コマンドに応答可能な状態となる。
【００９１】
シーケンスＱ２７に於いて、サーバ１５−１は、ディスパッチャ１４−１に対して、ロック解除コマンドに対する応答を送信する。
シーケンスＱ２８に於いて、サーバ１５−３は、ディスパッチャ１４−１に対して、ロック解除コマンドに対する応答を送信する。
シーケンスＱ２９に於いて、サーバ１５−６は、ディスパッチャ１４−１に対して、ロック解除コマンドに対する応答を送信する。
【００９２】
シーケンスＱ３０に於いて、ディスパッチャ１４−１の通信部２３（図３）は、ロードバランサ１３に対して、入力クエリの完了通知を送信する。
シーケンスＱ３１に於いて、ロードバランサ１３は、入出力端末８０に対して、入力クエリの完了通知を送信する。
以上のシーケンスにより、入出力端末８０から、データベースクラスタシステム１０に対して、データを書き込むことができる。
【００９３】
図９は、第１の実施形態に於ける書き込みの競合の例を示すシーケンス図である。図８に示すシーケンスと同一の要素には同一の符号を付与している。
この図９に於いて、右側のロードバランサ１３と左側のロードバランサ１３とは、同一のものを示している。更に、右側の入出力端末８０と左側の入出力端末８０とは、異なるものを示している。
シーケンスＱ１０〜Ｑ３１は、図８に示すシーケンスと同様である。
【００９４】
シーケンスＱ４０に於いて、右側の入出力端末８０は、ロードバランサ１３に対して、「PUT」の入力クエリを同期で送信する。この入力クエリは、シーケンスＱ１０（図８）と同様に、書き込み入力クエリであることを示す「PUT」の情報と、ファイルのキーである「a0123」の情報と、入力ファイルである「a0123.xml」の情報とを含んでいる。
【００９５】
シーケンスＱ４１に於いて、ロードバランサ１３は、ディスパッチャ１４−３に対して、当該「PUT」の入力クエリを同期で送信する。ディスパッチャ１４−３の通信部２３（図３）は、当該「PUT」の入力クエリを受信すると、第１ハッシュ値計算部２７−１〜第３ハッシュ値計算部２７−３（図３）により、キーである「a0123」の情報に基き、第２のハッシュ値配列を計算する。
【００９６】
シーケンスＱ４２に於いて、ディスパッチャ１４−３の通信部２３（図３）は、サーバ１５−１に対して、ロック取得コマンドを同期で送信する。サーバ１５−１は、第２のハッシュ値配列の最初の要素に対応するサーバである。しかし、サーバ１５−１は、既にロックされているので、このロック取得コマンドに対する応答は、ロックが解除されるまで待たされる。
【００９７】
前述したシーケンスＱ２７に於いて、サーバ１５−１はロックが解除され、新たなロックに応答するようになる。こののち、シーケンスＱ４３に於いて、サーバ１５−１は、ディスパッチャ１４−３に対して、ロック取得コマンドに対する応答を送信する。以降、サーバ１５−１は、ディスパッチャ１４−３が、この取得したロックを解除するまで、新たなロック取得コマンドには応答しなくなる。
以降、シーケンスＱ４４〜Ｑ６１の処理は、シーケンスＱ１４〜Ｑ３１の処理と同様である。
【００９８】
このように、サーバをロックして入力クエリを送信し、そののちにロックを解除しているので、ほぼ同時に書込み処理が行われた場合であっても、データの不整合が発生しなくなる。
【００９９】
図１０は、第１の実施形態に於ける書き込みと読み取りの競合の例を示すシーケンス図である。図８に示すシーケンスと同一の要素には同一の符号を付与している。
この図１０に於いて、右側のロードバランサ１３と左側のロードバランサ１３とは、同一のものを示している。
シーケンスＱ１０〜Ｑ３１は、図８に示すシーケンスと同様である。
シーケンスＱ７０〜Ｑ７９は、読み取りのシーケンス例を示している。
【０１００】
シーケンスＱ７０に於いて、右側の入出力端末８０は、ロードバランサ１３に対して、「GET」の入力クエリを同期で送信する。この入力クエリは、読み取り入力クエリであることを示す「GET」の情報と、ファイルのキーである「a0123」の情報とを含んでいる。
シーケンスＱ７１に於いて、ロードバランサ１３は、ディスパッチャ１４−３に対して、当該「GET」の入力クエリを同期で送信する。
【０１０１】
シーケンスＱ７２に於いて、ディスパッチャ１４−３の通信部２３（図３）は、サーバ１５−３に対して、ロック取得コマンドを同期で送信する。サーバ１５−３は、ハッシュ値ｈに対応するサーバである。
【０１０２】
シーケンスＱ７３に於いて、サーバ１５−３は、ディスパッチャ１４−３に対して、ロック取得コマンドに対する応答を送信する。以降、サーバ１５−３は、ディスパッチャ１４−３が、この取得したロックを解除するまで、新たなロック取得コマンドには応答しなくなる。
【０１０３】
シーケンスＱ７４に於いて、ディスパッチャ１４−３の通信部２３（図３）は、サーバ１５−３に対して、この入力クエリを非同期で送信する。サーバ１５−３のプロセッサ１６−３は、ストレージ１７−３から、この入力クエリが含んでいるキー「a0123」に対応する入力ファイル「a0123.xml」を読み取る。
【０１０４】
シーケンスＱ７５に於いて、サーバ１５−３は、ディスパッチャ１４−３に対して、入力クエリに対する応答を送信する。この応答は、出力ファイル「a0123.xml」を含んでいる。
【０１０５】
シーケンスＱ７６に於いて、ディスパッチャ１４−３の通信部２３（図３）は、サーバ１５−３に対して、ロック解除コマンドを非同期で送信する。サーバ１５−３は、ロックを解除し、新たなロック取得コマンドに応答可能な状態となる。
シーケンスＱ７７に於いて、サーバ１５−３は、ディスパッチャ１４−３に対して、ロック解除コマンドに対する応答を送信する。
【０１０６】
シーケンスＱ７８に於いて、ディスパッチャ１４−３の通信部２３（図３）は、ロードバランサ１３に対して、出力ファイル「a0123.xml」を含んだ完了通知を送信する。
シーケンスＱ７９に於いて、ロードバランサ１３は、図１０右側の入出力端末８０に対して、出力ファイル「a0123.xml」を含んだ完了通知を送信する。
【０１０７】
シーケンスＱ８０〜Ｑ８９は、書き込みと読み取りの競合シーケンス例を示している。
シーケンスＱ８０に於いて、右側の入出力端末８０は、ロードバランサ１３に対して、「GET」の入力クエリを同期で送信する。この入力クエリは、読み取り入力クエリであることを示す「GET」の情報と、ファイルのキーである「a0123」の情報とを含んでいる。
シーケンスＱ８１に於いて、ロードバランサ１３は、ディスパッチャ１４−３に対して、当該「GET」の入力クエリを同期で送信する。
【０１０８】
シーケンスＱ８２に於いて、ディスパッチャ１４−３の通信部２３（図３）は、サーバ１５−３に対して、ロック取得コマンドを同期で送信する。サーバ１５−３は、ハッシュ値ｈに対応するサーバである。しかし、サーバ１５−３は、既にロックされているので、このロック取得コマンドに対する応答は、ロックが解除されるまで待たされる。
【０１０９】
前述したシーケンスＱ２８に於いて、サーバ１５−３はロックが解除され、新たなロックに応答するようになる。こののち、シーケンスＱ８３に於いて、サーバ１５−３は、ディスパッチャ１４−３に対して、ロック取得コマンドに対する応答を送信する。以降、サーバ１５−３は、ディスパッチャ１４−３が、この取得したロックを解除するまで、新たなロック取得コマンドには応答しなくなる。
以降、シーケンスＱ８４〜Ｑ８９の処理は、シーケンスＱ７４〜Ｑ７９の処理と同様である。
【０１１０】
このように、サーバをロックして入力クエリを送信し、そののちにロックを解除しているので、複数のサーバから、ほぼ同時に書き込み処理と読み取り処理が行われた場合であっても、データの不整合が発生しなくなる。
【０１１１】
図１１は、第１の実施形態に於けるディスパッチャの動作を示すフローチャートである。
ここでは例として、ディスパッチャ１４−１がロードバランサ１３から入力クエリを受信したときの処理を示している。
処理を開始すると、ステップＳ１０に於いて、ディスパッチャ１４−１のクエリ解析部２４（図３）は、入力クエリを解析してキーを抽出し、これをハッシュ関数の入力値ｘする。
ステップＳ１１に於いて、ディスパッチャ１４−１の処理部２１（図３）は、入力クエリの種類を判定する。入力クエリの種類が「PUT」であったならば、ステップＳ１２の処理を行う。入力クエリの種類が「GET」であったならば、ステップＳ２０の処理を行う。
【０１１２】
ステップＳ１２〜Ｓ１７は、書き込みの際の処理である。
ステップＳ１２に於いて、ディスパッチャ１４−１のサーバ決定処理部２５（図３）は、入力クエリのキーの値をハッシュ関数の入力値ｘとして、全てのハッシュ関数である第１ハッシュ値計算部２７−１〜第３ハッシュ値計算部２７−３（図３）により、全てのハッシュ値ｈを計算する。すなわち、書き込み入力クエリのキーに基づく第２のハッシュ値配列を計算する。
【０１１３】
ステップＳ１３に於いて、ディスパッチャ１４−１のコンシステントハッシュ計算部２８（図３）は、全てのハッシュ値ｈを、コンシステントハッシュの環に適用する。すなわち、第２のハッシュ値配列を、コンシステントハッシュの環のいずれかの位置に配置する。
ステップＳ１４に於いて、ディスパッチャ１４−１のコンシステントハッシュ計算部２８（図３）は、コンシステントハッシュの環を基に、対象サーバと順番を決定する。すなわち、第２のハッシュ値配列の各要素に対応する第２のサーバ群と、それら第２のサーバ群の通信順番を決定する。
【０１１４】
ステップＳ１５に於いて、ディスパッチャ１４−１の通信部２３（図３）は、同期で、各対象サーバを順番にロックする。すなわち、第２のサーバ群を順番に同期でロックする。
ステップＳ１６に於いて、ディスパッチャ１４−１の通信部２３（図３）は、非同期で、各対象サーバに入力クエリを送信して、データを更新する。すなわち、非同期で第２のサーバ群に書き込み入力クエリを送信している。
ステップＳ１７に於いて、ディスパッチャ１４−１の通信部２３（図３）は、非同期で、各対象サーバのロックを解除する。すなわち、非同期で第２のサーバ群のロックを解除している。ステップＳ１７の処理が終了すると、図１１の処理を終了する。
【０１１５】
以下のステップＳ２０〜Ｓ２７は、読み取りの際の処理である。
ステップＳ２０に於いて、ディスパッチャ１４−１のサーバ決定処理部２５（図３）は、乱数計算部２６（図３）により、対象サーバ数Ｍの範囲で生成される乱数ｒを算出する。すなわち、ハッシュ値計算部の数をＭとしたとき、０以上かつＭ未満となる乱数ｒを算出する。第１の実施形態では、０〜２の乱数ｒを算出する。
ステップＳ２１に於いて、ディスパッチャ１４−１のサーバ決定処理部２５（図３）は、乱数ｒに基いて、ハッシュ関数のいずれかを選択する。すなわち、第１ハッシュ値計算部２７−１〜第３ハッシュ値計算部２７−３（図３）のいずれかを選択する。
ステップＳ２２に於いて、ディスパッチャ１４−１のサーバ決定処理部２５（図３）は、入力ファイルのキーの値をハッシュ関数の入力値ｘとして、選択したハッシュ関数でハッシュ値ｈを計算する。このハッシュ値ｈは、読み取り入力クエリのキーから計算した第１のハッシュ値である。
【０１１６】
ステップＳ２３に於いて、ディスパッチャ１４−１のコンシステントハッシュ計算部２８（図３）は、ハッシュ値ｈを、コンシステントハッシュの環に適用する。
ステップＳ２４に於いて、ディスパッチャ１４−１のサーバ決定処理部２５（図３）は、コンシステントハッシュの環を基に、対象サーバを決定する。この対象サーバは、第１のハッシュ値に対応する第１のサーバである。
【０１１７】
ステップＳ２５に於いて、ディスパッチャ１４−１の通信部２３（図３）は、同期で、１台の対象サーバをロックする。すなわち、この第１のサーバを同期でロックする。
ステップＳ２６に於いて、ディスパッチャ１４−１の通信部２３（図３）は、非同期で、１台の対象サーバのデータを読み取る。すなわち、この第１のサーバに非同期で読み取り入力クエリを送信する。
ステップＳ２７に於いて、ディスパッチャ１４−１の通信部２３（図３）は、非同期で、１台の対象サーバのロックを解除する。すなわち、非同期で、この第１のサーバのロックを解除する。ステップＳ２７の処理が終了すると、図１１の処理を終了する。
【０１１８】
（第１の実施形態の効果）
以上説明した第１の実施形態では、次の（Ａ）〜（Ｈ）のような効果がある。
【０１１９】
（Ａ）  データの読み取りの際には、冗長化のための複製データを格納しているいずれかのサーバを決定し、アクセスを分散させている。これにより、特定のデータにアクセスが集中する場合でも、このアクセスを分散させることができ、システム全体として高いスループットを維持することができる。
【０１２０】
（Ｂ）  データの読み取りの際には、複数の異なるハッシュ値計算部のうちいずれかを乱数ｒで決定し、決定したハッシュ値計算部のハッシュ値ｈによって、冗長化のための複製データを格納しているいずれかのサーバを決定している。これにより、乱数ｒでアクセスを分散させることができ、自動アクセスソフトウェア（ロボット）などによる繰り返しのアクセスが同一のサーバに集中することを抑止することができる。
【０１２１】
（Ｃ）  データの読み取りの際には、対象サーバを同期でロックし、非同期で入力クエリをサーバに送信したのち、非同期でサーバ群のロックを解除する。これにより、各サーバからの応答を待たずにサーバ群に入力クエリを送信できるので、高速に処理することができる。
【０１２２】
（Ｄ）  データの書き込みの際には、データを複製して複数のサーバに格納している。これにより、耐障害性を高めることができる。
【０１２３】
（Ｅ）  データの書き込みの際には、このデータのキーを複数のハッシュ関数によって複数のハッシュ値ｈを計算し、これらハッシュ値ｈに基いて第２のサーバ群と当該第２のサーバ群の順番を決定し、決定した第２のサーバ群をロックする。これにより、データの読み取りと競合した場合のデータの不整合を抑止することができる。
【０１２４】
（Ｆ）  複数のハッシュ関数の順番は、全てのディスパッチャ１４−ｎに於いて同一である。どのディスパッチャ１４−ｎであっても、同一のキーを有するデータの書き込みの際に、同一の順番で同一の第２のサーバ群をロックする。これにより、複数のディスパッチャ１４−ｎが、互いに異なるサーバをロックし、相手がロックしているサーバのロック解除を両方で待っている状態、いわゆるデッドロック状態が発生することを抑止することができる。
【０１２５】
（Ｇ）  データの書き込みの際には、対象サーバ群を同期でロックしたのち、非同期で入力クエリを対象サーバ群に送信したのち、非同期で対象サーバ群のロックを解除する。これにより、各対象サーバからの応答を待たずに対象サーバ群に入力クエリを送信できるので、高速に処理することができる。
【０１２６】
（Ｈ）  データの読み取りと書込みの際には、ハッシュ関数によってハッシュ値ｈを計算し、このハッシュ値ｈをコンシステントハッシュの環に配置して、対象サーバを決定する。これにより、サーバの増設と減設の際に、どのサーバにどのデータを移動すればよいかを、コンシステントハッシュの環に基いて容易に決定することができる。例えば、図４（ｂ）に示す例に於いて、サーバＩＤが１のサーバを減設する際には、この減設するサーバに格納されているデータを、サーバＩＤが０のサーバに移動すればよい。サーバＩＤが７のサーバを増設する場合、ｎ＝６からｎ＝０の間に新たにｎ＝７のノードを設け、サーバＩＤが６のサーバから、このｎ＝７のノードに対応するデータを増設するサーバに移動すればよい。
【０１２７】
（第２の実施形態の構成）
第２の実施形態のデータベースクラスタシステム１０の特徴は、複数のハッシュ関数で計算した複数のハッシュ値ｈをソートすることにより、デッドロックを発生しにくくすることである。
【０１２８】
第１の実施形態のデータベースクラスタシステム１０は、ハッシュ関数自身の順番に依存してサーバのアクセス順番を決定している。しかし、キーを経ない更新、例えば、既にハッシュ値ｈだけが分かっている複数のデータの更新などでは、順番を決めることができず、デッドロックを抑制することができない。これは、ハッシュ関数が基本的に逆関数を持たないことによる。そこで、第２の実施形態では、ハッシュ関数の順番に依存しないサーバのアクセス順番の決定方法を提供する。
第２の実施形態のデータベースクラスタシステム１０は、第１の実施形態のデータベースクラスタシステム１０（図２）と同様の構成を有している。
【０１２９】
（第２の実施形態の動作）
図１２は、第２の実施形態に於けるディスパッチャの動作を示すフローチャートである。図１１に示す第１の実施形態のフローチャートと同一の要素には同一の符号を付与している。
ここでは例として、ディスパッチャ１４−１がロードバランサ１３から入力クエリを受信したときの処理を示している。
処理を開始したのち、ステップＳ１０〜Ｓ１２の処理は、図１１に示す第１の実施形態のステップＳ１０〜Ｓ１２の処理と同様である。
【０１３０】
ステップＳ１２Ａに於いて、ディスパッチャ１４−１のサーバ決定処理部２５（図３）は、計算した全てのハッシュ値ｈをソートする。第２の実施形態では、全てのディスパッチャ１４−ｎは、昇順にソートしている。しかし、これに限られず、全てのディスパッチャ１４−ｎは、一意の順番となるようにソートすればよく、例えば、全て降順でソートしてもよい。
ステップＳ１３Ａに於いて、ディスパッチャ１４−１のコンシステントハッシュ計算部２８（図３）は、全てのソートしたハッシュ値ｈを、コンシステントハッシュの環に適用する。
以降、ステップＳ１４〜Ｓ１７の処理は、図１１に示す第１の実施形態のステップＳ１４〜Ｓ１７の処理と同様である。これにより、ステップＳ１４に於いて、対象サーバと当該対象サーバの順番とを決定可能である。この対象サーバは、第３のサーバ群である。
また、ステップＳ２０〜Ｓ２７の処理は、図１１に示す第１の実施形態のステップＳ２０〜Ｓ２７の処理と同様である。
【０１３１】
（第２の実施形態の効果）
以上説明した第２の実施形態では、次の（Ｉ）のような効果がある。
【０１３２】
（Ｉ）  全てのハッシュ値ｈをソートし、これらソートした順番のハッシュ値ｈに対応する第３のサーバ群にアクセスする。これにより、データの複製に限られず、如何なるデータ集合の更新においても、第３のサーバ群へのアクセス順番を一意に決定し、デッドロックを回避することができる。
【０１３３】
（変形例）
本発明は、上記実施形態に限定されることなく、本発明の趣旨を逸脱しない範囲で、変更実施が可能である。この利用形態や変形例としては、例えば、次の（ａ）〜（ｆ）のようなものがある。
【０１３４】
（ａ）  第１の実施形態および第２の実施形態のディスパッチャ１４−ｎでは、各対象サーバであるサーバ１５−ｎに非同期でクエリを送信している。しかし、これに限られず、同期でクエリを送信してもよい。
【０１３５】
（ｂ）  第１の実施形態および第２の実施形態のディスパッチャ１４−ｎでは、各対象サーバであるサーバ１５−ｎを非同期でロック解除している。しかし、これに限られず、同期でロック解除してもよい。
【０１３６】
（ｃ）  第１の実施形態および第２の実施形態のデータベースクラスタシステム１０は、ロードバランサ１３と、複数のディスパッチャ１４−ｎとを備えている。しかし、これに限られず、ロードバランサ１３を有さず、かつ単一のディスパッチャ１４−１のみを備えていてもよい。
【０１３７】
（ｄ）  第１の実施形態および第２の実施形態のデータベースクラスタシステム１０は、サーバ１５−ｎは、ディスパッチャ１４−ｎと、プロセッサ１６−ｎと、ストレージ１７−ｎとを有している。しかし、これに限られず、ディスパッチャ１４−ｎは、プロセッサ１６−ｎとは別のサーバに格納されていてもよい。
【０１３８】
（ｅ）  第１の実施形態および第２の実施形態のディスパッチャ１４−ｎは、コンシステントハッシュ計算部２８を有している。しかし、これに限られず、ディスパッチャ１４−ｎは、ハッシュ値ｈから対象サーバを決定できる関数を備えていればよい。
【０１３９】
（ｆ）  第１の実施形態および第２の実施形態のディスパッチャ１４−ｎは、乱数計算部２６を有し、この乱数計算部２６が生成する乱数ｒによって、複数の異なるハッシュ値計算部のいずれかを決定している。しかし、これに限られず、ディスパッチャ１４−ｎは、複数の異なるハッシュ値計算部のいずれかを決定可能であればよい。例えば、複数の異なるハッシュ値計算部のいずれかを、ラウンドロビンで決定してもよい。
【符号の説明】
【０１４０】
１０  データベースクラスタシステム
１３  ロードバランサ
１４−０〜１４−６  ディスパッチャ  （負荷分散装置）
１５−０〜１５−６  サーバ
１６−０〜１６−６  プロセッサ
１７−０〜１７−６  ストレージ
２１  処理部
２２  記憶部
２３  通信部
２４  クエリ解析部
２５  サーバ決定処理部
２６  乱数計算部
２７−１〜２７−３  第１〜第３ハッシュ値計算部  （複数の異なるハッシュ値計算部）
２８  コンシステントハッシュ計算部
８０  入出力端末
９０  外部システム
１００  ネットワーク
２００  入出力ファイル
【図１】
0005603843.tif 000002
【図２】
0005603843.tif 000003
【図３】
0005603843.tif 000004
【図４】
0005603843.tif 000005
【図５】
0005603843.tif 000006
【図６】
0005603843.tif 000007
【図７】
0005603843.tif 000008
【図８】
0005603843.tif 000009
【図９】
0005603843.tif 000010
【図１０】
0005603843.tif 000011
【図１１】
0005603843.tif 000012
【図１２】
0005603843.tif 000013