受信と送信を異なる集合として
ネットワークアーキテクチャにおける二部グラフ
二部グラフはノードを2つの集合に分割し、エッジは集合間のみを結ぶことが許可される(同一集合内では不可)。
ネットワーク境界には自然な二部構造がある:
- 受信側: 片側に外部クライアント、もう片側に内部サービス。エッジ: 入ってくる外部リクエスト、出ていく内部レスポンス。
- エグレス側: 片側に内部サービス、もう片側に外部宛先。エッジは、内部サービスからのアウトバウンド呼び出しの開始と、外部からの応答の返却を表す。
非対称性:
- イングレス: ソースセットは無制限(インターネット上の誰でも)。宛先セットは小さい(少数のサービス)。トラフィック量はユーザー数に比例してスケールする。
- エグレス: ソースセットは小さい(少数の内部サービス)。宛先セットは有界(少数の既知のパートナー)。トラフィック量は内部アクティビティに比例してスケールする。
単一ボックス設計では、両方の二部グラフの半分が1つのノードに集約される。そのノードには、外部からのファンイン(イングレス)と、内部からのファンイン(エグレスの逆方向)の両方が存在する。ノードの負荷は、両側の合計となる。
分割設計では、両方の二部グラフの半分が別々のノードに保持される。各ノードは、適切なスケール軸を持つ1つの役割を処理する。
分裂の前:至る所にあるカット頂点
単一ボックス:1つの頂点がすべてを支えている
分割前、すべての外部/内部ペアの間に単一のプロキシボックスが存在します。グラフの用語では、これは高次のカット頂点であり、これを削除すると、すべてのクライアントがすべてのバックエンドから、かつすべての内部サービスがすべての外部パートナーから切断されます。
このノードでの接続性は1です。このノードを妨害するもの(プロセスクラッシュ、ネットワークの故障、OOMキル)は、すべての依存パスを切断します。
分割後:カット頂点が2つの軽量なノードに置き換えられる
ingressとegressに分割することで、1つだったグラフノードが2つになります。各ノードは、もはや片方の二部グラフの半分にのみ位置します:
- Ingressノード:外部クライアントから内部サービスへの二部グラフの半分のカット頂点
- Egressノード:内部サービスからパートナーへの二部グラフの半分のカット頂点
ヘアピンループは幾何学的に消えます:単一ボックスのグラフでは、内部サービスがパブリックアドレス経由で外部向けサービスに到達しようとする場合、同じ頂点を2回通過する必要がありました(egressロールで出て、ingressロールで入る)。分割されたグラフでは、通過は2つの異なる頂点にヒットします。
各側の接続性は1のままですが、2つのカット頂点は独立して置き換えることができます。第2のingressプロキシを追加することで、egress側を変更せずにingress側の接続性を2に引き上げることができます。
各方向の複製
本番環境のフロートでは、通常、2台以上のイングレスプロキシ(HA)と2台以上のエグレスプロキシ(HA)が運用されます。各方向は独立して接続性2に達します。必要に応じて、各方向でキャパシティが水平にスケールされます。
ネットワーク分割耐性
統合
これにより、ネットワークアーキテクチャを二部グラフとして読み取り、カット頂点を特定し、各半分の接続性を追跡できるようになりました。
これをネットワーク分割に適用してください。
ネットワーク分割とはグラフのカットです。分割を跨ぐエッジが失敗し、両側は動作を維持しますが、互いに到達できなくなります。
地理的に分散されたシステムには、単一のDC間リンクで接続された2つのデータセンターがあります。流入トラフィックはDC1経由で入ります。流出トラフィックはDC1経由で外部パートナーへ送信されます。一部の内部サービスはDC2に存在し、ステートフルな操作のためにDC1へコールバックします。
補足ノート
補足ノート
この幾何学的レッスンは、Ingress & Egress Separation のメインレッスンを二部グラフ解析として再定式化しています。
次の補足ノート geometry_of_failure_modes_and_blast_radius では、介在中心性(ボトルネックノードの特定)と最小カット(影響範囲の上限)を導出します。
よくできました。