説明

ノードの接続方法及びネットワークトポロジ構築方法及びネットワークシステム

【課題】複数のノードがネットワークで接続された分散システムにおいて接続関係の一貫性を保ちつつ非同期にノードの挿入、削除が行えるノードの接続方法を提供する。
【解決手段】第1のノードと、第1のノードの接続先である第2のノードの間に、第3のノードを挿入しようとする場合、まず第3のノードが、第1のノードが保持する、ノードの接続先が変更された際に更新される検出情報を入手し、第1のノードに、前記検出情報と、第3のノードに接続するための接続先情報とを含むリンク更新メッセージを送信する。そして、第1のノードが、リンク更新メッセージ受信時の第1のノードが保持する検出情報と、前記リンク更新メッセージに含まれる検出情報が一致するか否かを判定し、一致すると判定した場合に、前記接続先情報に基づいて第1のノードが第3のノードに接続するとともに、第1のノードが保持する検出情報を異なる検出情報に更新する。

【発明の詳細な説明】
【技術分野】
【0001】
本発明は、ネットワーク内のノードを接続する際に用いられるノードの接続方法、およびその接続方法を用いたネットワークトポロジ構築方法に関する。
【背景技術】
【0002】
ネットワーク上でサービスを提供するシステムの形態として、ピアツーピア(以下P2Pと表記する)システムが注目されている。P2Pシステムは各ノードが自律的に他のノードと協調動作することで、ノード数に応じて性能を向上させることができるシステムである。P2Pシステムは大きく分けてノードの接続関係(トポロジ)に制約のない非構造型P2Pシステムと、トポロジに一定の制約がある構造型P2Pシステムに分類できる。構造型P2Pシステムでは、トポロジを維持するコストがかかるが、ノード数やデータ数の対数オーダのコストでデータを検索できるという特徴を持つ。
【0003】
構造化P2Pシステムでよく用いられるトポロジの一つに双方向リングトポロジがある。双方向リングトポロジでは、各ノードはキー値(ノードの識別子などがよく用いられる)、右方向リンク、左方向リンクを持つ。右方向リンクは自分のキー値よりも次に大きいキー値を持つノード(存在しない場合は最も小さいキーを持つノード)に接続し、左方向リンクは自分のキー値よりも次に小さいキー値を持つノード(存在しない場合は最も大きいキーを持つノード)に接続する。
【0004】
双方向リングは、右方向リンクを用いた右方向リングと、左方向リンクを用いた左方向リングの2つの片方向リングに分解できる。
【0005】
P2Pシステムでは、システム稼働中にノードが挿入(追加)・削除される場合がある。双方向リングトポロジを構成するアルゴリズムでは、ノードの挿入・削除が予測できないタイミングで発生することを想定する必要がある。またノードが故障した場合は、故障したノードをバイパスしてリングを修復することも必要である。
【0006】
双方向リングトポロジを構成する手法を開示している文献としては、たとえば下記非特許文献1、2がある。
【先行技術文献】
【非特許文献】
【0007】
【非特許文献1】IonStoica, et al. Chord: A scalable peer-to-peer lookup protocol for internetapplications. IEEE/ACM Transactions on Networking, Vol. 11, No.1, pp. 17-32, 2003.
【非特許文献2】NancyLynch, Dahlia Malkhi, and David Ratajczak. Atomic Data Access in ContentAddressable Networks. In Proceedings of the 1st International Workshop on Peer-to-PeerSystems, pp. 295-305, 2002.
【発明の開示】
【発明が解決しようとする課題】
【0008】
上記非特許文献1に記載された手法では、ノードの挿入・削除時に、双方向リングは一時的に一貫性がない状態(各ノードがキーの値が最も近いノードと接続していない状態)になる。例えばノード1の右方向リンクがノード2を指している時に、ノード1とノード2の間にノード3とノード4が並行して挿入された場合、ノード3、ノード4のいずれも右方向リンクがノード2を指した状態(一貫性が崩れた状態)になる。この状態は定期的に実行する修復手続きによっていずれ解消されるが、このような状態が存在することは双方向リングを用いたアプリケーションプログラムにとって好ましいことではない。
【0009】
また、上記非特許文献2では、ノードの挿入・削除時に隣接するノードが排他制御することでリングの一貫性を確保する手法が記述されている。しかし、この手法は排他制御しているノードが故障した場合にリングを確実に修復することが困難であるという問題がある。この理由は、ノードが故障した時の排他制御状態を他のノードが確実に知ることができないためである。
【0010】
本発明は上記のような技術課題を解決するためになされたものであり、ノードが並行して挿入・削除された場合でも片方向リングの一貫性を保持できるノードの接続方法を提供することを目的とする。
【0011】
また、ノードを片方向リングに挿入(あるいは片方向リングから削除)した後で、反対方向リングに効率よく挿入する(あるいは反対方向リングから削除する)方法を提供することも目的とする。
【0012】
さらに、ノード故障やネットワーク故障が発生した場合でも安定して確実に双方向リングを修復できるノードの連結方法を提供することも目的とする。
【課題を解決するための手段】
【0013】
本発明は、第1のノードと、第1のノードの接続先である第2のノードの間に、第3のノードを挿入しようとする場合のノードの接続方法であって、各ノードは接続先が変更された際に更新される検出情報を有している。まず入手ステップにおいて、第3のノードが第1のノードが保持する検出情報を入手する。そして、送信ステップにおいて、第3のノードが第1のノードに、前記検出情報と、第3のノードに接続するための接続先情報とを含むリンク更新メッセージを送信する。
【0014】
次に、判定ステップにおいて、前記第1のノードが、前記リンク更新メッセージ受信時の第1のノードが保持する検出情報と、前記第1のリンク更新メッセージに含まれる検出情報が一致するか否かを判定し、一致すると判定された場合に、前記接続先情報に基づいて第1のノードが第3のノードに接続するとともに、第1のノードが保持する検出情報を異なる検出情報に更新する。
【0015】
また、第2のノードから第1のノードへも接続している場合に、第1のノードに付与された隣接ノードのリンクバージョン情報を用いて以下のステップを有してもよい。
【0016】
すなわち、前記第3のノードが、前記判定ステップにおいて一致していると判定された場合に、第1のノードに付与されている隣接ノードのリンクバージョン情報を更新した更新リンクバージョン情報と、第3のノードに接続するための接続先情報とを含むリンク更新メッセージを第2のノードに送信する送信ステップとを備える。
【0017】
そして、前記リンク更新メッセージを受信した第2のノードが、第2のノードが保持する自ノードのリンクバージョン情報よりも前記リンク更新メッセージに含まれる更新リンクバージョン情報が優先するか否かを判定する判定ステップと、前記リンク更新メッセージに含まれる更新リンクバージョン情報が優先すると判定した場合に、前記接続先情報に基づいて第2のノードから第3のノードへ接続するとともに、第2のノードが保持する自ノードのリンクバージョン情報を前記リンク更新メッセージに含まれる更新リンクバージョン情報に変更する第2のリンク更新ステップを有しても良い。
【0018】
さらに本発明は、第4のノードが第5のノードに接続し、第5のノードが第6のノードに接続している場合に、第5のノードを削除しようとする場合、各ノードが保持する他のノードから接続されている数を示す参照カウンタを用いて以下のステップを有しても良い。
【0019】
すなわち、第6のノードがリンク更新メッセージを受信した場合に、第6のノードが前記第5のノードに参照カウンタを減少させる参照カウンタ減少メッセージを送信する参照カウンタ減少メッセージ送信ステップと、第5のノードが前記参照カウンタ減少メッセージを受信した場合に参照カウンタを減少させる参照カウンタ減少ステップと、参照カウンタの値が基準値を下回ったときに第5のノードを削除する削除実行ステップを備える。
【0020】
さらに本発明は、上述のノードの接続方法を用いて、片方向リングトポロジあるいは双方向リングトポロジあるいは片方向連結リストトポロジあるいは双方向連結リストトポロジを構築することができる。
【0021】
さらに本発明は、上述のノードの接続方法を用いて構築するネットワークシステムであってもよい。
【発明の効果】
【0022】
本発明によれば、片方向リングトポロジなどにおいて、リングの一貫性を維持したままノードを挿入、あるいは削除できる。また、片方向リングに反対方向のリングを加えて双方向リングに拡張した場合、反対方向リングへのノードの挿入、削除は非常に効率的に実行できる。さらに、ノード故障やネットワーク故障時にリングを安定して修復できる。
【図面の簡単な説明】
【0023】
【図1】ノードを挿入する場合の基本的な流れを示す図
【図2】ノードを削除する場合の基本的な流れを示す図
【図3】複数のノードを並行して挿入する場合のノードの状態を示す図
【図4】ノードの挿入と削除が並行して起こった場合のノードの状態を示す図
【発明を実施するための最良の形態】
【0024】
(第1の実施形態)
本発明の実施形態に係るノードの接続方法について説明する。本実施形態のノードの接続方法は双方向リングについて適用しているが、これに限定されるものではない。例えば、片方向リング、片方向連結リスト、双方向連結リスト等、種々のネットワークトポロジの構築に用いることができる。
【0025】
本実施形態では、本発明を双方向リングの構成のために用いる。各ノードは、右方向、左方向の2つのリンク(接続先)を持ち、他のノード、あるいは自分自身に接続する。双方向リングは各ノードの右方向リンクをたどることで得られる右方向リングと、左方向リンクをたどることで得られる左方向リングの2つの片方向リングに分解できる。本実施形態では、リングの要素である各ノードは,それぞれのノードが保持するキー値によってソートされている。ここでは右方向がキー値の増加する方向とし、左方向がキー値の減少する方向とする。ただし、最大値を持つノードの右ノードは最小値を持つノードであり、また最小値を持つノードの左ノードは最大値を持つノードである。
【0026】
双方向リングにノードを挿入する場合の基本的な流れについて説明する。図1は、ノードを挿入する場合の基本的な流れを示す図である。
【0027】
まず、本実施形態に係るプロトコルに用いるメッセージについて説明する。新たなノードを挿入するには、挿入ノードの左ノード、右ノードとなるノードを検索し、次に左ノードの右リンクと、右ノードの左リンクを、挿入ノードに向けるよう更新する必要がある。
【0028】
このために、挿入ノードから左ノードに対し、左ノードの右リンクを更新するよう要求する右リンク更新要求メッセージ(SetRメッセージ)を送信する右リンク更新処理と、挿入ノードから右ノードに対し、右ノードの左リンクを更新するよう要求する左リンク更新要求メッセージ(SetLメッセージ)を送信する左リンク更新処理を実行する。
【0029】
右リンク更新処理が完了すると、右リンク更新完了通知メッセージ(SetRAckメッセージ)が返信される。右リンク更新処理が失敗した場合は、右リンク更新失敗通知メッセージ(SetRNakメッセージ)が返信される。
【0030】
また、SetL メッセージを受信して左リンクを付け替える場合には、付け替える前の左ノードに対して左リンク解放通知メッセージ(UnrefLメッセージ)を送信する。
【0031】
次に、右リンク更新処理や左リンク更新処理を実行する際に用いられる、検出情報、リンクバージョン情報、参照カウンタについて説明する。
【0032】
検出情報とは、ノードの挿入や削除によってノードの接続先が変更されるたびに更新される情報である。この検出情報は各ノードに付与されている。本実施形態では、ノードの右リンク先を示す接続先情報を検出情報として利用(兼用)する。
【0033】
リンクバージョン情報とは、自ノードあるいは隣接ノードが接続先を変更した回数を示す。本実施形態では、リンクバージョン情報は整数値で表される(以下、リンク番号という)。
【0034】
リンク番号は各ノードの左右のリンクに対して付与され、それぞれ左リンク番号、右リンク番号と呼ぶ。各ノードの左リンク番号は、自ノードの左リンク(左方向の接続先)を変更した回数を示し、右リンク番号は、右ノード(隣接ノード)が接続先を変更した回数を示す。ノードaの右ノードがノードbで、定常状態(a、b間で転送中のメッセージが存在しない場合)にある場合、bの左リンク番号とaの右リンク番号は等しい。
【0035】
リンク番号は以下のルールで割り当てる。
1.ノードnをノードaとノードbの間に挿入する場合、nの左リンク番号とaの右リンク番号は0とする。また、nの右リンク番号とbの左リンク番号は、nを挿入前のaの右リンク番号+1とする。
2.ノードnを削除する場合、nの左ノードの右リンク番号とnの右ノードの左リンク番
号はnの右リンク番号+1とする。
【0036】
なお、本実施形態では、リンクバージョン情報として整数(リンク番号)を用いているが、十分要素数の大きい全順序集合の要素ならば整数以外でもよく、例えばアルファベットなどを用いることも可能である。
【0037】
参照カウンタは、他のノードから左リンクによって参照される数を数えるためのカウンタで、各ノードが保持する。挿入済みのノードの参照カウンタは定常状態では1である。参照カウンタはSetRメッセージを受信した場合に1加算し、UnrefLメッセージを受信したときに1減算する。
【0038】
以下、ノードuが保持する情報を以下のように表記する。
・u.l uの左リンク
・u.r uの右リンク(uの検出情報を兼ねる)
・u.lnum uの左リンク番号
・u.rnum uの右リンク番号
・u.ref uの参照カウンタ
なお、ここではu.l、u.rはノードの位置(IPアドレスなど)と、ノードのキー値の両方を指すものとして扱っている(実際の実装では位置と値は別々の変数で保持する必要がある)。
【0039】
(ノードの挿入方法)
以下、ノードuを挿入する場合について説明する。ノード u は何らかの方法でリングに挿入済みの任意のノード qを知っているものとする。図1は、ノードを挿入する場合の基本的な流れを示しており、以下の流れで処理を行う。
【0040】
(1)まず,ノードuは挿入場所を求めるためにノードqからリングを辿り、uの左ノードとなるノード(aとする)、右ノードとなるノード(bとする)を検索する。uの挿入前はaの右ノードがbである。ここではaの右リンク番号とbの左リンク番号はともに整数値「d」とする(図1の状態S1)。本実施形態では、ノードaの検出情報としてaの現在の右リンク先(ここではb)を用いるため、uがbを入手するステップが請求項1の「入手ステップ」に相当する。
【0041】
(2)次に、uの左リンクをaに、右リンクをbに接続する。(これをu.l:=a, u.r:=bで表す)。また、u.lnum:=0とする。
【0042】
(3)uはaの右リンクをuに変更するために、aにSetRメッセージを送信する(請求項1の「第1の送信ステップ」に相当)。SetRメッセージの引数は、rcur(=b)、rnew(=u)、rnewnum(=0)である。ここで、rcurは検出情報であり、uが想定するaの現在の右リンク先である。rnewは新しい右リンク先で、接続情報に相当する。rnewnumは新しい右リンク番号を示している。
【0043】
(4)SetR メッセージを受信したノードaは、自らが保持する検出情報a.rと、SetRメッセージに含まれる検出情報rcurが一致するか否かを判定する(請求項1の「第1の判定ステップ」に相当)。また、aが削除中ではないか否かを判定する。(A)a.r=rcurかつ(B)aが削除中ではない場合、右リンク(a.r)と右リンク番号(a.rnum)をメッセージに従って変更し(a.rを変更することが請求項1の「第1のリンク更新ステップ」に相当する)、参照カウンタ(a.ref)を1加算してからSetRAckメッセージを返す(図の状態S2)。SetRAckメッセージの引数には、aの変更前の右リンク番号を格納する。(A)の条件は、検出情報が一致するかどうかのチェックに相当し、他のノードからのSetRメッセージと競合が発生したかどうかを判定するためのものである。また、(B)の条件は、削除中のノードに新たなノードを接続しないようにするためのものである。
【0044】
(5)上記(A)、(B)の条件が満たされない場合は、SetRNakメッセージを返す。
【0045】
(6)uがSetRAckメッセージを受信した場合、メッセージに含まれる右リンク番号に1を加算したものを自身の右リンク番号(u.rnum)とし、また、参照カウンタ(u.ref)を1に設定する。次にbの左リンクをuに変更するために、bにSetLメッセージを送信する(請求項5の「第3の送信ステップ」に相当)。SetLメッセージの引数はlnew(=u)、lnewnum(=u.rnum)、prevl(=u.l)である。ここで、lnewはbの新しい左ノード、lnewnumはbの新しい左リンク番号、prevlはbがUnrefLメッセージを送信する相手ノードを示している。
【0046】
(7)uがSetRNak メッセージを受信した場合、しばらく待ってステップ(1)からやり直す。
【0047】
(8)SetLメッセージを受信したbは、メッセージに含まれるlnewnum と現在のbの左リンク番号(b.lnum)の大小関係によりいずれを優先するかを比較判定する(請求項5の「第3の判定ステップ」に相当)。前者の方が大きければ前者の方が優先すると判断し、bの左リンク(b.l)と左リンク番号(b.lnum)を更新する(請求項5の「第3のリンク更新ステップ」に相当。図の状態S3)。また、比較の結果にかかわらずbはメッセージに含まれるprevlが示すノードに対してUnrefLメッセージを送信する。これは、bの左リンクがprevlを指していないことを示す。
【0048】
(9)UnrefLメッセージを受け取ったノード(ここではa)は、参照カウンタ(a.ref)を1減算する。
【0049】
(ノードの削除方法)
次に、ノードuを削除する場合の基本的な流れについて説明する。図2は、ノードを削除する場合の基本的な流れを示す図である。ノードの削除は以下のように行う。
【0050】
(1)以下、u.lの指すノードをaとし、u.rの指すノードをbとする。また、aの右リンク番号とuの左リンク番号は0,uの右リンク番号とbの左リンク番号は「d+1」とする(図2の状態S1)。ノードuは、aの右リンクをu.rに変更するためにaにSetRメッセージを送信する(請求項2の「第2の送信ステップ」に相当)。SetRメッセージの引数は、rcur(=u)、rnew(=u.r)、rnewnum(=u.rnum+1)である。
【0051】
(2)SetRメッセージを受信したノードは、メッセージをノード挿入時と同じ方法で処理する。すなわち、SetR メッセージを受信したノードaは、自らが保持する検出情報a.rと、SetRメッセージに含まれる検出情報rcurが一致するか否かを判定する(請求項2の「第2の判定ステップ」に相当)。また、ノードaが削除中ではないか否かを判定する。(A)a.r=rcurかつ(B)aが削除中ではない場合、右リンク(a.r)と右リンク番号(a.rnum)をメッセージに従って変更し(a.rを変更することが請求項2の「第2のリンク更新ステップ」に相当する)、参照カウンタ(a.ref)を1加算してからSetRAckメッセージを返す(図の状態S2)。
【0052】
(3)uはSetRAckメッセージを受信したら、ノードbの左リンクをaに変更するために、bにSetLメッセージを送信する(請求項5の「第3の送信ステップ」に相当)。SetLメッセージの引数は、lnew(=a)、lnewnum(=u.rnum+1)、prevl(=u)である。
【0053】
(4)uがSetRNakメッセージを受信した場合はしばらく待ってステップ(1)からやり直す。
【0054】
(5)SetLメッセージを受信したノードbは、メッセージをノード挿入時と同じ方法で処理する。すなわち、bは、メッセージに含まれるlnewnumと現在のbの左リンク番号(b.lnum)の大小関係によりいずれを優先するかを比較判定する(請求項6の「第4の判定ステップ」に相当)。前者の方が大きければ前者の方が優先すると判断し、bの左リンク(b.l)と左リンク番号(b.lnum)を更新する(請求項6の「第4のリンク更新ステップ」に相当。図の状態S3)。また、比較の結果にかかわらずbはメッセージに含まれるprevlが示すノードに対してUnrefLメッセージを送信する(請求項8の「減少メッセージ送信ステップ」に相当)。
【0055】
(6)uがu.rからUnrefLメッセージを受信すると、uの参照カウンタを1減少させる(請求項8の「参照カウンタ減少ステップ」に相当)。uの参照カウンタが基準値0になった時点で、uは左ノードu.lにUnrefLメッセージを送信してから、削除処理を完了する(請求項8の「削除実行ステップ」に相当)。このようにuの参照カウンタが0になることを待つことで、左リンクによりuを指しているノードが存在する間はuの削除完了を遅延させる。
【0056】
左リンクは右リンクよりも遅れて更新されるため、ステップ(1)でuが削除のためにSetRメッセージを送信した時点でu.lの値は正しいとは限らないが(u.lとuの間に別のノードvが挿入されている可能性がある)、この場合ノードu.lの右リンクはuではなくvになっているため、uが送信したSetRメッセージに対してSetRNakメッセージが返される。この場合、しばらく待ってステップ(1)からやりなおす(ステップ(4))。そのうちuはvからのSetLメッセージを受信して左リンクが書き換わるため、いずれ右リンク変更処理は成功する。
【0057】
(複数ノード挿入の例)
上で述べた方式を用いて、複数のノードを並行して挿入する場合の例について説明する。
【0058】
図3はノードAとDが隣接し、Aの右リンク番号、Dの左リンク番号ともdという状態(状態S1)から、ノードBとCがAとDの間に同時に挿入しようとする場合のトポロジの変化とメッセージのやりとりを示したものである。
【0059】
BとCはAにSetRメッセージを送信するが、引数のrcurはどちらもDである。図3ではAはBからのSetRメッセージを先に受信する場合を想定している。AがBからのSetRメッセージを受信すると右リンクはBに変更する(状態S2)。AがCからのSetRメッセージを受信したときには、Aの右ノードとrcurが一致しないため(検出情報が不一致)、SetRNakメッセージを返している(状態S3)。このように、検出情報を用いることで、複数のノード挿入が競合したことを検出できる。Cは再度挿入位置を求めて挿入をやり直す(状態S4)。
【0060】
SetRAckメッセージを受信したBとCはSetLメッセージをDに送信するが、図では(SetRの順序と異なり)Cからのメッセージを先に受信した場合を想定している(状態S5)。このとき、Dは左リンクをCに、左リンク番号をd+2に設定する。その後BからのSetLメッセージを受信するが、Bからのメッセージに含まれる左リンク番号(d+1)は現在の左リンク番号(d+2)よりも小さいため、左リンクは変更しない。このように、リンク番号を用いることで、SetLメッセージの到着順序が入れ替わっても問題なくDは正しい左ノードを指す。すなわち、左リンクの更新はSetLメッセージを1つ転送するだけでよい。
【0061】
(ノードの挿入と削除が並行して起こる場合の例)
次に、ノードの挿入と削除が並行して起こった場合の例を説明する。
【0062】
図4は、CがBとDの間に挿入され、並行してBが削除される場合のトポロジの変化とメッセージのやりとりを示したものである。図では、ノードCの挿入開始の方がノードBの削除開始よりも早い場合を想定している。状態S1でのAとBとの間、BとDと間の左右のリンク番号はそれぞれ「b」、「d」である。
【0063】
ノードCは、Bに対して、右リンクを更新するよう要求するSetRメッセージを送信する。SetRメッセージを受信したBは、参照カウンタを1増加して「2」にする(状態S2)。そして、BはCに対して、左リンクをAに更新するようSetLメッセージを送信する。Cからの左リンクが外され、CからのUnrefLメッセージを受信したBは、参照カウンタを「2」から「1」に減少させる。この時点でBの参照カウンタは所定の基準値「0」になっていないため、Bはまだ削除を完了できない。
【0064】
DがCからのSetLメッセージを受信すると、Dは左リンクをCに変更するとともにUnrefLメッセージをBに送信する(状態S4)。ノードBがUnrefLメッセージを受信すると、参照カウンタを「1」から「0」に減少させる。参照カウンタが基準値「0」になったため、Bは自身の削除処理を完了する。
【0065】
このように、ノードBは、ノードDの左リンクがノードBを指している間は削除を完了できず、ノードDの左リンクがノードCを指すようになってから削除を完了できる。UnrefLメッセージと参照カウンタにより、各ノードの左リンクは削除済みのノードを指すことがないため、左方向リングは途切れることはなく、常に左方向へのデータ転送が可能であるという利点がある。
【0066】
(第2の実施形態)
次に、本発明に係るノードの接続方法の第2の実施形態について説明する。本実施形態では、第1の実施形態を拡張し、ノードが故障した場合に、故障したノードをバイパスするようにリンクを修復する機能を追加する。以下、リンク修復の方式について説明する。
【0067】
第1の実施形態では、各ノードの左リンク番号が単調に増加することを利用して左リンク更新処理を簡潔に行っていた。リンク修復の際にも右ノードの左リンク番号を単調に増加させるために、リンク修復は故障したノードの右ノードが主体となって行う必要がある(故障したノードの左ノードは、故障したノードの右ノードの左リンク番号を知らないため)。
【0068】
挿入済みの各ノードは、左ノードの状態を調べるために定期的に左ノードに状態要求メッセージ(getStat)を送信する。getStatメッセージを受信したノードは状態メッセージ(Stat)を返す。
【0069】
ノードuが左ノードu.lにgetStatメッセージを送信し、一定時間以内にu.lからStatメッセージを受信できなかった場合、左ノードは故障したと判断し、以下に述べるリンク修復処理を行う。
【0070】
ノードuは、リンクを修復するためにuの左側で最も近い、故障していないノードvと、vの右ノードv.rを得る必要がある(v.rは、vに対してSetRメッセージを送信するときの引数rcurとして用いる)。
【0071】
本実施形態では、何らかの手段でvとv.rが得られるものと想定する。そのための方法は任意であるが、例えば双方向リングを使用している上位のデータ構造を利用して発見する、あるいは各ノードが左方向の一定数のノードを記憶しておく、といった方法が考えられる。
【0072】
uは、vとv.rを得たら、vに対してSetRメッセージを送信し、vの右リンクをuに書き換える。このときv-u間のリンクに対する左右のリンク番号に設定するべき値を考える。ノードA、B、Cがこの順に並んでいるものとする。また、B-C間のリンクに対するリンク番号をcとする。ここでB-C間のネットワークが一時的に切断された場合を考える。CからはBが故障したようにみえるため、BをバイパスしてA、Cを繋ごうとする。このとき、A-C間の左右のリンク番号はc+1にするというのが単純な方式だが、この間にB-C間に別のノードXか挿入される場合(XがBと通信できれば可能性がある)、Xの右リンク番号(これはCの左リンク番号でもある)もc+1になってしまい、リンク番号の一意性が保てなくなる。これはXとCが通信可能な場合問題となる。
【0073】
このため、本実施形態では、リンク番号を(g,s)という形式に拡張する。sは上述のリンク番号に対応する。gはリンクを修復した回数を表し、初期状態では0である。以下、ノードの左右のリンク番号は(g,
s)形式とし、ノードuの左リンク番号のgの値をu.lnum.gのように表記する。(自ノードのリンク番号のgが請求項9の「隣接ノード故障カウンタ」に対応)。
【0074】
また、リンク番号xとyに対し、以下の規則により等値関係、大小関係を定義する。
・x=y iff(x.g=y.g)∧(x.s=y.s)
・x<y iff(x.g<y.g)∨(x.g=y.g∧x.s<y.s)
さらに、リンク番号xに対して次の関数を定義する。
・x.gnext()=(x.g+1,0)
・x.next()=(x.g,x.s+1)
【0075】
uが左リンクを修復する際は、u.lnum:=u.lnum.gnext()としてからvにSetRメッセージを送信する。これによりリンク番号の一意性を保つことが可能である。例えば上の例で、初期状態でB−C間のリンク番号を(cg, cs)とすると、Xの右リンク番号は(cg, cs+1)となるが、リンク修復後のCの左リンク番号は(cg+1, 0)となる。その後XからのSetLメッセージをCが受信した場合、リンク番号の大小関係からメッセージは無視される(このように、左リンクが修復される前の情報に基づく古いSetLメッセージは無視される)。(リンク番号の大小関係の定義から、リンク番号のgの大きい方が優先されるが、これが請求項10に対応する)。
【0076】
uはノードvと、vの右ノードv.rを得ると、以下のようにして左リンクを修復する。
【0077】
(1)uはu.l:=v、u.lnum:=u.lnum.gnext()としてからvに対してSetRメッセージを送信する。SetRメッセージの引数は、rcur(=v.r)、rnew(=u)、rnewnum(=u.lnum)である。
【0078】
(2)SetRメッセージを受信したv は、メッセージを実施形態1と同じ方法で処理する(ただしリンク番号は(g, s)形式に拡張されている)。
【0079】
(3)uがSetRAckを受信すれば修復が完了する。SetRNakメッセージを受信した場合は
しばらく待ってgetStatメッセージの送信からやりなおす。
【0080】
以上、本発明によれば、ノード故障がない場合、常に右リンクは正しいノードを指し、左リンクはいずれ正しいノードを指す。また左リンクは常に生きているノードを指すため、リングに挿入されているノードを検索した場合、必ず発見できる。
【0081】
また、右方向リングに挿入(または削除)した後、左方向リングに挿入(または削除)するためにはSetLメッセージを1つ転送するだけでよいため、多数のノードが並行して挿入・削除するような状況でも効率的に挿入・削除操作を実行できる。
【0082】
さらに、本発明では排他制御を行うノードは存在しないため、ノード障害が発生した場合にも安全にリング構造を修復可能である。



【特許請求の範囲】
【請求項1】
複数のノードを有するネットワークにおいて、第1のノードと、第1のノードの接続先である第2のノードの間に、第3のノードを挿入しようとする場合のノードの接続方法であって、
各ノードは接続先が変更された際に更新される検出情報を有し、
第3のノードが第1のノードが保持する検出情報を入手する入手ステップと、
第3のノードが第1のノードに、前記入手ステップで入手した検出情報と、第3のノードに接続するための接続先情報とを含む第1のリンク更新メッセージを送信する第1の送信ステップと、
前記第1のノードが、第1のリンク更新メッセージ受信時の第1のノードが保持する検出情報と、前記第1のリンク更新メッセージに含まれる検出情報とが一致するか否かを判定する第1の判定ステップと、
前記第1の判定ステップで一致すると判定された場合に、前記接続先情報に基づいて第1のノードが第3のノードに接続するとともに、第1のノードが保持する検出情報を異なる検出情報に更新する第1のリンク更新ステップと、
を有することを特徴とするノードの接続方法。
【請求項2】
複数のノードを有するネットワークにおいて、第4のノードが第5のノードに接続し、第5のノードが第6のノードに接続している場合に、第5のノードを削除しようとする場合のノードの接続方法であって、
各ノードは接続先が変更された際に更新される検出情報を有し、
第5のノードが第4のノードに、第4のノードが保持する検出情報と、第6のノードに接続するための接続先情報とを含む第2のリンク更新メッセージを送信する第2の送信ステップと、
前記第4のノードが、第2のリンク更新メッセージ受信時の第4のノードが保持する検出情報と、前記第2のリンク更新メッセージに含まれる検出情報とが一致するか否かを判定する第2の判定ステップと、
前記第2の判定ステップで一致すると判定された場合に、前記接続先情報に基づいて第4のノードが第6のノードに接続するとともに、第4のノードが保持する検出情報を異なる検出情報に更新する第2のリンク更新ステップと、
を有することを特徴とするノードの接続方法。
【請求項3】
第1のノードが保持する検出情報として、第1のノードの接続先を識別する接続先情報を用い、
前記第1のリンク更新ステップにおいて、第1のノードが保持する検出情報を第3のノードを識別する接続先情報に更新することを特徴とする、請求項1に記載のノードの接続方法。
【請求項4】
第4のノードが保持する検出情報として、第4のノードの接続先を識別する接続先情報を用い、
前記第2のリンク更新ステップにおいて、第4のノードが保持する検出情報を第6のノードを識別する接続先情報に更新することを特徴とする、請求項2に記載のノードの接続方法。
【請求項5】
第2のノードから第1のノードへも接続している場合において、
各ノードには、自ノード及び隣接ノードが接続先を変更した回数を示す2つのリンクバージョン情報が付与されており、
第3のノードが、第1の判定ステップにおいて一致していると判定された場合に、第1のノードに付与されている隣接ノードのリンクバージョン情報を更新した第1の更新リンクバージョン情報と、第3のノードを識別する接続先情報とを含む第3のリンク更新メッセージを第2のノードに送信する第3の送信ステップと、
第3のリンク更新メッセージを受信した第2のノードが、第2のノードが保持する自ノードのリンクバージョン情報よりも第3のリンク更新メッセージに含まれる第1の更新リンクバージョン情報が優先するか否かを判定する第3の判定ステップと、
第3のリンク更新メッセージに含まれる第1の更新リンクバージョン情報が優先すると判定した場合に、前記接続先情報に基づいて第2のノードから第3のノードへ接続するとともに、第2のノードが保持する自ノードのリンクバージョン情報を第3のリンク更新メッセージに含まれる第1の更新リンクバージョン情報に変更する第3のリンク更新ステップと、
を備える請求項1または3に記載のノードの接続方法。
【請求項6】
第6のノードから第5のノードへも接続し、第5のノードから第4のノードへも接続している場合において、
各ノードには、自ノード及び隣接ノードが接続先を変更した回数を示す2つのリンクバージョン情報が付与されており、
第5のノードが、第2の判定ステップにおいて一致していると判定された場合に、第5のノードに付与されている隣接ノードのリンクバージョン情報を更新した第2の更新リンクバージョン情報と、第4のノードを識別する接続先情報とを含む第4のリンク更新メッセージを第6のノードに送信する第4の送信ステップと、
第4のリンク更新メッセージを受信した第6のノードが、第6のノードが保持する自ノードのリンクバージョン情報よりも第4のリンク更新メッセージに含まれる第2の更新リンクバージョン情報が優先するか否かを判定する第4の判定ステップと、
第4のリンク更新メッセージに含まれる第2の更新リンクバージョン情報が優先すると判定した場合に、前記接続先情報に基づいて第6のノードから第4のノードへ接続するとともに、第6のノードが保持する自ノードのリンクバージョン情報を第4のリンク更新メッセージに含まれる第2の更新リンクバージョン情報に変更する第4のリンク更新ステップと、
を備える請求項2又は4に記載のノードの接続方法。
【請求項7】
リンクバージョン情報が数値で表される場合に、
第3及び/又は第4の判定ステップにおいて、前記数値の大小関係によりいずれを優先するかを判定する、
請求項5又は6に記載のノードの接続方法。
【請求項8】
第4と第5のノードには、他のノードから接続されている数を示す参照カウンタが付与されており、
第6のノードが第4のリンク更新メッセージを受信した場合に、第6のノードが前記第5のノードに参照カウンタを減少させる参照カウンタ減少メッセージを送信する減少メッセージ送信ステップと、
第5のノードが前記参照カウンタ減少メッセージを受信した場合に参照カウンタを減少させる参照カウンタ減少ステップと、
参照カウンタの値が基準値になったときに第5のノードを削除する削除実行ステップと、
を備えることを特徴とする請求項2、4、6、7のいずれかに記載のノードの接続方法。
【請求項9】
各ノードは接続するノードが故障した回数をカウントする隣接ノード故障カウンタを保持していて、第3のリンク更新メッセージに隣接ノード故障カウンタを含めることを特徴とする請求項5又は7に記載のノードの接続方法。
【請求項10】
第3の判定ステップにおいて、第2のノードが保持する隣接ノード故障カウンタの値と第3のリンク更新メッセージに含まれる隣接ノード故障カウンタの値の大きい方を優先することを特徴とする請求項9に記載のノードの接続方法。
【請求項11】
請求項1から10のいずれかに記載のノードの接続方法を用いて、片方向リングトポロジあるいは双方向リングトポロジあるいは片方向連結リストトポロジあるいは双方向連結リストトポロジを構築することを特徴とするネットワークトポロジ構築方法。
【請求項12】
請求項1から10のいずれかに記載のノードの接続方法を用いて構築したネットワークシステム。



【図1】
image rotate

【図3】
image rotate

【図4】
image rotate

【図2】
image rotate


【公開番号】特開2012−44295(P2012−44295A)
【公開日】平成24年3月1日(2012.3.1)
【国際特許分類】
【出願番号】特願2010−181584(P2010−181584)
【出願日】平成22年8月16日(2010.8.16)
【出願人】(506122327)公立大学法人大阪市立大学 (122)
【出願人】(510222453)株式会社 ビービーアール (1)
【Fターム(参考)】