(57)【要約】  二次元以上の格子型ネットワーク上にConsistent Hashの仮想リングを生成し、前記生成された仮想リング上にハッシュ値が割り当てられた複数のノードが配置される分散処理システムであって、前記分散処理システムは、前記複数のノードを接続する格子型ネットワークを有し、前記複数のノードは少なくとも計算資源を有し、前記仮想リング上で隣接する位置に配置されるノードは、前記格子型ネットワーク内において、他のノードを経由しないで通信可能な位置に配置されることを特徴とする分散処理システム。
2012042658.tif 000002
【特許請求の範囲】
【請求項１】
二次元以上の格子型ネットワーク上にConsistent Hashの仮想リングを生成し、前記生成された仮想リング上にハッシュ値が割り当てられた複数のノードが配置される分散処理システムであって、
前記分散処理システムは、前記複数のノードを接続する格子型ネットワークを有し、
前記複数のノードは少なくとも計算資源を有し、
前記仮想リング上で隣接する位置に配置されるノードは、前記格子型ネットワーク内において、他のノードを経由しないで通信可能な位置に配置されることを特徴とする分散処理システム。
【請求項２】
請求項１に記載の分散処理システムであって、
前記ノードは、前記格子型ネットワークに接続されるルータと、前記計算資源を有する計算機とを有し、
前記ルータは、前記格子型ネットワークのセグメント間を接続する格子点に配置され、
前記仮想リングを構成する計算機は前記各ルータに接続されることを特徴とする分散処理システム。
【請求項３】
請求項２に記載の分散処理システムであって、
前記計算機のうち、前記仮想リング上で連続して配置される三つの計算機は、同一のデータを格納し、
当該三つの計算機は、各々、異なる前記ルータに接続されることを特徴とする分散処理システム。
【請求項４】
請求項２に記載の分散処理システムであって、
前記仮想リング上で第１の計算機と第２の計算機との間に第３の計算機を追加する場合、前記第１の計算機と前記第２の計算機との両方が接続されるネットワークセグメント上のルータに前記第３の計算機を配置することを特徴とする分散処理システム。
【請求項５】
請求項２に記載の分散処理システムであって、
前記仮想リング上で第１の計算機と第２の計算機との間に第３の計算機を追加する場合、前記第１の計算機と前記の第２計算機との少なくとも一つが接続されるネットワークセグメント上のルータに前記第３の計算機を配置することを特徴とする分散処理システム。
【請求項６】
請求項１に記載の分散処理システムであって、
前記ノードは、異なるネットワークセグメント間でのデータ転送機能及び前記計算資源を有する計算機によって構成され、
前記仮想リング上で、第１の計算機と第２の計算機との間に、第３の計算機を追加する場合、前記第１の計算機と前記第２の計算機との両方が接続されるネットワークセグメント上に前記第３の計算機を配置することを特徴とする分散処理システム。
【請求項７】
請求項１に記載の分散処理システムであって、
前記格子型ネットワークは、少なくとも、第１のネットワークセグメントと、前記第１のネットワークセグメントと交差するように配置される第２のネットワークセグメントとを含み、
前記複数のノードは、前記仮想リング上に配置される第１のノードと、前記仮想リング上で前記第１のノードの次の位置に配置される第２のノードと、前記仮想リング上で前記第２のノードの次の位置に配置される第３のノードと、を含み、
前記第１のノードと前記第２のノードとは前記第１のネットワークセグメントに接続され、前記第２のノードと前記第３のノードとは前記第２のネットワークセグメントに接続されることを特徴とする分散処理システム。
【請求項８】
請求項１に記載の分散処理システムであって、
前記格子型ネットワークは、少なくとも、第１軸の方向に延伸する第１のネットワークセグメントと、前記第１軸と交差する第２軸の方向に延伸する第２のネットワークセグメントとを含み、
前記複数のノードは、前記仮想リング上に配置される第１のノードと、前記仮想リング上で前記第１のノードの次の位置に配置される第２のノードと、前記仮想リング上で前記第２のノードの次の位置に配置される第３ノードと、を含み、
前記第２のノードは、前記第１軸の方向で前記第１のノードと隣接する位置に配置され、
前記第３のノードは、前記第２軸の方向で前記第２のノードと隣接する位置に配置されることを特徴とする分散処理システム。
【請求項９】
請求項８に記載の分散処理システムであって、
前記第２のノードは、第１軸の方向で前記第１のノードと隣接する位置に配置され、
前記第３のノードは、前記第２軸のある方向で前記第２のノードと隣接する位置に既に他のノードが割り当てられている場合、前記第２軸の逆の方向で前記第２のノードと隣接する位置に配置されることを特徴とする分散処理システム。
【請求項１０】
請求項１に記載の分散処理システムであって、
前記各ノードと隣接するノードが前記格子型ネットワークの各軸上に同数配置されることを特徴とする分散処理システム。
【請求項１１】
請求項１に記載の分散処理システムであって、
前記格子型ネットワーク上の位置を示す座標要素の一つのみが一致しないノードをトーラス結合することを特徴とする分散処理システム。
【請求項１２】
請求項１に記載の分散処理システムであって、
前記ノードのうち、前記仮想リング上で連続して配置される第１のノード、第２のノード及び第３のノードには、同一のデータが格納されており、
クライアント計算機は、前記分散処理システムにデータを書き込む場合、前記仮想リング上で前記第１のノードと前記第３のノードの間に位置する第２のノードにデータを送信し、
前記第２のノードは、前記第１のノード及び前記第３のノードに、前記クライアント計算機から受信したデータを送信することを特徴とする分散処理システム。
【請求項１３】
前記仮想リング上で連続して配置される三つのノードには、同一のデータが格納されており、
クライアント計算機は、前記分散処理システムにデータを書き込む場合、前記クライアント計算機からネットワーク上最も近い位置に配置された前記ノードにデータを送信し、
前記書き込まれるデータを受信したノードは、前記三つのノードのうち他のノードに、前記受信したデータを送信することを特徴とする分散処理システム。
【請求項１４】
二次元以上の格子型ネットワーク上にConsistent Hashの仮想リングを生成し、前記生成された仮想リング上に複数のノードが配置された分散処理システムにおけるノードの配置方法であって、
前記分散処理システムは、前記複数のノードを接続する格子型ネットワーク、及び、前記ノードの配置を決定する計算機を有し、
前記複数のノードは少なくとも計算資源を有し、
前記方法は、
前記計算機が、ノードの識別子を加算することによって、前記仮想リング上で次の位置に配置されるノードを決定し、
前記計算機が、前記決定されたノードを、前記格子型ネットワーク内において他のノードを経由しないで通信可能な位置に配置するように、前記次の位置に配置されるノードの位置を決定することを特徴とするノードの配置方法。
【請求項１５】
請求項１４に記載のノードの配置方法であって、
前記仮想リング上で第１のノードと第２のノードとの間に第３のノードを追加する場合、前記計算機が、前記第１のノードと前記第２のノードとの両方が接続されるネットワークセグメント上のルータに前記第３のノードが配置されるように、前記追加される第３のノードの位置を決定することを特徴とするノードの配置方法。
【請求項１６】
請求項１４に記載のノードの配置方法であって、
前記仮想リング上で第１のノードと第２のノードとの間に第３のノードを追加する場合、前記計算機が、前記第１のノードと前記第２のノードとの少なくとも一つが接続されるネットワークセグメント上のルータに前記第３のノードが配置されるように、前記追加される第３のノードの位置を決定することを特徴とするノードの配置方法。
【請求項１７】
請求項１４に記載のノードの配置方法であって、
前記ノードは、異なるセグメント間でデータ転送機能を有し、
前記仮想リング上で第１のノードと第２のノードとの間に第３のノードを追加する場合、前記第１のノードと前記第２のノードとの両方が接続されるネットワークセグメント上に前記第３のノードが配置されるように、前記追加される第３のノードの位置を決定することを特徴とするノードの配置方法。
【請求項１８】
請求項１４に記載のノードの配置方法であって、
前記格子型ネットワークは、少なくとも、第１軸の方向に延伸する第１のネットワークセグメントと、前記第１軸と交差する第２軸の方向に延伸する第２のネットワークセグメントとを含み、
前記複数のノードは、前記仮想リング上に配置される第１のノードと、前記仮想リング上で前記第１のノードの次の位置に配置される第２のノードと、前記仮想リング上で前記第２ノードの次の位置に配置される第３のノードと、を含み、
前記第１軸の方向で前記第１のノードと隣接する位置に前記第２のノードが配置され、前記第２軸の方向で前記第２のノードと隣接する位置に前記第３のノードが配置されるように、前記各ノードの位置を決定することを特徴とするノードの配置方法。
【請求項１９】
請求項１８に記載のノードの配置方法であって、
第１軸の方向で前記第１のノードと隣接する位置に前記第２のノードが配置され、
前記第２軸のある方向で前記第２のノードと隣接する位置に既に他のノードが割り当てられている場合、前記第２軸の逆の方向で前記第２のノードと隣接する位置に前記第３のノードが配置されるように、前記各ノードの位置を決定することを特徴とするノードの配置方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、格子型ネットワークにおける分散処理システムに関し、特に、格子型ネットワークにおける分散データベースのConsistent Hashの実装方式に関する。
【背景技術】
【０００２】
分散データベースの実装方式として、Consistent Hashが知られている（非特許文献１参照）。これは、以下の手順でデータを格納する。
１．ハッシュ値がとりうる値をリング状に繋げた仮想リングを想定する。
２．ネットワークで相互通信可能な計算機にハッシュ値を与え、仮想リング上に配置する。
３．各計算機は、自身の一つ手前の計算機のハッシュ値と、自身のハッシュ値との間のハッシュ値を持つキーに対するプライマリノードになる。
４．プライマリノードの一つ後ろと二つ後ろに位置する計算機が、バックアップノードになる。
５．プライマリノードとバックアップノードがデータを保持する。【０００３】
例えば、図２５に示すように、キー値「Ａ」のハッシュ値が計算機Ｎ２と計算機Ｎ３のハッシュ値の間に存在する場合、計算機Ｎ３がプライマリノードになり、計算機Ｎ４、Ｎ５がバックアップノードになるため、これら計算機Ｎ３、Ｎ４、Ｎ５にキー値「Ａ」を格納する。通常、データベースではキー値にバリュー値を関連づけて管理するので、バリュー値はキー値が格納された計算機に格納される。【０００４】
従来、多くの並列データベースでは、中央サーバがデータ格納計算機を一元管理し、データを格納する際、クライアントはいったん中央サーバにデータを転送する構成を採用していた。このため、中央サーバが高負荷となりスケーラビリティ（台数効果）が出にくい、という課題があった。このConsistent Hash方式は、計算機の一覧と各計算機が保持するハッシュ値とをクライアントが保持しており、クライアントがキー値を格納する計算機を一意的に決定できるため、データを格納した計算機にクライアントから直接アクセスできる。このため、スケーラビリティ（台数効果）が高いデータベースとして利用されている。【０００５】
さらに、このConsistent Hash方式は、計算機の追加／削除時のコピー処理が少ないという利点がある。図２６に示すように、新たな計算機Ｎ６を追加した場合、キー値「Ａ」のプライマリノードは計算機Ｎ６に、バックアップノードは計算機Ｎ３、Ｎ４になる。従って、計算機Ｎ６にデータをコピーし、計算機Ｎ５からデータを削除すれば構成の変更が完了する。このように計算機の追加があった場合に、部分的な更新によって構成を変更することができる。【０００６】
前述したような分散システムを構築する場合、計算機間を接続するネットワークを構築する必要があるが、従来、図２７に示すようなツリー型のネットワークがよく利用されている。図２７はネットワークスイッチＳＷ１〜ＳＷ４でツリー型ネットワークを構成し、これに計算機Ｎ１〜Ｎ９を接続した例である。ツリー型のネットワークでは、上位のネットワークスイッチに負荷が集中することや、最上位のネットワークスイッチが単一障害点となることが課題になる。これに対して、特許文献１、２に挙げたように計算機間を格子型に接続するネットワークトポロジーが提案されている。特許文献１ではノード間をクロスバスイッチで接続する構成を採用しており、特許文献２ではノード間を直接接続し、多次元トーラス構造にする構成を採用している。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特開平７−２００５０８号公報
【特許文献２】特開２００８−１６５５３１号公報
【非特許文献】
【０００８】
【非特許文献１】Consistent Hashing and Random Trees: Distributed Caching Protocols for Relieving Hot Spots on the World Wide Web, David Karger et al.
【発明の概要】
【発明が解決しようとする課題】
【０００９】
ツリー型のネットワークにConsistent Hashを実装する場合、仮想リングの構成方法として、図２７のパターン１、２に示す二つの構成方法が考えられる。図２７にパターン１、２として示した数字は、仮想リング上のノードの順序を表している。パターン１は仮想リング上で隣接するノードをネットワーク的に近い位置に配置する構成方法である。この方法では、プライマリとバックアップ間でデータを複製する際のネットワーク負荷を軽減することができるが、データが複製されるノードを同一ネットワークスイッチ以下に配置するため、耐障害性が低くなる。【００１０】
パターン２は仮想リング上で隣接するノードをネットワーク的に遠い位置に配置する構成方法である。この方法では耐障害性を高くすることができるが、プライマリとバックアップ間でデータを複製する際、上位スイッチのネットワーク負荷が高くなる。このようにツリー型ネットワークにConsistent Hashを実装する場合、ネットワーク負荷と耐障害性はトレードオフの関係となり、両立することができない。【００１１】
一般論として、格子型ネットワークは、耐障害性とネットワーク負荷分散を両立できるが、複数方向に伸びるネットワークをバランスよく利用し、負荷分散を実現するにはアプリケーション側の工夫が必要となる。Consistent Hashを実装する場合も、適切な仮想リングの構成をとらなければ、特定のネットワークスイッチに負荷が集中してしまう。
【課題を解決するための手段】
【００１２】
本願において開示される発明の代表的な一例を示せば以下の通りである。すなわち、二次元以上の格子型ネットワーク上にConsistent Hashの仮想リングを生成し、前記生成された仮想リング上にハッシュ値が割り当てられた複数のノードが配置される分散処理システムであって、前記分散処理システムは、前記複数のノードを接続する格子型ネットワークを有し、前記複数のノードは少なくとも計算資源を有し、前記仮想リング上で隣接する位置に配置されるノードは、前記格子型ネットワーク内において、他のノードを経由しないで通信可能な位置に配置されることを特徴とする。
【発明の効果】
【００１３】
本発明の代表的な実施の形態によれば、格子型ネットワーク上にConsistent Hashを実装する際、ネットワーク負荷分散と耐障害性を両立することが可能となる。
【図面の簡単な説明】
【００１４】
【図１】本発明の実施形態の計算機システム（分散データベースシステム）の構成図である。
【図２】本発明の実施形態の計算機及びルータの構成図である。
【図３】本発明の実施形態の代表ノードを仮想リング上に配置する規則を説明する図である。
【図４】本発明の実施形態の分散データベースシステムへの非代表ノードの追加の例を説明する図である。
【図５】本発明の実施形態の分散データベースシステムへの非代表ノードの追加の例を説明する図である。
【図６】本発明の実施形態のルータにインストールされるソフトウェアの構成図である。
【図７】本発明の実施形態のマスタ計算機にインストールされるソフトウェアの構成図である。
【図８】本発明の実施形態のＤＢ用計算機にインストールされるソフトウェアの構成図である。
【図９】本発明の実施形態の負荷通知メッセージの例の説明図である。
【図１０Ａ】本発明の実施形態のルータ負荷管理テーブルを説明する図である。
【図１０Ｂ】本発明の実施形態のルータ負荷監視履歴テーブルを説明する図である。
【図１１Ａ】本発明の実施形態のスイッチ負荷管理テーブルを説明する図である。
【図１１Ｂ】本発明の実施形態のスイッチ負荷監視履歴テーブルを説明する図である。
【図１２】本発明の実施形態のルータ管理テーブルを説明する図である。
【図１３】本発明の実施形態のノード管理テーブルを説明する図である。
【図１４】本発明の実施形態のスイッチ設定テーブルを説明する図である。
【図１５】本発明の実施形態のクライアント管理テーブルを説明する図である。
【図１６】本発明の実施形態のルータ負荷更新する処理のフローチャートである。
【図１７】本発明の実施形態の非代表ノード追加処理のフローチャートである。
【図１８】本発明の実施形態の格子サイズ変更時の構成変更処理のフローチャートである。
【図１９】本発明の実施形態の変形例１の計算機システム（分散データベースシステム）の構成図である。
【図２０】本発明の実施形態の変形例２の計算機システム（分散データベースシステム）の構成図である。
【図２１】本発明の実施形態の変形例３の計算機システム（分散データベースシステム）の構成図である。
【図２２Ａ】本発明の実施形態の３次元格子における代表ノードの配置例を説明する図である。
【図２２Ｂ】本発明の実施形態の３次元格子における代表ノードの配置例を説明する図である。
【図２２Ｃ】本発明の実施形態の３次元格子における代表ノードの配置例を説明する図である。
【図２２Ｄ】本発明の実施形態の３次元格子における代表ノードの配置例を説明する図である。
【図２３】本発明の実施形態の3次元格子における代表ノードの配置方法を説明する図である。
【図２４Ａ】本発明の実施形態の3次元格子における代表ノードの配置方法を説明する図である。
【図２４Ｂ】本発明の実施形態の3次元格子における代表ノードの配置方法を説明する図である。
【図２５】Consistent Hashの概念図である。
【図２６】Consistent Hashにおけるノード追加の概念図である。
【図２７】従来のツリー型のネットワークの構成図である。
【発明を実施するための形態】
【００１５】
まず本発明の実施の形態の概要について説明する。
【００１６】
本実施の形態では、次元数が二次元以上の格子型ネットワークにConsistent Hashの仮想リングを生成する際、仮想リング上で隣接するノードが格子型ネットワークで隣接するように配置する。
【００１７】
前記格子型ネットワークは、（次元数−１）個の座標が一致するノード間をネットワークスイッチで接続し、仮想リングを構成するノードを仮想リングに沿って一周するように、格子型ネットワークを最短経路でたどった場合、全てのネットワークスイッチを同じ回数だけ通過するように構成する。
【００１８】
また、本実施の形態では、プライマリノードとバックアップノードを仮想リング上で隣接する位置で、かつ、格子型ネットワークの異なる座標位置に配置する。
【００１９】
また、本実施の形態では、格子型ネットワークの各格子点にルータを配置し、仮想リングを構成する計算機を各ルータに接続する。
【００２０】
また、本本実施の形態では、各ネットワークセグメントが接続される格子点に配置したルータの接続方法に関して、格子型ネットワーク上の位置を示す座標要素の一つのみが一致しない（すなわち、（次元数−１）個の座標が一致する）ルータをトーラス結合する。
【００２１】
また、本実施の形態では、プライマリノードとバックアップノードとを仮想リング上で隣接する位置に配置し、クライアントが、プライマリノード及びバックアップノードへデータを書き込む場合、仮想リング上で中央に位置するノードにデータを送信し、クライアントからデータを受信したノードから他のノードへデータを転送することによって、分散データベースへデータを書き込む。
【００２２】
さらに、本実施の形態では、プライマリノードとバックアップノードとを仮想リング上で隣接する位置に配置し、クライアントが、プライマリノード及びバックアップノードへデータを書き込む場合、クライアントからネットワーク距離が近いノードへデータを送信し、クライアントからデータを受信したノードから他のノードへデータを転送することによって、分散データベースへデータを書き込む。
【００２３】
次に、本実施の形態について図面を参照して説明する。
【００２４】
図１は、本発明の実施形態の計算機システムの構成図である。
【００２５】
本実施の形態の計算機システム（分散データベースシステム）は、格子状に配置されたルータＲ１〜Ｒ１６、各ルータを接続するネットワークスイッチＳＷ−Ｘ１〜ＳＷ−Ｘ４、ＳＷ−Ｙ１〜ＳＷ−Ｙ４、分散データベースを構成するＤＢ用計算機Ｎ１〜Ｎ１６を備える。
【００２６】
各ルータは、Ｘ方向に伸びるネットワークスイッチＳＷ−Ｘ１〜ＳＷ−Ｘ４、及びＹ方向に伸びるネットワークスイッチＳＷ−Ｙ１〜ＳＷ−Ｙ４によって接続されている。ＤＢ用計算機Ｎ１〜Ｎ１６は各ルータに接続されている。
【００２７】
従って、各ルータはＸ方向のスイッチＳＷ−Ｘ１〜ＳＷ−Ｘ４が接続しているルータ間ネットワークセグメント、Ｙ方向のスイッチＳＷ−Ｙ１〜ＳＷ−Ｙ４が接続しているルータ間ネットワークセグメント、及び、ＤＢ用計算機Ｎ１〜Ｎ１６が接続している計算機用ネットワークセグメント、の３種類のネットワークセグメントに接続する。なお、計算機用ネットワークセグメントには、複数の計算機が接続されてもよい。
【００２８】
この分散データベースシステムを利用するクライアント計算機Ｃ１〜Ｃｎは、ネットワークスイッチＳＷ−０を介して、ルータＲ００に接続されている。ルータＲ００は、さらにネットワークスイッチＳＷ−Ｘ１〜ＳＷ−Ｘ４に接続しており、例えば、クライアント計算機Ｃ１が計算機Ｎ７にアクセスする場合、クライアント計算機Ｃ１は、ルータＲ００、ルータＲ７を経由して計算機Ｎ７にアクセスする。
【００２９】
ネットワークスイッチＳＷ−０には、マスタ計算機Ｍ０が接続されている。マスタ計算機はネットワーク上のＤＢ用計算機Ｎ１〜Ｎ１６の座標、ネットワークアドレス、ハッシュ値の対応関係をノード管理テーブルＴ０６（図１３）として管理している。クライアント計算機Ｃ１〜Ｃｎは、初回アクセス時及びシステムの構成変更時にマスタ計算機Ｍ０からノード管理テーブルＴ０６を取得し、本テーブルに基づきアクセスするＤＢ用計算機を決定する。ノード管理テーブルＴ０６があれば、キー値からキー値を保存すべきＤＢ用計算機を一意に決定することができるため、２回目以降のアクセス時は、クライアント計算機Ｃ１〜Ｃｎとマスタ計算機とは通信する必要がない。
【００３０】
このような格子型ネットワークでは、ルータＲ１〜Ｒ１６、ルータＲ００に適切なルーティングテーブルを設定する必要があるが、ＯＳＰＦ（Ｏｐｅｎ  Ｓｈｏｒｔｅｓｔ  Ｐａｔｈ  Ｆｉｒｓｔ）等のルーティング・プロトコルを利用することによって、各ルータにルーティングテーブルを自動設定することができる。但し、各ルータにルータのアドレスとネットワークセグメントの情報を設定する必要はある。
【００３１】
図１に示す計算機システムでは、クライアント計算機Ｃ１〜Ｃｎ及びマスタ計算機Ｍ０はルータＲ００を介して格子型ネットワークと接続しているが、クライアント計算機Ｃ１〜Ｃｎ及びマスタ計算機Ｍ０は、格子型ネットワークを構成するルータＲ１〜Ｒ１６の計算機用セグメントに接続されてもよい。また、ＤＢ用計算機Ｎ１〜Ｎ１６がクライアント計算機の機能を兼ねてもよい。また、図１に示す計算機システムでは格子サイズが４×４となっているが、本発明はこのサイズに限定されず、他のサイズにも適用可能である。
【００３２】
前述したルータＲ１〜Ｒ１６、Ｒ００及び計算機Ｎ１〜Ｎ１６、Ｃ１〜Ｃｎの内部構成は図２に示すように、一般的なアーキテクチャの計算機である。
【００３３】
計算機１００は、ＣＰＵ１０１、ＬＡＮインターフェース１０２、メモリ１０３、入出力インターフェース１０４、ストレージインターフェース１０５が内部バスで相互に接続されている。ＬＡＮインターフェース１０２はＬＡＮポート１１０を介して外部ネットワークに接続されている。入出力インターフェース１０４には、ディスプレイ１０８、キーボード１０７、マウス１０８等の入出力装置が接続されている。ストレージインターフェース１０５は磁気ディスクドライブ等のストレージ装置１０９に接続されている。
【００３４】
計算機の基本的な構成はこのような型になるが、ルータではＬＡＮポート１１０が複数（本実施例では３つ以上）設けられ、ストレージ装置１０９はフラッシュメモリ等、衝撃に強いものを利用する。また、ルータでは、ルーティング用の専用アクセラレータチップを内部バスに接続し、通信性能を向上させる場合もある。
【００３５】
また、ＤＢ用計算機Ｎ１〜Ｎ１６は、ディスプレイ、キーボード１０７、マウス１０８を接続しなくてもよい。
【００３６】
次に、Consistent Hashにおける仮想リングの構成方法を説明する。図１に示した計算機の符号が仮想リングを構成する順序となる。すなわち、Ｎ１から開始し、Ｎ２、Ｎ３・・・Ｎ１６、Ｎ１の順に計算機をたどると仮想リングを一周する。この構成は以下の特徴を持つ。
特徴１  仮想リング上で隣接する計算機が、物理ネットワーク上でも隣接する。
特徴２  仮想リング上で隣接する計算機を順にたどると、格子型ネットワークを構成するネットワークスイッチを同じ回数だけ通る。図１に示す例では、ネットワークスイッチＳＷ−Ｘ１〜ＳＷ−Ｘ４、ＳＷ−Ｙ１〜ＳＷ−Ｙ４を２回ずつ通ることになる。
特徴３  仮想リング上で隣接する計算機は、異なるルータに接続される。
【００３７】
Consistent Hashでは、プライマリノードとバックアップノードの間でデータを複製するため、仮想リング上で隣接する計算機間のデータ転送量が多くなる。従って、仮想リング上で隣接する計算機間のネットワーク距離が短くなるように構成すれば効率的である。これは、前述した特徴１によって実現できる。また、仮想リング上で隣接する計算機間のネットワーク負荷を分散するためには、隣接する計算機間の通信を複数のネットワークスイッチを利用して分散すればよい。これは、前述した特徴２によって実現できる。さらに、特定のルータが故障した場合に、特徴３によって、他のルータに接続された計算機上のデータが利用可能であることから、耐障害性を高めることができる。以上、特徴１〜３によって、ネットワーク負荷分散と耐障害性を両立することができる。
【００３８】
この仮想リングは図３に示す処理によって作成することができる。以下では、具体的な作成方法を説明する。この処理はマスタ計算機Ｍ０によって実行されるが、他の計算機によって実行されてもよい。
【００３９】
まず、計算機番号ｉを１に、ノード座標（Ｘ，Ｙ）を（０，０）に初期化して、最初の計算機Ｎ１を座標（０，０）に割り当てる（Ｓ１０１）。すなわち、図１の左上の位置が座標（Ｘ，Ｙ）＝（０，０）であり、Ｘが増えると右に進み、Ｙが増えると下に進む。
【００４０】
次に、計算機番号ｉをインクリメントし、次に位置を決定する計算機の計算機番号を決定する（Ｓ１０２）。そして、決定された計算機番号が偶数である場合は、Ｘ方向に一つ進んだ場所に計算機を割り当て可能か否か判定する（Ｓ１０３、Ｓ１０４、Ｓ１０６）。そして、この場所に計算機を割り当て可能であれば、この座標に次の計算機を割り当てる（Ｓ１０８）。
【００４１】
ステップＳ１０２において計算機番号ｉをインクリメントした後、計算機番号が奇数である場合は、Ｙ方向に一つ進んだ場所に計算機を割り当て可能か否か確認する（Ｓ１０３、Ｓ１０５、Ｓ１０６）。そして、この場所に計算機を割り当て可能であれば、この座標に次の計算機を割り当てる（Ｓ１０８）。
【００４２】
図１に示す計算機システムでは４×４の格子状にルータが配置されているので、ステップＳ１０４及びＳ１０５における剰余演算のＮの値は４となる。また、ステップＳ１０６において、既に他の計算機がその座標に割り当て済みである場合は、Ｙ方向に一つ後退する位置に計算機を割り当てることによって、仮想リングの構成方向をずらす（Ｓ１０７）。例えば、図１では、計算機Ｎ９を割り当てるときにステップＳ１０７の処理が行われる。
【００４３】
前述した方法によると、仮想リングの帯が格子型ネットワークを１周するたびに２段分ずつずれていくため、格子型ネットワークの縦と横のサイズが共に偶数個の場合に、すべての座標を一筆書きのように埋め尽くすことができる。
【００４４】
図１に示す計算機システムでは、ルータ間をネットワークスイッチによって接続しているため、物理的に隣接していなくても、ネットワーク的に隣接する計算機が存在する。例えば、計算機Ｎ１にネットワーク的に隣接する計算機は、ネットワークスイッチＳＷ−Ｘ１を経由して通信可能なノードＮ２、Ｎ１３、Ｎ１４、及び、ネットワークスイッチＳＷ−Ｙ１を経由して通信可能なノードＮ１６、Ｎ９、Ｎ８である。
【００４５】
図３に示した仮想リング構成方法では、仮想リング上で隣接する計算機が必ず物理的に隣接することになるが、前述した性質によって、他にもネットワークトポロジ的に等価な構成方法が存在する。すなわち、図１に示したネットワーク構成においてＸ軸方向の任意の列を置換してもネットワークトポロジ的には等価である。例えば、ノード座標Ｙ＝０の列を構成する計算機（Ｎ１、Ｎ２、Ｎ１３、Ｎ１４）と、ノード座標Ｙ＝１の列を構成する計算機（Ｎ１６、Ｎ３、Ｎ４、Ｎ１５）を置換したネットワークは、元のネットワークと、等価なネットワークトポロジを有する。同様に、Ｙ軸方向の列を置換してもよいし、Ｘ軸方向の列の置換とＹ軸方向の列の置換とを順に複数回行ってもよい。
【００４６】
前述した手順によって各ルータ以下に一つずつ計算機を配置することができる。以下では、このように配置された計算機を代表ノードと称する。
【００４７】
分散データベースに格納されるデータが増えた場合、１台のＤＢ用計算機による処理能力を超えることがある、このような場合には、ＤＢ用計算機を追加する必要がある。このとき、仮想リングへの挿入はConsistent Hashの規則に従うことになるが、物理ネットワークのどの位置へＤＢ用計算機を追加するかが問題となる。なるべく、前述した特徴１〜特徴３を満たすように計算機を追加することができればよい。以下では、代表ノードが配置された構成に、新たな計算機を非代表ノードとして追加する方法を説明する。
【００４８】
ＤＢ用計算機の追加時に特徴１〜特徴３すべてを満たすことは困難であるが、特徴１及び特徴３を満たすことはできる。このため、具体的には、以下の規則に従って、計算機を追加する位置を決定する。
規則Ａ１  仮想リング上で追加される新たな計算機に隣接する２台の代表ノードから、物理ネットワーク上で隣接する位置、すなわち、上記２台の計算機が共通に利用するルータ間ネットワークセグメントに接続されたルータに新たな計算機を接続する。
規則Ａ２  仮想リング上で隣接する３台の計算機を異なるルータに接続する。
【００４９】
規則Ａ１によって特徴１を満たすことができ、規則Ａ２によって特徴３を満たすことができる。
【００５０】
例えば、図４は、仮想リング上の計算機Ｎ９とＮ１０の間に計算機Ｎ９−１と計算機Ｎ９−２を追加する例を示し、計算機Ｎ９−１はルータＲ５に接続されており、計算機Ｎ９−２はルータＲ６に接続されている。これらの計算機Ｎ９−１、Ｎ９−２に隣接する代表ノードは計算機Ｎ９、Ｎ１０であり、これらが共通に利用するルータ間ネットワークセグメントは、ネットワークスイッチＳＷ−Ｘ３を利用する。従って、規則Ａ１を満たすためには、ネットワークスイッチＳＷ−Ｘ３に接続されたルータの配下に新たな計算機を追加すればよい。さらに、規則Ａ２を満たすためは、計算機Ｎ９−１及びＮ９−２を異なるルータに接続している。
【００５１】
一方、前述した接続方法によって新たな計算機を追加すると、特定のネットワークに負荷が集中する可能性がある。例えば、図４に示す計算機システムでは、ネットワークスイッチＳＷ−Ｘ３の負荷が上昇する。これに対して、規則Ａ１のネットワーク距離に関する制限を緩めて、
規則Ａ１ｂ  仮想リング上で追加される新たな計算機に隣接する２台の代表ノードのいずれか１台に物理ネットワーク上で隣接する位置に新たな計算機を接続する。
という規則に従って、新たな計算機を追加する方法が考えられる。
【００５２】
例えば、図５に示す計算機システムでは、新たな計算機Ｎ９−１を、ルータＲ１０が直接接続されているネットワークスイッチＳＷ−Ｙ２に接続されたルータＲ３に接続しており、計算機Ｎ９−２を、ネットワークスイッチＳＷ−Ｙ２に接続されたルータＲ１１に接続している。このように、新たな計算機を接続すると、ネットワークスイッチＳＷ−Ｘ３への負荷を軽減することができる。しかし、計算機Ｎ１０と計算機Ｎ９−１との間、及び、計算機Ｎ１０と計算機Ｎ９−２との間では、途中でルータを介さずに通信可能である。しかし、計算機Ｎ９と計算機Ｎ９−１との間、及び、計算機Ｎ９と計算機Ｎ９−２との間の通信では、途中でルータＲ１０による転送が発生するため、ルータＲ１０の負荷は上昇する。従って、この接続方法はネットワークスイッチＳＷ−Ｘ３の負荷が高く、ルータＲ１０の負荷に余裕がある場合に有効である。
【００５３】
同様に、ネットワークスイッチＳＷ−Ｘ３の負荷が高く、ルータＲ９の負荷に余裕がある場合には、ネットワークスイッチＳＷ−Ｙ１に接続されたルータに新たな計算機を接続する方法が有効である。
【００５４】
これまでの説明を纏めると以下のようになる。すなわち、図３に示した手順に従って、格子型ネットワークを構成する各ルータに一つずつＤＢ用計算機（代表ノード）を配置した状態を初期状態とする。一つのルータに２台目以降のＤＢ用計算機を配置する場合、ネットワークスイッチ及びルータの負荷を勘案し、負荷に余裕がある場合は前述した規則Ａ１、２を満たす位置に新たな計算機を追加し、又は、負荷が高い場合は規則Ａ１ｂ、２を満たす位置に新たな計算機を追加する。
【００５５】
前述した方法を実施するためには、ネットワーク負荷の監視結果に基づいて、新たな計算機を追加する位置を決定する必要がある。これを人手で実行すると手間がかかる。そこで、以下では、前述した作業を支援する構成管理ツールについて説明する。
【００５６】
本実施形態では、ルータＲ１〜Ｒ１６が、当該ルータによって転送されるデータ量を監視し、取得したデータ転送量をマスタ計算機Ｍ０に送信する。マスタ計算機Ｍ０は受信したネットワーク転送量からネットワークスイッチＳＷ−Ｘ１〜ＳＷ−Ｘ４、ＳＷ−Ｙ１〜ＳＷ−Ｙ４及びルータＲ１〜Ｒ１６の負荷を算出し、算出された負荷に基づいて新たな計算機を追加する位置を決定する。
【００５７】
これを実現するルータＲ１〜Ｒ１６のソフトウェア構成を図６に示し、マスタ計算機Ｍ０のソフトウェア構成を図７に示す。
【００５８】
図６に示すように、ルータＲ１〜Ｒ１６は、ルータの各種設定を保存する設定保存部２０１、ネットワーク負荷及びＣＰＵ負荷を監視する負荷監視部２０２及びネットワークを流れるパケットを転送するルーティング部２０３を備える。また、図７に示すように、マスタ計算機Ｍ０は、格子型ネットワークを構成するルータ及びＤＢ用計算機を管理するノード管理部３０１、クライアント計算機Ｃ１〜Ｃｎを管理するクライアント管理部３０２、格子型ネットワークのネットワーク負荷やルータ負荷を管理する負荷管理部３０３及び新たな計算機の追加位置を決定する構築支援部３０４を備える。
【００５９】
ルータの設定保存部２０１は、ルータのアドレス、ネットワークアドレス、ブロードキャストアドレス等のネットワーク情報と、ルータが備えるＬＡＮポートとネットワークセグメントとの対応関係を、ネットワークセグメント毎に保持する。さらに、設定保存部２０１は、ルーティングテーブルを保持する。このルーティングテーブルに基づいて、ルーティング部２０３がパケットの転送処理を行う。
【００６０】
ルータの負荷監視部２０２は、各ポートを通過した入出力パケットの総量を計数しており、一定時間（例えば、１秒）毎、かつ、ネットワークセグメント毎に計数値を集計する。また、負荷監視部２０２は、ルータのＣＰＵ利用率を監視しており、一定時間（例えば、１秒）毎に監視した値を集計する。そして集計したパケットの計数値及びＣＰＵ利用率をマスタ計算機Ｍ０に送信する。例えば、ＬＡＮポート１、２を計算機用ネットワークセグメントとして利用している場合、ＬＡＮポート１、２の入力パケット用カウンタの合計値と出力パケット用カウンタの合計値と、計算機用ネットワークセグメントのルータアドレスとカウンタ値の合計値との対応関係をマスタ計算機Ｍ０に送る。２種類のルータ間ネットワークセグメントについても、同様に、ルータアドレスとカウンタ値の合計値とをマスタ計算機Ｍ０に送信する。なお、前述した処理において、カウンタ値の合計を計算すべきＬＡＮポートとルータアドレスは、設定保存部２０１に保持される情報から決定される。カウンタの合計を送信するとき、ＣＰＵ利用率も一緒にマスタ計算機Ｍ０に送信される。
【００６１】
図９に、ルータがマスタ計算機Ｍ０に送る負荷通知メッセージＭＳＧ０１の例を示す。負荷通知メッセージＭＳＧ０１は、ネットワークセグメント毎に、ルータのアドレス、入出力カウンタ値の合計、及びＣＰＵ利用率を含む。なお、図９では説明を簡単にするため、ＸＭＬ形式のデータフォーマットとして、負荷通知メッセージＭＳＧ０１を示したが、同一内容の情報を送信できれば、他のデータフォーマットでもよい。
【００６２】
マスタ計算機Ｍ０の負荷管理部３０３は、ルータの負荷を管理するルータ負荷管理テーブルＴ０１（図１０Ａ参照）及びネットワークスイッチの負荷を管理するスイッチ負荷管理テーブルＴ０３（図１１Ａ参照）を保持する。マスタ計算機Ｍ０は、ルータから受信した負荷通知メッセージＭＳＧ０に基づいて、ルータ負荷管理テーブルＴ０１及びスイッチ負荷管理テーブルＴ０３を更新する。以下に、図１６を用いてルータ負荷管理テーブルＴ０１の更新処理を説明する。
【００６３】
マスタ計算機Ｍ０は、ルータから負荷通知メッセージＭＳＧ０１を受信すると（Ｓ２０１）、負荷通知メッセージＭＳＧ０１に含まれるルータアドレスをノード管理部３０１に送信し、各ルータアドレスのネットワークセグメントの種類及び座標を問い合わせる。
【００６４】
ノード管理部３０１は、ルータ管理テーブルＴ０５（図１２）を保持しており、このテーブルを利用して、対応するルータの座標とネットワークセグメントの種類を特定する。
【００６５】
ルータ管理テーブルＴ０５は、座標Ｔ０５１、ＸアドレスＴ０５２、ＹアドレスＴ０５３及び計算機アドレスＴ０５４を含む。
【００６６】
座標Ｔ０５１は、格子ネットワーク上のルータの位置である。ＸアドレスＴ０５２は、Ｘ方向のルータ間ネットワークセグメントのルータアドレスである。ＹアドレスＴ０５３は、Ｙ方向のネットワークセグメントのルータアドレスである。計算機アドレスＴ０５４は、ＤＢ用計算機を接続するネットワークセグメントのルータアドレスである。ＸアドレスＴ０５２、ＹアドレスＴ０５３及び計算機アドレスＴ０５４は、"１９２．１６８．０．２０／２４"のように、ルータのアドレスとネットワークアドレス長の組によって表される。
【００６７】
ルータ管理テーブルＴ０５は、システム構築時にルータＲ１〜Ｒ１６の座標を決定するときに作成されるため、マスタ計算機Ｍ０からノード管理部３０１への前記問い合わせを受信した場合には、ルータＲ１〜Ｒ１６に対応するエントリが既に登録されている。
【００６８】
ノード管理部３０１は、負荷管理部３０３から問い合わせを受信すると、受信したルータアドレスと一致するアドレスを、ルータ管理テーブルＴ０５のＸアドレスＴ０５２、ＹアドレスＴ０５３又は計算機アドレスＴ０５４のいずれかに含むエントリを検索する。この検索によって見つかったエントリが、不可通知メッセージＭＳＧ０１を送信したルータを示しており、そのエントリの座標Ｔ０５１が当該ルータの座標となる。また、ＸアドレスＴ０５２、ＹアドレスＴ０５３又は計算機アドレスＴ０５４のいずれかに、ルータアドレスと一致するアドレスが記載されているため、一致したフィールドのフィールド名（Ｘアドレス、Ｙアドレス、計算機アドレス）がネットワークセグメントの種類となる。
【００６９】
ノード管理部３０１は、負荷通知メッセージＭＳＧ０１を受信した全てのルータアドレスについてネットワークセグメントの種類を取得したら、ルータの座標とネットワークセグメントの種類とを負荷管理部３０３に送る（Ｓ２０２）。
【００７０】
負荷管理部３０３は、ノード管理部３０１からネットワークアドレス、セグメント情報及びルータの座標を受信したら、負荷通知メッセージＭＳＧ０に含まれる各アドレスとカウンタ値をルータ負荷管理テーブルＴ０１（図１０Ａ）、スイッチ負荷管理テーブルＴ０３（図１１Ａ）に登録する（Ｓ２０３）。ノード管理部３０１は、負荷通知メッセージＭＳＧ０からルータアドレスを一つ取り出す。その取り出したルータアドレスに対応するネットワークセグメントの種類が計算機用ネットワークセグメントであれば、ルータ負荷管理テーブルＴ０１を更新するためステップＳ２０５へ進む。一方、当該ネットワークセグメントの種類が計算機用ネットワークセグメントであなければ、スイッチ負荷管理テーブルＴ０３を更新するためステップＳ２０６へ進む（Ｓ２０４）。
【００７１】
ルータ負荷管理テーブルＴ０１は、ルータの座標を表現する座標Ｔ０１１及び監視履歴Ｔ０１２を含み、このテーブルの一つのエントリが１台のルータに対応する。座標Ｔ０１１には"（０，０）"のように、ルータの座標が記載される。監視履歴Ｔ０１２には、ルータ負荷監視履歴テーブルＴ０２（図１０Ｂ）を示す識別子が記載される。つまり、ルータ負荷管理テーブルＴ０１は、その中にルータ負荷監視履歴テーブルＴ０２を含むネスト構造となる。
【００７２】
ルータ負荷監視履歴テーブルＴ０２は、入力カウンタＴ０２１、出力カウンタＴ０２２、ＣＰＵ利用率Ｔ０２３及び報告時刻Ｔ０２４を含む。
【００７３】
入力カウンタＴ０２１は、ルータから受信した入力カウンタ値である。出力カウンタＴ０２２は、ルータから受信した出力カウンタ値である。ＣＰＵ利用率Ｔ０２３は、ルータから受信したＣＰＵ利用率である。報告時刻Ｔ０２４は、ルータから負荷通知メッセージＭＳＧ０１を受信した時刻である。このテーブルは、ルータから受信した負荷情報の最新履歴であり、負荷通知メッセージＭＳＧ０１受信するたびに新しいエントリが追加される。また、報告時刻が現在時刻から一定時間（例えば、２４時間）経過したエントリは削除される。負荷管理部３０３は、このルータ負荷監視履歴テーブルＴ０２を用いて、計算機用ネットワークセグメントの入出力データ量及びルータのＣＰＵ負荷を計算する。
【００７４】
スイッチ負荷管理テーブルＴ０３は、ネットワークスイッチの座標を表現する座標Ｔ０３１、ネットワークアドレスＴ０３２及び監視履歴Ｔ０３３を含む。このテーブルの一つのエントリが１台のネットワークスイッチに対応する。座標Ｔ０３１には、"Ｘ−０"のように、ネットワークスイッチが配置される軸の方向及び当該軸に垂直方向の座標が指定される。例えば、ＳＷ−Ｘ１は、Ｘ方向のネットワークスイッチであり、Ｙ軸の座標は０であるため、"Ｘ−０"となる。ネットワークアドレスＴ０３２には、ネットワークアドレスとアドレス長が"１０２．１６８．０．０／２４"のように記載される。監視履歴Ｔ０３３には、スイッチ負荷監視履歴テーブルＴ０４（図１１Ｂ）の識別子が記載される。つまり、スイッチ負荷管理テーブルＴ０３は、その中にスイッチ負荷監視履歴テーブルＴ０４を含むネスト構造となる。
【００７５】
スイッチ負荷監視履歴テーブルＴ０４は、ルータ座標Ｔ０４１、入力カウンタＴ０４２、出力カウンタＴ０４３及び報告時刻Ｔ０４４を含む。ルータ座標Ｔ０４１は、このルータが配置された座標である。入力カウンタＴ０４２は、ルータから受信した入力カウンタ値である。出力カウンタＴ０４３は、ルータから受信した出力カウンタ値である。報告時刻Ｔ０４４は、ルータから負荷通知メッセージＭＳＧ０１を受信した時刻である。このスイッチ負荷監視履歴テーブルＴ０４は、ルータから受信した負荷情報の最新の履歴であり、ルータ負荷監視履歴テーブルＴ０２と同様、負荷通知メッセージＭＳＧ０１受信するたびに新しいエントリが追加される。また、報告時刻が現在時刻から一定時間（例えば、２４時間）経過したエントリは削除される。負荷管理部３０３は、このスイッチ負荷監視履歴テーブルＴ０４を用いて、スイッチに入出力されるデータ量を計算する。
【００７６】
ステップＳ２０４の判定の結果、ネットワークセグメントが計算機用ネットワークセグメントであれば、ノード管理部３０１は、受信したカウンタ値をルータ負荷管理テーブルＴ０１及びルータ負荷監視履歴テーブルＴ０２に追加する。具体的には、ノード管理部３０１は、ステップＳ２０２で決定した座標をキーとして、ルータ負荷管理テーブルＴ０１の座標Ｔ０１１を検索する。座標Ｔ０１１が一致するエントリが見つかったら、そのエントリの監視履歴Ｔ０１２を取得する。監視履歴Ｔ０１２にはルータ負荷監視履歴テーブルＴ０２の識別子が登録されており、この識別子が示すテーブルに新たにエントリを一つ作成し、ルータから受信した負荷通知メッセージＭＳＧ０１に記載された当該ルータアドレスに対応する値を、新たに作成したエントリの入力カウンタＴ０２１及び出力カウンタＴ０２２に登録する。また、負荷通知メッセージＭＳＧ０１に記載されたＣＰＵ利用率を、新たに作成したエントリのＣＰＵ利用率Ｔ０２３に登録する。さらに、負荷通知メッセージＭＳＧ０１を受信した時刻を、新規に作成したエントリの報告時刻Ｔ０２４に登録する（Ｓ２０５）。
【００７７】
ステップＳ２０４の判定の結果、ネットワークセグメントがルータ間ネットワークセグメントであれば、ノード管理部３０１は、受信したカウンタ値をスイッチ負荷管理テーブルＴ０３及びスイッチ負荷監視履歴テーブルＴ０４に追加する。具体的には、ノード管理部３０１は、ステップＳ２０２で決定したネットワークセグメントの種類とルータ座標とに基づき、ネットワークスイッチの座標を決定する。座標は、ネットワークセグメント軸方向の名称（Ｘ／Ｙ）とルータ座標の軸方向に垂直な成分との組み合わせによって表される。例えば、ステップＳ２０２で決定したネットワークセグメントがＸ方向のネットワークセグメントであり、ルータの座標が（１，０）であった場合、ルータのＹ座標が０であるため、ネットワークスイッチの座標は「Ｘ−０」になる。
【００７８】
次に、ノード管理部３０１は、決定されたネットワークスイッチの座標をキーとして、スイッチ負荷管理テーブルＴ０３の座標Ｔ０３１を検索する。座標Ｔ０３１が一致するエントリが見つかったら、そのエントリの監視履歴Ｔ０３２を取得する。監視履歴Ｔ０３２にはスイッチ負荷監視履歴テーブルＴ０４の識別子が登録されており、この識別子が示すテーブルに新たにエントリを一つ作成し、新たに作成したエントリのルータ座標Ｔ０４１にルータ座標を登録する。また、ルータから受信した負荷通知メッセージＭＳＧ０１に記載された当該ルータアドレスに対応する値を、新たに作成したエントリの入力カウンタＴ０４２及び出力カウンタＴ０４３に登録する。さらに、負荷通知メッセージＭＳＧ０１を受信した時刻を、新規に作成したエントリの報告時刻Ｔ０４４に登録する（Ｓ２０６）。
【００７９】
ノード管理部３０１は、全てのルータアドレスに対して、前述したステップＳ２０２〜Ｓ２０６の処理を行う。これによって、ルータ及びネットワークスイッチの負荷情報がマスタ計算機Ｍ０にリアルタイムに記録される。
【００８０】
次に、新たな計算機の追加時に、計算機を追加する位置を決定し、新たな計算機への設定情報を生成する手順を図１７を用いて説明する。
【００８１】
システム管理者がマスタ計算機Ｍ０上で構成管理ツールを起動すると、構築支援部３０４は、ノード管理テーブルＴ０６を参照して、分散データベースを構成するすべてのＤＢ用計算機のハッシュ値とディスク使用率を表示し、新たな計算機を挿入すべき箇所をシステム管理者が決定できるようにする。
【００８２】
ノード管理テーブルＴ０６は、図１３に示すように、ＤＢ用計算機を管理するためのテーブルであり、座標Ｔ０６１、アドレスＴ０６２、ハッシュ値Ｔ０６３、代表ノードＴ０６４、拡張用スイッチＴ０６５及びディスク使用率Ｔ０６６を含む。座標Ｔ０６１は、その計算機が接続されているルータの座標である。アドレスＴ０６２は、その計算機のアドレスである。ハッシュ値Ｔ０６３は、その計算機のハッシュ値である。代表ノードＴ０６４は、その計算機が代表ノードであるか否かを表すフラグであり、代表ノードの場合"ｔｒｕｅ"が格納される。拡張用スイッチＴ０６５は、非代表ノードを追加するルータ間を接続するネットワークスイッチの座標である。ディスク使用率Ｔ０６６は、各ノードに備わるディスクの使用率である。
【００８３】
構築支援部３０４は、必要に応じて、ハッシュ値又はディスク使用率でソートされた計算機一覧を表示する。ハッシュ値でソートすれば、仮想リングの構成が分かりやすく表示することができる。また、ディスク使用率でソートすれば、ディスク使用率が高い計算機、すなわち新たに追加する計算機の位置を容易に見つけることができる。
【００８４】
システム管理者は、表示されたＤＢ用計算機の一覧に基づいて、新たな計算機を追加すべき場所を決定し、新たな計算機に割り当てるハッシュ値を決める。構築支援部３０４は、管理者によって決定された、新たな計算機を追加すべき場所及びハッシュ値の入力を受け付ける。
【００８５】
なお、ディスク使用率が最も高い計算機が保持するデータを分割するように、ハッシュ値を自動的に決めてもよい。この場合、ディスク使用率が最も高い計算機のハッシュ値と、仮想リング上でその次に位置する計算機のハッシュ値の中間のハッシュ値を新たな計算機のハッシュ値とすることができる（Ｓ３０１）。
【００８６】
次に、構築支援部３０４は、ノード管理テーブルＴ０６から、ステップＳ３０１で決定されたハッシュ値に隣接する代表ノードを検索する。具体的には、ノード管理テーブルＴ０６のエントリをハッシュ値Ｔ０６３でソートし、代表ノード（代表ノードＴ０６４が"ｔｒｕｅ"のエントリ）のハッシュ値を順に確認する。ステップＳ３０１で決定されたハッシュ値よりハッシュ値Ｔ０６３が小さいエントリの中で、最大のハッシュ値を持つエントリと、ステップＳ３０１で決定したハッシュ値よりハッシュ値Ｔ０６３が大きいエントリの中で、最小のハッシュ値を持つエントリが隣接する二つの代表ノードである。
【００８７】
二つの代表ノードのうちハッシュ値が小さい方が、手前の代表ノードになる。このようなエントリが存在しない場合、すべての代表ノードの中で最小のハッシュ値をもつものと、最大のハッシュ値をもつものが、隣接する二つの代表ノードになる。但し、この場合はハッシュ値が大きいノードが手前の代表ノードになる（Ｓ３０２）。
【００８８】
次に、構築支援部３０４は、ステップＳ３０２で求めた二つの代表ノードのうち、手前に位置する代表ノードのノード管理テーブルＴ０６のエントリから拡張用スイッチＴ０６５を読み取る。既に非代表ノードが挿入されていれば、拡張用スイッチＴ０６５に値が設定されており、ノードの拡張方向が決まっているため、ステップＳ３０４へ進む。拡張用スイッチＳ０６５に値が設定されていない場合は、ノードの拡張方向を決める必要があるためステップＳ３０６へ進む（Ｓ３０３）。
【００８９】
ステップＳ３０３において、拡張用スイッチＴ０６５が設定されていると判定された場合、非代表ノードが接続されるルータは、拡張用スイッチＴ０６５に記載されたネットワークスイッチに接続されたルータであることが必要がある。構築支援部３０４は、拡張用スイッチＴ０６５に記載されたネットワークスイッチの座標を確認し、そのネットワークスイッチに接続されたルータの座標一覧を生成する。例えば、拡張用スイッチＴ０６５に"Ｘ−０"が格納されていた場合、Ｙ座標が"０"であるすべての座標、すなわち、（０，０）（０，１）（０，２）（０，３）の四つの座標を生成する。これらが新たな計算機を接続するルータの候補（接続候補ルータ）となる。
【００９０】
このように複数のルータが候補となるが、以下の規則によって新たな計算機を接続するルータを決定する。
規則Ｂ１  ルータのＬＡＮポートに空きがある。
規則Ｂ２  仮想リング上で連続する三つの計算機を同一ルータに接続しない。
規則Ｂ３  負荷が低いルータを優先的に利用する。
【００９１】
構築支援部３０４は、生成された座標とノード管理テーブルＴ０６の座標Ｔ０６１とが一致するノード管理テーブルＴ０６のエントリを検索する。各座標に対して見つかったエントリ数はルータに接続されている計算機の数である。ある座標において、この計算機数と、ルータが計算機用ネットワークに割り当てているＬＡＮポート数とが一致する場合、対応するルータには空きポートがないため、その座標を持つルータを接続候補ルータから除外する。これによって規則Ｂ１による選別が行われた。
【００９２】
次に、構築支援部３０４は、ステップＳ３０２と同様の手順によって、新たな計算機のハッシュ値に隣接される計算機をノード管理テーブルＴ０６から検索する。ステップＳ３０２では代表ノードのみを検索対象としたが、ここではすべての計算機を検索対象とする。隣接する計算機を求めた後、手前側で隣接する計算機の手前の計算機及び後ろ側で隣接する計算機の直後の計算機に対応するノード管理テーブルのエントリを求める。例えば、図４に示した構成において、計算機Ｎ９−１と計算機Ｎ９−２の間に新たな計算機を挿入する場合、手前側の２台の計算機Ｎ９、Ｎ９−１、及び、後ろ側の２台の計算機Ｎ９−２、Ｎ１０に対応するエントリを求める。
【００９３】
構築支援部３０４は、求められたエントリの座標Ｔ０６１を読み取り、読み取った座標Ｔ０６１と求められた接続候補ルータの座標とが一致するものがあれば、その座標を持つルータを接続候補ルータから除外する。これによって規則Ｂ２による選別が行われた。
【００９４】
次に、構築支援部３０４は、接続候補ルータの負荷を求める。具体的には、ルータ負荷管理テーブルＴ０１を参照し、接続候補ルータの座標と座標Ｔ０１１とが一致するエントリを取得する。取得したエントリの監視履歴Ｔ０１２には、当該ルータの負荷情報の履歴が格納されたルータ負荷監視履歴テーブルＴ０２の識別子が記載されている。そこで、ルータ負荷監視履歴テーブルＴ０２を参照し、過去及び現在の情報を用いて、入力カウンタ及び出力カウンタの差分を計算し、計算された差分を所定の経過時間（例えば、１時間）で除算することによって一定時間内のデータ転送量の平均値を算出する。また、差分を計算する時間間隔を短くすることによって、ある時刻におけるデータ転送量の瞬間値を求める。このようにして一定時間内のデータ転送量の平均値及びデータ転送量の瞬間値の最大値を求める。
【００９５】
また、同様にして、ルータ負荷監視履歴テーブルＴ０２のＣＰＵ利用率Ｔ０２３について、過去一定時間内のＣＰＵ使用率の平均値と、過去一定時間内の最大値を求める。
【００９６】
このようにして、ネットワーク負荷の平均値及び最大値、ＣＰＵ利用率の平均値及び最大値を求め、求められた値に基づいて負荷ポイントを算出する。負荷ポイントの算出方法は様々な方法があるが、例えば、下式を用いて、前述した四つの値の線形結合によって算出することが考えられる。
負荷ポイント ＝ ネットワーク負荷の平均値 × 定数１ ＋ ネットワーク負荷の最大値 × 定数２ ＋ ＣＰＵ負荷の平均値 × 定数３ ＋ ＣＰＵ利用率の最大値 × 定数４
【００９７】
前述した手順によって、全ての接続候補ルータの負荷ポイントを算出し、負荷ポイントが最低のルータを接続対象として選択する。これによって規則Ｂ３による選別が行われた（Ｓ３０４）。
【００９８】
次に、構築支援部３０４は、新たな計算機の情報をノード管理テーブルＴ０６に登録する。具体的には、ノード管理テーブルＴ０６に新エントリを作成し、ステップＳ３０４で選択された接続対象ルータの座標を、ノードの座標として、座標Ｔ０６４に登録する。アドレスＴ０６２は、この段階では登録されない。これは、ノードが、起動後に割り当てられる（例えば、ＤＨＣＰによる自動割り当て）アドレスをマスタ計算機Ｍ０に通知し、この通知されたアドレスが登録されるためである。ハッシュ値Ｔ０６３には、ステップＳ３０１で決定された新たな計算機のハッシュ値が登録される。新たな計算機は代表ノードではないため、代表ノードＴ０６４及び拡張用スイッチＴ０６５は設定されない。
【００９９】
さらに、構築支援部３０４は、新たな計算機の設定情報を作成する。設定すべき情報は、ステップＳ３０１で決定された新たな計算機のハッシュ値及び新たな計算機の座標（ステップＳ３０４で求めたルータの座標と等しい）、新たな計算機のアドレスである。但し、アドレスについては、ルータが計算機用ネットワークに対するＤＨＣＰサーバとして動作すれば、全ての計算機はＤＨＣＰクライアントとして動作することができ、個々の計算機のアドレスの設定は不要となる。構築支援部３０４が設定情報を作成した後、システム管理者は、作成された設定情報を新たな計算機に設定し、ステップＳ３０４で決定されたルータに新たな計算機を接続する。
【０１００】
設定情報を新たな計算機に設定する方法としては様々な方法がある。例えば、マスタ計算機Ｍ０から、フロッピーディスク又はＵＳＢメモリ等の記憶媒体を経由して、新たな計算機に設定ファイルをコピーしてもよい。また、新たな計算機をネットワークスイッチＳＷ−０に一時的に接続することによって、新たな計算機とマスタ計算機Ｍ０とを同一ネットワークに接続し、ネットワーク経由でマスタ計算機Ｍ０から新たな計算機に設定情報をコピーしてもよい（Ｓ３０５）。
【０１０１】
ステップＳ３０３において、拡張用スイッチＴ０６５が設定されていないと判定された場合、新たな計算機を接続するルータのネットワークセグメントを決定する必要がある。構築支援部３０４は、ステップＳ３０２で求めた二つの（前後の）代表ノードの座標をノード管理テーブルＴ０６の座標Ｔ０６１から取得し、二つの座標を比較し違いがある要素（Ｘ、Ｙ）を確認する。違いがある要素が二つの代表ノード間の軸方向となり、違いがない要素が軸の方向を含まない座標となる。例えば、図４に示す計算機Ｎ９と計算機Ｎ１０を代表ノードとして選んだ場合、計算機Ｎ９の座標は（０，２）であり、計算機Ｎ１０の座標は（１，２）である。よって、軸方向はＸ方向で、軸のＹ座標は２になり、軸の方向を含む座標は「Ｘ−２」になる。
【０１０２】
次に、この軸に対応するネットワークスイッチの負荷を求める。具体的には、求められた軸の方向を含む座標とスイッチ負荷管理テーブルＴ０３の座標Ｔ０３１とが一致するエントリを検索する。エントリが見つかったら、そのエントリの監視履歴Ｔ０３２を取得する。取得したエントリの監視履歴Ｔ０３２には、当該スイッチの負荷情報の履歴が格納されたスイッチ負荷監視履歴テーブルＴ０４の識別子が記載されている。そこで、負荷監視履歴テーブルＴ０４を参照し、ルータ座標Ｔ０４１毎に、報告時刻Ｔ０４４が過去一定時間以内（例えば、１時間）以内のエントリについて、入力カウンタ及び出力カウンタの差分を計算する。カウンタ値の差分は、ネットワークスイッチに入力／出力されるデータ量となる。次に、ルータ座標Ｔ０４１毎に、入力カウンタ及び出力カウンタの差分の平均値及び最大値を求める。そして、各ルータ座標Ｔ０４１において求められた最大値及び平均値の各々の和を計算する。例えば、軸の座標が「Ｘ−２」の場合、ルータ座標（０，２）（１，２）（２，２）（３，２）の各々について入力カウンタの差分の最大値を算出し、最大値の和を計算する。同様に、ルータ座標（０，２）（１，２）（２，２）（３，２）の各々について入力カウンタの差分の平均値を算出し、平均値の和を計算する。同様に、出力カウンタの最大値及び平均値を算出し、最大値の和及び平均値の和を計算する。
【０１０３】
このような手順によって、軸方向のネットワークスイッチに関する四つの負荷パラメタ（入力／出力データ量の最大値及び平均値）を算出し、算出された全ての負荷パラメータが基準値以下であるか否かを判定する。例えば、最大値にはネットワークスイッチの最大性能の９５％、平均値にはネットワークスイッチの最大性能の７０％のように、ネットワークスイッチの最大性能に基づいて基準値を決めるとよい。いずれかの負荷パラメタが基準値を超えていれば、ネットワークスイッチの負荷が高いので、ステップＳ３０７へ進む。一方、全ての負荷パラメタが基準値を超えていなければ、ネットワークスイッチの負荷が低いので、ステップＳ３０８へ進む（Ｓ３０６）。
【０１０４】
ステップＳ３０６において、ネットワークスイッチの負荷が低いと判定された場合、新たな計算機を接続するルータのネットワークセグメントとして、軸方向のネットワークスイッチを選択する。ステップＳ３０２で求めた二つの代表ノードのうち手前の代表ノードに対応するノード管理テーブルＴ０６のエントリの拡張用スイッチＴ０６５に、ステップＳ３０６で求めた軸の方向を含む座標を登録する（Ｓ３０７）。
【０１０５】
一方、ステップＳ３０６でネットワークスイッチの負荷が基準値以上であれば、新たな計算機を接続するルータのネットワークセグメントとして、軸方向に垂直な方向のネットワークスイッチを選択する。ステップＳ３０２で求めた二つの代表ノードの座標及びステップＳ３０６で求めた軸方向に基づいて、軸方向に垂直なネットワークスイッチの座標を決定する。例えば、図４に示す計算機Ｎ９と計算機Ｎ１０が代表ノードとして選択されている場合、計算機Ｎ９の座標は（０，２）であり、計算機Ｎ１０の座標は（１，２）であり、軸方向はＸ方向である。従って軸方向に垂直な方向はＹ方向となり、選択されている代表ノードの座標の各々からＹ方向に伸びる軸の座標「Ｙ−０」「Ｙ−１」がネットワークスイッチの座標となる。
【０１０６】
構築支援部３０４は、ステップＳ３０６と同様の手順で、軸方向に垂直な方向に伸びる二つのネットワークスイッチの負荷パラメタ（入力／出力データ量の最大値及び平均値）を算出する。そして、算出された負荷パラメタに基づいて、負荷ポイントを算出する。負荷ポイントの算出方法は様々な方法があるが、例えば、下式を用いて、前述した四つの値の２乗の線形結合によって算出することが考えられる。
負荷ポイント ＝ 定数１ × 入力量の平均値２ ＋ 定数２ × 入力量の最大値２ ＋ 定数３ × 出力量の平均値２ ＋ 定数４ × 出力量の平均値２
【０１０７】
この式で、負荷パラメータの二乗を用いたのは、入出力データ量がネットワークスイッチの性能限界に近づいた場合に、より負荷を高く見積もるためである。このように、軸方向に垂直な方向に伸びる二つのネットワークスイッチの負荷ポイントを算出し、算出された負荷ポイントが低いネットワークスイッチを、新たな計算機の接続用のセグメントに採用する。
【０１０８】
構築支援部３０４は、ステップＳ３０２で求めた二つの代表ノードのうち、手前の代表ノードに対応するノード管理テーブルＴ０６のエントリの拡張用スイッチＴ０６５に、採用されたネットワークスイッチの座標を登録する（Ｓ３０９）。
【０１０９】
ステップＳ３０７又はＳ３０９の処理が終了した後、構築支援部３０４は、ステップＳ３０４と同様の手順で新たな計算機を接続するルータを選択する（Ｓ３１０）。そして、ステップＳ３０５と同様の手順で新たな計算機の情報をノード管理テーブルＴ０６へ登録し、次に新たな計算機へ設定される設定情報を作成し、作成された設定情報を新たな計算機へ設定する（Ｓ３１１）。
【０１１０】
分散データベースを構成する計算機の数が増えた場合、一つのルータに計算機を追加する方法では、ルータのＬＡＮポートが不足したり、一つのルータへの負荷が高くなったり、という問題が発生する。このような場合は、格子のサイズを拡大し、システムを再構成する必要がある。しかし、システムの再構成は多くの手間を必要とする作業であり、設定の自動化による構築支援があると望ましい。以下では、設定自動化の方法について説明する。
【０１１１】
設定自動化における、マスタ計算機Ｍ０の構築支援部３０４の動作を図１８に示す。以下では図１８を用いて自動設定処理の詳細を説明する。
【０１１２】
まず、システム管理者は新システムの格子サイズをマスタ計算機Ｍ０に入力する。次に、構築支援部３０４は、ルータ管理テーブルＴ０５をクリアした後、図３で説明した手順を用いてルータの座標を決定する。図３ではノードの座標を決定したが、ノードをルータに読み替えてルータに適用することができる。ルータの座標が決まる度に、ルータ管理テーブルＴ０５の最後尾に新エントリを追加し、そのエントリの座標Ｔ５１に、決定された座標を登録する。このようにして、すべての格子点に対してルータの割り当てを終わると、ルータ管理テーブルＴ０５上では、仮想リング上の順序でルータに対応するエントリが並ぶ（Ｓ４０１）。
【０１１３】
構築支援部３０４は、ステップＳ４０１においてユーザが入力した格子サイズからネットワークスイッチのアドレス一覧を生成し、生成したアドレス一覧をスイッチ設定テーブルＴ０７（図１４）の座標Ｔ０７１に登録する。スイッチ設定テーブルＴ０７は、各エントリがネットワークスイッチ１台に対応し、座標Ｔ０７１及びネットワークアドレスＴ０７２を含む。座標Ｔ０７１は、ネットワークスイッチの座標である。ネットワークアドレスＴ０７２は、当該ネットワークスイッチが担当するネットワークセグメントのネットワークアドレスであり、ネットワークアドレスは、「１９２．１６８．０．０／２４」のようにネットワークアドレス「１９２．１６８．０．０」とアドレス長「２４」を組み合わせて表される。
【０１１４】
構築支援部３０４は、システム管理者に対して、格子型ネットワークを構成する各ネットワークスイッチのネットワークセグメントのアドレスを決定するように促す。このとき、構築支援部３０４が図４に示すようなネットワーク図をディスプレイ上に表示して、各ネットワークスイッチのネットワーク上の位置を示すと分かりやすい。システム管理者は、ネットワークスイッチの座標とネットワークアドレスの対応関係を入力する。構築支援部３０４は、スイッチ設定テーブルＴ０７の座標Ｔ０７１が一致するエントリのネットワークアドレスＴ０７２に、システム管理者によって入力された値を登録する（Ｓ４０２）。
【０１１５】
次に、構築支援部３０４は、ルータ管理テーブルＴ０５の各エントリのＸアドレスＴ０５２、ＹアドレスＴ０５３及び計算機アドレスＴ０５４を決定する。具体的には、Ｘアドレス及びＹアドレスは、軸方向とその軸方向以外の座標Ｔ０５１の要素に基づいて、対応するネットワークスイッチの座標を決定し、決定されたネットワークスイッチの座標によってスイッチ設定テーブルＴ０７を参照し、ネットワークアドレスを求める。その後、そのネットワーク内で利用していないアドレスを順に割り当てる。
【０１１６】
例えば、ルータ管理テーブルＴ０５の座標に（０，１）が格納されていた場合、軸方向がＸであるため、Ｙ要素と組み合わせた「Ｘ−１」が対応するネットワークスイッチの座標となる。スイッチ設定テーブルＴ０７の座標Ｔ０７１とネットワークスイッチの座標とが一致するエントリをスイッチ設定テーブルＴ０７から探す。その結果、「１９２．１６８．１．０／２４」が対応するネットワークアドレスとなる。このネットワークセグメントを使うのはルータのみである。そして、構築支援部３０４は、他のルータに既に割り当てられたアドレス以外のアドレスをルータに割り当て、そのアドレスをＸアドレスＴ０５２に格納する。Ｙアドレスについても同様にアドレスを決定して、決定されたアドレスをＹアドレスＴ０５３に格納する。
【０１１７】
全てのルータのＸアドレスとＹアドレスが決定した後、計算機アドレスＴ０５４を決定する。計算機アドレスＴ０５４は、ルータ毎に独自のネットワークセグメントを設定してよいため、利用されていないネットワークセグメントであればよい。構築支援部３０４は、利用されていないネットワークセグメントを順にルータに割り当て、割り当てられたネットワークセグメントの最初のアドレスを計算機アドレスＴ０５４に登録する（Ｓ４０３）。
【０１１８】
構築支援部３０４は、ルータ管理テーブルＴ０５に基づいて、ルータの設定情報を生成する。具体的には、ＸアドレスＴ０５２、ＹアドレスＴ０５３及び計算機アドレスＴ０５４に対応する三つのネットワークセグメントの設定、各ネットワークセグメントに対応するルータのアドレスの設定、各ネットワークセグメントに対応するルータのＬＡＮポートの割り当て、及び、計算機ネットワークセグメントに対するＤＨＣＰサーバの設定を生成する。ＬＡＮポートは、Ｘアドレス、Ｙアドレスについて一つずつ割り当て、残りのＬＡＮポートを計算機アドレスに割り当てる。生成された設定情報は、システム管理者がフロッピーディスク等の媒体又はネットワーク経由でルータに設定する。ネットワーク経由で設定する場合は、各ルータを一時的にマスタ計算機Ｍ０が接続されたネットワークセグメント（ネットワークスイッチＳＷ−０に対応するネットワークセグメント）に接続する必要がある（Ｓ４０４）。
【０１１９】
次に、構築支援部３０４は、各ノードの再配置方法を決定する。ノード管理テーブルＴ０６に、分散データベースを構成する計算機の一覧が記載されているので、まず、ノード管理テーブルＴ０６に記載された計算機から代表ノードになるものを選択する。構築支援部３０４は、ノード管理テーブルＴ０６のすべてのエントリについて座標Ｔ０６１、アドレスＴ０６２、代表ノードＴ０６４及び拡張用スイッチＴ０６５をクリアする。次に、ノード管理テーブルＴ０６のすべてのエントリをハッシュ値Ｔ０６３でソートする。次に以下の計算式を用いて代表ノードのエントリ番号を求める。
エントリ番号 ＝（格子番号 × 全エントリ数／格子数）の整数部分
この式において、格子番号は仮想リングにおけるノードの順序を示す番号であり、０〜格子数−１までのいずれかの値である。また、エントリ番号は、ソート後のノード管理テーブルＴ０６のエントリの順序を示す番号であり、最初のエントリが０であり、最後のエントリ番号が全エントリ数−１である。
【０１２０】
格子番号に対応するエントリ番号が求められた後、ルータ管理テーブルＴ０５に含まれるエントリのうち、最初から"格子番号"番目のエントリの座標Ｔ０５１を取得する。この取得した座標を、ノード管理テーブルＴ０６に記載されたエントリのうち、最初から"エントリ番号"番目のエントリの座標Ｔ０６１に登録し、そのエントリの代表ノードＴ０６３を"ｔｒｕｅ"に設定する（Ｓ４０５）。
【０１２１】
次に、構築支援部３０４は、ノード管理テーブルＴ０６の座標Ｔ０６１が決まっていないエントリについて、図１７と同様の手順で座標Ｔ０６１を決定する。但し、この時点では分散データベースが動作していないため、ルータ及びネットワークスイッチに入出力されるデータがない。従って、ステップＳ３０６の後、ステップＳ３０８及びＳ３０９に必ず進む。また、ステップＳ３０５及びＳ３１１において、新たな計算機への設定情報を生成及び設定している。しかし、この自動設定処理においては、ステップＳ４０７においてまとめて設定情報を設定するので、ステップＳ３０５及びＳ３１１ではノード管理テーブルＴ０６へ新たな計算機を登録するだけである（Ｓ４０６）。
【０１２２】
最後に、構築支援部３０４は、ステップＳ３０５と同様の手順によって、各計算機の設定情報を作成し、作成された設定情報を各計算機に設定する（Ｓ４０７）。
【０１２３】
次に、通常運用時の動作について説明する。
【０１２４】
クライアント計算機Ｃ１が、最初に分散データベースシステムにアクセスするとき、マスタ計算機Ｍ０に問い合わせ、マスタ計算機Ｍ０からノード管理テーブルＴ０６の座標Ｔ０６１、アドレスＴ０６２及びハッシュ値Ｔ０６３を取得する。このノード管理テーブルＴ０６の情報は１回取得すると、ＤＢ用計算機の構成が変更するまで再取得する必要はない。
【０１２５】
マスタ計算機Ｍ０のクライアント管理部３０２は、クライアント管理テーブルＴ０８（図１５）にシステムを利用中のクライアント計算機のアドレスを保持する。クライアント管理テーブルＴ０８は、アドレスＴ０８１及びキャッシュリース日時Ｔ０８２を含む。アドレスＴ０８１は、クライアント計算機のアドレスである。キャッシュリース日時Ｔ０８２は、クライアントへノード管理テーブルＴ０６の内容を送信した時刻である。ＤＢ用計算機の構成が変更された場合、マスタ計算機Ｍ０はクライアント管理テーブルＴ０８に登録されているすべてのクライアントに、ノード管理テーブルＴ０６のキャッシュを無効化するように要求する。また、キャッシュリース日時から一定時間が経過すると、マスタ計算機Ｍ０はクライアントが消失したものと判定し、クライアント管理テーブルＴ０８から対応するエントリを削除する。従って、クライアント計算機は一定時間毎にマスタ計算機Ｍ０にアクセスし、キャッシュリース日時Ｔ０８２を更新する。
【０１２６】
クライアント計算機Ｃ１は、データを書き込むとき、自身がキャッシュしているノード管理テーブルＴ０６を参照し、アクセスすべきキーのハッシュ値を格納している計算機（プライマリノード）のエントリを求める。次に、全エントリをハッシュ値が小さい順にソートしたときに、求められたプライマリノードから１番目及び２番目に位置する二つの計算機（バックアップノード）のエントリを求める。
【０１２７】
プライマリ及びバックアップノードのエントリを求めた後、クライアント計算機はハッシュ値が中央の計算機（すなわち、１番目のバックアップノード）にデータを送信する。これまで説明した計算機配置方法によれば、連続する三つの計算機はＬ字又は直線に並ぶ。Ｌ字に並ぶ場合に、最初に中央の計算機にデータを送信し、次に中央の計算機から両端の計算機にデータを転送すると、効率的にデータを転送することができる。このことから、クライアント計算機はハッシュ値が中央の計算機に最初にデータを転送する。
【０１２８】
ＤＢ用計算機のソフトウェア構成を図８に示す。
【０１２９】
ＤＢ用計算機は、データを書き込むシーケンスを管理するシーケンス管理部４０１、及びデータ管理部４０２を備える。データを書き込む際、プライマリノードのシーケンス管理部４０１が書き込むべきキー値にシーケンス番号を割り当てる。バックアップノードは、プライマリノードが割り当てたキーシーケンス番号をキー値に関連付けて書き込む。シーケンス番号はデータを書き込む毎に増加するが、バックアップノードでデータを書き込む際、書き込むべきシーケンス番号より大きなシーケンス番号が既に書き込まれていた場合、そのデータは書き込まない。このような方法によってデータの一貫性を保障することができる。
【０１３０】
中央のノードはバックアップノードであるため、クライアント計算機からデータを受信しても、データをコミットする権限を持たない。中央のノードは、マスタノードにデータを転送すると共に、シーケンス番号を要求する。さらに、中央のノードは、他のバックアップノードにデータを転送する。
【０１３１】
マスタノードは、データを受信したら、シーケンス管理部４０１がシーケンス番号を割り当て、データ管理部４０２がデータの書き込みを開始する。そして、マスタノードはシーケンス番号を中央ノードに返信する。中央ノードは、マスタノードからシーケンス番号を受信したら、他のバックアップノードにシーケンス番号を送る。
【０１３２】
各バックアップノードでは、書き込むべきキー値に既に関連付けられたシーケンス番号と、新たにプライマリノードから受け取ったシーケンス番号とを比較し、プライマリノードから受け取ったシーケンス番号の方が大きければ、データを書き込む。
【０１３３】
以上の説明では、クライアント計算機Ｃ１〜Ｃｎ及びマスタ計算機Ｍ０が、ＤＢ用計算機が含まれる計算機群と異なるネットワークセグメントに配置されているが、クライアント計算機の機能はＤＢ用計算機Ｎ１〜Ｎ１６が持ってもよい。また、マスタ計算機Ｍ０をルータＲ１〜Ｒ１６の計算機用ネットワークセグメントに接続してもよく、ネットワークスイッチＳＷ−Ｘ１〜ＳＷ−Ｘ４、ＳＷ−Ｙ１〜ＳＷ−Ｙ４に接続してもよい。
【０１３４】
ＤＢ用計算機Ｎ１〜Ｎ１６がクライアント計算機を兼ねる場合、クライアント計算機からＤＢ用計算機へ前述した方法によってアクセスすることは必ずしも最適ではない。例えば、クライアント計算機が計算機Ｎ１であり、プライマリノード及びバックアップノードが計算機Ｎ１４、Ｎ１５、Ｎ１６である場合、前述した方法では、クライアント計算機Ｎ１から計算機Ｎ１５にデータを転送した後、計算機Ｎ１５から計算機Ｎ１４及びＮ１６にデータを再転送する。しかし、クライアント計算機Ｎ１から計算機Ｎ１５へのアクセスは、途中でルータＲ１４又はＲ１６を経由するので、データの転送回数が増加する。
【０１３５】
このため、ＤＢ用計算機Ｎ１〜Ｎ１６がクライアント計算機を兼ねる場合、クライアント計算機からネットワーク距離が最も近いＤＢ用計算機にデータを転送した後、データが最初に転送されたＤＢ用計算機から他のＤＢ用計算機にデータを転送する手順によってデータを書き込むことが効率的である。
【０１３６】
具体的には、クライアント計算機は、自身がキャッシュしているノード管理テーブルＴ０６を参照し、データを書き込むプライマリノード及びバックアップノードを決定した後、自身の座標とプライマリノード及びバックアップノードの座標（座標Ｔ０６１から取得する）とを比較し、以下の順位でネットワーク距離の近い計算機を求める。
１  座標がクライアント計算機と同一のもの。
２  座標の一つの要素がクライアント計算機と同一のもの。
３  座標の二つの要素がクライアント計算機と異なるもの。
【０１３７】
そして、ネットワーク距離が最も近いＤＢ用計算機にデータを転送した後、データが最初に転送されたＤＢ用計算機から他のＤＢ用計算機にデータを転送する。
【０１３８】
本発明は、物理ネットワークとして高いスループットを利用可能な格子型ネットワークを利用することから、高いスループットが必要なアプリケーションで利用すると効果的である。キーあたりの保存データ量が増えると必要なスループットが増えるが、このような特性を持つアプリケーションの一つとしてファイルサーバがある。
【０１３９】
すなわち、ファイルＩＤ（又は、ファイルのパス名）をキーとし、ファイルの内容をキーに対応するｖａｌｕｅとして本発明の分散データベースに格納すれば、分散データベースをファイルサーバとして利用可能になる。上記ファイルＩＤは、ファイル作成時にファイルに付与され、二度と変更されることがないファイルの識別子である。通常のファイルサーバにおいて、上記ファイルＩＤはｉ−ｎｏｄｅ番号と呼ばれている。
【０１４０】
階層構造のディレクトリ機能を実現するには、ディレクトリのパス名をキー、ディレクトリ内のファイルのファイルＩＤ及び各種属性情報（ファイル名、タイムスタンプ、ファイルサイズ等）をｖａｌｕｅとして、分散データベースに格納すればよい。
【０１４１】
また、ファイルの内容を複数のブロックに分けて管理したい場合は、ファイルＩＤと当該ブロックのオフセット位置をキーとして、ブロックの内容をｖａｌｕｅとして分散データベースに格納すればよい。
【０１４２】
本発明は、要旨の範囲内で様々な変形が可能である。これまでの説明では格子内のルータ間の通信にＩＰプロトコルを利用することを前提としていたが、ルータやスイッチによっては他のプロトコルを利用してもよい。例えば、座標をデータ送信先のアドレスとして座標を指定するプロトコルを利用すれば、より効率的な実装が可能となる。
【０１４３】
前述した説明では、格子点上に配置したルータにＤＢ用計算機を接続したが、図１９に示すように、ルータがＤＢ用計算機を兼ねる、すなわち、ルータとＤＢ用計算機とが一体に構成されてもよい。この場合、ルータが代表ノードとなる。また、ルータの配下にＤＢ用計算機を接続する構成では、非代表ノード間のネットワーク距離が長くなることを避けるため、図１９の計算機Ｎ４−１、Ｎ９−１、Ｎ９−２のように、非代表ノードをＸ方向又はＹ方向のスイッチに接続することが望ましい。
【０１４４】
このような構成の場合、非代表ノードを追加する手順（図１７）においてステップＳ３０４及びＳ３１０の処理は必要ない。また、計算機用ネットワークが設けられないことから、ルータ管理テーブルＴ０５に計算機アドレスＴ０５４を格納する必要はない。これ以外の処理については、前述した処理と同様である。
【０１４５】
また、前述した説明では、格子点上に配置したルータ間をネットワークスイッチＳＷ−Ｘ１〜ＳＷ−Ｘ４、ＳＷ−Ｙ１〜ＳＷ−Ｙ４によって接続したが、図２０に示すように、ルータ間を直接結合し、二次元トーラス型に構成してもよい。ルータ間をネットワークスイッチによって接続する場合、計算機のＸ座標又はＹ座標が一致する計算機はネットワーク的に隣接する。しかし、二次元トーラス型構造である場合、座標が隣接する計算機のみがネットワーク的に隣接する。なお、トーラス型構造であるため、例えば、座標が（０，０）のノードと（０，３）のノードとは隣接する。図３に示した代表ノードの配置方法では、このような制約を設けても仮想リング上で隣接する代表ノード間はネットワーク的に隣接する。
【０１４６】
前述した説明では、ＤＢ用計算機を追加する際、システム管理者がＤＢ用計算機を適切なルータに接続する必要がある。この作業は煩雑であり、人的ミスが発生しやすい。このため、図２１に示すように、各ルータから計算機用ネットワークセグメントへのポートをクロスバースイッチＳＷ−Ａ経由でＤＢ用計算機に接続するシステムが考えられる。
【０１４７】
これは、ルータのポートにＤＢ用計算機を接続する代わりに、ルータとＤＢ用計算機をクロスバースイッチＳＷ−Ａに接続し、クロスバースイッチＳＷ−Ａを制御することによって接続を変更する。従って、クロスバースイッチＳＷ−Ａは、ルータが接続されたポートと、ＤＢ用計算機Ｎ１〜Ｎ１６が接続されたポートを電気的に接続するものでよく、ネットワークスイッチのように転送されるパケットに基づいて、転送先を制御する機能を有する必要はない。このため、ポート数が多いクロスバースイッチＳＷ−Ａでも安価である。クロスバースイッチＳＷ−Ａのスイッチは、マスタ計算機Ｍ０によって制御線Ｌ０を経由して制御される。制御線Ｌ０は、ＲＳ−２３２Ｃ等のシリアル通信線でも、Ｅｔｈｅｒ等のネットワークでもよい。
【０１４８】
図２１では、図面レイアウトの都合上、一つのルータとクロスバースイッチＳＷ−Ａとが１本の線で接続されているが、一つのルータとクロスバースイッチＳＷ−Ａとは複数の線で接続されてもよい。また図２１ではＤＢ用計算機の台数が１６台となっているが、実際にはさらに増やして利用してもよい。
【０１４９】
また、図２１に示した、ルータＲ１〜Ｒ１６、ネットワークスイッチＳＷ−Ｘ１〜ＳＷ−Ｘ４、ＳＷ−Ｙ１〜ＳＷ−Ｙ４、クロスバースイッチＳＷ−Ａ及びマスタ計算機Ｍ０を一体化した装置を実装し、ＤＢ用計算機を必要に応じて追加してもよい。さらに、前述した装置に必要に応じてルータを追加してもよい。
【０１５０】
本実施の形態は、二次元の格子を例として説明したが、次元数が２より大きい格子にも本発明を適用することができる。図２２Ａ〜図２２Ｄは、３次元格子によってシステムを構成した場合の、代表ノードの仮想リング上の順序を示し、Ｚ座標毎にＸ−Ｙ面の配置を図示している。なお、３次元格子では、前述した特徴１（仮想リング上で隣接する代表ノードはネットワーク的にも隣接すること）及び特徴２（代表ノードを仮想リング上の順にたどると、すべてのネットワークスイッチを同じ回数だけ通る）を同時に満たすことは難しい。図２２Ａ〜図２２Ｄに示す計算機の配置では、特徴１は完全に満たすが、特徴２を満たさない箇所がある。
【０１５１】
以下、計算機の配置規則を説明する。この問題は３次元格子内を一筆書きする問題に帰着できるので、以下では一筆書きとして説明する。まず、すべてのＺ座標に対して、Ｘ−Ｙ平面を２×２の領域に分割する。図２２Ａ〜図２２Ｄに示すシステムは、１辺のサイズが４の格子なので、図２３に示すように、一つのＸ−Ｙ平面が４領域に分割される。このような領域を４つのＺ座標に対して作成する。このとき、異なるＸ−Ｙ平面に、領域間の境界を同じ位置に設定する。例えば、図２２Ａ〜図２２Ｄでは、全てのＺ座標のＸ−Ｙ平面において、縦及び横の中心線が境界となる。以下では、各領域を参照する場合、図２３に示すようにＡ〜Ｄの名前で称する。
【０１５２】
最初は、Ｚ＝０のＸ−Ｙ平面の領域Ａから開始し、領域Ａの全ての４ブロックを通過して、当該ブロックの順序（１〜４）を決定した後、Ｚ＝１のＸ−Ｙ平面上で同じ位置の領域Ａへ移動する。この領域Ａの全てのブロックを通過して、当該ブロックの順序（５〜８）を決定する。その後、同様にＺ＝２のＸ−Ｙ平面の領域Ａ、及び、Ｚ＝３のＸ−Ｙ平面の領域Ａに移動し、当該領域Ａ内のブロックを通過して、当該ブロックの順序を決定する。Ｚ＝３のＸ−Ｙ平面の領域Ａの全てのブロックの順序（１３〜１６）を決定した後、そのＸ−Ｙ平面において、隣接する領域Ｂへ移動し、領域ＢにおいてＺ＝３、Ｚ＝２、Ｚ＝１、Ｚ＝０の順に各Ｘ−Ｙ平面を通過して、領域Ｂ内のブロックの順序（１７〜３２）を決定する。Ｚ＝０の領域Ｂを通過し終えたら、Ｚ＝０のＸ−Ｙ平面において領域Ｃに移動し、同様にＺ＝０、Ｚ＝１、Ｚ＝２、Ｚ＝３の順に各Ｘ−Ｙ平面の領域Ｃを通過する。最後にＺ＝３、Ｚ＝２、Ｚ＝１、Ｚ＝０の順に各Ｘ−Ｙ平面の領域Ｄを通過して開始位置に戻る。
【０１５３】
領域を一つの格子と考えると、図３の手順で作成されるノードの並べ方を領域の並べ方に適用することができる。これによって、Ｘ−Ｙ平面内で異なる領域を通過順に隣接させることが可能である（なお、格子の一辺が４の倍数のときのみ、図３の手順が実行可能であり、図２３は最小サイズのケースを示し、図３の手順が適用されている）。このため、Ｚ＝０及びＺ＝３で異なる領域に移動する場合、移動先の領域が隣接することが保障される。また、Ｚ座標が変化する場合、領域のＸ−Ｙ平面上の位置は変化しないので、移動先の格子点が隣接することが保障される。
【０１５４】
領域内の移動については、領域の左上から開始する場合、２通りの通過方法が考えられる。領域が左又は下に移動する場合、図２４Ａに示す通過方法を採用すれば、領域間移動の際に必ず隣接する格子点を移動することができる。同様に、領域が右又は上に移動する場合、図２４Ｂに示す通過方法を採用すれば、領域間移動の際に必ず隣接する格子点を移動することができる。
【０１５５】
以上により、Ｘ−Ｙ平面の１辺のサイズが４の倍数である場合、前述した手順によって、仮想リング上の隣接ノードがネットワーク的に隣接するような仮想リングを３次元格子上に作成できる。
【０１５６】
以上、本発明を添付の図面を参照して詳細に説明したが、本発明はこのような具体的構成に限定されるものではなく、添付した請求の範囲の趣旨内における様々な変更及び同等の構成を含むものである。
【図１】
2012042658.tif 000003
【図２】
2012042658.tif 000004
【図３】
2012042658.tif 000005
【図４】
2012042658.tif 000006
【図５】
2012042658.tif 000007
【図６】
2012042658.tif 000008
【図７】
2012042658.tif 000009
【図８】
2012042658.tif 000010
【図９】
2012042658.tif 000011
【図１０Ａ】
2012042658.tif 000012
【図１０Ｂ】
2012042658.tif 000013
【図１１Ａ】
2012042658.tif 000014
【図１１Ｂ】
2012042658.tif 000015
【図１２】
2012042658.tif 000016
【図１３】
2012042658.tif 000017
【図１４】
2012042658.tif 000018
【図１５】
2012042658.tif 000019
【図１６】
2012042658.tif 000020
【図１７】
2012042658.tif 000021
【図１８】
2012042658.tif 000022
【図１９】
2012042658.tif 000023
【図２０】
2012042658.tif 000024
【図２１】
2012042658.tif 000025
【図２２Ａ】
2012042658.tif 000026
【図２２Ｂ】
2012042658.tif 000027
【図２２Ｃ】
2012042658.tif 000028
【図２２Ｄ】
2012042658.tif 000029
【図２３】
2012042658.tif 000030
【図２４Ａ】
2012042658.tif 000031
【図２４Ｂ】
2012042658.tif 000032
【図２５】
2012042658.tif 000033
【図２６】
2012042658.tif 000034
【図２７】
2012042658.tif 000035
【国際調査報告】
2012042658.tif 000036
2012042658.tif 000037