以下、実施形態について、図面を参照しながら詳細に説明する。具体的には、まず図1〜2を参照して本実施形態の概要を説明する。次に、図3〜4を参照して、本実施形態が適用されるネットワーク構成の例について説明する。その後、図5〜7を参照して、本実施形態で使われる装置の構成を説明し、図8を参照して、本実施形態で使われるデータの例を説明する。続いて、図9〜16のフローチャートを参照して個々の装置が行う処理について説明し、図17〜22のシーケンス図を参照して、システムの動作例について説明する。最後に、いくつかの変形例についても説明する。
図1は、分散データベースシステムにおける状況の変化と、変化に応じた動作の概要を示す図である。なお、以下では「データベース」を「DB」と略す。
図1には、データが複数のノードの記憶装置に分散して記憶される分散DBシステムにおける、2つのノードと1つのクライアントが例示されている。分散DBシステムの各ノードは、クライアントに対してサーバとして動作する。また、各ノードおよびクライアントは、具体的にはコンピュータ(すなわち情報処理装置)である。
図1の例では、コンピュータ100aと100bが複数のノードのうちの2つのノードであり、コンピュータ110がクライアントである。コンピュータ100a、100b、および110は、不図示のネットワークを介して互いに接続されている。
コンピュータ100aは、記憶装置101aとネットワークインタフェイスIaを有する。また、コンピュータ100bは、記憶装置101bとネットワークインタフェイスIbを有する。
記憶装置101aと101bは、具体的には、高速なアクセスが可能なRAM(Random Access Memory)であることが好ましい。しかし、DBアクセスのレイテンシが多少長くても問題がない実施形態においては、記憶装置101aと101bは、ハードディスク装置などの外部記憶装置であってもよい。
ネットワークインタフェイスIaとIbのそれぞれは、例えば、オンボードのネットワークアダプタでもよいし、外付けのNIC(Network Interface Card)でもよい。また、ネットワークインタフェイスIaとIbのそれぞれは、例えば、OSI(Open Systems Interconnection)参照モデルにおける物理層の処理回路とMAC(Media Access Control)副層の処理回路などのハードウェア回路により実現されてもよい。
なお、図1では説明の便宜上、ネットワークインタフェイスIaとIbをそれぞれ識別する情報が、ネットワークインタフェイスIaとIbそれぞれの参照符号を用いて、「Ia」および「Ib」と表記されている。ネットワークインタフェイスIaとIbをそれぞれ識別する情報の具体例は、MACアドレスなどの物理アドレス(ハードウェアアドレスともいう)である。
図1の分散DBシステムにおけるDBは、エントリを複数含み、複数のノードの記憶装置に分散して記憶される。また、各エントリには、当該エントリに対応するキーが定められている。
例えば、DBは、具体的にはKVSであってもよい。KVSにおけるエントリは、キーとバリューのペアである。つまり、当該エントリに対応するキーとは、当該エントリが含むキーである。
あるいは、DBは、RDBであってもよい。RDBは1つ以上のテーブルを含み、各テーブルのエントリは、1つ以上のフィールドの組(tuple)である。各テーブルにおける所定の1つのフィールドが、「当該テーブルのキーとして使われるフィールド」として予め定められる。つまり、あるエントリに対応するキーとは、当該エントリにおける上記所定のフィールドのデータである。
以上のように各エントリに対応するキーが定められていると、キーの値に応じた水平分割(horizontal partitioning)によるDBの分散化が可能である。つまり、水平分割による分散化は、KVSとRDBの双方に適用可能である。また、ハッシュ値がキーとして使われる場合、DBはDHTとも見なせる。
ここで、キーの定義域をKとする。例えば、16ビットの符号なし整数がキーとして使われる場合、定義域Kは、0以上216−1の整数の集合である。あるいは、長さが1以上の任意の文字列がキーとして使われ得る場合、定義域Kは、長さが1以上の任意の文字列の集合である。
また、Mは2以上の所定の整数であるとし、0≦j≦M−1なる各jについて、定義域Kの部分集合Kjが適宜定義されるものとする。なお、任意のiとjに対して、i≠jならば部分集合KiとKjが互いに素(disjoint)となるように(つまり、Ki∩Kjが空集合となるように)、各部分集合が定義されるものとする。
そして、定義域Kは、式(1)のとおり、部分集合K0〜KM−1の和集合であるとする。
各部分集合Kjが具体的にどのような部分集合であるかは、実施形態に応じて任意である。また、Mの値も実施形態に応じて任意である。換言すれば、定義域Kが重複も漏れもなくM個の部分集合K0〜KM−1に分割されさえすれば、部分集合K0〜KM−1がどのように定義されてもよい。
例えば、定義域Kが整数を要素とする集合である場合、各部分集合Kjは、式(2)により定義されていてもよい。なお、式(2)における関数mod(x,y)は、xをyで割った余りを計算する剰余関数である。
あるいは、引数xのハッシュ値を計算する適宜のハッシュ関数hash(x)を用いて、各部分集合Kjが式(3)により定義されていてもよい。式(3)の定義は、定義域Kがどのような集合であるかによらず、適用可能である。
なお、式(3)のハッシュ関数hash(x)としては、任意のハッシュ関数が利用可能だが、ハッシュ関数hash(x)は暗号学的ハッシュ関数であることが好ましい。なぜなら、暗号学的ハッシュ関数はハッシュ値の分布の一様性が高いからである。
ハッシュ値の分布の一様性が高いと、「キーの値に応じた水平分割のバランスが良い」と期待される。そして、バランスの良い分割は、効率の良い分散化を意味する。そのため、ハッシュ関数hash(x)は暗号学的ハッシュ関数であることが好ましい。例えば、暗号学的ハッシュ関数の一例は、160ビットのハッシュ値を出力するSHA−1(Secure Hash Algorithm 1)である。
あるいは、Bを1以上の整数として、M=2Bが成り立つ場合には、各部分集合Kjが式(4)または(5)により定義されていてもよい。なお、式(4)と(5)における関数ext(x,y,z)は、ビット列xのyビット目からzビット目までを抽出する関数である。また、0ビット目が最上位ビットであるものとする。
例えば、式(4)によれば、キーkを表すビット列の第Lビットから第(L+B−1)ビットまでのBビットが抽出される。そして、抽出されたBビットで表される0以上(2B−1)以下の数により、キーkの属するキー領域が定められる。式(5)は、式(4)のようにキーkを表すビット列そのものからBビットを抽出する代わりに、キーkのハッシュ値を表すビット列そのものからBビットを抽出することを示している。
なお、関数ext(x,y,z)は、入力ビット列から複数の所定の位置のビットを抽出する関数の一例である。関数ext(x,y,z)のように連続した(z−y+1)ビットを抽出する関数の代わりに、例えば「2ビット目と5ビット目と8ビット目」のような、不連続な複数の位置のビットを抽出する関数が利用されてもよい。
また、各部分集合Kjは、式(6)のように定義されていてもよい。式(6)における関数fは、集合Kから、式(7)を満たす集合Xへの、任意の写像である。なお、式(6)と(7)において、0≦j≦Mなる任意のjについて、Tjは適宜に選ばれた実数の閾値であるものとし、0≦j≦M−1なる任意のjについて、Tj<Tj+1であるものとする。
式(7)によれば、関数fは、キーの定義域Kから、閾値T0以上かつ閾値TM未満の実数の少なくとも一部を要素とする集合Xへの、任意の写像である。キーの定義域Kによっては、関数fは、例えば恒等写像であってもよいし、ハッシュ関数であってもよい。もちろん、実施形態に応じて、関数fは、ハッシュ関数(特に暗号学的ハッシュ関数)、剰余関数、入力ビット列から複数の所定の位置のビットを抽出する関数のうちの1つまたは複数を利用する所定の写像であってよい。
以上の式(2)〜(7)に例示したように、部分集合K0〜KM−1は、所定の写像によるキーの像に基づいて定義されていてもよい。また、下記のとおり、式(6)は式(2)〜(5)を一般化した式でもある。
ここで、キーkからSHA−1によりハッシュ値を求める関数を、SHA1(k)と表記することにする。すると、式(5)の例において、ハッシュ関数hash(k)としてSHA1(k)を用い、L=0とし、B=7とした場合、各部分集合Kjは、式(8)のように定義される。
別の観点から述べれば、式(8)の例は、式(6)において、0≦j≦Mなる任意のjについてTj=2153×jと定め、かつ、関数f(k)としてSHA(k)を利用する例でもある。
そして、式(2)の例は、式(6)において、関数f(k)として剰余関数mod(k,M)を用いるとともに、0≦j≦Mなる任意のjについてTj=jと定めた例でもある。同様に、式(3)の例は、式(6)において、関数f(k)として関数mod(hash(k),M)を用いるとともに、0≦j≦Mなる任意のjについてTj=jと定めた例でもある。また、式(4)と(5)のそれぞれも、式(6)の具体例の一つであることは明らかであろう。
さてここで、部分集合K0〜KM−1のうちのある特定の1つを「Ka」とする。部分集合Kaにキーが属するすべてのエントリ102は、図1のステップS1ではコンピュータ100aの記憶装置101aに記憶されているのに対し、ステップS2ではコンピュータ100bの記憶装置101bに記憶されている。なお、エントリ102の数は、1のこともあるし複数のこともある。
コンピュータ110は、エントリ102のうちの少なくとも1つにアクセスしようとする場合、DBアクセス要求を送信する。具体的には、エントリ102が記憶装置101aに記憶されているステップS1では、コンピュータ110は、DBアクセス要求120aをコンピュータ100aに送信する。また、エントリ102が記憶装置101bに記憶されているステップS2では、コンピュータ110は、DBアクセス要求120bをコンピュータ100bに送信する。なお、「コンピュータ110は、なぜ、ステップS1ではDBアクセス要求120aをコンピュータ100aに送信することができ、ステップS2ではDBアクセス要求120bをコンピュータ100bに送信することができるのか」という理由については後述する。
DBアクセス要求120aは、コンピュータ100aのネットワークインタフェイスIaにおいて受信される。そして、コンピュータ100aは、DBアクセス要求120aにしたがって記憶装置101aにアクセスし、DBアクセス応答をコンピュータ110に返す。
また、DBアクセス要求120bは、コンピュータ100bのネットワークインタフェイスIbにおいて受信される。そして、コンピュータ100bは、DBアクセス要求120bにしたがって記憶装置101bにアクセスし、DBアクセス応答をコンピュータ110に返す。
このように、キーが部分集合Kaに属するエントリに対するDBアクセス要求に応答するのは、当該エントリを記憶しているノードである。以下では、ある部分集合Kj(0≦j≦M−1)にキーが属するエントリをノードのローカルな記憶装置に記憶しているノードを、「部分集合Kjの担当ノード」または「部分集合Kjを担当するノード」ともいう。
ところで、1つのノードは、1つの部分集合のみを担当する場合もあるし、複数の部分集合を担当する場合もある。すると、各ノードが担当する部分集合の数に応じて、ノード間の負荷が偏ることがある。
また、ある部分集合にキーが属するエントリへのDBアクセス要求は多く、別の部分集合にキーが属するエントリへのDBアクセス要求は少ない、という場合もある。すると、DBアクセス要求の量に応じて、ノード間の負荷が偏ることもある。
例えば、コンピュータ100aの負荷が高く、コンピュータ100bの負荷が低ければ、負荷分散のために、コンピュータ100aの負荷の一部をコンピュータ100bに移すことが好ましい。例えば上記のような負荷分散を目的として、部分集合Kaの担当ノードがコンピュータ100aからコンピュータ100bに変更され、ステップS1からステップS2への状況の変化が生じる、という場合がある。
もちろん、ステップS1からステップS2への状況の変化は、他の原因によることもある。例えば以下のような場合である。
図1では、ステップS1を示す上段にもコンピュータ100bが描かれている。しかし、ステップS1の段階では、コンピュータ100bが分散DBシステムのノードとして存在しなくてもよい。コンピュータ100bが新たなノードとして追加されたことが原因で、ステップS1からステップS2へと状況が変化することもある。
また、図1では、ステップS2を示す下段にもコンピュータ100aが描かれている。しかし、ステップS2の段階では、コンピュータ100aが分散DBシステムのノードとして存在しなくてもよい。つまり、ステップS1の直後にコンピュータ100aが故障した場合などに、コンピュータ100bが部分集合Kaの担当を引き継ぐことにより、ステップS1からステップS2へと状況が変化することもある。
以上のように、引き継ぎ(takeover)は、障害発生を契機とするフェイルオーバ(failover)のこともあるし、障害とは無関係なこともある。しかし、状況の変化の原因が何であれ、ステップS1からステップS2へと状況が変化する際にコンピュータ100bは、DBからエントリ102を取得し、取得したエントリ102を記憶装置101bに記憶する。
なお、上記では「DBからエントリ102を取得」と述べたが、より具体的には、コンピュータ100bは、コンピュータ100aからエントリ102を取得してもよい。あるいは、もしコンピュータ100a以外の不図示のコンピュータ(つまり、複数のノードのうちの他の1つ)がエントリ102のバックアップコピーを有していれば、コンピュータ100bは、当該不図示のコンピュータからエントリ102を取得してもよい。
また、エントリ102を取得したコンピュータ100bはさらに、ある特定の通信端点情報をコンピュータ100bのネットワークインタフェイスIbと対応づける。この対応づけにより、部分集合Kaの担当ノードがコンピュータ100aからコンピュータ100bに変化したことが、他のコンピュータ(例えば、コンピュータ110や、複数のノードのうちの不図示の他のノード)にも認識可能となる。その理由の詳細は、以下のとおりである。
通信端点情報は、通信端点(communication end point)を論理的に識別するための情報である。例えば、TCP/IP(Transmission Control Protocol/Internet Protocol)プロトコルスイートにしたがった通信においては、通信端点は、IPアドレスとポート番号の組み合わせによって論理的に識別される。以下では特に断らないが、ポート番号は、例えばTCPやUDP(User Datagram Protocol)などの、TCP/IPプロトコルスイートにおけるトランスポート層プロトコルでの、ポート番号のことである。
ただし、ある通信端点との通信を行おうとするコンピュータは、通信端点情報として、必ずしもIPアドレスとポート番号の双方を取得する必要はない。コンピュータが通信端点情報としてIPアドレスのみを取得すれば十分な場合もある。
例えば、図1のような分散DBシステムのためのDBアプリケーションにおいて、ポート番号は固定された値であってもよい。ポート番号が予め決められた定数の場合、任意のコンピュータは、目的の通信端点のIPアドレスさえ取得することができれば、取得したIPアドレスと固定された既知のポート番号により、目的の通信端点を論理的に識別することができる。
また、1つのアプリケーションが使うポート番号は、必ずしも1つに限定されるわけではない。例えば、7000以上7020以下の任意のポート番号が、同じ1つのDBアプリケーションにより使われてもよい。すると、任意のコンピュータは、目的の通信端点のIPアドレスさえ取得することができれば、取得したIPアドレスと、7000以上7020以下の範囲から適宜選択したポート番号により、目的の通信端点を論理的に識別することができる。
したがって、通信端点情報は、例えばIPアドレスのみであってもよいし、IPアドレスとポート番号のペアであってもよい。いずれにせよ、通信端点情報は通信端点を論理的に識別するための情報であり、物理的な識別情報ではない。よって、通信端点情報によって論理的に識別される通信端点と物理的な実体との間の対応関係は、動的に変更することが可能である。
本実施形態では、式(1)に示すM個の部分集合K0〜KM−1に合わせて、M個の通信端点をそれぞれ論理的に識別するための、少なくともM個の通信端点情報が使われる。詳しくは図8などとともに後述するが、各部分集合Kjに対して2以上の通信端点情報が対応づけられていてもよい。例えば、各部分集合Kjに対して3個の通信端点情報が対応づけられる場合は、3M個の通信端点をそれぞれ論理的に識別する3M個の通信端点情報が使われる。
各通信端点情報は、M個の部分集合K0〜KM−1のいずれか1つに静的に対応づけられる。例えば、図1の例では、通信端点情報Paは、部分集合Kaと静的に対応づけられる。
以下、説明の便宜上、キーの定義域Kを、「キー空間」(key space)ともいう。また、式(1)の部分集合K0〜KM−1のそれぞれを、「キー領域」(key region)ともいう。キー領域は、キー空間の部分空間である。
上述の通信端点情報とキーの部分集合の静的な対応づけは、本実施形態では、図1に示すように、静的対応づけ情報111としてコンピュータ110に記憶される。なお、図1ではコンピュータ110のみが静的対応づけ情報111を含むが、コンピュータ100aと100bも同様に、静的対応づけ情報111を記憶していてもよい。
図1では、紙面の都合上、静的対応づけ情報111の例として、キー領域Ka(つまり部分集合Ka)と通信端点情報Paとの対応づけのみが示されている。しかし、静的対応づけ情報111は、所定個数(例えば、各部分集合Kjに対して3個の通信端点情報が対応づけられる場合は、3M個)の通信端点情報のそれぞれを、M個のキー領域K0〜KM−1のいずれか1つに、静的に対応づける情報である。
また、各通信端点情報は、DBを分散して記憶する複数の記憶装置のいずれかへのアクセスを提供するネットワークインタフェイスに動的に対応づけられる。
例えば、ステップS1では、キー領域Kaにキーが属する全エントリ102が、記憶装置101aに記憶されている。よって、キー領域Kaに静的に対応づけられている通信端点情報Paは、ステップS1では、記憶装置101aへのアクセスを提供するネットワークインタフェイスIaに対応づけられている。
また、ステップS2では、エントリ102が記憶装置101bに記憶されている。よって、ステップS2では、通信端点情報Paは、記憶装置101bへのアクセスを提供するネットワークインタフェイスIbに対応づけられている。
以上のような通信端点情報とネットワークインタフェイスとの動的な対応づけは、本実施形態では、図1に示すように、動的対応づけ情報112としてコンピュータ110に記憶される。なお、図1ではコンピュータ110のみが動的対応づけ情報112を含むが、コンピュータ100aと100bも同様に、動的対応づけ情報112を記憶していてもよい。
図1では、紙面の都合上、動的対応づけ情報112の例として、通信端点情報Paとネットワークインタフェイスの対応づけのみが示されている。具体的には、ステップS1での動的対応づけ情報112は、通信端点情報PaとネットワークインタフェイスIaを対応づけている。しかし、動的対応づけ情報112は動的に書き換え可能なので、ステップS2での動的対応づけ情報112は、通信端点情報PaとネットワークインタフェイスIbを対応づけている。もちろん、動的対応づけ情報112は、他の通信端点情報と他のネットワークインタフェイスとをさらに対応づけてもいる。
ところで、上記のとおり、通信端点情報はIPアドレスを含み、ネットワークインタフェイスはMACアドレスにより識別される。したがって、通信端点情報とネットワークインタフェイスを動的に対応づける動的対応づけ情報112として、例えば、ARP(Address Resolution Protocol)テーブルのエントリが使われてもよい。
ARPテーブルは、ARPキャッシュとも呼ばれ、IPアドレスとMACアドレスを対応づけるエントリを含む。また、ARPテーブルの各エントリは、ARP要求とARP応答に基づいて作成および更新され、所定時間にわたって一度もアクセスされない場合は消去される。このように、ARPテーブルの各エントリは、IPアドレスとMACアドレスを動的に対応づける動的対応づけ情報112の好適な一例である。
さてここで、ステップS1からステップS2へと状況が変化する際に、コンピュータ100bが取得するエントリ102とは、上記のとおり、キーが部分集合Kaに属するすべてのエントリである。そこで、ステップS1からステップS2への移行時に、コンピュータ100bは、コンピュータ100bが新たに担当する部分集合Kaと静的に対応づけられている通信端点情報Paを、コンピュータ100b自体のネットワークインタフェイスIbと対応づける。つまり、上記の「ある特定の通信端点情報」とは、図1の例では通信端点情報Paである。
上記のとおり、ネットワークインタフェイスIbは、例えばMACアドレスにより識別され、通信端点情報Paは、IPアドレスを含む。よって、コンピュータ100bによる通信端点情報PaとネットワークインタフェイスIbの対応づけは、具体的には、例えば「IPエリアシング(IP aliasing)」と呼ばれる技術により実現することができる。
IPエリアシング機能は、いくつかのOS(Operating System)に実装されている。IPエリアシング機能は、1つのネットワークインタフェイスに複数のIPアドレスを割り当てるための機能である。つまり、IPエリアシング機能により、1つのMACアドレスに複数のIPアドレスを対応づけることが可能となる。
そして、コンピュータ100bが通信端点情報PaをネットワークインタフェイスIbと対応づけると、コンピュータ110は、「通信端点情報PaがネットワークインタフェイスIbに対応づけられた」と認識することができる。つまり、コンピュータ110は、動的対応づけ情報112を更新することができる。理由は以下のとおりである。
実際の通信では、通信端点情報Paのような論理的な情報により宛先が指定されるメッセージは、カプセル化されて、下位層のフレームのペイロードの中に含められる。そして、下位層のフレームが送信される。例えば、IPデータグラムがイーサネットフレームのペイロードに含められ、イーサネットフレームが送信される(なお、「イーサネット」は登録商標である)。
そこで、コンピュータ110は、通信端点情報Paにより論理的に識別される通信端点宛のメッセージを送信する前に、通信端点情報Paにより論理的に識別される通信端点として働くネットワークインタフェイスを物理的に識別する物理的な識別情報を調べる。具体的には、コンピュータ110は、動的対応づけ情報112を参照して、通信端点情報Paに対応する物理的な識別情報を調べる。
もし、動的対応づけ情報112によって通信端点情報Paが何らかの物理的な識別情報と対応づけられていれば、コンピュータ110は、通信端点情報Paと対応づけられた物理的な識別情報を、下位の層のフレームの宛先に指定する。
逆に、動的対応づけ情報112が、通信端点情報Paをどの物理的な識別情報とも対応づけていなければ、コンピュータ110は、ブロードキャストにより、通信端点情報Paに対応するネットワークインタフェイスを問い合わせる。すると、通信端点情報Paに対応づけられたネットワークインタフェイスを有するコンピュータが問い合わせに応答する。
例えば、コンピュータ100bが通信端点情報PaをネットワークインタフェイスIbと対応づけた後、コンピュータ110からの問い合わせがブロードキャストされると、コンピュータ100bが問い合わせに応答する。すると、コンピュータ110は応答を受信し、通信端点情報Paに対応する物理的な識別情報として、ネットワークインタフェイスIbを識別する識別情報を取得する。
さらに、コンピュータ110は、受信した応答に基づき、動的対応づけ情報112を更新する。つまり、コンピュータ110は、通信端点情報PaとネットワークインタフェイスIbを対応づけるように、動的対応づけ情報112を更新する。そして、コンピュータ110は、更新した動的対応づけ情報112にしたがって、ネットワークインタフェイスIbを物理的に識別する識別情報を、フレームの宛先に指定する。
以上のように、実際の通信は、論理的な識別情報を物理的な識別情報に解決(resolve)する処理をともなう。そして、解決のために、必要に応じて上記のように問い合わせがブロードキャストされ、応答に基づいて動的対応づけ情報112が更新される。よって、論理的な識別情報と物理的な識別情報の対応づけがたとえ動的に変化しても、動的対応づけ情報112は、変化に追従して適切に更新される。
また、仮にコンピュータ110が動的対応づけ情報112を参照した時点で、動的対応づけ情報112が偶然まだステップS1の状態のままであったとしても、適宜の処理をコンピュータ110が行えば問題はない。ここで「適宜の処理」とは、通信において一般的なタイムアウト処理とリトライ処理であってもよいし、動的な情報の管理において一般的なエージング処理であってもよいし、これらの処理の組み合わせであってもよい。
例えば、コンピュータ110は、DBアクセス要求120bを送信しようとして動的対応づけ情報112を参照し、動的対応づけ情報112から、「通信端点情報PaにはネットワークインタフェイスIaが対応する」という古い情報を得るかもしれない。その結果、コンピュータ110は、ネットワークインタフェイスIaを物理的に識別する情報を、DBアクセス要求120bのフレームの宛先に指定するかもしれない。
しかし、ステップS2の時点では、ネットワークインタフェイスIaと通信端点情報Paの対応づけは、もはや解消されている。よって、たとえコンピュータ100aのネットワークインタフェイスIaにおいて、DBアクセス要求120bのフレームが受信されるとしても、DBアクセス要求120bは、コンピュータ100aにおいて破棄される。すると、DBアクセス要求120bへの応答は返ってこない。
つまり、もし、コンピュータ110が、古い動的対応づけ情報112による誤った解決結果に基づいてDBアクセス要求120bのフレームを送信したとすると、コンピュータ110は、応答を得られず、タイムアウトする。コンピュータ110は、タイムアウトに応じて適宜のリトライ処理を行うことで、動的対応づけ情報112を更新することができる。
例えば、コンピュータ110は、応答が得られずタイムアウトしたDBアクセス要求120bの宛先を論理的に識別する通信端点情報PaとネットワークインタフェイスIaとの対応づけを、動的対応づけ情報112から強制的に削除してもよい。その後、コンピュータ110は、再度DBアクセス要求120bの送信を試みてもよい。
すると、強制削除の後の動的対応づけ情報112は、通信端点情報Paをどの物理的な識別情報とも対応づけていないので、コンピュータ110は上記のブロードキャストによる問い合わせを行う。その結果、動的対応づけ情報112は正しく更新される。すなわち、「通信端点情報PaにはネットワークインタフェイスIbが対応づけられている」という新しい状況が、動的対応づけ情報112に反映される。
そして、コンピュータ110が更新後の動的対応づけ情報112に基づいてDBアクセス要求120bのフレームの宛先を決定すると、DBアクセス要求120bは、今度は正しくコンピュータ100bに受信される。そして、コンピュータ110は、コンピュータ100bからDBアクセス要求120bに対する応答を受信することができる。
あるいは、コンピュータ110は、上記のような明示的なタイムアウト処理とリトライ処理を行わないかもしれない。その代わり、コンピュータ110は、動的対応づけ情報112に対するエージング処理を行い、動的対応づけ情報112が古くなったら強制的に動的対応づけ情報112を削除してもよい。
すると、通信端点情報PaとネットワークインタフェイスIaを対応づける古い動的対応づけ情報112は、エージング処理によっていずれは削除される。よって、通信端点情報Paを宛先に指定した何らかのメッセージ(例えばDBアクセス要求120bでもよい)を、古い動的対応づけ情報112の削除後にコンピュータ110が送信しようとすると、上記と同様にブロードキャストによる問い合わせが生じる。
その結果、やはり動的対応づけ情報112は正しく更新される。すると、コンピュータ110は、正しく更新された動的対応づけ情報112に基づいて上記メッセージを送信する。よって、上記メッセージは、「通信端点情報PaにはネットワークインタフェイスIbが対応づけられている」という新しい状況に合わせて、適切にネットワークインタフェイスIbで受信される。
以上説明したとおりなので、コンピュータ100bが通信端点情報PaをネットワークインタフェイスIbと対応づけると、コンピュータ110は、「通信端点情報PaがネットワークインタフェイスIbに対応づけられた」と認識することができる。つまり、コンピュータ110は、認識した結果にしたがって、動的対応づけ情報112を更新することができる。
よって、ステップS1からステップS2へと状況が変化してから多少のタイムラグはあるかもしれないが、コンピュータ110は、状況の変化に合わせて動的対応づけ情報112を適切に更新することができる。そして、コンピュータ110は、適切に更新した動的対応づけ情報112に基づいて、DBアクセス要求120bなどの任意のメッセージを、適切な宛先に送信することができる。
換言すれば、コンピュータ110は、動的対応づけ情報112を動的に更新することにより、ステップS1においては、DBアクセス要求120aのフレームの宛先として、ネットワークインタフェイスIaを識別する識別情報を正しく指定することができる。また、コンピュータ110は、動的対応づけ情報112を動的に更新することにより、ステップS2においては、DBアクセス要求120bのフレームの宛先として、ネットワークインタフェイスIbを識別する識別情報を正しく指定することができる。
その結果、DBアクセス要求120aは正しくコンピュータ100aで受信され、DBアクセス要求120bは正しくコンピュータ100bで受信される。すなわち、キー領域Kaを担当するノードがコンピュータ100aからコンピュータ100bに変化したとしても、コンピュータ110は、変化に応じて、キー領域Kaを担当するノードにDBアクセス要求を送信することができる。
なお、DBアクセス要求120aと120bの各々は、少なくとも以下の(1−1)〜(1−3)のフィールドを含む。
(1−1)DBアクセス要求の宛先の通信端点を識別するための通信端点情報
(1−2)コンピュータ110がアクセスしようとするエントリを識別するためのキー
(1−3)DBに対して行う操作の内容を示す要求内容
具体的には、DBアクセス要求120aには、通信端点情報Paと、キー領域Kaに属するキーk1と、適宜の要求内容が指定されている。また、DBアクセス要求120bには、通信端点情報Paと、キー領域Kaに属するキーk2と、適宜の要求内容が指定されている。
以上のDBアクセス要求120aと120bの例から明らかなとおり、DBアクセス要求に指定される通信端点情報は、DBアクセス要求に指定されるキーが属するキー領域と静的対応づけ情報111によって対応づけられている通信端点情報である。よって、コンピュータ110は、まず、アクセスしようとするエントリのキーから、当該キーの属するキー領域を決定する。そして、コンピュータ110は、静的対応づけ情報111を参照することにより、決定したキー領域に対応する通信端点情報を取得し、取得した通信端点情報をDBアクセス要求に指定する。
なお、コンピュータ110は、キー領域がどのように定義されているかに応じて、キーから適宜キー領域を決定することができる。例えば、キー領域が式(2)にしたがって定義されているとする。この場合、コンピュータ110にとって定数Mは既知である。よって、コンピュータ110がアクセスしようとするエントリのキーが例えばキーk1であれば、コンピュータ110は、式(2)にしたがってmod(k1,M)を計算し、計算結果に応じて、キーk1が属するキー領域Kaを決定することができる。キー領域が他の式によって定義されている場合も同様である。
また、(1−3)の要求内容は、分散DBシステムのためのDBアプリケーションの仕様に応じて適宜の書式で表される。例えば、DBに対して行う操作として、エントリを読み出すリード操作と、エントリにデータを書き込むライト操作の2種類の操作のみをDBアプリケーションが定義していてもよい。その場合、要求内容は、操作の種類を示すフィールドと、ライト操作で書き込む対象のデータを表すオプショナルなフィールドとを含んでいてもよい。
また、DBアプリケーションによっては、ライト操作の代わりに、新たなエントリを追加するインサート操作と、既存のエントリを書き換えるアップデート操作を定義していてもよい。この場合も、要求内容は、操作の種類を示すフィールドと、インサート操作またはアップデート操作で書き込む対象のデータを表すオプショナルなフィールドとを含んでいてもよい。また、要求内容として、既存のエントリを削除するデリート操作がさらに指定可能であってもよい。
以上のように、DBアクセス要求が通信端点情報とキーと要求内容を含むので、DBアクセス要求を受信したノードは、DBアクセス要求にしたがって、アクセス対象のエントリを識別し、識別したエントリに対して、要求された操作を実行することができる。その結果、DBアクセス要求を受信したノードは、DBアクセスの結果を、DBアクセス要求の送信元のコンピュータ110に対して、DBアクセス応答として返信することができる。
DBアクセス応答の形式は実施形態に応じて任意である。例えば、リード操作が要求された場合のDBアクセス応答は、DBアクセス要求に指定されたキーに対応するエントリのデータを含む。また、リード操作以外の操作に対するDBアクセス応答は、例えば、操作が成功したか否かを示す情報を含んでもよい。
続いて、静的対応づけ情報111と動的対応づけ情報112による対応づけに関して、図2を参照してさらに詳しく説明する。図2は、キー領域と通信端点とノードとの対応づけの一例を示す図である。
図2において、ドーナツ状の灰色の部分が、キー空間K(つまりキーの定義域K)を示す。キー空間Kは、図2の例では、16個の互いに素なキー領域K0〜K15(つまり定義域Kにおける互いに素な部分集合K0〜K15)に分割される。図2の例では、式(1)のMの値は16である。
そして、上記のとおり静的対応づけ情報111は、各キー領域Kj(0≦j≦M−1)に対して、キー領域Kjと通信端点情報Pjを静的に対応づける。キー領域Kjと通信端点情報Pjの対応づけは、換言すれば、キー領域Kjと、通信端点情報Pjで識別される通信端点との対応づけである。
図2では、通信端点情報P0〜P15は、黒い円で表されている。そして、静的対応づけ情報111によるキー領域Kjと通信端点情報Pjの静的な対応づけは、黒い円と灰色のブロックの間の実線により示されている。
他方、動的対応づけ情報112は、通信端点情報とネットワークインタフェイスを動的に対応づける。換言すれば、動的対応づけ情報112は、通信端点情報と静的に対応づけられているキー領域を、通信端点情報を介して、ネットワークインタフェイスに動的に対応づける。
また、個々のネットワークインタフェイスは、複数のノードのいずれかに静的に対応する。よって、動的対応づけ情報112は、通信端点情報とネットワークインタフェイスの対応づけを介して、キー領域とノードとを対応づけてもいる。つまり、動的対応づけ情報112は、キー領域に静的に対応づけられた通信端点情報と、ノードが有するネットワークインタフェイスとの対応づけにより、当該ノードが当該キー領域を担当することを示してもいる。
そして、図2において破線の楕円形はノードを示す。つまり、図2の例では、分散DBシステムに5つのノードN1〜N5が含まれる。また、動的対応づけ情報112による動的な対応づけは、図2において楕円形と灰色のブロックの対応づけに相当する。
具体的には、図2の例では、ノードN1は、キー領域K1、K2およびK3を担当している。つまり、ノードN1は、ノードN1自体が有するネットワークインタフェイスに、3つのキー領域K1、K2およびK3に対応する3つの通信端点情報P1、P2およびP3を対応づけている。そして、ノードN1は、ノードN1自体が有する記憶装置に、キー領域K1、K2およびK3のいずれかにキーが属するすべてのエントリを記憶している。
また、図2の例では、ノードN2は、キー領域K4、K5、K6およびK7を担当している。つまり、ノードN2は、ノードN2自体が有するネットワークインタフェイスに、4つのキー領域K4、K5、K6およびK7に対応する4つの通信端点情報P4、P5、P6およびP7を対応づけている。そして、ノードN2は、ノードN2自体が有する記憶装置に、キー領域K4、K5、K6およびK7のいずれかにキーが属するすべてのエントリを記憶している。
また、図2の例では、ノードN3は、キー領域K8、K9、K10およびK11を担当している。つまり、ノードN3は、ノードN3自体が有するネットワークインタフェイスに、4つのキー領域K8、K9、K10およびK11に対応する4つの通信端点情報P8、P9、P10およびP11を対応づけている。そして、ノードN3は、ノードN3自体が有する記憶装置に、キー領域K8、K9、K10およびK11のいずれかにキーが属するすべてのエントリを記憶している。
また、図2の例では、ノードN4は、キー領域K12、K13およびK14を担当している。つまり、ノードN4は、ノードN4自体が有するネットワークインタフェイスに、3つのキー領域K12、K13およびK14に対応する3つの通信端点情報P12、P13およびP14を対応づけている。そして、ノードN4は、ノードN4自体が有する記憶装置に、キー領域K12、K13およびK14のいずれかにキーが属するすべてのエントリを記憶している。
また、図2の例では、ノードN5は、キー領域K15およびK0を担当している。つまり、ノードN5は、ノードN5自体が有するネットワークインタフェイスに、2つのキー領域K15およびK0に対応する2つの通信端点情報P15およびP0を対応づけている。そして、ノードN5は、ノードN5自体が有する記憶装置に、キー領域K15およびK0のいずれかにキーが属するすべてのエントリを記憶している。
なお、図示の便宜上、図2には、各ノードが連続した複数のキー領域を担当している例を示した。しかし、各ノードが担当するキー領域は必ずしも連続していなくてもよい。例えば、ノードの構成が動的に変化した結果として、ある時点においてノードN3がキー領域K1とK8とK9とK12を担当することになってもよい。
ところで、図2のクライアントCは、例えば図1のコンピュータ110であってもよく、コンピュータ100aや100bであってもよい。したがって、クライアントCは、図1の静的対応づけ情報111を記憶している。
よって、クライアントCは、クライアントCがアクセスしようとするエントリに対応するキーから、DBアクセス要求の宛先の通信端点を静的に決定することができる。つまり、本実施形態の利点の一つは、クライアントCが直接的にDBアクセス要求の宛先の通信端点を決定することができる点である。
つまり、クライアントCは、DBアクセス要求の宛先の通信端点をキーから決定するために、例えばゲートウェイサーバなどの他のコンピュータに問い合わせを送信する必要がない。換言すれば、どのノードがどのキー領域を担当しているかを管理するためのゲートウェイサーバなどのコンピュータが、本実施形態では不要である。したがって、本実施形態では、他の分散DBシステムにおいて生じ得る以下のような様々な問題を避けることができる。
DBアクセス要求の宛先をキーから決定するためのゲートウェイサーバを含む分散DBシステムでは、ゲートウェイサーバが分散DBシステム全体の単一故障点(SPoF:Single Point of Failure)になってしまう。また、ゲートウェイサーバは、分散DBシステム全体の性能のボトルネックにもなってしまう。仮に2台以上のゲートウェイサーバが存在するとしても、それらのゲートウェイサーバがボトルネックであることに変わりはない。つまり、ゲートウェイサーバは、耐故障性と性能の両面での問題を引き起こしかねない。
さらに、上記のようなゲートウェイサーバを含む分散DBシステムでは、クライアントが、DBアクセス要求の宛先のノードを尋ねる問い合わせをゲートウェイサーバに送信し、ゲートウェイサーバがクライアントに応答を返す。その後、クライアントは、ゲートウェイサーバからの応答において通知されたノードを宛先に指定して、DBアクセス要求を送信する。したがって、クライアントからゲートウェイサーバへの問い合わせとゲートウェイサーバからクライアントへの応答にかかる時間のぶん、DBアクセスのレイテンシは長くなる。
仮に、ゲートウェイサーバが、クライアントから問い合わせを受け付けてクライアントに応答を返す代わりに、以下のように動作するとしても、レイテンシへの悪影響は避けられない。つまり、仮に、ゲートウェイサーバが、クライアントからDBアクセス要求を受け付け、DBアクセス要求からノードを決定し、決定したノードにDBアクセス要求を転送するとしても、ゲートウェイサーバの利用によりDBアクセスのレイテンシが悪化する。なぜなら、クライアントからゲートウェイサーバへの通信が行われることに変わりはないからである。
しかし、本実施形態によれば、ゲートウェイサーバがなくてもクライアント自体がDBアクセス要求の宛先の通信端点をキー自体といくつかの既知の情報だけから決定することができる。ここで「既知の情報」とは、例えば式(3)によりキー領域Kjが定義される場合ならば、定数Mの値と、キーからキー領域を決定するためのmod(hash(k,M)という関数の定義である。よって、本実施形態によれば、ゲートウェイサーバに起因する上記のような様々な問題が回避可能である。
また、ノードとキー領域を直接動的に対応づける情報を、上記のように少数のゲートウェイサーバだけが保持する代わりに、多数のクライアントが保持するような分散DBシステムも考えられる。しかしながら、多数のクライアントが動的な情報を保持するシステムでは、多数のクライアントがそれぞれ保持する情報を最新の状態に保つための複雑なプロトコルと、当該プロトコルにしたがった多数の制御メッセージの交換が必要になる。したがって、ノード数に比べて交換される制御メッセージの数が多すぎる場合では特に、制御メッセージの交換によるオーバヘッドが分散DBシステム全体の性能に悪影響を与えることがある。したがって、現実には、多数のクライアントが動的な情報を最新の状態に保ちつつ保持することは非常に難しい。
以上のように、他の分散DBシステムでは様々な問題が生じ得る。しかしながら、図1〜2を参照して説明した本実施形態によれば、キー領域と通信端点は、静的対応づけ情報111によって静的に対応づけられるので、上記のような様々な問題を回避することが可能である。つまり、本実施形態では、静的対応づけ情報111の保守コストはゼロであり、ゲートウェイサーバの導入によって生じ得る、耐故障性・性能・レイテンシ等の悪化も生じない。
続いて、本実施形態が適用されるネットワークの例について図3〜4を参照して説明する。
図3は、第1のネットワーク構成例の図である。図3の例では、1つのブロードキャストドメイン200の中に、DBを分散して記憶する8つのノードN11〜N18と、デプロイサーバ(deployment server)201と、クライアント202と、ルータ203が含まれる。
デプロイサーバ201は、分散DBシステムのデプロイ時に、ノードN11〜N18の初期化を行う。初期化には、OSのインストールや、コンピュータを分散DBシステムのノードとして動作させるためのプログラムのインストールなどの処理が含まれる。また、デプロイサーバ201はさらに、初期状態における各ノードとキー領域との対応づけを設定してもよい。さらに、デプロイサーバ201は、ノードN11〜N18間の負荷のバランスを監視するなど、各種の処理を行ってもよい。しかし、デプロイサーバ201は、なくてもよい。
例えば、図1のコンピュータ100aは、ノードN11〜N18のうちのいずれか1つであってもよい。そして、図1のコンピュータ100bは、ノードN11〜N18のうちの他のいずれか1つであってもよい。
また、図1のコンピュータ110は、クライアント202であってもよい。あるいは、DBアクセス要求の送信元のクライアントとしてのコンピュータ110は、ノードN11〜N18のうちの、コンピュータ100aと100b以外のいずれか1つであってもよい。
例えば、あるキー領域の担当ノードが変更される場合などに、あるノードが他のノードにエントリを要求することがあり、当該要求もDBアクセス要求の一種である。よって、図1のコンピュータ110は、ノードN11〜N18のうちのいずれかであってもよい。
また、ルータ203はインターネット210に接続されており、インターネット210には他のクライアント220も接続されている。図1のコンピュータ110は、ノードN11〜N18が属するブロードキャストドメイン200の外部のクライアント220であってもよい。
図4は、第2のネットワーク構成例の図である。図4の例では、DBを分散して記憶する5つのノードN21〜N25が、2つのブロードキャストドメイン230と240に分かれて存在する。具体的には、ノードN21、N22およびN23はブロードキャストドメイン230に属し、ノードN24およびN25はブロードキャストドメイン240に属する。
また、ブロードキャストドメイン230にはルータ231があり、ブロードキャストドメイン240にはルータ241とアプリケーションサーバ242がある。そして、ルータ231と241は互いに接続されている。
また、ルータ231と241はいずれもインターネット250に接続されている。インターネット250には、クライアントPC(Personal Computer)260も接続されている。
例えば、図1のコンピュータ100aは、ノードN21〜N25のうちのいずれか1つであってもよい。そして、図1のコンピュータ100bは、ノードN21〜N25のうちの他のいずれか1つであってもよい。
また、図1のコンピュータ110は、クライアントPC260であってもよい。もちろん、図3に関する説明と同様に、ノードN21〜N25自体も、図1のコンピュータ110と同様に、他のノードに対するクライアントとして動作することがある。
あるいは、アプリケーションサーバ242が、インターネット250とルータ241を介してクライアントPC260からの要求を受け付けてもよい。そして、アプリケーションサーバ242が提供するウェブアプリケーションのバックエンドとして、分散DBシステムが使われてもよい。
その場合、アプリケーションサーバ242は、クライアントPC260からの要求に応じて、DBアクセス要求をいずれかのノードに送信することがある。つまり、図1のコンピュータ110は、アプリケーションサーバ242であってもよい。アプリケーションサーバ242は、ノードから受信したDBアクセス応答の内容に応じて、クライアントPC260に応答(例えばHTML(Hypertext Markup Language)で記述されたページ)を返してもよい。
続いて、本実施形態のノードとクライアントの構成について図5〜7を参照して説明する。
図5は、ノードのブロック構成図である。本実施形態では、図1のコンピュータ100aおよび100b、図2のノードN1〜N5、図3のノードN11〜N18、ならびに図4のノードN21〜N25は、いずれも、図5のノード300のように構成される。
ノード300は、ローカルストア310とネットワークインタフェイス320と通信処理部330を有する。また、通信処理部330はARPテーブル331とインタフェイス設定ファイル332を保持する。さらに、ノード300は、対応表340を保持する。
そして、ノード300は、ノード300が担当するキー領域ごとに、1つのキー領域管理部を有する。換言すれば、ノード300は、ノード300が担当する通信端点ごとに、1つのキー領域管理部を有する。より詳しくは、ノード300は、ネットワークインタフェイス320に動的に割り当てられたIPアドレスごとに、1つのキー領域管理部を有する。
図5の例では説明の便宜上、ノード300が3つの通信端点情報に対応する3つのキー領域を担当するものとする。よって、ノード300は、3つのキー領域管理部350a〜350cを有する。
キー領域管理部350a〜350cは同様の構成なので、図5にはキー領域管理部350aのみ、内部の詳細を図示してある。具体的には、キー領域管理部350aは、リード・ライト処理部351と、取得制御部352と、供給制御部353と、対応づけ部354と、監視依頼部355を有する。そして、監視依頼部355は依頼ノードリスト356を保持する。
また、ノード300は、監視部360も有する。監視部360は対象ノードリスト361を保持する。
以上のノード300内の各ブロックについて詳しく説明すれば、以下のとおりである。なお、以下では特に断らない限り、層に関する言及は、RFC(Request for Comments)1122と同様に、リンク層、インターネット層、トランスポート層、およびアプリケーション層の4層からなるモデルに基づく。
ローカルストア310は、ノード300が担当する1つ以上のキー領域に対応するエントリを記憶する。つまり、ローカルストア310は、図1の記憶装置101aと101bに対応する。ローカルストア310は、好ましくはRAMであるが、ハードディスク装置などの二次記憶装置であってもよい。
ネットワークインタフェイス320は、図1のネットワークインタフェイスIaやIbと同様である。つまり、ネットワークインタフェイス320は、リンク層の処理を行う。そして、ノード300は、ネットワークインタフェイス320と通信処理部330を介して他の装置と通信する。
通信処理部330は、OSの一部を使って実現されてもよく、例えば、TCP/IPプロトコルスタックの標準ライブラリを使って実装されていてもよい。通信処理部330を実現するために、さらにイーサネットドライバが利用されてもよい。つまり、通信処理部330は、トランスポート層およびインターネット層の処理を行うとともに、インターネット層とリンク層のインタフェイス処理も行う。
以下では説明の便宜上、「通信処理部330とネットワークインタフェイス320を介した通信は、TCP/IPプロトコルスイートによる通信であり、リンク層ではイーサネットが使われる」と仮定する。
そして、通信処理部330は、上記のようにTCP/IPプロトコルスイートによる通信の基盤を提供するだけでなく、他の装置から受信したメッセージを適宜のモジュールに振り分ける。つまり、通信処理部330は、振り分け処理というアプリケーション層の処理も行う。
ここで、他の装置からノード300が受信するメッセージには、例えば以下の(2−1)〜(2−6)のようなものがある。
(2−1)リード・ライト処理部351が処理する対象のDBアクセス要求
(2−2)取得制御部352が処理する対象のDBアクセス応答
(2−3)供給制御部353が処理する対象のDBアクセス要求
(2−4)監視依頼部355に対する監視用の生存確認メッセージ
(2−5)監視部360に対する監視依頼
(2−6)監視部360に対するACK(acknowledgement)
通信処理部330は、受信したメッセージのヘッダに指定されたタイプに応じて、上記(2−1)〜(2−6)の違いを判別してメッセージを適宜のブロックに振り分けてもよい。例えば、タイプがACKを表していれば、通信処理部330は、受信したメッセージを監視部360に出力する。
また、DBアクセス要求の中には、例えば、DBからのデータの読み出しを求めるリード要求と、DBへのデータの書き込みを求めるライト要求がある。
そして、本実施形態では、あるキー領域に対応する全エントリのコピーを求めるコピー要求も、DBアクセス要求の1つである。また、あるキー領域(より詳しくは、当該キー領域に対応する通信端点)を要求の宛先のノードから引き継ぐために、当該キー領域に対応する全エントリのデータを求める引き継ぎ要求も、DBアクセス要求の1つである。なお、コピー要求は、要求の宛先のノードから通信端点を引き継ぐことなく、単にエントリのコピーのみを求めるための要求である。
詳しくは後述するが、コピー要求と引き継ぎ要求は、あるキー領域を担当するノードが変更されるときに使われる。そして、上記(2−2)のDBアクセス応答は、具体的には、コピー要求または引き継ぎ要求に対する応答(以下、それぞれ「コピー応答」と「引き継ぎ応答」という)である。
なお、図1に示したように、リード要求とライト要求にはキーが指定される。また、コピー要求と引き継ぎ要求には、キー領域を識別可能な情報(例えば、式(1)〜(6)および(8)における添え字jのような、キー領域を識別するインデックス、または、キー領域に静的に対応づけられている通信端点情報)が指定される。
ところで、あるキーが指定されたリード要求またはライト要求の宛先IPアドレスと宛先ポート番号は、指定されたキーが属するキー領域に対応する通信端点を識別する、IPアドレスとポート番号のペアである。同様に、あるキー領域が指定されたコピー要求または引き継ぎ要求の宛先IPアドレスと宛先ポート番号は、指定されたキー領域に対応する通信端点を識別する、IPアドレスとポート番号のペアである。
そして、キー領域管理部350a〜350cはそれぞれ異なる通信端点情報に対応する。例えば、キー領域管理部350aは、キー領域管理部350aに対応する通信端点情報(具体的にはIPアドレスとポート番号のペア)で識別される通信端点を指定して通信処理部330の機能を呼び出すことで、TCPソケットを初期化してもよい。また、詳しくは後述するように、監視部360は、いずれのキー領域とも対応づけられない固定的なIPアドレスを利用する。
したがって、通信処理部330は、受信した(2−1)〜(2−6)のメッセージを、宛先IPアドレスと宛先ポート番号に応じて、キー領域管理部350a〜350cのいずれか適切な1つへ、あるいは監視部360へ、振り分けることができる。
また、通信処理部330は、受信したDBアクセス要求のサブタイプを判別してもよい。サブタイプがリード要求またはライト要求の場合には、通信処理部330は、宛先IPアドレスに対応するキー領域管理部内のリード・ライト処理部351に、リード要求またはライト要求を出力する。また、サブタイプがコピー要求または引き継ぎ要求の場合は、通信処理部330は、宛先IPアドレスに対応するキー領域管理部内の供給制御部353に、コピー要求または引き継ぎ要求を出力する。
その結果、例えばキー領域管理部350aに対応するキー領域に属するキーが指定されたリード要求またはライト要求は、キー領域管理部350a内のリード・ライト処理部351に出力される。同様に、キー領域管理部350aに対応するキー領域が指定されたコピー要求または引き継ぎ要求は、キー領域管理部350a内の供給制御部353に出力される。
また、通信処理部330は、ARPテーブル331とインタフェイス設定ファイル332を有する。
ARPテーブル331は、図1の動的対応づけ情報112として使われる。ARPテーブル331は、他の装置のIPアドレスごとにエントリ(以下「ARPエントリ」ともいう)を有する。そして、各ARPエントリは、IPアドレスと、当該IPアドレスが割り当てられたネットワークインタフェイスを識別するMACアドレスとを対応づける。
インタフェイス設定ファイル332は、ノード300自体のネットワークインタフェイス320を識別するMACアドレスと、ネットワークインタフェイス320に割り当てられているIPアドレスを対応づける。IPエリアシング機能により、1つのネットワークインタフェイス320には複数のIPアドレスが対応づけられる場合がある。インタフェイス設定ファイル332は、例えば、OSによって決められた「/etc/sysconfig/network-scripts/ifcfg-eth0」などの所定のパスにある設定ファイルである。
対応表340は、図1の静的対応づけ情報111の具体例である。対応表340の詳細なデータ例は図8とともに後述する。また、対応表340は、キー領域管理部350a〜350cと監視部360のいずれからも参照可能である。
キー領域管理部350a〜350cは、例えば、別々のスレッドまたは別々のプロセスにより実現されてもよい。キー領域管理部350a〜350cは、アプリケーション層で動作する。キー領域管理部350a内の各部の動作は以下のとおりである。
リード・ライト処理部351は、ネットワークインタフェイス320と通信処理部330を介して他の装置からDBアクセス要求を受信し、DBアクセス要求にしたがってローカルストア310にアクセスする。そして、リード・ライト処理部351は、DBアクセスの結果を、DBアクセス応答として、通信処理部330とネットワークインタフェイス320を介して、DBアクセス要求の送信元の装置に返す。
なお、上記のとおり通信処理部330が振り分け処理を行うので、キー領域管理部350a内のリード・ライト処理部351が処理するのは、キー領域管理部350aに対応するキー領域に属するキーが指定されたリード要求またはライト要求のみである。
受信したDBアクセス要求がリード要求の場合、リード・ライト処理部351は、ローカルストア310に記憶されているエントリの内容を読み出す。また、受信したDBアクセス要求がライト要求の場合、リード・ライト処理部351は、DBアクセス要求にしたがって、ローカルストア310にへの書き込み操作(例えば、新規エントリの作成または既存エントリの書き換え)を行う。そして、リード・ライト処理部351は、読み出し操作または書き込み操作の結果をDBアクセス応答として返す。
さて、取得制御部352は、通信処理部330とネットワークインタフェイス320を介してコピー要求または引き継ぎ要求を他のノードに送信する。そして、取得制御部352は、通信処理部330とネットワークインタフェイス320を介して、他のノードから、コピー要求または引き継ぎ要求に対する応答として、あるキー領域に対応する分散DB内の全エントリを取得する。そして、取得制御部352は、取得した全エントリをローカルストア310に追加する。
例えば、ノード300が新たにあるキー領域Kjを担当することに決まると、ノード300はキー領域Kjに対応する新たなキー領域管理部のスレッドを生成してもよい。説明の便宜上、キー領域管理部350aのスレッドが新たに生成されたとする。すると、キー領域管理部350aの取得制御部352が、キー領域Kjを指定したコピー要求または引き継ぎ要求を送信し、キー領域Kjに対応する全エントリを取得し、取得した全エントリをローカルストア310に追加する。
供給制御部353は、逆に、他のノードからのコピー要求または引き継ぎ要求に応答して、他のノードにDBのエントリのコピーを供給する。すなわち、供給制御部353は、ネットワークインタフェイス320と通信処理部330を介してコピー要求または引き継ぎ要求を受信する。そして、供給制御部353は、コピー要求または引き継ぎ要求に指定されたキー領域に対応する全エントリをローカルストア310から読み出す。さらに、供給制御部353は、読み出した全エントリを、通信処理部330とネットワークインタフェイス320を介して、コピー要求または引き継ぎ要求の送信元のノードに送信する。
また、対応づけ部354は、インタフェイス設定ファイル332を更新するための処理を行う。つまり、対応づけ部354はインタフェイス設定ファイル332を直接書き換えるか、または、インタフェイス設定ファイル332を書き換えるように通信処理部330に命じる。
ノード300が新たなキー領域を担当することになった場合、またはノード300が今まで担当していたキー領域を担当しなくなる場合に、ネットワークインタフェイス320と通信端点の対応関係は変化する。そこで、ネットワークインタフェイス320と通信端点の対応関係が変化する場合に、対応づけ部354は、インタフェイス設定ファイル332の更新するための処理を行う。その結果、対応関係の変化がインタフェイス設定ファイル332に反映される。
具体的には、ノード300が新たなキー領域を担当することになると、取得制御部352が、当該新たなキー領域に対応する通信端点情報に含まれるIPアドレスを、対応づけ部354に指示する。すると、対応づけ部354は、取得制御部352から指示されたIPアドレスをネットワークインタフェイス320のMACアドレスと対応づけるように、インタフェイス設定ファイル332を更新する。インタフェイス設定ファイル332の更新は、対応づけ部354により直接的に行われてもよいし、通信処理部330を介して間接的に行われてもよい。
また、供給制御部353は、引き継ぎ要求に応答した後に、供給制御部353を含むキー領域管理部に対応するIPアドレスの、ネットワークインタフェイス320への対応づけを解除するよう、対応づけ部354に指示する。すると、対応づけ部354は、供給制御部353から指示されたIPアドレスと、ネットワークインタフェイス320のMACアドレスとの対応づけを解除するように、インタフェイス設定ファイル332を更新する。インタフェイス設定ファイル332の更新は、対応づけ部354により直接的に行われてもよいし、通信処理部330を介して間接的に行われてもよい。
以上のようにして、対応づけ部354は、取得制御部352または供給制御部353からの指示にしたがって、直接的または間接的にインタフェイス設定ファイル332を更新する。つまり、対応づけ部354は、ネットワークインタフェイス320と通信端点との対応づけを更新するための制御を行う。
ところで、本実施形態では、ノード間での死活監視(alive monitoring)が行われる。監視依頼部355と監視部360は死活監視のためのモジュールである。また、監視部360もアプリケーション層で動作する。
具体的には、キー領域管理部350a内の監視依頼部355は、キー領域管理部350aに対応する通信端点を監視するよう、1台以上の他のノードに依頼する。監視依頼は、監視依頼部355から通信処理部330とネットワークインタフェイス320を介して送信される。
また、監視依頼部355は、監視依頼部355が監視を依頼した1台以上の他のノードをそれぞれ識別する情報を、依頼ノードリスト356に保持する。依頼ノードリスト356の具体例は図8とともに後述する。
他方、監視部360は、他のノードから、ネットワークインタフェイス320と通信処理部330を介して監視依頼を受信する。監視依頼には、監視対象の通信端点を識別する通信端点情報(例えばIPアドレスとポート番号のペア)が含まれる。つまり、監視依頼には、監視を依頼するノードが担当するキー領域に静的に対応づけられている通信端点を識別する通信端点情報が含まれる。
監視部360は、監視依頼を受信すると、監視対象の通信端点を識別する通信端点情報を対象ノードリスト361に登録する。そして、監視部360は、監視依頼にしたがって、監視対象の通信端点宛に、通信処理部330とネットワークインタフェイス320を介して監視用の制御メッセージである生存確認メッセージを送信する。生存確認メッセージの送信は、適宜の間隔をおいて繰り返し行われる。
監視部360は、生存確認メッセージを送信するたびに、「生存確認メッセージに対する応答(つまりACK)が所定時間以内にネットワークインタフェイス320と通信処理部330を介して受信されるか否か」を監視する。そして、もしACKが所定時間以内に受信されない場合は、監視部360は、「監視対象のノードに障害が発生した」と認識する。
監視部360は、「監視対象のノードに障害が発生した」と認識すると、「監視対象の通信端点に対応するキー領域を、ノード300が新たに担当する」と決定する。そして、監視部360は、当該キー領域に対応する新たなキー領域管理部のスレッドを生成する。
説明の便宜上、例えば、監視対象の通信端点にはキー領域Kjが対応し、キー領域Kjに対応してキー領域管理部350aのスレッドが新たに生成されたとする。すると、監視部360は、キー領域管理部350aの取得制御部352に、ノード300が新たにあるキー領域Kjを担当することに決まったことを通知する。通知を受けた取得制御部352は、上記のとおり、コピー要求または引き継ぎ要求を送信するとともに、キー領域Kjに対応する通信端点情報に含まれるIPアドレスを対応づけ部354に通知する。
さて、図6は、クライアントのブロック構成図である。例えば、図1のコンピュータ110は、複数のノードのうちの1つであってもよいが、図6のクライアント400のように構成されていてもよい。また、図2のクライアントCも、複数のノードのうちの1つであってもよいが、図6のクライアント400のように構成されていてもよい。図3のクライアント202および220、ならびに図4のアプリケーションサーバ242およびクライアントPC260は、本実施形態では図6のクライアント400のように構成される。
クライアント400は、ネットワークインタフェイス410と通信処理部420を有し、通信処理部420はARPテーブル421を保持する。さらに、クライアント400は、DB要求処理部430を有し、DB要求処理部430は対応表431を保持する。また、クライアント400はアプリケーション440を実行する。
ネットワークインタフェイス410は、図1のネットワークインタフェイスIaやIbと同様である。つまり、ネットワークインタフェイス410は、リンク層の処理を行う。そして、クライアント400は、ネットワークインタフェイス410と通信処理部420を介して他の装置と通信する。
通信処理部420は、OSの一部であってもよく、例えば、TCP/IPプロトコルスタックの標準ライブラリにより実装されていてもよい。通信処理部420を実現するために、さらにイーサネットドライバが利用されてもよい。つまり、通信処理部420は、トランスポート層およびインターネット層の処理を行うとともに、インターネット層とリンク層のインタフェイス処理も行う。
以下では説明の便宜上、「通信処理部420とネットワークインタフェイス410を介した通信は、TCP/IPプロトコルスイートによる通信であり、リンク層ではイーサネットが使われる」と仮定する。
また、ARPテーブル421は、図1の動的対応づけ情報112として使われる。ARPテーブル421は、他の装置のネットワークインタフェイスごとにエントリを有し、各エントリはIPアドレスとMACアドレスを対応づける。
DB要求処理部430は、例えば、DBアクセスのインタフェイスをアプリケーション440に提供するための、ライブラリまたはミドルウェアとして実装されてもよい。DB要求処理部430とアプリケーション440はアプリケーション層で動作する。
DB要求処理部430は、アプリケーション440からDBアクセス要求を受け取り、通信処理部420とネットワークインタフェイス410を介してDBアクセス要求を送信する。そして、DB要求処理部430は、DBアクセス要求に対するDBアクセス応答を、ネットワークインタフェイス410と通信処理部420を介して受信し、DBアクセス応答の内容をアプリケーション440に返す。
なお、対応表431は図1の静的対応づけ情報111の具体例であり、図5の対応表340と同じである。DB要求処理部430は、DBアクセス要求の宛先を決めるのに対応表431を利用する。
具体的には、DB要求処理部430は、アプリケーション440から受け取ったDBアクセス要求に指定されているキーが属するキー領域に基づいて対応表431を参照することで、通信端点情報を取得する。例えば、通信端点情報がIPアドレスとポート番号のペアで表される場合、DB要求処理部430は、取得したIPアドレスを宛先IPアドレスとして設定し、取得したポート番号を宛先ポート番号として設定したパケットを、DBアクセス要求として送信する。
なお、アプリケーション440は、分散DB内のデータを利用する任意のアプリケーションであってよい。
図7は、コンピュータのハードウェア構成図である。例えば、下記(3−1)〜(3−6)の各装置は、具体的には図7のコンピュータ500により実現されていてもよい。
(3−1)図1のコンピュータ100a、100b、および110
(3−2)図2のノードN1〜N5、およびクライアントC
(3−3)図3のノードN11〜N18、デプロイサーバ201、クライアント202、およびクライアント220
(3−4)図4のノードN21〜N25、アプリケーションサーバ242、およびクライアントPC260
(3−5)図5のノード300
(3−6)図6のクライアント400
さて、図7のコンピュータ500は、CPU(Central Processing Unit)501と、ROM(Read Only Memory)502と、RAM503と、ネットワークインタフェイス504を有する。コンピュータ500はさらに、入力装置505と、出力装置506と、記憶装置507と、可搬型記憶媒体510の駆動装置508を有する。そして、コンピュータ500の上記各部は、バス509で互いに接続されている。
CPU501は、プログラムをRAM503にロードし、RAM503をワークエリアとして用いながら、プログラムを実行する。実施形態によっては、汎用的なCPU501の代わりに(あるいはCPU501と組み合わせて)、ASIC(Application Specific Integrated Circuit)などの専用のハードウェア回路が使われてもよい。なお、RAM503は、より具体的には、例えばDRAM(Dynamic Random Access Memory)である。
CPU501が実行するプログラムは、ROM502または記憶装置507に予め記憶されていてもよい。あるいは、プログラムは、ネットワークインタフェイス504を介してネットワークからダウンロードされ、記憶装置507にコピーされてもよい。
または、プログラムは、可搬型記憶媒体510に記憶されて提供され、駆動装置508により読み取られてもよい。駆動装置508により可搬型記憶媒体510から読み取られたプログラムは、直接RAM503にロードされてもよいし、一旦記憶装置507にコピーされて、記憶装置507からRAM503にロードされてもよい。
可搬型記憶媒体510としては、CD(Compact Disc)やDVD(Digital Versatile Disc)などの光ディスク、光磁気ディスク、磁気ディスク、不揮発性の半導体メモリカードなどが利用可能である。なお、ノードまたはクライアントは、駆動装置508を持たないコンピュータであってもよい。
また、ネットワークインタフェイス504は、ネットワークを介した通信を行うための通信インタフェイス装置である。ネットワークインタフェイス504は、オンボードのネットワークアダプタでもよいし、外付けのNICでもよい。ネットワークインタフェイス504は、例えば、有線LAN、無線LAN、またはその双方を介した通信機能を提供する。ネットワークインタフェイス504は、例えば、ハードウェア回路(いわゆる「PHYチップ」および「MACチップ」と呼ばれる回路など)を含む。
なお、図7には1つのネットワークインタフェイス504のみが図示されているが、コンピュータ500が複数のネットワークインタフェイス504を有してもよい。例えば、2つのネットワークインタフェイス504を有するコンピュータ500がノードとして使われてもよい。そして、2つのネットワークインタフェイス504のそれぞれに、動的に1つまたは複数のIPアドレスが割り当てられてもよい。
入力装置505は、例えば、キーボード、マウスやタッチスクリーンなどのポインティングデバイス、マイク、またはそれらの組み合わせである。出力装置506は、例えば、ディスプレイ、スピーカ、またはそれらの組み合わせである。ディスプレイは、タッチスクリーンであってもよい。なお、入力装置505と出力装置506はなくてもよい。例えばコンピュータ500がノードとして使われ、ノードに対する管理者の作業がデプロイサーバ201のコンソールを介して行われる場合などは、入力装置505と出力装置506はなくてもよい。
記憶装置507は、不揮発性の記憶装置であり、例えば、フラッシュメモリなどの半導体メモリ、ハードディスク装置、またはそれらの組み合わせである。なお、ROM502、RAM503、記憶装置507、および可搬型記憶媒体510は、いずれも、コンピュータ読み取り可能な記憶媒体の例である。これらのコンピュータ読み取り可能な記憶媒体は、有形の(tangible)記憶媒体であり、信号搬送波のような一時的な(transitory)媒体ではない。
ところで、コンピュータ500が図5のノード300として使われる場合、図5の各ブロックは、図7のハードウェアにより、例えば以下のようにして実現される。
ローカルストア310は、RAM503であることが好ましいが、記憶装置507であってもよい。ネットワークインタフェイス320は、ネットワークインタフェイス504であってもよい。通信処理部330は、プログラムを実行するCPU501と、ARPテーブル331を保持するRAM503と、インタフェイス設定ファイル332を保持する記憶装置507により実現されてもよい。対応表340は、ROM502または記憶装置507に予め記憶され、RAM503に読み出されて保持されてもよい。
キー領域管理部350a〜350cのそれぞれは、CPU501とRAM503により実現されてもよい。つまり、リード・ライト処理部351、取得制御部352、供給制御部353、対応づけ部354はプログラムを実行するCPU501により実現されてもよい。そして、監視依頼部355は、プログラムを実行するCPU501と、依頼ノードリスト356を保持するRAM503により実現されてもよい。
また、監視部360も、プログラムを実行するCPU501と、対象ノードリスト361を保持するRAM503により実現されてもよい。
そして、コンピュータ500が図6のクライアント400として使われる場合、図6の各ブロックは、図7のハードウェアにより、例えば以下のようにして実現される。
ネットワークインタフェイス410は、ネットワークインタフェイス504であってもよい。通信処理部420は、プログラムを実行するCPU501と、ARPテーブル421を保持するRAM503により実現されてもよい。
対応表431は、ROM502または記憶装置507に予め記憶され、RAM503に読み出されて保持されてもよい。そして、DB要求処理部430は、プログラムを実行するCPU501と対応表431を保持するRAM503により実現されてもよい。
なお、アプリケーション440は、CPU501により実行されてもよい。
続いて、本実施形態の分散DBシステムで使われる各種データについて説明する。図8は、各種データの例を示す図である。
対応表601は、図1の静的対応づけ情報111の具体例である。図5の対応表340と図6の対応表431は、具体的には図8の対応表601のとおりであってもよい。
対応表601の各エントリは1つのキー領域に対応する。各エントリは、「キー領域のインデックス」、「第1通信端点」、「第2通信端点」、および「第3通信端点」というフィールドを有する。
対応表601は、キーの定義域Kが図2の例のように16個のキー領域K0〜K15に分割される場合(すなわちM=16の場合)の例である。したがって、対応表601に例示されているキー領域のインデックスは0〜15である。例えば、キー領域のインデックスがj(0≦j≦15)のエントリは、キー領域Kjに対応する。
また、本実施形態では、1つのキー領域Kjに対応する同じデータを3台のノードが保持する。そのため、対応表601の各エントリは、3台のノードそれぞれにおいてキー領域Kjに対応する通信端点情報を示す「第1通信端点」〜「第3通信端点」というフィールドを有する。なお、1つのキー領域Kjに対応する同じデータを3台のノードが保持する理由は、以下のとおりである。
仮に、あるキー領域Kjに対応するエントリを1台のノードしか保持していないとすると、当該ノードが故障した場合、キー領域Kjに対応するエントリが消滅してしまうおそれがあり、望ましくない。よって、キー領域Kjに対応するエントリを2台以上のノードが保持することが望ましい。
また、キー領域Kjに対応するエントリが2台のノードにしか保持されていない場合、二次障害のおそれがある。二次障害に対する耐故障性を分散DBシステム全体として高めるため、本実施形態では、キー領域Kjに対応するエントリを3台のノードが保持する。
例えば、ノードN1とN2がキー領域Kjに対応するエントリを保持しているとして、ある時点でノードN1が故障したとする。ノードN1の故障にともなうフェイルオーバにより、例えば、ノードN3が新たにキー領域Kjに対応するエントリを保持してもよい。この場合、ノードN3は、故障したノードN1からはキー領域Kjに対応するエントリを取得することができないので、正常なノードN2からキー領域Kjに対応するエントリを取得しようとする。
しかし、例えば、ノードN1とN2のハードウェアが同時期にリリースされた同じものである場合、ノードN1とN2の耐用年数は同じである。そのため、ノードN1が故障しやすくなる頃には、ノードN2も故障しやすくなっていると考えられる。そして、キー領域Kjに対応する全エントリをノードN3に送信する処理の負荷は、DBの規模が大きければ、決して小さくはない。つまり、耐用期限間近のノードN2に、フェイルオーバのための処理による高負荷がかかるおそれがある。その結果、「フェイルオーバが完了しないうちにノードN2も故障してしまう」という二次障害が起こりかねない。
そこで、本実施形態では、1つのキー領域Kjに対応する同じデータを3台のノードが保持する。例えば、3台のノードN1とN2とN4が同じキー領域Kjに対応するエントリを保持していれば、上記のような「ノードN1の故障にともなうフェイルオーバの途中でノードN2も故障する」という二次障害が起きても、ほとんどの場合回復可能である。
なぜなら、ノードN1とN2とN4の3台がほぼ同時に故障することはほとんどないからである。つまり、たとえ二次障害が起きても、ほとんどの場合においてノードN4は正常である。したがって、ノードN3は、キー領域Kjに対応する全エントリをノードN4から取得することができ、フェイルオーバを完了することができる。
また、ノードN1からノードN3へのフェイルオーバと同様にして、ノードN2からノードN5へのフェイルオーバも可能である。または、ノードN5は、フェイルオーバ完了後のノードN3から、キー領域Kjに対応する全エントリを取得してもよい。
いずれにせよ、分散DBシステム全体は、「同じキー領域Kjに対応するエントリを3台のノード(具体的にはN3とN4とN5)が保持している」という状態へと回復する。このように、1つのキー領域Kjに対応する同じデータを3台のノードが保持することで、優れた耐故障性が実現される。
例えば、図8の対応表601の例では、キー領域のインデックスが1のエントリにおいて、第1通信端点は「192.168.254.1:7000」というIPアドレスとポート番号のペアで識別される。また、第2通信端点は「192.168.254.17:7000」というIPアドレスとポート番号のペアで識別され、第3通信端点は「192.168.254.33:7000」というIPアドレスとポート番号のペアで識別される。つまり、上記エントリは、次の(4−1)〜(4−3)のことを示す。
(4−1)キー領域K1に対応するエントリを保持する1台目のノードは、「192.168.254.1:7000」という通信端点情報で論理的に識別されるノードである。
(4−2)キー領域K1に対応するエントリを保持する2台目のノードは、「192.168.254.17:7000」という通信端点情報で論理的に識別されるノードである。
(4−3)キー領域K1に対応するエントリを保持する3台目のノードは、「192.168.254.33:7000」という通信端点情報で論理的に識別されるノードである。
ところで、同じキー領域K1に対応するエントリを保持する3台のノードの間には、優先順位があってもよいし、なくてもよい。本実施形態では、「第1通信端点」フィールドの通信端点情報で識別される通信端点のノードが最高の優先度であり、「第3通信端点」フィールドの通信端点情報で識別される通信端点のノードが最低の優先度であるものとする。後述の図11のフローチャートでは、上記優先度にしたがって、第1通信端点から順にアクセスされる。
なお、対応表601の例は、図3のように1つのブロードキャストドメインに全ノードが属し、かつ、クライアントも同じブロードキャストドメインに属する場合の例である。よって、対応表601中の通信端点情報に含まれるIPアドレスは、プライベートIPアドレスである。しかし、もちろん実施形態によっては、通信端点を識別するのにグローバルIPアドレスが使われてもよい。
また、対応表601の例では、48(=3×16)個の通信端点情報それぞれのポート番号はすべて同じ「7000」という値である。しかし、実施形態によっては、48個の通信端点情報の中で、p個(2≦p≦48)の異なるポート番号が使われてもよい。
あるいは、対応表601のようにポート番号が定数の場合は、対応表601が保持する通信端点情報は、IPアドレスのみで表されてもよい。たとえIPアドレスしか対応表601に記憶されていなくても、ポート番号が定数の場合は、IPアドレスと定数のポート番号のペアにより通信端点を一意に識別することができる。
さて、ARPテーブル602は、図1の動的対応づけ情報112の具体例である。そして、図5のARPテーブル331と図6のARPテーブル421は、ともにARPテーブル602のような形式のテーブルである。ARPテーブル602の各エントリは、IPアドレスとMACアドレスを対応づける。
また、図8では省略されているが、エージングのために、各エントリには、寿命(lifetime)をカウントダウンするカウンタ、または、エントリの最終更新時刻が対応づけられている。例えば、ARPテーブル602の各エントリは、所定時間(例えば2分間)の間に1回も使用されない場合は消去される。そして、エントリが使用(つまり参照または更新)されると、カウンタが所定時間に再設定されるか、または最終更新時刻に現在時刻が再設定される。
さらに、ARPテーブル602の各エントリは、使用されるか否かによらず、最長でも所定時間(例えば10分間)しか保持されなくてもよい。つまり、各エントリには、最長保持時間までの寿命をカウントダウンするカウンタ、または、エントリの作成時刻がさらに対応づけられていてもよい。
例えば、図8の1つ目のエントリでは、「192.168.254.1」というIPアドレスと「00-23−26−6A−C2−4C」というMACアドレスが対応づけられている。したがって、対応表601を考慮に入れると、この1つ目のエントリは、「00-23−26−6A−C2−4C」というMACアドレスで識別されるネットワークインタフェイス320を持つノード300が現在キー領域K1を担当していることを示している。
ところで、複数のノードそれぞれの記憶装置に分散して記憶される分散DBは、RDBとKVSのどちらでもよいが、説明の便宜上、本実施形態の分散DBはKVSであるとする。図8のKVS603は、分散DBであるKVSの全ノードのうち、ある1つのキー領域に対応して、ある1つのノード300がローカルストア310に記憶するエントリを抜粋して示したものである。
KVS603の各エントリは、キーとバリューのペアであり、図8には2つのエントリが例示されている。1番目のエントリにおいて、キーは「def」であり、バリューは「DEF」である。また、2番目のエントリにおいて、キーは「ghi」であり、バリューは「GHI」である。
また、図8の対象ノードリスト604は、図5の対象ノードリスト361の具体例である。つまり、対象ノードリスト604の各要素は、ノード300の監視部360が監視する対象のノードを識別する情報であり、具体的には、監視対象の通信端点を識別する通信端点情報である。
図8には、対象ノードリスト604の要素として、「192.168.254.9:7000」と「192.168.254.23:7000」が例示されている。よって、対応表601を考慮に入れると、対象ノードリスト604は以下のことを示す。すなわち、図8の対象ノードリスト604を対象ノードリスト361として保持する監視部360は、キー領域K9を担当する1台目のノードと、キー領域K7を担当する2台目のノードを監視している。
また、図8の依頼ノードリスト605は、図5の依頼ノードリスト356の具体例である。つまり、依頼ノードリスト605の各要素は、監視依頼部355がノード300の通信端点を監視するよう依頼した先の他のノードを識別する情報であり、より具体的には通信端点を識別する通信端点情報である。
なお、本実施形態では、各ノードに、動的に割り当てが変化するIPアドレス(すなわち対応表601に現れるIPアドレス)のほかに、保守用の固定的なIPアドレスが割り当てられる。例えば、分散DBシステムが図3のように8台のノードを含む場合、対応表601には現れない「192.168.254.128」〜「192.168.254.135」の8個の固定IPアドレスが使われてもよい。
図8には、依頼ノードリスト605の要素として、「192.168.254.128」と「192.168.254.133」というIPアドレスが例示されている。つまり、依頼ノードリスト605は、監視依頼部355が監視を依頼したノードの中に、「192.168.254.128」と「192.168.254.133」というIPアドレスがそれぞれ固定的に割り当てられた2台のノードが含まれることを示す。なお、依頼ノードリスト605の要素として、IPアドレスの代わりにIPアドレスとポート番号のペアが使われてもよい。
また、フレーム606は、本実施形態においてDBアクセス要求やDBアクセス応答などのために使われるフレームの例である。フレーム606は、より具体的にはイーサネットフレームである。
フレーム606は、MACヘッダと、フレームペイロードと、誤り検出用のFCS(Frame Check Sequence)を含む。そして、フレームペイロードはIPデータグラムを含み、IPデータグラムはIPヘッダとIPペイロードを含む。
また、図8ので例では、IPペイロードは、TCPセグメントを含む。実施形態によっては、IPペイロードは、UDPセグメントなど、トランスポート層におけるTCP以外のプロトコルのPDU(Protocol Data Unit)を含んでもよい。
TCPセグメントは、TCPヘッダとTCPペイロードを含む。そして、TCPペイロードは、アプリケーション層のPDUを含む。
本実施形態では、「アプリケーション層のPDU」とは、具体的には、分散DBシステムのためのDBアプリケーションにおいて、ノード間の通信またはノードとクライアントの間の通信に使われるPDUである。なお、DBアプリケーションは、具体的には、以下の(5−1)と(5−2)の部分に相当する。
(5−1)図5のノード300においては、対応表340、キー領域管理部350a〜350c、監視部360の部分
(5−2)図6のクライアント400においては、アプリケーション440とDB要求処理部430の部分
以下では説明の便宜上、アプリケーション層のPDUを「DBパケット」という。DBパケットは、ヘッダとペイロードを含む。以下では説明の便宜上、DBパケットのヘッダおよびペイロードを、それぞれ「DBヘッダ」および「DBペイロード」という。
例えば、DBヘッダは、タイプやサブタイプなどのフィールドを含んでもよく、さらに、DBアクセス要求などの要求ごとに割り当てられる識別番号のフィールドを含んでもよい。そして、ある要求に対する応答のDBヘッダには、当該要求の識別番号が設定されてもよい。すると、要求の送信元の装置は、受信した応答がどの要求に対する応答なのかを判別することができる。また、フレーム606が図1のDBアクセス要求120aのためのフレームである場合、DBペイロードは、図1のキーと要求内容のフィールドを含む。
以上説明したとおり、フレーム606の中には上位層のPDUがカプセル化されて含まれている。したがって、フレーム606は、具体的には図8に示したとおり、MACヘッダ、IPヘッダ、TCPヘッダ、DBヘッダ、DBペイロード、およびFCSが、この記載順に並んだ形式である。
もちろん、DBペイロードが長い場合には、IPフラグメンテーションにより、1つのDBパケットが複数のIPデータグラムに分割されて複数のフレームが送信されることもある。しかし、図8では説明の簡略化のため、分割されていないフレーム606を例示した。
なお、MACヘッダ、IPヘッダ、TCPヘッダの詳細は周知である。よって、MACヘッダ、IPヘッダ、TCPヘッダについては、詳しい説明を省略するが、本実施形態に関連する点を説明すると、以下のとおりである。
MACヘッダは、送信元MACアドレスと宛先MACアドレスを含む。また、IPヘッダは、送信元IPアドレスと宛先IPアドレスを含む。そして、TCPヘッダは、送信元ポート番号と宛先ポート番号を含む。なお、実施形態によってはTCPの代わりにUDPが使われてもよいが、UDPヘッダも同様に、送信元ポート番号と宛先ポート番号を含む。
ここで、DBパケットの宛先の通信端点は、宛先IPアドレスと宛先ポート番号のペアにより識別される。例えば、フレーム606が図1のDBアクセス要求120aのためのフレームである場合、DBアクセス要求120aの通信端点は、具体的には、IPヘッダ内の宛先IPアドレスフィールドと、TCPヘッダ内の宛先ポート番号フィールドにより表される。
また、説明の簡単化のため、全ノードとクライアントが同じブロードキャストドメインに属すると仮定する。すると、宛先MACアドレスは、ARPによるアドレス解決によって宛先IPアドレスから取得された値であり、送信元MACアドレスは、フレーム606の送信元のネットワークインタフェイスを識別するMACアドレスである。逆に、フレーム606が1つ以上のルータにより中継される場合、MACヘッダは各ルータにおいて書き換えられる。
なお、送信元ポート番号は、DBアプリケーションにより決められる。また、送信元IPアドレスは、フレーム606の送信元のネットワークインタフェイスに割り当てられている1つまたは複数のIPアドレスのうちの1つである。
続いて、図9〜16のフローチャートを参照して、分散DBシステムに含まれる個々の装置が行う処理について説明する。
具体的には、ノード300とクライアント400に共通する、ARPに関連する処理について図9〜10とともに説明する。本実施形態ではARPテーブルが図1の動的対応づけ情報112として使われるので、図9〜10の処理は、動的対応づけ情報112の動的な更新に関連する。その後、図11〜12を参照して、クライアント400が行う処理について説明する。また、図13〜16を参照して、ノード300が行う処理について説明する。
図9は、メッセージ送信を指示されたときの、通信処理部とネットワークインタフェイスにおける、インターネット層とリンク層の動作フローチャートである。図9の処理は、ノード300とクライアント400で共通である。よって、図9に関する説明においては、「通信処理部330または420」、「ARPテーブル331または421」、「ネットワークインタフェイス320または410」などの表記を用いることがある。
なお、図9の処理は、後述の図11〜16内のいくつかのステップから呼び出される。例えば、以下の(6−1)〜(6−6)の場合などに図9の処理が行われる。
(6−1)通信処理部330が、リード・ライト処理部351から、リード要求またはライト要求に対する応答の送信を指示されたとき。
(6−2)通信処理部330が、取得制御部352から、コピー要求の送信、または引き継ぎ要求の送信を指示されたとき。
(6−3)通信処理部330が、供給制御部353から、コピー要求に対する応答の送信、または引継ぎ要求に対する応答の送信を指示されたとき。
(6−4)通信処理部330が、監視依頼部355から、監視依頼の送信、または生存確認メッセージに対するACKの送信を指示されたとき。
(6−5)通信処理部330が、監視部360から、監視用の生存確認メッセージの送信を指示されたとき。
(6−6)通信処理部420が、DB要求処理部430から、DBアクセス要求(具体的には、リード要求またはライト要求)の送信を指示されたとき。
さて、通信処理部330または420は、何らかのメッセージの送信を指示されると、ステップS101で、指定された宛先IPアドレスから転送先IPアドレス(forwarding IP address)を取得する。メッセージの例は、例えば上記のような、DBアクセス応答、監視依頼、生存確認メッセージ、DBアクセス要求、その他の制御用メッセージなどである。
例えば、図3のクライアント202がノードN11にメッセージを送信しようとしているとする。図3の例では、クライアント202とノードN11は同じブロードキャストドメイン200に属する。よって、ステップS101でクライアント202の通信処理部420は、宛先IPアドレス(すなわち、ノードN11が現在担当するキー領域に対応する通信端点のIPアドレス)そのものを、転送先IPアドレスとして取得する。
同じブロードキャストドメイン200に属するノード間の通信の場合も同様である。つまり、ノード300の通信処理部330は、宛先IPアドレスそのものを、転送先IPアドレスとしてステップS101で取得する。
逆に、図4のアプリケーションサーバ242が、クライアントとしてノードN21にメッセージを送信しようとしている場合は、転送先IPアドレスは宛先IPアドレスそのものではない。なぜなら、アプリケーションサーバ242とノードN21は異なるブロードキャストドメインに属するからである。
この場合、アプリケーションサーバ242の通信処理部420は、例えばサブネットマスクを用いることで「宛先IPアドレスは、アプリケーションサーバ242の属するブロードキャストドメイン240内のマシンのIPアドレスではない」と認識する。そして、アプリケーションサーバ242の通信処理部420は、同じブロードキャストドメイン240に属するルータ241のIPアドレスを、転送先IPアドレスとしてステップS101で取得する。
異なるブロードキャストドメイン230と240に属するノード間の通信の場合も同様である。例えば、ノードN22がノードN25に何らかのメッセージを送信しようとする場合、ノードN22の通信処理部330は、転送先IPアドレスとしてルータ231のIPアドレスをステップS101で取得する。
通信処理部330または420は、以上のようにして転送先IPアドレスを取得すると、次のステップS102で、転送先IPアドレスを持つエントリを、ARPテーブル331または421において検索する。
そして、ステップS103で通信処理部330または420は、ステップS102の検索の結果としてエントリが見つかったか否かを判断する。エントリが見つかった場合、通信処理部330または420は、見つかったエントリの寿命を所定の値(例えば2分など)に再設定し、その後、処理はステップS104に移行する。逆に、エントリが見つからなかった場合、処理はステップS105に移行する。
ステップS104で通信処理部330または420は、メッセージを送信するためのフレームを組み立てる。具体的には、通信処理部330または420は、送信するよう指定されたメッセージ、指定された宛先IPアドレス、見つかったエントリに登録されているMACアドレスなどに基づいて、フレームを組み立てる。指定された宛先IPアドレスは、IPヘッダの宛先IPアドレスフィールドに設定され、見つかったエントリに登録されているMACアドレスは、MACヘッダの宛先MACアドレスフィールドに設定される。
そして、通信処理部330または420は、ネットワークインタフェイス320または410を介して、フレームを送信する。そして、フレームが送信されると、図9の処理は正常終了する。
他方、ステップS105では、通信処理部330または420は、転送先IPアドレスをTPA(Target Protocol Address)として指定したARP要求を生成する。そして、通信処理部330または420は、ネットワークインタフェイス320または410を介して、生成したARP要求をブロードキャストする。
また、次のステップS106で通信処理部330または420は、所定時間(以下では「TO_arp」と表記する)以内に、ネットワークインタフェイス320または410を介してARP応答を受信したか否かを判断する。所定時間TO_arp以内にARP応答がなければ、通信処理部330または420は、メッセージ送信を指示した呼び出し元(caller)に対してエラーコードを返し、図9の処理は異常終了する。
逆に、所定時間TO_arp以内にARP応答が受信されれば、通信処理部330または420は、ステップS107において、受信したARP応答に基づいて、ARPテーブル331または421を更新する。すなわち、通信処理部330または420は、(7−1)のIPアドレスと(7−2)のMACアドレスを対応づける新たなエントリを、ARPテーブル331または421に追加する。
(7−1)受信したARP応答にSPA(Sender Protocol Address)として指定されているIPアドレス
(7−2)受信したARP応答にSHA(Sender Hardware Address)として指定されているMACアドレス
さらに、通信処理部330または420は、追加した新たなエントリの寿命を所定の値(例えば2分など)に設定する。
以上のようなARPテーブル331または421の更新後、処理はステップS102に戻る。ステップS107の後のステップS102の検索ではエントリが見つかるので、その後、ステップS104でフレームが送信される。なお、上記ステップS107でのARPテーブル331または421の更新は、図1の動的対応づけ情報112が更新される場合の一例である。
次に、図10を参照して、図9のステップS105で送信されたARP要求を受信する装置における処理について説明する。図10は、ARP応答のフローチャートである。図10の処理も、ノード300とクライアント400で共通である。
また、図10の処理は、イーサネットポートごとに(換言すればMACアドレスごとに)行われる。例えば、ノード300のネットワークインタフェイス320が2つのイーサネットポートを有する場合、2つのイーサネットポートのそれぞれについて、独立に図10の処理が行われる。便宜上、図10の説明においては、図10の処理の対象であるイーサネットポートのことを「注目イーサネットポート」という。
ステップS201で通信処理部330または420は、ネットワークインタフェイス320または410を介してARP要求を受信するまで待機する。
そして、ARP要求が受信されると、ステップS202で通信処理部330または420は、必要に応じてARPテーブル331または421を更新する。
具体的には、通信処理部330または420は、ARPテーブル331または421を検索して、ARP要求にSPAとして指定されているIPアドレスを持つエントリを探す。もしエントリが見つかれば、通信処理部330または420は、当該エントリのMACアドレスを、ARP要求にSHAとして指定されているMACアドレスに更新し、当該エントリの寿命を所定の値(例えば2分など)に再設定する。そして処理はステップS203へと移行する。
逆に、エントリが見つからなければ、通信処理部330または420は、「受信したARP要求にTPAとして指定されているIPアドレスは、注目イーサネットポートに割り当てられているIPアドレスか否か」を判断する。通信処理部330は、インタフェイス設定ファイル332を参照することで上記判断を行ってもよい。また、図6では省略されているが、通信処理部420も、図5のインタフェイス設定ファイル332と同様のインタフェイス設定ファイルを含む。よって、通信処理部420も通信処理部330と同様にして、上記判断を行うことができる。
もし、TPAとして指定されているIPアドレスが、注目イーサネットポートに割り当てられているIPアドレスであれば、通信処理部330または420は、新たなエントリをARPテーブル331または421に追加する。追加される新たなエントリは、具体的には、ARP要求にSPAとSHAとしてそれぞれ指定されているIPアドレスとMACアドレスとを対応づけるエントリである。そして、通信処理部330または420は、追加した新たなエントリの寿命を所定の値(例えば2分など)に設定する。そして処理はステップS203へと移行する。
逆に、TPAとして指定されているIPアドレスが、注目イーサネットポートに割り当てられているIPアドレスとは異なれば、通信処理部330または420は、ステップS202ではエントリを追加しない。この場合は、ARPテーブル331または421が更新されないままで、処理がステップS202からステップS203へと移行する。
なお、以上のステップS202でのARPテーブル331または421の更新(つまりARPエントリの更新または追加)によって、図1の動的対応づけ情報112が更新される場合もあり得る。
また、次のステップS203で通信処理部330または420は、「受信したARP要求にTPAとして指定されているIPアドレスは、注目イーサネットポートに割り当てられているIPアドレスであるか否か」を判断する。この判断はステップS202に関して説明した方法により行われてもよい。
そして、受信したARP要求にTPAとして指定されているIPアドレスが、注目イーサネットポートに割り当てられているIPアドレスと異なれば、処理はステップS201に戻る。
逆に、受信したARP要求にTPAとして指定されているIPアドレスが、注目イーサネットポートに割り当てられているIPアドレスである場合、ステップS204で通信処理部330または420は、ARP応答を返す。具体的には、通信処理部330または420は、受信したARP要求にTPAとして指定されているIPアドレスをSPAとして含み、かつ注目イーサネットポートのMACアドレスをSHAとして含むようなARP応答を生成する。そして、通信処理部330または420は、生成したARP応答を、ネットワークインタフェイス320または410を介して送信する。
そして、ARP応答の送信後、処理はステップS201に戻る。なお、送信されたARP応答は、前述のとおり、図9のステップS106で受信される。
続いて、図11〜12を参照して、図6のクライアント400による処理について説明する。
図11は、クライアントによるリード操作のフローチャートである。図11のリード操作は、アプリケーション440がDB要求処理部430にリード要求の送信を指示したときに、開始される。また、本実施形態での分散DBは、図8のKVS603に一部を例示したとおり、KVSである。したがって、リード要求には、キーが指定されている。
ステップS301でDB要求処理部430は、アプリケーション440から指定されたキーと、対応表431を用いて、3つの通信端点を特定する。
具体的には、DB要求処理部430は、まず指定されたキーがどのキー領域に属するかを判断する。例えば、各キー領域Kjが式(3)により定義されており、指定されたキーがxであるとする。この場合、DB要求処理部430は、mod(hash(x),M)の値を計算し、計算結果に基づいて、指定されたキーが属するキー領域を特定する。もちろん、各キー領域Kjが他の式により定義されていても、DB要求処理部430は、指定されたキーが属するキー領域を特定することができる。
また、本実施形態の対応表431は、具体的には図8の対応表601のように、各キー領域に3つの通信端点を対応づけている。よって、DB要求処理部430は、特定したキー領域に対応するエントリを対応表431の中から探し、見つけたエントリから第1〜第3通信端点をそれぞれ識別する通信端点情報を読み出す。
そして、次のステップS302でDB要求処理部430は、通信処理部420とネットワークインタフェイス410を介して、ステップS301で特定した第1通信端点にリード要求を送信する。つまり、DB要求処理部430は、リード要求の内容と第1通信端点の通信端点情報を指定して、通信処理部420にリード要求の送信を指示する。そして、通信処理部420は、指示にしたがって図9のようにしてフレームを組み立て、フレームを送信する。
また、DB要求処理部430は、通信処理部420にリード要求の送信を指示した後、第1通信端点からの応答の受信を待つ(以下、リード要求に対する応答を「リード応答」という)。そして、ステップS303に示すように、所定時間(以下「TO_db」と表記する)以内にDB要求処理部430がリード応答を受信すれば、処理はステップS304に移行する。逆に、所定時間TO_dbが経過してもDB要求処理部430がリード応答を受信することができなければ、処理はステップS305に移行する。
ステップS304でDB要求処理部430は、受信したリード応答の内容をアプリケーション440に返す。そして、図11のリード操作は正常に終了する。なお、ステップS304の詳細は以下のとおりである。
もし、アプリケーション440から指定されたキーに対応するエントリがKVS内にあれば、受信したリード応答には、当該エントリによりキーに対応づけられているバリューが含まれる。よって、DB要求処理部430はステップS304において、当該バリューをアプリケーション440に返す。
逆に、アプリケーション440から指定されたキーに対応するエントリがKVS内になければ、受信したリード応答は、指定されたキーに対応するバリューがないことを示す。よって、DB要求処理部430はステップS304において、バリューが見つからなかったことをアプリケーション440に通知する。
他方、ステップS305では、DB要求処理部430が、通信処理部420とネットワークインタフェイス410を介して、第2通信端点にリード要求を送信する。ステップS305は、リード要求の宛先以外はステップS302と同様なので、詳細な説明は省略する。
そして、DB要求処理部430は、通信処理部420にリード要求の送信を指示した後、第2通信端点からのリード応答の受信を待つ。ステップS306に示すように、所定時間TO_db以内にDB要求処理部430がリード応答を受信すれば、処理はステップS307に移行する。逆に、所定時間TO_dbが経過してもDB要求処理部430がリード応答を受信することができなければ、処理はステップS308に移行する。
そして、ステップS307でDB要求処理部430は、受信したリード応答の内容をアプリケーション440に返す。すると、図11のリード操作は正常に終了する。なお、ステップS307はステップS304と同様なので、詳細な説明は省略する。
他方、ステップS308では、DB要求処理部430が、通信処理部420とネットワークインタフェイス410を介して、第3通信端点にリード要求を送信する。ステップS308も、リード要求の宛先以外はステップS302と同様なので、詳細な説明は省略する。
そして、DB要求処理部430は、通信処理部420にリード要求の送信を指示した後、第3通信端点からのリード応答の受信を待つ。そして、ステップS309に示すように、所定時間TO_db以内にDB要求処理部430がリード応答を受信すれば、処理はステップS310に移行する。逆に、所定時間TO_dbが経過してもDB要求処理部430がリード応答を受信することができなければ、処理はステップS311に移行する。
そして、ステップS310でDB要求処理部430は、受信したリード応答の内容をアプリケーション440に返す。すると、図11のリード操作は正常に終了する。なお、ステップS310もステップS304と同様なので、詳細な説明は省略する。
他方、ステップS311でDB要求処理部430は、アプリケーション440にエラーを通知する。そして、図11のリード操作は異常終了する。
ところで、図11に関する以上の説明は、主にアプリケーション層で動作するDB要求処理部430に関する説明である。そこで、ネットワーク層やリンク層の振る舞いに関して、ステップS302〜S303でのリード要求の送信とリード応答の受信を例にして、以下に補足する。以下の補足は、ステップS305〜S306にも、ステップS308〜S309にも、同様に当てはまる。
場合によっては、ステップS302でのDB要求処理部430から通信処理部420への指示を契機として、通信処理部420が、まずTCPコネクションの確立のための処理を行うことがある。つまり、第1通信端点とクライアント400との間にTCPコネクションがまだ確立されていなければ、通信処理部420は、TCPコネクションの確立を試みる。具体的には、通信処理部420は、SYN(synchronize)セグメントを送信し、SYN/ACKセグメントの受信を待ち、受信後、ACKセグメントを送信する。それにより、通信処理部420は、第1通信端点とクライアント400の間にTCPコネクションを確立する。
そして、TCPコネクションが確立すると、通信処理部420は、DB要求処理部430から指示されたリード要求を、確立したTCPコネクション上で送信する。場合によっては、SYNセグメントの送信の際に呼び出される図9の処理において、ARP要求がブロードキャストされることもある。なお、図9の処理は、SYNセグメントの送信のときだけでなく、もちろん、ACKセグメントの送信のときにも、リード要求の送信のときにも、呼び出される。
逆に、第1通信端点とクライアント400との間にTCPコネクションが既に確立されていれば、通信処理部420は単に、DB要求処理部430から指示されたリード要求を、確立済みのTCPコネクション上で送信する。こうしてリード要求が送信される場合も、もちろん図9の処理が呼び出される。
ところで、ステップS302でのDB要求処理部430からの指示を契機として、TCPコネクションを確立するための処理が行われるか否かによらず、リード要求の送信が1回で成功するとは限らない。例えば、以下のように様々な場合があり得る。
1回目に送信されたリード要求は、第1通信端点を担当するノードに、成功裡に到達することもある。その結果、所定時間TO_db以内に、DB要求処理部430がリード応答を受信することもある。
あるいは、リード要求の1回目の送信は失敗するかもしれない。しかし、TCPによる再送制御を通信処理部420が行うので、所定のリトライ回数(例えば3回)以内には、第1通信端点を担当するノードに、リード要求が成功裡に到達することもある。その結果、所定時間TO_db以内に、DB要求処理部430がリード応答を受信することもある。
あるいは、上記の所定のリトライ回数までリード要求の再送が繰り返されても、リード要求(つまりリード要求のデータセグメント)に対するACKセグメントがクライアント400に受信されないかもしれない。なお、リード要求に対するACKセグメントは、ピギーバックACKセグメントであってもよく、換言すれば、リード応答においてTCPヘッダ内のACKフラグが「1」にセットされていてもよい。
所定のリトライ回数までリード要求の再送が繰り返されてもリード要求に対するACKセグメントがクライアント400に受信されない理由は、いくつか考えられる。
例えば、第1通信端点を担当するノードが交代したにもかかわらず、クライアント400がまだ交代を認識していない場合があり得る。すると、ARPテーブル421では、第1通信端点のIPアドレスに、既に現在は第1通信端点を担当していないノード300のネットワークインタフェイス320のMACアドレスが対応づけられているかもしれない。つまり、現状を反映していない古いARPエントリに基づいてフレームが送信されることがあり得る。
あるいは、第1通信端点を担当するノードに偶然障害が発生しており、かつ障害の発生にともなう第1通信端点の引き継ぎがまだ完了していないこともある。この場合も、現在故障中のノード300のネットワークインタフェイス320のMACアドレスがフレームの送信に使われ得る。
以上のように、何らかの理由により、所定のリトライ回数までリード要求の再送が繰り返されても、リード要求に対するACKセグメントがクライアント400に受信されない場合がある。そして、その場合におけるエラー処理の実装は、実施形態に応じて様々であってよい。
例えば、通信処理部420は、上記のとおりTCP/IPプロトコルスタックの標準ライブラリにより実装されていてもよく、具体的には、TCPモジュール、IPモジュール、ARPモジュールなどを含んでいてもよい。そして、所定のリトライ回数までリード要求の再送が繰り返されてもリード要求に対するACKセグメントがクライアント400に受信されない場合、トランスポート層のTCPモジュールは、以下のように動作してもよい。
すなわち、TCPモジュールは、異常発生によるTCPコネクションの切断を認識して、TCPコネクションをクローズする。また、TCPモジュールは、IPモジュールを介して間接的に、あるいは直接的に、ARPモジュールに異常を通知してもよい。なお、異常の通知は、切断されたTCPコネクションで使われている宛先IPアドレスを含む。
すると、異常の通知を受けたARPモジュールは、通知された宛先IPアドレスに対応するエントリを、ARPテーブル421から削除する。一方で、TCPモジュールは、TCPコネクションの再確立を試みる。
例えば、図11のステップS302での第1通信端点へのリード要求の送信に関してコネクションの再確立が試みられるとする。この場合、通信処理部420のTCPモジュールは、SYNセグメントを送信し、SYN/ACKセグメントの受信を待ち、受信後、ACKセグメントを送信する。
そして、SYNセグメントの際に図9の処理が呼び出されると、上記のようにARPテーブル421のエントリが既に強制的に削除されているため、図9のステップS102の検索の結果、エントリは見つからない。その結果、ステップS105でARP要求がブロードキャストされ、ステップS107で新たなエントリがARPテーブル421に追加される。
場合によっては、以上のようにしてARPエントリを強制的にクリアして作成しなおすことで、問題が解消する。よって、通信処理部420のTCPモジュールは、再確立したTCPコネクション上で、再度、リード要求を送信してもよい。
例えば、第1通信端点を担当するノードが交代したことをクライアント400が認識していなかった場合は、以上のコネクションの再確立により、今までTCPコネクションが確立していたノードとは物理的に異なるノードとの間に新たなコネクションが確立する。そして、新たに確立したコネクション上で送信されるリード要求は、第1通信端点を現在担当しているノードに成功裡に到達し、リード応答がクライアント400に返される。
例えば、以上のような通信処理部420による再送制御とコネクション再確立に十分な長さの時間が、ステップS303の所定時間TO_dbとして予め決められていてもよい。すると、アプリケーション層で動作するDB要求処理部430は、再送やARPエントリの削除と再作成について何ら認識することもなく、単に、「所定時間TO_db以内にリード応答が受信された」とステップS303で判断する。
あるいは、実施形態によっては逆に、ARPエントリの削除と再作成に関してアプリケーション層のDB要求処理部430が責任を持つような実装が採用されてもよい。つまり、通信処理部420のTCPモジュールは、上記のようにARPモジュールへ異常を通知する代わりに、アプリケーション層に異常を通知するように実装されていてもよい。換言すれば、TCPモジュールは、「所定の回数、データセグメントの再送を繰り返しても、ACKセグメントが受信されない」とアプリケーション層に通知してもよい。
すると、DB要求処理部430は、異常が通知されたTCPコネクションのソケットに対してクローズ命令を呼び出す。クローズ命令は、例えば、システムコールでもよいし、API(Application Programming Interface)関数でもよい。
また、DB要求処理部430は、異常が通知されたTCPコネクションで使われていた宛先IPアドレスを指定して、ARPモジュールに対して、ARPテーブル421からのエントリの強制削除を命令する。例えば、DB要求処理部430は、「arp」コマンドの呼び出しにより、ARPモジュールにエントリの強制削除を命令してもよい。
エントリの強制削除の命令の後のDB要求処理部430の動作は、以下の2通りのうちどちらでもよい。
第1の例は、DB要求処理部430が再送制御を行う例である。つまり、DB要求処理部430は、ステップS303でリード応答の受信を待っている間に、上記のような異常の通知を受け、ARPモジュールにエントリの強制削除を命令した場合、ステップS302と同様の処理を再度行ってもよい。すると、第1通信端点へのリード要求の送信をDB要求処理部430から指示された通信処理部420は、新たにSYNセグメントを送信することから始めてTCPコネクションの確立を試みる。
また、SYNセグメントの送信の際に、図9の処理が呼び出され、ARP要求がブロードキャストされる。そして、TCPコネクションの確立に成功すると、通信処理部420は、DB要求処理部430から指示されたリード要求のデータセグメントを、確立したTCPコネクション上で送信する。
なお、この場合は、以上のようなDB要求処理部430による再送制御に十分な長さの時間が、ステップS303の所定時間TO_dbとして予め決められていることが望ましい。すると、1回目のステップS302の実行から所定時間TO_db以内に、DB要求処理部430がリード応答を受信することが可能な場合がある。
また、第2の例は、DB要求処理部430が再送制御を行わない例である。つまり、DB要求処理部430は、ステップS303でリード応答の受信を待っている間に、上記のような異常の通知を受け、ARPモジュールにエントリの強制削除を命令した場合は、所定時間TO_dbの経過を待たずにステップS305の処理を行ってもよい。
この場合は、例えば、同じキー領域に属するキーを指定した別の新たなDBアクセス要求がアプリケーション440において生じた場合に、当該新たなDBアクセス要求を契機として、ARP要求がブロードキャストされることがある。そして、その結果、図9のステップS107で新たなエントリがARPテーブル421に追加されることがある。
以上、様々な実装例を説明したが、いずれの実装例においても、TCPコネクションが障害などにより異常に切断してしまった場合は、以下の(8−1)〜(8−3)の処理が行われる。
(8−1)ARPテーブル421のエントリが強制的に削除される。
(8−2)エントリの強制削除の後(「強制削除後すぐにか、それとも、別の新たなDBアクセス要求が生じたときにか」という違いはあるものの)、再度TCPコネクションが確立される。
(8−3)TCPコネクションを再確立するためのSYNセグメントの送信の前には、ARP要求がブロードキャストされ、強制削除されたエントリにおけるIPアドレスと同じIPアドレスに関する新たなエントリがARPテーブル421に追加される。
したがって、ARPテーブル421のエントリの強制削除、再送制御、およびTCPコネクションの再確立が、それぞれDB要求処理部430と通信処理部420のいずれにより制御されているかによらず、図1の動的対応づけ情報112の動的更新が実現される。
さて、図12は、クライアントによるライト操作のフローチャートである。図12のライト操作は、アプリケーション440がDB要求処理部430にライト要求の送信を指示したときに、開始される。また、ライト要求には、キーとバリューのペアが指定されている。
ステップS401でDB要求処理部430は、アプリケーション440から指定されたキーと、対応表431を用いて、3つの通信端点を特定する。ステップS401は図11のステップS301と同様なので、詳しい説明は省略する。
そして、次のステップS402でDB要求処理部430は、通信処理部420とネットワークインタフェイス410を介して、ステップS401で特定した第1通信端点にライト要求を送信する。つまり、DB要求処理部430は、ライト要求の内容と第1通信端点の通信端点情報を指定して、通信処理部420にライト要求の送信を指示する。ステップS402は、送信されるDBアクセス要求の内容以外は、図11のステップS302と同様である。よって、詳しい説明は省略する。
また、次のステップS403でDB要求処理部430は、通信処理部420とネットワークインタフェイス410を介して、ステップS401で特定した第2通信端点にライト要求を送信する。ステップS403は、ライト要求の宛先以外はステップS402と同様である。よって、詳しい説明は省略する。
さらに、次のステップS404でDB要求処理部430は、通信処理部420とネットワークインタフェイス410を介して、ステップS401で特定した第3通信端点にライト要求を送信する。ステップS404も、ライト要求の宛先以外はステップS402と同様である。よって、詳しい説明は省略する。
そして、ステップS402〜S404の送信の後、DB要求処理部430は、3つの通信端点からの応答の受信を待つ(以下、ライト要求に対する応答を「ライト応答」という)。そして、ステップS405に示すように、所定時間TO_db以内に3つの通信端点すべてからDB要求処理部430がライト応答を受信すれば、処理はステップS406に移行する。逆に、所定時間TO_dbが経過しても0、1、または2個の通信端点からのライト応答しか受信されなければ、処理はステップS407に移行する。
ステップS406でDB要求処理部430は、アプリケーション440にライト操作の正常終了を通知する。そして、図12のライト操作は正常終了する。
逆に、ステップS407では、DB要求処理部430は、アプリケーション440にエラーを通知する。そして、図12のライト操作は異常終了する。なお、エラーを通知されたアプリケーション440は、同じコピーを持つことが期待される3台のノード間でのデータの不一致をなくすため、ロールバックのための何らかの制御を行い、DB要求処理部430に対してロールバックのための特殊なDBアクセス要求を発行してもよい。
なお、ステップS402〜S404のそれぞれにおいて、図11のステップS302などと同様に、図9の処理が呼び出される。また、図11に関する補足説明と類似のことは、以下のとおり、図12のステップS402〜S405にも当てはまる。
場合によっては、ライト要求のデータセグメントの送信に先立って、TCPコネクションの確立のための処理が行われる。
また、実装によっては、DB要求処理部430がライト応答の受信を待っている所定時間TO_dbの間に、通信処理部420による再送制御が行われる。そして、所定のリトライ回数までライト要求の再送が繰り返されてもライト要求に対するACKセグメントがクライアント400に受信されない場合は、ARPテーブル421のエントリが強制的に削除される。エントリの強制削除は、図11に関する補足説明で述べたとおり、通信処理部420の制御のもとで行われてもよいし、DB要求処理部430の制御のもとで行われてもよい。
その後、TCPコネクションの確立が再度試みられてもよく、新たに確立したTCPコネクション上でライト要求が再送されてもよい。そして、例えば、TCPコネクションの再確立のためのSYNセグメントの送信の際に、ARP要求がブロードキャストされ、その結果、新たなエントリがARPテーブル421に作成される。
以上、図11〜12を参照して、クライアント400の動作について説明した。続いて、図13〜16を参照して、ノード300の動作について説明する。
図13は、クライアントからのDBアクセス要求にノードが応答する処理のフローチャートである。図13の処理は、ノード300が動作している間、実行され続ける。なお、以下では説明の便宜上、図5のノード300にとってのノード300自身のことを「ローカルノード」といい、ノード300以外の他のノードのことを「リモートノード」ということもある。
ノード300は、ローカルノードの通信端点(すなわちノード300自身が担当するキー領域に対応する通信端点)へのDBアクセス要求を受信するまで、ステップS501で待機する。そして、ローカルノードの通信端点へのDBアクセス要求が受信されると、処理はステップS502に移行する。ステップS501の詳細は、具体的には以下のとおりである。
ここで、ノード300自身が担当するキー領域に対応する通信端点は、インタフェイス設定ファイル332によってネットワークインタフェイス320のMACアドレスに対応づけられたIPアドレスと、ポート番号とのペアにより、識別される。そして、ネットワークインタフェイス320において受信されたフレームは、宛先IPアドレスと宛先ポート番号とDBヘッダ内のサブタイプに応じて、通信処理部330により振り分けられる。
例えば図5のようにノード300が3つのキー領域管理部350a〜350cを有するとする。この場合、キー領域管理部350a〜350cのいずれかに対応する通信端点情報が宛先IPアドレスと宛先ポート番号として指定されたリード要求またはライト要求を受信するまで、通信処理部330はステップS501で待機する。
そして、通信処理部330は、キー領域管理部350a〜350cのいずれかに対応する通信端点情報が指定されたリード要求またはライト要求を受信すると、受信したリード要求またはライト要求を出力する。すなわち、リード要求またはライト要求は、宛先IPアドレスに応じて、キー領域管理部350a〜350cのいずれかのリード・ライト処理部351へと出力される。
そして、ステップS502でリード・ライト処理部351は、通信処理部330から出力されたDBアクセス要求がリード要求とライト要求のいずれであるかを判定する。通信処理部330からリード要求が出力された場合、処理はステップS503に移行する、逆に、通信処理部330からライト要求が出力された場合、処理はステップS505に移行する。
ステップS503でリード・ライト処理部351は、リード要求で指定されているキーに対応するバリューを、ローカルストア310から読み出す。
例えば、リード要求には「def」というキーが指定されているものとし、「def」というキーは、図5のキー領域管理部350aに対応するキー領域に属しているものとする。また、図8の例によれば、「def」というキーに対応するバリューは「DEF」である。この場合、ステップS503では、キー領域管理部350a内のリード・ライト処理部351が、ローカルストア310から「DEF」というバリューを読み出す。
そして、次のステップS504でリード・ライト処理部351は、ローカルストア310から読み出したバリューをクライアント400に応答する。つまり、リード・ライト処理部351は、読み出したバリューをDBペイロードに含むDBアクセス応答を生成し、生成したDBアクセス応答を、通信処理部330とネットワークインタフェイス320を介してクライアント400に返す。その後、処理はステップS501に戻る。
また、ステップS505でリード・ライト処理部351は、ライト要求で指定されているキーに対応するローカルストア310上のバリューを、ライト要求で指定されているバリューに書き換える。
例えば、ライト要求には「def」というキーと「XYZ」というバリューが指定されているものとし、「def」というキーは、図5のキー領域管理部350aに対応するキー領域に属しているものとする。この場合、ステップS505でキー領域管理部350a内のリード・ライト処理部351は、図8のように「def」というキーに対応づけられてローカルストア310に記憶されている「DEF」というバリューを、「XYZ」というバリューで上書きする。
そして、次のステップS506でリード・ライト処理部351は、ライト要求の正常終了をクライアント400に通知する。つまり、リード・ライト処理部351は、ライト要求の正常終了を示すデータをDBペイロードまたはDBヘッダに含むDBアクセス応答を生成し、生成したDBアクセス応答をクライアント400に返す。その後、処理はステップS501に戻る。
なお、本実施形態では、上記のとおりノード300におけるDBアクセス要求の受信に先立って、クライアント400とノード300の間でTCPコネクションが確立される。そして、ステップS501では、確立済みのTCPコネクション上でDBアクセス要求が受信され、ステップS504またはS506におけるDBアクセス応答の送信も、確立済みのTCPコネクション上で行われる。
また、ステップS504またはS506におけるDBアクセス応答の送信は、上記のとおり通信処理部330を介して行われる。よって、ステップS504またはS506でリード・ライト処理部351が通信処理部330へDBアクセス応答の送信を指示すると、通信処理部330では図9の処理を呼び出す。
さて、図14は、ノード300が新規追加された場合、またはノード300自身が低負荷の場合に、ノード300が他のノードからキー領域を引き継ぐ処理のフローチャートである。つまり、ノード300が新規に追加されると、ノード300が図14の処理を開始してもよい。また、既存のノード300は、ノード300自体の負荷を監視してもよく、負荷が所定の基準以下の場合に図14の処理を開始してもよい。負荷は、例えば、以下の(9−1)〜(9−3)のいずれかの指標により計測されてもよい。
(9−1)ローカルストア310の使用率または使用量
(9−2)ノード300のCPU501の使用率
(9−3)上記(9−1)と(9−2)を組み合わせて計算されるスコア
ステップS601でノード300は、対応表340の中から通信端点を1つ選択する。具体的には、ノード300は、ネットワークインタフェイス320に割り当てられていないIPアドレスによって識別されるいずれか1つの通信端点を、対応表340の中から1つ選択する。より好ましくは、ノード300は、ネットワークインタフェイス320に割り当てられているいずれかのIPアドレスに対応するキー領域を避けて、他のキー領域に対応する通信端点の中から1つの通信端点を選択する。ステップS601における選択は、ランダムな選択であってもよいし、ノード300に固有の情報(例えばホスト名またはFQDN(Fully-Qualified Domain Name))のハッシュ値に基づく選択であってもよい。
例えば、ネットワークインタフェイス320に「192.168.254.15」と「192.168.254.17」と「192.168.254.36」という3つのIPアドレスが割り当てられているとする。この場合、ノード300は、3つのIPアドレスにそれぞれ対応するキー領域K15、K1、およびK4を避けて、他のキー領域に対応する通信端点の中から、1つの通信端点をランダムに選択してもよい。以下では説明の便宜上、ステップS601で選択された通信端点を「選択通信端点」という。
そして、次のステップS602でノード300は、選択通信端点に対して引き継ぎを提案する。
例えば、対応表340が具体的には図8の対応表601であるものとし、ノード300がステップS601で「192.168.254.36:7000」という通信端点情報で識別される通信端点を選択したとする。図8によれば、「192.168.254.36」というIPアドレスが現在割り当てられているノードは、「4」というインデックスで識別されるキー領域K4を「第3通信端点」として担当しているノードである。
この場合、図14の処理を行うノード300は、宛先IPアドレスとして「192.168.254.36」を指定し、宛先ポート番号として「7000」を指定した制御メッセージ(以下、説明の便宜上「引き継ぎ提案」という)をステップS602で生成する。
なお、引き継ぎ提案の送信元IPアドレスとしては、図8の依頼ノードリスト605に関して説明した固定的なIPアドレスが使われる。例えば、図14の処理を実行しているノード300に「192.168.254.130」というIPアドレスが固定的に割り当てられているとすると、引き継ぎ提案の送信元IPアドレスは「192.168.254.130」である。
以下、説明の便宜上、選択通信端点が現在割り当てられているノードを「現在担当ノード」という。例えば、上記のとおり選択通信端点が「192.168.254.36:7000」という通信端点情報で識別されるとすると、「現在担当ノード」は、「4」というインデックスで識別されるキー領域K4を「第3通信端点」として担当しているノードである。
また、ステップS602で生成される引き継ぎ提案は、送信元IPアドレスで識別されるノードが、宛先IPアドレスと宛先ポート番号により識別される通信端点を現在担当ノードから引き継ぐことを、現在担当ノードに提案するためのメッセージである。ノード300は、ステップS602において、上記のとおり生成した引き継ぎ提案を、通信処理部330とネットワークインタフェイス320を介して送信する。
そして、ノード300は、引き継ぎ提案への応答を選択通信端点から受信するのをステップS603で待つ。もし、所定時間(以下「TO_prop」と表記する)以内に選択通信端点から(換言すれば現在担当ノードから)応答が受信されれば、処理はステップS604に移行する。逆に、もし所定時間TO_prop以内に選択通信端点からの応答が受信されなければ、処理はステップS611へ移行する。
そして、ステップS604でノード300は、応答の内容がACKとNACK(negative acknowledgement)のいずれであるかを判断する。ACK応答は、現在担当ノードが提案を受け入れること(すなわち、現在担当ノードが引き継ぎを希望すること)を示す。逆に、NACK応答は、現在担当ノードが提案を受け入れないこと(すなわち、引き継ぎは不要であること)を示す。
例えば、引き継ぎ提案を受けた任意のノードは、当該ノード自身の負荷が所定の基準よりも高いときにACK応答を返してもよく、当該ノード自身の負荷が所定の基準以下のときにNACK応答を返してもよい。負荷は、例えば、上記の(9−1)〜(9−3)のいずれかの指標により計測されてもよい。
ACK応答が受信された場合、ノード300は、選択通信端点(つまり、現在担当ノードからノード300が引き継ぐ予定の通信端点)に対応する新たなキー領域管理部を生成する。そして、処理はステップS605に移行する。なお、以下では説明の便宜上、キー領域管理部350cが新たに生成されたものとする。
逆に、NACK応答が受信された場合、処理はステップS611へと移行する。
そして、ステップS605では、ACK応答の受信を契機として生成されたキー領域管理部350c内の取得制御部352が、選択通信端点に対して、引き継ぎ要求を送信する。引き継ぎ要求は、具体的には通信処理部330とネットワークインタフェイス320を介して送信される。また、引き継ぎ要求の宛先IPアドレス、宛先ポート番号、および送信元IPアドレスは、引き継ぎ提案と同じである。
そして、取得制御部352は、送信した引き継ぎ要求に対する引き継ぎ応答を選択通信端点から受信するのを、ステップS606で待つ。もし、所定時間(以下「TO_bulk」と表記する)以内に選択通信端点から(換言すれば現在担当ノードから)引き継ぎ応答が受信されなければ、図14の処理は異常終了する。逆に、もし所定時間TO_bulk以内に選択通信端点からの引き継ぎ応答が受信されれば、処理はステップS607に移行する。
なお、例えば上記のように選択通信端点が「192.168.254.36:7000」という通信端点情報で識別されるとすると、引き継ぎ応答は、「4」というインデックスで識別されるキー領域K4にキーが属するすべてのエントリを含む。よって、引き継ぎの対象のキー領域に多くのキーが属する場合、時間TO_bulkは、十分に長く設定されることが望ましい。例えば、引き継ぎ提案を受けた現在担当ノードは、ACK応答を返す場合には、引き継ぎ対象のキー領域に属するキーの数に応じて時間TO_bulkの値をACK応答において指定してもよい。
また、引き継ぎ応答は、ネットワークインタフェイス320で受信され、通信処理部330を介して、引き継ぎ要求の送信元であるキー領域管理部350c内の取得制御部352へと出力される。なお、引き継ぎ応答において、送信元IPアドレスは選択通信端点のIPアドレスであり、宛先IPアドレスは引き継ぎ要求の送信元IPアドレス(すなわち固定的なIPアドレス)である。
また、取得制御部352は、ステップS607において、受信したデータ(つまり引き継ぎ応答に含まれる全エントリ)をローカルストア310に保存する。例えば上記の例では、「4」というインデックスで識別されるキー領域K4にキーが属するすべてのエントリを、取得制御部352が新たにローカルストア310に追加する。
その後、取得制御部352は、割り当て指示を受信するのをステップS608で待つ。ここで、「割り当て指示」とは、図14の処理を実行しているノード300のネットワークインタフェイス320に、選択通信端点のIPアドレスを割り当てるよう指示するための制御メッセージである。例えば、説明の便宜上、以下の(10−1)〜(10−3)のように想定する。
(10−1)選択通信端点は「192.168.254.36:7000」という通信端点情報で識別される。
(10−2)現在担当ノードに固定的に割り当てられているIPアドレスは「192.168.254.133」である。
(10−3)図14の処理を実行しているノード300に固定的に割り当てられているIPアドレスは「192.168.254.130」である。
上記の(10−1)〜(10−3)の場合、割り当て指示とは、現在担当ノードが、図14の処理を実行中のノード300に対して、「192.168.254.36」というIPアドレスの割り当てを指示するための制御メッセージである。そして、割り当て指示において、送信元IPアドレスは、「192.168.254.133」という固定的なIPアドレスであり、宛先IPアドレスも、「192.168.254.130」という固定的なIPアドレスである。
もし、所定時間(以下「TO_assign」と表記する)以内に割り当て指示が受信されなければ、図14の処理は異常終了する。逆に、もし所定時間TO_assign以内に割り当て指示が受信されれば、処理はステップS609に移行する。
そして、ステップS609で取得制御部352は、選択通信端点のIPアドレスをネットワークインタフェイス320に割り当てるよう、対応づけ部354に指示する。すると、対応づけ部354は、選択通信端点のIPアドレスをネットワークインタフェイス320に割り当てるための処理を行う。
例えば、対応づけ部354は、通信処理部330内のインタフェイス設定ファイル332を直接書き換えて、選択通信端点のIPアドレスをネットワークインタフェイス320と対応づけてもよい。あるいは、対応づけ部354は、例えば「ifconfig」コマンドなどの適宜のコマンドを発行することにより、通信処理部330の機能を呼び出して、通信処理部330にインタフェイス設定ファイル332を書き換えさせてもよい。
いずれにしろ、ステップS609の結果、例えば上記(10−1)〜(10−3)の例の場合は、「192.168.254.36」というIPアドレスが、図14の処理を実行中のノード300のネットワークインタフェイス320に割り当てられる。
すると、次のステップS610で監視依頼部355は、1つ以上の他のノードを選んで依頼ノードリスト356に登録する。そして、監視依頼部355は、依頼ノードリスト356に登録した各ノードに対して、選択通信端点の監視を要求する。
例えば、分散DBシステムが8台のノードを含み、「192.168.254.128」〜「192.168.254.135」の8個のIPアドレスがこれら8台のノードに固定的に割り当てられているとする。また、上記(10−2)のとおり、図14の処理を実行中のノード300には「192.168.254.130」というIPアドレスが固定的に割り当てられているとする。そして、ステップS609では上記のとおり、「192.168.254.36」というIPアドレスが割り当てられたとする。
この場合、監視依頼部355は、不図示の設定ファイルを読み込むなどの処理により、8つの固定IPアドレスを予め認識しており、ノード300自身の固定IPアドレスも予め認識している。
あるいは、監視依頼部355は、対応表340に現れるIPアドレスのうち、ノード300自身ネットワークインタフェイス320に割り当てられていないIPアドレスの各々について、当該IPアドレスを宛先IPアドレスとした問い合わせを送信してもよい。問い合わせを受信したノードが、当該ノードの固定IPアドレスを含む応答を返すことにより、監視依頼部355は、分散DBシステム内のノード用に使われる固定IPアドレスの集合を認識することができる。
いずれにせよ、監視依頼部355は、8つの固定IPアドレスを予め認識している。よって、ステップS610で監視依頼部355は、「192.168.254.130」以外の7つの固定IPアドレスの中から1つ以上の任意のIPアドレスを選び、選んだ各IPアドレスを依頼ノードリスト356に登録する。例えば、監視依頼部355は、「192.168.254.128」と「192.168.254.133」を選んで依頼ノードリスト356に登録してもよい。
上記の2つのIPアドレスを選んだ場合、監視依頼部355は、以下の(11−1)と(11−2)の監視依頼のデータを生成し、生成した各監視依頼のデータを、通信処理部330とネットワークインタフェイス320を介して送信する。
(11−1)送信元IPアドレスが「192.168.254.130」で、宛先IPアドレスが「192.168.254.128」で、監視対象としての通信端点を示すIPアドレスとポート番号のペアが「192.168.254.36:7000」の監視依頼。
(11−2)送信元IPアドレスが「192.168.254.130」で、宛先IPアドレスが「192.168.254.132」で、監視対象としての通信端点を示すIPアドレスとポート番号のペアが「192.168.254.36:7000」の監視依頼。
もちろん、実施形態によっては、「192.168.254.36」のようにキー領域に応じて動的に割り当てられるIPアドレスが、監視依頼の送信元IPアドレスとして使われてもよい。そして、監視依頼の送信元ポート番号に、監視対象の通信端点のポート番号が指定されてもよい、つまり、監視依頼のパケットにおいては、送信元IPアドレスと送信元ポート番号自体により、監視対象が指定されてもよい。
なお、監視依頼を受信した他のノードでは、通信処理部330が監視依頼を監視部360に出力する。すると、監視部360が、監視依頼に指定されている監視対象の通信端点情報を対象ノードリスト361に追加する。
そして、ステップS610での1つ以上の他のノードへの監視依頼の送信が終わると、次のステップS611でノード300は、図14の処理を終了するための特定の条件(以下「終了条件」という)が満たされているか否かを判断する。終了条件は、例えば、以下の(12−1)〜(12−3)の条件のいずれであってもよいし、その他の条件であってもよい。
(12−1)ノード300の負荷が、図14の処理を開始するか否かを判断するためにノード300が参照する基準を超えている。
(12−2)ノード300は、図14の処理を開始してから、ステップS601での選択を既に所定の回数(例えば3回)行った。
(12−3)上記(12−1)と(12−2)のうち少なくとも一方が成立する。
そして、終了条件が満たされていれば、ノード300は図14の処理を終了する。逆に、終了条件が満たされていなければ、処理はステップS601へと戻る。
なお、本実施形態では、引き継ぎ提案、引き継ぎ提案に対するACK応答またはNACK応答、引き継ぎ要求、および引き継ぎ応答は、確立済みのTCPコネクション上で送受信される。つまり、場合によっては、ステップS602で引き継ぎ提案を送信するために、ノード300は、先にTCPコネクションの確立のための一連の処理(すなわち、SYNセグメントの送信、SYN/ACKセグメントの受信、およびACKセグメントの送信)を行う。
また、図14では省略されているが、現在担当ノードが割り当て指示を送信する前に、引き継ぎ応答等の送受信に使われたTCPコネクションをクローズするための一連の処理が行われる。なぜなら、当該TCPコネクションで使われるIPアドレスが割り当てられるノードが変化するからである。
具体的には、現在担当ノードは、引き継ぎ応答の送信後、FIN/ACKセグメントを送信する。そして、図14の処理を実行しているノード300は、FIN/ACKセグメントを受信すると、FIN/ACKセグメントに対するACKセグメントを送信する。また、TCPコネクションは双方向なので、ノード300はさらにFIN/ACKセグメントを送信する。現在担当ノードは、FIN/ACKセグメントを受信すると、FIN/ACKセグメントに対するACKセグメントを送信する。以上の処理により、TCPコネクションはクローズされる。
また、本実施形態では、割り当て指示もTCPコネクション上で送受信される。割り当て指示の送受信に使われるTCPコネクションの両端の通信端点のIPアドレスは、上記(10−2)と(10−3)に例示したような固定IPアドレスである。つまり、割り当て指示の送受信に使われるTCPコネクションは、引き継ぎ応答等の送受信に使われたTCPコネクションとは別物である。
よって、もし固定IPアドレスでそれぞれ識別される通信端点間のTCPコネクションが存在していなければ、現在担当ノードは、割り当て指示を送信する前に、TCPコネクションを確立するためのSYNセグメントを送信する。すると、図14の処理を実行しているノード300の通信処理部330がSYN/ACKセグメントを送信し、現在担当ノードがさらにACKセグメントを送信する。割り当て指示は、以上のようにして新たに確立した(あるいは、何らかの別の用途のためにたまたま既に確立していた)TCPコネクション上で、送受信される。
さらに、本実施形態では、監視依頼の送信も確立済みのTCPコネクション上で行われる。つまり、場合によっては、ステップS610で監視依頼を送信するために、TCPコネクションの確立のための一連の処理を先に通信処理部330が行うことがある。
そして、ステップS602、S605、およびS610のいずれにおいても、通信処理部330により図9の処理が呼び出される。
また、ステップS603とS606とS608でのタイムアウト処理は、図11のステップS303の処理と同様に、ARPテーブル331からのエントリの強制削除、再送制御、TCPコネクションの再確立などの処理を含んでいてもよい。そして、クライアント400に関して説明したのと同様に、例えば「アプリケーション層の監視部360とトランスポート層の通信処理部330のどちらが再送制御を行うのか」という観点などの、いくつかの観点において、具体的実装は様々に異なり得る。
さて次に、監視を要求されたノードが行う処理について説明する。図15は、ノードが他のノードを監視し、監視対象が故障した場合に引き継ぎを行う処理のフローチャートである。
例えば、図3のノードN11が図14の処理を実行したとする。そして、ノードN11は、ステップS609でノードN11に動的に割り当てたある1つの通信端点の監視を、ステップS610においてノードN15とN17に依頼したとする。この場合、ノードN15とN17は、それぞれ図15の処理を行う。そして、もしその後ノードN11が故障した場合は、ノードN15とN17のうち、先に図15の処理によりノードN11の故障を認識した方が、監視対象の通信端点の新たな割り当て先のノードとなる。
なお、図15の処理は、ノード300が動作している間、監視部360内の対象ノードリスト361(より具体的には、例えば図8の対象ノードリスト604)に登録されている各通信端点に関して、それぞれ独立に実行され続ける。以下では説明の便宜上、図15の処理の対象の通信端点を「対象通信端点」という。
ステップS701で監視部360は、対象通信端点に生存確認メッセージを送信する。例えば、対象通信端点が図8の対象ノードリスト604の1番目の通信端点の場合、監視部360は、宛先IPアドレスに「192.168.254.9」を指定し、宛先ポート番号に「7000」を指定した生存確認メッセージを生成する。また、生存確認メッセージの送信元IPアドレスは、図15の処理を実行しているノード300に固定的に割り当てられているIPアドレスである。監視部360は、生成した生存確認メッセージを、通信処理部330とネットワークインタフェイス320を介して対象通信端点に送信する。
そして、監視部360は、生存確認メッセージに対する応答を対象通信端点から受信するのをステップS702で待つ。
もし、所定時間(以下「TO_keepalive」と表記する)以内に対象通信端点から生存確認メッセージに対する応答が受信されれば、監視部360は「対象通信端点が割り当てられているノードは正常である」と判断する。そして、処理はステップS703に移行する。
逆に、もし所定時間TO_keepalive以内に対象通信端点から生存確認メッセージに対する応答が受信されなければ、監視部360は「対象通信端点が割り当てられているノードに障害が発生した」と判断する。そして、フェイルオーバのために処理はステップS706に移行する。
ステップS703で監視部360は、生存確認メッセージに対する応答の内容を読み取る。本実施形態では、生存確認メッセージに対する応答は、「監視が必要か否か」を示す情報(例えばフラグなど)を含む。もし、応答において「監視は不要」と指定されていれば、処理はステップS704に移行する。逆に、応答において「監視が必要」と指定されていれば、処理はステップS705に移行する。
なお、生存確認メッセージに対する応答が、「監視が必要か否か」を示す情報を含む理由は、以下のとおりである。
本実施形態では、第1のノードに割り当てられていた通信端点を何らかの理由で第2のノードが引き継ぐと、第2のノードは、第1のノードがどのノードに第1のノードの監視を依頼していたかに関係なく、任意に1つ以上のノードを選ぶ。そして、第2のノードは、選んだ各ノードに、第2のノードに新たに割り当てた通信端点の監視を依頼する。すると、第1のノードから依頼されて第1のノードを監視していた第3のノードからの生存確認メッセージを、第2のノードが受信してしまう場合があり得る。
なぜなら、生存確認メッセージの宛先は、論理的に通信端点を識別するIPアドレスとポート番号により定められるからである。つまり、第3のノードにおけるARPテーブルの更新にともなって、第3のノードからの生存確認メッセージを、第2のノードが受信してしまうことがあり得る。
一方、第2のノードが偶然にも第3のノードを選んで監視を依頼した場合を除いて、第2のノードにとって第3のノードは、第2のノードの監視を依頼したノードではない。つまり、第2のノードは、依頼ノードリスト356に登録されていないノードから生存確認メッセージを受信する可能性がある。
そこで、本実施形態では、生存確認メッセージに対する応答が、「監視が必要か否か」を示す情報を含む。以下の図15〜16に関する説明から理解されるように、この情報により、生存確認メッセージの宛先のノードが保持する依頼ノードリスト356と、生存確認メッセージの実際の送信元のノードとの整合性を保つことが可能となる。
さて、ここでステップS703の分岐の説明に戻る。生存確認メッセージに対する応答において「監視が不要」と指定されている場合、ステップS704で監視部360は、対象通信端点を監視対象から外す。つまり、監視部360は、対象通信端点を識別する通信端点情報を、対象ノードリスト361から削除する。そして、図15の処理は終了する。その結果、対象ノードリスト361から削除された通信端点情報により識別される通信端点についての監視は、行われなくなる。
他方、ステップS705で監視部360は、ステップS701での送信から所定時間(以下「I_keepalive」と表記する)が経過するまで待機する。所定時間I_keepaliveは、生存確認メッセージの送信間隔として決められた時間である。そして、ステップS701での送信から所定時間I_keepaliveが経過すると、処理はステップS701に戻る。よって、対象通信端点のノードが故障しても、故障から最大で(I_keepalive+TO_keepalive)以内の時間で、故障が検出可能である。
さて、ステップS706〜S713の処理は、監視対象の通信端点における故障が検出された場合に、フェイルオーバのために行われる引き継ぎの処理である。
まず、ステップS706で監視部360は、新たに1つのキー領域管理部を生成する。例えば、上記のように図5のキー領域管理部350a〜350cは、別々の3つのスレッドにより実現されていてもよく、監視部360は、新たなスレッドを生成することで、新たなキー領域管理部を生成してもよい。生成される新たなキー領域管理部は、具体的には、対象通信端点に対応しており、したがって、対象通信端点と静的に対応づけられているキー領域に対応している。以下では説明の便宜上、ステップS706でキー領域管理部350cが生成されたものとする。
さらにステップS706では、新たに生成されたキー領域管理部350cの取得制御部352が、対象通信端点に対応するキー領域を担当する別の通信端点を対応表340において検索する。
例えば、対応表340が具体的には図8の対応表601のとおりであるとし、対象通信端点が「192.168.254.9:7000」という通信端点情報で識別されるものとする。この場合、対象通信端点は、「9」というインデックスで識別されるキー領域K9の「第1通信端点」である。
よって、新たに生成されたキー領域管理部350cの取得制御部352は、キー領域K9の「第2通信端点」と「第3通信端点」を検索する。その結果、取得制御部352は、「第2通信端点」に対応する「192.168.254.25:7000」という通信端点情報と、「第3通信端点」に対応する「192.168.254.41:7000」という通信端点情報を得る。
そして、次のステップS707で取得制御部352は、「ステップS706での検索で見つかった通信端点のうち、まだステップS708以降の処理の対象として選んでいない通信端点が残っているか否か」を判断する。未選択の通信端点が残っていれば、処理はステップS708に移行する。
逆に、ステップS706で見つかったすべての通信端点について既に選択し終わっているにもかかわらず、ステップS707の処理が実行される場合とは、「同じキー領域を担当する3つのノードがすべて故障している」などの異常な場合である。よって、未選択の通信端点が残っていない場合は、図15の処理は異常終了する。
ステップS708で取得制御部352は、ステップS706で見つかった通信端点のうち未選択の通信端点を1つ選択する。以下では説明の便宜上、ステップS708で選択された通信端点を「選択通信端点」という。
そして、取得制御部352は、選択通信端点に対して、選択通信端点に対応するキー領域の全データを要求する。なお、選択通信端点に対応するキー領域は、対象通信端点に対応するキー領域と同じである。
ここで説明の便宜上、例えば、次の(13−1)〜(13−2)のように想定する。
(13−1)上記のように、ステップS706で「192.168.254.25:7000」と「192.168.254.41:7000」という通信端点情報が得られた。
(13−2)ステップS708では、「192.168.254.25:7000」という通信端点情報で識別される通信端点が選択された。
上記(13−1)〜(13−2)の場合、新たに生成されたキー領域管理部350c内の取得制御部352は、キー領域K9にキーが属する全エントリのデータを、選択通信端点に要求する。こうしてステップS708で送信される要求は、前述のコピー要求である。コピー要求は、取得制御部352の指示にしたがって、通信処理部330とネットワークインタフェイス320を介して送信される。
上記(13−1)〜(13−2)の例におけるコピー要求では、宛先IPアドレスが「192.168.254.25」であり、宛先ポート番号が「7000」である。また、送信元IPアドレスは、図14のステップS605における引き継ぎ要求と同様に、図15の処理を実行中のノード300に固定的に割り当てられているIPアドレスである。
コピー要求の送信後、取得制御部352は、コピー応答の受信をステップS709において待つ。
もし、所定時間(例えば、図14のステップS606の所定時間TO_bulkと同じでもよい)以内に正常なコピー応答が選択通信端点から受信されなければ、処理はステップS707へと戻る。逆に、所定時間TO_bulkにコピー要求に対する応答を取得制御部352が受信した場合、処理はステップS710に移行する。
なお、上記では説明を省略したが、取得制御部352は、ステップS708でコピー要求を送信する前に、選択通信端点に対して、所定時間TO_bulkを問い合わせるための制御メッセージを送信してもよい。選択通信端点のノードは、選択通信端点に対応するキー領域にキーが属するエントリの数に応じた適宜の時間を、取得制御部352に返答してもよい。取得制御部352は、制御メッセージに対する応答に基づいて所定時間TO_bulkを設定し、その後、上記のようにステップS708でコピー要求を送信してもよい。
さて、コピー応答は、より詳しくは、ネットワークインタフェイス320で受信され、通信処理部330を介して、コピー要求の送信元であるキー領域管理部350c内の取得制御部352へと出力される。なお、コピー応答において、送信元IPアドレスは選択通信端点のIPアドレスであり、宛先IPアドレスはコピー要求の送信元IPアドレス(すなわち固定的なIPアドレス)である。
そして、コピー応答を受信した取得制御部352は、ステップS710において、受信したデータ(つまりコピー応答に含まれる全エントリ)をローカルストア310に保存する。
例えば上記(13−2)の例における選択通信端点は、キー領域K9の「第2通信端点」である。よって、コピー応答は、キー領域K9にキーが属するすべてのエントリを含む。したがって、ステップS710で取得制御部352は、キー領域K9にキーが属するすべてのエントリを、新たにローカルストア310に追加する。
また、次のステップS711で取得制御部352は、対象通信端点のIPアドレスをネットワークインタフェイス320に割り当てるよう、対応づけ部354に指示する。すると、対応づけ部354は、対象通信端点のIPアドレスをネットワークインタフェイス320に割り当てるための処理を行う。例えば、対象通信端点が「192.168.254.9:7000」という通信端点情報で識別される場合、ノード300自身のネットワークインタフェイス320には「192.168.254.9」というIPアドレスが対応づけられる。
なお、図14のステップS609と同様に、ステップS711において対応づけ部354は、通信処理部330内のインタフェイス設定ファイル332を直接書き換えてもよい。あるいは、対応づけ部354は、コマンドを発行することにより、通信処理部330の機能を呼び出して、通信処理部330にインタフェイス設定ファイル332を書き換えさせてもよい。
そして、次のステップS712において、コピー要求を送信した取得制御部352と同じキー領域管理部350c内の監視依頼部355が、1つ以上の他のノードを選んで依頼ノードリスト356に登録する。そして、監視依頼部355は依頼ノードリスト356に登録した各ノードに対して、対象通信端点の監視を要求する。
ステップS712は、「どの通信端点の監視が要求されるか」という点以外は、図14のステップS610と同様である。よってステップS712の詳細についての説明は省略する。
また、次のステップS713では、取得制御部352がフェイルオーバの完了を監視部360に報告する。すると、監視部360は、対象通信端点をローカルノード(つまりノード300自身)の監視対象から外す。つまり、監視部360は、対象通信端点を識別する通信端点情報を、対象ノードリスト361から削除する。なぜなら、対象通信端点に対応する物理的なノードは、いまやローカルノード300であって、リモートノードではないからである。
ステップS713での削除の後、図15の処理も終了する。なお、実施形態によっては、取得制御部352がステップS710〜S712の処理を実行するのと並行して、監視部360がステップS713の処理を実行してもよい。あるいは、ステップS713の処理がステップS710〜S712の処理の前に実行されてもよい。
ところで、以上説明した図15の処理において、ステップS701での生存確認メッセージの送信と、ステップS708でのコピー要求の送信と、ステップS712での監視依頼の送信は、図9の処理を含む。つまり、ARPテーブル331の状態によっては、ステップS701、S708、またはS712においてARP要求のブロードキャストとARPテーブル331の更新が行われることもある。
また、場合によっては、ステップS701、S708、またはS712での送信が、通信処理部330によるTCPコネクションの確立を含むこともある。
すなわち、生存確認メッセージとそれに対する応答は、本実施形態では、予め確立されたTCPコネクション上で送受信される。同様に、コピー要求とそれに対する応答も、予め確立されたTCPコネクション上で送受信される。また、監視依頼も、予め確立されたTCPコネクション上で送受信される。
よって、もし送信対象のメッセージに対応するTCPコネクションがまだ確立されていなければ、ステップS701、S708、またはS712における送信指示を契機として、通信処理部330が、TCPコネクションを確立するための処理を行う。具体的には、通信処理部330は、SYNセグメントの送信、SYN/ACKセグメントの受信、およびACKセグメントの送信により、TCPコネクションを確立する。
なお、上記のようなARP要求のブロードキャストは、例えば、通信処理部330がSYNセグメントを送信しようとしてARPテーブル331を参照した結果として、SYNセグメントの実際の送信に先立って行われることもある。あるいは、ARPエントリがエージングにより削除されるタイミングによっては、通信処理部330が確立済みのTCPコネクション上でデータセグメントを送信しようとしたときに、ARP要求がブロードキャストされることもあり得る。
また、ステップS702とS709でのタイムアウト処理は、クライアント400における図11のステップS303の処理と同様に、ARPテーブル331からのエントリの強制削除、再送制御、TCPコネクションの再確立などの処理を含んでいてもよい。そして、クライアント400に関して説明したのと同様に、例えば「アプリケーション層の監視部360とトランスポート層の通信処理部330のどちらが再送制御を行うのか」という観点などの、いくつかの観点において、具体的実装は様々に異なり得る。そこで、タイムアウト処理の詳細については、図18とともに後述する。
続いて、図16のフローチャートを参照して、監視されるノードが行う処理について説明する。つまり、図14のステップS610または図15のステップS712で監視依頼を送信したノードは、その後、図16の処理を実行する。より具体的には、ノード300の各キー領域管理部内の監視依頼部355が図16の処理を実行する。
ステップS801で監視依頼部355は、依頼ノードリスト356のエントリ数が所定数(以下では「E_req」と表記する)未満か否かを判断する。
なお、所定数E_reqは、2以上であることが望ましい。なぜなら、「偶然、監視するノードと監視されるノードの双方が故障している」という状況が、まれに(しかし無視することはできない程度に)起こり得るからである。当該状況において、もしE_req=1だと、監視されるノードの故障が検出不能である。
しかし、E_req>1であれば、「監視される1台のノードと監視するE_req台のノードがすべて故障している」という状況の確率はほとんどゼロである。よって、監視されるノードの故障は、監視するE_req台のノードのうちで正常な少なくとも1台のノードにより、確実に検出可能である。よって、E_req>1であることが望ましい。
そして、依頼ノードリスト356のエントリ数が所定数E_req以上ならば、処理はステップS802に移行する。逆に、依頼ノードリスト356のエントリ数が所定数E_req未満の場合、処理はステップS808に移行する。
ステップS802で監視依頼部355は、過去の所定期間(以下では「P_keepalive」と表記する)内に生存確認メッセージを送信してきていない依頼ノードがあるか否かを判断する。なお、以下の説明においては、依頼ノードリスト356の各要素により識別される各ノードを「依頼ノード」という。
ステップS802における所定期間P_keepaliveの長さは、例えば、生存確認メッセージの送信間隔I_keepaliveに適宜のマージンを加えた長さである。例えば、所定期間P_keepaliveが送信間隔I_keepaliveの2倍程度であってもよい。
もし、所定期間P_keepalive内に生存確認メッセージを送信してきていない依頼ノードがなければ、処理はステップS803に移行する。つまり、依頼ノードリスト356に登録されている各依頼ノードが、所定期間P_keepalive内に少なくとも1回は生存確認メッセージを送信してきている場合、すべての依頼ノードは正常に監視を続行中である。よって、処理はステップS803に移行する。
逆に、所定期間P_keepalive内に生存確認メッセージを送信してきていない依頼ノードがあれば、処理はステップS807に移行する。例えば、ある依頼ノードが故障してしまった場合、故障した依頼ノードからの生存確認メッセージの送信は途絶えてしまう。よって、依頼ノードが故障した場合などに、処理がステップS802からステップS807へと進むことがある。
ステップS803で監視依頼部355は、いずれかのノードから生存確認メッセージを受信するまで待つ。ネットワークインタフェイス320と通信処理部330を介して監視依頼部355がいずれかのノードから生存確認メッセージを受信すると、処理はステップS804に移行する。
なお、図15のステップS701に関して説明したとおり、生存確認メッセージの送信元IPアドレスは、管理用の固定的なIPアドレスである。また、生存確認メッセージの宛先IPアドレスは、キー領域とノードの対応関係に応じて動的に割り当てられるIPアドレスである。
ステップS804で監視依頼部355は、受信した生存確認メッセージの送信元のノードが依頼ノードリスト356に存在するか否かを判断する。
ここで、図8に関して説明したとおり、依頼ノードリスト356の各要素も固定的なIPアドレスである。
よって、受信した生存確認メッセージの送信元IPアドレスが依頼ノードリスト356に含まれれば、監視依頼部355は「受信した生存確認メッセージの送信元のノードが依頼ノードリスト356に存在する」と判断する。そして、処理はステップS805に移行する。
逆に、受信した生存確認メッセージの送信元IPアドレスが依頼ノードリスト356に含まれなければ、監視依頼部355は「受信した生存確認メッセージの送信元のノードが依頼ノードリスト356に存在しない」と判断する。そして、処理はステップS806に移行する。
ステップS805で監視依頼部355は、「ノード300(より詳細には、監視依頼部355を含むキー領域管理部)が生存している」と示す通常の応答を返す。
つまり、監視依頼部355は、以下の(14−1)〜(14−4)のような応答を生成する。
(14−1)送信元IPアドレスは、監視依頼部355を含むキー領域管理部に対応するIPアドレスである。
(14−2)宛先IPアドレスは、生存確認メッセージの送信元IPアドレスである。
(14−3)DBヘッダのタイプ(またはサブタイプ)は、生存確認メッセージに対する応答であることを示す。
(14−4)DBヘッダまたはDBペイロードは、「以後も監視が必要であること」を示す情報を含む。
そして、監視依頼部355は、生成した応答を、通信処理部330とネットワークインタフェイス320を介して、生存確認メッセージの送信元ノードに送信する。送信後、処理はステップS801に戻る。なお、ステップS805で送信された応答は、図15の処理を実行する依頼ノードにおいて、ステップS702で受信される。
ところで、依頼ノードリスト356に登録されていないノードからの生存確認メッセージを受信した場合、監視依頼部355は、ステップS806において、「以後は監視不要である」と指定した応答を返す。ステップS806で返される応答は、(14−1)〜(14−3)の点で、ステップS805で返される応答と同じである。違いは、ステップS806で返される応答には(14−4)の情報の代わりに「監視不要」を示す情報が含まれる点である。
なお、ステップS806においても、監視依頼部355が生成した応答は、通信処理部330とネットワークインタフェイス320を介して送信される。そして、送信後、処理はステップS801に戻る。また、送信された応答は、図15の処理を実行する依頼ノードにおいて、ステップS702で受信される。
さて、ステップS807の処理は、所定期間P_keepalive内に生存確認メッセージを送信してきていない依頼ノードがある場合に実行される。ステップS807で監視依頼部355は、所定期間P_keepalive内に生存確認メッセージを送信してきていない各依頼ノードのIPアドレスを依頼ノードリスト356から削除する。そして、処理はステップS801に戻る。
また、依頼ノードリスト356のエントリ数が所定数E_req未満のとき、ステップS808で監視依頼部355は、不足に応じて、新たなノードを選ぶ。例えば、所定数E_reqが3であり、依頼ノードリスト356のエントリ数が1の場合、監視依頼部355は、2(=3−1)台のノードを新たに選ぶ。
図14のステップS610に関して述べたとおり、監視依頼部355は、分散DBシステムで使われる固定IPアドレスの集合を予め認識しており、ノード300自体に固定的に割り当てられているIPアドレスも予め認識している。よって、監視依頼部355は、ステップS808においても、固定IPアドレスの集合の中から、ローカルノード300以外の他のノードに割り当てられているIPアドレスを選択することができる。
そして、監視依頼部355は、不足に応じて新たなノードを選ぶと(換言すれば、各ノードの固定IPアドレスを選ぶと)、次にステップS809において、選んだ各ノードにノード300の監視を依頼する。より具体的には、監視依頼部355は、監視依頼部355を含むキー領域管理部に対応する通信端点を監視対象として指定する監視依頼を生成する。そして、監視依頼部355は、生成した監視依頼を、通信処理部330とネットワークインタフェイス320を介して送信する。
例えば、以下の(15−1)〜(15−3)の仮定が成り立つとする。
(15−1)対応表340は、図8の対応表601のとおりである。
(15−2)図16の処理を実行している監視依頼部355は、キー領域管理部350b内の監視依頼部355である。
(15−3)キー領域管理部350bは、「4」というインデックスで識別されるキー領域K4の「第3通信端点」に対応する。
上記(15−1)〜(15−3)の場合、キー領域管理部350bの監視依頼部355は、「192.168.254.36:7000」という通信端点情報により、監視対象の通信端点を指定する。なお、図14のステップS610と同様に、ステップS809で送信される監視依頼においても、送信元IPアドレスとして、固定IPアドレスが使われてもよいし、監視対象の通信端点のIPアドレスが使われてもよい。
また、次のステップS810で監視依頼部355は、ステップS808で選んだ各ノードを対象ノードリスト361に追加する。つまり、監視依頼部355は、ステップS808で選んだ各固定IPアドレスを依頼ノードリスト356に追加する。そして、処理はステップS801に戻る。
なお、本実施形態では、生存確認メッセージと、生存確認メッセージに対する応答は、確立済みのTCPコネクション上で送信される。つまり、ステップS805とS806では、ステップS803で受信された生存確認メッセージが送られるのに使われた確立済みのTCPコネクション上で、応答が送信される。
また、本実施形態では、監視依頼も確立済みのTCPコネクション上で送信される。よって、ステップS809で監視依頼を生成した監視依頼部355から監視依頼の送信を指示された通信処理部330は、場合によっては、まずTCPコネクションを確立するための処理を行う。つまり、ステップS809での監視依頼の送信のために、SYNセグメントの送信から始まる一連の処理が行われることがある。
なお、監視依頼の送信元IPアドレスに、監視対象の通信端点のIPアドレスが使われる場合は、監視依頼と、監視依頼に応じた生存確認メッセージと、生存確認メッセージに対する応答が、すべて同じTCPコネクション上で送受信されてもよい。
そして、ステップS805、S806、およびS809のいずれも、図9の処理の呼び出しを含む。したがって、ARPテーブル331の状態によっては、ステップS805、S806、またはS809での送信が、ARP要求のブロードキャストとARPテーブル331の更新をともなうことがある。
続いて、図17〜22のシーケンス図を参照して、図3の分散DBシステムの動作シーケンスの例をいくつか説明する。図17〜22の例から理解されるように、図3のノードN11〜N18がそれぞれ図9〜10および図13〜16のフローチャートにしたがって動作することにより、分散DBシステム全体がうまく動作する。
なお、図17〜22の説明においては、以下の(16−1)〜(16−3)のように仮定する。
(16−1)図3のノードN11〜N18のそれぞれは、図5のノード300のように構成されている。
(16−2)図3のクライアント202は図6のクライアント400のように構成されている。
(16−3)ノード300の対応表340とクライアント400の対応表431は、図8の対応表601のとおりである。
さて、図17は、クライアント202からの要求とノードからの正常な応答のシーケンス図である。図17〜22では紙幅の都合上、ノードN11〜N18のうち、ノードN15〜N18は省略されている。
まず、クライアント202のアプリケーション440が、「abc」というキーを指定してリード操作を行うようDB要求処理部430に指示する。すると、DB要求処理部430は図11の処理を開始する。
以下では説明の便宜上、「abc」というキーが属するキー領域が、「1」というインデックスで識別されるキー領域K1であるものとする。すると、図11のステップS302で指定される第1通信端点とは、図8によれば、具体的には「192.168.254.1:7000」という通信端点情報で識別される通信端点のことである。
DB要求処理部430は、図11のステップS302において、上記の第1通信端点へのリード要求の送信を通信処理部420に指示する。すると、通信処理部420は、クライアント202と、DB要求処理部430から指定された通信端点の間にTCPコネクションが存在するか否かを確認する。ところが、図17の例では、まだTCPコネクションが存在しない。
そこで、通信処理部420は、「192.168.254.1:7000」という通信端点情報で識別される通信端点とクライアント202との間にTCPコネクションを確立しようとする。具体的には、通信処理部420は、SYNセグメントを送信しようとする。そして、SYNセグメントの送信のために、図9の処理が呼び出される。
図17の例は、図9のステップS102の検索においてエントリが見つからない場合の例である。したがって、図9のステップS105では、具体的には図17のステップS901に示すように、TPA(Target Protocol Address)として「192.168.254.1」というIPアドレスが指定されたARP要求701が、クライアント202からブロードキャストされる。
ARP要求701は、図3のブロードキャストドメイン200内の各装置で受信される。そして、ARP要求701を受信した各装置は、図10にしたがって動作する。
ここで、ARP要求701がブロードキャストされた時点において、「192.168.254.1」というIPアドレスが、ノードN11のネットワークインタフェイス320に割り当てられているものとする。すると、図17のステップS902に示すように、ノードN11が図10のステップS204でARP応答702をクライアント202に返す。
ARP応答702には、SHA(Sender Hardware Address)としてノードN11のネットワークインタフェイス320のMACアドレスが指定されている。以下では説明の便宜上、図17に例示するとおり、ノードN11のネットワークインタフェイス320のMACアドレスが「00−23−26−6A−C2−4C」であるものとする。
また、クライアント202はARP応答702を受信する。ARP応答702の受信は、図9のステップS106に相当する。よって、図9のステップS107に示すとおり、ARP応答702を受信したクライアント202では、ARPテーブル421が更新される。
具体的には、図17のステップS903のとおり、クライアント202のARPテーブル421には、新たなARPエントリ703が追加される。ARPエントリ703は、「192.168.254.1」というIPアドレスと「00−23−26−6A−C2−4C」というMACアドレスを対応づけている。
こうして図9のステップS107に相当する図17のステップS903でARPエントリ703が追加されると、クライアント202は再度図9のステップS102でARPテーブル421を検索する。その結果、ステップS103では、新たに追加されたARPエントリ703が見つかる。
したがって、図9のステップS104で、クライアント202の通信処理部420は、宛先IPアドレスが「192.168.254.1」で宛先ポート番号が「7000」のSYNセグメントを生成する。そして、通信処理部420は、生成したSYNセグメントを、ネットワークインタフェイス410を介して送信する。
なお、このSYNセグメントの宛先MACアドレスは、「00−23−26−6A−C2−4C」である。よって、SYNセグメントは、ノードN11のネットワークインタフェイス320で受信され、ノードN11の通信処理部330に出力される。
その結果、ノードN11の通信処理部330は、SYN/ACKセグメントを生成し、ネットワークインタフェイス320を介してSYN/ACKセグメントをクライアント202に送信する。すると、SYN/ACKセグメントはクライアント202のネットワークインタフェイス410で受信されて通信処理部420に出力される。
その結果、クライアント202の通信処理部420は、ACKセグメントを生成し、ネットワークインタフェイス410を介してACKセグメントをノードN11に送信する。すると、ACKセグメントはノードN11のネットワークインタフェイス320で受信されて通信処理部330に出力される。
以上の3ウェイハンドシェイクによるTCPコネクションの確立が、図17ではステップS904の両向き矢印により表されている。そして、上記のとおり、TCPコネクションの確立は、図11のステップS302でのリード要求の送信のために行われる。
したがって、ステップS904でTCPコネクションが確立すると、次のステップS905に示すように、クライアント202のDB要求処理部430は、TCPコネクション上でリード要求704を送信する。リード要求704は図8のフレーム606のような形式だが、図17には一部のフィールドのみ抜粋して示してある。
リード要求704の宛先MACアドレスは、ARP応答702により判明したMACアドレス(すなわちノードN11のネットワークインタフェイス320のMACアドレス)であり、具体的には「00−23−26−6A−C2−4C」である。また、リード要求704の宛先IPアドレスと宛先ポート番号は、クライアント202が図11のステップS301で特定した第1通信端点を識別するIPアドレスとポート番号であり、具体的には「192.168.254.1」と「7000」である。
そして、リード要求704のDBヘッダで指定されているサブタイプは「リード要求」を示す値である。また、リード要求704のDBペイロードには、アプリケーション440が指定したキー(すなわち「abc」というキー)が指定されている。
そして、リード要求704はノードN11で受信される。また、リード要求704を受信した時点でノードN11は、「192.168.254.1:7000」という通信端点情報で識別される通信端点を担当している。つまり、「192.168.254.1:7000」という通信端点情報に対応するキー領域K1の全エントリがノードN11のローカルストア310には記憶されており、ノードN11には、キー領域K1に対応するキー領域管理部が存在する。
よって、リード要求704を受信したノードN11は、図13の処理を実行する。すると、図13のステップS503で、リード・ライト処理部351は、リード要求704に指定されている「abc」というキーに対応する「ABC」というバリューを、ローカルストア310から読み出す。
そして、図13のステップS504に対応する図17のステップS906では、「ABC」というバリューを含むリード応答705が、ノードN11からクライアント202へと送信される。もちろんリード応答705も、ステップS904で確立したTCPコネクション上で送信される。
以上のようにして、クライアント202は、リード応答705を受信する。
なお、DB要求処理部430が図11のステップS302でリード要求の送信を通信処理部420に指示してから、ステップS906での受信までの時間の長さは、図17の例では、図11のステップS303の所定時間TO_db以内であるものとする。したがって、図11の処理はステップS303からステップS304へと進む。その結果、クライアント202のDB要求処理部430は、ステップS304で、リード応答705から取得した「ABC」というバリューをアプリケーション440に返す。
続いて、図18を参照して、ノードの故障と引き継ぎの例について説明する。なお、図18の動作シーケンスは、下記(17−1)〜(17−7)を前提とする。
(17−1)ノードN13のネットワークインタフェイス320のMACアドレスは、「00−23−26−02−C6−D7」である。
(17−2)ある時点(以下「時点T1」という)において、ノードN13は、図14または図15の処理を実行した結果として、「3」というインデックスで識別されるキー領域K3を「第1通信端点」として新たに担当することになった。つまり、時点T1において、ノードN13のネットワークインタフェイス320には、「192.168.254.3」というIPアドレスが割り当てられた。
(17−3)ノードN13は、キー領域K3を「第1通信端点」として担当するに際して、「192.168.254.3:7000」という通信端点情報で識別される通信端点の監視を、少なくともノードN12に依頼した。
(17−4)時点T1は、図17のステップS901より前でもよいし、ステップS906より後でもよいし、ステップS901とステップS906の間の任意の時点であってもよい。また、時点T1は、図18の動作シーケンスの開始時点より前である。
(17−5)時点T1以後に、何らかの事情により、ノードN12のARPテーブル331には、「192.168.254.3」というIPアドレスと「00−23−26−02−C6−D7」というMACアドレスを対応づける、図18のARPエントリ706が登録された。
(17−6)図18の動作シーケンスの開始時点において、ARPエントリ706は、まだ削除されずにノードN12のARPテーブル331に残っている。
(17−7)図18の動作シーケンスの開始時点でも、ノードN13はまだキー領域K3を「第1通信端点」として担当している。
さて、以上の(17−1)〜(17−7)の仮定のもと、ステップS1001に示すように、ある時点でノードN13が故障したとする。
他方、(17−3)の仮定より、ノードN12の監視部360は、図15の処理を実行する。すなわち、ノードN12の監視部360は、「192.168.254.3:7000」という通信端点情報で識別される通信端点を監視する。そして、図18のステップS1002のタイミングで、ノードN12の監視部360は、図15のステップS701の処理を実行する。すると、宛先IPアドレスが「192.168.254.3」で宛先ポート番号が「7000」の生存確認メッセージ707が、ステップS1002において、ノードN12から送信される。
ステップS1002の動作の詳細は以下のとおりである。ノードN12の監視部360は、図15のステップS701で、生存確認メッセージ707を送信するよう通信処理部330に指示する。すると、通信処理部330は、「192.168.254.3:7000」という通信端点情報で識別される通信端点と、ノードN12の固定IPアドレスと所定のポート番号で識別される通信端点との間に、TCPコネクションが確立されているか否かを判断する。
ここでは説明の簡単化のため、TCPコネクションが既に確立されていたものとする。すると、通信処理部330は、確立済みのTCPコネクション上で生存確認メッセージ707を送信しようとする。つまり、通信処理部330は生存確認メッセージ707の送信のために図9の処理を開始する。
すると、図9のステップS102の検索において図18のARPエントリ706が見つかる。その結果、図9のステップS104で、図18の生存確認メッセージ707が送信される。
仮に、生存確認メッセージ707の宛先のノードN13が正常に動作していれば、ノードN13は、図16の処理を実行し、図16のステップS805で生存確認メッセージ707に対する応答を送信するであろう。しかし、ノードN13は、上記のとおりステップS1001で既に故障している。したがって、生存確認メッセージ707に対する応答は、ノードN13から送信されてこない。
また、ノードN12の監視部360は、図15のステップS702に示すように、生存確認メッセージ707に対する応答を受信するのを待っている。図18の例は、ステップS702でのタイムアウト処理の具体例の一つである。
図18の例では、通信処理部330は、例えばTCP/IPプロトコルスタックの標準ライブラリにより実装され、具体的には、TCPモジュール、IPモジュール、ARPモジュールなどを含む。そして、通信処理部330のTCPモジュールは、監視部360またはその他のモジュール(例えば取得制御部352など)からデータセグメントの送信を指示されると、データセグメントを送信する。その後、通信処理部330のTCPモジュールは、送信したデータセグメントに対するACKセグメントの受信を待つ。
もし、所定時間以内にACKセグメントが受信されなければ、通信処理部330のTCPモジュールは、データセグメントの再送を試みる。なお、ここでの「所定時間」は、具体的には、図14の時間TO_prop、図14と図15の時間TO_bulk、図14の時間TO_assign、および図15の時間TO_keepaliveのどれよりも短くてもよい。また、ACKセグメントは、もちろんピギーバックACKセグメントであってもよい。
通信処理部330のTCPモジュールは、所定のリトライ回数(例えば3回)までは、上記のようにしてデータセグメントの再送を試みてもよい。上記のようにして通信処理部330のTCPモジュールによりトランスポート層で行われる再送制御には、監視部360またはその他のアプリケーション層のモジュールは関与しなくてもよい。なお、紙幅の都合上、図18ではTCPモジュールによる再送は省略されている。
もし、通信処理部330のTCPモジュールが上記の所定のリトライ回数だけ再送を試みてもACKセグメントが受信されない場合、通信処理部330のTCPモジュールは、以下のように動作してもよく、以下に説明する動作が図18に例示されている。
すなわち、TCPモジュールは、TCPコネクションの切断を認識して、TCPコネクションをクローズする。また、TCPモジュールは、IPモジュールを介して間接的に、あるいは直接的に、ARPモジュールに異常を通知する。なお、異常の通知は、切断されたTCPコネクションで使われている宛先IPアドレス(すなわち、図18の例では「192.168.254.3」)を含む。
すると、異常の通知を受けたARPモジュールは、通知された宛先IPアドレスに対応するエントリ(すなわち、図18の例ではARPエントリ706)を、ARPテーブル331から強制的に削除する。一方で、TCPモジュールは、TCPコネクションの再確立を試みる。
図18の例では、ノードN12の通信処理部330のTCPモジュールは、(18−1)と(18−2)の通信端点間のTCPコネクションの再確立を試みる。
(18−1)ノードN12の監視部360が監視に用いる通信端点(つまりノードN12の固定IPアドレスと所定のポート番号により識別される通信端点)
(18−2)「192.168.254.3:7000」という通信端点情報で識別される通信端点
具体的には、TCPモジュールは、まずSYNセグメントを送信しようとする。そして、SYNセグメントの宛先IPアドレスは、(18−2)のとおり「192.168.254.3」である。また、上記のとおり、異常の通知にともなって、ARPエントリ706は既に強制的に削除されている。
したがって、SYNセグメントの送信のために図9の処理が呼び出されると、ステップS102の検索の結果、エントリが見つからない。そのため、ステップS105でARP要求がブロードキャストされる。
このステップS105でのブロードキャストが、図18にはステップS1003として示されている。すなわち、ステップS1003でブロードキャストされるARP要求708には、TPAとして「192.168.254.3」というIPアドレスが指定されている。
例えば、ステップS1001の「故障」が、実は「ネットワークインタフェイス320の交換のために一時的に陥った通信不能状態」にすぎない場合などは、ARP要求708のブロードキャストによってIPアドレスが解決されることもある。なぜなら、ステップS1003の時点ではノードN13のネットワークインタフェイス320の交換が完了している場合があり得るからである。
しかし、図18の例では、ノードN13は、ステップS1001で本当に故障しているものとする。また、ノードN13が修復不能であるか、または修復がステップS1003の時点には間に合わないものとする。故障の種類は、例えば、CPUなどのハードウェアの異常のこともあるし、OSまたはアプリケーションなどのソフトウェアの不具合のこともある。いずれにせよ、図18の例では、故障しているノードN13は、ARP要求708に対するARP応答を返すことができない。
そのため、ノードN12の通信処理部330のARPモジュールは、図9のステップS106で所定時間TO_arp以内にARP応答を受信することができない。その結果、図9の処理は異常終了する。つまり、通信処理部330は、SYNセグメントを送信することができず、TCPコネクションを再確立することもできない。
よって、通信処理部330は、図15のステップS701で生存確認メッセージ707の送信を指示した監視部360に対して、異常終了を報告する。図15のステップS702の所定時間TO_keepaliveは、通信処理部330のTCPモジュールにおける再送間隔やリトライ回数などに応じて、予め適切な値に決められる。つまり、所定時間TO_keepaliveは、(19−1)の時点から(19−2)の時点までにかかる時間以上の長さに、予め設定されているものとする。
(19−1)図15のステップS701で、監視部360が通信処理部330に生存確認メッセージ707の送信を指示した時点
(19−2)以上説明した一連の処理により、通信処理部330が異常終了を監視部360に報告する時点
そして、たとえ(19−1)の時点から所定時間TO_keepaliveがまだ経過していなくても、監視部360が通信処理部330から異常終了の報告を受けた場合は、図15の処理はステップS702からステップS706へと移行する。なぜなら、異常終了が通信処理部330から報告された場合、「たとえ所定時間TO_keepaliveが経過するまで待っても、監視部360は生存確認メッセージに対する応答を受信することができない」と見込まれるからである。
すると、ノードN12の取得制御部352は、図15のステップS706で、「192.168.254.3:7000」という通信端点情報で識別される通信端点に対応するキー領域K3に対応する他の2つの通信端点を対応表340において検索する。ここで、上記(16−3)より、対応表340は図8の対応表601のとおりである。よって、検索の結果、「192.168.254.19:7000」と「192.168.254.35:7000」という通信端点情報でそれぞれ識別される通信端点が見つかる。そして、図18の例では、以下の(20−1)〜(20−4)のとおり想定する。
(20−1)ノードN12においてキー領域K3に対応するキー領域管理部は、図5のキー領域管理部350cである。そして、図15のステップS708でノードN12のキー領域管理部350cの取得制御部352は、「192.168.254.19:7000」という通信端点情報で識別される通信端点を選ぶ。
(20−2)上記(20−1)での選択がなされた時点において、「192.168.254.19」というIPアドレスは、ノードN14のネットワークインタフェイス320に割り当てられている。
(20−3)上記(20−1)での選択がなされた時点において、選択通信端点と、ノードN12の監視部360が監視を行うための上記(18−1)の通信端点との間には、TCPコネクションが存在しない。
(20−4)上記(20−1)での選択がなされた時点において、ノードN12のARPテーブル331には、「192.168.254.19」というIPアドレスについてのエントリが存在しない。
以上の(20−1)〜(20−4)の想定によれば、ノードN12のキー領域管理部350cの取得制御部352は、(20−1)で選択した通信端点に対して、図15のステップS708で、キー領域K3の全データを要求する。つまり、取得制御部352は、ステップS708でコピー要求を生成し、生成したコピー要求を送信するよう通信処理部330に指示する。
すると、通信処理部330はコピー要求のデータセグメントを送信しようとする。しかし、上記(20−3)の想定より、TCPコネクションが存在しない。そこで、通信処理部330は、まずSYNセグメントを送信してTCPコネクションを確立しようとする。
そして、通信処理部330は、SYNセグメントの送信のために図9の処理を開始する。すると、上記(20−4)の想定より、図9のステップS102ではエントリが見つからない。したがって、ステップS105でARP要求がブロードキャストされる。
図18には、このステップS105がステップS1004として表されている。すなわち、ステップS1004でブロードキャストされるARP要求709には、取得制御部352が(20−1)で選択した「192.168.254.19」というIPアドレスがTPAとして指定されている。
図3のブロードキャストドメイン200に属する各装置は、ARP要求709を受信すると図10にしたがって動作する。よって、上記(20−2)の想定より、ノードN14から図10のステップS204でARP応答が返される。
図18には、このステップS204がステップS1005として表されている。すなわち、ステップS1005で送信されるARP応答710には、SHAとして、ノードN14のネットワークインタフェイス320のMACアドレスである「00−23−26−17−F3−B9」が指定されている。
そして、ステップS1004からステップS1005までの時間は、図9の所定時間TO_arp以下の長さである。したがって、ARP応答710を受信したノードN12の通信処理部330は、図9のステップS107でARPテーブル331を更新する。すなわち、図18のステップS1006に示すように、ノードN12の通信処理部330は、ARPテーブル331にARPエントリ711を追加する。ARPエントリ711は、「192.168.254.19」というIPアドレスと「00−23−26−17−F3−B9」というMACアドレスを対応づけている。
すると、ノードN12の通信処理部330は再度図9のステップS102でARPテーブル331を検索する。その結果、今度はARPエントリ711が見つかるので、ステップS104でSYNセグメントが送信される。
ここで、説明の簡単化のため、ノードN14は正常に動作しているとする。すると、SYNセグメントを受信したノードN14の通信処理部330は、SYN/ACKセグメントを送信する。その結果、ノードN12の通信処理部330は、SYN/ACKセグメントを受信し、ACKセグメントを送信する。そして、ノードN14の通信処理部330はACKセグメントを受信する。
以上の3ウェイハンドシェイクにより、「192.168.254.19:7000」という通信端点情報で識別される選択通信端点と、ノードN12上の上記(18−1)の通信端点との間に、TCPコネクションが確立する。図18では、以上の3ウェイハンドシェイクがステップS1007として表されている。
その後、ノードN12の通信処理部330は、図15のステップS708で取得制御部352から送信するよう指示されたコピー要求のデータセグメントを、確立したTCPコネクション上で送信する。このコピー要求の送信は、図15ではステップS708に相当し、図18ではステップS1008として表されている。
すなわち、図18に示すとおり、ステップS1008で送信されるコピー要求712には、ノードN12がデータを要求する対象のキー領域K3を識別する「3」というインデックスが指定されている。なお、コピー要求では、キー領域K3を識別する情報として、インデックスの代わりに、宛先IPアドレスそのものが使われてもよい。なぜなら、宛先IPアドレスである「192.168.254.19」はキー領域K3に静的に対応づけられているからである。
そして、ノードN12においてキー領域K3に対応する(つまり「192.168.254.19:7000」という通信端点情報に対応する)キー領域管理部350cの取得制御部352は、コピー要求712に対する応答の受信を待つ。図18の例では、ステップS1009に示すように、コピー要求712に対するコピー応答713が送信される。より具体的には、図15のステップS708での送信指示から所定時間TO_bulk以内に、ノードN12のキー領域管理部350cの取得制御部352は、コピー応答713を受信する。コピー応答713は、コピー要求712で指定されたキー領域K3にキーが属する全エントリのデータを含む。
コピー応答713の受信後、ノードN12のキー領域管理部350cの取得制御部352は、コピー応答713のデータを、図15のステップS710でローカルストア310に保存する。
そして、次のステップS711でノードN12のキー領域管理部350cの取得制御部352は、対象通信端点のIPアドレスを、ノードN12のネットワークインタフェイス320に割り当てるよう、対応づけ部354に指示する。その結果、ノードN12の監視部360が故障を検出したノードN13に今まで割り当てられていた「192.168.254.3」というIPアドレスは、新たに、ノードN12のネットワークインタフェイス320に割り当てられる。このステップS711での割り当てが、図18ではステップS1010として表されている。
また、図15のステップS712でノードN12のキー領域管理部350cの監視依頼部355は、「192.168.254.3:7000」という通信端点情報で識別される対象通信端点の監視を1つ以上の他のノードに要求する。そして、ステップS713でノードN12の監視部360は、対象通信端点を対象ノードリスト361から除外する。
したがって、たとえキー領域K3を「第1通信端点」として担当していたノードN13が図18のステップS1001のように故障しても、キー領域K3に関するノードN13の機能をノードN12が引き継ぐ。つまり、ノードN12は、新たにキー領域K3を「第1通信端点」として担当するようになる。よって、分散DBシステム全体としては、フェイルオーバ機能が実現される。
また、故障したノードN13は、キー領域K3以外のキー領域をさらに担当していたかもしれない。例えば、ノードN13は、ステップS1001で故障した時点において、キー領域K3を「第1通信端点」として担当するとともに、キー領域K15を「第2通信端点」として担当していたかもしれない。
その場合、キー領域K15に関するノードN13の機能は、キー領域K15の「第2通信端点」(すなわち、「192.168.254.31:7000」という通信端点情報で識別される通信端点)を監視する他のノードに引き継がれる。したがって、たとえ複数のキー領域を担当するノードが故障しても、各キー領域についてそれぞれフェイルオーバが行われる。
続いて、図18での引き継ぎの後に行われるDBアクセスについて、図19と図20を参照して説明する。図19と図20では前提条件が異なるので動作シーケンスも異なる。しかし、どちらの場合でも、クライアント202は、キー領域K3に属するキーを指定したDBアクセス要求を送信すると、キー領域K3を引き継いだノードN12からDBアクセス応答を受信することができる。
図19は、図18での引き継ぎ後にクライアント202のARPテーブル421が古い状態で行われるDBアクセスのシーケンス図である。図19の動作シーケンスの前提条件は以下の(21−1)〜(21−5)のとおりである。
(21−1)図18のステップS1001でノードN13が故障する前に、クライアント202は、キー領域K3に属するキーを指定したDBアクセス要求をノードN13に送信して、DBアクセス応答をノードN13から受信した。そして、当該DBアクセス要求と当該DBアクセス応答の送受信は、確立済みのTCPコネクション上で行われた。
(21−2)上記(21−1)のTCPコネクションは、図19の動作シーケンスの開始時点において、正常な手順(つまりFIN/ACKセグメントとACKセグメントの送受信を2方向のパイプそれぞれについて行う手順)によってはまだ切断されていない。
(21−3)上記(21−1)の通信の前には、クライアント202のARPテーブル421に図19のARPエントリ714が作成された(なお、ARPエントリ714は、図18でノードN13の故障前にノードN12が保持していたARPエントリ706と同じである)。
(21−4)ARPエントリ714は、図19の動作シーケンスの開始時点において、まだ削除されずにクライアント202のARPテーブル421に残っている。
(21−5)「def」というキーは、キー領域K3に属する。
さて、以上の(21−1)〜(21−5)の仮定のもと、ステップS1101でクライアント202は、上記(21−2)の既存のTCPコネクション上で、リード要求715などのDBアクセス要求か、または、何らかの管理用メッセージ716を送信する。
ここで、リード要求715に指定されるキーが「def」であるとする。この場合、上記(21−5)の仮定より、クライアント202のDB要求処理部430が図11のステップS301で見つける「第1通信端点」は、図8の対応表601によれば「192.168.254.3:7000」という通信端点情報で識別される。よって、リード要求715において、宛先IPアドレスは「192.168.254.3」であり、宛先ポート番号は「7000」である。
また、管理用メッセージ716の内容は任意であるが、管理用メッセージ716の宛先IPアドレスも「192.168.254.3」である。そして、(21−2)の仮定より、クライアント202の通信処理部420は、図19の処理の開始時点ではまだ(21−1)のTCPコネクションが切断されたことを認識していない。よって、通信処理部420は、改めて「SYNセグメントを送信する」などの処理をすることなく、(21−1)のTCPコネクション上でリード要求715または管理用メッセージ716のデータセグメントを送信しようとする。その結果、図9の処理が呼び出される。
そして、図9のステップS102でクライアント202の通信処理部420がARPテーブル421を検索すると、上記(21−4)の仮定より、ARPエントリ714が見つかる。その結果、リード要求715と管理用メッセージ716のいずれにも、宛先MACアドレスとして「00−23−26−02−C6−D7」というMACアドレスが指定される。
こうしてリード要求715または管理用メッセージ716のフレームが、図9のステップS104に相当する図19のステップS1101において、クライアント202の通信処理部420から送信される。ところが、ステップS1101の時点でノードN13は故障しているので、リード要求715または管理用メッセージ716に対する応答は返されない。
また、仮に例えば管理者がノードN13を故障から復旧させたと仮定し、正常な状態に復旧したノードN13がリード要求715または管理用メッセージ716を受信したとしても、応答は返されない。理由は以下のとおりである。
復旧したノードN13の通信処理部330は、ノードN13のネットワークインタフェイス320のMACアドレスが宛先MACアドレスに指定されたフレームを受信するかもしれない。しかし、図18のステップS1010で、「192.168.254.3」というIPアドレスは既にノードN12のネットワークインタフェイス320に割り当てられている。そして、復旧直後のノードN13には、図8の対応表601に現れる動的なIPアドレスは1つも割り当てられていない。ノードN13が今後図14または図15の処理を実行することではじめて、動的なIPアドレスがノードN13に割り当てられる。
したがって、リード要求715または管理用メッセージ716は、たとえ復旧したノードN13のネットワークインタフェイス320で受信されたとしても、ノードN13の通信処理部330により破棄される。なぜなら、リード要求715または管理用メッセージ716の宛先IPアドレスは、ノードN13のネットワークインタフェイス320に割り当てられていないからである。
よって、ノードN13が故障したままであろうが既に復旧していようが、いずれにせよクライアント202は、リード要求715または管理用メッセージ716に対する応答を受信することができない。
なお、図11に関して説明したように、クライアント202の通信処理部420のTCPモジュールは、所定時間が経ってもACKセグメントが受信されない場合には、データセグメントを再送してもよい(図19では再送を示す矢印は省略されている)。しかし、図19の例では、フレーム中の宛先MACアドレスと宛先IPアドレスが異なるネットワークインタフェイス320に対応しているので、トランスポート層での再送によっては問題が解決しない。
その結果、たとえクライアント202の通信処理部420のTCPモジュールが所定回数(例えば3回)の再送を繰り返したとしても、ACKセグメントは受信されない。したがって、TCPモジュールは、上記(21−2)の既存のTCPコネクションが切断されたことを認識する。そして、TCPモジュールは、コネクション切断のための適宜の処理(例えば、TCPコネクションのために使っていたRAM503上の領域の解放など)を行う。
さらに、TCPモジュールは、IPモジュールを介して間接的に、あるいは直接的に、ARPモジュールに異常を通知する。異常の通知を受けたARPモジュールは、図19のステップS1102に示すとおり、ARPエントリ714を強制的にARPテーブル421から削除する。
一方で、TCPモジュールは、TCPコネクションの再確立を試みる。すなわち、TCPモジュールは、TCPコネクションの再確立のため、まずSYNセグメントを送信しようとする。SYNセグメントの宛先IPアドレスは、リード要求715や管理用メッセージ716と同じく、「192.168.254.3」である。
よって、SYNセグメントの送信のために図9の処理が開始される。そして、図19のステップS1102での削除の結果、図9のステップS102の検索ではエントリが見つからない。したがって、図9のステップS105でARP要求がブロードキャストされる。このステップS105が、図19ではステップS1103として表されている。つまり、ステップS1103で送信されるARP要求717には、TPAとして上記の「192.168.254.3」というIPアドレスが指定されている。
図3のブロードキャストドメイン200内の各装置は、ARP要求717を受信すると、図10にしたがって動作する。その結果、図19のステップS1104に示すとおり、ノードN12からARP応答718が送信される。なぜなら、図18のステップS1010の結果、現在「192.168.254.3」というIPアドレスはノードN12のネットワークインタフェイス320に割り当てられているからである。
ARP応答718には、SHAとしてノードN12のネットワークインタフェイス320のMACアドレスである「00−23−26−9B−35−EF」が指定されている。また、ARP応答718は、クライアント202で受信される。
ARP応答718の受信は、図9のステップS106に相当する。よって、図9のステップS107に示すとおり、ARP応答718を受信したクライアント202では、ARPテーブル421が更新される。
具体的には、図19のステップS1105のとおり、クライアント202のARPテーブル421には、新たなARPエントリ719が追加される。ARPエントリ719は、「192.168.254.3」というIPアドレスと「00−23−26−9B−35−EF」というMACアドレスを対応づけている。
こうして図9のステップS107に相当する図19のステップS1105でARPエントリ719が追加されると、クライアント202は再度図9のステップS102でARPテーブル421を検索する。その結果、新たに追加されたARPエントリ719が見つかる。
したがって、図9のステップS104で、クライアント202の通信処理部420は、宛先IPアドレスが「192.168.254.3」で宛先ポート番号が「7000」のSYNセグメントを生成する。そして、通信処理部420は、生成したSYNセグメントを、ネットワークインタフェイス410を介して送信する。
なお、このSYNセグメントの宛先MACアドレスは、「00−23−26−9B−35−EF」である。よって、SYNセグメントは、ノードN12で受信される。そして、ノードN12はSYN/ACKセグメントを送信する。すると、クライアント202がSYN/ACKセグメントを受信し、ACKセグメントを送信する。
以上のようにして、ノードN12上の、「192.168.254.3:7000」という通信端点情報で識別される通信端点と、クライアント202上の通信端点との間に、3ウェイハンドシェイクによりTCPコネクションが確立される。この3ウェイハンドシェイクは、図19ではステップS1106の両向き矢印により表されている。
そして、ステップS1106で確立したTCPコネクション上で、リード要求または管理用メッセージが再送される。図19では紙幅の都合上、ステップS1101で送信されたデータセグメントがリード要求715であった場合の再送についてのみ、図示してある。
具体的には、クライアント202の通信処理部420は、ステップS1101での送信の契機としてDB要求処理部430から指示されたリード要求のデータセグメントを送信するため、図9の処理を開始する。すると、図9のステップS102の検索の結果、追加されたARPエントリ719が見つかる。
したがって、ステップS104でリード要求720のフレームが送信される。このステップS104が、図19ではステップS1107として表されている。
リード要求720のフレームは、宛先MACアドレスがリード要求715のフレームとは異なる。つまり、リード要求720の宛先MACアドレスは「00−23−26−9B−35−EF」である。しかし、宛先IPアドレス、宛先ポート番号、サブタイプ、キーなどは、リード要求715と720で同じである。
そして、リード要求720はノードN12で受信される。すると、ノードN12は図13にしたがって動作する。その結果、図13のステップS504に相当する図19のステップS1108において、指定された「def」というキーに対応する「DEF」というバリューを含むリード応答721が、ノードN12からクライアント202に送信される。
リード応答721は、クライアント202のネットワークインタフェイス410で受信され、DB要求処理部430に出力される。そして、図11の所定時間TO_dbは、以下の(22−1)の時点から(22−2)の時点までにかかる時間以上の長さとなるように、予め決められている。
(22−1)リード要求715の送信をDB要求処理部430が通信処理部420に指示した時点
(22−2)通信処理部420を介してDB要求処理部430がリード応答721を受信する時点
換言すれば、図19のような処理が行われた場合に上記(22−1)から(22−2)までにかかる時間が、下記(23−1)〜(23−2)などに基づいて予め見積もられる。そして、見積もりの結果に基づいて、所定時間TO_dbが適宜に決められる。
(23−1)通信処理部420のTCPモジュールにおいて、SYNセグメントとデータセグメントについてそれぞれ定められている、再送間隔やリトライ回数などの定数。
(23−2)通信処理部420のARPモジュールにおいて定められている、図9の所定時間TO_arp
したがって、クライアント202のDB要求処理部430が、通信処理部420を介してリード応答721を受信すると、図11において処理はステップS303からステップS304へと移行する。そして、DB要求処理部430は、リード応答721から得られる「DEF」というバリューをアプリケーション440に返す。
また、図19では図示を省略したが、管理用メッセージが再送される場合も、ステップS1107〜S1108と同様である。つまり、クライアント202からノードN12へと管理用メッセージが送信され、管理用メッセージに対する応答が、ノードN12からクライアント202へと送信される。
続いて、図19とは異なる前提条件の場合に、図18での引き継ぎ後に行われるDBアクセスの動作シーケンスについて、図20を参照して説明する。図20は、図18での引き継ぎ後にクライアント202でARPテーブル421が更新されてから行われるDBアクセスのシーケンス図である。図20の動作シーケンスの前提条件は以下の(24−1)〜(24−5)のとおりである。
(24−1)図18のステップS1001でノードN13が故障する前に、クライアント202は、キー領域K3に属するキーを指定したDBアクセス要求をノードN13に送信して、DBアクセス応答をノードN13から受信した。そして、当該DBアクセス要求と当該DBアクセス応答の送受信は、確立済みのTCPコネクション上で行われた。
(24−2)しかし、上記(24−1)のTCPコネクションは、何らかの理由により、図18のステップS1001より前に、正常な手順によりクローズされた。例えば、アプリケーション440が一旦終了する場合、アプリケーション440用に使われていたTCPコネクションをクローズする処理を、DB要求処理部430が行ってもよい。
(24−3)上記(24−1)の通信の前には、クライアント202のARPテーブル421に、図19と同じARPエントリ714が作成された。
(24−4)ARPエントリ714は、図20の動作シーケンスの開始時点において、まだ削除されずにクライアント202のARPテーブル421に残っている。
(24−5)「def」というキーは、キー領域K3に属する。
さて、上記(24−4)のとおり、クライアント202のARPテーブル421にはARPエントリ714がある。しかし、例えばアプリケーション440が一旦終了するなどの理由により、しばらくの間ARPエントリ714が使われないと、図20のステップS1201に示すように、ARPエントリ714は消滅する。なぜなら、通信処理部420はARPテーブル421の各エントリについてエージング処理を行うからである。
そして、ARPエントリ714が消滅した後で、クライアント202のアプリケーション440が再び起動されることがある。さらに、アプリケーション440がDB要求処理部430に対して、「def」というキーを指定してリード操作を行うよう指示することがある。すると、DB要求処理部430は図11の処理を開始する。
以降の処理の流れは、図17のステップS901〜S906と同様である。つまり、図17のステップS901〜S906と図20のステップS1202〜S1207の違いは、アプリケーション440により指定されるキーと、キーに応じて異なる情報の具体的な値のみである。
そこで、ステップS1202〜S1207については簡単に説明する。まず、図11の処理が開始されると、ステップS301で、「192.168.254.3:7000」という通信端点情報で識別される「第1通信端点」が特定される。
そして、ステップS302でDB要求処理部430は通信処理部420にリード要求の送信を指示する。しかし、(24−2)の仮定よりTCPコネクションが存在しない。よって、通信処理部420は、まずSYNセグメントを送信しようとする。
そして、SYNセグメントの送信のために図9の処理が呼び出される。ここで、ARPエントリ714は図20のステップS1201で既に消滅しているので、図9のステップS102の検索ではエントリが見つからない。よって、ステップS105でARP要求がブロードキャストされる。
このステップS105は図20のステップS1202に相当する。また、ステップS1202でブロードキャストされるARP要求722には、TPAとして「192.168.254.3」というIPアドレスが指定されている。
また、図18の処理の結果として、現在は、ノードN12のネットワークインタフェイス320に「192.168.254.3」というIPアドレスが割り当てられている。したがって、図20のステップS1203に示すとおり、ノードN12からARP応答723が返される。ARP応答723にはSHAとして、ノードN12のMACアドレスである「00−23−26−9B−35−EF」が指定されている。
すると、クライアント202がARP応答723を受信し、図9のステップS107のとおりARPテーブル421を更新する。このステップS107は図20ではステップS1204として表されており、具体的にはARPエントリ724がARPテーブル421に追加される。ARPエントリ724は、「192.168.254.3」というIPアドレスと「00−23−26−9B−35−EF」というMACアドレスを対応づけている。
通信処理部420は、ARPエントリ724を参照し、ネットワークインタフェイス410を介してSYNセグメントを送信する。その後、ノードN12がSYN/ACKセグメントを送信し、クライアント202はACKセグメントを送信する。以上の3ウェイハンドシェイクが、図20ではステップS1205の両向き矢印により表されている。
そして、ステップS1205で確立したTCPコネクション上で、次のステップS1206に示すように、クライアント202のDB要求処理部430はリード要求725を送信する。リード要求725の内容は図19のリード要求720と同様である。
すると、リード要求725を受信したノードN12は図13にしたがって動作し、図20のステップS1207に示すように、リード要求726を返す。リード要求726には、リード要求725で指定されている「def」というキーに対応する「DEF」というバリューが含まれる。「DEF」というバリューは、リード応答726を受信したDB要求処理部430により、図11のステップS304においてアプリケーション440に返される。
以上、図19〜20を参照して説明したとおり、ある通信端点に対応する物理的なノードが変化した後も、クライアント202は、ARPテーブル421に古いARPエントリが残っているか否かに関わらず、当該通信端点との間で通信を行うことができる。
続いて、図18の引き継ぎが行われた後に、図3のブロードキャストドメイン200に新たなノードN19が追加された場合の動作を、図21と図22を参照して説明する。
図21は、新規ノードの追加にともなう引き継ぎのシーケンス図である。
まず、ステップS1301で新たなノードN19が追加される。ノードN19は、具体的には例えば図7のコンピュータ500により実現されてもよい。ステップS1301では、単にノードN19のハードウェアが分散DBシステムに追加されるだけでなく、以下の(25−1)〜(25−3)のような作業も行われる。
(25−1)OSのインストール
(25−2)ハードウェアとしてのコンピュータ500を、図5のノード300のように構成された分散DBシステム内のノードN19として動作させるための、プログラムやデータのインストール
(25−3)保守用の固定的なIPアドレス(以下では説明の便宜上、「192.168.254.136」とする)の、ネットワークインタフェイス320への割り当て
なお、(25−1)でインストールされるOSの中には、図9と図10の処理をCPU501に実行させ、CPU501を通信処理部330として機能させるためのプログラムモジュールが含まれていてもよい。OSだけでなく、イーサネットドライバなどのデバイスドライバも、必要に応じてインストールされる。
また、(25−2)でインストールされるデータの例は、図5の対応表340である。そして、(25−2)でインストールされるプログラムの例は、図13〜16の処理の処理をCPU501に実行させ、CPU501をキー領域管理部350a〜350cや監視部360として機能させるためのプログラムである。
また、(25−1)〜(25−3)の作業は、システム管理者が手動で行ってもよいし、図3のデプロイサーバ201が自動的に行ってもよい。いずれにせよ、ステップS1301においては、ノードN19は、まだどのキー領域も担当していない。したがって、図8の対応表601に現れるどのIPアドレスも、まだノードN19のネットワークインタフェイス320には割り当てられていない。
ステップS1301で追加されたノードN19は、図14の処理を開始する。図21の例においては、ノードN19が図14のステップS601で、「192.168.254.3:7000」という通信端点情報で識別される通信端点をランダムに選び出したものとする。すると、ステップS602でノードN19は引き継ぎ提案を送信しようとする。
しかし、ノードN19は追加されたばかりなので、ノードN19と他の装置の間にはまだTCPコネクションが存在しない。また、ノードN19のARPテーブル331には、対応表340に現れるIPアドレスについてのエントリがまだ1つもない。
よって、ノードN19の通信処理部330はまず、(26−1)と(26−2)の通信端点間にTCPコネクションを確立しようとする。
(26−1)上記(25−3)の「192.168.254.136」という固定的なIPアドレスを含む、「192.168.254.136:7000」という通信端点情報により識別される、ノードN19上の通信端点
(26−2)「192.168.254.3:7000」という通信端点情報で識別される、選択通信端点
そして、ノードN19の通信処理部330は、TCPコネクションの確立のため、SYNセグメントを送信しようとし、図9の処理を開始する。ところが上記のとおり、ノードN19のARPテーブル331には、まだ「192.168.254.3」というIPアドレスについてのエントリがない。よって、図9のステップS102の検索ではエントリが見つからない。
そこで、ステップS105で通信処理部330はARP要求をブロードキャストする。このステップS105が図21ではステップS1302として表されている。ステップS1302でブロードキャストされるARP要求727には、TPAとして「192.168.254.3」というIPアドレスが指定されている。
図3のブロードキャストドメイン200内の各装置は、ARP要求727を受信すると、図10にしたがって動作する。また、図18の引き継ぎの結果として、ステップS1302の時点で「192.168.254.3」というIPアドレスは、ノードN12のネットワークインタフェイス320に割り当てられている。
したがって、図21にステップS1303として示すように、ノードN12からARP応答728が送信される。ARP応答728には、ノードN12のネットワークインタフェイス320のMACアドレスである「00−23−26−9B−35−EF」がSHAとして指定されている。
そして、ARP応答728を受信したノードN19の通信処理部330は、図9のステップS107でARPテーブル331を更新する。具体的には、ノードN19の通信処理部330は、図21のステップS1304に示すとおり、ARPエントリ729をARPテーブル331に追加する。ARPエントリ729は、「192.168.254.3」というIPアドレスと「00−23−26−9B−35−EF」というMACアドレスを対応づけている。
すると、ノードN19の通信処理部330は再度図9のステップS102でARPテーブル331を検索し、追加したARPエントリ729を見つける。よって、ステップS104でSYNセグメントのフレームが送信される。
すると、ノードN12の通信処理部330が、SYNセグメントを受信し、SYN/ACKセグメントを送信する。そして、ノードN19の通信処理部330が、SYN/ACKセグメントを受信し、ACKセグメントを送信する。以上の3ウェイハンドシェイクの結果、図21にステップS1305として示すように、ノードN19上の上記(26−1)の通信端点と、ノードN12上の上記(26−2)の通信端点の間にTCPコネクションが確立する。
そして、ステップS1305で確立したTCPコネクション上で、図14のステップS602の引き継ぎ提案が送信される。具体的には、図21にステップS1306として示すように、引き継ぎ提案730がノードN19からノードN12へ送信される。ノードN19は、引き継ぎ提案730の送信により、「宛先IPアドレスである『192.168.254.3』と宛先ポート番号である『7000』により識別される通信端点を、ノードN12からノードN19が引き継ぐこと」をノードN12に提案している。
そして、図21の例では、引き継ぎ提案730を受信したノードN12が、引き継ぎ提案730に対してステップS1307でACK応答731を返す。より詳しくは、ノードN12において、キー領域K3の「第1通信端点」のIPアドレスである「192.168.254.3」に対応するキー領域管理部内の、供給制御部353が、ACK応答731を返す。
すると、ノードN19の通信処理部330は、ACK応答731を受信する。そして、ノードN19は、キー領域K3に対応する(より詳しくは、「192.168.254.3」というIPアドレスに対応する)キー領域管理部を新たに生成し、図14の処理はステップS605へと進む。
なお、以下では説明の便宜上、図5のキー領域管理部350aが上記のようにしてノードN19内に新たに生成されたものとする。ノードN19には、まだ1つのキー領域管理部350aしかない。
さて、ノードN19内に生成されたキー領域管理部350aの取得制御部352が、図14のステップS605で、ノードN12上の上記(26−2)の通信端点に対して、引き継ぎ要求を送信する。このステップS605が図21ではステップS1308として表されている。
ステップS1308で送信される引き継ぎ要求732は、例えば図21に示すように、引き継ぎ対象のキー領域K3を識別する「3」というインデックスを含んでもよい。あるいは、キー領域K3は、引き継ぎ要求732の宛先IPアドレスである「192.168.254.3」自体によっても識別することができるので、引き継ぎ要求732はインデックスを含まなくてもよい。
いずれにしろ、ノードN12は、引き継ぎ要求732を受信すると図21のステップS1309に示すように、引き継ぎ応答733を返す。引き継ぎ応答733は、ノードN12のローカルストア310から読み出されてコピーされた、キー領域K3にキーが属する全エントリのデータを含む。
なお、以上の引き継ぎ提案730、ACK応答731、引き継ぎ要求732、および引き継ぎ応答733はすべて、ステップS1305で確立されたTCPコネクション上で送受信される。
ノードN19のキー領域管理部350aの取得制御部352は、通信処理部330を介して引き継ぎ応答733を受信すると、図14のステップS607において、引き継ぎ応答733に含まれる全エントリのデータをローカルストア310に保存する。
一方、引き継ぎ応答733を送信し終わったノードN12では、TCPコネクションをクローズするための処理が開始される。なお以下では、図18に関する(20−1)の仮定と同様に、便宜上、ノードN12においてキー領域K3に対応する(換言すれば「192.168.254.3」というIPアドレスに対応する)キー領域管理部が、図5のキー領域管理部350cであるとする。
ノードN12のキー領域管理部350cの供給制御部353は、通信処理部330に対して、引き継ぎ応答733の送信に用いたTCPコネクションをクローズするよう指示する。すると、ノードN12の通信処理部330は、FIN/ACKセグメントを送信する。そして、ノードN19の通信処理部330は、FIN/ACKセグメントを受信すると、ノードN12にACKセグメントを返す。
また、ノードN19がキー領域K3(より詳しくは、キー領域K3の「第1通信端点」)をノードN12から引き継いだ後に、ノードN19がノードN12に送信するデータは特にない。よって、ノードN19の通信処理部330も、FIN/ACKセグメントを送信する。そして、ノードN12の通信処理部330は、FIN/ACKセグメントを受信すると、ノードN19にACKセグメントを返す。ステップS1305で確立されたTCPコネクションは、以上のようにして、ステップS1310でクローズされる。
また、さらにステップS1311では、ノードN12のキー領域管理部350cが、「192.168.254.3」というIPアドレスの、ノードN12のネットワークインタフェイス320への割り当てを解消するための処理を行う。
具体的には、キー領域管理部350cの供給制御部353が対応づけ部354に割り当て解消を指示する。すると、対応づけ部354は、直接インタフェイス設定ファイル332を書き換えるか、または「ifconfig」コマンドなどのコマンドの発行により通信処理部330の機能を呼び出して、間接的にインタフェイス設定ファイル332を書き換える。
いずれにしろ、インタフェイス設定ファイル332からは、下記(27−1)と(27−2)の対応づけが削除される。
(27−1)ノードN12のネットワークインタフェイス320の、「00−23−26−9B−35−EF」というMACアドレス
(27−2)今までノードN12のネットワークインタフェイス320に割り当てられていた、「192.168.254.3」というIPアドレス
そして、「192.168.254.3」というIPアドレスのネットワークインタフェイス320への割り当てが解消されると、次に、ステップS1312でノードN12のキー領域管理部350cの供給制御部353は、割り当て指示734を送信する。具体的には、割り当て指示734も、通信処理部330とネットワークインタフェイス320を介して送信される。また、図21では紙幅の都合上省略されているが、ステップS1312の処理は、固定的な2つのIPアドレスを用いて識別される通信端点間のTCPコネクションを確立することをさらに含んでもよい。
割り当て指示734の送信元IPアドレスは、ノードN12に固定的に割り当てられた「192.168.254.129」というIPアドレスである。そして、割り当て指示734の宛先IPアドレスは、ノードN19に固定的に割り当てられた「192.168.254.136」というIPアドレスである。また、送信元ポート番号は例えば「7000」であり、宛先ポート番号も例えば「7000」である。
以上の送信元IPアドレス、送信元ポート番号、宛先IPアドレス、および宛先ポート番号で識別されるTCPコネクションがまず確立されてもよく、当該TCPコネクション上で、割り当て指示734が送信されてもよい。
なお、割り当て指示734には、宛先IPアドレスで識別されるノードN19に新たに割り当てる対象の「192.168.254.3」というIPアドレスが含まれる。そして、割り当て指示734は、ノードN19において、通信処理部330を介してキー領域管理部350aの取得制御部352で受信される。
すると、取得制御部352は、割り当て指示734にしたがって、図14のステップS609で、「192.168.254.3」というIPアドレスをネットワークインタフェイス320に割り当てるための処理を行う。つまり、取得制御部352は対応づけ部354に割り当てを指示する。すると、取得制御部352はインタフェイス設定ファイル332を直接書き換えるか、または、通信処理部330を介して間接的にインタフェイス設定ファイル332を書き換える。
その結果、インタフェイス設定ファイル332では、ノードN19のネットワークインタフェイス320のMACアドレスと、「192.168.254.3」というIPアドレスが対応づけられる。すなわち、「192.168.254.3」というIPアドレスが、ノードN19のネットワークインタフェイス320に割り当てられる。
以上のような図14のステップS609の処理が、図21ではステップS1313として表されている。また、図21では省略されているが、ノードN19のキー領域管理部350aの監視依頼部355は、続いて図14のステップS610の処理も行う。また、ステップS611で終了条件が満たされていなければ、ノードN19は再度ステップS601から図14の処理を繰り返す。
一方、ノードN12では、ステップS1311でのIPアドレスの割り当て解消の後、キー領域K3に対応するキー領域管理部350cは、キー領域K3に対応するエントリをローカルストア310から削除する。そして、キー領域管理部350cは、例えばキー領域管理部350c自体のスレッドを終了させることにより、キー領域管理部350c自体を消滅させる。
以上の図21の動作シーケンスによれば、ステップS1311からステップS1313までのごく短い期間は、「192.168.254.3」というIPアドレスがどのノードにも割り当てられていない。よって、もし宛先IPアドレスが「192.168.254.3」のパケットが当該期間中に送信されると、当該パケットは廃棄されて消えてしまう。
しかしながら、例えば当該パケットに対する応答についてのタイムアウト処理などが行われる過程で、ARPエントリの強制削除とARP要求のブロードキャストなどが行われる。そして、ステップS1311からステップS1313までの時間はごくわずかなので、例えばARP要求がブロードキャストされる時点では、既にステップS1313の割り当てが済んでいると期待される。つまり、「192.168.254.3」というIPアドレスがどのノードにも割り当てられていない期間がたとえあったとしても、分散DBシステムの可用性は、実質的にはほとんど低下しない。
また、図21のステップS1311〜S1313の手順によれば、「192.168.254.3」というIPアドレスが同時に2つのノードN12とN19に割り当てられるというコンフリクトが、確実に回避される。そして、一般に、ある1つのIPアドレスが複数の装置に同時に割り当てられている状態は、あるIPアドレスがどの装置にも割り当てられていない状態よりも、好ましくない。よって、ステップS1311〜S1313の手順は、問題回避のために好ましい手順である。
続いて、以上のようにして新規ノードN19に「192.168.254.3」というIPアドレスが割り当てられた後に、新規ノードN19がクライアント202からのDBアクセス要求に応答する動作シーケンスについて、図22を参照しながら説明する。
なお、図22の動作シーケンスは、下記(28−1)〜(28−3)を前提とする。
(28−1)図22の動作シーケンスの開始時点において、クライアント202のARPテーブル421は、図19のステップS1105で作成されたARPエントリ719、または図20のステップS1204で作成されたARPエントリ724を有する。なお、図19と図20に示すとおり、ARPエントリ719と724は同じ内容である。
(28−2)図19のステップS1106または図20のステップS1205で確立したTCPコネクションは、図20のステップS1311でのIPアドレスの割り当て解消により、事実上は既に切断されている。それにもかかわらず、図22の動作シーケンスの開始時点において、クライアント202の通信処理部420は、「図19のステップS1106または図20のステップS1205で確立したTCPコネクションが、依然として確立した状態である」と認識している。なぜなら、クライアント202もノードN12もFIN/ACKセグメントを送信しておらず、TCPレベルでのキープアライブ動作も本実施形態では行われないからである。そのため、図22の動作シーケンスの開始時点において、クライアント202の通信処理部420は、まだTCPコネクションの切断を認識していない。
(28−3)「ghi」というキーが属するキー領域は、「3」というインデックスで識別されるキー領域K3である。
さて、以上の(28−1)〜(28−3)の前提条件のもと、まず、クライアント202のアプリケーション440が、「ghi」というキーを指定してリード操作を行うようDB要求処理部430に指示する。すると、DB要求処理部430は図11の処理を開始する。図11のステップS302で指定される第1通信端点とは、(28−3)の仮定と図8によれば、具体的には「192.168.254.3:7000」という通信端点情報で識別される通信端点のことである。
DB要求処理部430は、図11のステップS302において、上記の第1通信端点へのリード要求の送信を通信処理部420に指示する。すると、通信処理部420は、TCPコネクションが存在するか否かを確認する。ここで(28−2)の仮定より、通信処理部420は、「TCPコネクションが存在する」と認識し、確立済みのTCPコネクション上でリード要求735を送信しようとする。リード要求735の送信は、図22ではステップS1401として表されている。
なお、リード要求735のデータセグメントの送信にあたっては、図9の処理が呼び出される。そして、(28−1)の仮定より、図9のステップS102の検索では「192.168.254.3」というIPアドレスに対応するエントリが見つかる。よって、ステップS104では、見つかったエントリに登録されている「00−23−26−9B−35−EF」というMACアドレスが、図22に示すごとく、リード要求735のフレームの宛先MACアドレスとして指定される。
リード要求735のフレームは、宛先MACアドレスにしたがってノードN12のネットワークインタフェイス320で受信され、ノードN12の通信処理部330に出力される。しかし、「00−23−26−9B−35−EF」というMACアドレスで識別されるノードN12のネットワークインタフェイス320への、「192.168.254.3」というIPアドレスの割り当ては、図21のステップS1311で解消済みである。
よって、ノードN12の通信処理部330は「リード要求735の宛先IPアドレスはノードN12のIPアドレスではない」と判断し、リード要求735を破棄する。したがって、リード要求735に対する応答がクライアント202に返ることはない。
他方、クライアント202のDB要求処理部430は、図11のステップS303に示すとおり、リード要求735に対する応答を受信するのを待つ。ところで、「リード要求735に対する応答がクライアント202に返されない」という状況は、「図19のステップS1101で送信されるリード要求715に対する応答がクライアント202に返されない」という状況と類似である。
したがって、詳しい説明は省略するが、図19のステップS1101〜S1103の処理の流れと同様にして、図22においても、ステップS1402でARP要求736がブロードキャストされる。なお、図22においては、クライアント202の通信処理部420のTCPモジュールによる再送や、ARPエントリ719(またはARPエントリ724)の強制削除は、省略されている。
ステップS1402で送信されるARP要求736には、TPAとして「192.168.254.3」というIPアドレスが指定されている。そして、図3のブロードキャストドメイン200内の各装置は、ARP要求736を受信すると、図10にしたがって動作する。
その結果、図22のステップS1403に示すとおり、ノードN19からARP応答737が送信される。なぜなら、図21のステップS1313に示すとおり、「192.168.254.3」というIPアドレスは、現在ノードN19のネットワークインタフェイス320に割り当てられているからである。
ARP応答737には、SHAとしてノードN19のネットワークインタフェイス320のMACアドレスである「00−24−D2−F0−94−3A」が指定されている。また、ARP応答737は、クライアント202で受信される。
ARP応答737の受信は、図9のステップS106に相当する。よって、図9のステップS107に示すとおり、ARP応答737を受信したクライアント202では、ARPテーブル421が更新される。
具体的には、図22のステップS1404のとおり、クライアント202のARPテーブル421には、新たなARPエントリ738が追加される。ARPエントリ738は、「192.168.254.3」というIPアドレスと「00−24−D2−F0−94−3A」というMACアドレスを対応づけている。以上のようにして、古いARPエントリ719または724が、新たなARPエントリ738に置き換えられる。
そして、上記のようにして図9のステップS107に相当する図22のステップS1404でARPエントリ738が追加されると、クライアント202は再度図9のステップS102でARPテーブル421を検索する。その結果、新たに追加されたARPエントリ738が見つかる。
また、ステップS1401からステップS1402へと至る過程は、上記では詳しい説明を省略したが、図19のステップS1101〜S1103の処理の流れと同様である。よって、図19のステップS1105でARPエントリ719が追加された後にステップS1106でTCPコネクションが確立されるのと同様にして、図22でも、ステップS1405でTCPコネクションが確立される。
具体的には、ステップS1404でARPエントリ738が追加された後、クライアント202の通信処理部420のTCPモジュールは、「192.168.254.3」というIPアドレスを宛先IPアドレスとするSYNセグメントを送信する。そして、SYNセグメントはノードN19で受信され、ノードN19がSYN/ACKセグメントを送信する。そして、クライアント202はSYN/ACKセグメントを受信し、ACKセグメントを送信する。
以上のようにして、ノードN19上の、「192.168.254.3:7000」という通信端点情報で識別される通信端点と、クライアント202上の通信端点との間に、3ウェイハンドシェイクによりTCPコネクションが確立される。そして、以上のようにしてステップS1405で確立したTCPコネクション上で、リード要求が再送される。
具体的には、クライアント202の通信処理部420は、ステップS1401での送信の契機としてDB要求処理部430から指示されたリード要求のデータセグメントを送信するため、図9の処理を開始する。すると、図9のステップS102の検索の結果、追加されたARPエントリ738が見つかる。
したがって、ステップS104でリード要求739のフレームが送信される。このステップS104が、図22ではステップS1406として表されている。
リード要求739のフレームは、宛先MACアドレスがリード要求735のフレームとは異なる。つまり、リード要求739の宛先MACアドレスは「00−24−D2−F0−94−3A」である。しかし、宛先IPアドレス、宛先ポート番号、サブタイプ、キーなどは、リード要求735と739で同じである。
そして、リード要求739はノードN19で受信される。すると、ノードN19は図13にしたがって動作する。その結果、図13のステップS504に相当する図22のステップS1407において、指定された「ghi」というキーに対応する「GHI」というバリューを含むリード応答740が、ノードN19からクライアント202に送信される。
リード応答740は、クライアント202のネットワークインタフェイス410で受信され、通信処理部420を介してDB要求処理部430に出力される。また、図11の所定時間TO_dbは、図19に関して説明したように、上記(23−1)〜(23−2)などの定数に基づいて、予め適切な長さに決められている。したがって、クライアント202のDB要求処理部430は、所定時間TO_db以内にリード応答740を受信することができる。よって、クライアント202における図11の処理はステップS303からステップS304へと移行する。そして、DB要求処理部430は、リード応答740から得られる「GHI」というバリューをアプリケーション440に返す。
以上、いくつかの具体的な条件下での分散DBシステム全体の振る舞いについて図17〜22を参照して説明したが、図9〜16のフローチャートによれば、他の条件下でも同様に分散DBシステムがうまく動作することは明らかであろう。
例えば、リード要求ではなくライト要求がクライアント202から送信された場合も、分散DBシステムはうまく動作する。また、図21のように新たに追加されたノードN19ではなく、既存のノード(例えばノードN15)が、キー領域K3(より具体的には、「192.168.254.3」というIPアドレスで識別される通信端点)をノードN12から引き継ぐ場合もあり得る。その場合も、図21と同様にうまく引き継ぎが行われる。
また、図14と図15のフローチャートには、所定時間以内に応答が受信されるか否かを判断する処理が含まれるが、所定時間の長さの定義は実施形態に応じて任意である。そして、「トランスポート層とアプリケーション層のどちらで、再送やARPエントリの強制削除が制御され、TCPコネクションの再確立のトリガがかけられるのか」ということも、実施形態に応じて任意である。図18および図21に関する説明は、一実装例にすぎない。
また、TCPコネクションの利用の仕方も実施形態に応じて任意である。
具体的には、例えば、1回確立されたTCPコネクション上で、要求と応答の送受信が複数回繰り返されてもよい。すると、クライアント202が何度もDBアクセス要求を繰り返す場合などに、TCPコネクションの確立のためのオーバヘッドの影響を小さくすることができる。
しかし、実施形態によっては、ある2つの通信端点間のTCPコネクションは、1つの要求と当該要求に対する応答のためだけに確立され、応答の送信後に正常の手順によりクローズされてもよい。
また、図21の例では、ステップS1311でのIPアドレスの割り当て解消の前に、ノードN12とノードN19の間のTCPコネクションがステップS1310でクローズされる。しかし、実施形態によっては、さらに他のTCPコネクションがステップS1311の前にクローズされてもよい。つまり、ノードN12は、ノードN19に委譲する「192.168.254.3」というIPアドレスを含む通信端点情報により識別される、ノードN12上の通信端点と、他の装置上の通信端点との間のTCPコネクションを、すべてクローズしてもよい。
ところで、図1のステップS1からステップS2に至る過程は、図14または図15のフローチャートによる引き継ぎに対応する。換言すれば、図18と図19の一連の動作シーケンス、図18と図20の一連の動作シーケンス、および図21と図22の一連の動作シーケンスは、いずれも、図1に示す変化の一例である。そこで、以下では、図1と図14〜22との関係について説明する。
図15の対象通信端点は、換言すれば、キーの定義域K内の互いに素な複数の部分集合K0〜KM−1のいずれか1つである対象部分集合に対応づけられている2以上の通信端点情報のうちの1つにより識別される通信端点である。そして、図15の処理は、対象通信端点を識別する通信端点情報を宛先として指定した生存確認メッセージを送信し、生存確認メッセージに対する応答を監視することを含む。また、図15の処理は、所定時間TO_keepalive以内に応答が返ってこない場合、宛先として指定した通信端点情報と対応づけられたネットワークインタフェイスを備える第1の他のコンピュータに障害が発生していると認識することを含む。
ここで、図15の処理を図1のコンピュータ100bが実行しているとする。すると、図1におけるステップS1からステップS2への変化は、「上記の対象部分集合が図1に示す特定の部分集合Kaであり、かつ、コンピュータ100bが障害の発生を認識した」という場合の図15のフローチャートによる引き継ぎに相当する。
つまり、生存確認メッセージの宛先は、図1の通信端点情報Paであり、したがって、上記の「第1の他のコンピュータ」は、監視対象としての図1のコンピュータ100aである。また、以下では、部分集合Kaに対応づけられた2以上の通信端点情報のうちで生存確認メッセージの宛先には指定されていないいずれか1つの通信端点情報と対応づけられたネットワークインタフェイスを備えるコンピュータを「第2の他のコンピュータ」という。
図1のコンピュータ100bは、コンピュータ100aにおける障害の発生を認識した場合、図15のステップS706〜S710のようにして、部分集合Kaにキーが属する図1のエントリ102を取得する。つまり、コンピュータ100bは、第2の他のコンピュータに、エントリ102を読み出して送信するように要求し、エントリ102を第2の他のコンピュータから受信する。例えば、図18の例では、ノードN13が「第1の他のコンピュータ」(つまり図1のコンピュータ100a)に相当し、ノードN12が図1のコンピュータ100bに相当し、ノードN14が「第2の他のコンピュータ」に相当する。
また、図14は、図1のステップS1の時点でコンピュータ100bが存在しない場合の例である。つまり、コンピュータ100bが新たに追加されて図14の処理を行うことで、図1のステップS1からステップS2へと状況が変化する。
図14のステップS601は、コンピュータ100bが、所定個数の通信端点情報のうちの1つを、図1の特定の部分集合Kaと対応づけられている特定の通信端点情報Paとして選択することにより、特定の通信端点情報Paを決定するステップに相当する。しかし、実施形態によっては、図14の処理を実行するコンピュータ100bが、通信端点情報Paを指定する指示を受け取ることにより、通信端点情報Paを決定してもよい。
例えば、図3のデプロイサーバ201は、さらに、分散DBシステム内の各ノードから各ノードの負荷に関する情報を収集してもよい。そして、デプロイサーバ201が、図1のコンピュータ100bに、収集した情報に基づいて、通信端点情報Paを指定する指示を与えてもよい。例えば、コンピュータ100aの負荷が高ければ、図1のステップS1においてコンピュータ100aのネットワークインタフェイスIaと動的対応づけ情報112により対応づけられている通信端点情報Paを、デプロイサーバ201が指定してもよい。
いずれにしろ、図1の一例としての図14では、まず、図1のステップS1では存在しないコンピュータ100bが新たに追加され、その後、図14のステップS601で図1のコンピュータ100bが通信端点情報Paを決定する。すると、コンピュータ100bは、通信端点情報Paと対応づけられたネットワークインタフェイスIaを備える第3の他のコンピュータからエントリ102を受信することで、エントリ102を取得する。
つまり、上記「第3のコンピュータ」は図1のコンピュータ100aに相当する。また、具体的にはコンピュータ100bは、コンピュータ100aに、コンピュータ100aが備える記憶装置101aからエントリ102を読み出して送信するように要求し、その結果として、上記のようにエントリ102を受信する。
なお、図21の例では、ノードN19が図14の処理を実行する図1のコンピュータ100bに相当し、ノードN12が上記の「第3の他のコンピュータ」としての図1のコンピュータ100aに相当する。
また、図1のステップS2の後、コンピュータ100bは、DBを分散して記憶する複数の記憶装置のうちの1つを備える第4の他のコンピュータからの要求に応じて、エントリ102を第4の他のコンピュータに送信することもある。そして、コンピュータ100bはさらに、通信端点情報Paとコンピュータ100bのネットワークインタフェイスIbとの対応づけを解除することもある。
例えば、図18の例では、上記のようにノードN12が図1のコンピュータ100bに相当する。そこで、図21でもノードN12が図1のコンピュータ100bに相当すると見なすことにすると、図21の例における上記の「第4の他のコンピュータ」はノードN19である。そして、図21のステップS1309の処理がエントリ102の送信に相当し、ステップS1311が通信端点情報PaとネットワークインタフェイスIbとの対応づけの解除に相当する。
また、コンピュータ100bは、対応づけを解除したことを第4の他のコンピュータに通知してもよい。図21のステップS1312での割り当て指示734の送信は、対応づけを解除したことの通知でもある。なぜなら、ノードN12で「192.168.254.3」というIPアドレスとネットワークインタフェイス320との対応づけが解除されたからこそ、ノードN19のネットワークインタフェイス320への当該IPアドレスの割り当てが可能になるからである。よって、割り当て指示734は、ノードN12での対応づけの解除が済んだことを含意している。
ところで、本発明は上記実施形態に限られるものではない。上記の説明においてもいくつかの変形について説明したが、上記実施形態は、さらに例えば下記の観点から様々に変形することもできる。そして、上記および下記の各種変形は、相互に矛盾しない限り、任意に組み合わせることが可能である。
上記実施形態におけるいくつかの処理は、閾値との比較を含む。例えば、図14のステップS606では、図14の処理を実行しているノード300が応答を待っている時間が、所定時間TO_bulkと比較される。閾値との比較は、実施形態により「比較対象の数値が、閾値を超えるか否か」を判断する処理でもよいし、「比較対象の数値が、閾値以上か否か」を判断する処理でもよい。
また、上記の説明では、閾値や、IPアドレスや、ポート番号や、MACアドレスなどに関して、具体的な値を例示したが、これらの具体的な値は、説明の便宜上のものにすぎない。
さらに、式(1)などに示したMの値(つまりキー領域の数)も、実施形態に応じて任意である。図8の対応表601では図示の便宜上、M=16という比較的小さな数を例示したが、例えば式(8)のようにM=128でもよい。もちろん、Mは、さらに大きな数でもよい。
ただし、キー領域の数Mは、物理的なノードの数の3〜10倍程度であることが好ましい。なぜなら、キー領域の数Mが少なすぎると、ノード間の負荷の偏りが大きくなるおそれがあるからである。
例えば、ノードの数が16台であるとし、図8の対応表601と同様に、各キー領域に対して3つの通信端点が対応づけられているものとする。そして、説明の簡単化のため、エントリ数やアクセス数は、キー領域間で偏りがほとんどないものとする。以上の想定のもとで、M=16の場合とM=128の場合を比較すると、下記のとおりである。
例えばM=16の場合、全部で48(=3M)個の通信端点が動的に16台のノードに割り当てられる。よって、平均して各ノードが3(=48/16)個のキー領域を担当する。
ここで、あるノードが故障したとして、今まで3個のキー領域を担当していたノードが、故障したノードから1つの通信端点を引き継いだとする。すると、引き継ぎにより4個の通信端点を担当することになったノードの負荷は、3個の通信端点を担当している平均的な他のノードの負荷の4/3倍(つまり約1.33倍)である。
他方、M=128の場合、全部で384(=3M)個の通信端点が動的に16台のノードに割り当てられる。よって、平均して各ノードが24(=384/16)個のキー領域を担当する。
ここで、あるノードが故障したとして、今まで24個のキー領域を担当していたノードが、故障したノードから1つの通信端点を引き継いだとする。すると、引き継ぎにより25個の通信端点を担当することになったノードの負荷は、24個の通信端点を担当している平均的な他のノードの負荷の25/24倍(つまり約1.04倍)である。
以上の例からも理解されるように、キー領域の数Mが少ないほど、粗い粒度でノード間に負荷が分散される。よって、キー領域の数Mが少ないほど、ノード間に負荷の偏りが生じやすい。そこで、負荷の偏りを少なくするためには、キー領域の数Mは、物理的なノードの数の、例えば3〜10倍程度であることが好ましい。
ところで、上記実施形態では、生存確認メッセージは、DBアクセス要求とは別の制御用メッセージである。しかし、DBアクセス要求を生存確認メッセージとして利用する実施形態も可能である。
例えば、図18と同様にノードN12がノードN13を監視する場合、ノードN12は、適宜選んだキーとバリューのペアを指定したライト要求をノードN13に送信し、ノードN13からの応答を監視してもよい。そして、ノードN12は、ノードN13から所定時間以内に応答を受信することができなければ、「ノードN13が故障している」と認識してもよい。
ノードN12は、ノードN13から所定時間以内に応答を受信した場合、さらに、上記ライト要求に指定したのと同じキーを指定したリード要求をノードN13に送信し、ノードN13からの応答を監視してもよい。そして、ノードN12は、ノードN13から所定時間以内に応答を受信することができなければ、「ノードN13が故障している」と認識してもよい。
ノードN12は、ノードN13から所定時間以内に応答を受信した場合、リード要求に対する応答に含まれるバリューと、上記ライト要求に指定したバリューを比較してもよい。そして、ノードN12は、2つのバリューが等しければ「ノードN13は正常である」と認識し、2つのバリューが異なれば「ノードN13が故障している」と認識してもよい。
以上のように、同じキーが指定されたライト要求とリード要求を、生存確認メッセージの代わりに利用する実施形態によれば、例えばリード・ライト処理部351にのみ生じた故障も検出可能である。
また、図14の処理では、引き継ぎ提案と引き継ぎ要求という2種類の制御メッセージが使われる。しかし、実施形態によっては、引き継ぎ提案と引き継ぎ要求を兼ねた1種類の制御メッセージが使われてもよい。その場合、応答は下記(29−1)または(29−2)である。
(29−1)引き継ぎ提案に対するACK応答と、引き継ぎ提案に対する引き継ぎ応答を兼ねた応答
(29−2)引き継ぎ提案に対するNACK応答と同様の応答
ところで、図5の対応表340と図6の対応表431の具体例として、図8には対応表601を例示した。そして、対応表601に例示したIPアドレスはすべてプライベートIPアドレスである。しかし、グローバルIPアドレスが使われてもよい。
例えば、図4のように異なるネットワークセグメントに複数のノードが分散している場合、グローバルIPアドレスが使われてもよい。例えば、説明の便宜上、(30−1)〜(30−4)のように想定する。
(30−1)図4のブロードキャストドメイン230内の装置用に割り当てられたグローバルIPアドレスの範囲は「200.1.2.0/24」である。
(30−2)そのうち、「200.1.2.1」〜「200.1.2.24」という24個のIPアドレスが、対応表340や431における通信端点情報用のIPアドレスとして利用可能である。
(30−3)ブロードキャストドメイン240の内の装置用に割り当てられたグローバルIPアドレスの範囲は「200.1.3.0/24」である。
(30−4)そのうち、「200.1.3.1」〜「200.1.3.24」という24個のIPアドレスが、対応表340や431における通信端点情報用のIPアドレスとして利用可能である。
上記(30−2)と(30−4)の想定より、合計48個のIPアドレスを用いて48個の通信端点が定義される。よって、上記(30−2)と(30−4)の想定によれば、対応表601と同様に、16個のキー領域の各々に3つの通信端点を対応づけることができる。
なお、(30−2)と(30−4)で同数のIPアドレスが定義されるのは単なる偶然である。環境に応じて、例えば「200.1.2.0/24」という範囲内の30個のIPアドレスと「200.1.3.0/24」という範囲内の18個のIPアドレスが使われてもよい。
ところで、対応表601と図3の例では、対応表601に現れる48個のIPアドレスは、図3のブロードキャストドメイン200内のノードN11〜N18のいずれにも割り当て可能である。しかし、上記(30−1)〜(30−4)に示した想定においては、IPアドレスの割り当てに制約がある。
つまり、上記(30−1)と(30−3)の仮定より、上記(30−2)に示した24個のIPアドレスは、図4のノードN21〜N23には割り当て可能であるが、ノードN24〜N25への割り当ては禁止される。そして、上記(30−1)と(30−3)の仮定より、上記(30−4)に示した24個のIPアドレスは、ノードN24〜N25には割り当て可能であるが、ノードN21〜N23への割り当ては禁止される。
なお、このようにIPアドレスの割り当てに制約がある実施形態においては、図14〜16の処理は、制約を満たすように変形される。
具体的には、図14のステップS601は、図14の処理を実行するノード300への割り当てが可能なIPアドレスにより識別される通信端点の中の1つを選択するように、変形される。例えば、ノードN22が図14の処理を実行する場合は、(30−2)の中の1つのIPアドレスにより識別される通信端点が、ステップS601で選択される。
また、「図15における対象通信端点のIPアドレスが、図15の処理を実行するノード300への割り当てが可能なIPアドレスである」という条件が満たされるように、図14〜16の処理が変形されてもよい。具体的には(31−1)〜(31−3)のように図14〜16の処理が変形されてもよい。
(31−1)図14のステップS610は、図14の処理を実行するノード300への割り当てが可能なIPアドレスの割り当てが可能な他のノードの中から監視依頼の宛先を選ぶように、変形される。例えば、ノードN22が図14の処理を実行する場合は、ノードN21とN23の中から監視依頼の宛先が選ばれる。
(31−2)図15のステップS712は、図15の処理を実行するノード300への割り当てが可能なIPアドレスの割り当てが可能な他のノードの中から監視依頼の宛先を選ぶように、変形される。例えば、ノードN22が図15の処理を実行する場合は、ノードN21とN23の中から監視依頼の宛先が選ばれる。
(31−3)図16のステップS809は、図16の処理を実行するノード300への割り当てが可能なIPアドレスの割り当てが可能な他のノードの中から監視依頼の宛先を選ぶように、変形される。例えば、ノードN22が図16の処理を実行する場合は、ノードN21とN23の中から監視依頼の宛先が選ばれる。
あるいは、(31−1)〜(31−3)のような変形の代わりに、図15のステップS706以降の処理が以下の(32−1)〜(32−3)のように変形されてもよい。
(32−1)対象通信端点のIPアドレスが、図15の処理を実行するノード300に割り当て可能か否かを判断するステップが、ステップS706の前に追加される。
(32−2)上記(32−1)のステップで、「対象通信端点のIPアドレスが、図15の処理を実行するノード300に割り当て可能」と判断された場合は、ステップS706以降の処理が行われる。
(32−3)上記(32−1)のステップで、「対象通信端点のIPアドレスの、図15の処理を実行するノード300への割り当ては禁止されている」と判断された場合は、ステップS706以降の処理は行われない。その代わり、ノード300は、対象通信端点のIPアドレスの割り当てが可能な他のノードを選んで、選んだノードに対して、対象通信端点の故障を通知する。そして、通知を受けたノードが代わりにステップS706〜S713の処理を行う。
また、図3のクライアント220や図4のクライアントPC260のように、ノード300とは別のブロードキャストドメインに属するクライアント400からのノード300へのアクセスについてさらに説明すれば、以下のとおりである。
ノード300とは別のブロードキャストドメインに属するクライアント400からのアクセスがあり得る実施形態においては、ノードに動的に割り当てられる通信端点情報におけるIPアドレスとして、グローバルIPアドレスが使われる。すなわち、ノード300内の対応表340およびクライアント400内の対応表431に現れるIPアドレスは、グローバルIPアドレスである。したがって、クライアント400が送信するDBアクセス要求の宛先IPアドレスは、グローバルIPアドレスである。
例えば、上記(30−1)〜(30−4)のように仮定し、さらに、ある時点において図4のノードN21のネットワークインタフェイス320に「200.1.2.10」というグローバルIPアドレスが割り当てられていると仮定する。そして、このグローバルIPアドレスに対応するキー領域に属するキーを指定したDBアクセス要求を、図4のクライアントPC260が送信したとする。すると、DBアクセス要求は、インターネット250とルータ231を介して、ノードN21に送信される。
具体的には、DBアクセス要求は、「200.1.2.10」というIPアドレスのネットワークアドレス部に基づいて、インターネット250を介してルータ231へと送信される。そして、ルータ231のARPテーブルに現状と矛盾する古いエントリが残っているのでない限り、DBアクセス要求は、ルータ231から正しくノードN21に送信される。
なお、ルータ231は、ルータ231自身がARP要求を送信してARP応答を受信することによって、ARPテーブルを更新することもある。また、ルータ231は、ブロードキャストドメイン230内の他の装置が送信したARP要求を受信することによって、ARPテーブルを更新することもある。
よって、多くの場合、ルータ231のARPテーブルには、「動的に割り当てられる(30−2)のIPアドレスがそれぞれ現在ブロードキャストドメイン230内のノードN21〜N23にどのように割り当てられているか」という状況が反映されている。
しかし、ときにはルータ231のARPテーブルに現状と矛盾する古いエントリが残っていることもあり得る。その場合、DBアクセス要求はブロードキャストドメイン230内で破棄されてしまい、クライアントPC260はDBアクセス応答を受信することができない。しかし、古いエントリはいずれルータ231のARPテーブルから消滅する。よって、クライアントPC260は、タイムアウトして、さらに適宜の時間待機してから、DBアクセス要求を再送してもよい。
あるいは、ノードN21〜N23へのIPアドレスの割り当てが変化するたびにルータ231のARPテーブルも確実に更新されるようにするために、各ノードN21〜N23(つまり図5のノード300)は、次のように動作してもよい。すなわち、対応づけ部354が、ネットワークインタフェイス320に新たなIPアドレスを対応づけるための処理を行うたびに、通信処理部330は、ARP要求を送信してもよい。
具体的には、通信処理部330は、TPAとSPAの双方に上記新たなIPアドレスを設定し、THA(Target Hardware Address)とSHAの双方にネットワークインタフェイス320のMACアドレスを設定して、ARP要求を送信してもよい。例えば、対応づけ部354が、以上のようなARP要求の送信を通信処理部330に命じてもよい。より詳しくは、対応づけ部354は、図14のステップS609の処理または図15のステップS711の処理を実行するたびに、以上のようなARP要求の送信を通信処理部330に命じてもよい。
すると、上記ARP要求を受信した各装置(例えばルータ231を含む)は、もしSPAに指定されたIPアドレスに対応するエントリをARPテーブル内に持っていれば、当該エントリを更新する。したがって、各ノードN21〜N23が上記のように動作することで、ノードN21〜N23へのIPアドレスの割り当てが変化するたびに、ルータ231のARPテーブル内の古いエントリも確実に更新される。
その結果、クライアントPC260が送信したDBアクセス要求は、ルータ231によって正しく宛先のノード300(例えば上記の例ではノードN21)に転送される。その結果、宛先のノード300はDBアクセス要求に応答し、クライアントPC260はDBアクセス応答を受信することができる。
もちろん、上記のようにTPAとSPAの双方に同じ新たなIPアドレスを指定したARP要求の送信は、図3のようなネットワーク環境の実施形態においても、同様に適用可能である。上記のようなARP要求により、ネットワークインタフェイスと通信端点の対応づけの変化が素早くARPテーブルに反映されるようになるので、上記のようなARP要求の送信は、DBアクセスの平均レイテンシを短縮する効果がある。
また、上記の実施形態では、主に「リンク層ではイーサネットが使われ、インターネット層ではIPが使われ、トランスポート層ではTCPが使われる」と想定した。しかし、通信プロトコルは実施形態により変更されてもよい。
例えば、トランスポート層ではUDPが使われてもよい。その場合、アプリケーション層で動作するモジュール(例えば、図5のキー領域管理部350a〜350cや監視部360、図6のDB要求処理部430など)が(33−1)〜(33−2)のように変形されてもよい。
(33−1)TCPが提供するのと類似の、コネクションに基づくセッション管理機能を実現する。
(33−2)IPアドレスの動的な再割り当てにともなうARPキャッシュのクリア動作に、責任を持つ。
あるいは、イーサネット以外の規格が利用されてもよい。例えば、サーバクラスタにおけるサーバ間のインタコネクトとして利用されるInfiniBandや、VIアーキテクチャ(Virtual Interface architecture)などが、ノード間の通信およびノードとクライアント間の通信に利用されてもよい。つまり、物理的なネットワークインタフェイスと論理的な通信端点とを対応づける仕組みを持ってさえいれば、上記に例示した以外のプロトコル(またはプロトコルスイート)であっても、利用可能である。そして、ノード300の通信処理部330とクライアント400の通信処理部420は、実際に使われるプロトコル(またはプロトコルスイート)に応じて、適宜実装されればよい。
以上、様々な実施形態について説明したが、いずれの実施形態も、「DBが複数のノードそれぞれの記憶装置に分散して記憶されている場合に生じ得る状況の変化に追従するためのアプリケーション層の仕組みを、簡単化することができる」という効果がある。
なぜなら、「各ノード(つまり、各ノードの記憶装置)が、キーの定義域K内の部分集合K0〜KM−1のいずれに対応するか」ということは、直接的かつ動的な対応づけにより管理されるのではなく、間接的な対応づけにより管理されるからである。より具体的に理由を説明すれば、以下のとおりである。
上記の実施形態では、部分集合と通信端点情報が静的に対応づけられる。さらに、そうして部分集合と静的に対応づけられた通信端点情報が、DBのエントリを記憶する記憶装置へのアクセスを提供するネットワークインタフェイス(すなわち、ノードのネットワークインタフェイス)と、動的に対応づけられる。その結果として、部分集合と記憶装置は、間接的に対応づけられる。
ここで、分散DBシステムにおいて生じ得る状況の変化とは、ノード構成の変化のことであり、換言すれば、各ノードの記憶装置と、キーの定義域内の部分集合との間の上記のような間接的な対応づけの変化である。また、記憶装置と部分集合との間接的な対応づけに利用されている、部分集合と通信端点情報の対応づけは、静的対応づけ情報111に示すごとく、状況の変化と関係なく静的なので、追従の必要がない。よって、記憶装置と部分集合との間接的な対応づけに利用されている、通信端点情報とネットワークインタフェイスとの対応づけの変化への追従さえ実現されれば、分散DBシステムにおける状況の変化への追従が実現される。
そして、通信端点情報とネットワークインタフェイスとの間の対応づけの変化は、アプリケーション層よりも下層に実装される通信プロトコル(例えばARP)を利用することで、追従可能である。例えば、図1の動的対応づけ情報112はARPテーブルにより実現されてもよく、動的対応づけ情報112の変化への追従は、ARPにより実現されてもよい。
こうして、上記実施形態によれば、ノード構成の動的な変化への追従のための処理は、大部分がアプリケーション層よりも下層に隠蔽される(encapsulated)。つまり、上記の実施形態によれば、ノード間での制御情報の交換のための、アプリケーション層における複雑なプロトコルなどは、不要である。
したがって、上記の実施形態によれば、アプリケーション層よりも下層に実装されるARPなどの通信プロトコルを利用することで、分散DBシステムの状況の変化に追従することが可能である。また、上記の実施形態によれば、ARPなどの下層の通信プロトコルの存在を利用することにより、分散DBシステムの状況の変化に追従するためのアプリケーション層の仕組みが、大幅に簡単化されている。
さらに、上記の様々な実施形態は、いずれも、DBが複数の記憶装置に分散している場合に生じ得る状況の変化に追従するためのコストを、低減する効果がある。なお、分散DBシステムにおけるノードの追加・削除などにともなうノード構成の変更に追従するためのコストには、様々な種類がある。例えば、個々のノードにおける処理負荷、ノード間の通信負荷、ノードとクライアントの間の通信負荷、通信プロトコルの複雑さ、各ノードおよびクライアントが管理用に保持する情報の量、などの様々な種類のコストがある。上記実施形態によれば、これらの種々のコストが低く抑えられる。種々のコストが抑制される理由は以下のとおりである。
なぜなら、第一に、ノードが記憶装置に記憶するエントリの範囲(つまりノードが担当するキー領域)と、通信端点とが、図1の静的対応づけ情報111(より具体的には対応表340と431)によって静的に対応づけられているからである。静的な対応づけのコストはきわめて低い。なぜなら、1回静的対応づけ情報111を記憶するためのわずかなコスト(例えば、図8の対応表601を図3のデプロイサーバ201から図5のノード300にコピーする処理のコスト)はかかるが、保守コストはゼロだからである。
そして、図8の対応表601の例からも分かるとおり、静的対応づけ情報111のデータ量は、キー領域の数Mの線形オーダであり、キー領域の数Mは、極端に大きくはない定数である。よって、静的対応づけ情報111に関しては、データ量という意味でのコストも低い。
そして、第二に、コンシステントハッシング(consistent hashing)が実現されているので、ノード構成の変更にともなう処理負荷も抑えられる。
一般に、ノード数が多い大規模な分散DBシステムでは、ノード数の多さゆえに「少なくとも1台のノードが故障している」といった状況は決して珍しくない。また、分散DBシステムの大きな利点の1つは、「ノードを増やすことにより(つまりスケールアウト(scale out)することにより)データ量の増加に対処することができる」というスケーラビリティにある。したがって、分散DBシステムにおいては、ノードの増加または減少によるノード構成の変化がしばしば起こり得る。
一方で、ノードが担当するキー領域の変更(換言すれば、ノード間でのデータの再配分)のための処理負荷は、データ量が多ければ決して軽くはない。なぜなら、大量のデータを記憶装置から読み出して送信する処理と、大量のデータを受信して記憶装置に書き込む処理が発生するからである。
よって、もし仮にノード構成の変化のたびに、変化とは直接関係しない他の多くのノードにおいても担当するキー領域が変わってしまうとすれば、分散DBシステム全体の性能が大きく低下してしまうだろう。したがって、ノード構成が変化しても、大多数のノードでは担当するキー領域が変化しないような仕組みが好ましい。具体的には、コンシステントハッシングが実現されることが好ましい。
本実施形態による分散DBシステムでは、特に図14〜16、18、21から明らかなように、コンシステントハッシングが実現される。すなわち、新規ノードが追加されたり、故障などの何らかの原因によって既存ノードが分散DBシステムから切り離されたりして、ノードの数が変化しても、担当するキー領域が変わるノードは、分散DBシステムに含まれるノードのうちのごく一部である。また、ノード間での負荷の偏りの是正などの何らかの目的のために、ノードとキー領域の間の対応関係が変化する場合も、担当するキー領域が変更されるノードは、分散DBシステムに含まれるノードのうちのごく一部である。
このように、上記実施形態によれば、コンシステントハッシングという、分散DBシステムにとって好ましい条件が満たされるので、ノード間でのデータの再配分のための処理負荷が低い。
また、第三に、ノードの構成変更への追従が、ARPなどの比較的シンプルなプロトコルを利用することで実現可能なため、プロトコルの複雑さという意味でのコストも低い。
多数の制御メッセージの交換を必要とするような専用の複雑なプロトコルがなくても、上記実施形態によれば、ノードの構成変更への追従が可能である。つまり、ノード構成の変化への追従を実現するための図1の動的対応づけ情報112として、ARPテーブル331と421を利用することで、プロトコルの複雑さという意味でのコストを抑えることができる。
なお、アプリケーション層において複雑なプロトコルが不要なことから、上記実施形態には、「分散DBシステムを開発するプログラマのプログラミングとデバッグの負担を減らせる」という効果もある。つまり、上記実施形態によれば、分散DBシステムにおけるノード構成の変化への追従を実現するための仕組みの一部が、アプリケーション層よりも下層に隠蔽される。その結果、上記実施形態のような分散DBシステムのアプリケーションは、アプリケーション層で複雑なプロトコルが使われるシステムと比較して、開発するためにプログラマにかかる負担が小さい。
そして、第四に、動的対応づけ情報112に関しては、データ量という意味でのコストも低い。
上記実施形態の分散DBシステムのためだけにARPテーブル331と421に保持されるエントリの数は、最大でも、キー領域とノードの対応関係に応じて動的に割り当てられるIPアドレスの数である。つまり、上記実施形態の分散DBシステムのためだけにARPテーブル331と421において増えるデータの量は、キー領域の数Mの線形オーダであり、キー領域の数Mは、極端に大きくはない定数である。よって、動的対応づけ情報112に関しては、データ量という意味でのコストも低い。
第五に、ノード構成の変化への追従のためのコストの一部は、ノード構成が変化しようが変化しまいが行われる処理に吸収されているので、吸収された分のコスト削減が実現される。詳しく説明すれば以下のとおりである。
上記実施形態では、ノード構成の変更への追従は、ノード(より詳細には、ノードのネットワークインタフェイス)と通信端点の動的対応づけにより行われる。そして、ノードと通信端点との動的対応づけは、ノード構成の変更の有無によらず、ネットワーク通信機能を持つコンピュータにおいて行われる。換言すれば、ノードのネットワークインタフェイスと通信端点との対応関係は、ノード構成の変更の有無によらず、繰り返し確認され、記憶される。
例えば、ARPエントリには寿命があるため、ノード構成の変更の有無によらず、ARP要求が一度ならず送信されることになる。その結果、MACアドレスとIPアドレスとの対応関係は、繰り返し確認されてはARPテーブルに記憶され直されることになる。
つまり、上記実施形態によれば、ノード構成が変更されなくても日常的に行われる処理が、ノード構成の変更への追従を可能とするための仕組みとして流用される。そのため、ノード構成の変更への追従を可能とするためだけに新たに生じる処理負荷は、比較的少ない。より具体的には以下のとおりである。
上記実施形態によれば、ノード構成の変化が直接の原因となって、ARP要求の送信という負荷が生じることも、もちろんある。しかし、そもそもARP要求は、ノード構成が変化しない場合にも送信されることがある。
例えば、単に時間が経過するだけでノード構成が変化しなくても、「古いARPエントリが削除され、その結果、ARP要求が送信される」ということが起こり得る。より具体的には、例えば、ノード間で生存確認メッセージやその他の管理用メッセージが定期的に送信される場合などに、時間の経過にともなうARPエントリの削除に応じて、ARP要求が送信される。あるいは、DBアクセスの間隔があく場合にも、時間の経過にともなうARPエントリの削除に応じて、ARP要求が送信されることがある。
したがって、「ノード構成の変化以外の原因(例えば時間の経過などの原因)で送信されるARP要求に応じてARPテーブル331と421が更新されると、ついでに、ノード構成の変化もARPテーブル331と421に反映される」ということもある。つまり、ノード構成が変化しようが変化しまいが行われる処理によって、ノード構成の変化への追従が実現されることがある。図20のステップS1202でのARP要求722の送信と、その結果として生じるステップS1204でのARPエントリ724の追加は、その例である。
換言すれば、ノード構成が変化しようが変化しまいが行われる処理が、ノード構成の変化への追従を実現するための処理の一部を兼ねており、ノード構成の変化への追従を実現するための処理の一部を肩代わりしている。そして、一部の処理が肩代わりされる分、ノード構成の変化への追従を実現するためのコストは削減される。
以上説明した第一から第五の理由により、上記実施形態によれば、種々のコストを低く抑えることができる。また、上記実施形態によれば、SPoFおよび性能のボトルネックとなり得るゲートウェイサーバのような装置も不要であるから、上記実施形態は耐障害性と性能の点でも優れている。
なお、上記実施形態では、通信端点情報として、IPアドレスとポート番号のペアか、または、IPアドレスが使われる。このような通信端点情報は、より一層論理的なFQDNと比べると、以下の点で優れている。
FQDNのIPアドレスへの解決にはDNSサーバが必要である。よって、DNSサーバはSPoFとなり得るし、分散DBシステム全体の性能のボトルネックともなり得る。それに対し、ARP要求とARP応答によるIPアドレスのMACアドレスへの解決には、SPoFやボトルネックになり得るような一元管理サーバは不要である。
また、コンピュータが通信を行う際には、FQDNはIPアドレスに解決される。よって、もし仮に各キー領域に静的に対応づけられたFQDNが通信端点情報として使われるとすると、キー領域とノードの対応関係が変化するたびに、FQDNとIPアドレスの対応づけをDNSサーバに登録し直す必要がある。また、あるキー領域のFQDNがあるノードから別のノードに引き継がれるたびに、当該FQDNを使って通信を行おうとする装置(クライアントまたは他のノード)は、DNSサーバへの問い合わせをしなければならない。そして、以上のようなDNSサーバへの登録のし直しや問い合わせは、ARP要求のブロードキャストとは異なり、ノード構成が変化しようが変化しまいが行われる処理には吸収されない。よって、FQDNの利用は、コスト削減につながらない。
したがって、IPアドレスとポート番号のペア(またはIPアドレス)により表される通信端点情報は、FQDNのようなより一層論理的な情報と比べて、上記実施形態の通信端点情報として好適である。
最後に、上記の種々の実施形態に関して、さらに下記の付記を開示する。
(付記1)
コンピュータに、
対応するキーが定められているエントリを複数含むデータベースから、前記キーの定義域の特定の部分集合にキーが属する1つ以上の特定のエントリを取得し、
取得した前記1つ以上の特定のエントリを、前記コンピュータに備えられており前記データベースを分散して記憶する複数の記憶装置の1つとして使われる記憶装置に記憶し、
2以上の所定個数の通信端点をそれぞれ論理的に識別するための前記所定個数の通信端点情報であって、各々は、前記複数の記憶装置のいずれかへのアクセスを提供するネットワークインタフェイスに動的に対応づけられるとともに、前記定義域内の互いに素な、前記特定の部分集合を含む複数の部分集合のいずれか1つに静的に対応づけられる、前記所定個数の前記通信端点情報のうち、前記特定の部分集合と対応づけられている特定の通信端点情報を、前記コンピュータのネットワークインタフェイスと対応づける
ことを含む処理を実行させる分散制御プログラム。
(付記2)
前記複数の部分集合のそれぞれに対して、2以上の通信端点情報が対応づけられており、
前記分散制御プログラムが前記コンピュータに実行させる前記処理は、
前記複数の部分集合のいずれか1つである対象部分集合に対応づけられている2以上の通信端点情報のうちの1つを宛先として指定したメッセージを送信し、
前記メッセージに対する応答を監視し、
所定時間内に前記応答が返ってこない場合、前記宛先として指定した前記通信端点情報と対応づけられたネットワークインタフェイスを備える第1の他のコンピュータに障害が発生していると認識する
ことをさらに含む
ことを特徴とする付記1に記載の分散制御プログラム。
(付記3)
前記対象部分集合が前記特定の部分集合であり、かつ、前記障害の発生を認識したときに、
前記特定の部分集合に対応づけられた前記2以上の通信端点情報のうちで前記メッセージの前記宛先には指定されていないいずれか1つの通信端点情報と対応づけられたネットワークインタフェイスを備える第2の他のコンピュータに、前記複数の記憶装置の1つとして前記第2の他のコンピュータが備える記憶装置から前記1つ以上の特定のエントリを読み出して送信するように要求し、
前記1つ以上の特定のエントリを、前記第2の他のコンピュータから受信する
ことを、前記1つ以上の特定のエントリを取得する処理が含むことを特徴とする付記2に記載の分散制御プログラム。
(付記4)
前記1つ以上の特定のエントリを取得する処理は、
前記所定個数の通信端点情報のうちの1つを前記特定の通信端点情報として選択するか、または、前記特定の通信端点情報を指定する指示を受け取ることにより、前記特定の通信端点情報を決定し、
決定した前記特定の通信端点情報と対応づけられたネットワークインタフェイスを備える第3の他のコンピュータに、前記複数の記憶装置の1つとして前記第3の他のコンピュータが備える記憶装置から前記1つ以上の特定のエントリを読み出して送信するように要求し、
前記1つ以上の特定のエントリを、前記第3の他のコンピュータから受信する
ことを含むことを特徴とする付記1に記載の分散制御プログラム。
(付記5)
前記複数の記憶装置のうちの1つを備える第4の他のコンピュータからの要求に応じて、前記1つ以上の特定のエントリを前記第4の他のコンピュータに送信し、
前記特定の通信端点情報と前記コンピュータの前記ネットワークインタフェイスとの対応づけを解除する
ことを、前記分散制御プログラムが前記コンピュータに実行させる前記処理がさらに含むことを特徴とする付記1から4のいずれか1項に記載の分散制御プログラム。
(付記6)
前記対応づけを解除したことを前記第4の他のコンピュータに通知することを、前記分散制御プログラムが前記コンピュータに実行させる前記処理がさらに含むことを特徴とする付記5に記載の分散制御プログラム。
(付記7)
暗号学的ハッシュ関数、剰余関数、および、入力ビット列から複数の所定の位置のビットを抽出する関数のうちの少なくとも1つを利用する所定の写像によるキーの像に基づいて、前記複数の部分集合が定義される
ことを特徴とする付記1から6のいずれか1項に記載の分散制御プログラム。
(付記8)
前記特定の部分集合に属するあるキーを指定して、前記あるキーと対応するエントリに対する読み出しまたは書き込みの操作を求める要求であって、前記特定の通信端点情報が宛先として指定されている要求を、前記コンピュータの前記ネットワークインタフェイスを介して受信し、
前記コンピュータが備える前記記憶装置に記憶されている前記1つ以上の特定のエントリのうちで、前記あるキーに対応する前記エントリにアクセスして、前記要求に応答する
ことを、前記分散制御プログラムが前記コンピュータに実行させる前記処理がさらに含むことを特徴とする付記1から7のいずれか1項に記載の分散制御プログラム。
(付記9)
前記通信端点情報がInternet Protocolアドレスを含むことを特徴とする付記1から8のいずれか1項に記載の分散制御プログラム。
(付記10)
前記通信端点情報がさらに、トランスポート層で定義されるポート番号を含むことを特徴とする付記9に記載の分散制御プログラム。
(付記11)
前記ネットワークインタフェイスは、Media Access Controlアドレスにより識別されることを特徴とする付記1から10のいずれか1項に記載の分散制御プログラム。
(付記12)
前記データベースがキー・バリュー・ストアであるか、または
前記データベースがリレーショナル・データベースであって、かつ、前記キーが前記エントリ内の所定のフィールドのデータである
ことを特徴とする付記1から11のいずれか1項に記載の分散制御プログラム。
(付記13)
コンピュータが、
対応するキーが定められているエントリを複数含むデータベースから、前記キーの定義域の特定の部分集合にキーが属する1つ以上の特定のエントリを取得し、
取得した前記1つ以上の特定のエントリを、前記コンピュータに備えられており前記データベースを分散して記憶する複数の記憶装置の1つとして使われる記憶装置に記憶し、
2以上の所定個数の通信端点をそれぞれ論理的に識別するための前記所定個数の通信端点情報であって、各々は、前記複数の記憶装置のいずれかへのアクセスを提供するネットワークインタフェイスに動的に対応づけられるとともに、前記定義域内の互いに素な、前記特定の部分集合を含む複数の部分集合のいずれか1つに静的に対応づけられる、前記所定個数の前記通信端点情報のうち、前記特定の部分集合と対応づけられている特定の通信端点情報を、前記コンピュータのネットワークインタフェイスと対応づける
ことを特徴とする分散制御方法。
(付記14)
情報処理装置であって、
ネットワークインタフェイスと、
対応するキーが定められているエントリを複数含むデータベースを分散して記憶する複数の記憶装置のうちの1つとして使われる記憶装置と、
前記データベースから、前記キーの定義域の特定の部分集合にキーが属する1つ以上の特定のエントリを取得して、取得した前記1つ以上の特定のエントリを、前記情報処理装置の前記記憶装置に記憶するための制御を行う取得制御手段と、
2以上の所定個数の通信端点をそれぞれ論理的に識別するための前記所定個数の通信端点情報であって、各々は、前記複数の記憶装置のいずれかへのアクセスを提供するネットワークインタフェイスに動的に対応づけられるとともに、前記定義域内の互いに素な、前記特定の部分集合を含む複数の部分集合のいずれか1つに静的に対応づけられる、前記所定個数の前記通信端点情報のうち、前記特定の部分集合と対応づけられている特定の通信端点情報を、前記情報処理装置の前記ネットワークインタフェイスと対応づける対応づけ手段
を備える情報処理装置。