まず本発明の実施の形態の概要について説明する。
本実施の形態では、次元数が二次元以上の格子型ネットワークにConsistent Hashの仮想リングを生成する際、仮想リング上で隣接するノードが格子型ネットワークで隣接するように配置する。
前記格子型ネットワークは、(次元数−1)個の座標が一致するノード間をネットワークスイッチで接続し、仮想リングを構成するノードを仮想リングに沿って一周するように、格子型ネットワークを最短経路でたどった場合、全てのネットワークスイッチを同じ回数だけ通過するように構成する。
また、本実施の形態では、プライマリノードとバックアップノードを仮想リング上で隣接する位置で、かつ、格子型ネットワークの異なる座標位置に配置する。
また、本実施の形態では、格子型ネットワークの各格子点にルータを配置し、仮想リングを構成する計算機を各ルータに接続する。
また、本本実施の形態では、各ネットワークセグメントが接続される格子点に配置したルータの接続方法に関して、格子型ネットワーク上の位置を示す座標要素の一つのみが一致しない(すなわち、(次元数−1)個の座標が一致する)ルータをトーラス結合する。
また、本実施の形態では、プライマリノードとバックアップノードとを仮想リング上で隣接する位置に配置し、クライアントが、プライマリノード及びバックアップノードへデータを書き込む場合、仮想リング上で中央に位置するノードにデータを送信し、クライアントからデータを受信したノードから他のノードへデータを転送することによって、分散データベースへデータを書き込む。
さらに、本実施の形態では、プライマリノードとバックアップノードとを仮想リング上で隣接する位置に配置し、クライアントが、プライマリノード及びバックアップノードへデータを書き込む場合、クライアントからネットワーク距離が近いノードへデータを送信し、クライアントからデータを受信したノードから他のノードへデータを転送することによって、分散データベースへデータを書き込む。
次に、本実施の形態について図面を参照して説明する。
図1は、本発明の実施形態の計算機システムの構成図である。
本実施の形態の計算機システム(分散データベースシステム)は、格子状に配置されたルータR1〜R16、各ルータを接続するネットワークスイッチSW−X1〜SW−X4、SW−Y1〜SW−Y4、分散データベースを構成するDB用計算機N1〜N16を備える。
各ルータは、X方向に伸びるネットワークスイッチSW−X1〜SW−X4、及びY方向に伸びるネットワークスイッチSW−Y1〜SW−Y4によって接続されている。DB用計算機N1〜N16は各ルータに接続されている。
従って、各ルータはX方向のスイッチSW−X1〜SW−X4が接続しているルータ間ネットワークセグメント、Y方向のスイッチSW−Y1〜SW−Y4が接続しているルータ間ネットワークセグメント、及び、DB用計算機N1〜N16が接続している計算機用ネットワークセグメント、の3種類のネットワークセグメントに接続する。なお、計算機用ネットワークセグメントには、複数の計算機が接続されてもよい。
この分散データベースシステムを利用するクライアント計算機C1〜Cnは、ネットワークスイッチSW−0を介して、ルータR00に接続されている。ルータR00は、さらにネットワークスイッチSW−X1〜SW−X4に接続しており、例えば、クライアント計算機C1が計算機N7にアクセスする場合、クライアント計算機C1は、ルータR00、ルータR7を経由して計算機N7にアクセスする。
ネットワークスイッチSW−0には、マスタ計算機M0が接続されている。マスタ計算機はネットワーク上のDB用計算機N1〜N16の座標、ネットワークアドレス、ハッシュ値の対応関係をノード管理テーブルT06(図13)として管理している。クライアント計算機C1〜Cnは、初回アクセス時及びシステムの構成変更時にマスタ計算機M0からノード管理テーブルT06を取得し、本テーブルに基づきアクセスするDB用計算機を決定する。ノード管理テーブルT06があれば、キー値からキー値を保存すべきDB用計算機を一意に決定することができるため、2回目以降のアクセス時は、クライアント計算機C1〜Cnとマスタ計算機とは通信する必要がない。
このような格子型ネットワークでは、ルータR1〜R16、ルータR00に適切なルーティングテーブルを設定する必要があるが、OSPF(Open Shortest Path First)等のルーティング・プロトコルを利用することによって、各ルータにルーティングテーブルを自動設定することができる。但し、各ルータにルータのアドレスとネットワークセグメントの情報を設定する必要はある。
図1に示す計算機システムでは、クライアント計算機C1〜Cn及びマスタ計算機M0はルータR00を介して格子型ネットワークと接続しているが、クライアント計算機C1〜Cn及びマスタ計算機M0は、格子型ネットワークを構成するルータR1〜R16の計算機用セグメントに接続されてもよい。また、DB用計算機N1〜N16がクライアント計算機の機能を兼ねてもよい。また、図1に示す計算機システムでは格子サイズが4×4となっているが、本発明はこのサイズに限定されず、他のサイズにも適用可能である。
前述したルータR1〜R16、R00及び計算機N1〜N16、C1〜Cnの内部構成は図2に示すように、一般的なアーキテクチャの計算機である。
計算機100は、CPU101、LANインターフェース102、メモリ103、入出力インターフェース104、ストレージインターフェース105が内部バスで相互に接続されている。LANインターフェース102はLANポート110を介して外部ネットワークに接続されている。入出力インターフェース104には、ディスプレイ108、キーボード107、マウス108等の入出力装置が接続されている。ストレージインターフェース105は磁気ディスクドライブ等のストレージ装置109に接続されている。
計算機の基本的な構成はこのような型になるが、ルータではLANポート110が複数(本実施例では3つ以上)設けられ、ストレージ装置109はフラッシュメモリ等、衝撃に強いものを利用する。また、ルータでは、ルーティング用の専用アクセラレータチップを内部バスに接続し、通信性能を向上させる場合もある。
また、DB用計算機N1〜N16は、ディスプレイ、キーボード107、マウス108を接続しなくてもよい。
次に、Consistent Hashにおける仮想リングの構成方法を説明する。図1に示した計算機の符号が仮想リングを構成する順序となる。すなわち、N1から開始し、N2、N3・・・N16、N1の順に計算機をたどると仮想リングを一周する。この構成は以下の特徴を持つ。
特徴1 仮想リング上で隣接する計算機が、物理ネットワーク上でも隣接する。
特徴2 仮想リング上で隣接する計算機を順にたどると、格子型ネットワークを構成するネットワークスイッチを同じ回数だけ通る。図1に示す例では、ネットワークスイッチSW−X1〜SW−X4、SW−Y1〜SW−Y4を2回ずつ通ることになる。
特徴3 仮想リング上で隣接する計算機は、異なるルータに接続される。
Consistent Hashでは、プライマリノードとバックアップノードの間でデータを複製するため、仮想リング上で隣接する計算機間のデータ転送量が多くなる。従って、仮想リング上で隣接する計算機間のネットワーク距離が短くなるように構成すれば効率的である。これは、前述した特徴1によって実現できる。また、仮想リング上で隣接する計算機間のネットワーク負荷を分散するためには、隣接する計算機間の通信を複数のネットワークスイッチを利用して分散すればよい。これは、前述した特徴2によって実現できる。さらに、特定のルータが故障した場合に、特徴3によって、他のルータに接続された計算機上のデータが利用可能であることから、耐障害性を高めることができる。以上、特徴1〜3によって、ネットワーク負荷分散と耐障害性を両立することができる。
この仮想リングは図3に示す処理によって作成することができる。以下では、具体的な作成方法を説明する。この処理はマスタ計算機M0によって実行されるが、他の計算機によって実行されてもよい。
まず、計算機番号iを1に、ノード座標(X,Y)を(0,0)に初期化して、最初の計算機N1を座標(0,0)に割り当てる(S101)。すなわち、図1の左上の位置が座標(X,Y)=(0,0)であり、Xが増えると右に進み、Yが増えると下に進む。
次に、計算機番号iをインクリメントし、次に位置を決定する計算機の計算機番号を決定する(S102)。そして、決定された計算機番号が偶数である場合は、X方向に一つ進んだ場所に計算機を割り当て可能か否か判定する(S103、S104、S106)。そして、この場所に計算機を割り当て可能であれば、この座標に次の計算機を割り当てる(S108)。
ステップS102において計算機番号iをインクリメントした後、計算機番号が奇数である場合は、Y方向に一つ進んだ場所に計算機を割り当て可能か否か確認する(S103、S105、S106)。そして、この場所に計算機を割り当て可能であれば、この座標に次の計算機を割り当てる(S108)。
図1に示す計算機システムでは4×4の格子状にルータが配置されているので、ステップS104及びS105における剰余演算のNの値は4となる。また、ステップS106において、既に他の計算機がその座標に割り当て済みである場合は、Y方向に一つ後退する位置に計算機を割り当てることによって、仮想リングの構成方向をずらす(S107)。例えば、図1では、計算機N9を割り当てるときにステップS107の処理が行われる。
前述した方法によると、仮想リングの帯が格子型ネットワークを1周するたびに2段分ずつずれていくため、格子型ネットワークの縦と横のサイズが共に偶数個の場合に、すべての座標を一筆書きのように埋め尽くすことができる。
図1に示す計算機システムでは、ルータ間をネットワークスイッチによって接続しているため、物理的に隣接していなくても、ネットワーク的に隣接する計算機が存在する。例えば、計算機N1にネットワーク的に隣接する計算機は、ネットワークスイッチSW−X1を経由して通信可能なノードN2、N13、N14、及び、ネットワークスイッチSW−Y1を経由して通信可能なノードN16、N9、N8である。
図3に示した仮想リング構成方法では、仮想リング上で隣接する計算機が必ず物理的に隣接することになるが、前述した性質によって、他にもネットワークトポロジ的に等価な構成方法が存在する。すなわち、図1に示したネットワーク構成においてX軸方向の任意の列を置換してもネットワークトポロジ的には等価である。例えば、ノード座標Y=0の列を構成する計算機(N1、N2、N13、N14)と、ノード座標Y=1の列を構成する計算機(N16、N3、N4、N15)を置換したネットワークは、元のネットワークと、等価なネットワークトポロジを有する。同様に、Y軸方向の列を置換してもよいし、X軸方向の列の置換とY軸方向の列の置換とを順に複数回行ってもよい。
前述した手順によって各ルータ以下に一つずつ計算機を配置することができる。以下では、このように配置された計算機を代表ノードと称する。
分散データベースに格納されるデータが増えた場合、1台のDB用計算機による処理能力を超えることがある、このような場合には、DB用計算機を追加する必要がある。このとき、仮想リングへの挿入はConsistent Hashの規則に従うことになるが、物理ネットワークのどの位置へDB用計算機を追加するかが問題となる。なるべく、前述した特徴1〜特徴3を満たすように計算機を追加することができればよい。以下では、代表ノードが配置された構成に、新たな計算機を非代表ノードとして追加する方法を説明する。
DB用計算機の追加時に特徴1〜特徴3すべてを満たすことは困難であるが、特徴1及び特徴3を満たすことはできる。このため、具体的には、以下の規則に従って、計算機を追加する位置を決定する。
規則A1 仮想リング上で追加される新たな計算機に隣接する2台の代表ノードから、物理ネットワーク上で隣接する位置、すなわち、上記2台の計算機が共通に利用するルータ間ネットワークセグメントに接続されたルータに新たな計算機を接続する。
規則A2 仮想リング上で隣接する3台の計算機を異なるルータに接続する。
規則A1によって特徴1を満たすことができ、規則A2によって特徴3を満たすことができる。
例えば、図4は、仮想リング上の計算機N9とN10の間に計算機N9−1と計算機N9−2を追加する例を示し、計算機N9−1はルータR5に接続されており、計算機N9−2はルータR6に接続されている。これらの計算機N9−1、N9−2に隣接する代表ノードは計算機N9、N10であり、これらが共通に利用するルータ間ネットワークセグメントは、ネットワークスイッチSW−X3を利用する。従って、規則A1を満たすためには、ネットワークスイッチSW−X3に接続されたルータの配下に新たな計算機を追加すればよい。さらに、規則A2を満たすためは、計算機N9−1及びN9−2を異なるルータに接続している。
一方、前述した接続方法によって新たな計算機を追加すると、特定のネットワークに負荷が集中する可能性がある。例えば、図4に示す計算機システムでは、ネットワークスイッチSW−X3の負荷が上昇する。これに対して、規則A1のネットワーク距離に関する制限を緩めて、
規則A1b 仮想リング上で追加される新たな計算機に隣接する2台の代表ノードのいずれか1台に物理ネットワーク上で隣接する位置に新たな計算機を接続する。
という規則に従って、新たな計算機を追加する方法が考えられる。
例えば、図5に示す計算機システムでは、新たな計算機N9−1を、ルータR10が直接接続されているネットワークスイッチSW−Y2に接続されたルータR3に接続しており、計算機N9−2を、ネットワークスイッチSW−Y2に接続されたルータR11に接続している。このように、新たな計算機を接続すると、ネットワークスイッチSW−X3への負荷を軽減することができる。しかし、計算機N10と計算機N9−1との間、及び、計算機N10と計算機N9−2との間では、途中でルータを介さずに通信可能である。しかし、計算機N9と計算機N9−1との間、及び、計算機N9と計算機N9−2との間の通信では、途中でルータR10による転送が発生するため、ルータR10の負荷は上昇する。従って、この接続方法はネットワークスイッチSW−X3の負荷が高く、ルータR10の負荷に余裕がある場合に有効である。
同様に、ネットワークスイッチSW−X3の負荷が高く、ルータR9の負荷に余裕がある場合には、ネットワークスイッチSW−Y1に接続されたルータに新たな計算機を接続する方法が有効である。
これまでの説明を纏めると以下のようになる。すなわち、図3に示した手順に従って、格子型ネットワークを構成する各ルータに一つずつDB用計算機(代表ノード)を配置した状態を初期状態とする。一つのルータに2台目以降のDB用計算機を配置する場合、ネットワークスイッチ及びルータの負荷を勘案し、負荷に余裕がある場合は前述した規則A1、2を満たす位置に新たな計算機を追加し、又は、負荷が高い場合は規則A1b、2を満たす位置に新たな計算機を追加する。
前述した方法を実施するためには、ネットワーク負荷の監視結果に基づいて、新たな計算機を追加する位置を決定する必要がある。これを人手で実行すると手間がかかる。そこで、以下では、前述した作業を支援する構成管理ツールについて説明する。
本実施形態では、ルータR1〜R16が、当該ルータによって転送されるデータ量を監視し、取得したデータ転送量をマスタ計算機M0に送信する。マスタ計算機M0は受信したネットワーク転送量からネットワークスイッチSW−X1〜SW−X4、SW−Y1〜SW−Y4及びルータR1〜R16の負荷を算出し、算出された負荷に基づいて新たな計算機を追加する位置を決定する。
これを実現するルータR1〜R16のソフトウェア構成を図6に示し、マスタ計算機M0のソフトウェア構成を図7に示す。
図6に示すように、ルータR1〜R16は、ルータの各種設定を保存する設定保存部201、ネットワーク負荷及びCPU負荷を監視する負荷監視部202及びネットワークを流れるパケットを転送するルーティング部203を備える。また、図7に示すように、マスタ計算機M0は、格子型ネットワークを構成するルータ及びDB用計算機を管理するノード管理部301、クライアント計算機C1〜Cnを管理するクライアント管理部302、格子型ネットワークのネットワーク負荷やルータ負荷を管理する負荷管理部303及び新たな計算機の追加位置を決定する構築支援部304を備える。
ルータの設定保存部201は、ルータのアドレス、ネットワークアドレス、ブロードキャストアドレス等のネットワーク情報と、ルータが備えるLANポートとネットワークセグメントとの対応関係を、ネットワークセグメント毎に保持する。さらに、設定保存部201は、ルーティングテーブルを保持する。このルーティングテーブルに基づいて、ルーティング部203がパケットの転送処理を行う。
ルータの負荷監視部202は、各ポートを通過した入出力パケットの総量を計数しており、一定時間(例えば、1秒)毎、かつ、ネットワークセグメント毎に計数値を集計する。また、負荷監視部202は、ルータのCPU利用率を監視しており、一定時間(例えば、1秒)毎に監視した値を集計する。そして集計したパケットの計数値及びCPU利用率をマスタ計算機M0に送信する。例えば、LANポート1、2を計算機用ネットワークセグメントとして利用している場合、LANポート1、2の入力パケット用カウンタの合計値と出力パケット用カウンタの合計値と、計算機用ネットワークセグメントのルータアドレスとカウンタ値の合計値との対応関係をマスタ計算機M0に送る。2種類のルータ間ネットワークセグメントについても、同様に、ルータアドレスとカウンタ値の合計値とをマスタ計算機M0に送信する。なお、前述した処理において、カウンタ値の合計を計算すべきLANポートとルータアドレスは、設定保存部201に保持される情報から決定される。カウンタの合計を送信するとき、CPU利用率も一緒にマスタ計算機M0に送信される。
図9に、ルータがマスタ計算機M0に送る負荷通知メッセージMSG01の例を示す。負荷通知メッセージMSG01は、ネットワークセグメント毎に、ルータのアドレス、入出力カウンタ値の合計、及びCPU利用率を含む。なお、図9では説明を簡単にするため、XML形式のデータフォーマットとして、負荷通知メッセージMSG01を示したが、同一内容の情報を送信できれば、他のデータフォーマットでもよい。
マスタ計算機M0の負荷管理部303は、ルータの負荷を管理するルータ負荷管理テーブルT01(図10A参照)及びネットワークスイッチの負荷を管理するスイッチ負荷管理テーブルT03(図11A参照)を保持する。マスタ計算機M0は、ルータから受信した負荷通知メッセージMSG0に基づいて、ルータ負荷管理テーブルT01及びスイッチ負荷管理テーブルT03を更新する。以下に、図16を用いてルータ負荷管理テーブルT01の更新処理を説明する。
マスタ計算機M0は、ルータから負荷通知メッセージMSG01を受信すると(S201)、負荷通知メッセージMSG01に含まれるルータアドレスをノード管理部301に送信し、各ルータアドレスのネットワークセグメントの種類及び座標を問い合わせる。
ノード管理部301は、ルータ管理テーブルT05(図12)を保持しており、このテーブルを利用して、対応するルータの座標とネットワークセグメントの種類を特定する。
ルータ管理テーブルT05は、座標T051、XアドレスT052、YアドレスT053及び計算機アドレスT054を含む。
座標T051は、格子ネットワーク上のルータの位置である。XアドレスT052は、X方向のルータ間ネットワークセグメントのルータアドレスである。YアドレスT053は、Y方向のネットワークセグメントのルータアドレスである。計算機アドレスT054は、DB用計算機を接続するネットワークセグメントのルータアドレスである。XアドレスT052、YアドレスT053及び計算機アドレスT054は、"192.168.0.20/24"のように、ルータのアドレスとネットワークアドレス長の組によって表される。
ルータ管理テーブルT05は、システム構築時にルータR1〜R16の座標を決定するときに作成されるため、マスタ計算機M0からノード管理部301への前記問い合わせを受信した場合には、ルータR1〜R16に対応するエントリが既に登録されている。
ノード管理部301は、負荷管理部303から問い合わせを受信すると、受信したルータアドレスと一致するアドレスを、ルータ管理テーブルT05のXアドレスT052、YアドレスT053又は計算機アドレスT054のいずれかに含むエントリを検索する。この検索によって見つかったエントリが、不可通知メッセージMSG01を送信したルータを示しており、そのエントリの座標T051が当該ルータの座標となる。また、XアドレスT052、YアドレスT053又は計算機アドレスT054のいずれかに、ルータアドレスと一致するアドレスが記載されているため、一致したフィールドのフィールド名(Xアドレス、Yアドレス、計算機アドレス)がネットワークセグメントの種類となる。
ノード管理部301は、負荷通知メッセージMSG01を受信した全てのルータアドレスについてネットワークセグメントの種類を取得したら、ルータの座標とネットワークセグメントの種類とを負荷管理部303に送る(S202)。
負荷管理部303は、ノード管理部301からネットワークアドレス、セグメント情報及びルータの座標を受信したら、負荷通知メッセージMSG0に含まれる各アドレスとカウンタ値をルータ負荷管理テーブルT01(図10A)、スイッチ負荷管理テーブルT03(図11A)に登録する(S203)。ノード管理部301は、負荷通知メッセージMSG0からルータアドレスを一つ取り出す。その取り出したルータアドレスに対応するネットワークセグメントの種類が計算機用ネットワークセグメントであれば、ルータ負荷管理テーブルT01を更新するためステップS205へ進む。一方、当該ネットワークセグメントの種類が計算機用ネットワークセグメントであなければ、スイッチ負荷管理テーブルT03を更新するためステップS206へ進む(S204)。
ルータ負荷管理テーブルT01は、ルータの座標を表現する座標T011及び監視履歴T012を含み、このテーブルの一つのエントリが1台のルータに対応する。座標T011には"(0,0)"のように、ルータの座標が記載される。監視履歴T012には、ルータ負荷監視履歴テーブルT02(図10B)を示す識別子が記載される。つまり、ルータ負荷管理テーブルT01は、その中にルータ負荷監視履歴テーブルT02を含むネスト構造となる。
ルータ負荷監視履歴テーブルT02は、入力カウンタT021、出力カウンタT022、CPU利用率T023及び報告時刻T024を含む。
入力カウンタT021は、ルータから受信した入力カウンタ値である。出力カウンタT022は、ルータから受信した出力カウンタ値である。CPU利用率T023は、ルータから受信したCPU利用率である。報告時刻T024は、ルータから負荷通知メッセージMSG01を受信した時刻である。このテーブルは、ルータから受信した負荷情報の最新履歴であり、負荷通知メッセージMSG01受信するたびに新しいエントリが追加される。また、報告時刻が現在時刻から一定時間(例えば、24時間)経過したエントリは削除される。負荷管理部303は、このルータ負荷監視履歴テーブルT02を用いて、計算機用ネットワークセグメントの入出力データ量及びルータのCPU負荷を計算する。
スイッチ負荷管理テーブルT03は、ネットワークスイッチの座標を表現する座標T031、ネットワークアドレスT032及び監視履歴T033を含む。このテーブルの一つのエントリが1台のネットワークスイッチに対応する。座標T031には、"X−0"のように、ネットワークスイッチが配置される軸の方向及び当該軸に垂直方向の座標が指定される。例えば、SW−X1は、X方向のネットワークスイッチであり、Y軸の座標は0であるため、"X−0"となる。ネットワークアドレスT032には、ネットワークアドレスとアドレス長が"102.168.0.0/24"のように記載される。監視履歴T033には、スイッチ負荷監視履歴テーブルT04(図11B)の識別子が記載される。つまり、スイッチ負荷管理テーブルT03は、その中にスイッチ負荷監視履歴テーブルT04を含むネスト構造となる。
スイッチ負荷監視履歴テーブルT04は、ルータ座標T041、入力カウンタT042、出力カウンタT043及び報告時刻T044を含む。ルータ座標T041は、このルータが配置された座標である。入力カウンタT042は、ルータから受信した入力カウンタ値である。出力カウンタT043は、ルータから受信した出力カウンタ値である。報告時刻T044は、ルータから負荷通知メッセージMSG01を受信した時刻である。このスイッチ負荷監視履歴テーブルT04は、ルータから受信した負荷情報の最新の履歴であり、ルータ負荷監視履歴テーブルT02と同様、負荷通知メッセージMSG01受信するたびに新しいエントリが追加される。また、報告時刻が現在時刻から一定時間(例えば、24時間)経過したエントリは削除される。負荷管理部303は、このスイッチ負荷監視履歴テーブルT04を用いて、スイッチに入出力されるデータ量を計算する。
ステップS204の判定の結果、ネットワークセグメントが計算機用ネットワークセグメントであれば、ノード管理部301は、受信したカウンタ値をルータ負荷管理テーブルT01及びルータ負荷監視履歴テーブルT02に追加する。具体的には、ノード管理部301は、ステップS202で決定した座標をキーとして、ルータ負荷管理テーブルT01の座標T011を検索する。座標T011が一致するエントリが見つかったら、そのエントリの監視履歴T012を取得する。監視履歴T012にはルータ負荷監視履歴テーブルT02の識別子が登録されており、この識別子が示すテーブルに新たにエントリを一つ作成し、ルータから受信した負荷通知メッセージMSG01に記載された当該ルータアドレスに対応する値を、新たに作成したエントリの入力カウンタT021及び出力カウンタT022に登録する。また、負荷通知メッセージMSG01に記載されたCPU利用率を、新たに作成したエントリのCPU利用率T023に登録する。さらに、負荷通知メッセージMSG01を受信した時刻を、新規に作成したエントリの報告時刻T024に登録する(S205)。
ステップS204の判定の結果、ネットワークセグメントがルータ間ネットワークセグメントであれば、ノード管理部301は、受信したカウンタ値をスイッチ負荷管理テーブルT03及びスイッチ負荷監視履歴テーブルT04に追加する。具体的には、ノード管理部301は、ステップS202で決定したネットワークセグメントの種類とルータ座標とに基づき、ネットワークスイッチの座標を決定する。座標は、ネットワークセグメント軸方向の名称(X/Y)とルータ座標の軸方向に垂直な成分との組み合わせによって表される。例えば、ステップS202で決定したネットワークセグメントがX方向のネットワークセグメントであり、ルータの座標が(1,0)であった場合、ルータのY座標が0であるため、ネットワークスイッチの座標は「X−0」になる。
次に、ノード管理部301は、決定されたネットワークスイッチの座標をキーとして、スイッチ負荷管理テーブルT03の座標T031を検索する。座標T031が一致するエントリが見つかったら、そのエントリの監視履歴T032を取得する。監視履歴T032にはスイッチ負荷監視履歴テーブルT04の識別子が登録されており、この識別子が示すテーブルに新たにエントリを一つ作成し、新たに作成したエントリのルータ座標T041にルータ座標を登録する。また、ルータから受信した負荷通知メッセージMSG01に記載された当該ルータアドレスに対応する値を、新たに作成したエントリの入力カウンタT042及び出力カウンタT043に登録する。さらに、負荷通知メッセージMSG01を受信した時刻を、新規に作成したエントリの報告時刻T044に登録する(S206)。
ノード管理部301は、全てのルータアドレスに対して、前述したステップS202〜S206の処理を行う。これによって、ルータ及びネットワークスイッチの負荷情報がマスタ計算機M0にリアルタイムに記録される。
次に、新たな計算機の追加時に、計算機を追加する位置を決定し、新たな計算機への設定情報を生成する手順を図17を用いて説明する。
システム管理者がマスタ計算機M0上で構成管理ツールを起動すると、構築支援部304は、ノード管理テーブルT06を参照して、分散データベースを構成するすべてのDB用計算機のハッシュ値とディスク使用率を表示し、新たな計算機を挿入すべき箇所をシステム管理者が決定できるようにする。
ノード管理テーブルT06は、図13に示すように、DB用計算機を管理するためのテーブルであり、座標T061、アドレスT062、ハッシュ値T063、代表ノードT064、拡張用スイッチT065及びディスク使用率T066を含む。座標T061は、その計算機が接続されているルータの座標である。アドレスT062は、その計算機のアドレスである。ハッシュ値T063は、その計算機のハッシュ値である。代表ノードT064は、その計算機が代表ノードであるか否かを表すフラグであり、代表ノードの場合"true"が格納される。拡張用スイッチT065は、非代表ノードを追加するルータ間を接続するネットワークスイッチの座標である。ディスク使用率T066は、各ノードに備わるディスクの使用率である。
構築支援部304は、必要に応じて、ハッシュ値又はディスク使用率でソートされた計算機一覧を表示する。ハッシュ値でソートすれば、仮想リングの構成が分かりやすく表示することができる。また、ディスク使用率でソートすれば、ディスク使用率が高い計算機、すなわち新たに追加する計算機の位置を容易に見つけることができる。
システム管理者は、表示されたDB用計算機の一覧に基づいて、新たな計算機を追加すべき場所を決定し、新たな計算機に割り当てるハッシュ値を決める。構築支援部304は、管理者によって決定された、新たな計算機を追加すべき場所及びハッシュ値の入力を受け付ける。
なお、ディスク使用率が最も高い計算機が保持するデータを分割するように、ハッシュ値を自動的に決めてもよい。この場合、ディスク使用率が最も高い計算機のハッシュ値と、仮想リング上でその次に位置する計算機のハッシュ値の中間のハッシュ値を新たな計算機のハッシュ値とすることができる(S301)。
次に、構築支援部304は、ノード管理テーブルT06から、ステップS301で決定されたハッシュ値に隣接する代表ノードを検索する。具体的には、ノード管理テーブルT06のエントリをハッシュ値T063でソートし、代表ノード(代表ノードT064が"true"のエントリ)のハッシュ値を順に確認する。ステップS301で決定されたハッシュ値よりハッシュ値T063が小さいエントリの中で、最大のハッシュ値を持つエントリと、ステップS301で決定したハッシュ値よりハッシュ値T063が大きいエントリの中で、最小のハッシュ値を持つエントリが隣接する二つの代表ノードである。
二つの代表ノードのうちハッシュ値が小さい方が、手前の代表ノードになる。このようなエントリが存在しない場合、すべての代表ノードの中で最小のハッシュ値をもつものと、最大のハッシュ値をもつものが、隣接する二つの代表ノードになる。但し、この場合はハッシュ値が大きいノードが手前の代表ノードになる(S302)。
次に、構築支援部304は、ステップS302で求めた二つの代表ノードのうち、手前に位置する代表ノードのノード管理テーブルT06のエントリから拡張用スイッチT065を読み取る。既に非代表ノードが挿入されていれば、拡張用スイッチT065に値が設定されており、ノードの拡張方向が決まっているため、ステップS304へ進む。拡張用スイッチS065に値が設定されていない場合は、ノードの拡張方向を決める必要があるためステップS306へ進む(S303)。
ステップS303において、拡張用スイッチT065が設定されていると判定された場合、非代表ノードが接続されるルータは、拡張用スイッチT065に記載されたネットワークスイッチに接続されたルータであることが必要がある。構築支援部304は、拡張用スイッチT065に記載されたネットワークスイッチの座標を確認し、そのネットワークスイッチに接続されたルータの座標一覧を生成する。例えば、拡張用スイッチT065に"X−0"が格納されていた場合、Y座標が"0"であるすべての座標、すなわち、(0,0)(0,1)(0,2)(0,3)の四つの座標を生成する。これらが新たな計算機を接続するルータの候補(接続候補ルータ)となる。
このように複数のルータが候補となるが、以下の規則によって新たな計算機を接続するルータを決定する。
規則B1 ルータのLANポートに空きがある。
規則B2 仮想リング上で連続する三つの計算機を同一ルータに接続しない。
規則B3 負荷が低いルータを優先的に利用する。
構築支援部304は、生成された座標とノード管理テーブルT06の座標T061とが一致するノード管理テーブルT06のエントリを検索する。各座標に対して見つかったエントリ数はルータに接続されている計算機の数である。ある座標において、この計算機数と、ルータが計算機用ネットワークに割り当てているLANポート数とが一致する場合、対応するルータには空きポートがないため、その座標を持つルータを接続候補ルータから除外する。これによって規則B1による選別が行われた。
次に、構築支援部304は、ステップS302と同様の手順によって、新たな計算機のハッシュ値に隣接される計算機をノード管理テーブルT06から検索する。ステップS302では代表ノードのみを検索対象としたが、ここではすべての計算機を検索対象とする。隣接する計算機を求めた後、手前側で隣接する計算機の手前の計算機及び後ろ側で隣接する計算機の直後の計算機に対応するノード管理テーブルのエントリを求める。例えば、図4に示した構成において、計算機N9−1と計算機N9−2の間に新たな計算機を挿入する場合、手前側の2台の計算機N9、N9−1、及び、後ろ側の2台の計算機N9−2、N10に対応するエントリを求める。
構築支援部304は、求められたエントリの座標T061を読み取り、読み取った座標T061と求められた接続候補ルータの座標とが一致するものがあれば、その座標を持つルータを接続候補ルータから除外する。これによって規則B2による選別が行われた。
次に、構築支援部304は、接続候補ルータの負荷を求める。具体的には、ルータ負荷管理テーブルT01を参照し、接続候補ルータの座標と座標T011とが一致するエントリを取得する。取得したエントリの監視履歴T012には、当該ルータの負荷情報の履歴が格納されたルータ負荷監視履歴テーブルT02の識別子が記載されている。そこで、ルータ負荷監視履歴テーブルT02を参照し、過去及び現在の情報を用いて、入力カウンタ及び出力カウンタの差分を計算し、計算された差分を所定の経過時間(例えば、1時間)で除算することによって一定時間内のデータ転送量の平均値を算出する。また、差分を計算する時間間隔を短くすることによって、ある時刻におけるデータ転送量の瞬間値を求める。このようにして一定時間内のデータ転送量の平均値及びデータ転送量の瞬間値の最大値を求める。
また、同様にして、ルータ負荷監視履歴テーブルT02のCPU利用率T023について、過去一定時間内のCPU使用率の平均値と、過去一定時間内の最大値を求める。
このようにして、ネットワーク負荷の平均値及び最大値、CPU利用率の平均値及び最大値を求め、求められた値に基づいて負荷ポイントを算出する。負荷ポイントの算出方法は様々な方法があるが、例えば、下式を用いて、前述した四つの値の線形結合によって算出することが考えられる。
負荷ポイント = ネットワーク負荷の平均値 × 定数1 + ネットワーク負荷の最大値 × 定数2 + CPU負荷の平均値 × 定数3 + CPU利用率の最大値 × 定数4
前述した手順によって、全ての接続候補ルータの負荷ポイントを算出し、負荷ポイントが最低のルータを接続対象として選択する。これによって規則B3による選別が行われた(S304)。
次に、構築支援部304は、新たな計算機の情報をノード管理テーブルT06に登録する。具体的には、ノード管理テーブルT06に新エントリを作成し、ステップS304で選択された接続対象ルータの座標を、ノードの座標として、座標T064に登録する。アドレスT062は、この段階では登録されない。これは、ノードが、起動後に割り当てられる(例えば、DHCPによる自動割り当て)アドレスをマスタ計算機M0に通知し、この通知されたアドレスが登録されるためである。ハッシュ値T063には、ステップS301で決定された新たな計算機のハッシュ値が登録される。新たな計算機は代表ノードではないため、代表ノードT064及び拡張用スイッチT065は設定されない。
さらに、構築支援部304は、新たな計算機の設定情報を作成する。設定すべき情報は、ステップS301で決定された新たな計算機のハッシュ値及び新たな計算機の座標(ステップS304で求めたルータの座標と等しい)、新たな計算機のアドレスである。但し、アドレスについては、ルータが計算機用ネットワークに対するDHCPサーバとして動作すれば、全ての計算機はDHCPクライアントとして動作することができ、個々の計算機のアドレスの設定は不要となる。構築支援部304が設定情報を作成した後、システム管理者は、作成された設定情報を新たな計算機に設定し、ステップS304で決定されたルータに新たな計算機を接続する。
設定情報を新たな計算機に設定する方法としては様々な方法がある。例えば、マスタ計算機M0から、フロッピーディスク又はUSBメモリ等の記憶媒体を経由して、新たな計算機に設定ファイルをコピーしてもよい。また、新たな計算機をネットワークスイッチSW−0に一時的に接続することによって、新たな計算機とマスタ計算機M0とを同一ネットワークに接続し、ネットワーク経由でマスタ計算機M0から新たな計算機に設定情報をコピーしてもよい(S305)。
ステップS303において、拡張用スイッチT065が設定されていないと判定された場合、新たな計算機を接続するルータのネットワークセグメントを決定する必要がある。構築支援部304は、ステップS302で求めた二つの(前後の)代表ノードの座標をノード管理テーブルT06の座標T061から取得し、二つの座標を比較し違いがある要素(X、Y)を確認する。違いがある要素が二つの代表ノード間の軸方向となり、違いがない要素が軸の方向を含まない座標となる。例えば、図4に示す計算機N9と計算機N10を代表ノードとして選んだ場合、計算機N9の座標は(0,2)であり、計算機N10の座標は(1,2)である。よって、軸方向はX方向で、軸のY座標は2になり、軸の方向を含む座標は「X−2」になる。
次に、この軸に対応するネットワークスイッチの負荷を求める。具体的には、求められた軸の方向を含む座標とスイッチ負荷管理テーブルT03の座標T031とが一致するエントリを検索する。エントリが見つかったら、そのエントリの監視履歴T032を取得する。取得したエントリの監視履歴T032には、当該スイッチの負荷情報の履歴が格納されたスイッチ負荷監視履歴テーブルT04の識別子が記載されている。そこで、負荷監視履歴テーブルT04を参照し、ルータ座標T041毎に、報告時刻T044が過去一定時間以内(例えば、1時間)以内のエントリについて、入力カウンタ及び出力カウンタの差分を計算する。カウンタ値の差分は、ネットワークスイッチに入力/出力されるデータ量となる。次に、ルータ座標T041毎に、入力カウンタ及び出力カウンタの差分の平均値及び最大値を求める。そして、各ルータ座標T041において求められた最大値及び平均値の各々の和を計算する。例えば、軸の座標が「X−2」の場合、ルータ座標(0,2)(1,2)(2,2)(3,2)の各々について入力カウンタの差分の最大値を算出し、最大値の和を計算する。同様に、ルータ座標(0,2)(1,2)(2,2)(3,2)の各々について入力カウンタの差分の平均値を算出し、平均値の和を計算する。同様に、出力カウンタの最大値及び平均値を算出し、最大値の和及び平均値の和を計算する。
このような手順によって、軸方向のネットワークスイッチに関する四つの負荷パラメタ(入力/出力データ量の最大値及び平均値)を算出し、算出された全ての負荷パラメータが基準値以下であるか否かを判定する。例えば、最大値にはネットワークスイッチの最大性能の95%、平均値にはネットワークスイッチの最大性能の70%のように、ネットワークスイッチの最大性能に基づいて基準値を決めるとよい。いずれかの負荷パラメタが基準値を超えていれば、ネットワークスイッチの負荷が高いので、ステップS307へ進む。一方、全ての負荷パラメタが基準値を超えていなければ、ネットワークスイッチの負荷が低いので、ステップS308へ進む(S306)。
ステップS306において、ネットワークスイッチの負荷が低いと判定された場合、新たな計算機を接続するルータのネットワークセグメントとして、軸方向のネットワークスイッチを選択する。ステップS302で求めた二つの代表ノードのうち手前の代表ノードに対応するノード管理テーブルT06のエントリの拡張用スイッチT065に、ステップS306で求めた軸の方向を含む座標を登録する(S307)。
一方、ステップS306でネットワークスイッチの負荷が基準値以上であれば、新たな計算機を接続するルータのネットワークセグメントとして、軸方向に垂直な方向のネットワークスイッチを選択する。ステップS302で求めた二つの代表ノードの座標及びステップS306で求めた軸方向に基づいて、軸方向に垂直なネットワークスイッチの座標を決定する。例えば、図4に示す計算機N9と計算機N10が代表ノードとして選択されている場合、計算機N9の座標は(0,2)であり、計算機N10の座標は(1,2)であり、軸方向はX方向である。従って軸方向に垂直な方向はY方向となり、選択されている代表ノードの座標の各々からY方向に伸びる軸の座標「Y−0」「Y−1」がネットワークスイッチの座標となる。
構築支援部304は、ステップS306と同様の手順で、軸方向に垂直な方向に伸びる二つのネットワークスイッチの負荷パラメタ(入力/出力データ量の最大値及び平均値)を算出する。そして、算出された負荷パラメタに基づいて、負荷ポイントを算出する。負荷ポイントの算出方法は様々な方法があるが、例えば、下式を用いて、前述した四つの値の2乗の線形結合によって算出することが考えられる。
負荷ポイント = 定数1 × 入力量の平均値2 + 定数2 × 入力量の最大値2 + 定数3 × 出力量の平均値2 + 定数4 × 出力量の平均値2
この式で、負荷パラメータの二乗を用いたのは、入出力データ量がネットワークスイッチの性能限界に近づいた場合に、より負荷を高く見積もるためである。このように、軸方向に垂直な方向に伸びる二つのネットワークスイッチの負荷ポイントを算出し、算出された負荷ポイントが低いネットワークスイッチを、新たな計算機の接続用のセグメントに採用する。
構築支援部304は、ステップS302で求めた二つの代表ノードのうち、手前の代表ノードに対応するノード管理テーブルT06のエントリの拡張用スイッチT065に、採用されたネットワークスイッチの座標を登録する(S309)。
ステップS307又はS309の処理が終了した後、構築支援部304は、ステップS304と同様の手順で新たな計算機を接続するルータを選択する(S310)。そして、ステップS305と同様の手順で新たな計算機の情報をノード管理テーブルT06へ登録し、次に新たな計算機へ設定される設定情報を作成し、作成された設定情報を新たな計算機へ設定する(S311)。
分散データベースを構成する計算機の数が増えた場合、一つのルータに計算機を追加する方法では、ルータのLANポートが不足したり、一つのルータへの負荷が高くなったり、という問題が発生する。このような場合は、格子のサイズを拡大し、システムを再構成する必要がある。しかし、システムの再構成は多くの手間を必要とする作業であり、設定の自動化による構築支援があると望ましい。以下では、設定自動化の方法について説明する。
設定自動化における、マスタ計算機M0の構築支援部304の動作を図18に示す。以下では図18を用いて自動設定処理の詳細を説明する。
まず、システム管理者は新システムの格子サイズをマスタ計算機M0に入力する。次に、構築支援部304は、ルータ管理テーブルT05をクリアした後、図3で説明した手順を用いてルータの座標を決定する。図3ではノードの座標を決定したが、ノードをルータに読み替えてルータに適用することができる。ルータの座標が決まる度に、ルータ管理テーブルT05の最後尾に新エントリを追加し、そのエントリの座標T51に、決定された座標を登録する。このようにして、すべての格子点に対してルータの割り当てを終わると、ルータ管理テーブルT05上では、仮想リング上の順序でルータに対応するエントリが並ぶ(S401)。
構築支援部304は、ステップS401においてユーザが入力した格子サイズからネットワークスイッチのアドレス一覧を生成し、生成したアドレス一覧をスイッチ設定テーブルT07(図14)の座標T071に登録する。スイッチ設定テーブルT07は、各エントリがネットワークスイッチ1台に対応し、座標T071及びネットワークアドレスT072を含む。座標T071は、ネットワークスイッチの座標である。ネットワークアドレスT072は、当該ネットワークスイッチが担当するネットワークセグメントのネットワークアドレスであり、ネットワークアドレスは、「192.168.0.0/24」のようにネットワークアドレス「192.168.0.0」とアドレス長「24」を組み合わせて表される。
構築支援部304は、システム管理者に対して、格子型ネットワークを構成する各ネットワークスイッチのネットワークセグメントのアドレスを決定するように促す。このとき、構築支援部304が図4に示すようなネットワーク図をディスプレイ上に表示して、各ネットワークスイッチのネットワーク上の位置を示すと分かりやすい。システム管理者は、ネットワークスイッチの座標とネットワークアドレスの対応関係を入力する。構築支援部304は、スイッチ設定テーブルT07の座標T071が一致するエントリのネットワークアドレスT072に、システム管理者によって入力された値を登録する(S402)。
次に、構築支援部304は、ルータ管理テーブルT05の各エントリのXアドレスT052、YアドレスT053及び計算機アドレスT054を決定する。具体的には、Xアドレス及びYアドレスは、軸方向とその軸方向以外の座標T051の要素に基づいて、対応するネットワークスイッチの座標を決定し、決定されたネットワークスイッチの座標によってスイッチ設定テーブルT07を参照し、ネットワークアドレスを求める。その後、そのネットワーク内で利用していないアドレスを順に割り当てる。
例えば、ルータ管理テーブルT05の座標に(0,1)が格納されていた場合、軸方向がXであるため、Y要素と組み合わせた「X−1」が対応するネットワークスイッチの座標となる。スイッチ設定テーブルT07の座標T071とネットワークスイッチの座標とが一致するエントリをスイッチ設定テーブルT07から探す。その結果、「192.168.1.0/24」が対応するネットワークアドレスとなる。このネットワークセグメントを使うのはルータのみである。そして、構築支援部304は、他のルータに既に割り当てられたアドレス以外のアドレスをルータに割り当て、そのアドレスをXアドレスT052に格納する。Yアドレスについても同様にアドレスを決定して、決定されたアドレスをYアドレスT053に格納する。
全てのルータのXアドレスとYアドレスが決定した後、計算機アドレスT054を決定する。計算機アドレスT054は、ルータ毎に独自のネットワークセグメントを設定してよいため、利用されていないネットワークセグメントであればよい。構築支援部304は、利用されていないネットワークセグメントを順にルータに割り当て、割り当てられたネットワークセグメントの最初のアドレスを計算機アドレスT054に登録する(S403)。
構築支援部304は、ルータ管理テーブルT05に基づいて、ルータの設定情報を生成する。具体的には、XアドレスT052、YアドレスT053及び計算機アドレスT054に対応する三つのネットワークセグメントの設定、各ネットワークセグメントに対応するルータのアドレスの設定、各ネットワークセグメントに対応するルータのLANポートの割り当て、及び、計算機ネットワークセグメントに対するDHCPサーバの設定を生成する。LANポートは、Xアドレス、Yアドレスについて一つずつ割り当て、残りのLANポートを計算機アドレスに割り当てる。生成された設定情報は、システム管理者がフロッピーディスク等の媒体又はネットワーク経由でルータに設定する。ネットワーク経由で設定する場合は、各ルータを一時的にマスタ計算機M0が接続されたネットワークセグメント(ネットワークスイッチSW−0に対応するネットワークセグメント)に接続する必要がある(S404)。
次に、構築支援部304は、各ノードの再配置方法を決定する。ノード管理テーブルT06に、分散データベースを構成する計算機の一覧が記載されているので、まず、ノード管理テーブルT06に記載された計算機から代表ノードになるものを選択する。構築支援部304は、ノード管理テーブルT06のすべてのエントリについて座標T061、アドレスT062、代表ノードT064及び拡張用スイッチT065をクリアする。次に、ノード管理テーブルT06のすべてのエントリをハッシュ値T063でソートする。次に以下の計算式を用いて代表ノードのエントリ番号を求める。
エントリ番号 =(格子番号 × 全エントリ数/格子数)の整数部分
この式において、格子番号は仮想リングにおけるノードの順序を示す番号であり、0〜格子数−1までのいずれかの値である。また、エントリ番号は、ソート後のノード管理テーブルT06のエントリの順序を示す番号であり、最初のエントリが0であり、最後のエントリ番号が全エントリ数−1である。
格子番号に対応するエントリ番号が求められた後、ルータ管理テーブルT05に含まれるエントリのうち、最初から"格子番号"番目のエントリの座標T051を取得する。この取得した座標を、ノード管理テーブルT06に記載されたエントリのうち、最初から"エントリ番号"番目のエントリの座標T061に登録し、そのエントリの代表ノードT063を"true"に設定する(S405)。
次に、構築支援部304は、ノード管理テーブルT06の座標T061が決まっていないエントリについて、図17と同様の手順で座標T061を決定する。但し、この時点では分散データベースが動作していないため、ルータ及びネットワークスイッチに入出力されるデータがない。従って、ステップS306の後、ステップS308及びS309に必ず進む。また、ステップS305及びS311において、新たな計算機への設定情報を生成及び設定している。しかし、この自動設定処理においては、ステップS407においてまとめて設定情報を設定するので、ステップS305及びS311ではノード管理テーブルT06へ新たな計算機を登録するだけである(S406)。
最後に、構築支援部304は、ステップS305と同様の手順によって、各計算機の設定情報を作成し、作成された設定情報を各計算機に設定する(S407)。
次に、通常運用時の動作について説明する。
クライアント計算機C1が、最初に分散データベースシステムにアクセスするとき、マスタ計算機M0に問い合わせ、マスタ計算機M0からノード管理テーブルT06の座標T061、アドレスT062及びハッシュ値T063を取得する。このノード管理テーブルT06の情報は1回取得すると、DB用計算機の構成が変更するまで再取得する必要はない。
マスタ計算機M0のクライアント管理部302は、クライアント管理テーブルT08(図15)にシステムを利用中のクライアント計算機のアドレスを保持する。クライアント管理テーブルT08は、アドレスT081及びキャッシュリース日時T082を含む。アドレスT081は、クライアント計算機のアドレスである。キャッシュリース日時T082は、クライアントへノード管理テーブルT06の内容を送信した時刻である。DB用計算機の構成が変更された場合、マスタ計算機M0はクライアント管理テーブルT08に登録されているすべてのクライアントに、ノード管理テーブルT06のキャッシュを無効化するように要求する。また、キャッシュリース日時から一定時間が経過すると、マスタ計算機M0はクライアントが消失したものと判定し、クライアント管理テーブルT08から対応するエントリを削除する。従って、クライアント計算機は一定時間毎にマスタ計算機M0にアクセスし、キャッシュリース日時T082を更新する。
クライアント計算機C1は、データを書き込むとき、自身がキャッシュしているノード管理テーブルT06を参照し、アクセスすべきキーのハッシュ値を格納している計算機(プライマリノード)のエントリを求める。次に、全エントリをハッシュ値が小さい順にソートしたときに、求められたプライマリノードから1番目及び2番目に位置する二つの計算機(バックアップノード)のエントリを求める。
プライマリ及びバックアップノードのエントリを求めた後、クライアント計算機はハッシュ値が中央の計算機(すなわち、1番目のバックアップノード)にデータを送信する。これまで説明した計算機配置方法によれば、連続する三つの計算機はL字又は直線に並ぶ。L字に並ぶ場合に、最初に中央の計算機にデータを送信し、次に中央の計算機から両端の計算機にデータを転送すると、効率的にデータを転送することができる。このことから、クライアント計算機はハッシュ値が中央の計算機に最初にデータを転送する。
DB用計算機のソフトウェア構成を図8に示す。
DB用計算機は、データを書き込むシーケンスを管理するシーケンス管理部401、及びデータ管理部402を備える。データを書き込む際、プライマリノードのシーケンス管理部401が書き込むべきキー値にシーケンス番号を割り当てる。バックアップノードは、プライマリノードが割り当てたキーシーケンス番号をキー値に関連付けて書き込む。シーケンス番号はデータを書き込む毎に増加するが、バックアップノードでデータを書き込む際、書き込むべきシーケンス番号より大きなシーケンス番号が既に書き込まれていた場合、そのデータは書き込まない。このような方法によってデータの一貫性を保障することができる。
中央のノードはバックアップノードであるため、クライアント計算機からデータを受信しても、データをコミットする権限を持たない。中央のノードは、マスタノードにデータを転送すると共に、シーケンス番号を要求する。さらに、中央のノードは、他のバックアップノードにデータを転送する。
マスタノードは、データを受信したら、シーケンス管理部401がシーケンス番号を割り当て、データ管理部402がデータの書き込みを開始する。そして、マスタノードはシーケンス番号を中央ノードに返信する。中央ノードは、マスタノードからシーケンス番号を受信したら、他のバックアップノードにシーケンス番号を送る。
各バックアップノードでは、書き込むべきキー値に既に関連付けられたシーケンス番号と、新たにプライマリノードから受け取ったシーケンス番号とを比較し、プライマリノードから受け取ったシーケンス番号の方が大きければ、データを書き込む。
以上の説明では、クライアント計算機C1〜Cn及びマスタ計算機M0が、DB用計算機が含まれる計算機群と異なるネットワークセグメントに配置されているが、クライアント計算機の機能はDB用計算機N1〜N16が持ってもよい。また、マスタ計算機M0をルータR1〜R16の計算機用ネットワークセグメントに接続してもよく、ネットワークスイッチSW−X1〜SW−X4、SW−Y1〜SW−Y4に接続してもよい。
DB用計算機N1〜N16がクライアント計算機を兼ねる場合、クライアント計算機からDB用計算機へ前述した方法によってアクセスすることは必ずしも最適ではない。例えば、クライアント計算機が計算機N1であり、プライマリノード及びバックアップノードが計算機N14、N15、N16である場合、前述した方法では、クライアント計算機N1から計算機N15にデータを転送した後、計算機N15から計算機N14及びN16にデータを再転送する。しかし、クライアント計算機N1から計算機N15へのアクセスは、途中でルータR14又はR16を経由するので、データの転送回数が増加する。
このため、DB用計算機N1〜N16がクライアント計算機を兼ねる場合、クライアント計算機からネットワーク距離が最も近いDB用計算機にデータを転送した後、データが最初に転送されたDB用計算機から他のDB用計算機にデータを転送する手順によってデータを書き込むことが効率的である。
具体的には、クライアント計算機は、自身がキャッシュしているノード管理テーブルT06を参照し、データを書き込むプライマリノード及びバックアップノードを決定した後、自身の座標とプライマリノード及びバックアップノードの座標(座標T061から取得する)とを比較し、以下の順位でネットワーク距離の近い計算機を求める。
1 座標がクライアント計算機と同一のもの。
2 座標の一つの要素がクライアント計算機と同一のもの。
3 座標の二つの要素がクライアント計算機と異なるもの。
そして、ネットワーク距離が最も近いDB用計算機にデータを転送した後、データが最初に転送されたDB用計算機から他のDB用計算機にデータを転送する。
本発明は、物理ネットワークとして高いスループットを利用可能な格子型ネットワークを利用することから、高いスループットが必要なアプリケーションで利用すると効果的である。キーあたりの保存データ量が増えると必要なスループットが増えるが、このような特性を持つアプリケーションの一つとしてファイルサーバがある。
すなわち、ファイルID(又は、ファイルのパス名)をキーとし、ファイルの内容をキーに対応するvalueとして本発明の分散データベースに格納すれば、分散データベースをファイルサーバとして利用可能になる。上記ファイルIDは、ファイル作成時にファイルに付与され、二度と変更されることがないファイルの識別子である。通常のファイルサーバにおいて、上記ファイルIDはi−node番号と呼ばれている。
階層構造のディレクトリ機能を実現するには、ディレクトリのパス名をキー、ディレクトリ内のファイルのファイルID及び各種属性情報(ファイル名、タイムスタンプ、ファイルサイズ等)をvalueとして、分散データベースに格納すればよい。
また、ファイルの内容を複数のブロックに分けて管理したい場合は、ファイルIDと当該ブロックのオフセット位置をキーとして、ブロックの内容をvalueとして分散データベースに格納すればよい。
本発明は、要旨の範囲内で様々な変形が可能である。これまでの説明では格子内のルータ間の通信にIPプロトコルを利用することを前提としていたが、ルータやスイッチによっては他のプロトコルを利用してもよい。例えば、座標をデータ送信先のアドレスとして座標を指定するプロトコルを利用すれば、より効率的な実装が可能となる。
前述した説明では、格子点上に配置したルータにDB用計算機を接続したが、図19に示すように、ルータがDB用計算機を兼ねる、すなわち、ルータとDB用計算機とが一体に構成されてもよい。この場合、ルータが代表ノードとなる。また、ルータの配下にDB用計算機を接続する構成では、非代表ノード間のネットワーク距離が長くなることを避けるため、図19の計算機N4−1、N9−1、N9−2のように、非代表ノードをX方向又はY方向のスイッチに接続することが望ましい。
このような構成の場合、非代表ノードを追加する手順(図17)においてステップS304及びS310の処理は必要ない。また、計算機用ネットワークが設けられないことから、ルータ管理テーブルT05に計算機アドレスT054を格納する必要はない。これ以外の処理については、前述した処理と同様である。
また、前述した説明では、格子点上に配置したルータ間をネットワークスイッチSW−X1〜SW−X4、SW−Y1〜SW−Y4によって接続したが、図20に示すように、ルータ間を直接結合し、二次元トーラス型に構成してもよい。ルータ間をネットワークスイッチによって接続する場合、計算機のX座標又はY座標が一致する計算機はネットワーク的に隣接する。しかし、二次元トーラス型構造である場合、座標が隣接する計算機のみがネットワーク的に隣接する。なお、トーラス型構造であるため、例えば、座標が(0,0)のノードと(0,3)のノードとは隣接する。図3に示した代表ノードの配置方法では、このような制約を設けても仮想リング上で隣接する代表ノード間はネットワーク的に隣接する。
前述した説明では、DB用計算機を追加する際、システム管理者がDB用計算機を適切なルータに接続する必要がある。この作業は煩雑であり、人的ミスが発生しやすい。このため、図21に示すように、各ルータから計算機用ネットワークセグメントへのポートをクロスバースイッチSW−A経由でDB用計算機に接続するシステムが考えられる。
これは、ルータのポートにDB用計算機を接続する代わりに、ルータとDB用計算機をクロスバースイッチSW−Aに接続し、クロスバースイッチSW−Aを制御することによって接続を変更する。従って、クロスバースイッチSW−Aは、ルータが接続されたポートと、DB用計算機N1〜N16が接続されたポートを電気的に接続するものでよく、ネットワークスイッチのように転送されるパケットに基づいて、転送先を制御する機能を有する必要はない。このため、ポート数が多いクロスバースイッチSW−Aでも安価である。クロスバースイッチSW−Aのスイッチは、マスタ計算機M0によって制御線L0を経由して制御される。制御線L0は、RS−232C等のシリアル通信線でも、Ether等のネットワークでもよい。
図21では、図面レイアウトの都合上、一つのルータとクロスバースイッチSW−Aとが1本の線で接続されているが、一つのルータとクロスバースイッチSW−Aとは複数の線で接続されてもよい。また図21ではDB用計算機の台数が16台となっているが、実際にはさらに増やして利用してもよい。
また、図21に示した、ルータR1〜R16、ネットワークスイッチSW−X1〜SW−X4、SW−Y1〜SW−Y4、クロスバースイッチSW−A及びマスタ計算機M0を一体化した装置を実装し、DB用計算機を必要に応じて追加してもよい。さらに、前述した装置に必要に応じてルータを追加してもよい。
本実施の形態は、二次元の格子を例として説明したが、次元数が2より大きい格子にも本発明を適用することができる。図22A〜図22Dは、3次元格子によってシステムを構成した場合の、代表ノードの仮想リング上の順序を示し、Z座標毎にX−Y面の配置を図示している。なお、3次元格子では、前述した特徴1(仮想リング上で隣接する代表ノードはネットワーク的にも隣接すること)及び特徴2(代表ノードを仮想リング上の順にたどると、すべてのネットワークスイッチを同じ回数だけ通る)を同時に満たすことは難しい。図22A〜図22Dに示す計算機の配置では、特徴1は完全に満たすが、特徴2を満たさない箇所がある。
以下、計算機の配置規則を説明する。この問題は3次元格子内を一筆書きする問題に帰着できるので、以下では一筆書きとして説明する。まず、すべてのZ座標に対して、X−Y平面を2×2の領域に分割する。図22A〜図22Dに示すシステムは、1辺のサイズが4の格子なので、図23に示すように、一つのX−Y平面が4領域に分割される。このような領域を4つのZ座標に対して作成する。このとき、異なるX−Y平面に、領域間の境界を同じ位置に設定する。例えば、図22A〜図22Dでは、全てのZ座標のX−Y平面において、縦及び横の中心線が境界となる。以下では、各領域を参照する場合、図23に示すようにA〜Dの名前で称する。
最初は、Z=0のX−Y平面の領域Aから開始し、領域Aの全ての4ブロックを通過して、当該ブロックの順序(1〜4)を決定した後、Z=1のX−Y平面上で同じ位置の領域Aへ移動する。この領域Aの全てのブロックを通過して、当該ブロックの順序(5〜8)を決定する。その後、同様にZ=2のX−Y平面の領域A、及び、Z=3のX−Y平面の領域Aに移動し、当該領域A内のブロックを通過して、当該ブロックの順序を決定する。Z=3のX−Y平面の領域Aの全てのブロックの順序(13〜16)を決定した後、そのX−Y平面において、隣接する領域Bへ移動し、領域BにおいてZ=3、Z=2、Z=1、Z=0の順に各X−Y平面を通過して、領域B内のブロックの順序(17〜32)を決定する。Z=0の領域Bを通過し終えたら、Z=0のX−Y平面において領域Cに移動し、同様にZ=0、Z=1、Z=2、Z=3の順に各X−Y平面の領域Cを通過する。最後にZ=3、Z=2、Z=1、Z=0の順に各X−Y平面の領域Dを通過して開始位置に戻る。
領域を一つの格子と考えると、図3の手順で作成されるノードの並べ方を領域の並べ方に適用することができる。これによって、X−Y平面内で異なる領域を通過順に隣接させることが可能である(なお、格子の一辺が4の倍数のときのみ、図3の手順が実行可能であり、図23は最小サイズのケースを示し、図3の手順が適用されている)。このため、Z=0及びZ=3で異なる領域に移動する場合、移動先の領域が隣接することが保障される。また、Z座標が変化する場合、領域のX−Y平面上の位置は変化しないので、移動先の格子点が隣接することが保障される。
領域内の移動については、領域の左上から開始する場合、2通りの通過方法が考えられる。領域が左又は下に移動する場合、図24Aに示す通過方法を採用すれば、領域間移動の際に必ず隣接する格子点を移動することができる。同様に、領域が右又は上に移動する場合、図24Bに示す通過方法を採用すれば、領域間移動の際に必ず隣接する格子点を移動することができる。
以上により、X−Y平面の1辺のサイズが4の倍数である場合、前述した手順によって、仮想リング上の隣接ノードがネットワーク的に隣接するような仮想リングを3次元格子上に作成できる。
以上、本発明を添付の図面を参照して詳細に説明したが、本発明はこのような具体的構成に限定されるものではなく、添付した請求の範囲の趣旨内における様々な変更及び同等の構成を含むものである。