【文献】
島田慶樹,Twitter、Facebookが採用するNoSQLシステム Cassandra実践入門,WEB+DB PRESS,日本,(株)技術評論社,2010年 9月25日,第58巻,47−58ページ
(58)【調査した分野】(Int.Cl.,DB名)
前記制御手段は、一のキーとペアにされたデータの処理要求を受け付けた場合、前記記憶手段が当該一のキーとペアにされたデータを格納している場合は当該データを処理し、前記記憶手段が当該一のキーとペアにされたデータを格納していない場合は当該一のキーとペアにされたデータを格納するデータベースノードにデータの処理を要求する請求項1に記載の分散型データ処理プログラム。
前記制御手段は、連続したキーの範囲でのデータの要求を受け付けた場合、前記パーティションリスト情報を参照し、当該連続したキーの範囲に含まれる範囲に該当するデータベースノードにデータを要求する請求項1に記載の分散型データ処理プログラム。
前記制御手段は、前記パーティションリスト情報並びに前記データベースノード及び前記他のデータベースノードの状態に応じて、前記一の範囲を変更するとともに、前記記憶手段が記憶するデータを冗長化して記憶させるデータベースノードを他のデータベースノードから選択し、前記選択した他のデータベースノードにデータを冗長化して記憶させた後、前記パーティションリスト情報を更新する請求項1に記載の分散型データ処理プログラム。
【発明の概要】
【発明が解決しようとする課題】
【0006】
しかし、特許文献1に開示された分散型データ処理プログラムは、ハッシュ値の最初の2文字がある範囲に属するデータを1つのノードにストアすることで1つのノードに大容量のデータをストアできるようにするものの、キーにハッシュ値を用いているためにキーの並びには規則性がなく、意味を持ったあるキーの範囲のデータがいずれのノードに存在するかは不明であり、例えば、データの範囲検索等に時間を要する、という問題がある。
【0007】
従って、本発明の目的は、本構成を有しない場合に比べて、データの検索効率を向上する分散型データ処理プログラム、情報処理装置、分散型データベースシステム及び分散システムを提供することにある。
【課題を解決するための手段】
【0008】
本発明の一態様は、上記目的を達成するため、以下の分散型データ処理プログラム、情報処理装置、分散型データベースシステム及び分散システムを提供する。
【0009】
[1]分散型データベースシステムを構成するデータベースノードを、
検索に用いられるキーとデータとをペアで記憶し、当該キーはバイナリ文字列であって、当該バイナリ文字列に定義された文字列の順序で一の範囲に含まれる連続するキーのデータを記憶するものであって、当該一の範囲に含まれる連続するキーのデータは他のデータベースノードに冗長化されて記憶されるとともに、データ構造を平衡二分木とし、連続するキーの前記一の範囲と当該一の範囲のデータを格納するデータベースノードとを対応付けたパーティションリスト情報を記憶する記憶手段と、
一のキーとペアにされたデータの要求を受け付けた場合、前記パーティションリスト情報を参照して、当該一のキーに該当するデータベースノードにデータを要求する制御手段として機能させるためのものであって、
前記記憶手段は、揮発性メモリ上に情報を記憶する分散型データ処理プログラム。
[2]前記制御手段は、一のキーとペアにされたデータの処理要求を受け付けた場合、前記記憶手段が当該一のキーとペアにされたデータを格納している場合は当該データを処理し、前記記憶手段が当該一のキーとペアにされたデータを格納していない場合は当該一のキーとペアにされたデータを格納するデータベースノードにデータの処理を要求する前記[1]に記載の分散型データ処理プログラム。
[3]前記制御手段は、連続したキーの範囲でのデータの要求を受け付けた場合、前記パーティションリスト情報を参照し、当該連続したキーの範囲に含まれる範囲に該当するデータベースノードにデータを要求する前記[1]に記載の分散型データ処理プログラム。
[4]前記制御手段は、前記パーティションリスト情報並びに前記データベースノード及び前記他のデータベースノードの状態に応じて、前記一の範囲を変更するとともに、前記記憶手段が記憶するデータを冗長化して記憶させるデータベースノードを他のデータベースノードから選択し、前記選択した他のデータベースノードにデータを冗長化して記憶させた後、前記パーティションリスト情報を更新する前記[1]に記載の分散型データ処理プログラム。
[5]分散型データベースシステムを構成するデータベースノードとして機能するものであって、
検索に用いられるキーとデータとをペアで記憶し、当該キーはバイナリ文字列であって、当該バイナリ文字列に定義された文字列の順序で一の範囲に含まれる連続するキーのデータを記憶するものであって、当該一の範囲に含まれる連続するキーのデータは他のデータベースノードに冗長化されて記憶されるとともに、データ構造を平衡二分木とし、連続するキーの前記一の範囲と当該一の範囲のデータを格納するデータベースノードとを対応付けたパーティションリスト情報を記憶する記憶手段と、
一のキーとペアにされたデータの要求を受け付けた場合、前記パーティションリスト情報を参照して、当該一のキーに該当するデータベースノードにデータを要求する制御手段とを有し、
前記記憶手段は、揮発性メモリ上に情報を記憶する情報処理装置。
[6]複数のデータベースノードを有するものであって、
前記データベースノードは、検索に用いられるキーとデータとをペアで揮発性メモリ上に記憶し、当該キーはバイナリ文字列であって、当該バイナリ文字列に定義された文字列の順序で一の範囲に含まれる連続するキーのデータを記憶するものであって、当該一の範囲に含まれる連続するキーのデータは他のデータベースノードに冗長化されて記憶されるとともに、データ構造を平衡二分木とし、連続するキーの前記一の範囲と当該一の範囲のデータを格納するデータベースノードとを対応付けたパーティションリスト情報を記憶して、一のキーとペアにされたデータの要求を受け付けた場合、前記パーティションリスト情報を参照して、当該一のキーに該当するデータベースノードにデータを要求する分散型データベースシステム。
[7]複数のノードを有するものであって、
前記ノードは、検索に用いられるキーとデータとをペアで揮発性の記憶装置に記憶させ、当該キーはバイナリ文字列であって、当該バイナリ文字列に定義された文字列の順序で一の範囲に含まれる連続するキーのデータを記憶させるものであって、当該一の範囲に含まれる連続するキーのデータは他のノードが管理する記憶装置に冗長化されて記憶されるとともに、データ構造を平衡二分木とし、連続するキーの前記一の範囲と当該一の範囲のデータを格納するデータベースノードとを対応付けたパーティションリスト情報を前記記憶装置に記憶させ、一のキーとペアにされたデータの要求を受け付けた場合、前記パーティションリスト情報を参照して、当該一のキーに該当するデータベースノードにデータを要求する分散システム
。
【発明の効果】
【0010】
請求項1、5、6
及び7に係る発明によれば、本構成を有しない場合に比べて、データの検索効率を向上することができる。
請求項2に係る発明によれば、記憶手段が当該一のキーとペアにされたデータを格納している場合は当該データを処理し、他のデータベースノードがデータを格納している場合はデータの処理を要求することで、データの処理効率を向上することができる。
請求項3に係る発明によれば、範囲検索において、データの検索効率を向上することができる。
請求項4に係る発明によれば、各ノードの負荷を分散して、データの検索効率を向上することができる。
【発明を実施するための形態】
【0012】
[実施の形態]
(分散型データベースシステムの構成)
図1は、実施の形態に係る分散型データベースシステムの構成の一例を示す概略図である。
【0013】
この分散型データベースシステム1は、データベースノード2A、2B、2C…と、クライアントノード3とをネットワーク4によって互いに通信可能に接続することで構成される。データベースノード2A、2B、2C…は、互いに通信し合い、メッシュ状のクラスターを構成することでクライアントノード3から見かけ上、一つのデータベースとして動作する。なお、以降においてデータベースノード2A、2B、2C…に共通する機能の説明をする場合にデータベースノード2A、2B、2C…を単に「データベースノード2」と表記する場合がある。
【0014】
データベースノード2は、一例として、サーバ型の情報処理装置であり、クライアントノード3の要求に応じて動作するものであって、本体内に情報を処理するための機能を有するCPU(Central Processing Unit)や揮発性のメモリ等の電子部品を備える。なお、データベースノード2は、それぞれを異なる情報処理装置として図示しているが1台の情報処理装置上に複数存在するものであってもよいし、複数台の情報処理装置が協働して1つのノードとして動作するものであってもよい。つまり、情報処理装置上で分散型データ処理プログラム(210、
図2)を動作させることでノードとして機能する。なお、情報処理装置として、例えば、一般的なLinux(登録商標)マシンやWindows(登録商標)マシンを用いることができる。
【0015】
データベースノード2は、キーとデータをペアにして管理するキーバリューストア方式を採用し、動作の高速化のために揮発性のメモリ上にキー及びデータ並びにこれらを管理するためのプログラムやライブラリ等を記憶する。キーは、データを検索する際のインデックスとして用いられる情報であり、バイナリ文字列によって表現される。
【0016】
また、これら複数のデータベースノード2A、2B、2C…によってデータが管理され(以下、「クラスタリング」という。)、データはバイナリ文字列に定義された文字列の順序で一定のキー範囲に分けられ(以下、「パーティショニング」という。)、かつ一定のキー範囲のデータは複数のノードに冗長化されて管理される(以下、「レプリケーション」という。)。例えば、
図1に示すように、データがキー範囲「a〜e」、「f〜h」、「i〜n」…といったようにパーティショニングされ、キー範囲「a〜e」のデータについてはデータベースノード2A、2B…に冗長化される、といったように管理される。
【0017】
クライアントノード3は、PC(Personal Computer)等の情報処理装置であって、本体内に情報を処理するための機能を有するCPUや不揮発性メモリ、揮発性メモリ等の電子部品を備える。
【0018】
データベースノード2は、主にクライアントノード3からデータを受信して格納し、要求に応じてデータを検索して読み出してクライアントノード3に送信する等の動作によりデータを管理する装置であり、クライアントノード3は、主にデータベースノード2にデータを送信して格納させ、データの読み出しを要求して結果を受信するための装置であるが、両装置において互いの機能を同様に実行できる構成としてもよい。なお、実行できる機能を制限した装置を用意してもよい。
【0019】
また、データベースノード2に格納されるデータは、一般的にデータベースに格納される情報であって、一例として、ショッピングサイト等の会員情報、商品在庫、売上伝票、購入履歴、お気に入り、ログインセッション、ショッピングカート、ランキング及びレコメンデーションや、ブログの記事、SNSにおける友達リスト、スケジュール等の情報であり、その他、コンピュータを用いて作成可能な情報であればその種類は問わない。
【0020】
ネットワーク4は、通信ネットワークであり、例えば、インターネットやLAN(Local Area Network)等の有線又は無線の通信網である。
【0021】
なお、クライアントノード3は、
図1中では1台を示しているが、複数台が接続される構成であってもよい。
【0022】
(情報処理装置の構成)
図2は、実施の形態に係るデータベースノード2の構成例を示すブロック図である。なお、クライアントノード3は、データベースノード2と同様の構成を有するため説明を省略する。なお、クライアントノード3は、実データ情報(213)及びその他の情報を構成上省略することができる。また、データベースノード2及びクライアントノード3は、さらに不揮発性の記憶部を有しても良い。
【0023】
また、
図3は、ノードリスト情報の構成を示す概略図である。
図4は、パーティションリスト情報の構成を示す概略図である。
図5は、実データ情報の構成を示す概略図である。
図6は、ノードコスト情報の構成を示す概略図である。
【0024】
データベースノード2は、CPU等から構成され、各部を制御するとともに、各種のプログラムを実行する制御部20と、揮発性の記憶媒体から構成され情報を記憶する記憶手段としてのメモリ21と、ネットワークを介して外部と通信する通信部22とを備える。
【0025】
制御部20は、メモリ21上の分散型データ処理プログラム210を実行することで、通信手段200及びデータ処理手段201等として機能する。
【0026】
通信手段200は、他のデータベースノード2及びクライアントノード3と通信する。なお、他のデータベースノード2及びクライアントノード3との間の通信に、一例として、TCPプロトコルを使用する。TCPを使用することでノード間の双方向通信が可能となり、再送制御があるためパケットロスが起こった場合にも確実にデータを送信することができる。
【0027】
データ処理手段201は、メモリ21上に実データ情報213を書き込んだり、実データ情報213を読み出したりする。また、データ処理手段201は、一例として、各パーティションの中でのデータを一般的なマップ型のデータ構造である赤黒木(Red‐Black Tree)を使用して管理する。一般的なデータベースではB‐treeが使用されることが多いが、メモリ21中にデータを保存するインメモリデータベースの場合は木のノードへのアクセス速度が速いため、平衡二分木である赤黒木の方が速い場合が多い。そのため、データ処理手段201は、データ構造に赤黒木を採用する。
【0028】
メモリ21は、制御部20を上述した各手段200、201として動作させる分散型データ処理プログラム210、ノードリスト情報211、パーティションリスト情報212、実データ情報213及びノードコスト情報214等を記憶する。メモリ21は、さらに他のデータベースノードに接続するためのAPIや、データベースノードの機能を持つサーバを構築するためのAPIを含んだライブラリ(図示せず)を記憶する。
【0029】
ノードリスト情報211は、
図3に示すように、クラスターに参加するすべてのデータベースノード2及びクライアントノード3のノードIDをリストとして有する。通信手段200は、ノードリスト情報211を参照して他のデータベースノード2及びクライアントノード3と通信する。
【0030】
パーティションリスト情報212は、
図4に示すように、キーの範囲と、当該キーの範囲のデータを格納するデータベースノード2のノードIDとを有する。通信手段200及びデータ処理手段201は、あるキーのデータが要求された場合に、パーティションリスト情報212を参照して該当するキーのデータベースノード2にデータを要求する。なお、キーに用いられるバイナリ文字列としてアルファベットを例として挙げているがこれに限られるものではなく任意のバイナリ文字列を用いることができ、用いたバイナリ文字列に定義された文字列の順序でキーの範囲が定義される。
【0031】
実データ情報213は、
図5に示すように、キーと、データの値とをペアにして管理する。また、実データ情報213は、キーとデータの値に加えてバージョン情報を有する。データベースノード2は、同一のキーのデータが同時に設定された場合に、バージョン情報の新しい方のデータを有効とすることで整合性を保つ。バージョン情報は、
図5では単純なバージョン番号のみ記載しているが、例えば、ベクタークロックというアルゴリズムを用いることができる。ベクタークロックは、分散データ処理システムでバージョン管理に使われるアルゴリズムであり、どのノードで何番目に更新されたのかを記録した配列を有する。これにより、別々のデータベースノード2にあるデータのうちいずれが最新のバージョンかを比較することができる。
【0032】
ノードコスト情報214は、
図6に示すように、データベースノード2のIDと、当該データベースノード2の制御部20にかかっている負荷を示すコストとを有する。ノードコスト情報214は、一定時間毎に更新され、データベースノード2の全体で共有される。なお、コストは、一例として、各データベースノード2の実データ情報213の容量の割合を示しているがデータ量で示してもよいし、処理負荷によって示されるものであってもよい。
【0033】
(分散型データベースシステムの動作)
次に、本実施の形態の作用を、(1)初期化動作、(2)ノード参加動作、(3)パーティション割当動作、(4)パーティション分割動作、(5)再接続時復旧処理動作、(6)切断時処理動作、(7)定期処理動作、(8)データ処理動作、(9)データ設定動作、(10)データ取得動作、(11)データ削除動作、(12)データ範囲取得動作、(13)その他の動作に分けて説明する。
【0034】
(1)初期化動作
なお、動作の前提としてデータベースノード2及びクラインとノード3の起動モードについて説明する。データベースノード2及びクライアントノード3には起動モードが3種類あり、行う処理に違いがある。
【0035】
1つ目のブートストラップモードはデータベースノード2がクラスターへの参加処理を行わずに起動を行うモードで、新しいクラスターの最初のノードを起ち上げるために用いられる。2つ目のデータノードモードはデータベースノード2が既存のクラスターにノードが参加するモードである。3つ目のクライアントモードは、自らのノードはデータを持たずデータベースノード2へデータアクセスを要求するモードであり、クライアントノード3として動作するためのモードである。
【0036】
最初のデータベースノード2を起動する場合、ブートストラップモードで起動する。起動されたデータベースノード2は、待ち受けアドレスとポートにバインドし、他のデータベースノード2の接続待ち状態になりアクティブ状態に移行する。
【0037】
既に起動しているデータベースノード2がある場合には、起動中のデータベースノード2のどれかを初期ノードに指定した上でデータノードモードとして起動する。これにより、起動されたデータベースノード2は、待ち受けアドレスとポートにバインドして他のデータベースノード2の接続待ち状態になった後、指定した初期ノードに接続しノード参加処理を行う。参加処理が完了するまでは起動されたデータベースノード2の状態は初期化中の状態にセットされ、この間はデータアクセス要求を受け付けない。
【0038】
(2)ノード参加動作
図7は、分散型データベースシステム1のノード参加動作を説明するための概略図である。
【0039】
新規ノード2Nは初期ノード、例えばノードAであるデータベースノード2Aに対してノード参加要求を送信する(S2‐1)。
【0040】
次に、要求を受け取った初期ノードであるデータベースノード2Aは、新規ノードであるデータベースノード2Nを自分のノードリスト情報211に追加する(S2‐2)。データベースノード2Aは、ノード参加結果としてクラスターの設定や他のノードのリストであるノードリスト情報211、パーティションのリストであるパーティションリスト情報212を新規ノード2Nに返答する(S2‐3)。
【0041】
次に、新規ノード2Nは、データベースノード2Aからの返答を受け取ると、自分のノードリスト情報211とパーティションリスト情報212をデータベースノード2Aから受け取ったリストを用いて更新する(S2‐4)。更新が完了すると新規ノード2Nはアクティブ状態に移行し、データ処理を受け付ける状態になる(S2‐5)。
【0042】
次に、初期ノードであるデータベースノード2Aは、新規ノード2Nに応答を返した後、クラスターに属している他のデータベースノード2B、2Cに対して新しいノードが追加された通知を送信する(S2‐6、S2‐7)。
【0043】
通知を受け取った他ノードであるデータベースノード2B、2Cは新規ノード2Nをノードリスト情報211に追加し、新規ノード2Nへの接続を行う(S2‐8、2‐9)。上記動作によって、クラスター内のすべてのノードは互いに接続された状態となる。
【0044】
(3)パーティション割当動作
図8は、分散型データベースシステム1のパーティション割当動作を説明するための概略図である。
【0045】
以下に説明するパーティション割当動作は、新規ノードが参加した場合や参加していたデータベースノード2の切断を検知した場合に、冗長化が規定数に満たないパーティションに属するデータを負荷の低いデータベースノード2に割り当てる処理である。
【0046】
まず、データベースノード2のいずれか、例えばデータベースノード2Aは、パーティションリスト情報212を参照し、冗長化が規定数に満たないパーティションを探す(S3‐1)。次に、冗長化が規定数に満たないパーティションが割り当てられているデータベースノード2すべてに対しパーティション割当準備メッセージを送信する(S3‐2、S3‐3)。
【0047】
パーティション割当準備メッセージを受け取ったデータベースノード2B、2Cはそのパーティションが自ノードに存在するか確認する。パーティションが存在した場合はパーティションをロックし、パーティションの割当の処理中に別のパーティション割当を同時に行わないように排他制御する(S3‐4、S3‐5)。処理が完了するとデータベースノード2Aにパーティション割当結果メッセージを返す(S3‐6、S3‐7)。
【0048】
データベースノード2Aは、対象のパーティションが割り当てられているノード全てからパーティション割当結果メッセージを受け取ると、パーティション割当結果メッセージを判定する(S3‐8)。結果がすべて成功だった場合にはそのパーティションを持つノードのいずれかに対し、例えばデータベースノード2Bに対し、新規割当の対象ノード2Iへのパーティションのデータ複製と(S3‐11)、パーティションのロック解除を行わせる(S3‐12)ことで、パーティション割当を行なわせる(S3‐9)。それ以外のノードであるデータベースノード2Cにはパーティションのロック解除のみを行わせる(S3‐10、S3‐13)。もし結果に失敗を返したノードがあった場合は処理を取りやめる要求を送信し、ロック解除を行わせる。
【0049】
新規割当の対象ノード2Iは、パーティション複製が完了すると、パーティションの追加をすべてのデータベースノード2A、2B、2Cに対して通知する(S3‐14、S3‐15、S3‐16)。
【0050】
(4)パーティション分割動作
図9は、分散型データベースシステム1のパーティション分割動作を説明するための概略図である。
【0051】
データベースノード2は、データ設定の際にパーティションに含まれるデータのサイズが一定のサイズを超えた場合、当該パーティションを例えば2つのパーティションに分割する。一方のパーティションを他のデータベースノード2に割り当てることで各データベースノード2の負荷を均等にするための処理である。
【0052】
データベースノード2のいずれか、例えば、データベースノード2Gは、データ設定の際にパーティションのサイズが一定のサイズを超えた場合、パーティション分割処理を開始する。まず、データベースノード2Gのデータ処理手段201は、パーティションリスト情報212及びノードコスト情報214を参照し、一定のサイズを超えたパーティションが割り当てられていないデータベースノード2の中から自己のノードよりもコストが小さいノードが存在するか確認する(S4‐1)。コストの小さいノード、例えば、データベースノード2D〜2Fが存在する場合、パーティションが割り当てられているノード、例えば、データベースノード2A〜2Cすべてに対しパーティション分割準備要求を送信する(S4‐2、S4‐3、S4‐4)。
【0053】
パーティション分割準備要求を受け取ったデータベースノード2A〜2Cは、そのパーティションが自ノードに存在するか確認する。パーティションが存在した場合はパーティションをロックした後、パーティションの分割位置の候補を返す(S4‐8、S4‐9、S4‐10)。分割位置には、対象のパーティションに格納されているデータのキーの中央値を選択する(S4‐5、S4‐6、S4‐7)。中央値にすることで、分割された2つのパーティションにほぼ同数のデータが格納されることになり、キーの分布に偏りがあった場合に一方のパーティションにデータが偏ってしまうのを防ぐことができる。
【0054】
データベースノード2Gは、対象のパーティションが割り当てられているノード全てからパーティション分割準備結果を受け取ると、結果がすべて成功だった場合には分割位置の候補の中から分割位置を決定してパーティション分割を行う。もし結果に失敗を返したノードがあった場合は処理を取りやめる要求を送信し、ロック解除を行わせる。
【0055】
次に、データベースノード2Gは、分割したパーティションの割当先のノードを探すため、パーティションリスト情報212及びノードコスト情報214を参照し、対象のパーティションが割り当てられていないノードの中からノードコストの小さいノードを探す。ノードコストの小さい順にパーティションの冗長数と同じ数のノードを探し、パーティションが割り当てられているノード、データベースノード2A〜2Cのそれぞれに、分割したパーティションをどのノードに割り当てるかを決定する(S4‐11)。ここでは、データベースノード2A〜2Cのそれぞれにデータベースノード2D〜2Fを割り当てる。次に、データベースノード2Gは、パーティションが割り当てられている各ノードにパーティション分割要求を送信する(S4‐12、S4‐13、S4‐14)。
【0056】
パーティション分割要求を受け取ったデータベースノード2A〜2Cは、まずそのノード上でパーティションを分割する。分割されたパーティションの一方を、割当先のノードへ複製する(S4‐15、S4‐16、S4‐17)。データの複製には一定の時間がかかるため、データの複製処理中にも処理が行えるように、複製が完了するまでは複製元のノード、データベースノード2A〜2Cが処理を担当する。このときデータの更新があった場合には、複製先のノード、データベースノード2D〜2Fにもデータ更新要求を送信することでデータを同期する。
【0057】
分割先ノードへのパーティション複製が完了すると、データベースノード2D〜2Fは、パーティションの追加をすべてのノードに対して通知する(S4‐18、S4‐19、S4‐20)。複製元のノード、データベースノード2A〜2Cは、パーティション追加を受け取ると、そのノード上の複製したパーティションのデータを削除し、パーティションリスト情報212の当該パーティションの格納先を複製先のノードに更新する。
【0058】
(5)再接続時復旧処理動作
図10は、分散型データベースシステム1の再接続時復旧処理動作を説明するための概略図である。
【0059】
クラスターのデータベースノード2、例えば、データベースノード2Aは、ノードの切断を検知すると(S5‐1)、対象ノード2Iに対して再接続を試みる(S5‐2)。再接続が成功した場合(S5‐3)、パーティションリスト情報212を参照し、対象ノード2Iが担当していたパーティションと同じ範囲のパーティションを持っている別のノードを探し、当該ノード、例えば、データベースノード2Bに対してパーティション複製要求を送る(S5‐4)。
【0060】
要求を受け取ったノードであるデータベースノード2Bは、再接続ノードである対象ノード2Iに対しパーティションを複製する(S5‐5)。
【0061】
複製が完了すると、再接続ノードである対象ノード2Iはパーティション追加を全ノードに送信し(S5‐6、S5‐7、S5‐8)、受け取ったノードはパーティションリスト情報212を更新する。
【0062】
(6)切断時処理動作
図11は、分散型データベースシステム1の切断時処理動作を説明するための概略図である。
【0063】
ノードが切断され、再接続されなかった場合にデータの冗長化が保たれるようにするための処理である。
【0064】
データベースノード2Aは、切断された対象ノード2Iに対して再接続が規定回数以上失敗した場合(S6‐1、S6‐2、S6‐3)、対象ノード2Iをノードリスト情報211から削除する(S6‐4)。また、対象ノード2Iに割り当てられていたパーティションの冗長数が減るため、当該パーティションのデータを格納するデータベースノード2を探し(S6‐5)、当該パーティションを他のデータベースノード2Bに割り当てる(S6‐6)。データベースノード2Aは、ノードコスト情報214を参照して割当先のノードを決定する。
【0065】
(7)定期処理動作
定期処理動作は、ノードコストを定期的に送る処理である。各データベースノード2は、一定時間ごとに自ノードのコストの再計算を行う。一例として、ノードコストは自ノードが格納している全てのデータの件数をパーティションの分割サイズで割って算出される。データベースノード2は、再計算後のコストが以前のコストと異なる値であれば自ノードのノードコスト情報214を更新するとともに他ノードに通知する。通知を受けた他ノードは、ノードコスト情報214を更新する。
【0066】
(8)データ処理動作
データベースノード2は、例えば、クライアントノード3からデータアクセス要求された対象となるデータのパーティションが自ノードにあるときはデータ処理手段201によって処理を行い、他ノードにあるときには通信手段200により要求を送信する。
【0067】
要求を受け取ったデータベースノード2は、対象となるパーティションが自ノード上にあった場合はデータ処理手段201により処理を行う。自ノードとは別のノードにパーティションがあると判断されたときは、当該ノードに再度要求を送る。このように動作させることにより、データアクセス要求と同時にパーティション分割の要求が受信された場合などでも、正しいノードへと処理を送信することができる。
【0068】
(9)データ設定動作
図12は、分散型データベースシステム1のデータ設定動作を説明するための概略図である。
【0069】
データ設定動作は、キーと値を指定して実データ情報を設定更新する処理である。
【0070】
まず、クライアントノード3は、設定しようとするデータのキーを含むパーティションを探すため(S9‐1)、パーティションリスト情報212を参照して、キーを含むパーティションのデータを格納しているデータベースノード2A、2B、2C全てに対しデータ設定要求を送る(S9‐2、S9‐3、S9‐4)。データ設定要求は、設定するデータのキーと値が含まれる。
【0071】
要求を受け取ったデータベースノード2A、2B、2Cは、データのキーを含むパーティションが存在するか確認し(S9‐5、S9‐8、S9‐11)、データを実データ情報213に保存して設定する(S9‐6、S9‐9、S9‐12)。すでに同一のキーのデータが存在した場合は実データ情報213を上書きする。データを保存する際にはバージョン情報を付随して保存する。バージョン情報にはベクタークロックが使用される。ベクタークロックの配列の中の自ノードの担当部分をカウントアップすることでバージョンを更新する。
【0072】
データベースノード2A、2B、2Cは、データ設定が終了すると結果をクライアントノード3に返す(S9‐7、S9‐10、S9‐13)。クライアントノード3は、規定数以上のデータベースノード2からデータ設定が成功した旨の結果を受け取った場合にデータ設定に成功したと判断する(S9‐14)。クライアントノード3は、成功した場合にはバージョン情報をマージし、パーティションを持つデータベースノード2A、2B、2Cに対し、マージされたバージョン情報の内容に各実データ情報213を更新するよう要求する(S9‐15、S9‐16、S9‐17)。
【0073】
(10)データ取得動作
図13は、分散型データベースシステム1のデータ取得動作を説明するための概略図である。
【0074】
データ取得動作は、キーを指定してデータを取得する処理である。
【0075】
クライアントノード3は、取得しようとするデータのキーを含むパーティションを探すため(S10‐1)、パーティションリスト情報212を参照し、キーを含むパーティションのデータを格納しているデータベースノード2A、2B、2C全てに対しデータ取得要求を送る(S10‐2、S10‐3、S10‐4)。
【0076】
要求を受け取ったデータベースノード2A、2B、2Cは、データのキーを含むパーティションが存在するか確認し、キーを元にデータを実データ情報213から取り出し(S10‐5、S10‐7、S10‐9)、結果をクライアントノード3に返す(S10‐6、S10‐8、S10‐10)。
【0077】
クライアントノード3は、規定数以上のデータベースノード2から成功した旨の結果を受け取った場合成功と判断し、データのバージョン情報が最新のものを有効なデータとする(S10‐11)。また、クライアントノード3は、バージョン情報が最新でないデータを送信したデータベースノード2に対して、バージョン情報が最新であるデータで実データ情報213を更新するよう誤データ修正要求する(S10‐12)。
【0078】
(11)データ削除動作
図14は、分散型データベースシステム1のデータ削除動作を説明するための概略図である。
【0079】
データ削除動作は、キーを指定してデータを削除する処理である。
【0080】
クライアントノード3は、削除するデータのキーを含むパーティションを探すため(S11‐1)、パーティションリスト情報212を参照し、キーを含むパーティションのデータを格納しているデータベースノード2A、2B、2C全てに対しデータ削除要求を送る(S11‐2、S11‐3、S11‐4)。
【0081】
要求を受け取ったデータベースノード2A、2B、2Cは、データのキーを含むパーティションが存在するか確認し(S11‐5、S11‐8、S11‐11)、キーを元にデータを実データ情報213から削除する(S11‐6、S11‐9、S11‐12)。データベースノード2A、2B、2Cは、データ削除が終了すると結果をクライアントノード3に返す(S11‐7、S11‐10、S11‐13)。
【0082】
クライアントノード3は、規定数以上のデータベースノード2から成功した旨の結果を受け取った場合にデータ削除に成功したと判断する(S11‐14)。
【0083】
(12)データ範囲取得動作
図15は、分散型データベースシステム1のデータ範囲取得動作を説明するための概略図である。
【0084】
データ範囲取得動作は、指定したキー範囲に含まれる全てのパーティションを検索する処理である。
【0085】
クライアントノード3は、キー範囲に含まれる全てのパーティションを探すため(S12‐1)、パーティションリスト情報212を参照し、該当する全てのパーティションにおいて、パーティションを管理しているデータベースノード2A、2B、2Cへデータ範囲検索要求を送信する(S12‐2、S12‐3、S12‐4)。
【0086】
要求を受け取ったデータベースノード2A、2B、2Cは、キー範囲を含むパーティションが存在するか確認し、その範囲に含まれるデータを検索して全て取り出す(S12‐5、S12‐7、S12‐9)。データ範囲取得が終了すると結果をクライアントノード3に返す(S12‐6、S12‐8、S12‐10)。
【0087】
クライアントノード3は、パーティションごとに規定数以上のデータベースノード2から成功した旨の結果を受け取った場合に成功と判断し、各データのバージョン情報が最新のものを有効なデータとする(S12‐11)。また、クライアントノード3は、バージョン情報が最新でないデータを送信したデータベースノード2に対して、バージョン情報が最新であるデータで実データ情報213を更新するよう誤データ修正要求する(S12‐12)。その後、クライアントノード3は、パーティションごとのデータを1つのリストにマージしたものを範囲取得の結果データとする(S12‐13)。
【0088】
(13)その他の動作
(13‐1)データ不整合修正
クライアントノード3は、データ取得の際にバージョン情報が古いデータを送ったデータベースノード2があった場合には、有効なデータを設定するよう要求を送信する(S10‐12、S12‐12)。このとき有効なデータのバージョン情報も合わせて送信する。要求を受け取ったデータベースノード2Cは、受け取ったデータのバージョン情報の方が格納されているデータよりも新しい場合にのみデータ設定を行う。このようにバージョン情報を比較することで、データ取得とデータ不整合の修正処理の間に別のデータ設定が行われていた場合のデータ巻き戻りを防ぐことができる。
(13‐2)要求タイムアウト
データベースノード2は、別のノードに要求を送って返答を待つとき、一定時間応答がなかった場合にはタイムアウトとして処理が失敗したと判断する。これにより、要求の送信先のノードの処理がフリーズしたり強制終了したりした場合に、その処理を待つ他のノードまで処理が停止することを防ぐことができる。
(13‐3)接続タイムアウト
TCP通信では強制切断された場合に長い時間切断されたことを検知できないことがある。そのため、データベースノード2は、一定時間ごとにハートビートを送信し一定時間内に応答がなかった場合に切断されたと判断する。これにより他のノードとの通信が切断されていないかを素早く確実に確認することができ、ノード切断検知時のデータ冗長化処理にスムーズに移行することができる。
(13‐4)ロックタイムアウト
データベースノード2は、パーティションの複製や分割の際にはパーティションをロックして同時に別のパーティション複製・分割などが起こらないように排他制御するが、このロックにもタイムアウト時間を設定する。これによりタイムアウトによってパーティション処理中に相手のノードが強制終了した場合などに永遠にロック状態になりパーティション処理が行えなくなるのを防ぐことができる。
(13‐5)Quorum
データベースノード2は、同一のデータを複数のノードに冗長化して保存する。そのため、同じキーで別の値のデータが同時にセットされた場合、ノード間でデータに食い違いが起こる可能性がある。これに対し、データベースノード2は、どの結果が正しいかを判断するため、各ノードからの返答結果のステータスやデータのバージョン情報を比較し、一致する結果が規定数以上見つかった場合にその結果を正しいものと判断する。
【0089】
この規定数はQuorumと呼ばれ、分散コンピューティングにおける一貫性の保証によく用いられる。Quorumにはデータ取得時に使われるRead‐Quorumとデータ設定時に使われるWrite‐Quorumがある。データベースノード2は、Read‐QuorumとWrite‐Quorumを足した数がパーティションの冗長数より大きく、Write‐Quorumがパーティションの冗長数の半分よりも大きいように設定し、このように設定されている場合は一般的に一貫性が保証される。
【0090】
(実施の形態の効果)
上記した実施の形態によれば、以下の効果を奏する。
【0091】
(1)パフォーマンス
データベースノード2は、メモリ21に適したデータ構造を使用してデータを管理しているため、不揮発性メモリ等のデータ構造を使用してデータ管理をした場合に比べて、データへのアクセス速度を向上させることができる。また、データを一定の量でパーティションに分割して各データベースノード2で分散管理するため、データアクセスの負荷を分散することができる。また、ノードの数を増やすことで、クラスター全体のパフォーマンスが向上するスケールアウト性能が期待できる。
【0092】
また、データベースノード2は、パーティションの分割においてキーに定義された順序の連続性を維持しつつ、キーの分布を考慮しているため、範囲検索のように連続したキー範囲でのデータ検索でも予め検索するノードが特定でき、効率的な検索ができるために、分散型データベースシステム1全体の負荷を抑制することができる。
【0093】
(2)可用性
データベースノード2は、新規ノード参加時や参加していたデータベースノード2の切断検知時に、負荷の低いデータベースノード2にデータを冗長化して割り当てるため、あるデータベースノード2に異常が起こった場合にも他のデータベースノード2がデータにアクセスすることができる。パーティションが割り当てられているデータベースノード全てが停止しない限りはデータを損失することがなく、可用性が高くなる。
【0094】
また、データベースノード2は、ノードリスト情報211やパーティションリスト情報212を互いに同期しており、データの整合性もQuorumによって各データベースノード2で判断されるため、管理ノードのような集中管理を行う専用のノードを必要としない。いわゆるマルチマスター型のクラスター構造になるため、高い可用性が期待できる。
【0095】
(3)一貫性
データベースノード2は、データの整合性をQuorumによって各ノードで判断する。Quorumでは同時に全てのノードのデータが一致していることを保証することはできないものの、一定時間内にデータが一致する結果整合性(eventual consistency)を保証することができる。完全な一貫性は保証されない代わりに、処理のオーバーヘッドが小さく済む。パフォーマンスや可用性の低下を抑えつつ、実用に充分な整合性を保証することができる。
【0096】
(4)総括
従来のインメモリ型データベースでは、データ処理は1つのノードで行われるため、高速であるものの負荷分散が難しいといった問題があった。また、従来の分散型データベースシステムはデータを不揮発性メモリ上で管理するため、各ノードの処理が高速でなかった。また、データのパーティションの分割位置の決定方法が、予め設定した値に基づいて行われるものであり、キーの分布が考慮されていなかった。
【0097】
一方、上記した実施の形態に係る分散型データベースシステム1は、分散型のインメモリデータベースとして動作するため、高いパフォーマンスとスケールアウト性能、高可用性が期待できる。また、キーの分布状況に基づいてパーティションを分割するため、キーに偏りがあっても負荷を分散できる。キーの連続性が保たれることにより効率的な範囲検索が可能といった利点や、設定値を変更せずともノードの追加を行うことで自動的にパーティションが割り振られるという利点がある。
【0098】
[他の実施の形態]
なお、本発明は、上記実施の形態に限定されず、本発明の趣旨を逸脱しない範囲で種々な変形が可能である。例えば、分散型データベースシステムだけでなく、分散ファイルシステム、分散リソース管理システム、ファイル共有システムとして用いてもよいし、記憶装置を省略してパーティショニング及びクラスタリングを行う分散タスクスケジューリングのシステムとして用いてもよい。
【0099】
上記実施の形態で用いたプログラムをCD‐ROM等の記録媒体に記憶して提供することもできる。また、上記実施の形態で説明した上記ステップの入れ替え、削除、追加等は本発明の要旨を変更しない範囲内で可能である。
【0100】
また、本発明は、以下の分散型データ処理プログラム、情報処理装置、分散型データベースシステム及び分散システムを提供する。
【0101】
[1]分散型データベースシステムを構成するデータベースノードを、
検索に用いられるキーとデータとをペアで記憶し、当該キーはバイナリ文字列であって、当該バイナリ文字列に定義された文字列の順序で一の範囲に含まれるキーのデータを記憶するものであって、当該一の範囲に含まれるキーのデータは他のデータベースノードに冗長化されて記憶される記憶手段として機能させるための分散型データ処理プログラム。
[2]前記記憶手段は、揮発性メモリ上に情報を記憶する前記[1]に記載の分散型データ処理プログラム。
[3]前記記憶手段は、記憶するデータ量が他のデータベースノードと略平等となるように前記一の範囲を決定する前記[1]又は[2]に記載の分散型データ処理プログラム。
[4]分散型データベースシステムを構成するデータベースノードとして機能するものであって、
検索に用いられるキーとデータとをペアで記憶し、当該キーはバイナリ文字列であって、当該バイナリ文字列に定義された文字列の順序で一の範囲に含まれるキーのデータを記憶するものであって、当該一の範囲に含まれるキーのデータは他のデータベースノードに冗長化されて記憶される記憶手段を有する情報処理装置。
[5]複数のデータベースノードを有するものであって、
前記データベースノードは、検索に用いられるキーとデータとをペアで記憶し、当該キーはバイナリ文字列であって、当該バイナリ文字列に定義された文字列の順序で一の範囲に含まれるキーのデータを記憶するものであって、当該一の範囲に含まれるキーのデータは他のデータベースノードに冗長化されて記憶される分散型データベースシステム。
[6]複数のノードを有するものであって、
前記ノードは、検索に用いられるキーとデータとをペアで記憶装置に記憶させ、当該キーはバイナリ文字列であって、当該バイナリ文字列に定義された文字列の順序で一の範囲に含まれるキーのデータを記憶させるものであって、当該一の範囲に含まれるキーのデータは他のノードが管理する記憶装置に冗長化されて記憶される分散システム。
[7]複数のノードを有するものであって、
前記ノードは、データを検索に用いられるキーとペアで管理し、当該キーはバイナリ文字列であって、当該バイナリ文字列に定義された文字列の順序で一の範囲に含まれるキーのデータをまとまりとして管理する分散システム。