(57)【要約】【課題】ノード選択の偏りを省演算量で補正可能にすること。【解決手段】記憶部１ａは、ノード２，３，４それぞれが選択された回数に関する複数の数値を記憶する。複数の数値は、ノード２に対応する第１の数値とノード４に対応する第２の数値とを含む。処理部１ｂは、第１のデータの転送先としてノード２を選択すると、第１の数値を減らし、選択されなかったノード４に対応する第２の数値を増やす。処理部１ｂは、第２の数値が所定値以上になると、第２のデータの転送先として、ノード４を選択する。【選択図】図１
2018117300.tif 000002
【特許請求の範囲】
【請求項１】
データを転送する際に複数のノードの何れかを選択して転送する制御装置において、
前記複数のノードそれぞれが選択された回数に関する複数の数値であって、第１のノードに対応する第１の数値と第２のノードに対応する第２の数値とを含む前記複数の数値を記憶する記憶部と、
第１のデータの転送先として前記第１のノードを選択した場合に、前記第１の数値を減らし、選択されなかった前記第２のノードに対応する前記第２の数値を増やし、前記第２の数値が所定値以上になると、第２のデータの転送先として前記第２のノードを選択する処理部と、
を有する制御装置。
【請求項２】
前記処理部は、所定のルールにより前記第１のデータの転送先として前記第１のノードを選択し、前記第２の数値が前記所定値以上になると、前記所定のルールによらずに、前記第２のデータの転送先として前記第２のノードを選択する、請求項１記載の制御装置。
【請求項３】
前記所定のルールは、データの宛先毎に転送先を等確率で選択するルールである、請求項２記載の制御装置。
【請求項４】
前記所定のルールは、データの送信に用いられるパケットのヘッダ情報により識別されるフローに応じて転送先を選択するルールである、請求項２記載の制御装置。
【請求項５】
前記処理部は、特定のフローに対して前記所定のルールによらずに前記第２のノードを転送先として選択すると、所定期間、前記特定のフローに対応する前記データの転送先を、前記第２のノードとする、請求項４記載の制御装置。
【請求項６】
前記処理部は、前記第１のノードを転送先として選択すると、選択されなかった複数の前記第２のノードそれぞれに対応する複数の前記第２の数値を増やす、請求項１乃至５の何れか１項に記載の制御装置。
【請求項７】
前記処理部は、複数の前記第２の数値が前記所定値以上になると、前記複数のノードそれぞれに対する優先度に基づいて、前記第２のデータの転送先を選択する、請求項６記載の制御装置。
【請求項８】
前記処理部は、前記複数の数値それぞれに加える値をノード毎に異なる値とする、請求項１乃至７の何れか１項に記載の制御装置。
【請求項９】
データを転送する際に複数のノードの何れかを選択して転送する処理に用いられる制御プログラムにおいて、
前記複数のノードそれぞれが選択された回数に関する複数の数値であって、第１のノードに対応する第１の数値と第２のノードに対応する第２の数値とを含む前記複数の数値を記憶し、
第１のデータの転送先として前記第１のノードを選択した場合に、前記第１の数値を減らし、選択されなかった前記第２のノードに対応する前記第２の数値を増やし、
前記第２の数値が所定値以上になると、第２のデータの転送先として前記第２のノードを選択する、
処理をコンピュータに実行させる制御プログラム。
【請求項１０】
データを転送する際に複数のノードの何れかを選択して転送するコンピュータが、
前記複数のノードそれぞれが選択された回数に関する複数の数値であって、第１のノードに対応する第１の数値と第２のノードに対応する第２の数値とを含む前記複数の数値を記憶し、
第１のデータの転送先として前記第１のノードを選択した場合に、前記第１の数値を減らし、選択されなかった前記第２のノードに対応する前記第２の数値を増やし、
前記第２の数値が所定値以上になると、第２のデータの転送先として前記第２のノードを選択する、
制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は制御装置、制御プログラムおよび制御方法に関する。
【背景技術】
【０００２】
複数の装置を含むシステムでは、各装置はネットワークに接続され、相互に通信する。ネットワークは、データの送信元の装置と宛先の装置との間の通信を中継する複数の中継ノードを含み得る。ネットワークでは、トラフィック量が増すと、中継ノードの負荷も増して、通信に遅延が生じ得る。また、ある中継ノードで障害が発生すると、該当の中継ノードを経由する通信を行えなくなるおそれもある。そこで、ネットワーク上のある箇所（例えば、トラフィックが比較的集中しやすい箇所）において、複数の中継ノードを冗長化し、データの転送を分散して行うことで、通信遅延の低減や通信機能の可用性向上を図ることがある。
【０００３】
例えば、複数のスイッチ装置を用いて、パケットの転送を分散して行うシステムが考えられている。この提案では、上位スイッチ群に属するスイッチ装置の各送信ポートを、下位スイッチ群に属する複数のスイッチ装置に接続する。上位スイッチ群に属するスイッチ装置は、パケットのヘッダから算出されたハッシュ値に応じて、パケットを送信する送信ポートを選択する。
【０００４】
また、端末装置とサーバ装置との通信を中継する中継装置が、端末装置との通信量をサーバ装置毎に計測し、接続要求情報を端末装置から受信すると、所定の期間に計測された通信量が最も少ないサーバ装置に接続要求情報を送信する提案もある。
【０００５】
なお、第１の記憶装置群に格納されたデータを、データの種別毎に均等に、第２の記憶装置群に属する２台の記憶装置に分配するデータ分配装置の提案もある。データ分配装置は、第２の記憶装置群に属する２台の記憶装置に出力されたデータの累積個数を、当該データの種別毎に記憶するカウンタ群を備え、カウンタ群の内容に基づいて、第２の記憶装置群へ転送するデータの種別毎の偏りを判断する。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開２０１６−８２３３３号公報
【特許文献２】特開２０１０−５６８９８号公報
【特許文献３】特開平４−１２７２７１号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
冗長化された複数の中継ノードによりデータの転送を分散して行う場合、転送対象のデータを各中継ノードへ振り分ける制御装置を設けることが考えられる。例えば、各中継ノードの処理能力が同程度であれば、制御装置が、所定のルールに従い、各中継ノードに対して、ある程度均等にデータを振り分けることで、各中継ノードの負荷を適切に分散できる。しかし、実際の運用では、制御装置が、各中継ノードに対して常に均等にデータを振り分けられるとは限らず、データの振分先の中継ノードの選択に偏りが生じ得る。そこで、ノード選択に偏りが生じることを考慮し、偏りを補正するための仕組みが問題となる。
【０００８】
例えば、制御装置が、振分の累積回数を中継ノード毎に記憶し、累積回数が相対的に多い中継ノードの存在を検出することで、ノード選択の偏りを検出し、偏って選択されたノード以外のノードに振分先を振り替える方法が考えられる。具体的には、制御装置は、ある中継ノードに対する振分の累積回数と他の中継ノードに対する振分の累積回数との比較を、中継ノードの組み合わせを変えながら総当たりで行うことで、累積回数が比較的多い中継ノードの存在を検出し得る。しかし、この方法では、中継ノードの数が増すと、比較に要する演算量が過大になる可能性がある。
【０００９】
１つの側面では、本発明は、ノード選択の偏りを省演算量で補正可能にすることを目的とする。
【課題を解決するための手段】
【００１０】
１つの態様では、データを転送する際に複数のノードの何れかを選択して転送する制御装置が提供される。制御装置は、記憶部と処理部とを有する。記憶部は、複数のノードそれぞれが選択された回数に関する複数の数値であって、第１のノードに対応する第１の数値と第２のノードに対応する第２の数値とを含む複数の数値を記憶する。処理部は、第１のデータの転送先として第１のノードを選択した場合に、第１の数値を減らし、選択されなかった第２のノードに対応する第２の数値を増やし、第２の数値が所定値以上になると、第２のデータの転送先として第２のノードを選択する。
【発明の効果】
【００１１】
１つの側面では、ノード選択の偏りを省演算量で補正可能にする。
【図面の簡単な説明】
【００１２】
【図１】第１の実施の形態の制御装置を示す図である。
【図２】第２の実施の形態の情報処理システムの例を示す図である。
【図３】第２の実施の形態の振分サーバのハードウェア例を示す図である。
【図４】第２の実施の形態の振分サーバの機能例を示す図である。
【図５】第２の実施の形態のパケットの例を示す図である。
【図６】第２の実施の形態のラウンドロビンテーブルの例を示す図である。
【図７】第２の実施の形態のアンセレクトカウンタの例を示す図である。
【図８】第２の実施の形態のＵＳＣ更新ルールの例を示す図である。
【図９】第２の実施の形態のパケット転送例を示すフローチャートである。
【図１０】第２の実施の形態の転送先振替の具体例を示す図である。
【図１１】第２の実施の形態に対する比較例（その１）を示す図である。
【図１２】第２の実施の形態に対する比較例（その２）を示す図である。
【図１３】第３の実施の形態のパケットの例を示す図である。
【図１４】第３の実施の形態のセッション管理テーブルの例を示す図である。
【図１５】第３の実施の形態のパケット転送例を示すフローチャートである。
【図１６】第３の実施の形態の転送先振替の解除例を示すフローチャートである。
【図１７】第３の実施の形態の転送先振替の具体例を示す図である。
【図１８】第３の実施の形態に対する比較例を示す図である。
【図１９】転送先振替の他の例（その１）を示す図である。
【図２０】転送先振替の他の例（その２）を示す図である。
【図２１】振分累積カウンタの例を示す図である。
【図２２】振分累積カウンタとＵＳＣとの比較例を示す図である。
【発明を実施するための形態】
【００１３】
以下、本実施の形態について図面を参照して説明する。
［第１の実施の形態］
図１は、第１の実施の形態の制御装置を示す図である。第１の実施の形態のシステムは、制御装置１、ノード２，３，４および宛先装置５，６，７を含む。制御装置１は、ノード２，３，４に接続されている。ノード２，３，４は、ネットワークＮ１に接続されている。宛先装置５，６，７は、ネットワークＮ１に接続されている。更に、制御装置１は、ネットワークＮ２に接続されている。ネットワークＮ２には、端末装置８，９も接続されている。ただし、制御装置１は、スイッチ装置（図示を省略している）を介してノード２，３，４と接続されてもよい。
【００１４】
ここで、制御装置１は、データを転送する際にノード２，３，４の何れかを選択して転送する。すなわち、制御装置１は、データを転送する際に、ノード２，３，４のうちの何れかを転送先に選択し、選択した転送先のノードに当該データを転送する。
【００１５】
端末装置８，９それぞれにより送信されるデータの宛先は、宛先装置５，６，７である。データは、パケットと呼ばれる単位で送信されてもよい。端末装置８，９それぞれにより送信されるデータは、宛先装置５，６，７の何れかに到着するまでに、複数の経路を通り得る。第１の経路は、制御装置１およびノード２を経由する経路である。第２の経路は、制御装置１およびノード３を経由する経路である。第３の経路は、制御装置１およびノード４を経由する経路である。ノード２，３，４の何れを経由させるかは、制御装置１によって制御される。したがって、ノード２，３，４は、制御装置１によるデータの転送先の候補である。なお、「データの転送先の候補」は「データの振分先の候補」と表されてもよい。
【００１６】
ノード２，３，４は、ネットワークＮ１にデータを転送する。ネットワークＮ１は、宛先装置５，６，７にデータを転送する。ノード２，３，４はデータの中継を行う中継ノードであるといえる。なお、ノード２，３，４それぞれによるデータの転送処理の能力は、ほぼ同じであるとする。
【００１７】
制御装置１は、記憶部１ａおよび処理部１ｂを有する。記憶部１ａは、ＲＡＭ（Random Access Memory）などの揮発性記憶装置でもよいし、ＨＤＤ（Hard Disk Drive）やフラッシュメモリなどの不揮発性記憶装置でもよい。処理部１ｂは、ＣＰＵ（Central Processing Unit）、ＤＳＰ（Digital Signal Processor）、ＡＳＩＣ（Application Specific Integrated Circuit）、ＦＰＧＡ（Field Programmable Gate Array）などを含み得る。処理部１ｂはプログラムを実行するプロセッサでもよい。ここでいう「プロセッサ」には、複数のプロセッサの集合（マルチプロセッサ）が含まれ得る。
【００１８】
記憶部１ａは、ノード２，３，４それぞれが選択された回数に関する複数の数値を記憶する。複数の数値は、ノード２に対応する数値と、ノード３に対応する数値と、ノード４に対応する数値とを含む。
【００１９】
例えば、ノード２の識別情報（ノード＃）を“１”とする。ノード３の識別情報を“２”とする。ノード４の識別情報を“３”とする。記憶部１ａは、ノードの識別情報（ノード＃）と、カウンタとを対応付けたテーブルＴ１を記憶する。例えば、あるタイミングにおいて、テーブルＴ１には、ノード＃“１”、カウンタ“−１”のレコードが登録されている。カウンタの項目に登録された数値は、処理部１ｂにより該当のノードがデータ転送先として選択された回数に関する数値である（具体的なカウント方法は後述される）。同様に、テーブルＴ１には、ノード＃“２”、カウンタ“−２”のレコードが登録されている。更に、テーブルＴ１には、ノード＃“３”、カウンタ“３”のレコードが登録されている。なお、ノード２，３，４それぞれのカウンタの数値の初期値は、例えば“０”である。
【００２０】
処理部１ｂは、所定のルールに従って、転送対象のデータを、ノード２，３，４の何れに振り分けるか（何れに転送するか）を判断する。処理部１ｂが利用する所定のルールとしては、次の例が考えられる。
【００２１】
第１の例として、データの宛先毎に、ノード２，３，４に対して、データを等確率で振り分けるルール（例えば、ラウンドロビンや乱数などを用いて転送先を決定するルール）が考えられる。データの宛先毎にラウンドロビンを行う場合、処理部１ｂは、宛先装置５を宛先とするデータを、ノード２，３，４に順番に振り分ける（ノード４の次をノード２とする）。また、処理部１ｂは、宛先装置６を宛先とするデータを、ノード２，３，４に順番に振り分ける（ノード４の次をノード２とする）。更に、処理部１ｂは、宛先装置７を宛先とするデータを、ノード２，３，４に順番に振り分ける（ノード４の次をノード２とする）。これにより、宛先単位に、端末装置８，９からのアクセスを冗長化された各パスへ分散させることができる。
【００２２】
第２の例として、パケットに含まれるヘッダの情報により識別されるフローに応じて、データの転送先を選択するルールが考えられる。より具体的には、処理部１ｂは、ＩＰ（Internet Protocol）パケットに含まれる５タプル（プロトコル番号、送信元／宛先ＩＰアドレスおよび送信元／宛先ポート番号）からフローを識別し、５タプルにより計算されるハッシュ値に応じて転送先を選択してもよい。これにより、フロー単位に、端末装置８，９からのアクセスを冗長化された各パスへ分散させることができる。
【００２３】
処理部１ｂは、第１のデータに対し、上記の所定のルールに従って、第１のノードを転送先として選択する。すると、処理部１ｂは、第１のノードに対応するカウンタの数値（第１の数値）を減らし、選択されなかった第２のノードに対応するカウンタの数値（第２の数値）を増やす。減らす量、および、増やす量は、任意に決定できる。第１の実施の形態の例では、増減量の合計が“０”になるように、減らす量を“−２”、増やす量を“１”とする。
【００２４】
例えば、処理部１ｂは、第１のデータに対して、ノード２を転送先として選択したとする。この場合、処理部１ｂは、テーブルＴ１のノード＃“１”のカウンタの数値を“２”だけ減らす。一方、処理部１ｂは、テーブルＴ１におけるノード＃“２”のカウンタの数値、および、ノード＃“３”のカウンタの数値を、それぞれ“１”だけ増やす。
【００２５】
より具体的には、処理部１ｂは、テーブルＴ１において、ノード＃“１”に対して登録されている数値“−１”を、−１−２＝−３に更新する。処理部１ｂは、テーブルＴ１において、ノード＃“２”に対して登録されている数値“−２”を、−２＋１＝−１に更新する。処理部１ｂは、テーブルＴ１において、ノード＃“３”に対して登録されている数値“３”を、３＋１＝４に更新する。テーブルＴ１ａは、これらの更新の結果が反映された後を示している。処理部１ｂは、ノード２，３，４それぞれに対して、データの転送先として選択されなかった回数をカウントしているということもできる。
【００２６】
そして、処理部１ｂは、第２の数値が所定値以上になると、第２のデータの転送先として、所定値以上となった当該第２の数値と対応付けられた第２のノードを選択する。例えば、記憶部１ａは、所定値として、カウンタの閾値＝４を予め記憶する。テーブルＴ１ａの例では、ノード４（ノード＃“３”）に対応するカウンタの数値が“４”である。したがって、処理部１ｂは、ノード４に対応する数値“４”が所定値“４”以上になったことを検出する。このため、処理部１ｂは、第２のデータの転送先として、前述の所定のルールによらずに、ノード４を選択する。処理部１ｂは、選択したノード４に、第２のデータを転送する。
【００２７】
なお、処理部１ｂは、ノード４を選択すると、テーブルＴ１ａを更新する。具体的には、処理部１ｂは、ノード＃“１”のカウンタの数値を−３＋１＝−２に更新する。また、処理部１ｂは、ノード＃“２”のカウンタの数値を−１＋１＝０に更新する。更に、処理部１ｂは、ノード＃“３”のカウンタの数値を４−２＝２に更新する。ただし、図１では、当該更新後のテーブルの図示を省略している。
【００２８】
ところで、例えば、処理部１ｂが、宛先毎にラウンドロビンで負荷分散を行う場合、複数のデータの各宛先に対してラウンドロビンにより選択される転送先が同期すると、特定のノードへのトラフィックが、バースト的に増大することがある。この場合、該当のノードに対するデータの転送待ちが発生し、最悪の場合、バッファあふれによりデータが廃棄され得る。
【００２９】
また、処理部１ｂが、フロー毎に一意となるように、転送先のノードを選択する場合でも、複数のフローの転送先が特定のノードに集中すると、特定のノードへのトラフィックがバースト的に増大し、同様の問題が生じ得る。
【００３０】
そこで、ノード選択に偏りが発生することを考慮し、偏りを補正するための仕組みが問題となる。
例えば、複数のノードへデータの振分を行う装置が、選択された累積回数をノード毎に記憶し、累積回数が相対的に多いノードの存在を検出することで、ノード選択の偏りを検出し、偏りのあるノード以外のノードに振分先を振り替える方法も考えられる。具体的には、振分を行う装置が、ある中継ノードに対する振分の累積回数と他の中継ノードに対する振分の累積回数との比較を、中継ノードの組み合わせを変えながら総当たりで行うことで、累積回数が比較的多い中継ノードの存在を検出し得る。しかし、この方法では、ノードの数が増すと、比較に要する演算量が過大になる可能性がある。
【００３１】
より具体的には、１つの比較例として、２つのノードの組み合わせについて総当たりで比較を行い、選択の累積回数の最小値と、偏りの度合いを表す指標（例えば、２つの累積回数の差の平均値または最大値など）とを計算することを考える。例えば、偏りの度合いを表す指標が所定の閾値を超過した場合に、ノード選択に偏りが発生していると判断し得る。しかし、この方法では、転送先候補のノード数の増加に応じて、計算量は線形増加する。しかも、累積回数の差を表す指標により偏りが発生していることを検出する演算と、転送先のノードを選択するための演算（例えば、選択した累積回数が最小値であるノードを選択するなど）とを別個に行うことになる。このため、比較例の方法では、データの転送先の選択処理を十分に高速化できない。
【００３２】
一方、制御装置１では、データの転送先として選択されたノードのカウンタをカウントダウンし、選択されなかったノードのカウンタをカウントアップする。このため、制御装置１は、当該カウンタに基づいて、転送先として選択された回数が相対的に少ないノードを効率的に特定できる。図１の例において、制御装置１は、ノード４のカウンタの値が、所定の閾値以上になったことを検出することで、ノード選択に偏りが発生していると判断できる。なぜなら、ノード４が選択されなかった回数が相対的に多いということは、別のノード（例えば、ノード２，３の両方あるいは何れか一方）が選択された回数が相対的に多いと推定されるからである。更に、選択されなかった回数が相対的に多いノードは、振り分けられたデータ量も比較的少ないため、リソース（データの転送に用いられるリソースを含む）にも比較的余裕があると考えられる。したがって、制御装置１は、ノード２，３，４に、ある程度均等にデータを振り分けようとする場合、ノード４を優先的に選択した方がよいと判断できる。
【００３３】
このように、制御装置１は、ノード選択に偏りが発生していること、および、偏りを補正するために転送先として選択すべきノードの両方をテーブルＴ１ａのカウンタの値によって効率的に判定できる。特に、前述の比較例のように、ノード間での選択の累積回数の比較を総当たりで行って偏りを検出する方法よりも、演算量を少なくすることができる。
【００３４】
こうして、制御装置１によれば、ノード選択の偏りを省演算量で補正可能になる。その結果、制御装置１のデータの転送先の選択に伴う演算を高速化でき、端末装置８，９と宛先装置５，６，７との間の通信の遅延の低減に寄与する。
【００３５】
以下では、より具体的な情報処理システムを例示し、制御装置１の機能を更に詳細に説明する。
［第２の実施の形態］
図２は、第２の実施の形態の情報処理システムの例を示す図である。第２の実施の形態の情報処理システムは、振分サーバ１００，１００ａ，１００ｂ、中継サーバ２００，２００ａ，２００ｂ、業務サーバ３００，３００ａ，３００ｂ，・・・，３００ｍおよびスイッチ（ＳＷ：SWitch）４００を含む。
【００３６】
振分サーバ１００，１００ａ，１００ｂおよび中継サーバ２００，２００ａ，２００ｂはＳＷ４００に接続されている。中継サーバ２００，２００ａ，２００ｂおよび業務サーバ３００，３００ａ，３００ｂ，・・・，３００ｍは、ネットワーク１０に接続されている。
【００３７】
また、振分サーバ１００，１００ａ，１００ｂは、ネットワーク２０に接続されている。更に、ネットワーク２０には、クライアント５００，５００ａ，５００ｂ，・・・，５００ｎが接続されている。ネットワーク１０，２０は、例えば、ＬＡＮ（Local Area Network）である。ただし、ネットワーク１０，２０は、ＷＡＮ（Wide Area Network）でもよい。
【００３８】
第２の実施の形態の情報処理システムは、クライアント５００，５００ａ，５００ｂ，・・・，５００ｎそれぞれによる業務サーバ３００，３００ａ，３００ｂ，・・・，３００ｍへのアクセスを中継し、クライアントとＷｅｂサーバとの間の通信を実現する。
【００３９】
ここで、第２の実施の形態の情報処理システムでは、ＯＳＩ（Open Systems Interconnection）参照モデルのレイヤ２における通信プロトコルとして、イーサネット（登録商標）が用いられる。また、同レイヤ３における通信プロトコルとして、ＩＰ（Internet Protocol）が用いられる。更に、同レイヤ４における通信プロトコルとして、ＵＤＰ（User Datagram Protocol）またはＴＣＰ（Transmission Control Protocol）が用いられる。
【００４０】
振分サーバ１００，１００ａ，１００ｂは、クライアント５００，５００ａ，５００ｂ，・・・，５００ｎにより送信されたパケットを受け付け、中継サーバ２００，２００ａ，２００ｂに振り分けるサーバコンピュータである。振分サーバ１００，１００ａ，１００ｂは、振分先の中継サーバ２００，２００ａ，２００ｂのＭＡＣ（Media Access Control）アドレスを指定することで、各中継サーバにパケットを振り分ける。ここで、振分サーバ１００，１００ａ，１００ｂによるパケットの「振分先」は、振分サーバ１００，１００ａ，１００ｂによるパケットの「転送先」に相当する。振分サーバ１００，１００ａ，１００ｂは、第１の実施の形態の制御装置１の一例である。
【００４１】
中継サーバ２００，２００ａ，２００ｂは、振分サーバ１００，１００ａ，１００ｂにより振り分けられたパケットを受け付け、ネットワーク１０に転送するサーバコンピュータである。中継サーバ２００，２００ａ，２００ｂのパケットの転送処理の能力はほぼ同じである。中継サーバ２００，２００ａ，２００ｂから宛先の業務サーバ（業務サーバ３００，３００ａ，３００ｂ，・・・，３００ｍの何れか）へのルーティングは、ＩＰなどを用いて行われる。例えば、中継サーバ２００，２００ａ，２００ｂは、各々が保持するルーティングテーブルに従ってネットワーク１０に属するネクストホップにパケットを転送する。中継サーバ２００，２００ａ，２００ｂは、１つの仮想的なルータ（仮想ルータ）を形成しているということもできる。中継サーバ２００，２００ａ，２００ｂは、第１の実施の形態のノード２，３，４の一例である。
【００４２】
第２の実施の形態の情報処理システムでは、各クライアントからのアクセスを受け付けるエッジに振分サーバ１００，１００ａ，１００ｂを設けている。そして、振分サーバ１００，１００ａ，１００ｂによる負荷分散によって、パケットの宛先ＩＰアドレス毎にＥＣＭＰ（Equal Cost Multi Path）ルーティングの実現を図る。ＥＣＭＰルーティングは、送信元装置と宛先装置との間に複数のパスを設け、各パスを均等に用いて、パケットを転送する手法である。
【００４３】
業務サーバ３００，３００ａ，３００ｂ，・・・，３００ｍは、所定の業務サービスをクライアント５００，５００ａ，５００ｂ，・・・，５００ｎに提供するサーバコンピュータである。業務サービスは、例えば、ＤＮＳ（Domain Name System）による名前解決サービスである。ＤＮＳはＵＤＰを用いる。ただし、業務サービスは、例えばＴＣＰを用いるＷｅｂサービスなどでもよい。業務サーバ３００，３００ａ，３００ｂ，・・・，３００ｍは、第１の実施の形態の宛先装置５，６，７の一例である。
【００４４】
ＳＷ４００は、振分サーバ１００，１００ａ，１００ｂおよび中継サーバ２００，２００ａ，２００ｂの接続を集約するスイッチ装置である。
クライアント５００，５００ａ，５００ｂ，・・・，５００ｎは、ユーザにより利用されるクライアントコンピュータである。クライアント５００，５００ａ，５００ｂ，・・・，５００ｎは、第１の実施の形態の端末装置８，９の一例である。
【００４５】
ここで、ネットワーク機能をサーバコンピュータ上のソフトウェアによって実現するＮＦＶ（Network Functions Virtualization）技術が知られている。例えば、ＮＦＶ技術を利用することで、低コスト化や運用に応じた柔軟な導入を可能とするなどのメリットがある。また、このようなサーバを複数設け（例えば、中継サーバ２００，２００ａ，２００ｂ）、データ転送処理を分散して実行することで、データ転送の処理性能を向上させることができる。このとき、中継サーバ２００，２００ａ，２００ｂにデータを振り分ける振分サーバも複数設けることで（例えば、振分サーバ１００，１００ａ，１００ｂ）、データ振分の処理性能を向上させることができる。
【００４６】
第２の実施の形態の例では、振分サーバ１００，１００ａ，１００ｂは、パケットの宛先ＩＰアドレス毎に、ラウンドロビンにより、パケットの振分先（転送先）の中継サーバを選択する。ただし、この手法では、あるタイミングにおいて、複数の宛先ＩＰアドレスのパケットに対して同じ中継サーバが振分先として選択され、特定の中継サーバにトラフィックが集中する可能性がある。このようなトラフィックの集中は、通信の遅延の要因になる。そこで、振分サーバ１００，１００ａ，１００ｂは、トラフィックの集中を抑えるため、振分先として選択される中継サーバの偏りを抑える機能を提供する。
【００４７】
図３は、第２の実施の形態の振分サーバのハードウェア例を示す図である。振分サーバ１００は、プロセッサ１０１、ＲＡＭ１０２、ＨＤＤ１０３、画像信号処理部１０４、入力信号処理部１０５、媒体リーダ１０６および通信インタフェース１０７を有する。各ハードウェアは振分サーバ１００のバスに接続されている。
【００４８】
プロセッサ１０１は、振分サーバ１００の情報処理を制御するハードウェアである。プロセッサ１０１は、マルチプロセッサであってもよい。プロセッサ１０１は、例えばＣＰＵ、ＤＳＰ、ＡＳＩＣまたはＦＰＧＡなどである。プロセッサ１０１は、ＣＰＵ、ＤＳＰ、ＡＳＩＣ、ＦＰＧＡなどのうちの２以上の要素の組み合わせであってもよい。
【００４９】
ＲＡＭ１０２は、振分サーバ１００の主記憶装置である。ＲＡＭ１０２は、プロセッサ１０１に実行させるＯＳ（Operating System）のプログラムやアプリケーションプログラムの少なくとも一部を一時的に記憶する。また、ＲＡＭ１０２は、プロセッサ１０１による処理に用いる各種データを記憶する。
【００５０】
ＨＤＤ１０３は、振分サーバ１００の補助記憶装置である。ＨＤＤ１０３は、内蔵した磁気ディスクに対して、磁気的にデータの書き込みおよび読み出しを行う。ＨＤＤ１０３は、ＯＳのプログラム、アプリケーションプログラム、および各種データを記憶する。振分サーバ１００は、フラッシュメモリやＳＳＤ（Solid State Drive）などの他の種類の補助記憶装置を備えてもよく、複数の補助記憶装置を備えてもよい。
【００５１】
画像信号処理部１０４は、プロセッサ１０１からの命令に従って、振分サーバ１００に接続されたディスプレイ１１に画像を出力する。ディスプレイ１１として、ＣＲＴ（Cathode Ray Tube）ディスプレイや液晶ディスプレイなどを用いることができる。
【００５２】
入力信号処理部１０５は、振分サーバ１００に接続された入力デバイス１２から入力信号を取得し、プロセッサ１０１に出力する。入力デバイス１２として、例えば、マウスやタッチパネルなどのポインティングデバイス、キーボードなどを用いることができる。
【００５３】
媒体リーダ１０６は、記録媒体１３に記録されたプログラムやデータを読み取る装置である。記録媒体１３として、例えば、フレキシブルディスク（ＦＤ：Flexible Disk）やＨＤＤなどの磁気ディスク、ＣＤ（Compact Disc）やＤＶＤ（Digital Versatile Disc）などの光ディスク、光磁気ディスク（ＭＯ：Magneto-Optical disk）を使用できる。また、記録媒体１３として、例えば、フラッシュメモリカードなどの不揮発性の半導体メモリを使用することもできる。媒体リーダ１０６は、例えば、プロセッサ１０１からの命令に従って、記録媒体１３から読み取ったプログラムやデータをＲＡＭ１０２またはＨＤＤ１０３に格納する。
【００５４】
通信インタフェース１０７は、ネットワーク１０を介して他の装置と通信を行う。通信インタフェース１０７は、有線通信インタフェースでもよいし、無線通信インタフェースでもよい。
【００５５】
振分サーバ１００ａ，１００ｂ、中継サーバ２００，２００ａ，２００ｂ、業務サーバ３００，３００ａ，３００ｂ，・・・，３００ｍおよびクライアント５００，５００ａ，５００ｂ，・・・，５００ｎも、振分サーバ１００と同様のハードウェアを用いて実現できる。
【００５６】
図４は、第２の実施の形態の振分サーバの機能例を示す図である。振分サーバ１００は、記憶部１１０、識別部１２０、偏り判定部１３０および振分決定部１４０を有する。例えば、記憶部１１０は、ＲＡＭ１０２またはＨＤＤ１０３に確保された記憶領域を用いて実現される。例えば、プロセッサ１０１は、ＲＡＭ１０２に記憶されたプログラムを実行することで、識別部１２０、偏り判定部１３０および振分決定部１４０の機能を発揮する。
【００５７】
記憶部１１０は、パケットの転送制御に用いられる制御情報を記憶する。制御情報は、ラウンドロビンによる宛先毎の振分先を管理するためのラウンドロビンテーブルと、中継サーバが振分先として選択された回数に関するカウンタとを含む。カウンタは、中継サーバ２００，２００ａ，２００ｂそれぞれに対して設けられる。カウンタは、振分先として選択されなかった回数のカウントに用いられる。
【００５８】
識別部１２０は、クライアント５００，５００ａ，５００ｂ，・・・，５００ｎにより送信されたパケットを受け付け、パケットのヘッダ情報を参照して、パケットの宛先（宛先ＩＰアドレス）を識別する。
【００５９】
偏り判定部１３０は、記憶部１１０に記憶された中継サーバ毎のカウンタを参照して、振分先の選択に偏りがあるか否かを判定する。具体的には、偏り判定部１３０は、中継サーバ毎のカウンタの値と、所定の偏り閾値とを比較する。そして、偏り判定部１３０は、少なくとも１つ中継サーバに対応するカウンタの値が、偏り閾値以上である場合に、振分先の選択に偏りがあると判定する。偏り判定部１３０は、全ての中継サーバに対応するカウンタの値が偏り閾値未満である場合に、振分先の選択に偏りがないと判定する。
【００６０】
振分決定部１４０は、偏り判定部１３０により偏りがないと判定された場合、記憶部１１０に記憶されたラウンドロビンテーブルに基づいて、識別部１２０により識別された宛先ＩＰアドレスに対する振分先を決定する。振分決定部１４０は、決定した振分先の中継ノードにパケットを転送する。
【００６１】
一方、振分決定部１４０は、偏り判定部１３０により偏りがあると判定された場合、記憶部１１０に記憶されたカウンタの値に基づいて、パケットの振分先を決定する。振分決定部１４０は、決定した振分先の中継ノードにパケットを転送する。
【００６２】
図５は、第２の実施の形態のパケットの例を示す図である。パケットＰ１は、ペイロードｆ１、ＴＣＰ／ＵＤＰヘッダｆ２、ＩＰヘッダｆ３およびＭＡＣヘッダｆ４を含む。ペイロードｆ１には、送信対象のデータの本体が登録される。ＴＣＰ／ＵＤＰヘッダｆ２には、ＴＣＰやＵＤＰのヘッダ情報が登録される。ＩＰヘッダｆ３には、ＩＰのヘッダ情報が登録される。ＩＰヘッダｆ３には、宛先ＩＰアドレス（Ｄ−ＩＰ：Destination - IP address）が含まれる。ＭＡＣヘッダｆ４には、イーサネットのヘッダ情報が登録される。ＭＡＣヘッダｆ４には、宛先ＭＡＣアドレス（Ｄ−ＭＡＣ：Destination - MAC address）が含まれる。
【００６３】
例えば、振分決定部１４０は、パケットＰ１に含まれる宛先ＭＡＣアドレスを、振分先の中継サーバのＭＡＣアドレスに書き換えることで、ＳＷ４００に対してパケットＰ１の振分先の中継サーバを指定する。ＳＷ４００は、振分サーバ１００からパケットＰ１を受信すると、該当の宛先ＭＡＣアドレスに対応するポート（指定された中継サーバが接続されているポートに相当）からパケットＰ１を送出する。
【００６４】
なお、ペイロードｆ１、ＴＣＰ／ＵＤＰヘッダｆ２およびＩＰヘッダｆ３を含み、ＭＡＣヘッダｆ４を含まない、レイヤ３のＰＤＵ（Protocol Data Unit）は、「ＩＰパケット」と呼ばれることもある。この場合、ＭＡＣヘッダｆ４を含むレイヤ２のＰＤＵは、「フレーム」と呼ばれることもある（パケットＰ１は「フレーム」と呼ばれてもよい）。
【００６５】
図６は、第２の実施の形態のラウンドロビンテーブルの例を示す図である。ラウンドロビンテーブル１１１は、記憶部１１０に格納される。ラウンドロビンテーブル１１１は、宛先＃およびＳｖｒ（Server）＃の項目を含む。
【００６６】
宛先＃の項目には、業務サーバの識別情報が登録される。Ｓｖｒ＃の項目には、今回振分先として選択された中継サーバの識別情報が登録される。
業務サーバの識別情報は、業務サーバのＩＰアドレスに対応付けられる。ラウンドロビンテーブル１１１の例では、業務サーバの識別情報として、“Ａ”、“Ｂ”、“Ｃ”、“Ｄ”、“Ｅ”、“Ｆ”、“Ｇ”、“Ｈ”が示されている。
【００６７】
また、中継サーバ２００の識別情報は“１”である。中継サーバ２００を指す場合に、“Ｓｖｒ１”と表記することがある。中継サーバ２００ａの識別情報は“２”である。中継サーバ２００ａを指す場合に、“Ｓｖｒ２”と表記することがある。中継サーバ２００ｂの識別情報は“３”である。中継サーバ２００ｂを指す場合に、“Ｓｖｒ３”と表記することがある。
【００６８】
ここで、ラウンドロビンテーブル１１１では、ラウンドロビンのルールにより、中継サーバ２００，２００ａ，２００ｂが順番に選択されることが分かり易いよう、宛先＃毎に、Ｓｖｒ＃を“１  −＞  ２  −＞  ３”と表記している。その上で、今回選択された中継サーバの識別情報を点線の丸印で囲うことで、Ｓｖｒ＃の項目の設定値を表している。なお、Ｓｖｒ＃“３”の次は、Ｓｖｒ＃“１”に戻る。
【００６９】
例えば、ラウンドロビンテーブル１１１には、宛先＃が“Ａ”、Ｓｖｒ＃が“１”というレコードが登録されている。このレコードは、宛先Ａのパケットに対し、最新の振分先として、中継サーバ２００が選択されたことを示す。これは、宛先Ａのパケットに対して、次回の振分先を、中継サーバ２００ａとすることを示す。
【００７０】
また、例えば、ラウンドロビンテーブル１１１には、宛先＃が“Ｂ”、Ｓｖｒ＃が“２”というレコードが登録されている。このレコードは、宛先Ｂのパケットに対し、最新の振分先として、中継サーバ２００ａが選択されたことを示す。これは、宛先Ｂのパケットに対して、次回の振分先を、中継サーバ２００ｂとすることを示す。
【００７１】
また、例えば、ラウンドロビンテーブル１１１には、宛先＃が“Ｃ”、Ｓｖｒ＃が“３”というレコードが登録されている。このレコードは、宛先Ｃのパケットに対し、最新の振分先として、中継サーバ２００ｂが選択されたことを示す。これは、宛先Ｃのパケットに対して、次回の振分先を、中継サーバ２００とすることを示す。
【００７２】
更に、ラウンドロビンテーブル１１１には、他の宛先＃に対しても同様に、振分先の最新の選択結果を示すレコードが登録されている。
図７は、第２の実施の形態のアンセレクトカウンタの例を示す図である。アンセレクトカウンタ（ＵＳＣ：UnSelectCounter）１１２は、記憶部１１０に格納される。ＵＳＣ１１２は、Ｓｖｒ１、Ｓｖｒ２およびＳｖｒ３の項目を含む。
【００７３】
Ｓｖｒ１の項目には、中継サーバ２００に対応するカウント値が登録される。Ｓｖｒ２の項目には、中継サーバ２００ａに対応するカウント値が登録される。Ｓｖｒ３の項目には、中継サーバ２００ｂに対応するカウント値が登録される。
【００７４】
例えば、ＵＳＣ１１２には、Ｓｖｒ１に対して“−１”、Ｓｖｒ２に対して“−１”、Ｓｖｒ３に対して“２”という数値が登録されている。これは、あるタイミングにおける中継サーバ２００に対応するカウント値が“−１”であり、中継サーバ２００ａに対応するカウント値が“−１”であり、中継サーバ２００ｂに対応するカウント値が“２”であることを示す。
【００７５】
図８は、第２の実施の形態のＵＳＣ更新ルールの例を示す図である。ＵＳＣ更新ルール１１３は、記憶部１１０に予め格納される。ＵＳＣ更新ルール１１３は、区分および加算値の項目を含む。
【００７６】
区分の項目には、振分先として選択されたこと（“選択”と表記する）、または、選択されなかったこと（“非選択”と表記する）を示す区分が登録される。加算値の項目には、区分に応じたＵＳＣ１１２の加算値が登録される。
【００７７】
例えば、ＵＳＣ更新ルール１１３には、区分が“非選択”、加算値が“＋１”というレコードが登録されている。このレコードは、振分先として選択されなかった場合に、ＵＳＣ１１２における該当の中継サーバのカウント値に、加算値“＋１”を加算することを示す。
【００７８】
また、例えば、ＵＳＣ更新ルール１１３には、区分が“選択”、加算値が“−（Ｘ−１）”というレコードが登録されている。このレコードは、振分先として選択された場合に、ＵＳＣ１１２における該当の中継サーバのカウント値に、加算値“−（Ｘ−１）”を加算することを示す。これは、「当該カウント値から“（Ｘ−１）”を減算する」ことに相当する。ここで、Ｘは、パケットの振分先の候補となる中継サーバの数である。第２の実施の形態の例では、Ｘ＝３である。
【００７９】
例えば、ＵＳＣ１１２において、Ｓｖｒ１、Ｓｖｒ２およびＳｖｒ３の各カウント値が何れも“０”であるときに、振分決定部１４０が中継サーバ２００に、あるパケットを振り分けた場合を考える。この場合、中継サーバ２００は、振分先として選択されたことになる（中継サーバ２００は“選択”に区分される）。一方、中継サーバ２００ａ，２００ｂが振分先として選択されなかったことになる（中継サーバ２００ａ，２００ｂは“非選択”に区分される）。
【００８０】
このため、振分決定部１４０は、ＵＳＣ更新ルール１１３に従って、ＵＳＣ１１２におけるＳｖｒ１のカウント値から“３−１＝２”を減算する。同様に、振分決定部１４０は、ＵＳＣ１１２におけるＳｖｒ２のカウント値に“＋１”を加算する。同様に、振分決定部１４０は、ＵＳＣ１１２におけるＳｖｒ３のカウント値に“＋１”を加算する。
【００８１】
ただし、ＵＳＣ更新ルール１１３で例示した加算値および減算値は一例であり、上記以外の値としてもよい。
次に、振分サーバ１００，１００ａ，１００ｂの処理手順を説明する。以下では、主に振分サーバ１００の手順を説明するが、振分サーバ１００ａ，１００ｂも同様の手順を実行する。
【００８２】
図９は、第２の実施の形態のパケット転送例を示すフローチャートである。以下、図９に示す処理をステップ番号に沿って説明する。
（Ｓ１１）識別部１２０は、何れかのクライアントにより送信されたパケットＰ１を受信する。識別部１２０は、パケットＰ１のＩＰヘッダｆ３を参照して、パケットＰ１の宛先ＩＰアドレスに対応する業務サーバの識別情報を特定する。
【００８３】
（Ｓ１２）偏り判定部１３０は、記憶部１１０に記憶されたＵＳＣ１１２を参照して、ＵＳＣ１１２のカウント値が、偏り閾値以上の中継サーバがあるか否かを判定する。ＵＳＣ１１２のカウント値が、偏り閾値以上の中継サーバがある場合、偏り判定部１３０は、ステップＳ１３に処理を進める。ＵＳＣ１１２のカウント値が、偏り閾値以上の中継サーバがない場合、偏り判定部１３０は、ステップＳ１４に処理を進める。
【００８４】
（Ｓ１３）振分決定部１４０は、ステップＳ１２でＵＳＣ１１２のカウント値が偏り閾値以上であると判定された中継サーバを振分先に決定する。そして、振分決定部１４０は、ステップＳ１５に処理を進める。
【００８５】
（Ｓ１４）振分決定部１４０は、記憶部１１０に記憶されたラウンドロビンテーブル１１１を参照して、ステップＳ１１で特定された業務サーバの識別情報に対して、振分先の中継サーバを決定する。
【００８６】
（Ｓ１５）振分決定部１４０は、ＵＳＣ１１２を更新する。具体的には、振分決定部１４０は、記憶部１１０に記憶されたＵＳＣ更新ルール１１３に従って、ＵＳＣ１１２における各中継サーバのカウント値を更新する。第２の実施の形態の例では、振分決定部１４０は、今回振分先として選択された中継サーバのカウント値を“２”減らし、今回振分先として選択されなかった中継サーバのカウント値を“１”増やす。
【００８７】
（Ｓ１６）振分決定部１４０は、ラウンドロビンテーブル１１１を更新する。具体的には、振分決定部１４０は、ステップＳ１１で特定された業務サーバの識別情報に対して、今回選択した振分先の中継サーバの識別情報を、ラウンドロビンテーブル１１１に登録する。
【００８８】
（Ｓ１７）振分決定部１４０は、ステップＳ１３またはステップＳ１４により振分先として決定した中継サーバに、受信したパケットＰ１を転送する。
図１０は、第２の実施の形態の転送先振替の具体例を示す図である。一例として、宛先＃がそれぞれ“Ａ”、“Ｂ”、“Ｃ”、“Ｄ”、“Ｅ”、“Ｆ”、“Ｇ”、“Ｈ”である複数のパケットが、この順番で振分サーバ１００に到着したとする。
【００８９】
なお、宛先＃が“Ａ”であるパケットが到着する前のＵＳＣ１１２の各中継サーバのカウント値は、全て“０”であるとする。また、図１０のＵＳＣ１１２は、振分サーバ１００により各パケットが転送されるたびに更新される（上側から下側へ向かう方向が更新によりカウント値が推移する方向である）。更に、一例として偏り閾値は“４”であるとする。
【００９０】
まず、振分サーバ１００は、宛先＃“Ａ”のパケットを受信する。振分サーバ１００は、ＵＳＣ１１２を参照して、偏り閾値“４”に達したカウント値がないことを確認する。このため、振分サーバ１００は、ラウンドロビンテーブル１１１を参照して、宛先＃“Ａ”のパケットを、中継サーバ２００（Ｓｖｒ１）に振り分ける。振分サーバ１００は、ＵＳＣ１１２における中継サーバ２００のカウント値を“０−２＝−２”に更新する。振分サーバ１００は、ＵＳＣ１１２における中継サーバ２００ａのカウント値を“０＋１＝１”に更新する。振分サーバ１００は、ＵＳＣ１１２における中継サーバ２００ｂのカウント値を“０＋１＝１”に更新する。
【００９１】
次に、振分サーバ１００は、宛先＃“Ｂ”のパケットを受信する。振分サーバ１００は、ＵＳＣ１１２を参照して、偏り閾値“４”に達したカウント値がないことを確認する。このため、振分サーバ１００は、ラウンドロビンテーブル１１１を参照して、宛先＃“Ｂ”のパケットを、中継サーバ２００ａ（Ｓｖｒ２）に振り分ける。振分サーバ１００は、ＵＳＣ１１２における中継サーバ２００のカウント値を“−２＋１＝−１”に更新する。振分サーバ１００は、ＵＳＣ１１２における中継サーバ２００ａのカウント値を“１−２＝−１”に更新する。振分サーバ１００は、ＵＳＣ１１２における中継サーバ２００ｂのカウント値を“１＋１＝２”に更新する。
【００９２】
次に、振分サーバ１００は、宛先＃“Ｃ”のパケットを受信する。振分サーバ１００は、ＵＳＣ１１２を参照して、偏り閾値“４”に達したカウント値がないことを確認する。このため、振分サーバ１００は、ラウンドロビンテーブル１１１を参照して、宛先＃“Ｃ”のパケットを、中継サーバ２００ｂ（Ｓｖｒ３）に振り分ける。振分サーバ１００は、ＵＳＣ１１２における中継サーバ２００のカウント値を“−１＋１＝０”に更新する。振分サーバ１００は、ＵＳＣ１１２における中継サーバ２００ａのカウント値を“−１＋１＝０”に更新する。振分サーバ１００は、ＵＳＣ１１２における中継サーバ２００ｂのカウント値を“２−２＝０”に更新する。
【００９３】
次に、振分サーバ１００は、宛先＃“Ｄ”のパケットを受信する。振分サーバ１００は、ＵＳＣ１１２を参照して、偏り閾値“４”に達したカウント値がないことを確認する。このため、振分サーバ１００は、ラウンドロビンテーブル１１１を参照して、宛先＃“Ｄ”のパケットを、中継サーバ２００（Ｓｖｒ１）に振り分ける。振分サーバ１００は、ＵＳＣ１１２における中継サーバ２００のカウント値を“０−２＝−２”に更新する。振分サーバ１００は、ＵＳＣ１１２における中継サーバ２００ａのカウント値を“０＋１＝１”に更新する。振分サーバ１００は、ＵＳＣ１１２における中継サーバ２００ｂのカウント値を“０＋１＝１”に更新する。
【００９４】
次に、振分サーバ１００は、宛先＃“Ｅ”のパケットを受信する。振分サーバ１００は、ＵＳＣ１１２を参照して、偏り閾値“４”に達したカウント値がないことを確認する。このため、振分サーバ１００は、ラウンドロビンテーブル１１１を参照して、宛先＃“Ｅ”のパケットを、中継サーバ２００ａ（Ｓｖｒ２）に振り分ける。振分サーバ１００は、ＵＳＣ１１２における中継サーバ２００のカウント値を“−２＋１＝−１”に更新する。振分サーバ１００は、ＵＳＣ１１２における中継サーバ２００ａのカウント値を“１−２＝−１”に更新する。振分サーバ１００は、ＵＳＣ１１２における中継サーバ２００ｂのカウント値を“１＋１＝２”に更新する。
【００９５】
次に、振分サーバ１００は、宛先＃“Ｆ”のパケットを受信する。振分サーバ１００は、ＵＳＣ１１２を参照して、偏り閾値“４”に達したカウント値がないことを確認する。このため、振分サーバ１００は、ラウンドロビンテーブル１１１を参照して、宛先＃“Ｆ”のパケットを、中継サーバ２００（Ｓｖｒ１）に振り分ける。振分サーバ１００は、ＵＳＣ１１２における中継サーバ２００のカウント値を“−１−２＝−３”に更新する。振分サーバ１００は、ＵＳＣ１１２における中継サーバ２００ａのカウント値を“−１＋１＝０”に更新する。振分サーバ１００は、ＵＳＣ１１２における中継サーバ２００ｂのカウント値を“２＋１＝３”に更新する。
【００９６】
次に、振分サーバ１００は、宛先＃“Ｇ”のパケットを受信する。振分サーバ１００は、ＵＳＣ１１２を参照して、偏り閾値“４”に達したカウント値がないことを確認する。このため、振分サーバ１００は、ラウンドロビンテーブル１１１を参照して、宛先＃“Ｇ”のパケットを、中継サーバ２００ａ（Ｓｖｒ２）に振り分ける。振分サーバ１００は、ＵＳＣ１１２における中継サーバ２００のカウント値を“−３＋１＝−２”に更新する。振分サーバ１００は、ＵＳＣ１１２における中継サーバ２００ａのカウント値を“０−２＝−２”に更新する。振分サーバ１００は、ＵＳＣ１１２における中継サーバ２００ｂのカウント値を“３＋１＝４”に更新する。
【００９７】
次に、振分サーバ１００は、宛先＃“Ｈ”のパケットを受信する。振分サーバ１００は、ＵＳＣ１１２を参照して、中継サーバ２００ｂのカウント値“４”が、偏り閾値“４”に等しいことを検出する。このため、振分サーバ１００は、ラウンドロビンテーブル１１１を用いずに、宛先＃“Ｈ”のパケットを、中継サーバ２００ｂ（Ｓｖｒ３）に振り分ける。振分サーバ１００は、ＵＳＣ１１２における中継サーバ２００のカウント値を“−２＋１＝−１”に更新する。振分サーバ１００は、ＵＳＣ１１２における中継サーバ２００ａのカウント値を“−２＋１＝−１”に更新する。振分サーバ１００は、ＵＳＣ１１２における中継サーバ２００ｂのカウント値を“４−２＝２”に更新する。
【００９８】
ここで、宛先＃“Ｈ”の今回のパケットについて、ラウンドロビンテーブル１１１による振分先が、中継サーバ２００（“Ｓｖｒ１”）であるとする。そうすると、振分サーバ１００は、宛先＃“Ｈ”のパケットの振分先を、ラウンドロビンテーブル１１１を基に決められる中継サーバ２００から、ＵＳＣ１１２を基に決められる中継サーバ２００ｂに振り替えたことになる。
【００９９】
このように、振分サーバ１００は、パケットの転送先として選択された中継サーバのＵＳＣ１１２のカウント値をカウントダウンし、選択されなかった中継サーバのＵＳＣ１１２のカウント値をカウントアップする。このため、振分サーバ１００は、ＵＳＣ１１２に基づいて、転送先として選択された回数が相対的に少ないノードを効率的に特定できる。振分サーバ１００は、中継サーバ２００ｂのカウント値が、偏り閾値以上になったことを検出することで、パケットの転送先の選択に偏りが発生していると判断できる。なぜなら、中継サーバ２００ｂが選択されなかった回数が相対的に多いということは、中継サーバ２００，２００ａの両方あるいは何れか一方が選択された回数が相対的に多いと推定されるからである。更に、選択されなかった回数が相対的に多い中継サーバ２００ｂは、振り分けられたトラフィック量も中継サーバ２００，２００ａに比べて少ないと考えられる。このため、ＳＷ４００の中継サーバ２００ｂと接続するインタフェースのリソース（例えば、転送待ちパケットを格納するバッファ）や、中継サーバ２００ｂのリソースにも比較的余裕があると考えられる。したがって、振分サーバ１００は、中継サーバ２００，２００ａ，２００ｂに、ある程度均等にデータを振り分けようとする場合、中継サーバ２００ｂを優先的に選択した方がよいと判断できる。
【０１００】
このように、振分サーバ１００は、中継サーバの選択に偏りが発生していること、および、偏りを補正するために転送先として選択すべき中継サーバの両方をＵＳＣ１１２によって効率的に判定できる。こうして、中継サーバの選択の偏りを省演算量で補正可能になる。その結果、振分サーバ１００のデータ転送に伴う演算を高速化でき、クライアント５００，５００ａ，５００ｂ，・・・，５００ｎと、業務サーバ３００，３００ａ，３００ｂ，・・・，３００ｍとの間の通信の遅延の低減に寄与する。
【０１０１】
図１１は、第２の実施の形態に対する比較例（その１）を示す図である。図１１では、振分サーバ６００，６００ａ，６００ｂおよび中継サーバ７００，７００ａ，・・・，７００ｍが、ＳＷ４００に接続された例を示している。ただし、図１１中、「中継サーバ」については、中継サーバ７００，７００ａ，・・・，７００ｍそれぞれの識別情報“Ｓｖｒ１”，“Ｓｖｒ２”，・・・，“Ｓｖｒ１０”を表記している（以下でも、同様に表記することがある）。
【０１０２】
振分サーバ６００，６００ａ，６００ｂは、それぞれラウンドロビンテーブル６０１，６０１ａ，６０１ｂを用いて、パケットの振分先を決定するが、ＵＳＣ１１２に相当する情報を保持しない点が、振分サーバ１００，１００ａ，１００ｂと異なる。
【０１０３】
例えば、振分サーバ６００が、ラウンドロビンテーブル６０１を用いて、パケットの振分先を決定するとき、宛先毎の振分先が同期することがある。図１１の例では、各宛先に対するパケットの振分先が中継サーバ７００（Ｓｖｒ１）に偏っている。このように、振分サーバ６００単体の動作において、特定の中継サーバ７００にトラフィックを集中させてしまうことがある。
【０１０４】
更に、振分サーバ６００，６００ａ，６００ｂそれぞれによる振分先が同期することもある。図１１の例では、振分サーバ６００ａ，６００ｂによる各宛先に対するパケットの振分先も中継サーバ７００（Ｓｖｒ１）に偏っている。このように、バースト的に中継サーバ７００にトラフィックが集中することがある。
【０１０５】
この場合、ＳＷ４００が備える通信インタフェースのうち、中継サーバ７００と通信する通信インタフェースの負荷が特に過大になる。すると、当該通信インタフェースが備えるバッファを用いた転送待ち合わせによる遅延が増大したり、バッファあふれによるパケット廃棄が発生したりする。
【０１０６】
これに対して、宛先毎にラウンドロビンを行わない方法も考えられる。例えば、宛先に拘わらず、パケットの到着順にラウンドロビンで、当該パケットを振り分けることも考えられる。
【０１０７】
図１２は、第２の実施の形態に対する比較例（その２）を示す図である。振分サーバ６１０，６１０ａ，６１０ｂそれぞれは、パケットの宛先を区別せずに、パケットの到着順で、パケットの振分先をラウンドロビンにより決定する点が、振分サーバ６００，６００ａ，６００ｂと異なる。この場合、振分サーバ６１０，６１０ａ，６１０ｂの次段の中継サーバ７００，７００ａ，７００ｂ，・・・，７００ｍに対するバースト的なトラフィック集中は改善される。一方、宛先毎のＥＣＭＰを行えなくなるため、仮想ルータ（中継サーバの集合）によるホップを複数段重ねると、特定の宛先のパケットが、特定の中継サーバを経由するルートに偏る可能性がある。
【０１０８】
例えば、図１２の例では、３つの仮想ルータが示されている。第１の仮想ルータは、中継サーバ７００，７００ａ，７００ｂ，・・・，７００ｍが属する中継サーバの集合である。第２の仮想ルータは、中継サーバ８００，８００ａ，８００ｂ，・・・，８００ｍが属する中継サーバの集合である。第３の仮想ルータは、中継サーバ９００，９００ａ，９００ｂ，・・・，９００ｍが属する中継サーバの集合である。中継サーバの識別情報は、１つの仮想ルータ内において一意であり、それぞれの仮想ルータが、“Ｓｖｒ１”，“Ｓｖｒ２”，“Ｓｖｒ３”，・・・，“Ｓｖｒ１０”という識別情報が付与された中継サーバを含む。そして、ある中継サーバは、自身と同じ識別情報をもつ後段の中継サーバにパケットを転送するものとする。第３の仮想ルータは、第１の仮想ルータおよび第２の仮想ルータの後段の仮想ルータである。
【０１０９】
この場合に、図１２の比較例の方法では、宛先毎のＥＣＭＰを行えないために、特定の宛先のパケットの転送経路が、例えば、中継サーバ９００を経由するルートに偏る可能性がある。そうすると、中継サーバ９００の負荷が高まったり、中継サーバ９００で障害などが発生したりしたときに、該当の宛先を対象とした通信への影響が過大になる。このように、宛先毎にＥＣＭＰを行えなくなることは好ましくない。
【０１１０】
一方、第２の実施の形態の振分サーバ１００，１００ａ，１００ｂによれば、個々の振分サーバ１００，１００ａ，１００ｂが振分先の偏りを是正するので、図１１で例示した特定の中継サーバに対するバースト的なトラフィックの集中の発生を抑えられる。なおかつ、振分サーバ１００，１００ａ，１００ｂは、宛先毎にラウンドロビンを行うことで、宛先毎にＥＣＭＰを実現でき、図１２で例示した宛先毎のパケットの転送経路の偏りを抑えられる。
【０１１１】
また、振分先の選択の偏りを検出するために、振分サーバ１００，１００ａ，１００ｂそれぞれは他のサーバと通信しなくてよい。すなわち、振分サーバ１００，１００ａ，１００ｂは、それぞれが単体で振分先の偏りを検出できる。
【０１１２】
なお、第２の実施の形態では、振分先を等確率で選択するルールとして、ラウンドロビンを例示したが、他の方法でもよい。例えば、振分決定部１４０は、乱数を用いた所定の演算により、振分先を決定することも考えられる。
【０１１３】
また、第２の実施の形態では、振分サーバ１００，１００ａ，１００ｂおよび中継サーバ２００，２００ａ，２００ｂを物理的なコンピュータ（物理マシン）により実現するものとした。これに対し、振分サーバ１００，１００ａ，１００ｂおよび中継サーバ２００，２００ａ，２００ｂの両方または何れか一方を、物理マシン上で動作する仮想的なコンピュータ（仮想マシン）により実現してもよい。
【０１１４】
［第３の実施の形態］
以下、第３の実施の形態を説明する。前述の第２の実施の形態と相違する事項を主に説明し、共通する事項の説明を省略する。
【０１１５】
ここで、第３の実施の形態の情報処理システムおよびハードウェアは、図２，３で例示した第２の実施の形態の情報処理システムおよびハードウェアと同様である。第３の実施の形態の振分サーバの機能は、図４で例示した第２の実施の形態の振分サーバ１００の機能と同様である。このため、第３の実施の形態でも、第２の実施の形態と同じ名称および符号を用いて各要素を指し示すこととする。また、第３の実施の形態の情報処理システムで用いられる通信プロトコルは、第２の実施の形態で例示した通信プロトコルと同様である。
【０１１６】
ただし、第３の実施の形態では、業務サーバ３００，３００ａ，３００ｂ，・・・，３００ｍにより提供される業務サービスの内容が第２の実施の形態と異なる。具体的には、第３の実施の形態では、業務サーバ３００，３００ａ，３００ｂ，・・・，３００ｍは、ファイアウォールやプロキシといったステートフル（セッション状態を保持する通信形態）なネットワーク機能を提供する。この場合、あるクライアントとある業務サーバとの通信を中継する中継サーバは、１つの通信のセッションに対して一意に対応付けられる。そのため、第３の実施の形態では、振分サーバ１００の振分決定部１４０は、パケットのヘッダ情報を用いて算出されるハッシュ値を基に、当該パケットの振分先の中継サーバを決定する。この点が、第２の実施の形態と異なる。
【０１１７】
図１３は、第３の実施の形態のパケットの例を示す図である。パケットＰ１は、ペイロードｆ１、ＴＣＰ／ＵＤＰヘッダｆ２、ＩＰヘッダｆ３およびＭＡＣヘッダｆ４のフィールドを含む。ＴＣＰ／ＵＤＰヘッダｆ２は、宛先ポート番号（Ｄ−Ｐｏｒｔ：Destination Port）および送信元ポート番号（Ｓ−Ｐｏｒｔ：Source Port）を含む。ＩＰヘッダｆ３は、宛先ＩＰアドレス（Ｄ−ＩＰ）、送信元ＩＰアドレス（Ｓ−ＩＰ：Source IP address）およびプロトコル番号（Ｐｒｏｔｏｃｏｌ）を含む。
【０１１８】
宛先ポート番号、送信元ポート番号、宛先ＩＰアドレス、送信元ＩＰアドレスおよびプロトコル番号を総称して、５タプルと呼ぶこともある。また、５タプルは、フローの識別に用いられる情報であるともいえる。
【０１１９】
振分決定部１４０は、５タプルの値を用いたハッシュ演算を行う。振分決定部１４０は、ハッシュ演算により得られたハッシュ値を基に、パケットＰ１の振分先を決定する。例えば、求められるハッシュ値は、何れかの中継サーバの識別情報（識別番号）に一致していてもよい。その場合、振分決定部１４０は、求められたハッシュ値に対応する中継サーバを振分先として決定することができる。振分決定部１４０は、振分先の中継サーバのＭＡＣアドレスをＭＡＣヘッダｆ４のＤ−ＭＡＣ（図１３では図示を省略している）に設定してＳＷ４００に送信することで、該当の中継サーバにパケットＰ１を転送する。
【０１２０】
ここで、第３の実施の形態では、振分サーバ１００は、ラウンドロビンテーブル１１１に代えて、セッション管理テーブルを記憶する。セッション管理テーブルは、フローと、振分先の中継サーバとを管理するための情報である。
【０１２１】
図１４は、第３の実施の形態のセッション管理テーブルの例を示す図である。セッション管理テーブル１１４は、記憶部１１０に格納される。セッション管理テーブル１１４は、フロー＃、Ｓｖｒ＃およびフラグの項目を含む。
【０１２２】
フロー＃の項目には、フローの識別情報が登録される。フローの識別情報は、パケットのヘッダ情報における５タプルの値の組そのものを表す情報でもよいし、５タプルの値の組に対応付けられる所定の情報でもよい。Ｓｖｒ＃の項目には、該当のフローのパケットの振分先とする中継サーバの識別情報が登録される。フラグの項目には、該当のフローのパケットに対してＵＳＣ１１２による振分先の決定を行ったか否かを示すフラグが登録される。ＵＳＣ１１２による振分先の決定を行った場合、フラグは“Ｔｒｕｅ”である。ＵＳＣ１１２による振分先の決定を行っていない場合、フラグは“Ｆａｌｓｅ”である。
【０１２３】
例えば、セッション管理テーブル１１４には、フロー＃が“ａ”、Ｓｖｒ＃が“１”、フラグが“Ｆａｌｓｅ”というレコードが登録されている。これは、フロー＃“ａ”のフローの振分先が中継サーバ２００（Ｓｖｒ１）であり、当該振分先がパケットの５タプルのハッシュ値に基づいて決定されたものであることを示す。
【０１２４】
また、例えば、セッション管理テーブル１１４には、フロー＃が“ｈ”、Ｓｖｒ＃が“３”、フラグが“Ｔｒｕｅ”というレコードが登録されている。これは、フロー＃“ｈ”のフローの振分先が中継サーバ２００ｂ（Ｓｖｒ３）であり、当該振分先が、ＵＳＣ１１２に基づいて決定されたものであることを示す。
【０１２５】
セッション管理テーブル１１４には、他のフローについても、同様に、振分先の中継サーバの識別情報およびフラグが設定されている。
次に、第３の実施の形態の振分サーバ１００の処理手順を説明する（振分サーバ１００ａ，１００ｂも同様の手順を実行することができる）。
【０１２６】
図１５は、第３の実施の形態のパケット転送例を示すフローチャートである。以下、図１５に示す処理をステップ番号に沿って説明する。
（Ｓ２１）識別部１２０は、何れかのクライアントにより送信されたパケットＰ１を受信する。
【０１２７】
（Ｓ２２）識別部１２０は、パケットＰ１の５タプルの情報の組を基にフローを識別し、パケットＰ１に対するフローの識別情報（フロー＃）を取得する。また、識別部１２０は、５タプルの情報を用いたハッシュ演算を行い、ハッシュ値を計算する。
【０１２８】
（Ｓ２３）偏り判定部１３０は、記憶部１１０に記憶されたＵＳＣ１１２を参照して、ＵＳＣ１１２のカウント値が、偏り閾値以上の中継サーバがあるか否かを判定する。ＵＳＣ１１２のカウント値が、偏り閾値以上の中継サーバがある場合、偏り判定部１３０は、ステップＳ２４に処理を進める。ＵＳＣ１１２のカウント値が、偏り閾値以上の中継サーバがない場合、偏り判定部１３０は、ステップＳ２７に処理を進める。
【０１２９】
（Ｓ２４）振分決定部１４０は、今回のパケットＰ１が新規セッションのパケットであるか否かを判定する。新規セッションのパケットである場合、振分決定部１４０は、ステップＳ２５に処理を進める。新規セッションのパケットでない場合、振分決定部１４０は、ステップＳ２７に処理を進める。
【０１３０】
ここで、振分決定部１４０は、記憶部１１０に記憶されたセッション管理テーブル１１４を参照することで、ステップＳ２４の判定を行う。具体的には、振分決定部１４０は、ステップＳ２２で取得したフローの識別情報に対応するレコードがセッション管理テーブル１１４に登録済であるか否かを判定する。登録済である場合、振分決定部１４０は、新規セッションではない（すなわち、既存セッションである）と判定する。登録済でない場合、振分決定部１４０は、新規セッションであると判定する。
【０１３１】
（Ｓ２５）振分決定部１４０は、ステップＳ２３でＵＳＣ１１２のカウント値が偏り閾値以上であると判定された中継サーバを振分先に決定する。ステップＳ２５の処理は、振分先の振替を行うことに相当する。
【０１３２】
（Ｓ２６）振分決定部１４０は、今回取得したフローの識別情報に対応するフラグを“Ｔｒｕｅ”に設定する。そして、振分決定部１４０は、ステップＳ３０に処理を進める。
（Ｓ２７）振分決定部１４０は、セッション管理テーブル１１４を参照して、ステップＳ２２で取得したフローの識別情報に対応するレコードのフラグが“Ｔｒｕｅ”であるか否かを判定する。“Ｔｒｕｅ”である場合、振分決定部１４０は、ステップＳ２８に処理を進める。“Ｔｒｕｅ”でない場合、振分決定部１４０は、ステップＳ２９に処理を進める。なお、ステップＳ２３がＮｏであった場合、該当のフローの識別情報に対応するレコードがセッション管理テーブル１１４に未登録のこともある（今回のパケットＰ１が新規セッションのパケットの場合）。この場合、振分決定部１４０は、ステップＳ２７において“Ｔｒｕｅ”でないと判定する。
【０１３３】
（Ｓ２８）振分決定部１４０は、フラグに基づき振分先を決定する。具体的には、振分決定部１４０は、ステップＳ２７で参照したセッション管理テーブル１１４のレコードに設定されたＳｖｒ＃を取得する。振分決定部１４０は、当該Ｓｖｒ＃に対応する中継サーバを、今回のパケットＰ１の振分先に決定する。そして、振分決定部１４０は、ステップＳ３０に処理を進める。ステップＳ２８の処理は、振分先の振替を継続することに相当する。
【０１３４】
（Ｓ２９）振分決定部１４０は、ステップＳ２２で求めたハッシュ値に対応する中継サーバを、今回のパケットＰ１の振分先に決定する。
（Ｓ３０）振分決定部１４０は、ＵＳＣ１１２を更新する。具体的には、振分決定部１４０は、記憶部１１０に記憶されたＵＳＣ更新ルール１１３に従って、ＵＳＣ１１２における各中継サーバのカウント値を更新する。第３の実施の形態の例では、振分決定部１４０は、今回振分先として選択された中継サーバのカウント値を“２”減らし、今回振分先として選択されなかった中継サーバのカウント値を“１”増やす。
【０１３５】
（Ｓ３１）振分決定部１４０は、セッション管理テーブル１１４を更新する。具体的には、振分決定部１４０は、次の処理を行う。
今回のパケットＰ１に対してステップＳ２６を実行した場合、振分決定部１４０は、今回の新規セッションのフローに関するレコードをセッション管理テーブル１１４に追加する。追加されるレコードのフロー＃の設定値は、ステップＳ２２で取得されたフローの識別情報となる。当該レコードのＳｖｒ＃の設定値は、ステップＳ２５で決定された振分先の中継サーバの識別情報となる。当該レコードのフラグの設定値は“Ｔｒｕｅ”となる。
【０１３６】
今回のパケットＰ１に対してステップＳ２９を実行した場合、振分決定部１４０は、今回のフローに関するレコードをセッション管理テーブル１１４に登録する。このとき、振分決定部１４０は、（１）今回のフローに関するレコードを新たに追加するケースもあれば、（２）今回のフローに関する既存のレコードのＳｖｒ＃の設定値の更新を行うケースもある。
【０１３７】
（１）のケースは、ステップＳ２３  Ｎｏ、かつ、ステップＳ２７  Ｎｏ、かつ、今回のパケットＰ１が新規セッションのパケットである場合である。この場合、セッション管理テーブル１１４に追加されるレコードのフロー＃の設定値は、ステップＳ２２で取得されたフローの識別情報となる。当該レコードのＳｖｒ＃の設定値は、ステップＳ２９で決定された振分先の中継サーバの識別情報となる。当該レコードのフラグの設定値は“Ｆａｌｓｅ”となる。
【０１３８】
（２）のケースは、ステップＳ２３  Ｎｏ、かつ、ステップＳ２７  Ｎｏ、かつ、今回のパケットＰ１が新規セッションのパケットでない場合である。この場合、振分決定部１４０は、ステップＳ２２で取得されたフローの識別情報に対応するセッション管理テーブル１１４の既存のレコードにおいて、ステップＳ２９で決定された振分先の中継サーバの識別情報を、Ｓｖｒ＃に設定する。
【０１３９】
なお、今回のパケットＰ１に対してステップＳ２８を実行した場合、振分決定部１４０は、セッション管理テーブル１１４の更新を行わなくてよい。
（Ｓ３２）振分決定部１４０は、ステップＳ２５またはステップＳ２９により振分先として決定した中継サーバに、受信したパケットＰ１を転送する。
【０１４０】
更に、振分決定部１４０は、セッション管理テーブル１１４において、フラグ“Ｔｒｕｅ”が設定されたフローにおける通信のアイドル時間（該当のフローのパケットの送受信が行われていない時間）を監視し、転送先の振替を解除する処理も行う。
【０１４１】
図１６は、第３の実施の形態の転送先振替の解除例を示すフローチャートである。以下、図１６に示す処理をステップ番号に沿って説明する。
（Ｓ４１）振分決定部１４０は、記憶部１１０に記憶されたセッション管理テーブル１１４において、フラグ＝Ｔｒｕｅが設定されたフローに関する通信のアイドル時間を監視する。
【０１４２】
（Ｓ４２）振分決定部１４０は、該当のフローに関する通信のアイドル時間が所定時間に達したか否かを判定する。アイドル時間が所定時間に達した場合、振分決定部１４０は、ステップＳ４３に処理を進める。アイドル時間が所定時間に達していない場合、振分決定部１４０は、ステップＳ４１に処理を進める（監視を継続する）。ステップＳ４２の判定に用いられる所定時間の長さは、任意に定めることができる（例えば、１分でもよいし、数分程度でもよい）。
【０１４３】
（Ｓ４３）振分決定部１４０は、セッション管理テーブル１１４において、該当のフローに対するフラグを“Ｆａｌｓｅ”に設定する。
このように、振分決定部１４０は、特定のフローに対してハッシュ値によらずに振分先（転送先）の中継サーバを選択すると、所定期間、当該特定のフローに対応するパケットの振分先を、選択した中継サーバとする。これにより、ファイアウォールやプロキシなどのステートフルな業務サービスをクライアントに対して適切に提供可能になる。
【０１４４】
なお、図１６の例では、通信のアイドル時間を監視するものとしたが他の方法も考えられる。例えば、振分決定部１４０は、フラグ“Ｔｒｕｅ”のフローについて、ＴＣＰにおけるＦＩＮパケットやＲＳＴパケットによるセッションの切断を検出した場合に、該当のフローに対するフラグを“Ｆａｌｓｅ”に設定してもよい。
【０１４５】
図１７は、第３の実施の形態の転送先振替の具体例を示す図である。一例として、フロー＃がそれぞれ“ａ”、“ｂ”、“ｃ”、“ｄ”、“ｅ”、“ｆ”、“ｇ”、“ｈ”である複数のパケットが、この順番で振分サーバ１００に到着したとする。
【０１４６】
なお、宛先＃が“ａ”であるパケットが到着する前のＵＳＣ１１２の各中継サーバのカウント値は、全て“０”であるとする。また、図１７のＵＳＣ１１２は、振分サーバ１００により各パケットが転送されるたびに更新される（上側から下側へ向かう方向が更新によりカウント値が推移する方向である）。更に、一例として偏り閾値は“４”であるとする。
【０１４７】
まず、振分サーバ１００は、フロー＃“ａ”のパケット“ａ１”を受信する。振分サーバ１００は、ＵＳＣ１１２を参照して、偏り閾値“４”に達したカウント値がないことを確認する。このため、振分サーバ１００は、パケット“ａ１”のヘッダ情報のハッシュ値に基づいて、パケット“ａ１”を、中継サーバ２００（Ｓｖｒ１）に振り分ける。振分サーバ１００は、セッション管理テーブル１１４のフロー＃“ａ”のレコードのフラグを“Ｆａｌｓｅ”とする。振分サーバ１００は、ＵＳＣ１１２における中継サーバ２００のカウント値を“０−２＝−２”に更新する。振分サーバ１００は、ＵＳＣ１１２における中継サーバ２００ａのカウント値を“０＋１＝１”に更新する。振分サーバ１００は、ＵＳＣ１１２における中継サーバ２００ｂのカウント値を“０＋１＝１”に更新する。
【０１４８】
次に、振分サーバ１００は、フロー＃“ｂ”のパケット“ｂ１”を受信する。振分サーバ１００は、ＵＳＣ１１２を参照して、偏り閾値“４”に達したカウント値がないことを確認する。このため、振分サーバ１００は、パケット“ｂ１”のヘッダ情報のハッシュ値に基づいて、パケット“ｂ１”を、中継サーバ２００ａ（Ｓｖｒ２）に振り分ける。振分サーバ１００は、セッション管理テーブル１１４のフロー＃“ｂ”のレコードのフラグを“Ｆａｌｓｅ”とする。振分サーバ１００は、ＵＳＣ１１２における中継サーバ２００のカウント値を“−２＋１＝−１”に更新する。振分サーバ１００は、ＵＳＣ１１２における中継サーバ２００ａのカウント値を“１−２＝−１”に更新する。振分サーバ１００は、ＵＳＣ１１２における中継サーバ２００ｂのカウント値を“１＋１＝２”に更新する。
【０１４９】
次に、振分サーバ１００は、フロー＃“ｃ”のパケット“ｃ１”を受信する。振分サーバ１００は、ＵＳＣ１１２を参照して、偏り閾値“４”に達したカウント値がないことを確認する。このため、振分サーバ１００は、パケット“ｃ１”のヘッダ情報のハッシュ値に基づいて、パケット“ｃ１”を、中継サーバ２００ｂ（Ｓｖｒ３）に振り分ける。振分サーバ１００は、セッション管理テーブル１１４のフロー＃“ｃ”のレコードのフラグを“Ｆａｌｓｅ”とする。振分サーバ１００は、ＵＳＣ１１２における中継サーバ２００のカウント値を“−１＋１＝０”に更新する。振分サーバ１００は、ＵＳＣ１１２における中継サーバ２００ａのカウント値を“−１＋１＝０”に更新する。振分サーバ１００は、ＵＳＣ１１２における中継サーバ２００ｂのカウント値を“２−２＝０”に更新する。
【０１５０】
次に、振分サーバ１００は、フロー＃“ｄ”のパケット“ｄ１”を受信する。振分サーバ１００は、ＵＳＣ１１２を参照して、偏り閾値“４”に達したカウント値がないことを確認する。このため、振分サーバ１００は、パケット“ｄ１”のヘッダ情報のハッシュ値に基づいて、パケット“ｄ１”を、中継サーバ２００（Ｓｖｒ１）に振り分ける。振分サーバ１００は、セッション管理テーブル１１４のフロー＃“ｄ”のレコードのフラグを“Ｆａｌｓｅ”とする。振分サーバ１００は、ＵＳＣ１１２における中継サーバ２００のカウント値を“０−２＝−２”に更新する。振分サーバ１００は、ＵＳＣ１１２における中継サーバ２００ａのカウント値を“０＋１＝１”に更新する。振分サーバ１００は、ＵＳＣ１１２における中継サーバ２００ｂのカウント値を“０＋１＝１”に更新する。
【０１５１】
次に、振分サーバ１００は、フロー＃“ｅ”のパケット“ｅ１”を受信する。振分サーバ１００は、ＵＳＣ１１２を参照して、偏り閾値“４”に達したカウント値がないことを確認する。このため、振分サーバ１００は、パケット“ｅ１”のヘッダ情報のハッシュ値に基づいて、パケット“ｅ１”を、中継サーバ２００ａ（Ｓｖｒ２）に振り分ける。振分サーバ１００は、セッション管理テーブル１１４のフロー＃“ｅ”のレコードのフラグを“Ｆａｌｓｅ”とする。振分サーバ１００は、ＵＳＣ１１２における中継サーバ２００のカウント値を“−２＋１＝−１”に更新する。振分サーバ１００は、ＵＳＣ１１２における中継サーバ２００ａのカウント値を“１−２＝−１”に更新する。振分サーバ１００は、ＵＳＣ１１２における中継サーバ２００ｂのカウント値を“１＋１＝２”に更新する。
【０１５２】
次に、振分サーバ１００は、フロー＃“ｆ”のパケット“ｆ１”を受信する。振分サーバ１００は、ＵＳＣ１１２を参照して、偏り閾値“４”に達したカウント値がないことを確認する。このため、振分サーバ１００は、パケット“ｆ１”のヘッダ情報のハッシュ値に基づいて、パケット“ｆ１”を、中継サーバ２００（Ｓｖｒ１）に振り分ける。振分サーバ１００は、セッション管理テーブル１１４のフロー＃“ｆ”のレコードのフラグを“Ｆａｌｓｅ”とする。振分サーバ１００は、ＵＳＣ１１２における中継サーバ２００のカウント値を“−１−２＝−３”に更新する。振分サーバ１００は、ＵＳＣ１１２における中継サーバ２００ａのカウント値を“−１＋１＝０”に更新する。振分サーバ１００は、ＵＳＣ１１２における中継サーバ２００ｂのカウント値を“２＋１＝３”に更新する。
【０１５３】
次に、振分サーバ１００は、フロー＃“ｇ”のパケット“ｇ１”を受信する。振分サーバ１００は、ＵＳＣ１１２を参照して、偏り閾値“４”に達したカウント値がないことを確認する。このため、振分サーバ１００は、パケット“ｇ１”のヘッダ情報のハッシュ値に基づいて、パケット“ｇ１”を、中継サーバ２００ａ（Ｓｖｒ２）に振り分ける。振分サーバ１００は、セッション管理テーブル１１４のフロー＃“ｇ”のレコードのフラグを“Ｆａｌｓｅ”とする。振分サーバ１００は、ＵＳＣ１１２における中継サーバ２００のカウント値を“−３＋１＝−２”に更新する。振分サーバ１００は、ＵＳＣ１１２における中継サーバ２００ａのカウント値を“０−２＝−２”に更新する。振分サーバ１００は、ＵＳＣ１１２における中継サーバ２００ｂのカウント値を“３＋１＝４”に更新する。
【０１５４】
次に、振分サーバ１００は、フロー＃“ａ”のパケット“ａ２”を受信する。振分サーバ１００は、ＵＳＣ１１２を参照して、偏り閾値“４”に達したカウント値があることを確認する。一方、パケット“ａ２”は既存セッションのパケットであり、セッション管理テーブル１１４におけるフロー＃“ａ”のフラグは“Ｆａｌｓｅ”である。したがって、振分サーバ１００は、パケット“ａ２”のヘッダ情報のハッシュ値に基づいて、パケット“ａ２”を、中継サーバ２００（Ｓｖｒ１）に振り分ける。振分サーバ１００は、セッション管理テーブル１１４のフロー＃“ａ”のレコードのフラグを“Ｆａｌｓｅ”とする。振分サーバ１００は、ＵＳＣ１１２における中継サーバ２００のカウント値を“−２−２＝−４”に更新する。振分サーバ１００は、ＵＳＣ１１２における中継サーバ２００ａのカウント値を“−２＋１＝−１”に更新する。振分サーバ１００は、ＵＳＣ１１２における中継サーバ２００ｂのカウント値を“４＋１＝５”に更新する。
【０１５５】
次に、振分サーバ１００は、フロー＃“ｈ”のパケット“ｈ１”を受信する。振分サーバ１００は、ＵＳＣ１１２を参照して、偏り閾値“４”に達したカウント値があることを確認する。また、パケット“ｈ１”は新規セッションのパケットである。したがって、振分サーバ１００は、ＵＳＣ１１２に基づいて、カウント値が偏り閾値“４”に達している中継サーバ２００ｂに、パケット“ｈ１”を振り分ける。振分サーバ１００は、セッション管理テーブル１１４のフロー＃“ｈ”のレコードのＳｖｒ＃を“３”、フラグを“Ｔｒｕｅ”とする。振分サーバ１００は、ＵＳＣ１１２における中継サーバ２００のカウント値を“−４＋１＝−３”に更新する。振分サーバ１００は、ＵＳＣ１１２における中継サーバ２００ａのカウント値を“−１＋１＝０”に更新する。振分サーバ１００は、ＵＳＣ１１２における中継サーバ２００ｂのカウント値を“５−２＝３”に更新する。
【０１５６】
ここで、パケット“ｈ１”のヘッダ情報のハッシュ値による振分先が、中継サーバ２００（“Ｓｖｒ１”）であるとする。そうすると、振分サーバ１００は、パケット“ｈ１”の振分先を、当該ハッシュ値を基に決められる中継サーバ２００から、ＵＳＣ１１２を基に決められる中継サーバ２００ｂに振り替えたことになる。
【０１５７】
次に、振分サーバ１００は、フロー＃“ｈ”のパケット“ｈ２”を受信する。振分サーバ１００は、ＵＳＣ１１２を参照して、偏り閾値“４”に達したカウント値がないことを確認する。一方、パケット“ｈ２”は既存セッションのパケットであり、セッション管理テーブル１１４におけるフロー＃“ｈ”のフラグは“Ｔｒｕｅ”である。したがって、振分サーバ１００は、セッション管理テーブル１１４に基づいて、パケット“ｈ２”を、中継サーバ２００ｂに振り分ける。振分サーバ１００は、ＵＳＣ１１２における中継サーバ２００のカウント値を“−３＋１＝−２”に更新する。振分サーバ１００は、ＵＳＣ１１２における中継サーバ２００ａのカウント値を“０＋１＝１”に更新する。振分サーバ１００は、ＵＳＣ１１２における中継サーバ２００ｂのカウント値を“３−２＝１”に更新する。
【０１５８】
ここで、パケット“ｈ２”のヘッダ情報のハッシュ値による振分先は、パケット“ｈ１”と同様に、中継サーバ２００（“Ｓｖｒ１”）である。このため、振分サーバ１００は、パケット“ｈ２”の振分先を、当該ハッシュ値を基に決められる中継サーバ２００から、ＵＳＣ１１２を基に決められる中継サーバ２００ｂに振り替えたことになる。
【０１５９】
このように、振分サーバ１００は、パケットの転送先として選択された中継サーバのＵＳＣ１１２のカウント値をカウントダウンし、選択されなかった中継サーバのＵＳＣ１１２のカウント値をカウントアップする。このため、振分サーバ１００は、ＵＳＣ１１２に基づいて、転送先として選択された回数が相対的に少ないノードを効率的に特定できる。振分サーバ１００は、中継サーバ２００ｂのカウント値が、偏り閾値以上になったことを検出することで、パケットの転送先の選択に偏りが発生していると判断できる。なぜなら、中継サーバ２００ｂが選択されなかった回数が相対的に多いということは、中継サーバ２００，２００ａの両方あるいは何れか一方が選択された回数が相対的に多いと推定されるからである。更に、選択されなかった回数が相対的に多い中継サーバ２００ｂは、振り分けられたトラフィック量も中継サーバ２００，２００ａに比べて少ないと考えられる。このため、ＳＷ４００の中継サーバ２００ｂと接続するインタフェースのリソース（例えば、転送待ちパケットを格納するバッファ）や、中継サーバ２００ｂのリソースにも比較的余裕があると考えられる。したがって、振分サーバ１００は、中継サーバ２００，２００ａ，２００ｂに、ある程度均等にデータを振り分けようとする場合、中継サーバ２００ｂを優先的に選択した方がよいと判断できる。
【０１６０】
このように、振分サーバ１００は、中継サーバの選択に偏りが発生していること、および、偏りを補正するために転送先として選択すべき中継サーバの両方をＵＳＣ１１２によって効率的に判定できる。こうして、中継サーバの選択の偏りを省演算量で補正可能になる。その結果、振分サーバ１００のデータ転送に伴う演算を高速化でき、クライアント５００，５００ａ，５００ｂ，・・・，５００ｎと、業務サーバ３００，３００ａ，３００ｂ，・・・，３００ｍとの間の通信の遅延の低減に寄与する。
【０１６１】
図１８は、第３の実施の形態に対する比較例を示す図である。図１８では、振分サーバ６２０，６２０ａ，６２０ｂおよび中継サーバ７００，７００ａ，・・・，７００ｍが、ＳＷ４００に接続された例を示している。ただし、図１８中、「中継サーバ」については、中継サーバ７００，７００ａ，・・・，７００ｍそれぞれの識別情報“Ｓｖｒ１”，“Ｓｖｒ２”，・・・，“Ｓｖｒ１０”を表記している。
【０１６２】
振分サーバ６００，６００ａ，６００ｂは、それぞれセッション管理テーブル６２１，６２１ａ，６２１ｂを用いて、パケットの振分先を決定する。セッション管理テーブル６２１，６２１ａ，６２１ｂは、フロー＃とＳｖｒ＃との項目を含むが、フラグの項目を含まない点がセッション管理テーブル１１４と異なる。また、振分サーバ６２０，６２０ａ，６２０ｂは、ＵＳＣ１１２に相当する情報を保持しない点が、振分サーバ１００，１００ａ，１００ｂと異なる。
【０１６３】
例えば、振分サーバ６２０において中継サーバ７００を経由する複数のフローのパケットが比較的短い期間の間に受信されることがある。すなわち、複数のフローに対するパケットの振分先が、中継サーバ７００（Ｓｖｒ１）に偏ることがある。
【０１６４】
更に、振分サーバ６２０，６２０ａ，６２０ｂそれぞれによる振分先が同期することもある。図１８の例では、振分サーバ６２０ａ，６２０ｂによる各フローに対するパケットの振分先も中継サーバ７００（Ｓｖｒ１）に偏っている。このように、バースト的に中継サーバ７００にトラフィックが集中することがある。
【０１６５】
この場合、ＳＷ４００が備える通信インタフェースのうち、中継サーバ７００と通信する通信インタフェースの負荷が特に過大になる。すると、当該通信インタフェースが備えるバッファを用いた転送待ち合わせによる遅延が増大したり、バッファあふれによるパケット廃棄が発生したりする。
【０１６６】
一方、第３の実施の形態の振分サーバ１００，１００ａ，１００ｂによれば、個々の振分サーバ１００，１００ａ，１００ｂが振分先の偏りを是正するので、図１８で例示した特定の中継サーバに対するバースト的なトラフィックの集中の発生を抑えられる。
【０１６７】
また、振分先の選択の偏りを検出するために、振分サーバ１００，１００ａ，１００ｂそれぞれは他のサーバと通信しなくてよい。すなわち、振分サーバ１００，１００ａ，１００ｂは、それぞれが単体で振分先の偏りを検出できる。
【０１６８】
なお、第３の実施の形態でも、振分サーバ１００，１００ａ，１００ｂおよび中継サーバ２００，２００ａ，２００ｂの両方または何れか一方を、物理マシン上で動作する仮想的なコンピュータ（仮想マシン）により実現してもよい。
【０１６９】
ところで、振分サーバ１００，１００ａ，１００ｂのように複数の振分サーバを用いる場合、２以上の振分サーバにおいて、ＵＳＣのカウント値が偏り閾値に達した中継サーバが複数存在することもある。この場合、当該２以上の振分サーバが全て同じ中継サーバを振替先に選択すると、振替先の中継サーバにパケットを転送するためのリソースの負荷が過大になるおそれもある。このため、各振分サーバは、振替先の選択を、他の振分サーバと異なるよう制御してもよい。例えば、次のような方法が考えられる。
【０１７０】
図１９は、転送先振替の他の例（その１）を示す図である。振分サーバ１００ａは、ＵＳＣ１１２ａを記憶する。図１９の上側から下側へ向かう方向がＵＳＣ１１２，１１２ａの更新推移の方向を表す。なお、ＵＳＣ１１２，１１２ａの各中継サーバに対するカウント値の初期値は、何れも“０”である。また、図１９では、一例として、振分サーバ１００，１００ａそれぞれによる初回から４回目までのパケットの振分先は、中継サーバ２００であるとする。更に、偏り閾値は“４”とする。
【０１７１】
この場合、４回目の振り分けにおいて、ＵＳＣ１１２，１１２ａにおける中継サーバ２００のカウント値は“−８”、中継サーバ２００ａのカウント値は“４”、中継サーバ２００ｂのカウント値は“４”となる。この段階で、中継サーバ２００ａ，２００ｂの両方のカウント値が、偏り閾値“４”に達する。
【０１７２】
このとき、振分サーバ１００は、Ｓｖｒ＃の小さい方を優先的に振分先として選択する（若番優先）。一方、振分サーバ１００ａは、Ｓｖｒ＃の大きい方を優先的に振分先として選択する（老番優先）。上記の例では、振分サーバ１００は、次回のパケットの振分先を、中継サーバ２００ａ（Ｓｖｒ２）とする。一方、振分サーバ１００ａは、次回のパケットの振分先を、中継サーバ２００ｂ（Ｓｖｒ３）とする。なお、若番優先により振分先を選択する振分サーバ、および、老番優先により振分先を選択する振分サーバは、システムの管理者によって予め定められる。各振分サーバは、振分サーバ間で連携し、互いに異なる優先度を決定してもよい。
【０１７３】
このように、振分サーバ１００，１００ａは、カウント値が偏り閾値に達した中継サーバが複数ある場合、複数の中継サーバそれぞれに対する所定の優先度に基づいて、振分先を選択してもよい。このとき、ある振分サーバが用いる中継サーバの優先度と、別の振分サーバが用いる中継サーバの優先度とは、異なる優先順位となるようにする。これにより、振分サーバ１００，１００ａの両方が振分先の振替を行う場合に、中継サーバ２００ａ、または、中継サーバ２００ｂの何れか一方にトラフィックを集中させることを抑えられる。
【０１７４】
あるいは、振分サーバ１００，１００ａそれぞれは、中継サーバ２００，２００ａ，２００ｂのカウント値を更新する際の加算値を中継サーバ毎に変えてもよい。具体的には次の通りである。
【０１７５】
図２０は、転送先振替の他の例（その２）を示す図である。図２０の上側から下側へ向かう方向がＵＳＣ１１２，１１２ａの更新推移の方向を表す。なお、ＵＳＣ１１２，１１２ａの各中継サーバに対するカウント値の初期値は、何れも“０”である。また、図２０では、一例として、振分サーバ１００，１００ａそれぞれによる初回から４回目までのパケットの振分先は、中継サーバ２００であるとする。更に、偏り閾値は“４”とする。
【０１７６】
ここで、振分サーバ１００は、ＵＳＣ１１２における中継サーバ２００ａのカウント値の加算値を、“１．１（＝１．０＋０．１）”とする。一方、振分サーバ１００は、ＵＳＣ１１２における中継サーバ２００ｂのカウント値の加算値を、“０．９（＝１．０−０．１）”とする。
【０１７７】
更に、振分サーバ１００ａは、ＵＳＣ１１２ａにおける中継サーバ２００ａのカウント値の加算値を、“０．９（＝１．０−０．１）”とする。一方、振分サーバ１００ａは、ＵＳＣ１１２ａにおける中継サーバ２００ｂのカウント値の加算値を、“１．１（＝１．０＋０．１）”とする。
【０１７８】
そうすると、４回目の振り分けにおいて、ＵＳＣ１１２における中継サーバ２００のカウント値は“−８”、中継サーバ２００ａのカウント値は“４．４”、中継サーバ２００ｂのカウント値は“３．６”となる。この段階で、中継サーバ２００ａのカウント値が、偏り閾値“４”に達する。
【０１７９】
一方、４回目の振り分けにおいて、ＵＳＣ１１２ａにおける中継サーバ２００のカウント値は“−８”、中継サーバ２００ａのカウント値は“３．６”、中継サーバ２００ｂのカウント値は“４．４”となる。この段階で、中継サーバ２００ｂのカウント値が、偏り閾値“４”に達する。
【０１８０】
したがって、振分サーバ１００は、次回のパケットの振分先を、中継サーバ２００ａ（Ｓｖｒ２）とする。一方、振分サーバ１００ａは、次回のパケットの振分先を、中継サーバ２００ｂ（Ｓｖｒ３）とする。なお、各中継サーバに対する加算値は、システムの管理者によって予め定められる。各振分サーバは、振分サーバ間で連携し、互いに異なる加算値を決定してもよい。
【０１８１】
このように、振分サーバ１００，１００ａは、各中継サーバのカウント値に対する加算値を中継サーバ毎に異なる値としてもよい。例えば、振分サーバ１００による第１の中継サーバの加算値の重みを大きくし、第２の中継サーバの加算値の重みを小さくしたならば、振分サーバ１００ａによる第１の中継サーバの加算値の重みを小さくし、第２の中継サーバの加算値の重みを大きくする。これにより、振分サーバ１００，１００ａの両方が振分先の振替を行う場合に、中継サーバ２００ａ、または、中継サーバ２００ｂの何れか一方にトラフィックを集中させることを抑えられる。
【０１８２】
なお、図１９，図２０の方法は、第２，第３の実施の形態の両方に適用することができる。また、図１９および図２０の方法の両方を、第２，第３の実施の形態に適用することも考えられる。
【０１８３】
ところで、第２，第３の実施の形態では、ＵＳＣ１１２を用いて、振分先として選択されなかった回数をカウントするものとした。一方、振分先の偏りを検出する単純な方法として、振分先として選択された累積の回数を中継サーバ毎にカウントすることも考えられる。そこで、例えば、振分サーバ１００が、ＵＳＣ１１２に代えて、振分累積カウンタを用いてパケットの振分先を決定することを考える。
【０１８４】
図２１は、振分累積カウンタの例を示す図である。振分累積カウンタ１１５は、振分先として選択された累積の回数を中継サーバ毎にカウントするカウンタである。例えば、振分サーバ１００は、振分累積カウンタ１１５を用いて、パケットの振分先として選択された中継サーバのカウント値を、選択のたびに、１ずつ加算する。このとき、振分サーバ１００は、振分先として選択されなかった中継サーバのカウント値を更新しない。
【０１８５】
この場合、振分先の選択に偏りがあるか否かを判定するために、各中継サーバのカウント値の最小値、および、最小値と最大値との差の大きさを取得することが考えられる。この場合、差が所定の閾値よりも大きい場合に、振分先の選択に偏りがあると判定できる。また、偏りがある場合に、カウント値の最小値に対応する中継サーバを振分先として選択することが考えられる。
【０１８６】
振分累積カウンタ１１５におけるカウント値の最小値や最大値を取得するために、各中継サーバのカウント値を、２つの中継サーバの組について総当たりで比較することが考えられる。しかし、この方法では、振分先候補の中継サーバの数が多くなるほど、比較のための演算量が線形増加する。このため、中継サーバの数が多くなるほど、振分先の決定までの遅延量が過大になる可能性がある。
【０１８７】
図２２は、振分累積カウンタとＵＳＣとの比較例を示す図である。図２２（Ａ）は、振分累積カウンタ１１５の更新の推移を示している。図２２（Ｂ）は、偏り閾値＞７の場合のＵＳＣ１１２ａの更新の推移を示している（図２２（Ｃ）のＵＳＣ１１２と区別するために、ＵＳＣ１１２ａと表記する）。図２２（Ｃ）は、偏り閾値＝４の場合のＵＳＣ１１２の更新の推移を示している。なお、図２２の上側から下側へ向かう方向が更新推移の方向である。
【０１８８】
ここでは、中継サーバ２００，２００ａ，２００ｂが振分先の候補であるとする。そして、図２２で例示される３つの場合の何れも、当初、各中継サーバのカウンタのカウント値は“０”であるとする。また、３つの場合の何れも、中継サーバの選択の順序は、初回から７回目の選択まで同じである。初回から７回目の選択は、中継サーバ２００（Ｓｖｒ１）、中継サーバ２００ａ（Ｓｖｒ２）、中継サーバ２００ｂ（Ｓｖｒ３）、中継サーバ２００（Ｓｖｒ１）、中継サーバ２００ａ（Ｓｖｒ２）、中継サーバ２００、（Ｓｖｒ１）、中継サーバ２００ａ（Ｓｖｒ２）の順であるとする。
【０１８９】
図２２（Ａ）の場合、振分先の選択のたびに、振分累積カウンタ１１５に基づいて、振分先の選択に偏りがあるか否かが判定される。また、選択結果に応じて、振分累積カウンタ１１５において、振分先として選択された中継サーバのカウント値がカウントアップされる。例えば、８回目、９回目、１０回目の選択では、それぞれ中継サーバ２００（Ｓｖｒ１）、中継サーバ２００ａ（Ｓｖｒ２）、中継サーバ２００（Ｓｖｒ１）が選択される。１０回目の選択後の振分累積カウンタ１１５では、中継サーバ２００のカウント値は“５”である。中継サーバ２００ａのカウント値は“４”である。中継サーバ２００ｂのカウント値は“１”である。例えば、１０回目の選択後に、振分先の選択に偏りがあるか否かを判定する場合、振分累積カウンタ１１５の各中継サーバのカウント値を総当たり比較することで、選択回数に最大で４の差があると判定される。その上で、当該差が許容される差以上であれば、例えば、振分累積カウンタ１１５のカウント値が最小の中継サーバ２００ｂ（Ｓｖｒ３）が振分先として選択されることになる。
【０１９０】
図２２（Ｂ）の場合、振分先の選択のたびに、ＵＳＣ１１２ａに基づいて、振分先の選択に偏りがあるか否かが判定される。また、選択結果に応じて、ＵＳＣ更新ルール１１３に従って、ＵＳＣ１１２ａの各中継サーバのカウント値が更新される。例えば、８回目、９回目、１０回目の選択では、それぞれ中継サーバ２００（Ｓｖｒ１）、中継サーバ２００ａ（Ｓｖｒ２）、中継サーバ２００（Ｓｖｒ１）が選択される。１０回目の選択後のＵＳＣ１１２ａでは、中継サーバ２００のカウント値は“−５”である。中継サーバ２００ａのカウント値は“−２”である。中継サーバ２００ｂのカウント値は“７”である。
【０１９１】
カウント値の更新は、選択の都度、全ての中継サーバ分の更新が行われる。ただし、ＵＳＣ１１２ａにおける各中継サーバのカウント値は独立して更新可能であり、並列演算が可能である。例えば、プロセッサ１０１がマルチコアである場合、複数コアにより並列して更新を行うことで、全ての中継サーバのカウント値を１サイクルで更新することも可能である。したがって、全ての中継サーバ分の更新を行うことによる処理遅延は、非常に少ないと考えてよい。
【０１９２】
また、振分先の選択に偏りがあるか否かの判定は、各中継サーバのカウント値を偏り閾値と比較するだけでよく、各中継サーバ同士のカウント値の総当たりの比較を行わずに済む。例えば、中継サーバの数を１０とすると、振分累積カウンタ１１５を用いる場合は、最も振分回数の少ない中継サーバを特定するのに１０サイクルの比較演算を要するが、振分サーバ１００によれば、当該比較演算を行わずに済む。この場合、前述のように、１０個の中継サーバ分のＵＳＣ１１２のカウント値の更新を行うことになるが、更新そのものは並列演算可能（例えば、１サイクルで更新可能）である。これは、図２２（Ｃ）の場合も同様である。
【０１９３】
図２２（Ｃ）の場合も、振分先の選択のたびに、ＵＳＣ１１２に基づいて、振分先の選択に偏りがあるか否かが判定される。また、選択結果に応じて、ＵＳＣ更新ルール１１３に従って、ＵＳＣ１１２の各中継サーバのカウント値が更新される。例えば、８回目の選択では、中継サーバ２００ｂ（Ｓｖｒ３）のカウント値が偏り閾値に達しているため、中継サーバ２００ではなく、中継サーバ２００ｂを振分先に選択する。続いて、９回目、１０回目の選択では、それぞれ中継サーバ２００ａ（Ｓｖｒ２）、中継サーバ２００（Ｓｖｒ１）が選択される。１０回目の選択後のＵＳＣ１１２では、中継サーバ２００のカウント値は“−２”である。中継サーバ２００ａのカウント値は“−２”である。中継サーバ２００ｂのカウント値は“４”である。
【０１９４】
このように、振分サーバ１００，１００ａ，１００ｂは、ノード選択に偏りが発生していること、および、偏りを補正するために転送先として選択すべきノードの両方をＵＳＣ１１２（または、ＵＳＣ１１２ａ）のカウント値によって効率的に判定できる。特に、振分累積カウンタ１１５を用いる比較例のように、中継サーバ間での累積カウント値の比較を総当たりで行って偏りを検出する方法よりも、演算量を少なくすることができる。
【０１９５】
こうして、振分サーバ１００，１００ａ，１００ｂによれば、振分先の中継サーバの選択の偏りを省演算量で補正可能になる。その結果、振分サーバ１００，１００ａ，１００ｂのデータ転送に伴う演算を高速化でき、クライアント５００，５００ａ，５００ｂ，・・・，５００ｎと業務サーバ３００，３００ａ，３００ｂ，・・・，３００ｍとの間の通信の遅延の低減に寄与する。
【０１９６】
なお、振分サーバ１００，１００ａ，１００ｂによる通常時の振分ルールとして、ラウンドロビンや、パケットのヘッダ情報のハッシュ値により振分先を選択する方法を例示したが、通常時の振分ルールはそれ以外でもよい。例えば、振分サーバ１００は、通常時の振分ルールとして、中継サーバ２００，２００ａ，２００ｂそれぞれのＣＰＵやメモリの負荷などを取得し、当該負荷に応じて、パケットの振分先を決定するルールを採用してもよい。この場合、振分サーバ１００は、最小負荷の中継サーバを振分先に決定することが考えられる。振分サーバ１００ａ，１００ｂも同様である。
【０１９７】
また、第１の実施の形態の情報処理は、処理部１ｂにプログラムを実行させることで実現できる。また、第２，第３の実施の形態の情報処理は、プロセッサ１０１にプログラムを実行させることで実現できる。プログラムは、コンピュータ読み取り可能な記録媒体１３に記録できる。
【０１９８】
例えば、プログラムを記録した記録媒体１３を配布することで、プログラムを流通させることができる。また、プログラムを他のコンピュータに格納しておき、ネットワーク経由でプログラムを配布してもよい。コンピュータは、例えば、記録媒体１３に記録されたプログラムまたは他のコンピュータから受信したプログラムを、ＲＡＭ１０２やＨＤＤ１０３などの記憶装置に格納し（インストールし）、当該記憶装置からプログラムを読み込んで実行してもよい。
【符号の説明】
【０１９９】
１  制御装置
１ａ  記憶部
１ｂ  処理部
２，３，４  ノード
５，６，７  宛先装置
８，９  端末装置
Ｎ１，Ｎ２  ネットワーク
Ｔ１，Ｔ１ａ  テーブル
【図１】
2018117300.tif 000003
【図２】
2018117300.tif 000004
【図３】
2018117300.tif 000005
【図４】
2018117300.tif 000006
【図５】
2018117300.tif 000007
【図６】
2018117300.tif 000008
【図７】
2018117300.tif 000009
【図８】
2018117300.tif 000010
【図９】
2018117300.tif 000011
【図１０】
2018117300.tif 000012
【図１１】
2018117300.tif 000013
【図１２】
2018117300.tif 000014
【図１３】
2018117300.tif 000015
【図１４】
2018117300.tif 000016
【図１５】
2018117300.tif 000017
【図１６】
2018117300.tif 000018
【図１７】
2018117300.tif 000019
【図１８】
2018117300.tif 000020
【図１９】
2018117300.tif 000021
【図２０】
2018117300.tif 000022
【図２１】
2018117300.tif 000023
【図２２】
2018117300.tif 000024