(58)【調査した分野】(Int.Cl.,DB名)
さらに、ハッシュ化マルチパス・ルーティング技法に従って、前記1以上のクライアントからの前記パケットフローを前記複数のロードバランサノードの中に分散するように構成されたルータをさらに備える、
請求項1に記載の分散型ロードバランサシステム。
前記サーバノード上の前記サーバによって各前記パケットフローに対するデータ通信プロトコル接続が受諾されるかどうかを判定するために、前記ロードバランサモジュールが、前記サーバノード上の前記サーバの1以上の現在の資源使用量のメトリクスを分析して、前記接続を前記サーバが受諾できるかどうかを判定するように構成され、前記1以上の現在の資源の使用量のメトリクスが、CPUの使用、帯域幅の使用量、サーバ待ち時間、及び確立された接続数のうちの1以上を含む、
請求項1に記載の分散型ロードバランサシステム。
前記複数のロードバランサノードが、さらに、拒絶された接続要求を受信するために前記複数のサーバノードの中から、他のサーバノードをランダムに選択し、前記接続要求を前記他のサーバノードに対して送信するように構成されている、
請求項1に記載の分散型ロードバランサシステム。
クライアントとサーバとの間で確立された各データ通信プロトコル接続が、前記クライアントに始まり、前記複数のロードバランサノードの1以上の中を通って、前記サーバによって終端される、
請求項1に記載の分散型ロードバランサシステム。
1以上のクライアントからのパケットフローをハッシュ化マルチパス・ルーティング技法に従って前記複数のロードバランサノードの中に分散するルータから前記パケットが受信される、請求項6に記載の方法。
前記サーバノード上のサーバがデータ通信プロトコル接続を受諾できるかまたはできないかどうかを前記判定することが、前記サーバの1以上の現在の資源使用量のメトリクスを分析して前記接続を受諾できるかどうかを判定することを含む、請求項6に記載の方法。
前記選択されたサーバノードが前記接続要求を拒絶した場合に、前記1以上のロードバランサノードが、前記複数のサーバノードの中からランダムに選択された他のサーバノードに対して前記接続要求を送信することをさらに含む、請求項6に記載の方法。
前記接続要求を拒絶するために、前記接続要求の中の生存時間(TTL)カウンタを減じて、前記接続要求を前記ロードバランサノードに対して返送するように前記ロードバランサモジュールが動作でき、前記プログラム命令は、さらに、前記ロードバランサノードが、
前記返送された接続要求の中の前記TTLカウンタを検査し、
前記TTLカウンタが閾値を超えている場合には、前記接続要求を受信するために前記複数のサーバノードの中から他のサーバノードをランダムに選択し、及び
前記TTLカウンタが前記閾値以下である場合には、前記接続要求を廃棄することを実現するようにコンピュータを実行可能にする、請求項11に記載のロードバランサ。
【発明を実施するための形態】
【0006】
ネットワーク環境における分散型ロードバランシング方法及びシステムの様々な実施形態について説明する。様々なネットワーク環境における分散型ロードバランサの実施形態に従って、実装される分散型ロードバランシング方法及びシステムの実施形態について説明する。分散型ロードバランサの実施形態は、例えば、インターネットなどの外部ネットワーク上のクライアントと、
図33A及び33Bに示されるようなプロバイダ・ネットワーク1900などのローカルネットワーク上の宛先、一般的には、サーバ(例えば、ウェブサーバ、アプリケーションサーバ、データサーバ等)との間で、パケットフロー、例えば、伝送制御プロトコル(TCP)技術のパケットフローを推進するため及び維持するために使用される。実施形態は、TCPパケットフローの処理に関して本明細書において主に説明するが、TCP以外の他のデータ通信プロトコル、及びパケットフロー処理以外の他のアプリケーションにも適用されることに留意されたい。
【0007】
分散型ロードバランサは、特定のクライアントと選択されたサーバ(例えば、ウェブサーバ)との間でTCPパケットフローを推進し維持するために作用する。しかしながら、分散型ロードバランサは、従来のロードバランサにおいて行われているように、クライアントからのTCPフローを終了させることはなく、且つ、サーバに対してプロキシとしての役割をすることはない。その代わり、分散型ロードバランサのロードバランサノードは、クライアントから受信されたTCPパケットを目標のサーバにルーティングし、サーバがそれらのTCPスタックを使用してクライアントに対するTCP接続を管理する。言い換えれば、サーバがクライアントからのTCPパケットフローを終了させる。
【0008】
さらに、従来のロードバランサ技術において行われているように、サーバから収集された情報に適用されるロードバランシング技法またはアルゴリズムに基づいて、どのサーバが接続要求に対応するかに関してロードバランサノードが決定を下す代わりに、ロードバランサノードは、新たな接続要求を受信するサーバをランダムに選択して、当該サーバノード上に属する分散型ロードバランサの構成要素が、それぞれのサーバの現在の状態の1以上のメトリクスに基づいて、選択されたサーバが新たな接続要求を受理するかまたは拒絶するかどうかに関してローカルに決定を下す。したがって、どのサーバが接続要求を受理すべきかに関する決定は、ロードバランサノードから接続を取り扱うサーバノードに移管される。言い換えれば、決定は、接続要求が対応されるより近い場所及び時間に移管される。
【0009】
クライアントとサーバとの間のパケットフローを推進及び維持するために、分散型ロードバランサの実施形態は、限定はされないが、マルチパス・ルーティング技術、コンシステントハッシュ法の技術、分散型ハッシュテーブル(DHT)技術、境界ゲートウェイ・プロトコル(BGP)技術、メンバーシップ追跡処理、健康ヘルスチェック、接続公開、及びパケットのカプセル化とデカプセル化を含む様々な技法や技術を利用してよい。これらは、分散型負荷分散システムの他の態様と同様、図面と関連して以下説明する。
分散型ロードバランシングシステム
【0010】
図1は、少なくともいくつかの実施形態において、例示的な分散型ロードバランシングシステムのブロック図である。分散型ロードバランサの実施形態は、ネットワーク100、例えば、
図33A及び33Bに示されるようなサービス・プロバイダのプロバイダ・ネットワーク1900の中に実装される。分散型ロードバランサシステムにおけるクライアントパケットの取り扱いの上位の概要として、ネットワーク100の1以上のクライアント160は、例えば、インターネットなどの外部ネットワーク150を介して、ネットワーク100の境界ルータ102に接続してよい。境界ルータ102は、クライアント160からの着信パケット(例えば、TCPパケット)を、分散型ロードバランサシステムのロードバランサノードレイヤにおけるロードバランサ(LB)ノード110に着信パケットをルーティングする分散型ロードバランサのエッジルータ104の構成要素にルーティングする。少なくともいくつかの実施形態において、エッジルータ104は、フロー単位のハッシュ化マルチパス・ルーティング技法、例えば、等価マルチパス(ECMP)ハッシュ法の技法に従って、ルーティングの決定を下す。ロードバランサノード110は、今度は、パケットを(例えば、ユーザ・データグラム・プロトコル(UDP)に従って)カプセル化し、ネットワーク100上のネットワークファブリック120(例えば、L3ネットワーク)を介してサーバノード130上のローカルロードバランサモジュール132にカプセル化されたパケットをルーティングする。ファブリック120は、1以上のネットワーク装置、または、限定はされないが、スイッチ、ルータ、及びケーブルを含む構成要素を含んでよい。サーバノード130上において、ローカルロードバランサモジュール132は、パケットをデカプセル化し、サーバ134のTCPスタックにクライアントTCPパケットを送信する。サーバノード130上のサーバ134は、次に、それらのTCPスタックを使用してクライアント160に対する接続を管理する。
【0011】
図2は、少なくともいくつかの実施形態において、
図1の分散型ロードバランサシステムによって実行されるロードバランシング方法の上位のフローチャートである。分散型ロードバランサシステムの実施形態は、従来のロードバランサにおいて行われているような、多数の宛先(例えば、ウェブサーバ)の中に負荷を対応付けている困難な問題を解決することができない。例えば、従来のロードバランサは、一般的に、最大接続、ラウンド・ロビン、及び/または、最小接続の技法などの技法またはアルゴリズムを使用して、接続を取り扱うべきいずれかのサーバを選択する。しかしながら、これらの技法は欠点があり、特に、ロードバランシングの決定をするために使用されるデータがほとんど急速に古くなるようなことが多い場所での分散型システムにおいては特に成功裏に実行することが困難である。分散型ロードバランサシステムの少なくともいくつかの実施形態において、従来のロードバランサにおいて行われているような、1以上のロードバランシング技法を使用して、接続要求を満たすサーバノード130を選択する試みに代えて、ロードバランサノードレイヤにおけるロードバランサノード110が、クライアント接続のための要求を受信するサーバノード130をランダムに決定してもよい。サーバノード130が自身を過負荷であると判断した場合には、当該サーバノード130は接続要求をロードバランサノード110に送信して戻すので、当該サーバノード130が現在は接続を取り扱うことができないことをロードバランサノード110に通知する。ロードバランサノードレイヤは、次に、接続要求を受信すべき他のサーバノード130をランダムに決定するか、あるいは、要求しているクライアント160に対してエラーメッセージを返送して、接続が現在は確立できないことをクライアント160に通知する。
【0012】
図2の10に示されるように、分散型ロードバランサシステムのロードバランサノードレイヤは、通信セッション(例えば、TCP接続)についての要求を送信元から受信する。送信元は、例えば、分散型平衡器システムを実装するネットワーク100に対する外部ネットワーク150上のクライアント160であってよい。少なくともいくつかの実施形態において、要求はネットワーク100の境界ルータ102においてクライアント160から受信され、例えば、クライアント160からの特定の接続要求がルーティングされるロードバランサノード110を擬似ランダムに選択するためのフロー単位の等価マルチパス(ECMP)ハッシュ処理の技法を用いて、ロードバランサノードレイヤにおけるロードバランサ(LB)ノード110に対して着信パケットをルーティングするエッジルータ104に対してルーティングされる。
【0013】
20に示されるように、ロードバランサノードレイヤは、宛先ノードをランダムに選択して、その選択された宛先ノードに接続要求を転送する。宛先ノードは、例えば、ロードバランサによって対応させられた複数のサーバノード130の1つであってよい。少なくともいくつかの実施形態において、ロードバランサレイヤにおけるロードバランサノード110は、すべての既知のサーバノード130の中から接続要求を受信すべきサーバノード130をランダムに選択してよい。しかしながら、すべての既知のサーバノード130の中からの単なるランダムな選択ではなく、いくつかの実施形態においては、接続要求を受信すべきサーバノード130を選択するために、他の方法が使用されてもよい。例えば、いくつかの実施形態において、サーバノード130に関する情報が、サーバノード130のランダムな選択の重みづけをするロードバランサノード110によって使用される。実施例のように、ロードバランサノード110が、異なるサーバノード130が異なるタイプの装置であるか、または、異なるCPUで構成されており、そのため異なる能力または容量を持っていることを認識している場合には、サーバノード130の特定のタイプまたは構成に向かう(または、離れる)ようにランダムな選択に偏りを持たせるためにその情報が使用されてもよい。
【0014】
30に示されるように、宛先ノードは、通信セッションを受諾することができるかどうかを判定する。少なくともいくつかの実施形態において、サーバノード130上のローカルロードバランサ(LB)モジュール132は、サーバノード130上のそれぞれのサーバ134がそれぞれのサーバ134の現在の状態の1以上のメトリクスに基づいて新たな接続を受諾できるかどうかを判定する。
【0015】
40において、接続要求が受諾された場合には、50に示されるように宛先ノードは、宛先ノードが接続を取り扱うことができる旨をロードバランサノードレイヤに通知する。60に示されるように、ロードバランサノードレイヤを介して、送信元(例えば、クライアント160)と宛先ノード(例えば、サーバノード130上のサーバ134)との間に通信セッションが確立されることになる。少なくともいくつかの実施形態において、サーバノード130上のサーバ134は、TCPスタックを使用してクライアント160に対する接続を管理する。
【0016】
40において、接続要求が受理されない場合には、70に示されるように、宛先ノードはロードバランサノードレイヤに通知し、方法は要素20に戻る。その後、ロードバランサノードレイヤは、20において他の宛先ノードをランダムに選択するか、または、要求しているクライアント160に対して、現在は接続を確立することができない旨を通知することができる。クライアント160は、必ずしも接続要求を再実行する必要はなく、要素10において再び方法を開始することに留意されたい。
【0017】
再び
図1を参照すると、分散型ロードバランサシステムの少なくともいくつかの実施形態分散型は、汎用のハードウェアを使用して、ネットワーク100上のエッジルータ104において受信されたクライアントトラフィックをネットワーク100上のサーバノード130にルーティングする。分散型ロードバランサの少なくともいくつかの実施形態は、多数のロードバランサノード110を含むロードバランサノードレイヤを含んでもよい。少なくともいくつかの実施形態において、各ロードバランサノード110は、ロードバランサノードレイヤにおいて1以上の多数の役割を果たす。ロードバランサノード110のこれらの役割は、入口ノード、及び出口ノード、及びフロー追跡部ノード(所定のパケットフローに対する一次フロー追跡部または二次フロー追跡部として)を含む。少なくともいくつかの実施形態において、各ロードバランサノード110は、汎用のラック収容型演算装置などの独立した演算装置としてまたはその上で、ロードバランサノードレイヤの中に実装されてもよい。少なくともいくつかの実施形態において、各ロードバランサノード110は、入口ノード、出口ノード、及びフロー追跡部ノード(パケットフローに対する一次または二次フロー追跡部として)の3つの役割の各々を果たすが、通常は、ロードバランサノード110は、特定のパケットフローに対する複数の役割の中の1つの役割だけに従事する(ただし、2つまたは3つの役割に従事することも可能)。しかしながら、少なくともいくつかの実施形態において、ロードバランサノード110は、特定のパケットフローに対する一次フロー追跡部及び二次フロー追跡部の両方としての役割を果たすことは許されないことに留意されたい。あるいは、いくつかの実施形態において、各ロードバランサノード110は、3つの役割の中の1つの役割のみを果たす。この実施形態においては、演算装置の独立した組み合わせは、特に、入口ノード、出口ノード、及びフロー追跡部ノードとして、ロードバランサノードレイヤの中に実装されてもよい。
【0018】
少なくともいくつかの実施形態において、コンシステントハッシュ法及びコンシステントハッシュリング技術は、パケットフローに対する一次及び二次フロー追跡部を決定するために適用されてもよい。クライアントからの各パケットフローは、例えば、クライアントIPアドレス、クライアントポート、サーバ(パブリック)IPアドレス、及びサーバポートから構成される4つのタプルによって一意に認証される。この識別子は、クライアント及び公開エンドポイント対を示すCPまたはCcPpとして略すことができる。任意の所定のTCPフロー(またはCP対)に関連するパケットは、エッジルータ104からのハッシュ化マルチパス(例えば、ECMP)フロー分散のせいで、入口サーバ112として動作する任意のロードバランサノード110上に出現し得る。入口ノードとして機能しているロードバランサノード110にパケットが到達した場合には、入口ノードは、パケットフロー(すなわち、一次フロー追跡部ノード)に対応する状態を維持することを担うのにどのロードバランサノード110にするかを決定することができるように、コンシステントハッシュ法が使用される。CP対は、入口ノードによってハッシュ化されてコンシステントハッシュリングに入り、パケットフローに関する状態情報を維持することを担うのにどのロードバランサノード110にするかを決定する。コンシステントハッシュリングにおいてパケットフローに対応するCP対のコンシステントハッシュに従って決定されたノード110は、パケットフローに対して一次フロー追跡部としての機能を果たすノード110である。少なくともいくつかの実施形態において、コンシステントハッシュリングの中で後に続くノードは、パケットフローに対して二次フロー追跡部としての機能を果たす。
【0019】
図3は、少なくともいくつかの実施形態において、すべての3つの役割(入口、出口、及びフロー追跡部)を実施する構成要素を含む例示的なロードバランサ(LB)ノード110を示す。この実施例において、入口サーバ112の構成要素は、クライアントからのインバウンドのTCPパケットを受信して、そのTCPパケットをカプセル化されたパケットとしてサーバに送信する入口の役割を実行する。出口サーバ114の構成要素は、サーバからのアウトバウンドのカプセル化されたパケットを受信して、デカプセル化されたTCPパケットをクライアントに対して送信する出口の役割を実行する。フロー追跡部116の構成要素は、クライアント160とサーバ134との間に確立された1または2以上のパケットフローに対応する一次または二次フロー追跡部として実行する。入口サーバ112はまた、ロードバランサノード110上のフロー追跡部116または他のロードバランサノード110上のフロー追跡部116と通信し、それぞれのクライアント160から受信した接続要求に応答して、クライアントとサーバ134の1つとの間のTCP接続を開始し、または、パケットフローに対するマッピング情報を取得する。
<ロードバランサノード>
【0020】
再び
図1を参照すると、少なくともいくつかの実施形態において、ロードバランサノードレイヤにおけるロードバランサノード110は、ネットワーク上の1以上のルータ104からのクライアントトラフィック(パケット、例えば、TCPパケット)を受信して、ファブリック120上の分散型ロードバランサシステムによって使用されるプロトコル(例えば、ユーザ・データグラム・プロトコル(UDP))に従って、そのパケットをカプセル化する。次に、ロードバランサノードレイヤは、そのカプセル化されたパケットを宛先サーバノード130に対してファブリック120を介して転送する。各サーバノード130は、ロードバランサシステムの構成要素であるローカルモジュール132を含む。モジュール132は、ここにおいてはロードバランサモジュールまたは単にLBモジュールと称され、サーバノード130上のソフトウェア、ハードウェア、またはこれらの複合内に実装されてもよい。各サーバノード130において、それぞれのロードバランサモジュール132は、パケットをデカプセル化して、正常なTCP処理のためにローカルTCPスタックに対してTCPパケットを送信する。少なくともいくつかの実施形態において、ロードバランサノードレイヤは、すべてのクライアント−サーバTCPフローにおける状態情報を維持するが、しかし、ロードバランサノードレイヤにおけるロードバランサノード110は、TCPフローに関するいかなるものも解釈することはない。各フローは、それぞれのサーバノード130上のサーバ134とクライアント160との間で管理される。分散型ロードバランサシステムは、TCPパケットが正しい宛先サーバ134に到達することを保証する。各サーバノード130におけるロードバランサモジュール132は、それぞれのサーバ134がロードバランサノード110から受信したクライアント接続要求に応答する新たな接続を受諾するかまたは拒絶するかどうかについて決定を下す。
【0021】
少なくともいくつかの実施形態において、分散型ロードバランシングシステムは、コンシステントハッシュ法の技術を使用して、例えば、どのサーバノード130が特定のTCPパケットフローに対して責任を負うかについて、どのロードバランサノード110が記憶すべきかを決定する。コンシステントハッシュ法の技術を使用することにより、ロードバランサノードレイヤにおけるロードバランサノード110は、コンシステントハッシュリングとして見られ、ロードバランサノード110はそのリング内のメンバーシップを追跡し、コンシステントハッシュ法の機能に従って、特定のパケットフローに対して責任を負うそのリング内の特定のメンバーを決定する。少なくともいくつかの実施形態において、クライアント160とサーバ134との間における各パケットフローの追跡に対して責任を負う2つのロードバランサノード110が存在するが、これらのノード110は一次フロー追跡部(PFT)ノード及び二次フロー追跡部(SFT)ノードと称される。少なくともいくつかの実施形態において、一次フロー追跡部は、フローについてのコンシステントハッシュリング上の第1のロードバランサノード110であり、二次フロー追跡部は、一次フロー追跡部ノードとは異なる、コンシステントハッシュリング上の次のまたはそれに続くロードバランサノード110である。この配列において、一次フロー追跡部ノードに障害が生じた場合には、二次フロー追跡部ノードが新たな一次フロー追跡部になり、他のロードバランサノード110(例えば、コンシステントハッシュリング上の次のノード110)が二次フロー追跡部の役割を負う。少なくともいくつかの実施形態において、ロードバランサノード110は、所定のパケットフローに対する一次フロー追跡部及び二次フロー追跡部の両方としての機能を果たすことは許されないことに留意されたい。コンシステントハッシュリングにおけるこのメンバーシップの変更及び他のメンバーシップの変更については、本明細書において後述する。少なくともいくつかの実施形態において、ロードバランサの実装についての構成情報(例えば、現在実装されているロードバランサノード110及びサーバノード130の信頼できるリスト)は、分散型ロードバランシングシステムの構成サービス122の構成要素によって維持され、例えば、ファブリック120を介してロードバランサノード110に結合された1以上のサーバ装置上に実装されてもよい。
【0022】
少なくともいくつかの実施形態において、一次及び二次フロー追跡部ノードとして機能することに加えて、ロードバランサノード110はまた、所定のフローに対する2つの他の役割、すなわち、入口ノードの役割及び出口ノードの役割のうち1つを実行してもよい。パケットフローに対する入口ノードは、エッジルータ104からのそれぞれのパケットフローを受信して、サーバノード130上の選択されたサーバ134に対してファブリック120を介してそのパケットフローを(カプセル化されたパケットとして)転送するロードバランサノード110である。入口ノードは、実際のクライアントデータ(TCPデータパケット)をそれぞれの宛先サーバノード130に対して移動する唯一のロードバランサノード110である。入口ノードがクライアントトラフィックをどのロードバランサモジュール132に対して転送すべきかを知るように、その入口ノードは宛先サーバノード130上のそれぞれのロードバランサモジュール132に対するTCPフローのマッピングを維持する。出口ノードは、ファブリック120を介してサーバノード130から受信したパケットフローについての応答トラフィックを、境界ネットワークを介してそれぞれのクライアント160に転送することに対して責任を負うロードバランサノード110である。ロードバランサモジュール132は、サーバ134から得られた応答パケットをロードバランサプロトコル(例えば、UDP)に従ってカプセル化して、そのカプセル化された応答パケットをフローに対応するそれぞれの出口ノードにファブリック120を介して送信する。出口ノードは、ステートレスであり、単にパケットをデカプセル化し、境界ネットワーク上の応答パケット(例えば、TCPパケット)を境界ルータ102に送信して、それぞれのクライアント160に外部ネットワーク150を介して配信する。
【0023】
上記したように、少なくともいくつかの実施形態において、各ロードバランサノード110は、異なるパケットフローに対して入口ノード、出口ノード、及び/またはフロー追跡部ノード(一次または二次フロー追跡部のいずれかとして)の役割を実行する。ロードバランサノードレイヤにおける単一のロードバランサノード110は、ノードが処理しているパケットフローが何であるかに依存して、役割のいずれか1つを実行する。例えば、少なくともいくつかの実施形態において、ロードバランサノード110は、1つのパケットフローに対しては入口ノードとして、他のパケットフローに対しては一次もしくは二次フロー追跡部として、さらに他のパケットフローに対しては出口ノードとして実行してもよい。さらに、少なくともいくつかの実施形態において、ロードバランサノード110は、同一のパケットフローに対して例えば、所定のパケットフローに対して入口ノードとして且つ一次(または二次)フロー追跡部ノードとして多重の役割を実行する。しかしながら、少なくともいくつかの実施形態において、冗長性及び回復の目的のために、ロードバランサノード110は、同一のパケットフローに対して一次及び二次フロー追跡部ノードの両方としての役割を果たすことは許されない。
【0024】
各ロードバランサノード110が入口サーバ、出口サーバ、及びフロー追跡部の3つの役割のいずれかを果たす実施形態について、上記説明した。しかしながら、いくつかの実施形態においては、演算装置の異なるグループは、ロードバランシングシステムにおいて異なる役割を割り当てられてもよい。例えば、いくつかの実施形態においては、入口ノード、出口ノード、及びフロー追跡部ノードの各々が独立した演算装置に実装された異なる組み合わせが存在してもよい。いくつかの実施形態における他の実施例として、演算装置の1つの組み合わせは入口ノード及びフロー追跡部ノードの両方としての役割を果たし、その一方、演算装置の他の組み合わせは出口ノードのみとしての役割を果たす。
ロードバランサモジュール
【0025】
上記したように、各サーバノード130は、ロードバランサシステムの構成要素であるローカルロードバランサモジュール132を含む。モジュール132は、サーバノード130上でソフトウェア、ハードウェア、またはこれらの組み合わせの中に実装されてもよい。少なくともいくつかの実施形態において、サーバノード130上のロードバランサモジュール132は、3つの主な役割、すなわち、発信パケットのカプセル化及び着信パケットのデカプセル化、ノード130上のサーバ134に対するローカルロードバランシングの決定、及び接続公開を実行してもよい。これら3つの役割について以下に簡単に説明し、さらに詳細について本明細書において後述する。
【0026】
分散型ロードバランシングシステムの少なくともいくつかの実施形態において、TCP接続を終了させてはならず、且つ、パケットをスプーフしてはならない。ロードバランサノードレイヤによって送信されたすべてのパケットの送信元IPアドレス及び宛先IPアドレスは、パケットフローに含まれているエンドポイント(すなわち、クライアント160及びサーバ134)の実際のIPアドレスである。スプーフィングの代わりに、これらの実施形態は、ファブリック120上のロードバランサノード110及びサーバノード130の間で送信されるすべてのパケットを、例えば、UDPパケットとしてカプセル化する。フローに対して入口ノードとして機能するロードバランサノード110からサーバノード130に到着するパケットフロー内のインバウンドパケットは、ロードバランサノード110によってカプセル化されるので、そのパケットはデカプセル化され、且つ、ノード130上のサーバ134に対するローカルホストTCPフローに対してリダイレクトされる必要がある。ノード130上のロードバランサモジュール132は、このデカプセル化を実行する。同様に、サーバ134からのパケットフローにおける発信パケットは、ロードバランサモジュール132によってカプセル化され、ファブリック120を介して、パケットフローにおける出口ノードとして機能するロードバランサノード110に送信される。
【0027】
少なくともいくつかの実施形態において、サーバノード130上のロードバランサモジュール132もまた、それぞれのサーバノード130上のサーバ134に対するロードバランシングに関連するローカルな決定を下す。特に、ノード130上のロードバランサモジュール132は、新たなTCP接続のための要求の受信に応答して他のTCPフローをそれぞれのサーバ134が受諾するかどうかを決定する。上記したように、ロードバランサノード110はロードバランサモジュール132に送信されるすべてのパケットをカプセル化するので、ロードバランサモジュール132は実際にはクライアント160からのTCP同期(SYN)パケットを受信しない。その代わりに、ロードバランサモジュール132は、ロードバランサモジュール132が受諾または拒絶のいずれかが可能なフロー追跡部116からのカプセル化プロトコル(例えば、UDP)に従って、接続要求メッセージを受信する。ロードバランサモジュール132が接続要求メッセージを受諾した場合には、ロードバランサモジュール132はローカルホスト宛てのSYNパケットを生成する。ローカルホストが接続を受諾した場合には、これはそれぞれのクライアント接続を取り扱う実際のTCPスタックになる。
【0028】
少なくともいくつかの実施形態において、接続要求メッセージを受諾すべきかどうかについて決定を下すために、ロードバランサモジュール132は、サーバノード130上の現在の資源使用量に関する1以上のメトリクスを観察し、新たな接続を取り扱うのに使用できる十分な資源が存在する場合には、ロードバランサモジュール132はその接続を受諾する。少なくともいくつかの実施形態において、ロードバランサモジュール132によって判断された資源のメトリクスは、1以上のCPUの使用、直前の帯域幅の使用量、及び確立された接続数を含んでもよいが、これらには限定されない。いくつかの実施形態においては、これらのメトリクスの代わりにまたはこれらのメトリクスに加えて、他のメトリクスが検討できる。例えば、いくつかの実施形態において、ロードバランサモジュールは、サーバの待ち時間(すなわち、サーバ接続の未処理分の中で使われている時間要求の量)をメトリックとして判断し、サーバの待ち時間が閾値を超えている場合には、接続要求を拒絶する。これらのメトリクス及びまたは他のメトリクスを使用することで、ロードバランサモジュール132は、それぞれのサーバ134に対して、そのサーバ134が新たなパケットフローを受諾すべきかまたは拒絶すべきかどうか決定できる。少なくともいくつかの実施形態において、資源の利用率(例えば、N%の利用率)は、単独にまたは組み合わせて、且つ、閾値(例えば、90%の利用率)と比較されたメトリクスから決定されてもよい。決定された資源の利用率が、閾値以上である場合、あるいは、これから追加される接続が閾値を超える利用率に移行するおそれがある場合には、接続要求は拒絶される。
【0029】
少なくともいくつかの実施形態において、ロードバランサモジュール132は、接続要求メッセージが拒絶されるかどうかを判定するために、確率論的方法を実施してもよい。上記したように、資源の利用率が閾値以上である場合にすべての接続要求を拒絶する代わりに、この方法は、2以上の異なる利用のレベルにおいて異なる確率で接続要求を拒絶してもよい。例えば、資源の利用が80%である場合には、ロードバランサモジュール132は20%の確率で接続要求を拒絶し、資源の利用が90%である場合には、ロードバランサモジュール132は25%の確率で接続要求を拒絶し、資源の利用が95%である場合には、ロードバランサモジュール132は50%の確率で接続要求を拒絶し、98%以上である場合には、ロードバランサモジュール132はすべての接続要求を拒絶する。
【0030】
少なくともいくつかの実施形態において、各接続要求メッセージは、ロードバランサモジュール132によって接続要求メッセージがこれまで何回拒絶されたかの指示を含んでもよい。ロードバランサモジュール130によって受信された接続要求メッセージが、閾値の回数を超えて拒絶されたことを示す場合には、ロードバランサモジュール130は、サーバノード130の性能メトリクスがたとえ接続要求を拒絶すべきであることを示す場合であっても、接続を受諾してもよい。
【0031】
場合によっては、接続要求メッセージを送信されたロードバランサモジュール132のすべてが接続要求を拒絶する可能性もある。少なくともいくつかの実施形態において、接続要求メッセージが無期限にロードバランサモジュール132からロードバランサモジュール132に戻されることを回避するために、各接続要求メッセージに生存時間が与えられてもよい。この生存時間が切れたときは、フロー追跡部ノードは、要求を終結し、現在は要求に対応できないことをそれぞれのクライアント160に通知することができる。
【0032】
少なくともいくつかの実施形態において、サーバノード130上のロードバランサモジュール132もまた、ロードバランサノード110に対して接続公開を実行する。少なくともいくつかの実施形態において、接続公開を実行するために、定期的(例えば、1秒に1回)または不定期に、各ロードバランサモジュール132は、サーバノード130上のルーティングテーブル(例えば、netstatルーティングテーブル)を観察し、アクティブな接続(TCPフロー)のリストを公開してロードバランサノード110に戻す。所定のパケットフローの存在について情報を必要とするロードバランサノード110は、それぞれのパケットフローに対して入口ノードとして且つ一次及び二次フロー追跡部としての役割を果たすロードバランサノード110である。いくつかの実施形態においては、ロードバランサモジュール132は、コンシステントハッシュ法の技法を用いて、サーバノード130上のアクティブなTCPフローについて情報を必要とするロードバランサノード110のリストをフィルタリングする。例えば、ロードバランサモジュール132は、コンシステントハッシュリングに従って所定のパケットフローに対して一次及び二次フロー追跡部としての役割を果たすのがどのロードバランサノード110であるかを判定することができる。いくつかの実施形態において、ロードバランサモジュール132は、各パケットフローについてロードバランサモジュール132にデータパケットを最後に送信したのがどのロードバランサノード110であるかを追跡し、この情報を用いてパケットフローに対して入口ノードとして対応しているのがどのロードバランサノード110であるかを追跡するが、それは入口ノードのみがクライアントデータをロードバランサモジュール132に転送するからである。いくつかの実施形態において、ロードバランサモジュール132は、次に、パケットフローについて情報を必要とすることを決定したロードバランサノード110の各々に関するメッセージを公式化し、そのメッセージをロードバランサノード110に送信し、それぞれのサーバノード130がクライアント160に対する接続をまだ維持していることをノード110に通知する。ロードバランサモジュール132によるロードバランサノード110へのこの接続公開は、ロードバランサノード110におけるリースの延長と見なされてもよい。ロードバランサノード110が、一定の期間(例えば、10秒)内の特定のパケットフローを示す接続公開メッセージを受信しなかった場合には、ロードバランサノード110は、解放されてそれぞれのパケットフローのことを忘れる。
ロードバランサノードに対するマルチパス・ルーティング
【0033】
図4は、少なくともいくつかの実施形態において、分散型ロードバランサにおけるルーティング及びパケットフローの態様を示す。少なくともいくつかの実施形態において、各入口ノード(入口ノードは、
図4においては入口サーバ112として示さる)は、1以上の公開エンドポイント(例えば、IPアドレス及びポート)にルーティングできる自分の能力を、例えば、境界ゲートウェイ・プロトコル(BGP)を経由して、分散型ロードバランサに関するエッジルータ104に広告する。少なくともいくつかの実施形態においては、各入口ノードがBGPセッション経由でエッジルータ104に自身を広告するというよりむしろ、
図5に示されるように、1以上の他の入口ノード、例えば、2つの隣接するノードが、エッジルータ104とBGPセッションを確立して当該入口ノードを広告する。
【0034】
従来のロードバランサは、通常、単一の公開エンドポイントの役割を果たすことのみができる。反対に、分散型ロードバランサの実施形態によって、多数のロードバランサノード110が単一の公開エンドポイントの役割を果たすことを可能にする。ルータの能力に依存するならば、このことにより、すべての入口サーバ112に対してルーティングされた単一のパブリックIPアドレスが、エッジルータ104を介して全体の帯域幅(例えば、160Gbps)を取り扱うことができる構成を可能にする。少なくともいくつかの実施形態において、このことを遂行するために、エッジルータ104は、レイヤ4のフロー単位ハッシュ化マルチパス・ルーティング技法、例えば、等価マルチパス(ECMP)ルーティング技法を利用して、各々が同一のパブリックIPアドレスを広告する多数の入口サーバ112の全体に亘ってトラフィックを分散する。エッジルータ104のフローハッシュの部分として、フローに対するレイヤ4の送信元ポート及び宛先ポートを使用して、入口サーバ112のすべてに対して着信パケットを分散することにより、一般的には、入口サーバ112として機能している同一のロードバランサノード110にルーティングされた各接続のためにパケットを保持して、パケットが順序から外れるのを回避する。しかしながら、いくつかの実施形態においては、エッジルータ104は、他の技法を使用して入口サーバ112の全体に亘ってトラフィックを分散することに留意されたい。
【0035】
図4もまた、ネットワーク100上に実装される2以上の分散型ロードバランサを示す。2以上の分散型ロードバランサは、各々が複数のサーバ130に対応するとともに、各々が異なるパブリックIPアドレスを広告する独立したロードバランサとして各々が行動し、あるいは、
図4に示されるように、2以上の分散型ロードバランサが、各々同一のIPアドレスを広告し、ハッシュ法の技法(例えば、レイヤ4のフロー単位ハッシュ化マルチパス・ルーティング技法)が境界ルータ102において使用されて、パケットフローをエッジルータ104に区分し、そして今度は、エッジルータ104がパケットフローを対応するそれぞれの入口サーバ112に分散する。
【0036】
図5は、少なくともいくつかの実施形態において、入口ノードをエッジルータに広告するために境界ゲートウェイ・プロトコル(BGP)を使用することを示す。この実施例において、ロードバランサ実装の中に、入口ノード110Aないし110Dとしての役割を果たす4つのロードバランサノードがある。エッジルータ104は、クライアント(図示せず)からの着信パケットをロードバランサノード110にルーティングする。少なくともいくつかの実施形態において、エッジルータ104は、レイヤ4のフロー単位ハッシュ化マルチパス・ルーティング技法、例えば、等価マルチパス(ECMP)ルーティング技法に従って、ルーティングの決定を下す。
【0037】
少なくともいくつかの実施形態において、エッジルータ104は、入口ノード110によって開始されたセッションを広告する境界ゲートウェイ・プロトコル(BGP)技術を介して、ロードバランサ実装の中でクライアントトラフィックを受信するために現在使用できる入口ノード110について学習する。各入口ノード110は、エッジルータ104に対して自身を広告するためにBGPを使用することができる。しかしながら、BGPは、一般に、収束するのに比較的長い時間(3秒以上)がかかる。各入口ノード110がBGPを介して自身を広告する際にこの技法を使用すると、入口ノード110がダウンに至る場合には、エッジルータ104上でのBGPセッションがネットワーキングの期間の中では相当な時間(3秒以上)を要して時間切れになるので、エッジルータ104は障害閉鎖について学習する結果になり、現在のTCPフローを入口ノード110に再びルーティングすることになる。
【0038】
BGPに伴う収束の問題を回避するため、且つ、ノード110を障害からより迅速に回復させるために、少なくともいくつかの実施形態においては、入口ノード110がBGPセッションを介してエッジルータ104に自身を広告する代わりに、ロードバランサ実装の中で少なくとも1つの他の入口ノード110が、BGPを介してエッジルータ104に対して入口ノード110を広告するための責任を負う。例えば、
図5に示すようないくつかの実施形態において、所定の入口ノード110の左右の隣接する入口ノード110、例えば、ノード110の順序リストの左右の隣接物、例えば、ノード110によって形成されたコンシステントハッシュリングが、当該所定の入口ノード110をエッジルータ104に対して広告してもよい。例えば、
図5において、入口ノード110Aは入口ノード110B及び110Dを広告し、入口ノード110Bは入口ノード110A及び110Cを広告し、入口ノード110Cは入口ノード110B及び110Dを広告し、そして入口ノード110Dは入口ノード110C及び110Aを広告する。入口ノード110は、本明細書において後述するように、お互いの健康をチェックし且つ喧伝する。上記したようにヘルスチェック方法を使用すれば、不健康なノードを検出することができ、且つ、その情報を1秒未満、例えば、100ミリ秒(ms)でノード110の間に伝達することができる。ある入口ノード110が健康でないと決定されると、その不健康な入口ノードを広告する入口ノード110は、直ちにその不健康なノード110の広告を停止する。少なくともいくつかの実施形態において、入口ノード110は、BGPセッションについてのTCP Closeメッセージまたは同様のメッセージをエッジルータ104に送信することによって、エッジルータ104との間のBGPセッションを終了する。このように、ノード110の障害を検出するために、障害のある入口ノード110によって確立されたBGPセッションが時間切れになるのを待つのではなく、障害のある入口ノード110の代理として広告する他の入口ノード110が、当該ノード110が不健康であることを検出したことで、エッジルータ104との間で当該入口ノード110を広告するBGPセッションを終了するときに、エッジルータ104は障害のあるノード110を発見する。ロードバランサノードの障害を取り扱うことについては、
図18A及び18Bに関連して、本明細書においてさらに説明する。
【0039】
図6は、分散型ロードバランシングシステムの少なくともいくつかの実施形態において、マルチパス・ルーティング方法のフローチャートである。900に示されるように、ロードバランサ実装の中の入口ノード110は、それらに隣接するノード110をエッジルータ104に広告する。少なくともいくつかの実施形態において、入口ノード110は、コンシステントハッシュリングなどのノード110の順序リストに従って、それらに隣接するノード110を決定する。少なくともいくつかの実施形態において、入口ノード110は、各々の広告されたノード110に対応してエッジルータ104に対して確立された1つのBGPセッションと共に、BGPセッションを使用して、それらに隣接するノード110をエッジルータ104に対して広告する。
【0040】
902に示されるように、エッジルータ104は、フロー単位ハッシュ化マルチパス・ルーティング技法、例えば、等価マルチパス(ECMP)ルーティング技法に従って、クライアント160から受信されたトラフィックをアクティブな(広告された)入口ノード110に分散する。少なくともいくつかの実施形態において、エッジルータ104は、パブリックIPアドレスをクライアント160に公表し、入口ノード110は、同一のパブリックIPアドレスをエッジルータ104にすべて広告する。エッジルータは、レイヤ4の送信元ポート及び宛先ポートをエッジルータ104のフローハッシュの部分として使用して、着信パケットを入口ノード110の中に分散する。このことにより、通常、同一の入口ノード110に対してルーティングされた各接続に関するパケットを保持することになる。
【0041】
902に示されるように、入口ノードは、データフローを目標のサーバノード130に転送する。少なくともいくつかの実施形態において、入口ノード110は、そのデータフローについて一次及び二次フロー追跡部ノードと対話して、そのデータフローを目標のサーバノード130にマッピングする。したがって、各々の入口ノード110は、受信されたパケットを適切に目標のサーバノード130に対して転送するために使用されるノード110を介して、アクティブなデータフローのマッピングを維持する。
【0042】
906から910までの要素は、入口ノード110の障害を検出すること及びそこから回復することに関する。906に示されるように、入口ノード110は、例えば本明細書に記載されているヘルスチェック技法に従って、入口ノード110がダウンしたことを検出する。ノード110のダウンが検出されると、その隣接ノード110はエッジルータ104に対する広告を停止する。少なくともいくつかの実施形態において、このことは、それぞれのBGPセッションにおいてエッジルータ104に対してTCP Closeを送信することを含む。
【0043】
908に示されるように、エッジルータ104は、BGPセッションの終了によって入口ノード110がダウンしたことを検出すると、フロー単位ハッシュ化マルチパス・ルーティング技法に従って、クライアント160からの着信トラフィックを残りの入口ノード110に対して再分散する。したがって、少なくともいくつかのデータフローは、異なる入口ノード110に対してルーティングされる。
【0044】
910に示されるように、入口ノード110は、必要に応じてマッピングを回復し、且つそのデータフローを適切な目標のサーバノードに転送する。入口ノード110上でノード110の障害から回復するための方法については、本明細書の他のところで説明する。1つの実施例として、入口ノード110は、現在のマッピングの対象ではないパケットを受信したときは、コンシステントハッシュリングに従ってコンシステントハッシュ機能を用いて、データフローに対応するフロー追跡部ノードを決定して、当該フロー追跡部ノードからマッピングを回復する。
非対称のパケットフロー
【0045】
少なくともいくつかの実施形態において、インバウンドデータに対するアウトバウンドトラフィックの比率が1より大きい場合に、入口ノードの帯域幅とCPUの使用を効率的に利用するために、分散型ロードバランシングシステムは、
図7に示されるように、サーバノード130からのアウトバウンドパケットを多数の出口ノードに転送する。少なくともいくつかの実施形態において、それぞれのサーバノード130上のロードバランサモジュール132は、各接続に対して、クライアントのエンドポイント/公開エンドポイントタプルをハッシュ化し、且つ、コンシステントハッシュアルゴリズムを使用して、それぞれのアウトバウンドパケットフローに対して出口サーバ114としての機能を果たすロードバランサノード110を選択する。しかしながら、いくつかの実施形態においては、接続に対する出口サーバ114を選択するために他の方法及び/またはデータが使用される。選択された出口サーバ114は、通常、接続に対する入口サーバ112としての機能を果たすロードバランサノード110とは異なるロードバランサノード110であるが、必ずしも必須でない。少なくともいくつかの実施形態においては、そのようなロードバランサノード110/出口サーバ114の障害が存在する場合を除いて、特定の接続に対するアウトバウンドパケットのすべては、パケットの乱れを避けるために、同一の出口サーバ114に対して転送される。
【0046】
少なくともいくつかの実施形態において、出口サーバ114を選択するためにサーバノード130によって使用される方法及びデータは、エッジルータ104によって実行される入口サーバ112を選択するために使用される方法及びデータとは異なる。異なる方法及びデータを使用すると、一般的には、その接続に対する入口ノードとして選択されたロードバランサノード110ではなく、ある所定の接続に対する出口ノードとして選択されている異なるロードバランサノード110を生じる結果となり、入口ノードとしての機能を果たす単一のロードバランサノード110を通る接続についての発信トラフィックを取り扱うべき出口ノードとして選択されている多数のロードバランサノード110を生じる結果にもなる。
【0047】
少なくともいくつかの実施形態において、
図7は、非対称のパケットフローをグラフィカルに示す。少なくとも1つの接続が、外部ネットワーク150上のクライアント160からサーバノード130A、130B、130C、及び130Dの各々まで、入口サーバ112を介して確立されている。少なくともいくつかの実施形態において、接続に対応する出口ノードを選択するために、各接続について、それぞれのサーバノード130上のロードバランサモジュール132は、クライアントのエンドポイント/公開エンドポイントタプルをハッシュ化し、且つ、コンシステントハッシュアルゴリズムを使用してそれぞれのアウトバウンドパケットフローに対して出口サーバ114としての機能を果たすロードバランサノード110を選択する。例えば、サーバノード130Aは接続に対する出口サーバ114Aを選択しており、サーバノード130Bは1つの接続に対する出口サーバ114A及び他の接続に対する出口サーバ114Bを選択している。しかしながら、いくつかの実施形態においては、接続に対する出口ノードを選択するために、他の方法及び/またはデータが使用される。
クライアント接続を欠落せずにロードバランサノード障害から回復する
【0048】
クライアントトラフィックを受信すべきサーバノード130をどれにするか決定するために、ロードバランサノード110がコンシステントハッシュ法を使用することが可能である一方で、いくつかの接続の長い寿命のために、新たなサーバノード130がコンシステントハッシュのメンバーシップに加わる場合や、その後の入口のロードバランサノード110障害が存在する場合には、この方法は存在しているフローを維持することができない。このシナリオにおいて、障害が発生したノード110からフローを引き継ぐロードバランサノード110は、異なるメンバーシップを持つことになるサーバ130に対するコンシステントハッシュリングとして選択された元のマッピングを決定することができない。このため、少なくともいくつかの実施形態においては、ロードバランサノード110によって分散型ハッシュテーブル(DHT)技術が使用されて、接続に対するサーバノード130を選択し、且つ、その選択されたサーバノード130に対してパケットをルーティングする。DHTに従って、特定の接続を受信するために一旦サーバノード130が選択されると、そのサーバノード130が健康のままでいて、且つ、(例えば、接続公開によって)DHTへのそのようなアクティブな接続の状態を定期的に送信することによって、サーバノード130上のロードバランサモジュール132がリースの延長を継続すると仮定した場合、DHTは、その接続が完了するまでそのマッピングを保持することになる。入口ノード110の障害が、エッジルータ104から残りのロードバランサノード110に対するパケットの分散に衝撃を与えると、そのロードバランサノード110は異なる組み合わせのクライアント接続からトラフィックを受信する結果になる。しかしながら、DHTはすべてのアクティブな接続を追跡するので、ロードバランサノード110はDHTに問い合わせを行って任意のアクティブなマッピングに関するリースを取得することができる。その結果、すべてのロードバランサノード110は、正しいサーバノード130に対してトラフィックを渡すので、入口ロードバランサノード110に障害が発生する事態があっても、アクティブなクライアント接続の障害を回避する。
分散型ロードバランシングシステムにおけるパケットフロー
【0049】
図8は、少なくともいくつかの実施形態において、分散型ロードバランシングシステムにおけるパケットフローを示す。
図8における矢印付きの実線はTCPパケットを表わし、一方、矢印付きの点線はUDPパケットを表わすことに留意されたい。
図8において、入口サーバ112は、エッジルータ104を介して、1以上のクライアント160からのTCPパケットを受信する。TCPパケットを受信すると、入口サーバ112は、サーバノード130へのTCPパケットフローに対応するマッピングを自身が持っているかどうかを判定する。入口サーバ112が、TCPパケットフローに対応するマッピングを有する場合には、サーバ112は、そのTCPパケットを(例えば、UDPに従って)カプセル化して、そのカプセル化されたパケットを目標のサーバノード130に送信する。入口サーバ112が、TCPパケットフローに対応するマッピングを持たない場合には、入口サーバ112は、TCPパケットから抽出されたTCPパケットフローに関する情報を含むUDPメッセージを一次フロー追跡部116Aに送信して、サーバノード130に対する接続を確立し、及び/または、TCPパケットについてのマッピングを取得する。
図9A、9B、及び
図10Aないし10Gは、クライアント160とサーバノード130との間における接続を確立する方法を示す。サーバノード130上のロードバランサモジュール132は、サーバノード130上のTCP接続に対する出口サーバ114としての機能を果たすロードバランサノード110をランダムに選択し、且つ、出口サーバ114を介して、UDPカプセル化されたTCP応答パケットをクライアント160に送信する。
【0050】
図9A及び9Bは、少なくともいくつかの実施形態において、分散型ロードバランシングシステムにおける接続が確立した場合のパケットフローのフローチャートを提供する。
図9Aの200に示されるように、入口サーバ112は、エッジルータ104を介して、クライアント160からTCPパケットを受信する。202において、入口サーバ112が、サーバノード130へのTCPフローに対応するマッピングを有する場合には、204に示されるように、入口サーバ112は、TCPパケットをカプセル化して、それぞれのサーバノード130に送信する。入口サーバ112は、1、2または3以上のクライアント160からの1、2または3以上のTCPフローを連続的に受信し且つ処理することに留意されたい。
【0051】
202において、入口サーバ112が、TCPパケットフローに対応するマッピングを持たない場合には、そのパケットは、クライアント160からのTCP同期(SYN)パケットである。206に示されるように、SYNパケットを受信すると、入口サーバ112は、そのSYNパケットからデータを抽出して、そのデータを、例えばUDPメッセージの中で、一次フロー追跡部116Aに転送する。少なくともいくつかの実施形態において、入口サーバ112は、コンシステントハッシュ機能に従って、TCPフローに対する一次フロー追跡部116A及び/または二次フロー追跡部116Bを決定できる。208において、一次フロー追跡部116Aは、そのデータを例えばハッシュテーブルの中に記憶し、TCP接続のサーバノード130側に対する最初のTCPシーケンス番号を生成し、そのデータ及びTCPシーケンス番号を二次フロー追跡部116Bに転送する。210において、二次フロー追跡部116Bもまた、そのデータを記憶するとともに、SYN/ACKパケットを作成し且つクライアント160に送信するが、そのSYN/ACKパケットには少なくともTCPシーケンス番号が含まれている。
【0052】
212に示されるように、入口サーバ112は、エッジルータ104を介して、クライアント160からのTCP確認(ACK)を受信する。入口ノード112は、その時点において、サーバノード130に対するTCPフローに対応するマッピングを持たないので、214において、入口サーバ112は、そのACKパケットから抽出されたデータを含むメッセージを一次フロー追跡部116Aに送信する。216に示されるように、一次フロー追跡部116Aは、そのメッセージを受信すると、記憶されているデータに従ってTCPフローを確認し、ACKパケットからの承認されたシーケンス番号(+1)がSYN/ACKの中で送信された値と一致することを確認する。次に、一次フロー追跡部116Aは、TCPフローを受信するサーバノード130を選択し、データ、TCPシーケンス番号、及び選択されたサーバノード130上のローカルロードバランサモジュール132のIPアドレスを含むメッセージを二次フロー追跡部116Bに送信する。218に示されるように、二次フロー追跡部116Bもまた、データ及びTCPシーケンス番号を確認し、SYNメッセージを作成し、その作成されたSYNメッセージを、選択されたサーバノード130上のローカルロードバランサモジュール132に送信する。その方法は、
図9Bの要素220において続く。
【0053】
図9Bの220に示されるように、ロードバランサモジュール132は、作成されたSYNメッセージに応答して、サーバノード130の1以上のメトリクスを調べて、サーバノード130が接続を受諾することができるかどうかを判定する。222において、ロードバランサモジュール132は、当該サーバノード130が現在においては接続を受諾することができないと判定した場合には、224において、ロードバランサモジュール132は二次フロー追跡部116Bに伝達する。二次フロー追跡部116Bは、以前に記憶したフローに関する情報を消去する。226において、二次フロー追跡部116Bは、一次フロー追跡部116Aに伝達する。
図9Aの216に示されるように、一次フロー追跡部116Aは、その後、新たな目標のサーバノード130を選択して、二次フロー追跡部116Bに伝達する。
【0054】
222において、ロードバランサモジュール132は、サーバノード130が接続を受諾できると判定した場合には、
図9Bの228に示されるように、ロードバランサモジュール132は、作成されたSYNからTCP SYNパケットを構成して、サーバノード130上のサーバ134にそのTCP SYNパケットを送信する。TCP SYNパケットの送信元IPアドレスは、サーバ134がクライアント160に対する直接のTCP接続を受信したことを確信するように、クライアント160の実際のIPアドレスが追加される。ロードバランサモジュール132は、TCPフローについて関連する細部を例えばローカルハッシュテーブルの中に記憶する。230に示されるように、サーバ134は、ロードバランサモジュール132が中断するSYN/ACKパケットに応答する。232に示されるように、ロードバランサモジュール132は次に、接続情報を含むメッセージを二次フロー追跡部116Bに送信して、接続が受諾されたことを知らせる。二次フロー追跡部116Bは、このメッセージを受信すると、234において、サーバ134に対するマッピングを記録し、同様のメッセージを一次フロー追跡部116Aに送信し、一次フロー追跡部116Aもまた、そのマッピング情報を記録する。236に示されるように、一次フロー追跡部116Aは次に、入口サーバ112に対してマッピングメッセージを転送する。入口サーバ112は、この後からは、クライアント160からサーバ130へのTCPフローに対応するマッピングを有することになる。
【0055】
238において、入口サーバ112は、データフローのために任意にバッファリングされたデータパケットをカプセル化して、サーバノード130上のローカルロードバランサモジュール132に対して転送する。入口サーバ112によって受信されたクライアント160からのデータフローのための追加の着信パケットは、カプセル化されて、ロードバランサモジュール132に対して直接に転送され、ロードバランサモジュール132は、そのパケットをデカプセル化して、サーバ134にデータパケットを送信する。
【0056】
240において、ロードバランサモジュール132は、データフローに対応する出口サーバ114をランダムに選択する。サーバ134からのアウトバウンドTCPパケットは、ロードバランサモジュール132によって中断され、UDPに従ってカプセル化され、任意に選択された出口サーバ114に転送される。出口サーバ114は、その発信パケットをデカプセル化して、そのTCPパケットをクライアント160に送信する。
【0057】
上記したように、202において、入口サーバ112が、受信されたパケットのTCPフローに対応するマッピングを持たない場合には、そのパケットは、クライアント160からのTCP同期(SYN)パケットである。しかしながら、そのパケットは、TCP SYNパケットではない。例えば、ロードバランサノード110の追加または障害のせいで、ロードバランサノード110のメンバーシップが変化した場合には、エッジルータ104は、マッピングを持たない入口サーバ112に対して、1以上のTCPフローに対応するパケットのルーティングを開始する。少なくともいくつかの実施形態において、対応するマッピングを持たない入口サーバ112がこのようなパケットを受信すると、その入口サーバ112は、コンシステントハッシュ機能を用いて、コンシステントハッシュリングに従ってTCPフローに対応する一次フロー追跡部116A及び/または二次フロー追跡部116Bを決定し、一次フロー追跡部116Aまたは二次フロー追跡部116Bのいずれかに伝達してマッピングを要求する。入口サーバ112は、フロー追跡部116からTCPフローに対応するマッピングを受信すると、そのマッピングを記憶して、TCPフローに対応するTCPパケットのカプセル化及び正しい宛先サーバノード130に対する転送を開始することができる。
ロードバランサノードの細部
【0058】
少なくともいくつかの実施形態において、ロードバランサノード110の各々は3つの役割を持つ。
● 入口−クライアント接続においてクライアント160からすべての着信パケットを受信すること、マッピングが分かっている場合にサーバノード130にパケットをルーティングすること、またはマッピングが分かっていない場合にフロー追跡部に伝達すること。入力ノードからの発信パケットは、入口ノードによって(例えば、UDPに従って)カプセル化される。
● フロー追跡処理−接続状態(例えば、どのサーバノード130/サーバ134が各クライアント接続を提供するために割り当てられているか)の記録をつけること。フロー追跡部もまた、クライアント160とサーバ134との間の接続を確立することに参加する。
● 出口−サーバ134から受信されたアウトバウンドパケットをデカプセル化すること及びクライアント160に転送すること。
【0059】
少なくともいくつかの実施形態において、入口の役割の中で、ロードバランサノード110は、クライアントからサーバへのマッピングが分かっている場合には、サーバ134に対してパケットを転送する役割を担い、または、マッピングが分かっていない場合には、フロー追跡部に対して要求を転送する役割を担う。特定のクライアント接続/データフローについて入口ノードとしての機能を果たしているロードバランサノード110は、クライアント接続に対して、一次フロー追跡部または二次フロー追跡部のいずれとしての機能も果たすが、両方としての機能を果たすことはない。
【0060】
少なくともいくつかの実施形態において、フロー追跡部の役割の中で、ロードバランサノード110は、確立された接続に対応するクライアントからサーバへのマッピングを維持する役割を担うだけでなく、引き続き確立されている接続の状態を維持する役割をも担う。2つのフロー追跡部は、各々が個別のクライアント接続にかかわり、一次フロー追跡部及び二次フロー追跡部と称される。少なくともいくつかの実施形態において、クライアント接続に関連するフロー追跡部は、コンシステントハッシュアルゴリズムを用いて決定される。フロー追跡部もまた、新たなクライアント接続の各々に対応するサーバノード130を擬似ランダムに選択することを含むロードバランシングの機能を実行するが、これに限定されるものではない。選択されたサーバノード130上のローカルロードバランサモジュール132は、サーバ134が接続を取り扱うことができないと判定した場合には、接続要求を拒絶する。このことが起こった場合には、フロー追跡部は、他のサーバノード130を選択して、他のサーバノード130に対して接続要求を送信する。少なくともいくつかの実施形態において、所定の接続に対する一次フロー追跡部の役割及び二次フロー追跡部の役割は、異なるロードバランサノード110によって実行される。
【0061】
少なくともいくつかの実施形態において、出口の役割の中で、ロードバランサノード110は、ステートレスであり、サーバノード130から受信された着信パケットをデカプセル化し、いくつかの確認を実行し、それぞれのクライアント160に対してアウトバウンドTCPパケットを転送する。少なくともいくつかの実施形態において、サーバノード130上のローカルロードバランサモジュール132は、所定の接続に対応するロードバランサノード110を任意に選択する。
ロードバランサノードのコンシステントハッシュリング接続形態
【0062】
少なくともいくつかの実施形態において、ロードバランサノード110は、入力キー空間(クライアントエンドポイント、公開エンドポイント)のコンシステントハッシュ法に基づいてリング接続形態を形成する。その入力キー空間は、使用できるフロー追跡部ノードの間で分割され、すべてのフロー追跡部ノードは、そのキー空間に対応する問い合わせに答える義務を負う。少なくともいくつかの実施形態において、データは、コンシステントハッシュリングにおける後続(例えば、コンシステントハッシュリングにおいて、二次フロー追跡部ノードは、一次フロー追跡部ノードの後続ノードまたは次のノード)に基づいて、一次及び二次フロー追跡部ノードに対して複製される。フロー追跡部ノードがなんらかの理由でダウンに至る場合には、コンシステントハッシュリングにおける次のロードバランサノードは、障害が発生したノードのキー空間を要求する。新たなフロー追跡部ノードが加わった場合には、他のロードバランサノードがロードバランサ実装の中で、したがってコンシステントハッシュリングの中で、構成変更について学習するように、そのノードは自分のエンドポイントを(例えば、
図1に示されるような構成サービス122により)記録する。フロー追跡部の追加及び障害を取り扱うことについては、
図11Aないし11Dを参照して、さらに詳細に説明する。
入口ノード対フロー追跡部ノードの通信
【0063】
少なくともいくつかの実施形態において、入口ノードとしての機能を果たしているロードバランサノード110は、フロー追跡部ノードとしての機能を果たしているロードバランサノード110について構成サービス122から学習する。入口ノードは、ロードバランサ実装の中で、したがってコンシステントハッシュリングの中で、メンバーシップの変化について、構成サービス122を監視する。入口ノードは、その入口ノードが対応するマッピングを持たないクライアント160からパケットを受信したときは、その入口ノードは、コンシステントハッシュ機能を用いて、パケットにサービスすべきフロー追跡部ノードをどれにするかを決定する。少なくともいくつかの実施形態において、ハッシュ機能への入力は、パケットからの対(クライアントエンドポイント、公開エンドポイント)である。少なくともいくつかの実施形態において、入口ノード及びフロー追跡部ノードは、UDPメッセージを用いて通信する。
【0064】
一次フロー追跡部ノードが新たなパケットフローについて入口ノードからメッセージを受信した場合には、その一次フロー追跡部ノードは、TCPシーケンス番号をランダムに決定して、他のメッセージを二次フロー追跡部ノードに転送する。二次フロー追跡部ノードは、クライアントに対応するTCP SYN/ACKメッセージを生成する。両方のフロー追跡部は、クライアント接続のエンドポイント対及びTCPシーケンス番号を記憶し、メモリの圧迫または有効期限切れが原因で状態が除去されるまでは、この情報を保持する。
【0065】
一次フロー追跡部ノードが、TCP ACKパケットを受信した入口ノードからメッセージを受信した場合には、その一次フロー追跡部ノードは、承認されたTCPシーケンス番号が、SYN/ACKパケットの中で送信されて記憶された値と一致することを検証し、要求にサービスすべきサーバノード130を選択し、二次フロー追跡部ノードに対してメッセージを転送する。二次フロー追跡部ノードは、その選択されたサーバノード130上のロードバランサモジュール132に対してメッセージを送信して、サーバノード130上のTCPスタックによって実際のTCP接続を開始し、次にサーバノード130からの承認応答を待つ。
【0066】
二次フロー追跡部ノードが、サーバノード130上のロードバランサモジュール132から接続承認を受信した場合には、一次フロー追跡部を通って入口ノードに至り、両方のノードにおいて関連するサーバノード130に関する情報を記憶する折り返しメッセージフローが起動される。このポイントの転送から、入口ノードにおいて受信された追加のTCPパケットは、サーバノード130上のロードバランサモジュール132に直接に転送される。
ロードバランサモジュール対ロードバランサノードの通信
【0067】
少なくともいくつかの実施形態において、すべてのロードバランサモジュール132は、自分のエンドポイントを構成サービス122によって記録し、ロードバランサノードのレイヤにおいて、メンバーシップの変化について連続的に構成サービス122を監視する。少なくともいくつかの実施形態において、ロードバランサモジュール132の機能について、以下説明する。
● 接続公開−定期的に(例えば、1秒ごとに)または不定期に、それぞれのサー バノード130上のアクティブな接続の組み合わせ(クライアントエンドポイント、パブリックエンドポイント)を、これらの接続に対応するロードバランサモジュール132に対して最後にパケットを送信した入口ノードに対してだけでなく、これらの接続について責任を負う一次及び二次フロー追跡部ノードの両方に対しても公開する。接続公開の機能は、責任を負うロードバランサノード110における接続状態についてのリースを更新する。
● ロードバランサレイヤにおけるメンバーシップの変化の監視。メンバーシップが変化した場合には、ロードバランサモジュール132は、この変更情報を用いて、その接続に対してこれから責任を負うロードバランサノードに対して直ちにアクティブな接続を送信する。
分散型ロードバランシングシステムにおけるパケットフローの細部
【0068】
分散型ロードバランシングシステムは、多数のロードバランサノード110を有する。少なくともいくつかの実施形態において、分散型ロードバランシングシステムにおける各ロードバランサノード110は、サーバ134に対するクライアント160の接続に関して、フロー追跡部ノードの役割、出口ノードの役割、及び入口ノードの役割を果たす。分散型ロードバランシングシステムはまた、各サーバノード130上にロードバランサモジュール132を含む。
【0069】
少なくともいくつかの実施形態において、
図10Aないし10Gは、分散型ロードバランシングシステム内のパケットフローを示している。
図10Aないし10Gにおいて、ロードバランサノード110の間で交換されたパケット、及び、ロードバランサノード110とサーバノード130との間で交換されたパケットは、UDPメッセージまたはUDPカプセル化されたクライアントTCPパケットのいずれかである。少なくともいくつかの実施形態において、クライアントTCPパケットのみが境界ルータ102との間で移動して、ロードバランサノード110の北側のネットワーク100上にカプセル化された形式で存在する(
図1を参照)。
図10Aないし10Gにおいて、矢印付きの実線はTCPパケットを表わし、一方、矢印付きの点線はUDPパケットを表わしていることに留意されたい。
【0070】
少なくともいくつかの実施形態において、分散型ロードバランシングシステムは、単一ロードバランサノード110の障害が発生したときは、確立されている接続を維持しようとする。少なくともいくつかの実施形態において、このことは、一次フロー追跡部ノード及び二次フロー追跡部ノードにおける接続を細部にわたって複製ことによって達成されるが、それは、これらのノードのいずれかに障害が発生した場合に、接続のクライアントからサーバへのマッピングは、残っているフロー追跡部ノードによって回復されるからである。少なくともいくつかの実施形態において、いくつかのパケットの消失は、ノードの障害が発生した場合に起こるが、クライアント/サーバTCPパケット再送が消失パケットを復元する。
【0071】
クライアントからのTCP接続の各々はTCPフローと称され、そのTCPフローは、クライアントIPアドレス、クライアントポート、サーバ(パブリック)IPアドレス、及びサーバポートからなる4タプルによって一意に識別される。この識別子は、クライアント及びパブリックエンドポイント対を示すCPまたはCcPpと略称される。任意の所定のTCPフロー(またはCP対)に関係するパケットは、上流のエッジルータ104からのハッシュ化等価マルチパス(ECMP)フロー分散のために、入口サーバ112として動作する任意のロードバランサノード110上に現れることができる。しかしながら、TCPフローに対応するパケットは、通常、転送されるTCPフローを引き起こすリンクまたはロードバランサノード110の障害が存在しない限り、同じロードバランサノード110に到達し続ける。上流のルータ104からのTCPフローに対応するパケットを受信するロードバランサノード110は、そのTCPフローに対応する入口ノードと称される。
【0072】
少なくともいくつかの実施形態において、コンシステントハッシュ法が使用されるは、TCPフローに対して入口ノードとしての機能を果たすロードバランサノード110にパケットが到達した場合に、当該入口ノードがTCPフローに対応する状態(すなわち、フロー追跡部ノード)を収容するのがどのロードバランサノード110であるかを決定することができるからである。CP対は、入口ノードによってコンシステントハッシュリングの中にハッシュ化されて、TCPフローに関する状態を維持することに責任を持っているのがどのロードバランサノード110であるかを決定する。このノードは、TCPフローに対して一次フロー追跡部ノードとしての機能を果たす。コンシステントハッシュリングにおける後続ノードは、TCPフローに対して二次フロー追跡部としての機能を果たす。
【0073】
少なくともいくつかの実施形態において、すべてのロードバランサノード110は、入口ノード、一次フロー追跡部ノード、及び二次フロー追跡部ノードとしての機能を果たす。TCPフローに対するコンシステントハッシュの結果に依存して、そのTCPフローに対して入口ノードとしての機能を果たしているロードバランサノード110は、そのTCPフローに対して一次または二次フロー追跡部ノードとしての機能も果たす。しかしながら、少なくともいくつかの実施形態において、異なる物理的なロードバランサノード110は、そのTCPフローに対して一次及び二次フロー追跡部ノードの役割を実行する。
接続の確立
【0074】
図10Aを参照すると、クライアント160からの新たな接続は、クライアントTCP同期(SYN)パケットによって起動される。ロードバランサノード110は、そのSYNパケットを受信したとき、実際には、サーバノード130との間で接続を確立しないだけでなく、その接続を受信すべきサーバノード130を直ちに選択することもない。その代わり、ロードバランサノード110は、クライアントのSYNパケットからの関連データを記憶して、まだ選択されていないサーバノード130の代わりにSYN/ACKパケットを生成する。
図10Cを参照すると、一旦クライアント160がTCPのスリーウェイハンドシェイクにおいて最初のACKに応答すると、ロードバランサノード110は、サーバノード130を選択して、当該サーバノード130に対する等価なSYNパケットを生成し、そのサーバノード130との実際のTCP接続を確立しようとする。
【0075】
再び
図10Aを参照すると、TCPフローに対して入口サーバ112としての機能を果たしているロードバランサノード110においてクライアントSYNパケットを受信すると、入口サーバ112は、SYNパケットからデータフィールドを抽出して、そのデータをTCPフローに対する一次フロー追跡部116Aに転送する。一次フロー追跡部116Aは、そのデータを例えばハッシュテーブルに記憶し、(TCP接続のサーバ側の)最初のTCPシーケンス番号を生成し、同じデータを二次フロー追跡部116Bに転送する。二次フロー追跡部116Bは、そのTCPシーケンス番号を含むクライアント160に対するSYN/ACKパケットを作成する。
【0076】
図10Aにおいて、入口サーバ112、一次フロー追跡部116A、及び二次フロー追跡部116Bの役割は、異なるロードバランサノード110によって各々実行される。しかしながら、いくつか場合においては、TCPフローに対して入口サーバ112としての機能を果たしているロードバランサノード110は、TCPフローに対して一次フロー追跡部116Aまたは二次フロー追跡部116Bとしての機能を果たしている同じノード110である(ただし、両方はない)。パケットフローに対応する入口サーバ112が、そのフローに対応するフロー追跡部116として同じノード110上にあるという理由は、エッジルータ104が、フロー単位ハッシュ化マルチパス・ルーティング技法(例えば、ECMPルーティング技法)に従って、フローに対応する入口サーバ112を擬似ランダムに選択するからである。その一方、パケットフローに対応するフロー追跡部116は、パケットフローのアドレス情報に適用されるコンシステントハッシュ機能に従って、コンシステントハッシュリング上で決定される。パケットフローに対応する入口サーバ112が、そのパケットフローに対応するフロー追跡部116として同じノード110上に存在する場合には、SYNパケットからのデータが入口サーバ112を実装するノード110から他のフロー追跡部116ノード110に転送されるだけである。例えば、
図10Bにおいて、一次フロー追跡部116Aは、TCPフローに対する入口サーバ112として同じロードバランサノード110A上に存在するが、一方、二次フロー追跡部116Bは、異なるロードバランサノード110B上に存在するので、SYNパケットからのデータは、(フロー追跡部116Aによって)ノード110Aからロードバランサノード110B上の二次フロー追跡部116Bに転送される。
【0077】
図10Cを参照すると、非SYNパケットが入口サーバ112に到達した場合には、その入口サーバ112は、どのサーバノード130にそのパケットを転送するかを知っているかまたは知らないかのいずれかである。TCPフローに対する入口サーバ112に到達する最初の非SYNパケットは、TCPのスリーウェイハンドシェイクにおける最初のTCP承認(ACK)パケット(または、ことによると後続のデータパケット)のはずである。そこでは、TCP承認番号のフィールドは、
図10AにおけるSYN/ACKパケットの中で送信されたサーバシーケンス番号(+1)と一致する。入口サーバ112が、対応するサーバマッピングを持たない非SYNパケットを受信した場合には、入口サーバ112は、TCPフローに対応する一次フロー追跡部116Aに対してメッセージを転送する。そのメッセージは、シーケンス番号などのACKパケットからの情報を含み、またはACKパケット自身を含む。少なくともある場合においては、一次フロー追跡部116Aは、TCPフローについて記憶されたデータを覚えており、承認シーケンス番号(+1)とSYN/ACKパケットの中でクライアント160に対して送信された値とが一致することを確認する。一次フロー追跡部は、その後、TCPフローに対応するサーバノード130を選択し、TCPフローについて以前に記憶されたデータを含む他のメッセージ、サーバシーケンス番号、及び選択されたサーバノード130上のロードバランサモジュール132についてのIPアドレスを、二次フロー追跡部116Bに対して転送する。二次フロー追跡部116Bは、サーバシーケンス番号を確認し、その情報を記録し、生成されたSYNメッセージを選択されたサーバノード130上のロードバランサモジュール132に対して送信する。TCPフローのCPエンドポイント対は、この時からロードバランサモジュール132/サーバノード130にマッピングされる。サーバノード130上のロードバランサモジュール132は、二次フロー追跡部116Bから生成されたSYNメッセージを受信した場合には、サーバノード130上のサーバ134に対する正当なTCP SYNパケットを作成する責任がある。SYNパケットの生成において、送信元IPアドレスがクライアント160の実際のIPアドレスに追加されるのは、サーバ134がクライアント160から直接的なTCP接続要求を受信したことを信用するからである。ロードバランサモジュール132は、TCPフローについて関連する細部を例えばローカルなハッシュテーブルに記憶し、TCP SYNパケットをサーバ134に送信する(例えば、SYNパケットをサーバ134のLinuxカーネルの中に挿入する)。
【0078】
図10Cにおいて、入口サーバ112、一次フロー追跡部116A、及び二次フロー追跡部116Bの役割は、異なるロードバランサノード110によって各々実行される。しかしながら、いくつか場合においては、TCPフローに対して入口サーバ112としての機能を果たしているロードバランサノード110は、TCPフローに対して一次フロー追跡部116Aまたは二次フロー追跡部116Bとしての機能を果たしている同じノード110である(ただし、両方ではない)。例えば、
図10Dにおいて、二次フロー追跡部116Bは、TCPフローに対して入口サーバ112として同じロードバランサノード110A上に存在し、一方、一次フロー追跡部116Aは、異なるロードバランサノード110B上に存在する。
【0079】
図10Eを参照すると、サーバ134(例えば、Linuxカーネル)は、ロードバランサモジュール132も中断するSYN/ACKパケットに応答する。SYN/ACKパケットは、二次フロー追跡部116Bからの生成されたSYN/ACKにおいて、クライアント160に最初に配信されたTCPシーケンス番号とは異なるTCPシーケンス番号を含む(
図10A参照)。ロードバランサモジュール132は、着信パケット及び発信パケットにシーケンス番号デルタを適用する責任がある。サーバ134からのSYN/ACKパケットもまた、ロードバランサモジュール132から二次フロー追跡部116Bに戻るメッセージ(例えば、UDPメッセージ)を起動して、選択されたサーバノード130/ロードバランサモジュール132/サーバ134に対する接続が成功したことを知らせる。二次フロー追跡部116Aは、このメッセージを受信すると、クライアント160とサーバ134との間において、クライアント及びパブリックエンドポイント対(CP)マッピングを約束されたものとして記録し、CPマッピングを同じように記録する一次フロー追跡部116Aに対して同様のメッセージを送信する。一次フロー追跡部116Aは、その後、CPマッピングメッセージを入口サーバ112に対して転送し、このことによって、接続について任意にバッファリングされたデータパケットを、入口サーバ112はサーバノード130上のローカルロードバランサモジュール132に対してカプセル化されたデータパケットとして転送させる。
【0080】
図10Fを参照すると、接続のためのCPマッピングが入口サーバに分かっているので、入口サーバ112によって受信された接続に関する着信TCPパケットは、(例えば、UDPに従って)カプセル化され、サーバノード130上のローカルロードバランサモジュール132に対して、カプセル化されたデータパケットとして直接に転送される。ロードバランサモジュール132は、データパケットをデカプセル化して、サーバノード130上のサーバ134に対し、例えば、カーネルのTCPスタック上にTCPパケットを挿入することによって、TCPパケットを送信する。サーバ134からのアウトバウンドパケットは、サーバノード130上のロードバランサモジュール132によって中断され、(例えば、UDPに従って)カプセル化され、ロードバランサモジュール132がこの接続に対応する出口サーバ114としてランダムに選択する任意のロードバランサノード110に対して転送される。出口サーバ114は、パケットをデカプセル化して、そのデカプセル化されたパケットをクライアント116に対して送信する。選択されたロードバランサノード110の出口機能はステートレスであるので、出口サーバとしての機能を果たしているロードバランサノード110に障害が発生した場合には、異なるロードバランサノード110が接続に対する出口サーバ114として選択されることができる。しかしながら、接続の期間中においては、アウトバウンドパケットの再配列を抑制または排除するために、通常は、同じロードバランサノード110が出口サーバ114として使用される。
【0081】
図10Gを参照すると、少なくともいくつかの実施形態において、一次フロー追跡部116Aによって選択されたサーバノード130A(
図10C参照)上のロードバランサモジュール132Aは、自分が過負荷であると判定した場合には、二次フロー追跡部116Bから受信された作成されたSYNメッセージ(
図10C参照)を拒絶する選択権を有する。少なくともいくつかの実施形態において、作成されたSYNメッセージは、生存時間(TTL)の値または最大拒絶数をあらかじめ考慮するカウンタを含んでいる。少なくともいくつかの実施形態において、このTTLの値がゼロに達した場合には、ロードバランサモジュール132Aは、接続を受諾するかまたは負荷を減らすために接続を中断する。ロードバランサモジュール132Aが接続を拒絶すると決定した場合には、TTLの値を減らして、拒絶メッセージを二次フロー追跡部116Bに送信する。二次フロー追跡部116Bは、CPマッピングをリセットし、同じことを行うために開放メッセージを一次フロー追跡部116Aに送信する。一次フロー追跡部116Aは、他のサーバノード130B上の新たなロードバランサモジュール132Bを選択し、新たな目標メッセージを二次フロー追跡部116Bに返送し、二次フロー追跡部116Bは新たに作成されたSYNメッセージを新たに選択されたロードバランサモジュール132Bに対して送信する。パケット廃棄は、このシーケンスが完了することができない結果になることに留意されたい。しかしながら、クライアント160からの再送は、一次フロー追跡部116Aにおいてロードバランサモジュールの選択プロセスを再び起動し、一次フロー追跡部116Aは、作成されたSYNパケットの前回の拒絶について学習しなかった場合に、必ずしも必要ではないが、接続に対して同じロードバランサモジュール132を選択する。
【0082】
少なくともいくつかの実施形態において、TTLカウンタは、サーバノード130に対して連続的に接続要求が送信されることを回避するために使用され、このことは、例えば、すべてのサーバノード130がビジーである場合に発生する。少なくともいくつかの実施形態において、ロードバランサモジュール132がそれぞれのサーバノード130の代理として、接続要求を拒絶するたびに、当該ロードバランサモジュール132はTTLカウンタを減らす。フロー追跡部ノード116は、TTLカウンタを監視して、TTLカウンタがゼロでない(または、ある特定の閾値を超えない)限り、他のサーバノード130を選択して、再度試みる。TTLカウンタがゼロに達した(または、当該特定の閾値に達した)場合には接続要求は取り下げられ、その接続のために選択されたサーバノード130の1つに対して接続要求を送信するためのフロー追跡部ノード116によってなされる試みはもはやできない。少なくともいくつかの実施形態において、エラーメッセージがそれぞれのクライアント160に送信される。
【0083】
少なくともいくつかの実施形態において、分散型ロードバランサシステムは、多くのパブリックIPアドレスをサポートする。したがって、クライアント160は、同じクライアントのポート番号から2つの異なるパブリックIPアドレスまでの2つのTCP接続を開始することが可能である。これらのTCP接続は、クライアント160の観点からは区別されるが、内部的には、分散型ロードバランサシステムは同じサーバノード130に対して接続をマッピングするので、このことで衝突を生じる結果となる。少なくともいくつかの実施形態において、衝突の可能性を検出し且つ取り扱うためには、ロードバランサモジュール132は、
図10C及び10Dに示されるように、生成されたSYNパケットを二次フロー追跡部116Bから受信すると、アドレス情報をそのアクティブな接続と比較して、この接続が衝突を引き起こす可能性がある場合には、
図10Gに示されるように、その接続要求を拒絶する。
ロードバランサノードの障害及び追加の取り扱い
【0084】
従来の多くのロードバランサにおいて、ロードバランサの障害が発生すると、いくつかのまたはすべての存在している接続は失われる。少なくともいくつかの実施形態では、単一のロードバランサノード110の障害発生において、分散型ロードバランシングシステムが少なくともいくつかの確立された接続を維持するのは、クライアント及びサーバが、接続が正常に完了するまで、接続によってパケットの交換を継続できるからである。さらに、分散型ロードバランシングシステムは、障害の時点において確立されているプロセスの中に存在していた接続に対するサービスを継続する。
【0085】
分散型ロードバランシングシステムの少なくともいくつかの実施形態において、単一のロードバランサノード110に障害が発生した場合に備えて、存在中のクライアント接続を回復する障害回復プロトコルが実装されている。しかしながら、多数のロードバランサノード110に障害が発生すると、クライアント接続の消失を招く結果となる。少なくともいくつかの実施形態において、クライアント160とサーバ134との間のTCP再送は、後続のロードバランサノード110の障害を回復する手段として使用される。
【0086】
潜在的なロードバランサノード110の障害に加えて、新たなロードバランサノード110が分散型ロードバランサシステムに追加される。これらの新たなノード110は、ロードバランサレイヤに、したがって、コンシステントハッシュリングに追加され、存在中のクライアント接続に関するロードバランサノード110の役割は、必要に応じて、当該変更に従って調整される。
フロー追跡部ノードの障害及び追加の取り扱い
【0087】
少なくともいくつかの実施形態において、各々の接続が確立されている場合には(例えば、
図10Aないし10G参照)、その接続状態情報は、一次及び二次フロー追跡部と称される、2つのロードバランサノード110を通る。一次及び二次フロー追跡部は、例えば、ハッシュ機能入力として(クライアントIP:ポート、パブリックIP:ポート)タプルを使用するコンシステントハッシュアルゴリズムを使用して決定される。単一のロードバランサノード110に障害が発生した場合に、少なくとも1つの生き残っているロードバランサノード110は、コンシステントハッシュ機能によるマッピングを継続し、接続に対して選択されたサーバノード130に対してパケットを導くための接続に関する必要な状態情報を有する。さらに、コンシステントハッシュリングにロードバランサノード110が追加された場合には、接続に関する状態情報は、適切なフロー追跡部に対して更新される。
【0088】
図11Aないし11Dは、少なくともいくつかの実施形態において、ロードバランサノードコンシステントハッシュリングにおいてメンバー構成に影響する事象の取り扱いを示す。これらの事象は、新たな一次フロー追跡部ノードの追加、新たな二次フロー追跡部ノードの追加、一次フロー追跡部ノードの障害、及び二次フロー追跡部ノードの障害を含んでいるが、これらに限定されない。
【0089】
図11Aは、コンシステントハッシュリングへの新たな一次フロー追跡部ノードの追加の取り扱いを示す。
図11Aの上位の並びは、1以上のクライアント接続に対する一次フロー追跡部としてのフロー追跡部116A、及び同じ接続に対する二次フロー追跡部としてのフロー追跡部ノード116Bを示す。
図11Aの下位の並びにおいて、新たなフロー追跡部ノード116Cが追加されており、クライアント接続に対する一次フロー追跡部になっている。コンシステントハッシュリングにおいて、以前は一次フロー追跡部であったフロー追跡部ノード116Aは、二次フロー追跡部になり、一方、以前は二次フロー追跡部であったフロー追跡部ノード116Bは、次のフロー追跡部になっている。フロー追跡部116A及び116Bによって維持されていたクライアント接続に対する状態情報は、新たな一次フロー追跡部116Cに提供される。さらに、フロー追跡部116Bは、二次フロー追跡部の役割において、自分が以前追跡していた接続を「忘れる」。
【0090】
図11Bは、コンシステントハッシュリングへの新たな二次フロー追跡部ノードの追加の取り扱いを示す。
図11Bの上位の並びは、1以上のクライアント接続に対する一次フロー追跡部としてのフロー追跡部116A、及び同じ接続に対する二次フロー追跡部としてのフロー追跡部ノード116Bを示す。
図11Bの下位の並びにおいて、新たなフロー追跡部ノード116Cが追加されており、クライアント接続に対する二次フロー追跡部になっている。コンシステントハッシュリングにおいて、フロー追跡部ノード116Aは、接続に対する一次フロー追跡部として残り、一方、以前は二次フロー追跡部であったフロー追跡部ノード116Bは、次のフロー追跡部になる。フロー追跡部116A及び116Bによって維持されていたクライアント接続に対する状態情報は、新たな二次フロー追跡部116Cに提供される。さらに、フロー追跡部116Bは、二次フロー追跡部の役割において、自分が以前追跡していた接続を「忘れる」。
【0091】
図11Cは、コンシステントハッシュリングにおいて、一次フロー追跡部ノードの障害の取り扱いを示す。
図11Cの上位の並びは、コンシステントハッシュリングにおいて、1以上のクライアント接続に対する一次フロー追跡部としてのフロー追跡部116A、同じ接続に対する二次フロー追跡部としてのフロー追跡部ノード116B、及び次のフロー追跡部としてのフロー追跡部ノード116Cを示す。
図11Cの下位の並びにおいて、一次フロー追跡部ノード116Aには障害は発生している。フロー追跡部ノード116Bは、接続に対して一次フロー追跡部になり、一方、フロー追跡部ノード116Cは、接続に対して二次フロー追跡部になる。フロー追跡部116Bによって維持されていたクライアント接続に対する状態情報は、新たな二次フロー追跡部116Cに提供される。
【0092】
図11Dは、コンシステントハッシュリングにおいて、二次フロー追跡部ノードの障害の取り扱いを示す。
図11Dの上位の並びは、コンシステントハッシュリングにおいて、1以上のクライアント接続に対する一次フロー追跡部としてのフロー追跡部116A、同じ接続に対する二次フロー追跡部としてのフロー追跡部ノード116B、及び次のフロー追跡部としてのフロー追跡部ノード116Cを示す。
図11Dの下位の並びにおいて、二次フロー追跡部ノード116Bには障害は発生している。フロー追跡部ノード116Aは、接続に対する一次フロー追跡部として残り、一方、フロー追跡部ノード116Cは、接続に対して二次フロー追跡部になる。フロー追跡部116Bによって維持されていたクライアント接続に対する状態情報は、新たな二次フロー追跡部116Cに提供される。
【0093】
少なくともいくつかの実施形態において、サーバノード130上のロードバランサモジュール132は、ロードバランサノード110に対して接続公開を実行する。少なくともいくつかの実施形態において、接続公開は、サーバノード130からフロー追跡部ノード及び入口ノードとしての機能を果たしているロードバランサノード110に対して、現在の接続状態情報を定期的(例えば、1秒ごとに)または不定期に推し進める。当該接続公開は、接続に対する一次及び二次フロー追跡部ノードの両方に対する接続マッピングを更新または回復する役割を果たす。少なくともいくつかの実施形態において、ロードバランサモジュール132は、例えば、
図11Aないし11Dに示されるようなフロー追跡部のメンバーシップの変化を検出する。検出に応答して、ロードバランサモジュール132は、一次及び二次フロー追跡部ノードにおける接続に対する状態情報を追加するために接続公開を実行し、それによって、メンバーシップが変化した場合には、接続に対する変更を行う。接続公開は、多数のロードバランサノードに障害が発生した場合に、少なくともいくつかの確立された接続が回復できることに留意されたい。
障害に関するメッセージフロー
【0094】
少なくともいくつかの実施形態において、一次及び二次フロー追跡部ノードの間のプロトコルには、訂正機能または同期機能が含まれる。例えば、
図11Aを参照すると、新たなフロー追跡部ノード116Cがコンシステントハッシュリングに加わった場合には、当該新たなフロー追跡部ノード116Cは、いくつかの接続数(〜1/N)に関するコンシステントハッシュのキー空間に対して権利を主張し、エッジルータ104からのこれらの接続に関するトラフィックの受信を開始する。しかしながら、当該新たなフロー追跡部ノード116Cは、接続のために記憶された状態をなにも持っていないので、フロー追跡部ノード116Cは、各パケットに対してあたかもクライアント160から受信された最初のパケットであるかのように操作する。一次フロー追跡部は、SYNパケットに応答してサーバTCPシーケンス番号を生成する責任があり(例えば、
図10A参照)、且つ、クライアント160からの最初のACKパケットに応答してサーバノード130を選択する責任があり(例えば、
図1参照)、これら生成された値は、以前の一次フロー追跡部(
図11Aにおけるフロー追跡部ノード116A)によって選択された値と一致しない。しかしながら、少なくともいくつかの実施形態におけるコンシステントハッシュアルゴリズムは、以前の一次フロー追跡部(
図11Aにおけるフロー追跡部ノード116A)に対して二次フロー追跡部の役割を割り当て、このフロー追跡部は接続について以前に記憶された状態をなおも保持する。したがって、少なくともいくつかの実施形態において、二次フロー追跡部(
図11Aにおけるフロー追跡部ノード116A)が、一次フロー追跡部116Cから受信された情報の中に不一致を検出した場合には、二次フロー追跡部は、更新メッセージを一次フロー追跡部116Cに返送して、接続に対してフロー追跡部としての機能を果たしている2つのロードバランサノード110を同期させることができる。同様の方法は、コンシステントハッシュリングのメンバー構成において他の変化があった後にフロー追跡部を同期させるために使用される。
ロードバランサモジュールの詳細
【0095】
少なくともいくつかの実施形態において、ロードバランサモジュール132は、サーバノード130の各々の上に存在する分散型ロードバランサシステムの構成要素である。ロードバランサモジュール132の役割は、ロードバランサノード110から受信されたパケットをデカプセル化すること及びそのデカプセル化されたパケットをサーバノード130上のサーバ134に対して送信すること、及び、サーバ134からの発信パケットをカプセル化すること、及びそのカプセル化されたパケットをロードバランサノード110に対して送信することが含まれるが、これらに限定されない。
【0096】
少なくともいくつかの実施形態において、入口サーバ112としての機能を果たしているロードバランサノード110からサーバノード130上のロードバランサモジュール132に対する着信パケットは、実際のクライアントデータパケットをカプセル化するステートレスプロトコル(例えば、UDP)のパケットである。カプセル化されたクライアントデータパケットの各々は、送信元アドレスとしてのそれぞれのクライアント160の最初のクライアントIPポート及び宛先アドレスとしてのサーバ134のパブリックIPポートを有する。ロードバランサモジュール132は、クライアントデータパケットのカプセル化を外して、例えば、ローカルホストのTCPフローに対してパケットを転送することによって、そのパケットをサーバノード130上のそれぞれのサーバ134に対して送信する。
【0097】
少なくともいくつかの実施形態において、サーバ134から出口サーバ114としての機能を果たしているロードバランサノード110に対する発信パケットは、発信IPパケットをカプセル化するステートレスプロトコル(例えば、UDP)のパケットである。ロードバランサモジュール132は、発信IPパケットをカプセル化して、そのカプセル化されたパケットを出口サーバ114に対してファブリック120を介して送信する。カプセル化された発信IPパケットの各々は、送信元アドレスとしてのサーバ134のパブリックIPポート及び宛先アドレスとしてのそれぞれのクライアント160のクライアントIPポートを有する。
ロードバランサモジュールの機能
【0098】
少なくともいくつかの実施形態において、サーバノード130上のロードバランサモジュール132の機能は、以下の1以上を含む、これらに限定されない。
● ロードバランサノード110、例えば、クライアント160に対する接続を取り扱っている入口サーバ112からのUDPトンネルを終端すること。これは、入口サーバ112から受信した着信クライアントデータパケットのUDPカプセルを外すことを含む。
● 接続に関する発信トラフィックを受信する出口サーバ114を選択すること。
● それぞれのサーバ134に対する接続上の発信IPパケットを中断すること、接続に関する出力IPパケットをカプセル化すること、及び当該カプセル化されたパケットを出口サーバ114に送信すること。
● 着信及び発信パケット内のシーケンス番号を分解するのは、フロー追跡部ノード116がクライアント160に対してSYN/ACKを送信した際に、シーケンス番号をフロー追跡部ノード116によって生成されたシーケンス番号に揃えるからである。
● それぞれのサーバ134に対する接続を受諾するかまたは拒絶するかどうかについて、例えば、それぞれのサーバ134の現在の負荷を示す1以上のメトリクスに基づいて決定すること。
● クライアントIPポートアドレスに対するアクティブな接続が存在する場合に、衝突を回避するために、それぞれのサーバ134に対する同じクライアントIPポートアドレスからの接続を検出すること及び拒絶すること。
● 接続追跡及び接続公開。
ロードバランサモジュールの構成情報
【0099】
少なくともいくつかの実施形態において、ロードバランサモジュール132の各々は、自分の構成に関する1つ以上の情報の組み合わせ、すなわち、ロードバランサノード110のエンドポイントの組み合わせ、対応すべき有効なパブリックIPアドレスの組み合わせ、及び、それぞれのサーバ134が着信接続を受諾するポート番号を取得してローカルに記憶する。ただし、これらの情報に限定するものではない。少なくともいくつかの実施形態において、この情報は、
図1に示されるように、分散型ロードバランサシステムの構成サービス122の構成要素から取得され、またはアクセス処理若しくは問い合わせ処理によって更新される。いくつかの実施形態においては、情報を取得する他の方法が使用される。
ロードバランサモジュールのパケット取り扱い
【0100】
少なくともいくつかの実施形態におけるインバウンドトラフィック及びアウトバウンドトラフィックに対するロードバランサモジュール132の操作について、以下説明する。少なくともいくつかの実施形態において、ロードバランサモジュール132によってインバウンドデータトラフィックが受信された場合には、そのデータパケットは、UDPパケットからデカプセル化されて、そのデカプセル化されたTCPパケット内の宛先アドレスは、構成された有効なパブリックIPアドレスの組み合わせに対して最初に確認される。一致しない場合には、パケットは廃棄されるかまたは無視される。少なくともいくつかの実施形態において、ロードバランサモジュール132は、シーケンス番号がクライアント160に対してSYN/ACKパケットを送信したフロー追跡部ノード116によって生成されてランダムに選択されたシーケンス番号と一致するように、TCPヘッダにおいて定数デルタによってシーケンス番号を調整する。ロードバランサモジュール132は、「クライアント対パブリック」エンドポイントから「クライアント対サーバ」エンドポイントまでのマッピングを内部状態として記録する。
【0101】
少なくともいくつかの実施形態において、ロードバランサモジュール132は、サーバ134からのアウトバウンドTCPパケットに関して、その内部状態を最初にチェックして、そのパケットはロードバランサモジュール管理しているアクティブな接続に対するものかどうかを判定する。アウトバウンドTCPパケットがアクティブな接続でない場合には、ロードバランサモジュール132は、パケットをすぐに通過させる。アウトバウンドTCPパケットがアクティブな接続である場合には、ロードバランサモジュール132は、発信TCPパケットを、例えば、UDPに従って、カプセル化して、この接続に対して出口サーバ114として選択されたロードバランサノード110に対して、そのカプセル化されたパケットを転送する。少なくともいくつかの実施形態において、ロードバランサモジュール134は、クライアント160に対してSYN/ACKパケットを送信したフロー追跡部ノード116によって生成されたシーケンス番号に揃えるように、ロードバランサモジュール134は、発信TCPパケットにおいて定数デルタによってTCPシーケンス番号を調整する。
接続追跡
少なくともいくつかの実施形態において、各サーバノード130上のロードバランサモジュール132は、それぞれのサーバ134に対するアクティブなクライアント接続のすべてに関する接続の詳細を含んでいるハッシュテーブルを管理する。少なくともいくつかの実施形態において、ハッシュテーブルに対するキーは、(クライアントIPポート、パブリックIPポート)タプルである。少なくともいくつかの実施形態において、各クライアント接続に関する接続状態は、以下に示す1以上のものを含むが、これらに限定されない。
● クライアントIPポート
● パブリックIPポート
● フロー追跡部ノード116によって提供された初期サーバTCPシーケンス番号
● サーバTCPシーケンス番号のデルタ
● 最初の一次フロー追跡部IPアドレス
● 最初の二次フロー追跡部IPアドレス
● 最後に検出された入口サーバ112のIPアドレス
● このエントリに対する有効期限
● 最も過去に使用された(LRU)/衝突インデックス
【0102】
少なくともいくつかの実施形態において、各ロードバランサモジュール132は、すべてのアクティブなクライアント接続に関して、一次及び二次フロー追跡部ノードに対する接続公開メッセージを定期的に生成する。少なくともいくつかの実施形態において、/proc/net/tcpの内容が、スキャンされ且つロードバランサモジュールのハッシュテーブルの中で、アクティブな接続と交差するのは、Linuxカーネルが接続の追跡を停止するまで、アクティブな接続がフロー追跡部ノードに対する公開を継続するからである。接続公開については、本明細書の中において後で詳細に説明する。
シーケンス番号の分解処理
【0103】
上記したように、少なくともいくつかの実施形態において、ロードバランサノード110は、クライアント160のSYNパケットに応答して、SYN/ACKパケットをサーバ134の代理として生成する。クライアント160がACKパケット(TCPのスリーウェイシェイクハンド)を送信した後のみしか、ロードバランサモジュール110は、サーバノード130上のロードバランサモジュール132に対して任意のデータを送信することはない。ロードバランサモジュール132がクライアント接続を確立することを最初に指示された場合には、ロードバランサモジュール132は、ローカルにSYNパケットを生成してサーバノード130上のサーバ134との間でTCP接続を開始し、サーバ134の対応SYN/ACKパケットを中断する。通常、サーバ134(例えば、サーバノード130上のLinuxカーネル)は、ロードバランサノード110からのSYN/ACKパケットにおいて受信されたクライアントのものとは全体的に異なるTCPシーケンス番号を選択する。したがって、少なくともいくつかの実施形態においては、ロードバランサモジュール132は、クライアント160とサーバ134との間のTCP接続におけるすべてのパケット内のシーケンス番号に対して訂正を行う。少なくともいくつかの実施形態において、ロードバランサモジュール132は、ロードバランサノード110によって生成されたシーケンス番号とサーバ134によって生成されたシーケンス番号との差分を計算して、TCP接続に対するハッシュテーブルのエントリに差分をデルタ値として記憶する。接続中にクライアント160から着信データパケットが到達した場合には、TCPヘッダは、サーバ134によって使用されるシーケンス番号と整合しない承認番号を有することになるので、ロードバランサモジュール132は、(例えば、2つの補数を用いて)TCPヘッダ内のシーケンス番号の値からデルタ値を減算する。ロードバランサモジュールはまた、接続中にサーバ134からクライアント130に対するアウトバウンドパケット内のシーケンス番号にデルタ値を加算する。
分散型ロードバランサシステムにおけるヘルスチェック
【0104】
分散型ロードバランサシステムの少なくともいくつかの実施形態において、以下に示す理由の少なくとも一つから、ロードバランサノード110は、ロードバランサの実装(すなわち、健康なロードバランサノード110及びサーバノード130の)において健康なメンバーの一貫した表示を要求する。
● ロードバランシング―ロードバランサノード110は、サーバノード130の障害を検出し、クライアントトラフィックを受諾できる健康なサーバノード130の組み合わせに集中する必要がある。
● 分散化状態の管理−ロードバランサは、(例えば、コンシステントハッシュ法のメカニズムに従って)多数のロードバランサノード110に亘って共有され/複製される状態を有する分散型システムである。クライアントトラフィックを適切に取り扱うために、各ロードバランサノード110は、ロードバランサの実装において健康なメンバーノード110の一貫した表示を必要とする。
【0105】
このことを達成するために、分散型ロードバランサシステムの少なくともいくつかの実施形態において、ロードバランサの実装においてノードを監視するヘルスチェックプロトコルの実施形態を実現して、できるだけ速く不健康なノードを検出する。ヘルスチェックプロトコルは、ロードバランサの実装においてノード間に健康情報を伝搬して、それらのノードが健康なノードの組み合わせに集中することを可能にする方法を提供する。さらに、ヘルスチェックプロトコルは、ロードバランサの実装において、健康な/不健康なノード及び状態の変化を報告するメカニズムを提供する。
【0106】
少なくともいくつかの実施形態において、ヘルスチェックプロトコルは、以下に示す1つ以上の仮定に基づく。しかし、これらに限定されるものではない。
● ロードバランサの実装において、すべてのノードが分かっている(すなわち、ヘルスチェックプロトコルは、発見することを実行しない)。
● すべてのノードの障害はフェイルストップである。
● ノード間のすべてのメッセージは、ステートレスプロトコル(例えば、UDP)メッセージであり、当該メッセージは、削除され、遅延され、複製され、または破損される。メッセージ配信についての保障はない。
【0107】
少なくともいくつかの実施形態では、ロードバランサの実装におけるノード(例えば、ロードバランサノード110またはサーバノード130)は、以下に示す条件のもとでは健康であると見なされる。
● ノードの内部の構成要素のすべてが準備状態(クライアントトラフィックを取り扱うための準備)である。
● (少なくともクライアント・トラフィックフローに関するネットワーク・インターフェイス制御部(NIC)についての)ノードの着信/発信ネットワークリンクが健康である。
【0108】
図12は、少なくともいくつかの実施形態において、ヘルスチェック間隔に従った各ロードバランサノードによって実行されるヘルスチェック方法の上位のフローチャートである。1000に示されるように、各ロードバランサの間隔、例えば、100ミリ秒ごとに、各ロードバランサ(LB)ノード110は、少なくとも1つの他のLBノード110及び少なくとも1つのサーバノード130のヘルスチェックをする。1002に示されるように、ロードバランサノード110は、ヘルスチェックに従って、ローカルに記憶された自分の健康情報を更新する。1004に示されるように、ロードバランサノード110は、その後、少なくとも1つの他のロードバランサノード110をランダムに選択して、選択されたロードバランサノード110に対して自分の健康情報を送信する。少なくともいくつかの実施形態において、ノード110はまた、1以上のサーバノード130、例えば、ノード110によってヘルスチェックされた同じサーバノード130に対して、健康なロードバランサノード110のリストを送信する。
図12の要素については、以下、詳細に説明する。
【0109】
ヘルスチェックプロトコルの少なくともいくつかの実施形態において、ロードバランサノード110は自分自身の健康を他のロードバランサノード110に主張することはない。これと反対に、1以上の他のロードバランサノード110は、当該ノード110にヘルスチェックを行う。例えば、少なくともいくつかの実施形態において、各ロードバランサノード110は、定期的または不定期にランダムに1以上の他のノード110を選択して、ヘルスチェックを行う。他の実施例のように、少なくともいくつかの実施形態において、1以上の他のロードバランサノード110、例えば、コンシステントハッシュリングなどのノード110の順序付けリスト中の或る所定のロードバランサノード110に最も近くに隣接する2つは、それぞれ定期的または不定期に当該所定のノード110のヘルスチェックをする。少なくともいくつかの実施形態において、ノード110のヘルスチェックは、
図23に示されるように、ノード110上のNIC1114に対して送信される健康pingの使用を含む。少なくともいくつかの実施形態において、第1のノード110がヘルスチェックを介して第2のノード110が健康であると判定した場合には、当該第1のノード110は、当該ロードバランサノード110におけるローカルな健康情報に記憶されている当該第2のノード110についての心拍カウンタを更新(例えば、インクリメント)する。第1のノード110は、自分のローカルな健康情報を、ロードバランサ実装における1以上の他のロードバランサノード110に対して定期的または不定期に送信し、これによって、適宜自分自身のローカルな健康情報を(例えば、第2のノードについての心拍カウンタをインクリメントすることによって)更新し、自分の更新されたローカルな健康情報を、1以上の他のノード110に対して送信する。第2のノード110についての心拍情報は、その後、ロードバランサ実装における他のノード110に対して伝搬される。第2のノード110が健康である限り、第2のノード110から到達可能な他のすべてのノード110はしたがって、常にインクリメントされている第2のノード110の心拍カウンタを、例えば、1秒に1度または毎10秒に1度、監視する必要がある。第2のノード110のヘルスチェックをするノード(複数可)110によって、第2のノード110が不健康であることが検出された場合には、ヘルスチェックをしているノード110によって当該ノード110についての心拍は送信されず、ある時間の閾値の後、ロードバランサ実装110内の他のノード110は、当該ノード110が不健康であるかまたは故障中であると見なす。
【0110】
少なくともいくつかの実施形態において、ロードバランサノード110は、自分自身の内部状態の1以上の態様をチェックして、当該ノード110がなんらかの理由で不健康であることを検出した場合には、当該ノード110は、自分の健康をチェックする他のノード110からの健康pingに対する応答を停止する。したがって、当該不健康なノード110をチェックしているノード110は、当該ノード110が不健康であると見なし、当該ノード110の代理として心拍インクリメントを伝搬することはない。
<ヘルスチェックプロトコルの詳細>
【0111】
少なくともいくつかの実施形態において、ヘルスチェックプロトコルは、心拍カウンタ技法及び喧伝プロトコル技術を活用する。ヘルスチェックプロトコルは、2つの主要な部分を有すると見なされる、すなわち、ヘルスチェック及び喧伝/障害検出である。
【0112】
ヘルスチェック−ロードバランサ実装内のすべてのロードバランサノード110は、実装中の1以上の他のノード110を定期的または不定期にヘルスチェックする。1以上の他のノードが判定される方法については、後述する。ヘルスチェックの基本的な考え方は、ノード110が他のノード110の健康をチェックして、当該他のノード110が健康であると判定した場合には、当該チェックをしているノード110は、当該他のノード110についての心拍カウンタをインクリメントし且つ伝搬することによって、当該他のノード110が健康である旨を主張する。言い換えれば、ノード110は自分自身が健康であると他のノード110に対して主張しない代わりに、1以上の他のノード110はロードバランサ実装内の各ノード110の健康をチェックして且つそれを主張する。
【0113】
喧伝/障害検出−少なくともいくつかの実施形態において、ヘルスチェックプロトコルは、喧伝プロトコルを活用して、ロードバランサ実装内のメンバーのロードバランサノード110の中にロードバランサノード110の健康情報を伝搬する。喧伝プロトコルは、迅速に収束して、分散型ロードバランシングシステムの目的のための十分な最終的な一貫性の保証を提供する。少なくともいくつかの実施形態において、各ロードバランサノード110は、喧伝プロトコルを使用することにより、ロードバランサ実装内の他のノード110の各々についての心拍カウンタを、例えば、心拍リストの中で維持する。各ロードバランサノード110は、上記したように、定期的または不定期に少なくとも1つの他のロードバランサノード110のヘルスチェックを実行し、チェックされたノード110が健康であることをヘルスチェックによって判定したときは、ノード110についての心拍カウンタをインクリメントする。少なくともいくつかの実施形態において、各ロードバランサノード110は、定期的または不定期にランダムに、ロードバランサ実装内の少なくとも1つの他のノード110を選択して、当該他のノード110に対して自分の現在の心拍リストを送信する。ロードバランサノード110は、他のノード110から心拍リストを受信すると、2つのリスト(受信されたリスト及び自分自身のリスト)内の各ノードについての最大心拍カウンタを判定することによって、且つ、判定された最大心拍カウンタを自分自身の心拍リストにおいて使用することによって、受信されたリスト内の心拍情報と自分自身の心拍リストとを統合する。そして今度は、この心拍リストがランダムに選択された他のノード110に送信され、これによって適宜、自分自身の心拍リストを更新し、と同じように続く。この技法を使用すれば、健康なノード110の各々についての心拍情報は、最終的に(例えば、数秒間に)ロードバランサ実装内のすべての他のロードバランサノード110に伝搬される。所定のロードバランサノード110についてその心拍カウンタの増加が続く限り、当該所定のロードバランサノードは、他のノード110によって健康であると見なされる。ロードバランサノード110の心拍カウンタが、ヘルスチェック及び喧伝処理方法によって、特定の期間にインクリメントされない場合には、他のロードバランサノード110は、不健康であると見なされたロードバランサノード110に集中する。
ロードバランサノードのヘルスチェック
【0114】
少なくともいくつかの実施形態において、他のロードバランサノード110によって実行されるロードバランサノード110に対するヘルスチェックの方法について、以下説明する。
図23を参照すると、少なくともいくつかの実施形態において、或るロードバランサノード110は、以下の条件のうち1つ以上が当該ノード110について判定された場合には、健康であると見なされる。
● ノード110のプロセッサスレッド(例えば、基本的なパケット処理コード1108スレッド)が準備状態(内部)である。
● ノード110がエッジルータ104のIPアドレス及び/またはMACアドレス(内部)を知っている。
● ノード110におけるすべてのスレッド及び/またはプロトコルハンドらがレディ状態(内部)である。
● 北側(エッジルータ104/境界ネットワーク)からの着信リンク及び南側(サーバ130/生産ネットワーク)からの出力リンクがアクティブ(外部)である。
● ノード110が、ロードバランサ実装内で使用されるネットワーク・インターフェイス制御部(NIC)を介して、パケットを受信し且つ送信できる。例えば、
図23に示されるように、例示的なロードバランサノード110の実施形態において、ノード110は、北向きのNIC1114A及び南向きのNIC1114Bを介して、連続的にパケットを良好に受信し且つ送信する。
【0115】
これらの健康条件の1つ以上が、所定のノード110において保持されない場合には、当該ノード110は健康でないと見なされる。いくつかの実施形態においては、ノード110が健康であると見なされるのは、上記条件のすべてが当該ノード110において保持されている場合のみであることに留意されたい。
【0116】
少なくともいくつかの実施形態において、上記健康条件に加えて、例えば、コントロールプレーン通信のために使用される各ロードバランサノード110上のNIC1114Cとして、
図23において示される第3のNICも、当該NICに対してパケットを送信すること且つ当該NICからパケットを受信することによりヘルスチェックをしているノード110によってチェックされ、第3のNICのチェックが失敗した場合には、チェックされているノード110は不健康と見なされる。
【0117】
図13は、少なくともいくつかの実施形態において、他のロードバランサノードからロードバランサノードに対するヘルスチェックの例示的な方法を示す。この実施例において、ロードバランサノード110Aは、ロードバランサノード110Bに対してヘルスチェックを行っている。ノード110A及び110Bの各々は、北向きのNIC(
図23におけるNIC1114A)及び南向きのNIC(
図23におけるNIC1114B)を有する。1で、ノード110Aは、自分の北向きのNICからノード110Bの北向きのNICに対して、エッジルータ104を介してパケット(例えば、pingパケット)を送信する。ノード110Bは、リストにおいて与えられた上記条件が十分な場合には、自分の北向きのNIC上でパケットを受信して、2で、自分の北向きのNICからファブリック120を介して、ノード110Aの北向きのNICに対して応答を送信する。ノード110Aは、応答を自分の北向きのNIC上で受信した後、3で、自分の南向きのNICからノード110Bの南向きのNICに対して、ファブリック120を介してパケット(例えば、pingパケット)を送信する。ノード110Bは、リストにおいて与えられた上記条件が十分な場合には、自分の南向きのNICにおいてパケットを受信して、4で、自分の南向きのNICからノード110Aの南向きのNICに対して、エッジルータ104を介して応答を送信する。ノード110Aは、自分の南向きのNIC上で応答を受信すると、ノード110Bを健康であると見なし、ノード110Bのローカルな心拍カウンタをインクリメントし、これによって、上記した喧伝プロトコルに従って、他のノード110に伝搬される。
【0118】
いくつかの実施形態において、上記に代わる手段として、ロードバランサノード110Bは、自分の北向きのNICで受信された第1のpingメッセージに対して、自分の南向きのNICを介してノード110Aの南向きのNICに応答し、自分の南向きのNICで受信された第2のpingメッセージに対して、自分の北向きのNICを介してノード110Aの北向きのNICに応答する。
【0119】
さらに、いくつかの実施形態において、ノード110Aもまた、自分自身の第3のNICからノード110Bの第3のNICをping処理することによって、且つ、ノード110Bが健康である場合にノード110Bの第3のNICから自分の第3のNIC上のpingメッセージに対する応答を受信することによって、コントロールプレーン通信(
図23におけるNIC1114Cとして示される)のために使用されるノード110Bの第3のNICに対してヘルスチェックを行う。pingメッセージ及び応答は、1つ以上のコントロールプレーン装置170、例えば、ネットワークスイッチを通過する。
【0120】
上記説明したヘルスチェックメカニズムは、ノード110BのすべてのNICだけでなく、(北、南、及びコントロールプレーンを通過する)すべての方向において、着信リンク、発信リンク、及びノード110Bのデータ経路のすべてを動かし、さらにpingパケットが内部の待ち行列を渉るときのノード110Bの内部の健康、及び、クライアントパケットとしての可能性があるときのノード110Bの送信を検証する。
<ロードバランサノードに対するヘルスチェック責任の割り当て>
【0121】
少なくともいくつかの実施形態において、ロードバランサ実装内のすべてのロードバランサノード110は、例えば、構成機能によって及びまたは
図1に示す構成サービス122の構成要素によって、ロードバランサ実装内の他のすべてのロードバランサノード110のリスト(例えば、ソートされたリスト)に対するアクセスを有する。少なくともいくつかの実施形態において、各ロードバランサノード110は、リスト上の1以上の他のノード110をランダムに選択して、ヘルスチェック間隔ごとにヘルスチェックを行い、健康であると判定された場合にそれらの心拍カウンタをインクリメントする。リストは、ロードバランサ実装内のすべてのロードバランサノード110が、ヘルスチェックメカニズムを介して、現在、健康と見なされているかまたは不健康と見なされているかどうかということを含み、及び、健康なノード110だけでなく、現在、不健康なノード110がリストからランダムに選択されて且つヘルスチェックされることに留意されたい。したがって、現在、不健康なノード110は、当該ノード110に対してヘルスチェックする1以上のノード110によって健康であることが判定され、それの心拍カウンタがインクリメントされて、他のノード110に伝搬されると、当該不健康なノード110は健康な状態に戻る。
【0122】
あるいは、いくつかの実施形態においては、各ロードバランサノード110は、リストの中の1以上の他のノード110に対してヘルスチェックをすること、及び健康であると判定された場合にはそれらの心拍カウンタをインクリメントすることに対する責任を負う。例えば、いくつかの実施形態において、各ノード110は、2つの他のノード、例えば、リストの中で、自分の「左」(または前)及び「右」(または、次)の最も近くの隣接ノード110をヘルスチェックする責任を負う。リストは環状と見なされ、リストの「最後」にあるノード110は、リストの「先頭」にあるノード110をヘルスチェックする責任を負い、逆もまた然りであることに留意されたい。いくつかの実施形態においては、2つの他のノード110は、他の方法で、例えば、リスト上の次の最も近くの2つの隣接ノードとして選択される。いくつかの実施形態においては、各ノード110は、リスト上で2より大きい他のノード110、例えば、3または4の他のノード110をヘルスチェックする責任を負う。少なくともいくつかの実施形態において、或るノード110によってチェックされている隣接ノード110が不健康であると判定された場合には、当該ノード110は、当該不健康な隣接ノード110がチェックする責任を負っていたリスト上で少なくとも1つのノードをヘルスチェックする責任を負う。少なくともいくつかの実施形態において、自分の隣接ノード110(例えば、「左」及び「右」の隣接ノード)のヘルスチェックに加えて、各ロードバランサノード110はまた、定期的または不定期的にランダムにリングの中のノード110を選択して、当該選択されたノード110のヘルスチェックを実行し、それが健康である場合には、当該ランダムなノード110の心拍をインクリメントして伝搬する。少なくともいくつかの実施形態において、順序付きリスト中のすべての他のノード110は、当該他のノード110が以前に健康または不健康と見なされたかどうかにかかわらず、ランダムな選択及びヘルスチェックの対象と見なされる。
【0123】
少なくともいくつかの実施形態において、各ノード110は、1以上のランダムに選択されたノード110に対してヘルスチェックを実行するか、またはその代わりに自分の隣接ノード110及びランダムに選択されたノードに対して、ヘルスチェック間隔と称される一定間隔でヘルスチェックを実行する。例えば、いくつかの実施形態において、心拍間隔は100ミリ秒であるが、さらに短いまたは長い間隔が使用される。さらに、少なくともいくつかの実施形態において、各ノード110は、自分の現在の心拍リストを少なくとも1つの他のランダムに選択されたノード110に対して、喧伝間隔と称される一定間隔で送信または「喧伝」する。いくつかの実施形態において、ヘルスチェック間隔と喧伝間隔とは同じであるが、必ずしも同じでなくてもよい。
【0124】
図14は、少なくともいくつかの実施形態において、1以上のロードバランサノードに対するロードバランサノードのヘルスチェックをグラフィカルに示す。この実施例においては、ロードバランサ実装中に8つのロードバランサノード110A〜110Hが存在する。点線の円は実装中のすべてのノード110の順序付きリストを表わす。いくつかの実施形態において、各ノード110は、リスト上で1以上のノード110をランダムに選択して、各々の間隔でヘルスチェックを行う。また、いくつかの実施形態において、各ロードバランサノード110は、順序付きリスト上の1以上の特定のノード110に対してチェックの責任を負い、例えば、ノード110Aは、
図14に示される順序付きリストに従って、自分に最も近い2つの隣接ノード110B及び110Hに対してヘルスチェックの責任を果たす。さらに、ロードバランサノードはまた、順序付きリストからランダムに他のノード110をヘルスチェック間隔毎に選択する。この実施例に示されるように、ノード110Aは、ランダムにノード110Fを選択してヘルスチェックをする。喧伝間隔では、ノード110Aは、いくつかの他の健康なノード110、例えば、ノード110Dをランダムに選択して、その現在の心拍リストを選択された他のノード110に対して、例えば、UDPメッセージの中で送信する。ノード110は、他のノード110から心拍リストを受信すると、それに従って、自分自身の心拍リストを更新し、当該心拍リストを1以上のランダムに選択されたノード110に対して、次の喧伝間隔で伝搬する。
サーバノードのヘルスチェック
【0125】
上記したようなロードバランサノード110に対するヘルスチェックに加えて、ヘルスチェックプロトコルの実施形態は、ロードバランサモジュール132を含んでいるサーバノード130及びサーバノード130上のサーバ134に対するヘルスチェックを実行する。少なくともいくつかの実施形態において、サーバノード130は、以下に示す1つまたは両方の条件が当該ノード130のために決定された場合には、健康であると見なされる。
● ロードバランサモジュール132が健康である。
● サーバノード130が健康ping(例えば、L7健康ping)に応答するのに成功する。
【0126】
図15は、少なくともいくつかの実施形態において、サーバノードに対してヘルスチェックをするロードバランサノードを示す。少なくともいくつかの実施形態において、ロードバランサ実装中のすべてのロードバランサノード110は、ロードバランサ実装中のすべてのサーバノード130のリストだけでなく、ロードバランサ実装中のすべての他のロードバランサノード110のリストに対するアクセスを有する。リストは、例えば、構成機能を介して及び/または
図1に示される構成サービス122の構成要素を介して、取得され且つ更新される。少なくともいくつかの実施形態において、サーバノード130は、
図15に示されているように、健康なロードバランサノード110に対してコンシステントハッシュ化を行って、
図15に示されるようなコンシステントハッシュリングを形成する。少なくともいくつかの実施形態において、リング内の各サーバノード130は、リング内の2つの健康なロードバランサノード110によってヘルスチェックされる。例えば、
図15において、サーバノード130Aは、ロードバランサノード110A及び110Cによってヘルスチェックされる。これら2つのノード110は、コンシステントハッシュリングにおいて、サーバノード130に対する第1(ノード110A)及び第2(ノード110B)のヘルスチェックノード110と称される。所定の健康なロードバランサノード110は、1より大きいサーバノード130をヘルスチェックすることに留意されたい。例えば、
図15において、ロードバランサノード110Aはまた、サーバノード130B及び130Cをヘルスチェックする。さらに、所定のロードバランサノード110は、1以上のサーバノード130に対しては第1のヘルスチェックノード110であり、1以上の他のサーバノード130に対しては第2のヘルスチェックノード110である。例えば、
図15において、ロードバランサノード110Aは、サーバノード130A及び130Bに対しては第1のヘルスチェックノードであり、サーバノード130C及び130Dに対しては第2のヘルスチェックノードである。
【0127】
少なくともいくつかの実施形態において、ロードバランサノード110に障害が発生した場合には、コンシステントハッシュリング上のメンバーシップが変わるが、依然として健康な、したがって、依然としてコンシステントハッシュリング上にある1以上の他のロードバランサノード110は、当該障害が発生したノード110によって以前にヘルスチェックされたサーバノード130に対するヘルスチェックの責任を負う。
【0128】
少なくともいくつかの実施形態において、健康なノード110の各々は、サーバチェック隔と称される一定間隔で、自分が割り当てられたサーバノード130に対するヘルスチェックを実行する。少なくともいくつかの実施形態において、サーバチェック間隔は、上記説明した喧伝間隔より大きいかまたは喧伝間隔と同じである。
【0129】
少なくともいくつかの実施形態において、サーバノード130に対するヘルスチェックを実行するために、健康なロードバランサノード110(例えば、
図15におけるノード110A)は、サーバノード130(例えば、
図15におけるサーバノード130A)に対して、健康pingメッセージ(例えば、L7 HTTP健康pingメッセージ)を開始する。サーバノード130は、健康である場合には、ロードバランサノード110に対してping応答を返送する。少なくともいくつかの実施形態において、pingメッセージは、サーバノード130上のロードバランサモジュール132によって受信され且つ処理されるので、ヘルスチェックpingは、成功すると、サーバノード130上のモジュール132が健康であると確証する。ロードバランサノード110は、当該pingに対する応答を受信すると、サーバノード130を健康であると見なして、サーバノード130についての心拍カウンタをインクリメントする。
【0130】
少なくともいくつかの実施形態において、所定の健康なロードバランサノード110によってヘルスチェックされたすべてのサーバノード130についての心拍カウンタは、他のロードバランサノード110に伝搬されるが、それは、例えば、ロードバランサノード110の心拍カウンタについて以前に説明した喧伝技法において、各ノード110が自分の心拍リストを少なくとも1つの他のランダムに選択されたノード110に一定間隔(喧伝間隔)で送信し、受信するノード110が自分自身の心拍リストを2つのリストにおける最大値に基づいて更新するという技法に従ってなされる。
障害検出及び喧伝
【0131】
少なくともいくつかの実施形態において、上記したロードバランサノード110のヘルスチェック及びサーバノード130のヘルスチェックを介して得られた情報は、ロードバランサ実装の中のすべてのノード110に伝搬されることを必要とするのは、すべてのロードバランサノード110がロードバランサ実装の中の一貫した表示を維持できるからである。上記したように、少なくともいくつかの実施形態において、ロードバランサノード110は、喧伝プロトコルに従って互いに通信して、この健康情報を交換し且つ伝搬し、ロードバランサノード110及びサーバノード130の障害を検出する。
【0132】
少なくともいくつかの実施形態において、各ロードバランサノード110は、(喧伝間隔と称される)一定間隔で、他のロードバランサノード110をランダムに選択し、ロードバランサノード110及びサーバノード130についての心拍カウンタとともに、健康なロードバランサノード110及びサーバノード130についての自分の表示を他のノード110に送信する。ロードバランサノードまたはサーバノード130は健康である限り、当該ノードは自分のヘルスチェックを合格にし、且つ自分の心拍カウンタは増加を続ける。ノードについての心拍カウンタが、(障害時間間隔と称される)特定間隔において変化しない場合には、当該ノードは、ロードバランサノード110によって障害が発生したと疑われる。一旦ノードに障害が発生したと疑われると、ロードバランサノード110は、当該ノードが不健康であることを判定する前に、(不健康時間間隔と称される)特定間隔の間待つ。この不健康時間間隔は、すべてのロードバランサノード110が当該ノードに障害が発生してしまったことを知るまで、ロードバランサノード110が待つことを許可する。
【0133】
図16は、少なくともいくつかの実施形態において、ロードバランサノード110によって維持される(ロードバランサノード110またはサーバノード130のいずれかの)他のノードの健康に関する状態、またはその表示をグラフィカルに表示する。300に示されるように、ロードバランサノード110が、この問題となるノードが健康であると表示することからスタートすると仮定する。このことは、当該ノードについての心拍カウンタが増加されてきたことを示す。しかしながら、302に示されるように、当該ノードの心拍カウンタが特定間隔(障害時間間隔)において増加しない場合には、304に示されるように、ロードバランサノード110は当該ノードに障害が発生してしまったのではないかと疑う。306に示されるように、当該ノードの心拍カウンタが、特定間隔(不健康時間間隔)において増加しない場合には、308に示されるように、ロードバランサノード110は当該ノードが不健康であると見なす。しかしながら、310に示されるように、不健康時間間隔が無効になる前に、当該ノードについての心拍カウンタがインクリメントする場合には、ロードバランサノード110は、再び当該ノードが健康な300であると見なす。同様に、312に示されるように、不健康なノードに関して心拍のインクリメントを受信した場合には、当該ノードは健康な300として見なされることができる。
【0134】
ノードが不健康であるということを判定することは、当該不健康なノードがロードバランサノード110であるかまたはサーバノード130であるかに依存して、さらにロードバランサノード110と不健康なノードとの関係にも依存して、ロードバランサノード110による異なる動作を含むが、これについては本明細書の他のところで説明する。
ロードバランサノードのデータ
【0135】
少なくともいくつかの実施形態において、各ロードバランサノード110は、ロードバランサ実装の状態に関するデータを維持する。少なくともいくつかの実施形態において、このデータは、各ロードバランサノード110上で、健康なロードバランサノードのリスト、疑わしいロードバランサノードのリスト、及び心拍リストが含まれる1以上のデータ構造において維持される。ただし、含まれるものはこれらに限定されない。
図17は、健康なロードバランサノードのリスト320、疑わしいロードバランサノードのリスト322、不健康なロードバランサノードのリスト324、及びロードバランサノードの心拍リスト326を維持する例示的なロードバランサノード110を示す。
【0136】
少なくともいくつかの実施形態において、各ロードバランサノード110は、健康なロードバランサノードのリスト320を維持するが、そのリストは、例えば、どのノード110が健康であり、したがって喧伝プロトコルに参加しているかどうかを判定するために使用される健康なロードバランサノード110のリストである。リスト320上のノード110のみが、喧伝プロトコルを介してロードバランサ情報の伝搬に含まれ、リスト320上のノード110のみが、コンシステントハッシュリング内に存在すると見なされ、及びこのリスト上のノード110のみが、サーバノード130をヘルスチェックする。ノード110は、このリスト320からランダムに他のノード110を選択して、当該選択されたノードに対して自分の心拍情報が送信される。さらに、心拍カウンタは、現在、健康なロードバランサノードのリスト320に存在するノード110に対してのみ交換される。少なくともいくつかの実施形態において、ロードバランサノードNは、ノードNがロードバランサノード110によるヘルスチェックに合格する場合、または、ロードバランサノード110がノードNに関する喧伝メッセージをリスト320上のいくつかの他のロードバランサノード110から受信する場合には、他のロードバランサノード110の健康なロードバランサノードリスト320に追加されることができる。
【0137】
少なくともいくつかの実施形態において、各ロードバランサノード110は、疑わしいロードバランサノードのリスト322を維持するが、そのリストは、心拍カウンタ(心拍リスト326参照)が(障害時間間隔と称される)特定間隔において増加されなかったロードバランサノードのリストである。ロードバランサノードEが、ロードバランサノード110の疑わしいロードバランサノードのリスト322に存在する場合には、ロードバランサノード110はノードEに関して喧伝しない。健康なリスト320上のいくつかの他のロードバランサノード110が、ノード110の心拍リスト326内のノードEにおける心拍カウンタよりも高い心拍カウンタを有するノードEに関してロードバランサノード110に対して喧伝する場合には、ノードEは疑わしいリスト322から健康なリスト320に移動される。ノードEが、(不健康時間間隔と称される)特定間隔において、ロードバランサノード110の疑わしいリスト322上に留まる場合には、ノードEはロードバランサノード110によって不健康であると見なされ、不健康なノードのリスト324に移動される。不健康なノードのリスト324上のノード110(この実施例では、ノードG)は、ノードGがノード110によるヘルスチェックに合格した場合、または、他のノード110からノードGに関する更新された心拍カウンタを受信した場合には、ロードバランサノード110の健康なノードのリスト320に移動される。
【0138】
少なくともいくつかの実施形態において、各ロードバランサノード110は、すべての知られているロードバランサノード110についての心拍リスト326を維持する。各ノード110に関して、このリスト326は、心拍カウンタ及び当該心拍カウンタが最後に変化した時を示すタイムスタンプを含む。
【0139】
少なくともいくつかの実施形態において、各ロードバランサノード110は、
図17には示されていないが、すべての知られているサーバノードについての心拍リストも維持する。このリストは、ロードバランサノードの心拍リスト326に類似している。いくつかの実施形態においては、2つのリストが組み合わされる。少なくともいくつかの実施形態において、サーバノード130についての心拍情報は、例えば、喧伝プロトコルに従って、ロードバランサノード110についての心拍情報とともに、またはこれに加えて、ロードバランサノード110の中に伝搬される。
【0140】
図17は、4つの別々のリストを示すが、2以上のリストは単一のリストに組み合わされることに留意されたい。例えば、いくつかの実施形態においては、すべてのノード110の単一のリストが、各ロードバランサノード110上で維持され、ビットフラグまたは他のデータ構造が、各ノードが現在、健康であるか、疑わしいか、または不健康かどうかを示すために使用される。
<サーバノードのデータ>
【0141】
少なくともいくつかの実施形態において、ノード130上のサーバノード130及びローカルロードバランサモジュール132は、ロードバランサノード110とともに喧伝プロトコル内に参加することはない。ロードバランサノード110は、ロードバランサノードのヘルスチェック方法によって得られた他のロードバランサノード110についての心拍情報、及び、自分達自身の中のみのサーバノードヘルスチェック方法によって得られたサーバノード130についての心拍情報を喧伝する(特に、各ロードバランサノード110は、現在、自分の健康なロードバランサノードのリスト320上のノードのみに対して喧伝する)。
【0142】
しかしながら、各サーバノード130/ロードバランサモジュール132がロードバランサ実装における健康なロードバランサノード110に関する情報を必要とするのは、サーバノード130が、発信クライアントトラフィクをサーバノード130が転送することができるロードバランサノード110(特に、出口ノード)を決定することができ、且つ、接続公開情報が送信されるロードバランサノードをどれにするかを決定することができるからである。少なくともいくつかの実施形態において、この情報をサーバノード130に対して提供するために、ロードバランサノード110は、現在、健康なロードバランサノード110を識別する情報(例えば、
図17における健康なロードバランサノードのリスト320)を有するサーバノード130を定期的または不定期に更新する。少なくともいくつかの実施形態において、所定のサーバノード130(
図15参照)をヘルスチェックすることに対して責任を負うロードバランサノード110は、サーバノード130に対して、現在、健康なロードバランサノードを識別する情報を提供する責任を負う。例えば、
図15を参照すると、ロードバランサノード110Aは、自分の健康なロードバランサノードのリスト320をサーバノード130A、130B、130C、及び130Dに対して送信し、ロードバランサノード110Bは、自分の健康なロードバランサノードのリスト320をサーバノード130C、130D、及び130Eに対して送信する、と同じように続く。
ロードバランサノードの障害の取り扱い
【0143】
図18A及び18Bは、少なくともいくつかの実施形態において、ロードバランサノードの障害の取り扱い処理を示す。
図18Aは、例示的なロードバランサ実装を示す。ロードバランサ実装には、4つのロードバランサノード110Aないし110Dが存在する。エッジルータ104は、クライアント(図示せず)からの着信パケットをロードバランサノード110にルーティングする。少なくともいくつかの実施形態において、エッジルータ104は、レイヤ4のフロー単位ハッシュ化マルチパス・ルーティング技法、例えば、等価マルチパス(ECMP)ルーティング技法に従って、ルーティングを決定する。少なくともいくつかの実施形態において、エッジルータ104は、ロードバランサ実装において現在使用できるロードバランサノード110について学び、ロードバランサノード110の広告、例えば、ロードバランサノード110によって開始された境界ゲートウェイ・プロトコル(BGP)技術セッションによる広告を介して、クライアントトラフィックを受信する。しかしながら、少なくともいくつかの実施形態において、ロードバランサノード110はBGPセッションを介してエッジルータ104に対して自分自身を広告する代わりに、ロードバランサ実装の中の少なくとも1つの他のノード110が、BGPを介してエッジルータ104に対してノード110を広告する責任を果たす。例えば、
図18Aにおいて示されるようないくつかの実施形態においては、所定のノード110の左及び右の隣接ノード110が、当該所定のノード110をエッジルータ104に対して広告する。例えば、ロードバランサノード110Aはノード110B及び110Dを広告し、ロードバランサノード110Bはノード110A及び110Cを広告し、ロードバランサノード110Cはノード110B及び110Dを広告する。
【0144】
図18Aに示されるように、各ロードバランサノード110はまた、1以上の他のロードバランサノード110、例えば、1以上のランダムに選択されたノード110、ロードバランサノードの順序付きリストによって決定された1以上の隣接ノード110、または1以上の隣接ノード及び1以上のランダムに選択されたノードを定期的にヘルスチェックする。さらに、各ロードバランサノード110は、少なくとも1つのサーバノード130を定期的にヘルスチェックし、健康なロードバランサノード110の自分のリストを、それをヘルスチェックするサーバノードに対しても送信する。ロードバランサノード110及びサーバノード130に関する健康情報は、例えば、喧伝プロトコルに従って、ノード110の中に伝搬される。
【0145】
図18Bは、
図18Aの例示的なロードバランサ実装において、単一のロードバランサノード110における障害の取り扱いを示す。この実施例において、ロードバランサノード110Bは何らかの理由で障害を発生している。例えば、ノード110A及び110Cはノード110Bをヘルスチェックし、両方がそのヘルスチェックでノード110Bに障害があることを検出する。したがって、ノード110A及び110Cは、ノード110Bについての心拍カウンタをインクリメントしない。ノード110A及び110Bの両方からの心拍情報は、喧伝プロトコルに従って、他の健康なロードバランサノード110(この実施例においては、他のロードバランサノードはノード110Dのみである)に伝搬される。すべての健康なロードバランサノード110(この実施例においては、ノード110A、110C及び110D)は、ノード110Bの障害に集中するとすぐに、1以上の以下に示すイベントが発生するが、これらに限定されない。これらのイベントは、必ずしもこの順序では発生するものではないことに留意されたい。
● ノード110A及び110Cは、エッジルータ104に対してしているノード110Bの広告を停止する。少なくともいくつかの実施形態において、このことは、ノード110Bを広告するために、ノード110がエッジルータ104と確立したBGPセッションを終了することを含む。各ノード110は、各他のノード110を広告するために、エッジルータ104と独立したBGPセッションを確立するので、ノード110Bに関するBGPセッションを終了することは、広告されている他のノード110には影響を及ぼさないことに留意されたい。少なくともいくつかの実施形態において、ノード110は、TCP CloseまたはBGPセッションに関する同様のメッセージをエッジルータ104に対して送信することによって、エッジルータ104とのBGPセッションを終了する。
● ノード110Bが、もはやどのノードによっても広告されていないことの検出に応答して、エッジルータ104は、ノード110Bに対するクライアントデータパケットのルーティングを停止する。エッジルータ104はまた、マルチパス(例えば、ECMP)ハッシングも調整して、クライアントからのパケットフローを残りの健康なロードバランサノード110に対して、特に、当該ノード110上の入口サーバ112に対して再分散する。入口サーバ112に対してルーティングされていた任意のパケットフローに関して、当該入口サーバ112はクライアントからサーバへの対応するマッピングを持っていないので、当該マッピングはクライアントからサーバへの接続に関係するフロー追跡部ノードから得られるか、または、その代わりに、新たなクライアントからサーバへの接続が
図10Aないし10Gに示された技法に従って確立される。
● ノード110A及び110Cは、それぞれエッジルータ104に対してBGPセッションを開いてお互いを広告する。ノード110A及び110Cの両方とも、ノード110Bと同様に、ロードバランサノード110Dによってエッジルータ104に広告されているので、ノード110Bに障害が発生した場合に、ノード110Bがエッジルータ104に対するノード110A及び110Bの広告を停止する事実は、エッジルータ104がこれら2つのノード110に対してパケットをルーティングすることを停止する原因にはならないことに留意されたい。
● 少なくともいくつかの実施形態において、ノード110A及び110Cは、互いにヘルスチェックに対する責任を果たすが、それらは今や隣接ノード110だからである。ノード110Bは不健康であると見なされているにもかかわらず、今なお、1以上の他のノード110によってランダムにヘルスチェックがなされることに留意されたい。
● 1以上の残りの健康なロードバランサノード110は、ノード110Bによって以前にフロー追跡されていた接続をフロー追跡することに対して責任を負う。例えば、ノード110C及び/またはノード110Dは、ノード110Bが一次または二次フロー追跡部であった1以上の接続に対して、
図11C及び11Dに示されているように、一次または二次フロー追跡部として引き継ぐ。
● 1以上の残りの健康なロードバランサノード110は、ノード110Bによって以前にヘルスチェックされていたサーバノード130をヘルスチェックする責任を負う。サーバノード130は、残りのロードバランサノード110によって、(今やノード110Bを含まない)健康なロードバランサノードのリストで更新される。例えば、
図18Bにおいて、ロードバランサノード110Aはサーバノード130Cのヘルスチェック及び更新を開始し、ロードバランサノード110Cはサーバノード130Bのヘルスチェック及び更新処理を開始する。
● エッジルータ104上において、障害のあるノード110BからのBGPセッションは、最終的にはタイムアウトになる。また、エッジルータ104は、ノード110Bに障害が発生したことを認識すると、BGPセッションを終了する。
【0146】
2つのロードバランサノード110が同時にまたはほぼ同時に障害になり得る可能性がある。2つのロードバランサノードが互いに隣接していない場合には、その障害は独立しており、
図18Bにおいて示された方法に従って、独立した単一のノード110の障害として取り扱う。しかしながら、障害になった2つのノードが互いに隣接している場合(例えば、
図18Aにおけるノード110B及び110C)には、すべての健康なロードバランサノード110(この実施例においては、ノード110A及び110D)は障害を検出し且つ障害に集中するとすぐに、以下に示す1つ以上のイベントが発生するが、これらには限定されない。これらのイベントは、必ずしもこの順序で発生するものではないことに留意されたい。
● ノード110Aは、エッジルータ104に対してノード110Bに関するBGPセッションを終了する。
● ノード110Dは、エッジルータ104に対してノード110Cに関するBGPセッションを終了する。
● ノード110A及び110Dは、エッジルータ104とのBGPセッションを開始してお互いを広告する。
● ノード110A及び110Dは、お互いのヘルスチェックを開始する。ノード110A及び110Dはまた、障害のあるノード110のヘルスチェックを継続することに留意されたい。
● 残りの健康なノード110は、健康なロードバランサノードのリストでサーバノード130を更新する。
● エッジルータ104からノード110B及び/またはノード110Cへのトラフィックは流れを継続する。何故なら、これら2つのノード110は、エッジルータ104に対してお互いに広告を継続しているからである。しかしながら、これらのBGPセッションは最終的にはタイムアウトになり、エッジルータ104は、適宜残りの広告されているノード110に対してフローを再分散することになる。
● ノード110B及び110Cは、今なおノード110B及び110Cが健康であると考えている場合には、エッジルータ104との間でノード110A及び110Dを広告する自分たちのBGPセッションをていねいに閉じる。
接続公開
【0147】
再び
図1を参照すると、少なくともいくつかの実施形態において、ロードバランサ実装におけるロードバランサノード110は、サーバ130に対するクライアントTCP接続に関する状態情報を維持する。この状態情報は、ロードバランサノード110が、エッジルータ104からの着信クライアントパケットをTCP接続に対して責任のあるサーバノード130に対してルーティングできるようにする。サーバノード130上のロードバランサモジュール132は、自分たちのそれぞれのサーバ134に対するアクティブなTCP接続のリストを維持する。接続公開は、メカニズムであり、それを介して、サーバノード130上のロードバランサモジュール132がアクティブなTCP接続についての自分たちのリストをロードバランサノード110に対して公開する。少なくともいくつかの実施形態において、接続公開のパケットは、接続公開間隔と称される一定間隔で、ロードバランサモジュール132によって形成され、ロードバランサノード110に対して公開される。
【0148】
少なくともいくつかの実施形態において、ロードバランサノード110によって維持される接続状態情報は、キャッシュの形態とし見なされ、特定の接続についての状態情報を維持することは、当該接続に対するロードバランサノード110上のリースを維持することと見なされる。キャッシュエントリが一新されない限り、ロードバランサノード110は、データフローを取り扱うサーバノード130に対するクライアントデータフローのルーティングができない。接続公開のメカニズムは、ロードバランサノード110上のキャッシュ及び、それゆえリースをサーバノード130からの現在の接続状態情報で定期的に一新するので、クライアント160から適切なサーバノード130に対するTCPパケットのフロー処理を維持する。クライアント160がサーバ134に対するTCP接続を終了したときは、サーバノード130上で当該接続に関連しているロードバランサモジュール132は、アクティブな接続についての自分のリストから当該接続を中断し、したがって、接続公開のメカニズムを通じたTCP接続はもはや公開しない。したがって、接続(特に、接続に対する入口サーバ112並びに一次及び二次フロー追跡部116)に関連しているロードバランサノード110上で接続(1つまたは複数のキャッシュエントリ)に対応する接続状態情報は、もはや一新されず、接続はロードバランサノード110によって中断される。少なくともいくつかの実施形態において、接続に対応する1つまたは複数のキャッシュエントリは、メモリがいくつかの他のアクティブな接続を要求するまでは、ロードバランサノード110上のキャッシュの中に残る。
【0149】
このように、接続公開のメカニズムは、定期的または不定期に、入口サーバ112並びに一次及び二次フロー追跡部116上の接続リースを延長して、クライアントトラフィックの流れを継続する。さらに、接続公開のメカニズムは、少なくともいくつかのロードバランサノード110の障害から回復するのに役立つ。クライアント接続の状態情報を保持している1以上のロードバランサノード110が失敗した場合には、接続公開によって残りのロードバランサノード110に供給されているアクティブな接続情報は、あるいくつかの場合には、接続を回復するために使用される。
【0150】
接続公開のメカニズムを使用すれば、サーバノード130は、サーバ134とクライアント160との間の接続の状態に関する信頼できる送信元になる。さらに、サーバ134に対する接続を閉じることは、サーバノード130上のロードバランサモジュール132及びロードバランサノード110によって受動的に取り扱われる。サーバノード130とロードバランサノード110との間では、ハンドシェイクは必要でない。言い換えれば、ロードバランサモジュール132は、特定の接続が閉じられているノードを積極的に通知するために、ロードバランサノード110に対してメッセージを送信する必要はない。サーバ134が接続を閉じた場合には、サーバ134は当該接続に関する自分の内部状態を消去する。ロードバランサモジュール132は、サーバ134の内部状態を用いて、接続公開パケットを追加する。サーバ134の内部状態の中には当該接続はもはや存在しないので、当該接続は、ロードバランサノード110に対して公開されることはない。このため、ロードバランサノード110上の当該接続に関するリースは失効し、ロードバランサノード110は、当該接続について受動的に忘れる。したがって、ロードバランサノード110のキャッシュにおいて当該接続のために使用されていたメモリは、必要に応じて、他の接続のために使用されることが可能になる。
【0151】
いくつかの実施形態において、ロードバランサノード110によって維持されている接続についてのリースは、キャッシュ内で接続についてのタイムスタンプ用のエントリを含む。接続のリースは接続公開処理パケットによって一新されるとき、タイムスタンプは更新される。サーバノード130上のロードバランサモジュール132によって公開されていた接続がもはや存在しないことから、接続のリースが一新されない場合には、タイムスタンプはもはや更新されない。少なくともいくつかの実施形態において、メモリが必要になるまで、接続についてのエントリがキャッシュ内に残っているところでは、レイジー・ガベージコレクション方法が使用される。例えば、少なくともいくつかの実施形態において、キャッシュエントリ上のタイムスタンプは、リースの一新時間の閾値と比較され、キャッシュエントリについてのタイムスタンプが閾値よりも古い場合には、当該エントリは古いので再利用される。しかしながら、いくつかの実施形態では、古いエントリは、積極的にガベージ収集される。
接続公開の配信先
【0152】
少なくともいくつかの実施形態において、各クライアントTCP接続について、接続状態を維持する3つのロードバランサノード110、すなわち、入口サーバ112としての機能を果たしているノード110、一次フロー追跡部116としての機能を果たしているノード110、及び二次フロー追跡部ノード116としての機能を果たしているノードが存在する。所定のTCPフローについて、例えば、ロードバランサノード110によって、コンシステントハッシュリングの中で一次フロー追跡部116及びそれに続くノードを見つけるために、TCPフローに対してコンシステントハッシュ機能を適用して、一次及び二次フロー追跡部116が判定される。TCPフローに対して入口サーバ112としての機能を果たしているロードバランサノード110は、エッジルータ104の内部マルチパス(例えば、ECMP)ハッシュ機能に基づくエッジルータ104からの当該フローに関するトラフィックを受信するノード110である。ノード110の障害または追加がある場合には、入口サーバ112としての機能を果たしているロードバランサノード110は、多くのアクティブなTCPフローに対して変化し、さらに少なくともいくつかのアクティブなTCPフローに対してフロー追跡部として機能しているロードバランサノード110は変化する(例えば、
図11Aないし11D参照)。サーバノード130上のサーバ132に対するすべてのTCPフローについて、サーバノード130上のロードバランサモジュール132が、いずれのロードバランサノード110が当該TCPフローに対する入口サーバ112であるかを示している状態情報を維持するのは、それが当該ロードバランサノード110からのトラフィックを受信するからである。しかしながら、少なくともいくつかの実施形態において、ロードバランサモジュール132が、どのロードバランサノード110がTCPフローに対して一次及び二次フロー追跡部としての機能を果たしているか分からず、且つ、決定することができないのは、ロードバランサモジュール132は、使用されるコンシステントハッシュ機能が分からないからである。言い換えれば、少なくともいくつかの実施形態において、ロードバランサモジュール132は、コンシステントハッシュ法を行わない。
アクティブな接続情報の公開
【0153】
図19A及び19Bは、少なくともいくつかの実施形態において、接続公開の技法をグラフィカルに示す。
図19Aは、ロードバランサノードに対して、アクティブな接続情報を公開しているロードバランサ(LB)モジュールを示す。少なくともいくつかの実施形態において、各ロードバランサモジュール132は、サーバノード130上でアクティブなTCPフローの各々に対する情報を収集して、接続公開パケットを形成する。所定のTCPフローに対する情報は、当該フローに対して入口サーバ112としての機能を果たしているロードバランサノード110を識別する情報を含む。接続公開の準備ができた場合(例えば、接続公開間隔に到達した時)には、上記したように、ロードバランサモジュール132は、例えば、サーバノード130をヘルスチェックするロードバランサノード110からサーバノード130に対して定期的に送信される健康なロードバランサノード110のリストから、ランダムにロードバランサノード110を選択する。ロードバランサモジュール132は、次に、選択されたノード110に対して、接続公開パケットを送信する。例えば、
図19Aにおいて、ロードバランサモジュール132Aは、ロードバランサノード110Aに対して1つの接続公開パケットを送信し、後でロードバランサノード110Bに対してもう1つの接続公開パケットを送信する。
【0154】
図20は、少なくともいくつかの実施形態において、各ロードバランサモジュール132によって実行される接続公開方法の上位のフローチャートである。500に示されるように、ロードバランサ(LB)モジュール132は、それぞれのサーバノード130上のすべてのアクティブなTCPフローに対する接続公開エントリを生成する。少なくともいくつかの実施形態において、ロードバランサモジュール132は、例えば、サーバノード130上の/proc/net/tcpから、サーバノード130上のサーバ134が取り扱うアクティブなTCP接続の組み合わせを検索する。すべてのアクティブなTCP接続について、ロードバランサモジュール132は、(例えば、ローカルに維持されているアクティブな接続のテーブルの中で)TCPフローに対して入口サーバ112として機能しているロードバランサノード110を探索して、接続に対するTCPタプル(例えば、クライアントIPアドレス、クライアントポート、サーバ(パブリック)IPアドレス、及びサーバポートから構成される4タプル)及び接続に対応する入口サーバ112を示す接続公開エントリを生成する。各ロードバランサモジュール132は、接続に対してパケットが受信された最後のロードバランサノード110を示している各アクティブなTCP接続に関する情報を維持し、この情報はロードバランサモジュール132によって使用されて、各アクティブな接続に対する入口ノード110を識別することに留意されたい。
【0155】
502に示されるように、ロードバランサモジュール132は、(1以上の接続公開エントリで、1つのエントリが各アクティブなTCP接続に対応する)接続公開パケットを送信すべきロードバランサノード110をランダムに選択する。少なくともいくつかの実施形態において、ロードバランサモジュール110は、ロードバランサモジュール132が送信準備のできた接続公開パケットを決定したときに、ランダムに選択される。少なくともいくつかの実施形態において、この決定は、接続公開間隔に従って行われる。限定されない実施例として、接続公開間隔は、100ミリ秒(ms)、または1秒である。少なくともいくつかの実施形態において、ロードバランサモジュール110は、ロードバランサノード110の1つから以前に受信された健康なロードバランサノード110のリストから選択される。504に示されるように、ロードバランサモジュールは次に、選択されたロードバランサノード110に対して、接続公開パケットを公開する。少なくともいくつかの実施形態において、接続公開パケットは、ステートレスパケット、例えば、UDPパケットである。いくつかの実施形態では、接続公開パケットは、目標のロードバランサノード110に対して当該パケットを送信する前に圧縮される。少なくともいくつかの実施形態において、接続公開情報は、目標のロードバランサノード110に対して、2以上のパケットの中で送信される。
【0156】
要素504から要素500に戻る矢印に示されるように、ロードバランサモジュール132は、連続的に接続公開パケットを構築し、ランダムにノード110を選択し、当該パケットを当該選択されたノードに送信する。上記したように、このことは、ロードバランサノード110が現在のアクティブな接続情報により相対的且つ規則的に更新されて、ロードバランサノード110上の接続リースを維持するように、接続公開間隔に従って実行される。
【0157】
少なくともいくつかの実施形態において、接続公開パケットは、ロードバランサモジュールによってロードバランサノード110に対してランダムに分散されるので、当該接続公開パケットを受信するロードバランサノード110は、当該接続公開パケット内のアクティブな接続情報を当該接続のための適切な入口/一次/二次ノード110に対して分散することに責任がある。
図19B及び、
図21及び22は、少なくともいくつかの実施形態において使用されるアクティブな接続情報の分散方法を示す。
【0158】
図19Bは、少なくともいくつかの実施形態において、アクティブな接続情報をロードバランサノード110の中に分散することを示す。ロードバランサノード110がロードバランサモジュール132から接続公開パケットを受信した場合には、ロードバランサノード110は、当該フローに対応する入口ノード及び一次及び二次フロー追跡部ノードを決定するために、そこに示された各TCPフローに関する情報を分析する。ロードバランサノード110がフローに関するそれらの役割の1つを果たしている場合には、ロードバランサノード110は、当該フローに関する情報を消費する(例えば、状態情報に関する自分のキャッシュを更新することによって)。少なくともいくつかの実施形態において、ロードバランサノード110はまた、当該フローに関する他の役割を果たしている1以上の他のノード110に対して送信されるパケットの中に、当該フローに関する情報を配置する。接続公開パケットによって示されている残りのフローについて、ロードバランサノード110は、アクティブな接続情報を2以上のもっと小さなパケットに分割して、1以上の他のロードバランサノード110に送信する。例えば、少なくともいくつかの実施形態において、1以上のフローに関するアクティブな接続情報を有するパケットは、当該フローに対して入口サーバ112、一次フロー追跡部116A、及び二次フロー追跡部116Bとしての機能を果たしているロードバランサノード110に送信される。
【0159】
図21は、少なくともいくつかの実施形態において、目標のロードバランサノード110に対する接続公開パケット内で受信されるアクティブな接続情報の配信方法のフローチャートである。520に示されているように、ロードバランサノード110は、ロードバランサモジュール132から接続公開パケットを受信する。ロードバランサモジュール132は、例えば、
図19A及び20を参照して上記説明したように、パケットを受信するため、パケットを生成して、ロードバランサノード110を選択した。接続公開パケットは、そこからのパケットが受信されたサーバノード130を識別している情報(例えば、サーバノード130上のロードバランサモジュール132のIPアドレス)、及び、アクティブなTCP接続(例えば、クライアントIPアドレス、クライアントポート、サーバ(公開)IPアドレス、及び各接続に対応するサーバポートから構成される4タプル)を識別しているエントリのリストを含む。
【0160】
図21の要素522ないし530において、ロードバランサモジュール110は、受信された接続公開パケットにおいて示されているアクティブなTCP接続情報を繰り返し処理する。522に示されているように、ロードバランサノード110は、パケットの中の次のTCPフローにおけるエントリを分析して、それぞれのTCPフローに対応する入口ノード110及び一次及び二次フロー追跡部ノード110を決定する。少なくともいくつかの実施形態において、ロードバランサノード110は、接続公開エントリから入口ノード110のアイデンティティを取得する。少なくともいくつかの実施形態において、TCPフローに対応する一次及び二次フロー追跡部ノード110は、コンシステントハッシュ機能に従って決定される。524において、ロードバランサノード110が検査されているTCPフローに対する役割の1つで機能を果たしている場合には、526において、ロードバランサノード110は、例えば、状態情報に関する自分のキャッシュを更新することによって、フローに関する情報を消費する。528に示されているように、ロードバランサノード110は、他のロードバランサノード110に対して送信されるべく組み立てられているパケットに、TCPフローに対する接続公開エントリを追加する。530において、接続公開パケットの中にさらなる接続公開エントリが存在する場合には、方法は522に戻って、次のエントリを処理する。そうでない場合には、ロードバランサノードは、532に示されているように、最初の接続公開パケットからの接続公開エントリのサブセットを各々が含む新たに組み立てられたパケットを、当該パケットに対応する目標のロードバランサノード110に送信する。少なくともいくつかの実施形態において、目標のロードバランサノード110に送信されたパケットは、ステートレスパケット、例えば、UDPパケットである。いくつかの実施形態において、パケットは、目標のロードバランサノード110に当該パケットが送信される前に圧縮される。
【0161】
したがって、少なくともいくつかの実施形態では、
図21の要素522ないし528において、フロー追跡部ノード110は、受信された接続公開パケットにおける接続公開エントリから522で決定される情報に従って、他のノード110の特定の1つに各々が送信される1以上のパケット(例えば、UDPパケット)を組み立てる。少なくともいくつかの実施形態において、他のノード110に送信されるパケットは、目標のノード110が入口ノード110、一次フロー追跡部ノード110、または二次フロー追跡部ノード110としての機能を果たしているTCPフローについてのエントリを含む。いくつかの実施形態において、所定のロードバランサノード110は、TCPフローに対して入口ノード及び一次フロー追跡部ノードの両方としの機能を果たし、またはTCPフローに対して入口ノード及び二次フロー追跡部ノードの両方としての機能を果たすことに留意されたい。
【0162】
図22は、少なくともいくつかの実施形態において、接続公開パケットの中で受信されたアクティブな接続情報を目標のロードバランサノード110に対して分散する他の方法を示す。550に示されているように、ロードバランサノード110は、ロードバランサモジュール132から接続公開パケットを受信する。この方法においては、552に示されているように、ロードバランサノード110上のプロセスは、パケット内の接続公開エントリを分析し、それに応じて、受信されたパケットを1以上のより小さなパケットに分割する。ロードバランサノード110は、この処理中においてフロー情報をローカルに消費することはない。一旦接続公開パケットが1以上のパケットに分割されると、当該パケットは、554ないし560に示されているように処理される。554において、パケットに対応する目標のノード110がこのロードバランサノード110である場合には、当該ロードバランサノード110は、556に示されているように、ローカルにパケットを消費する。そうでない場合には、パケットは目標のロードバランサノード110に送信される。560において、さらに処理されるべきパケットが存在する場合には、方法は554に戻る。そうでない場合には、方法は終了する。
【0163】
したがって、ロードバランサモジュール132から接続公開パケットを受信するロードバランサノード110は、当該接続公開パケットを、他のロードバランサノード110のうち特定のものに固有の2以上のより小さなパケットに分割し、それに応じて、当該パケットを分散するが、一方、現在、当該ロードバランサノード110によって取り扱われている任意のTCPフローに関するフロー情報を内部で消費する。その間に、他のロードバランサノード110もまた、ロードバランサモジュール132から接続公開パケットを受信しており、接続公開エントリを多数のより小さいパケットに分割し、当該より小さいパケットを目標のノード110に分散して、これによりアクティブな接続情報をノード110の中に分散する。
接続公開のトリガ
【0164】
少なくともいくつかの実施形態において、接続公開は、1以上の異なるイベントによってロードバランサモジュール132上でトリガされる。前述のように、いくつかの実施形態において、接続公開パケットは生成されて、接続公開間隔、例えば、100ミリ秒または1秒の間隔に従って、ランダムに選択されたロードバランサノード110に対して送信されて、ロードバランサノード110上のTCP接続に対するリースを一新する。いくつかの実施形態において、ロードバランサノード110のメンバーシップの変化は、即時の接続公開イベントをトリガする。少なくともいくつかの実施形態において、ロードバランサモジュール132は、それぞれのサーバノード130をヘルスチェックするロードバランサノード110の1つから送信された健康なロードバランサノード110のリストから当該変化について学ぶ。リストによって変化(削除または追加のいずれか)を検出したときには、当該変化によって影響を受けるTCP接続は、当該ロードバランサノード110によってさらに迅速に回復されるように、ロードバランサモジュール132が接続公開パケットを生成して、ロードバランサノード110に送信する。
パケットループの防止
【0165】
接続公開パケットの処理中にロードバランサレイヤのメンバーシップが変化したときは、接続公開パケットのループが発生する。第1のノード110がロードバランサモジュール132から接続公開パケットを受信し、より小さなパケットを第2のノード110に送信する。しかしながら、メンバーシップが変化していた場合には、当該第2のノード110は、当該パケットは第1のノード110に行くべきだと判定し、このため当該パケットを第1のノード110に転送する。少なくともいくつかの実施形態において、このループが発生するのを防ぐために、ロードバランサモジュール132から受信される接続公開パケット及びロードバランサノード110から受信される接続公開パケットのために異なるポート番号が使用され、ロードバランサノード110は、他のロードバランサノード110から受信される接続公開パケットを再分配しない。
接続公開パケットの分散の代替
【0166】
上記された接続公開方法において、ロードバランサモジュール132は、接続公開パケットが送信されるロードバランサノード110をランダムに選択する。しかしながら、いくつかの実施形態において、ロードバランサノード110を選択するために他の方法が使用される。例えば、いくつかの実施形態において、ロードバランサノード132は、1以上のアクティブなTCPフローを取り扱う特定の入口ノード110を各々が目標にする1以上の接続公開パケットを組み立てて、目標の入口ノード110に対してパケットを送信した。入口ノード110は、アクティブな接続情報を接続に対応する一次及び二次フロー追跡部に再分配するであろう。他の実施例として、いくつかの実施形態において、単一のランダムに選択されたノード110に対して接続公開パケットを送信する代わりに、各接続公開パケットは、ロードバランサモジュール132によって2以上の健康なノード110またはすべての健康なノード110に送信される。
ロードバランサノードのアーキテクチャ
【0167】
図23は、少なくともいくつかの実施形態におけるロードバランサノード110についての例示的なソフトウェアスタックのアーキテクチャを示すが、この図に限定する意図ではない。この例示的なソフトウェアスタックのアーキテクチャにおいて、ロードバランササーバのネイティブコード1106及びコアパケットのプロセスコード1108、例えば、インテル(登録商標)のデータプレーン開発キット(DPDK)技術コードを含むネイティブコードのレイヤを管理するためのJavaネイティブ・インターフェイス(JNI:登録商標)1104技術を使用する単一のJava(登録商標)技術プロセス1102の範囲内で、ロードバランサノード110は動作する。ネイティブコードは、2つのネットワーク・インターフェイス・コントローラ(NIC1114A及び1114B)にインターフェイスする。第1のNIC(NIC1114A)は、「北」に面していて、すなわち、エッジルータ104に向いている。第2のNIC(NIC1114B)は、「南」に面していて、すなわち、サーバノード130に向いている。少なくともいくつかの実施形態において、NIC1114A及び1114Bは、TCPスタックを維持しない。したがって、少なくともいくつかの実施形態は、ロードバランサノード110がコントロールプレーンを介して、プロセスと通信できるように、また、逆方向も同様にできるように、TCP接続をサポートする第3のNIC1114Cを備える。また、いくつかの実施形態において、第1の北向きのNIC1114A及び第2の南向きのNIC111Bだけは、ロードバランサノード110の中に実装され、且つ、第2の南向きのNIC1114BはTCPスタックを実装し、それを介したロードバランサノード110がコントロールプレーンを介したプロセスと通信する。ロードバランサノード110はまた、オペレーティングシステム(OS)技術ソフトウェア1112、例えば、Linux(登録商標)カーネル、及び、OS技術ソフトウェア1112及びJNI1104技術に加えてJava仮想マシン(JVM:登録商標)技術ソフトウェア1110のレイヤを有する。
【0168】
少なくともいくつかの実施形態において、分散型ロードバランシングシステムのロードバランサノード110の各々は、多くのデータフローを高いパケット速度で同時に処理する必要がある。少なくともいくつかの実施形態において、スループットの必要なレベルを達成するためには、ロードバランサノード110は、高性能のパケット処理のために、インテル(登録商標)・データプレーン開発キット(DPDK)技術を活用する。DPDK技術は、ユーザ空間のプログラムが、ネットワーク・インターフェイス・コントローラ(NIC)から及びネットワーク・インターフェイス・コントローラ(NIC)へ直接パケットの読み込み/書き込みすることを可能にし、Linuxカーネルの
ネットワーキングスタック(Linus ixgbeベースのNICドライバを除く)の多くのレイヤをバイパスする。パケット処理に取り組むDPDKは、ビジーループの中で直接的にNICハードウェアをポーリングする専用のCPUコアを優先して、割り込みハンドラベースの入力を拒絶する。この取り組みは、ビジーループの中で専用のCPUコアを連続的に動かすことによる熱出力の増加を犠牲にして、さらに高いパケット速度を実現する。DPDK技術はまた、CPUコア管理、ロックフリーの待ち行列、メモリプール、及び同期プリミティブを含むパケット処理のためのツールを提供する。
図24に示されているように、DPDK技術では、専用のCPUコア600が各特定のタスクのために使用され、作業は、無閉鎖の待ち行列602を用いて1つのCPUコア600Aから他のCPUコア600Bに渡される。
【0169】
DPDK待ち行列602は、2つのリングバッファの高速パワーを使用して実装され、単一及び多数の生産者/消費者の変数の型をサポートする。多数の生産者/消費者の変数の型は、すべてがロックフリーではないのは、それらがアクセスを同期するためにコンペア・アンド・スワップ(CAS)のループを有するからである。すべてのパケット・バッファメモリは前もってメモリプールに割り当てられているので、バッファに対するポインタのみが、待ち行列602について読みだされ且つ書き込まれる。メモリプールは、待ち行列として実装され、メモリのチャネル及びランクに亘ってメモリを分散するために最適化され、不均等メモリアクセス(NUMA)の最適化分配をサポートする。少なくともいくつかの実施形態において、パケット・バッファは、各パケット・バッファにおけるヘッドルーム及びtailroomを十分に過剰割り当てするMbufパラダイムなどの方法を使用して、バッファのコピーを必要とすることなく、外部ネットワークレイヤのヘッダを追加/削除するカプセル化/デカプセル化の操作をサポートする。
【0170】
ロードバランサノード110の少なくともいくつかの実施形態において、コアパケット処理のアーキテクチャは、DPDK技術を活用して実装される。各ロードバランサノード110は、コアパケット処理のアーキテクチャに従って、実装されている少なくとも1つのマルチコア・パケット・プロセッサを有する。コアパケット処理のアーキテクチャは、マルチコア・パケット・プロセッサの待ち行列及びコアを通過するパケットフローのために、単一の生産者/単一の消費者のパラダイムを使用する。このパラダイムにおいて、各待ち行列は1つの及び1つのみのコアに入力し、各コアは自分がパケットを供給する他のコアの各々に対する1つの及び1つのみのコアに出力する。さらに、マルチコア・パケット・プロセッサ内のコアによって使用されるメモリは共有ではなく、各コアは自分自身の独立したメモリ領域を有する。したがって、コア間で共有するメモリまたは待ち行列はなく、メモリ競合または待ち行列競合はなく、リクエスト・オブ・オーナーシップ(RFO)またはコンペア・アンド・スワップ(CAS)などのメモリまたは待ち行列共有メカニズムは必要ない。
図25及び
図26は、コアパケット処理のアーキテクチャに従って、実装されている例示的なマルチコア・パケット・プロセッサを示す。
【0171】
図25は、少なくともいくつかの実施形態において、DPDK技術を活用してデータフローを処理するコアパケット処理のアーキテクチャに従って、実装されている例示的なマルチコア・パケット・プロセッサを示す。コアパケット処理のアーキテクチャは、単一の生産者/単一の消費者のパラダイムに従って、マルチコア・パケット・プロセッサとして実装される。少なくともいくつかの実施形態において、
図23に示されているように、ロードバランサノード110の各々は、2つのネットワーク・インターフェイス・コントローラ(NIC)すなわち境界ネットワーク/エッジルータ104に面する北向きNIC1114A及び生産ネットワーク/サーバノード130に面する南向きNIC1114Bを有する。少なくともいくつかの実施形態において、NIC1114は、10GbpsのNICである。ロードバランサノード110を通って流れる主なパケットは、これら2つのNICの1つ(NIC1114Aまたは1114Bのいずれか)で受信され、処理され(例えば、カプセル化またはデカプセル化され)、他のNIC(NIC1114Bまたは1114Aのいずれか)に送信される。
【0172】
図25を参照すると、少なくともいくつかの実施形態において、ロードバランサノード110は、各NIC1114において、2つのCPUコア、受信(RX)コア610及び送信(TX)コア630をスピンアップする。ロードバランサノード110はまた、両方のNIC1114に対するパケットを両方向で処理する多くのワーカーコア620をスピンアップする。この実施例においては、4つのワーカーコア620Aないし620Dが使用される。受信コア610は、各受信コア610が各ワーカーコア620に対応するそれぞれのワーカー入力待ち行列612の中にパケットを供給する場合に、それらの入力待ち行列からの着信パケットがNIC1114に到達したときにそのバッチを読み取り、各パケットに対するワークのバルクを実行するワーカーコア620に対して当該パケットを分散する。少なくともいくつかの実施形態において、受信コア610は、(クライアント接続のIPアドレス及びポートによって識別される)任意の特定のクライアント接続が同一のワーカーコア620によって処理されることを保証するとともに、各着信パケットに対してレイヤ4の「フローハッシュ」技法(前に説明したように、エッジルータ104によって使用される同様のフロー単位ハッシュ化マルチパス・ルーティング技法)を実行し、当該パケットをワーカーコア620に分散する。このことは、各ワーカーコア620がパケットの同一のサブセットを常に監視することを意味し、ロックが要求されないように、ワーカーコア620によって管理されている状態データ上の競合を排除する。受信されたパケットへのポインタは、ワーカーコア620が新たな入力について連続的に監視するワーカー待ち行列622に亘って分散される。ワーカーコア620は、各接続に対する(例えば、割り当てられたサーバノード130の)状態を管理する責任を負うとともに、アウトバウンド待ち行列632の1つにパケットを転送する前に、パケットに対してUDPのカプセル化またはデカプセル化を実行する。送信コア630は、ワーカーコア620を介してアウトバウンド待ち行列632を循環させ、出力パケットが待ち行列632上に現れたときに、それらの対応するNIC1114に対して当該出力パケットを書き込む。
【0173】
図26は、少なくともいくつかの実施形態において、DPDK技術を活用してデータフローを処理するコアパケット処理のアーキテクチャに従って、実装されている他の例示的なマルチコア・パケット・プロセッサを示す。コアパケット処理のアーキテクチャは、単一の生産者/単一の消費者のパラダイムに従って、マルチコア・パケット・プロセッサとして実装される。少なくともいくつかの実施形態において、高いスループットのクライアントTCPフローに加えて、ロードバランサノード110上のDPDKコアのアーキテクチャが使用され、ARP、DHCP、及びBGPなどの他のプロトコルについて、北及び南向きNIC1114上のパケットを送信し且つ受信する。
図26に示されている実施形態において、ワーカーコア620Aは、これらの他のプロトコルにおいてパケットを取り扱うために専用化されている。このワーカーコア620Aは「遅い」ワーカーコアと称されるが、それは一般的にクライアントTCPフローよりも遅い速度で発生するパケットを処理するからである。これに対して、クライアントTCPフローのみを処理する他のワーカーコア620Bないし620Dは、速いワーカーコアと称される。北向き及び南向きNIC1114上でそれぞれ着信パケットを取り扱う受信コア610A及び610Bは、遅いワーカーコア620Aによって取り扱われるべきパケットを識別すると、当該パケットを遅いワーカーコア620Aに対応する入力待ち行列622に導く。遅いワーカーコア620Aもまた、Java/JNIによって生成されたパケットに対応する入力待ち行列622、及びJava/JNIに対する出力パケットに対応する出力待ち行列634を監視する。遅いワーカーコア620Aは、速いワーカーコア620Bないし620Dの各々に対して、パケット、例えば、接続公開パケットを送信できるように、遅いワーカーコア620Aも、速いワーカーコア620Bないし620Dの各々に対応する入力待ち行列622に対して出力する。遅いワーカーコア620Aはまた、送信コア630A及び630Bの各々に供給するアウトバウンド待ち行列632を有する。
【0174】
少なくともいくつかの実施形態において、速いワーカーコア620Bないし620Dの各々の第3の入力待ち行列622は、遅いワーカーコア620Aからの出力待ち行列である。少なくともいくつかの実施形態において、例えば、この第3の入力待ち行列622は、各々が接続状態情報を有している接続公開パケットを受信するため且つ処理するために、速いワーカー待ち行列620Bないし620Dによって使用される。これらの接続公開パケットの少なくともいくつかについては、送信コア630に対する出力が存在しない。その代わりに、パケットにおける接続状態情報は、例えば、それぞれの速いワーカーコア620が維持する1以上のパケットフローに関する記憶された状態を更新することで、速いワーカーコア620によって消費される。したがって、速いワーカーコア620Bないし620Dに対して入力する遅いワーカーコア620Aからの出力待ち行列は、速いワーカーコアに記憶された状態を更新するために受信コア610から直接入力待ち行列622以外の経路を提供する。
【0175】
少なくともいくつかの実施形態において、
図25及び26のマルチコア・パケット・プロセッサは、着信パケットをフィルタ処理して、有効なパケットのみを処理し且つ出力する。例えば、少なくともいくつかの実施形態において、受信コア610は、いずれのワーカーコア620によってもサポートされていないプロトコルのパケットをフィルタ処理で除外するので、当該パケットをワーカーコア620に対して送信しない。少なくともいくつかの実施形態において、ワーカーコア620の各々は、パケットを処理する場合に、パケットがさらに処理することが受諾できるものかどうかを判定するため、及び、送信コア630に対して出力するため、最初に該当するそれぞれのワーカー入力待ち行列622から読み出したパケットを分析して、次に、受諾する送信コア630に対する当該パケットのみ処理及び出力を完了する。受諾できないパケットは廃棄される。例えば、ワーカーコア620は、各パケットのアドレス情報を調べて、負荷分散されている有効なアドレスに的を絞ったパケットのみ受諾し、すべての他のパケットを廃棄する。
境界ゲートウェイ・プロトコル(BGP)データの取り扱い
【0176】
少なくともいくつかの実施形態において、コアのアーキテクチャの内部及び外部でBGPクライアントに関連するパケットフローは、以下のように取り扱われる。NIC1114A及び1114BはLinuxカーネルには向かわないので、エッジルータ104に対するTCP接続は、
図26に示されているように、コアのアーキテクチャによって中断され、遅いワーカーコア622Aによって処理され、遅いワーカーコア622Aは、出力待ち行列634を介してJava空間の中に当該BGPパケットを渡す。これらのTCPパケットは、ロードバランサノード110上の1以上のモジュールによってさらに処理された後、TCP接続を管理し且つTCPストリームに当該パケットを有効に変換するLinuxカーネルによる処理を含め、BGPクライアントに対して配信される。このデザインは、BGPクライアントが標準のJavaTCPソケットライブラリを用いて書かれるようにする。
【0177】
図27は、少なくともいくつかの実施形態において、ロードバランサ(LB)ノード処理部650による着信BGP TCPパケットの処理を示す。エッジルータ104からのパケットは、北向きNIC640に到達し、受信コア652に対応する入力待ち行列640の中に進む。受信コア652は、待ち行列640からパケット、BGPパケットとして識別されたパケットを読み取り、遅いワーカーコア656に対応する入力待ち行列654上にパケットを配列する。遅いワーカーコア656は、パケットを確認して、JNI出力待ち行列658上にパケットを配列する。JNIパケット受信器660は、JNIを介して待ち行列658からパケットを読み取り、送信元/宛先アドレスを分解し、rawソケット644に書き込む。Linuxカーネル646は、未処理パケットを受信し、TCPプロトコルに従って当該パケットを取り扱い、TCPソケット入力ストリームにペイロードを追加する。パケットからのデータは、次に、BGPクライアント662の中のJava TCPソケットに対して配信される。
【0178】
図28は、少なくともいくつかの実施形態において、ロードバランサ(LB)ノード処理部650による発信BGP TCPパケットの処理を示す。BGPクライアント662は、Linuxカーネル646のJava TCPソケットにデータを書き込む。Linuxカーネル646は、TCPプロトコルに従って、データを取り扱い、データをTCPパケットに変換する。少なくともいくつかの実施形態において、TCPパケットは、127.x.x.x iptables規則に合致する。TCPパケットは、出力待ち行列648、例えば、Netfilter LOCAL_OUTの待ち行列に配列される。JNIを介して待ち行列648を監視しているJNIパケット受信器670のJavaスレッドは、TCPパケットを受信し、各NF_STOLENを印付けしてカーネル646がTCPパケットに関して忘れるようにする。Javaスレッドは、送信元/宛先アドレスを分解して、遅いワーカーコア656に対応するJNI入力待ち行列672にパケットをJNIを介して追加する。遅いワーカーコア656は、自分のJNI入力待ち行列672からTCPパケットを受信し、北向きNIC640の送信コア666に対応するアウトバウンド待ち行列664上にパケットを配列する。送信コア666は、自分の入力待ち行列664からTCPパケットを読み取り、北向きNIC640にそれらを書き込む。TCPパケットは、NIC640によってエッジルータに送信される。
分散型ロードバランサのシミュレーション及び試験
【0179】
本明細書に記載されているロードバランサは、多数の独立した構成要素(例えば、ルータ、ロードバランサノード、ロードバランサモジュール等)の対話を要求する分散型システムである。ノード障害、メッセージ欠落、及び遅延などのシナリオをシミュレーションするためだけでなく、分散型の構成要素、ロジック、及びプロトコルの試験を実施するために、複雑なネットワークトポロジ(例えば、生産ネットワーク)においてマルチホストに配備されるためのコードを必要とすることなく、対話が試験できるところで、単一のプロセスにおいて動かせる分散型ロードバランサを可能にする試験システムの実施形態を説明する。このことを達成するために、単一のプロセスにおいてまたは単一のプロセスとして多数のロードバランサの構成要素が構成され且つ実行されることを可能にするメッセージバスと称されるソフトウェアのメカニズムを説明する。当該単一のプロセスは、単一のホストシステム上で実行される。メッセージバスのメカニズムは、例えば、単一のホストシステム上で、同時に、ロードバランサの構成要素(例えば、ロードバランサノード及びロードバランサモジュール)が動いているように見える実際の生産ネットワーク上で、分散型ロードバランサシステムが単一のプロセスとして試験されることを可能にする。
【0180】
メッセージバスは、分散型ロードバランサが単一のプロセスとして動くことができるフレームワークを提供する。処理中の1以上のメッセージバスレイヤの各々は、分散型ロードバランサの構成要素間のネットワーク(例えば、イーサネット(登録商標))のセグメントをシミュレーションする。分散型ロードバランサシステムのソフトウェアの構成要素は、メッセージバスの環境の範囲内で当該構成要素が動作できる特定の形態に書き込まれる必要はない。その代わりに、メッセージバスのフレームワークは、分散型ロードバランサシステムの構成要素が生産するパケットを中断する構成要素(メッセージバスNICまたはパケットアダプタと称される)を提供して、実際の物理的なネットワークの中ではなく、メッセージバスレイヤによって提供されたシミュレーションされたネットワークの中にパケットを導き、目標の構成要素にパケットを配信する。メッセージバスレイヤは、構成要素間の通信に対応するTCP/IPスタックを実装しない。その代わりに、メッセージバスレイヤは、ホストシステムのオペレーションシステム(OS)と整合して、ホストシステムのTCP/IPスタックを使用する。メッセージバスレイヤは、OSによって提供されるTCP/IPスタックを活用して、メッセージバスが中断し且つ配信する個々のパケットへ、またメッセージバスが中断し且つ配信する個々のパケットから、クライアント及びサーバが期待するTCPストリームを変換する。
【0181】
少なくともいくつかの実施形態において、ロードバランサの構成要素は、メッセージバスと整合するために、各々が有効なメディアアクセス制御(MAC)アドレスを有する少なくとも1つのメッセージバス・ネットワーク・インターフェイス・コントローラ(NIC)を備えており、各NICは、物理的なネットワークとの間ではなく、シミュレーションされたネットワーク環境におけるメッセージバスとの間でパケットを送信し且つパケットを受信する。メッセージバスNICは、物理的なネットワークではなく、メッセージバスに取り付ける仮想のネットワーク・インターフェイス・コントローラである。メッセージバスを介して通信することを必要とする各ロードバランサの構成要素は、少なくとも1つのメッセージバスNICを要求する。メッセージバスNICは、メッセージバスに対するパイプラインの出口として及び構成要素に対するパイプラインの入口としての機能を果たす。構成要素は、各メッセージバスNICに対する多数のメッセージバス・インターフェイスをインスタンス化できる。
【0182】
メッセージバス・ネットワーク・インターフェイスは、構成要素がメッセージバスNICを介してメッセージバスに取り付けるためのメカニズムである。メッセージバス・ネットワーク・インターフェイスは、Linux技術におけるインターフェイス構成(ifconfig)のインターフェイスと同義であるが、メッセージバス・ネットワーク・インターフェイスが、物理的なネットワークに対してではなく、メッセージバスに対して取り付けることが異なっている。メッセージバス・ネットワーク・インターフェイスは、IPアドレスを有し、メッセージバスNICの上部に位置する。メッセージバス・ネットワーク・インターフェイスは、メッセージバスからのパケットを受信する構成要素によって使用されることができるパケット送信元インターフェイス、及び、メッセージバスの中にパケットを送信する構成要素によって使用されることができるパケットシンク・インターフェイスを公開する。
【0183】
各ロードバランサノードは、パケット送信元インターフェイス及びパケットシンク・インターフェイスの実装によって配信され且つ送信される個々のネットワーク・パケットを処理する。これらのインターフェイスは、メッセージバス環境の中で動いている場合には、レイヤ2のイーサネットヘッダを追加または削除する(カーネル・ネットワーク・スタックによってこれが実行されると予想するロードバランサノードに対して)メッセージバス・ネットワーク・インターフェイスによって実装される。
図29に示されているような生産環境において、パケット送信元インターフェイス及びパケットシンク・インターフェイスの実装は、実際のネットワーク・インターフェイス上でメッセージバスのパケットを受信し且つ送信する。
図30に示されているようなメッセージバス環境においては、パケット送信元インターフェイス及びパケットシンク・インターフェイスの実装は、メッセージバスレイヤまたは複数のレイヤからパケットを受信し且つそれに対してパケットを送信する。
【0184】
説明を簡単にするために、メッセージバスNIC及びメッセージバス・インターフェイスは、メッセージバスのパケットアダプタまたは単にパケットアダプタと総称する。
図31及び32を参照されたい。
【0185】
図29は、少なくともいくつかの実施形態において、生産環境における分散型ロードバランサ700を備えた分散型ロードバランシングシステムを示す。ロードバランサ700は、この記載では簡略化されている。ロードバランサ700は、当該ロードバランサ700を実装するデータセンターなどのネットワーク設定の境界ルータ702を介して、外部ネットワーク740上のクライアント742に接続する。ロードバランサ700は、様々なタイプの構成要素、すなわち少なくとも1つのエッジルータ704、2以上のロードバランサ(LB)ノード710、各々が独立したサーバノード(図示せず)上に実装されている2以上のロードバランサ(LB)モジュール732、ルータまたはスイッチなどのファブリック720を形成する1以上のネットワーキング構成要素、及び、少なくともいくつかの実施形態における構成サービス722を備える。少なくともいくつかの実施形態において、ロードバランサ700の各構成要素は、汎用のラック収納型演算装置などの独立した演算装置としてまたはその中に実装されている。
【0186】
図30は、少なくともいくつかの実施形態において、単一のプロセスにおいてまたは単一のプロセスとして多数の分散型ロードバランシングシステムの構成要素が構成され且つ実行されることを可能にするメッセージバスのメカニズムを搭載した分散型ロードバランサ試験システム800を示す。
図29に示されているロードバランサ700において、各ロードバランサソフトウェアの構成要素は、独立した演算装置(例えば、ロードバランサノード710上のロードバランサソフトウェア、及びサーバノード上のロードバランサモジュール732)上でインストールされ且つ実行される。これらのロードバランサソフトウェアの構成要素が単一のプロセスにおいて実行できるようにするためには、ロードバランサソフトウェアの構成要素の内部及び外部のパケットが、物理的なネットワーク上で送信され且つ受信される代わりに、メッセージバスのメカニズムを介して中断され且つルーティングされることができるように、ロードバランサソフトウェアの構成要素の各々(
図30におけるロードバランサ(LB)ノード810及びロードバランサ(LB)モジュール832に示されている)は、当該構成要素のネットワーク接続性を要約するコードを有する。
【0187】
少なくともいくつかの実施形態の分散型ロードバランサ試験システム800において、メッセージバスのメカニズムは、構成要素間の通信のためのTCPスタックを実装しない。その代わりに、メッセージバスのメカニズムは、ホストシステムのオペレーティングシステム(OS)に整合して、ホストシステムのTCPスタックを使用する。少なくともいくつかの実施形態において、メッセージバスの機能は、IPテーブルを介してユーザレイヤの下のホストシステムのOSのカーネル(例えば、Linuxカーネル)、カーネルの機能と結び付く。メッセージバスの機能は、カーネルレベルでIPテーブルの中に留まり、パケットを中断し、ルーティングのためにメッセージバスのプロセス内に渡す。
【0188】
図30においてシミュレーションされたエッジルータ862及びシミュレーションされたファブリック864によって示されているように、物理的なネットワークの構成要素(例えば、
図29におけるエッジルータ704及びファブリック720)の機能は、ソフトウェアの中でシミュレーションされ、同様に、クライアント860、サーバ834、及び構成サービス866もシミュレーションが可能である。しかしながら、少なくともいくつかの実施形態において、シミュレーションされたサーバ834でなく実際のものが分散型ロードバランサ試験システム800において使用されることに留意されたい。
図30におけるメッセージバスのレイヤ850は、物理的なネットワークのインフラに取って代わる。したがって、ロードバランサのソフトウェアの構成要素(ロードバランサノード810及びロードバランサモジュール832)は、ロードバランサ試験システム800において動作するが、その一方で、これらのソフトウェアの構成要素は、
図29に示されているような生産ネットワーク環境において実行しないことは意識していない。
【0189】
いくつかの構成要素(例えば、シミュレーションされたルータ)は、ネットワークセグメントをシミュレーションする異なるメッセージバスレイヤ850に対してパケットを渡すこと、且つ当該レイヤ850からパケットを受信するために、2つ以上のメッセージバスのレイヤ850に接続される。
【0190】
分散型ロードバランシング試験システム800のメッセージバスレイヤ850に実装されているメッセージバスのメカニズムは、ネットワークセグメントの「ワイヤー」をシミュレーションする。少なくともいくつかの実施形態において、メッセージバスのメカニズムは、構成要素のMACアドレスに基づいて、分散型ロードバランシング試験システム800における宛先の構成要素に対してパケットを配信する。したがって、各ロードバランサのソフトウェアの構成要素(ロードバランサノード810及びロードバランサモジュール832)は、ロードバランサソフトウェアの構成要素が分散型ロードバランシング試験システム800において、他の構成要素から自分に送信されたパケットを受信することができるように、メッセージバスのレイヤ850に対してMACアドレスを提供し、当該MACアドレスに接続される。
<メッセージバスのパケットアダプタ>
【0191】
図31及び32は、少なくともいくつかの実施形態におけるメッセージバスのパケットアダプタを示す。少なくともいくつかの実施形態において、各ロードバランサ(LB)ソフトウェアの構成要素は、PacketSource及びPacketSinkインターフェイスの実装によって、配信され且つ送信される個々のネットワーク・パケットを処理する。
図31を参照すると、これらのインターフェイス(パケット送信元・インターフェイス862及びパケットシンク・インターフェイス864として示されている)は、分散型ロードバランシングシステム800内で動いている場合には、メッセージバスレイヤ850と、カーネルのネットワークスタックによってこれが実行されることを予期する、ロードバランサソフトウェアの構成要素870のためにレイヤ2のイーサネットヘッダを追加または削除するロードバランサソフトウェアの構成要素870の間のパケットアダプタ860に実装される。
図29に示されているような生産環境においては、ロードバランサソフトウェアの構成要素に対するPacketSourceインターフェイス及びPacketSinkインターフェイスの実装は、当該構成要素が実装される物理的な装置の実際のネットワーク・インターフェイス上で、パケットを受信し且つ送信する。
【0192】
図31を参照すると、少なくともいくつかの実施形態において、ロードバランサソフトウェアの構成要素870がパケットを送信する場合には、パケットシンク・インターフェイス864の送信パケット方法を呼び出す実行のスレッドは、パケットアダプタ860の中において、及びメッセージバスレイヤ850の中においても、一連の機能を横断して、その構成要素の入力待ち行列に対してパケットを追加することによって宛先の構成要素に対して最終的にパケットを配信する。少なくともいくつかの実施形態において、ロードバランサソフトウェアの構成要素870がパケットを受信する場合には、ロードバランサソフトウェアの構成要素870は、パケット送信元インターフェイス862の受信パケット方法を呼び出して、自分の入力待ち行列からパケットを読み取る。少なくともいくつかの実施形態において、メッセージバスのメカニズムは、自分自身のいかなる追加スレッドをも要求することなく、パケットを配信する。
メッセージバスのパケットパイプライン
【0193】
図32を参照すると、少なくともいくつかの実施形態において、パケット送信元インターフェイス862及びパケットシンク・インターフェイス864のメッセージバス850側は、パケットパイプライン機能を提供する。ロードバランサソフトウェアの構成要素870がパケットシンク・インターフェイス864を介してパケットを送信した場合、パケットは一連の段階(パケットパイプライン880)を横断した後に、メッセージバスのレイヤ850に到達する。これらの段階は、例えば、パケットを変更し、パケットを破棄し、パケットを複製し、パケットを遅延させる。一旦パケットがパケットパイプライン880を横断し、メッセージバスのレイヤ850が、宛先の構成要素870を選択すると、パケットは、宛先の構成要素870に関連する次の一連のパイプライン段階(パケットパイプライン882)も横断した後に、宛先の構成要素870の入力待ち行列に追加される。
例示的なプロバイダのネットワーク環境
【0194】
このセクションでは、分散型ロードバランシング方法及び装置の実施形態が実装される例示的なプロバイダ・ネットワーク環境について説明する。しかしながら、これらの例示的なプロバイダ・ネットワーク環境に限定される意図ではない。
【0195】
図33Aは、少なくともいくつかの実施形態において、例示的なプロバイダ・ネットワーク環境を示す。プロバイダ・ネットワーク1900は、クライアントがアクセスすること、購入すること、借り受けることを可能にするか、さもなければ、限定はされないが、演算資源及び記憶資源を含み、プロバイダ・ネットワークまたは1以上のデータセンターのネットワーク内の装置上に実装されている仮想化された資源インスタンス1912を得ることを可能にする1以上の仮想化サービス1910を介して、資源の仮想化をクライアントに提供する。プライベートIPアドレス1916は資源インスタンス1912に関連し、当該プライベートIPアドレスはプロバイダ・ネットワーク1900上の資源インスタンス1912の内部ネットワークアドレスである。いくつかの実施形態において、プロバイダ・ネットワーク1900はまた、クライアントがプロバイダ1900から取得するパブリックIPアドレス1914及び/またはパブリックIPアドレスの範囲(例えば、インターネット・プロトコル・バージョン4(IPv4)またはインターネット・プロトコル・バージョン6(IPv6)アドレス)を提供する。
【0196】
従来、プロバイダ・ネットワーク1900は、仮想化サービス1910を介して、サービス・プロバイダのクライアント(例えば、クライアントネットワーク1950Aを操作するクライアント)が、クライアントに対して割り当てられる特定の資源インスタンス1912でクライアントに対して割り当てられまたは割り振られる少なくともいくつかのパブリックIPアドレス1914に動的に対応付けることを可能にする。プロバイダ・ネットワーク1900はまた、クライアントに割り当てられて以前にマッピングされた1つの仮想化演算資源インスタンス1912に対して、これもクライアントに割り当てられた他の仮想化演算資源インスタンス1912に対して、パブリックIPアドレス1914にクライアントが再マッピングすることを可能にする。仮想化演算資源インスタンス1912及びサービス・プロバイダによって提供されたパブリックIPアドレス1914を使用すると、クライアントネットワーク1950Aのオペレータなどのサービス・プロバイダのクライアントは、例えば、クライアント専用アプリケーションを実装して、インターネットなどの中間ネットワーク1940上で当該クライアントアプリケーションを提示する。中間ネットワーク1940上の他のネットワークエンティティ1920は、その後、クライアントネットワーク1950Aによって公開された宛先のパブリックIPアドレス1914に対するトラフィックを生成し、そのトラフィックはサービス・プロバイダのデータセンターにルーティングされ、データセンターにおいて、ネットワーク基板を介して、宛先のパブリックIPアドレス1914に現在マッピングされている仮想化演算資源インスタンス1912のプライベートIPアドレス1916に対してルーティングされる。同様に、仮想化演算の資源インスタンス1912からの応答トラフィックは、ネットワーク基板を介して、中間ネットワーク1940上でルーティングされて送信元エンティティ1920に戻る。
【0197】
本明細書で使用されているようなプライベートIPアドレスは、プロバイダ・ネットワークにおける資源インスタンスの内部ネットワークアドレスのことを指す。プライベートIPアドレスは、プロバイダ・ネットワーク内でのみルーティング可能である。プロバイダ・ネットワークの外部で発生したネットワークトラフィックは、プライベートIPアドレスには直接的にルーティングできないが、その代わりに、当該トラフィックは、資源インスタンスにマッピングされているパブリックIPアドレスを使用する。プロバイダ・ネットワークは、ネットワーク装置またはネットワークアドレス変換(NAT)または同様の機能を実現する専用装置を有し、パブリックIPアドレスからプライベートIPアドレスへのマッピング及びその逆を実行する。
【0198】
本明細書で使用されているようなパブリックIPアドレスは、サービス・プロバイダまたはクライアントのいずれかによって資源インスタンスに割り当てられたインターネットのルーティング可能なネットワークアドレスである。パブリックIPアドレスにルーティングされたトラフィックは、例えば、1対1のネットワークアドレス変換(NAT)を介して変換され、資源インスタンスのそれぞれのプライベートIPアドレスに転送される。
【0199】
いくつかのパブリックIPアドレスは、プロバイダ・ネットワークのインフラによって特定の資源インスタンスに割り当てられ、これらのパブリックIPアドレスは、標準パブリックIPアドレスまたは単に標準IPアドレスと称される。少なくともいくつかの実施形態において、資源インスタンスのプライベートIPアドレスに対する標準IPアドレスのマッピングは、資源インスタンスのすべてのタイプについてデフォルトの起動構成である。
【0200】
少なくともいくつかのIPアドレスは、プロバイダ・ネットワーク1900のクライアントに対して割り振られ、またはこれらのクライアントによって取得され、次に、クライアントは、それらの割り振られたパブリックIPアドレスを当該クライアントに割り振られた特定の資源インスタンスに割り当てる。これらのパブリックIPアドレスは、クライアントパブリックIPアドレスまたは単にクライアントIPアドレスと称される。標準IPアドレスの場合のように、プロバイダ・ネットワーク1900によって資源インスタンスに割り当てられる代わりに、クライアントIPアドレスは、例えば、サービス・プロバイダによって提供されたAPIを介して、クライアントによって資源インスタンスに割り当てられる。標準IPアドレスとは異なり、クライアントIPアドレスは、クライアントのアカウントに割り当てられ、必要または要望に応じて、それぞれのクライアントによって他の資源インスタンスに再マッピングされることが可能である。クライアントIPアドレスは、クライアントのアカウントに関連するが、特定の資源インスタンスには関連せず、クライアントは、クライアントがそれを開放することを選択するまではそのIPアドレスを制御する。従来の静的IPアドレスとは異なり、クライアントIPアドレスは、クライアントのパブリックIPアドレスをクライアントのアカウントに関連する任意の資源インスタンスに再マッピングすることによって、クライアントが資源インスタンスまたはアベイラビリティゾーンの障害をマスクすることができるようにする。クライアントIPアドレスは、例えば、代替の資源インスタンスにクライアントIPアドレスを再マッピングすることによって、クライアントの資源インスタンスまたはソフトウェアに関わる問題について、クライアントが処理できるようにする。
【0201】
図33Bは、
図33Aに示されているような例示的なプロバイダ・ネットワーク環境において、分散型ロードバランサの実装を示す。プロバイダ・ネットワーク1900は、クライアント1960に対して、サービス1910、例えば、仮想化記憶サービスを提供する。クライアント1960は、例えば、サービス1910に対応する1以上のAPIを介して、サービス1910にアクセスして、プロバイダ・ネットワーク1900の生産ネットワーク部分における多数のサーバノード1990上に実装された資源(例えば、記憶資源または演算資源)の使用法を取得する。サーバノード1990の各々は、ローカルロードバランサ(LB)モジュール1992だけでなく、ウェブサーバまたはアプリケーションサーバなどのサーバ(図示せず)を実装する。1以上の分散型ロードバランサ1980は、境界ネットワークと生産ネットワークとの間のロードバランサレイヤの中に実装されている。境界ルータ1970は、インターネットなどの中間ネットワーク1940を介して、クライアント1960からのパケットフローの中のパケット(例えば、TCPパケット)を受信して、境界ネットワークを介して、分散型ロードバランサ1980のエッジルータに対してパケットを転送する。パケットは、分散型ロードバランサ1980のエッジルータによって公開されたパブリックIPアドレスに向かう。各分散型ロードバランサ1980のエッジルータは、それぞれの分散型ロードバランサ1980のロードバランサノードの中にパケットフローを分散する。少なくともいくつかの実施形態において、入口ノードとしての機能を果たす各ロードバランサノードは、同じパブリックIPアドレスをエッジルータに広告し、エッジルータは、クライアント1960からのパケットフローを、フロー単位ハッシュ化マルチパス・ルーティング技法、例えば、等価マルチパス(ECMP)ハッシュ処理技法に従って、入口サーバの中に分散する。ロードバランサノードは、本明細書に記載された接続プロトコルを使用して、パケットフローに対応する目標のサーバノード1990を決定し、サーバとクライアント1960との間の接続を推進する。接続が確立すると、入口ノードは、フローに関する受信されたパケットをカプセル化して、生産ネットワーク上の目標のサーバノード1990に送信し、その一方で、フロー追跡部ノードは、接続に関する状態を維持する。サーバノード1990上のロードバランサモジュール1992は、サーバノード1960上のそれぞれのサーバが接続を受諾するかどうかについて決定を下す。ロードバランサモジュールは、入口ノードからのパケットを受信してデカプセル化して、サーバノード1990上のそれぞれのサーバに対して、デカプセル化されたパケット(例えば、TCPパケット)を送信する。ロードバランサモジュール1992はまた、パケットフローに対応する出口ノードとしてのロードバランサノードを選択し、フローに関する発信パケットをカプセル化して、生産ネットワークを介して、選択された出口ノードに対して送信する。出口ノードは、順に、パケットをデカプセル化して、それぞれのクライアント1960に対して配信する境界ネットワーク上でデカプセル化されたパケットを送信する。
【0202】
図34Aは、少なくともいくつかの実施形態において、分散型ロードバランサ及びサーバノードの例示的な物理的なラック実装を示すが、これに限定される意図ではない。少なくともいくつかの実施形態において、分散型ロードバランサの様々な構成要素は、汎用のラック収納型の演算装置上にまたはそれ自体として実装されている。ラック190は、各々がロードバランサノード(LBノード110A〜110F)としての機能を果たしている多数の演算装置、及び各々がサーバノード(サーバノード130A〜130L)としての機能を果たしている多数の演算装置を含む。ラック190はまた、少なくとも1つのエッジルータ104、ファブリック120を形成する1以上のラック収納型ネットワーク装置(ルータ、スイッチ等)、及び1つ以上の他の構成要素180(他のネットワーク装置、パッチパネル、電源、冷却システム、バス等)も備える。
図33A及び33Bのプロバイダ・ネットワーク1900を実装するデータセンターやセンターなどのネットワーク100のインストールは、1以上のラック190を備える。
【0203】
図34Bは、少なくともいくつかの実施形態において、分散型ロードバランサ及びサーバノードの例示的な物理的なラック実装を示すが、これに限定される意図ではない。
図34Bは、スロット収納型演算装置として、例えば、ブレードサーバがラック190内に実装されているLBノード110及びサーバノード130を示す。
【0204】
図35は、少なくともいくつかの実施形態において例示的なネットワーキング環境を示しており、そこでは、別個に実装されたサーバノードを有する1、2または3以上の分散型ロードバランサがネットワークに実装されている。この実施例においては、2つの分散型ロードバランサ1980A及び1980Bが示されている。分散型ロードバランサ1980の各々は、境界ネットワークを介して、クライアント1960からのパケットフローを受信し、本明細書に記載されたロードバランシング方法を実行して、多数のサーバノード1990の中にパケットを分散する。いくつかの実装において、各分散型ロードバランサ1980は、サーバノードがロードバランサラックの中にインストールされていないことを除けば、
図34A及び34Bに示されているラック190と同様にラック実装である。サーバノード1990は、データセンター内において、1以上の独立したラックにインストールされたブレードサーバなどのラック収納型演算装置である。いくつかの実装において、サーバノード1990は、異なる1以上のロードバランサ1980によって対応される各サービスを含め、プロバイダ・ネットワークによって提供される異なる2以上のサービスを実施する。
例示的なシステム
【0205】
少なくともいくつかの実施形態において、本明細書に記載されているような分散型ロードバランシング方法及び装置の一部または全部を実行するサーバは、
図36に示されているコンピュータシステム2000のような、コンピュータアクセス可能な1以上の媒体を有するか、またはそれにアクセスする構成の汎用のコンピュータシステムを備える。例示された実施形態において、コンピュータシステム2000は、入出力(I/O)インターフェイス2030を介して、システムメモリ2020に接続された1以上のプロセッサ2010を備える。コンピュータシステム2000は、さらに、入出力インターフェイス2030に接続されたネットワーク・インターフェイス2040を備えている。
【0206】
様々な実施形態において、コンピュータシステム2000は、1つのプロセッサ2010を有するユニプロセッサシステム、または数個(例えば、2、4、8、または他の適切な数)のプロセッサ2010を有するマルチプロセッサシステムである。プロセッサ2010は、命令を実行することができる任意の適切なプロセッサである。例えば、様々な実施形態において、プロセッサ2010は、汎用のプロセッサ、または任意の様々な命令セットアーキテクチャ(ISA)、例えば、x86、PowerPC、SPARC、またはMIPSISA若しくは任意の他の適切なISAを実装している内臓型プロセッサである。マルチプロセッサシステムにおいて、プロセッサ2010の各々は、必須でないが、同じISAを一般に実装する。
【0207】
システムメモリ2020は、プロセッサ2010によってアクセス可能な命令及びデータを記憶するように構成されている。様々な実施形態において、システムメモリ2020は、スタティックRAM(SRAM)、シンクロナスDRAM(SDRAM)、不揮発性/フラッシュタイプのメモリ、または任意の他のタイプのメモリなどの任意の適切なメモリ技術を使用して実装される。例示された実施形態において、分散型ロードバランシング方法及び装置について上記した方法、技法、及びデータなどの以上の所望の機能を実施するプログラム命令及びデータは、システムメモリ2020内に示されるようにコード2024及びデータ2026として記憶されている。
【0208】
1つの実施形態において、入出力インターフェイス2030は、プロセッサ2010、システムメモリ2020、及びネットワーク・インターフェイス2040または他の周辺インターフェイスを含む装置内の任意の周辺装置の間で、入出力トラフィックを調整する構成になっている。いくつかの実施形態において、入出力インターフェイス2030は、任意の必要なプロトコル、タイミング、または他のデータ変換を実行して、1つの構成要素(例えば、システムメモリ2020)からのデータ信号を他の構成要素(例えば、プロセッサ2010)での使用のために適切な形式に変換する。いくつかの実施形態において、入出力インターフェイス2030は、例えば、周辺構成要素相互接続(PCI)バス標準またはユニバーサルシリアルバス(USB)標準の変形などの様々なタイプの周辺バスを介して接続される装置のためのサポートを含む。いくつかの実施形態において、入出力インターフェイス2030の機能は、例えば、ノースブリッジ及びサウスブリッジなどの2以上の独立した構成要素に分かれる。また、いくつかの実施形態において、入出力インターフェイス2030のいくつかまたはすべての機能は、システムメモリ2020に対するインターフェイスなどのように、プロセッサ2010の中に直接組み込まれている。
【0209】
ネットワーク・インターフェイス2040は、コンピュータシステム2000と、1つのネットワークまたはネットワーク2050に接続された他の装置2060、例えば、
図1ないし
図35に例示されているような他のコンピュータシステムまたは装置との間で、データが交換され得るように構成されている。様々な実施形態において、ネットワーク・インターフェイス2040は、例えば、イーサネットネットワークのタイプなどの、任意の適切な有線または無線の一般的なデータネットワークを介して、通信をサポートする。さらに、ネットワーク・インターフェイス2040は、アナログ音声ネットワークまたはデジタルファイバ通信ネットワークなどの電気通信/電話通信ネットワークを介して、ファイバチャネルSANなどのストレージエリア・ネットワークを介して、または、任意の他の適切なタイプのネットワーク及び/またはプロトコルを介して、通信をサポートする。
【0210】
少なくともいくつかの実施形態において、システムメモリ2020は、分散型ロードバランシングシステムの実施形態を実装するために、
図1ないし35について上記したように、プログラム命令及びデータを記憶するように構成されたコンピュータ読み取り可能な媒体の1つの実施形態である。しかしながら、他の実施形態においては、プログラム命令及び/またはデータは、異なるタイプのコンピュータ読み取り可能な媒体上で、受信され、送信され、または記憶される。一般に、コンピュータ読み取り可能な媒体は、非一時的記憶媒体、またはメモリ媒体、例えば、入出力インターフェイス2030を介してコンピュータシステム2000に接続された、ディスクまたはDVD/CDの磁気または光媒体などを含む。非一時的なコンピュータ読み取り可能な媒体はまた、RAM(例えば、SDRAM、DDR SDRAM、RDRAM、SRAM等)、ROMなどのような、任意の揮発性または不揮発性の媒体を含み、システムメモリ2020または他のタイプのメモリとして、コンピュータシステム2000のいくつかの実施形態に含まれている。さらに、コンピュータアクセス可能な媒体は、伝送媒体、またはネットワーク及び/または無線リンクなどの通信媒体を介して伝送される電気信号、電磁気信号、またはデジタル信号などの信号を有し、例えば、ネットワーク・インターフェイス2040を介して実装される。
【0211】
開示された実施形態は、以下の条項の観点で記載されることができる。
1.分散型ロードバランサシステムであって、
複数のロードバランサノード、及び
各々がサーバ及びロードバランサモジュールを有する複数のサーバノードを備え、その中で、
前記複数のロードバランサノードは、1以上のクライアントからのパケットフローを前記複数のサーバノードの中に分散し、前記複数のサーバノードの中に分散するように構成され、
前記複数のロードバランサノードは、前記複数のサーバノードの中からサーバノードを選択し、前記パケットフローについての接続要求を前記クライアントから受信し、且つ、前記接続要求を前記選択されたサーバノードに対して送信するように構成され、
各サーバノード上の前記ロードバランサモジュールは、前記複数のロードバランサノードの1つからのパケットフローについての接続要求を受信し、前記接続が前記サーバノード上の前記サーバによって受諾されるかどうかを判定し、前記サーバが前記接続を受諾できない場合には、前記接続要求を拒絶し、且つ、前記サーバが前記接続を受諾できる場合には、前記複数のロードバランサノードと協働して、前記それぞれのクライアントと前記それぞれのサーバとの間のパケットフローについての接続を確立するように構成されている、
前記分散型ロードバランサシステム。
2.条項1に記載された分散型ロードバランサシステムは、さらに、ハッシュ化マルチパス・ルーティング技法に従って、前記1以上のクライアントからの前記パケットフローを前記複数のロードバランサノードの中に分散するように構成されたルータをさらに備える、
前記分散型ロードバランサシステム。
3.条項1に記載された分散型ロードバランサシステムは、その中で、前記サーバノード上の前記サーバによって前記接続が受諾されるかどうかを判定するために、前記ロードバランサモジュールが、前記サーバノード上の前記サーバの1以上の現在の資源使用量のメトリクスを分析して、前記接続を前記サーバが受諾できるかどうかを判定するように構成され、その中で、前記1以上の現在の資源の使用量のメトリクスが、1以上のCPUの使用、帯域幅の使用量、サーバ待ち時間、及び確立された接続数を含む、
前記分散型ロードバランサシステム。
4.条項1に記載された分散型ロードバランサシステムは、その中で、前記複数のロードバランサノードが、さらに、前記接続要求を受信するため前記複数のサーバノードの中から、ランダムな選択技法に従って前記サーバノードを選択するように構成されている、
前記分散型ロードバランサシステム。
5.条項1に記載された分散型ロードバランサシステムは、その中で、前記複数のロードバランサノードが、さらに、拒絶された接続要求を受信するために前記複数のサーバノードの中から、他のサーバノードを選択し、前記接続要求を前記他のサーバノードに対して送信するように構成されている、
前記分散型ロードバランサシステム。
6.条項1に記載された分散型ロードバランサシステムは、その中で、各パケットフローが伝送制御プロトコル(TCP)パケットフローであり、またその中で、クライアントとサーバとの間に確立された各接続がTCP接続である、
前記分散型ロードバランサシステム。
7.条項1に記載された分散型ロードバランサシステムは、その中で、クライアントとサーバとの間で確立された各接続が、前記クライアントに始まり、前記複数のロードバランサノードの1以上の中を通って、前記サーバによって終端される、
前記分散型ロードバランサシステム。
8.方法であって、
クライアントに対するパケットフローにおけるパケットを受信すること、及び
前記パケットフローについての接続要求を複数のサーバノードの中から選択されたサーバノードに対して送信することを、
1以上の複数のロードバランサノードによって実行し、
前記サーバノード上のサーバが前記接続を受諾できるかまたはできないかどうかを判定すること、
前記サーバが前記接続を受諾できないと判定したときは前記接続要求を拒絶すること、及び
前記サーバが前記接続を受諾できると判定したときは前記接続要求を受諾することを、
前記選択されたサーバノードによって実行する、
前記方法。
9.条項8に記載された方法は、その中で、前記接続要求を受諾することが、前記選択されたサーバノードと前記1以上のロードバランサノードとが協働して前記パケットフローについて前記それぞれのクライアントと前記それぞれのサーバとの間で接続を確立することを含む、
前記方法。
10.条項9に記載された方法は、その中で、前記パケットフローが伝送制御プロトコル(TCP)パケットフローであり、またその中で、前記クライアントと前記サーバとの間で確立された接続がTCP接続である、
前記方法。
11.条項9に記載された方法は、その中で、前記確立された接続がクライアントに始まり、前記複数のロードバランサノードの1つの中を通って、前記サーバによって終端される、
前記方法。
12.条項8に記載された方法は、その中で、1以上のクライアントからのパケットフローをハッシュ化マルチパス・ルーティング技法に従って前記複数のロードバランサノードの中に分散するルータから前記パケットが受信される、
前記方法。
13.条項8に記載された方法は、その中で、前記サーバノード上のサーバが前記接続を受諾できるかまたはできないかどうかを前記判定することが、前記サーバの1以上の現在の資源使用量のメトリクスを分析して前記接続を受諾できるかどうかを判定することを含む、
前記方法。
14.条項8に記載された方法は、前記1以上のロードバランサノードが、ランダム選択技法に従って、前記複数のサーバノードの中からサーバノードを選択することをさらに含む、
前記方法。
15.条項8に記載された方法は、前記選択されたサーバノードが前記接続要求を拒絶した場合に、前記1以上のロードバランサノードが、前記複数のサーバノードの中から選択された他のサーバノードに対して前記接続要求を送信することをさらに含む、
前記方法。
16.複数のサーバノードの各々の上にロードバランサモジュールを実装するためにコンピュータが実行可能なプログラム命令を記憶するコンピュータ読み取り可能な非一時的記憶媒体であって、各ロードバランサモジュールが、
クライアントからのパケットフローについての接続要求を複数のロードバランサノードの1つから受信し、
前記サーバノード上のサーバが前記接続を受諾できるかまたはできないかどうかを判定し、
前記サーバが前記接続を受諾できないと判定したときは前記接続要求を拒絶し、及び
前記サーバが前記接続を受諾できると判定したときは前記ロードバランサノードと前記サーバとが通信して、前記クライアントと前記サーバとの間に接続を確立する、
ように動作可能である、
前記コンピュータ読み取り可能な非一時的媒体。
17.条項16に記載された非一時的なコンピュータ読み取り可能な記憶媒体は、その中で、前記サーバノード上のサーバが前記接続を受諾できるかまたはできないかどうかを判定するために、前記ロードバランサモジュールが、前記サーバの1以上の現在の資源使用量のメトリクスを分析して、前記サーバが前記接続を受諾できるかどうかを決定することを実行できる前記コンピュータ読み取り可能な非一時的媒体。
18.条項17に記載された非一時的なコンピュータ読み取り可能な記憶媒体は、その中で、前記1以上の現在の資源使用量のメトリクスが、1以上のCPUの使用、帯域幅の使用量、サーバ待ち時間、及び確立された接続数を含む、
前記コンピュー読み取り可能な非一時的記憶媒体。
19.条項16に記載されたコンピュータ読み取り可能な非一時的記憶媒体は、その中で、前記プログラム命令は、さらに、前記接続要求を受信するために前記複数のサーバノードの中からサーバノードをランダムに選択する前記ロードバランサモジュールを実現するようにコンピュータが実行できる、
前記非一時的なコンピュータ読み取り可能な記憶媒体。
20.条項16に記載されたコンピュータ読み取り可能な非一時的記憶媒体は、その中で、前記接続要求を拒絶するために、前記接続要求の中の生存時間(TTL)カウンタを減じて、前記接続要求を前記ロードバランサノードに対して返送するように前記ロードバランサモジュールが動作でき、その中で、 前記プログラム命令は、さらに、前記ロードバランサノードが、
前記返送された接続要求の中の前記TTLカウンタを検査し、
前記TTLカウンタが閾値を超えている場合には、前記接続要求を受信するために前記複数のサーバノードの中から他のサーバノードを選択し、及び
前記TTLカウンタが前記閾値以下である場合には、前記接続要求を廃棄することを実現するようにコンピュータを実行可能にする、
前記コンピュータ読み取り可能な非一時的記憶媒体。
結論
【0212】
様々な実施形態は、さらに、上記の説明に従って、コンピュータ読み取り可能な媒体に実装される受信処理、送信処理、または記憶処理の命令及び/またはデータを有する。一般に、コンピュータ読み取り可能な媒体は、磁気媒体または光媒体などの記録媒体またはメモリ媒体、例えば、ディスクまたはDVD/CD−ROM、RAM(例えば、SDRAM、DDR、RDRAM、SRAM等)、ROM等の揮発性の媒体または不揮発性の媒体を含むが、それと同様に、電気信号、電磁気信号、またはデジタル信号などのように、ネットワーク及び/または無線リンクなどの通信媒体を介して運ばれる伝送媒体または信号も含む。
【0213】
図面及び本明細書に記載しているような様々な方法は、例示的な方法の実施形態を表わす。その方法は、ソフトウェア、ハードウェア、またはそれらの組み合わせの中に実装されている。方法の順序は変えることができ、様々な要素は、追加され、再配列され、組み合わされ、削除され、修正される等が可能である。
【0214】
様々な修正及び変更は、本開示の利益を享受する当業者にとって明らかなようになされるだろう。このような修正及び変更のすべてを包含することは意図されることであり、したがって、上記記載は制限的な意味ではなく例示的な意味に見なされるべきである。