CDNと負荷分散 — 世界中へ速く届ける

同じデータを地球の裏側から取りに行くと、光の速さでも往復に時間がかかります。答えは「近くにコピーを置く」と「一台に集中させない」の2つ。世界に散らばるCDNと、たくさんのサーバへ仕事を配る負荷分散を、流れるリクエストで見ていきます。

1. 近くのサーバに取りに行く — CDNとエニーキャスト

コンテンツの本体(オリジン)は世界に1か所でも、そのコピーを持つエッジサーバを世界中に配置しておけば、ユーザーはいちばん近いエッジから受け取れます。距離が短いほど往復(RTT)が短く、体感が速くなります。

下のデモでエッジ拠点の数を増やすと、各地域から最寄りのエッジまでの距離が縮み、平均レイテンシがどんどん下がっていきます。色分けは「どのユーザーがどのエッジに割り当てられるか」の勢力図です。

エッジ配置マップ — 最寄りの拠点へ自動で振り分け
四角=エッジ拠点、オレンジ=オリジン。各地から緑のリクエストが最寄りエッジへ飛びます。点線+オレンジの点は「もしオリジンまで取りに行ったら」の比較。拠点を増やすほど緑の平均 ms が縮みます。
POINT — エニーキャストという住所の魔法 世界中のエッジが同じIPアドレスを名乗って経路広告(BGP)します。ルータは「そのIPへの最短経路」を選ぶだけなので、ユーザーは何も意識せず自動的にいちばん近い拠点へ届きます。1つの住所が、地球上に何百箇所も同時に存在するイメージです。
RTT ≈ 2 L / v光 L=距離、v光≈2×108 m/s(光ファイバ中)。東京↔ニューヨーク片道 約1万km は往復だけで ~100ms。だから「近く」が効く

2. 二度目は速い — キャッシュ階層とヒット率

エッジは万能倉庫ではなく、限られた容量のキャッシュを持つだけです。要求されたコンテンツがエッジにあれば(ヒット)その場で即返し、なければ(ミス)オリジンまで取りに行き、ついでにキャッシュへ保存します。次からはヒットで速い、というわけです。

人気が偏るほど(=みんな同じ物を見るほど)ヒット率は上がります。コンテンツの種類とキャッシュ容量を変えて、ヒット率がどう動くか観察してみてください。

キャッシュのヒットとミス — オリジンまで往復するのは初回だけ
緑の往復=ヒット(エッジで即返す)、オレンジの長い往復=ミス(オリジンまで取りに行く)。右の縦積みがエッジのキャッシュ(上ほど新しく使った物)。人気の偏りで、多くの要求は緑で片付きます。
注意 — 古いコピーが残る問題 キャッシュは速さと引き換えに「情報が古くなる」リスクを抱えます。各コンテンツにはTTL(有効期限)を付け、更新時はパージ(強制無効化)で世界中のエッジから消す — この整合性の管理が CDN 運用の要です。値段表やニュースを配るなら、鮮度と速さのバランス設計が欠かせません。
実効レイテンシ = h · Tエッジ + (1−h) · Tオリジン h=ヒット率。h が 0.9 なら、9割は近くのエッジ(速い)で片付き、平均は劇的に縮む

3. 一台に集中させない — 負荷分散のアルゴリズム

1つのエッジやサーバ群の内側でも、押し寄せるリクエストを複数のバックエンドへ均等に配る仕組みが要ります。これがロードバランサ(LB)。配り方(方式)で、混み具合の均され方が変わります。

下では各サーバの処理速度をあえてバラバラにしてあります。ラウンドロビン(順番に配る)だと遅いサーバに行列が溜まりがち。最少コネクション(今いちばん空いている所へ配る)に切り替えると、行列が揃っていく様子が見えます。

ロードバランサ — 配り方でキューの揃い方が変わる
左のLBから各サーバへリクエストが飛びます。棒=待ち行列の長さ、色=混み具合。数字はサーバの相対速度(×)。方式を切り替えると、最大キューとばらつき σ の値が変わります。
POINT — 「空いている所」を選ぶだけで効く 最少コネクション法は 次のサーバ = argmini(サーバ i の処理中コネクション数)。処理の重さがバラつく現実では、順番配り(ラウンドロビン)より行列が揃いやすく、遅いサーバへの過集中を自然に避けられます。ほかに応答時間で重み付けする方式や、同じユーザーを同じサーバに固定するセッション固定もあります。

4. 落ちても止めない — ヘルスチェックとフェイルオーバー

サーバは壊れます。LBは定期的に各サーバの生死を確認するヘルスチェックを打ち、応答が返らないサーバを振り分け先から自動的に外し、生きているサーバへ流し直します。これがフェイルオーバー。ユーザーは障害に気づきません。

下のボタンでサーバを落としてみてください。落ちた瞬間にヘルスチェックが赤くなり、そのサーバへの矢印が止まり、残りのサーバが仕事を引き取ります。戻せば自動で復帰します。

フェイルオーバー — 落ちたサーバを外して迂回する
各サーバの左の丸=ヘルスチェック(緑=生存 / 赤=停止、周期的に脈打つ)。停止させるとリクエストがそのサーバを避け、残りへ再分配されます。全滅させない限りサービスは続きます。

5. まとめ — 速さと止まらなさを設計する

一歩先へ — 実世界のCDNと分散システム Cloudflare や Akamai は世界数百都市に拠点を持ち、静的配信だけでなくエッジで動くプログラム(エッジコンピューティング)も走らせます。バックエンドをどのサーバに割り当てるかはコンシステントハッシュで、サーバ増減時の再配置を最小化するのが定番。さらに DNS ベースの広域負荷分散(GSLB)が「どの地域のどのデータセンターへ送るか」を、L4/L7 ロードバランサが「その中でどのサーバへ送るか」を担う—階層で分けて考えるのがネットワーク工学の作法です。