ロードバランサーの仕組み — お店の受付が担当へ振り分けるように
受付が、使える担当へ仕事を配る
まず、AとBへ順番に仕事を配る
Python 3で次を round-robin-demo.py に保存し、python round-robin-demo.py を実行します。
from itertools import cycle
targets = cycle(["サーバーA", "サーバーB"])
for request in range(1, 5):
print(f"要求{request} → {next(targets)}")
A、B、A、Bの順で表示されます。これは割り当てのルールだけの練習で、実際のネットワーク通信やヘルスチェックは行いません。
一つの入口と、複数の担当
受付役は、自分が要求を処理するのではなく、利用できる担当を選びます。ラウンドロビン、重み付き、接続数、ハッシュなど選び方があります。一台へ長い処理が集中する場合、要求数が同じでも負荷が均等とは限りません。
| 見る情報 | 例 | 判断できること |
|---|---|---|
| 接続情報(L4) | IP・ポート | 接続単位の送り先 |
| HTTP情報(L7) | ホスト・パス | APIと画像などの振り分け |
| ヘルスチェック | 指定パスの応答 | 設定条件を満たす担当か |
NGINXの基本設定では upstream に複数の担当を登録し、proxy_pass で渡します。導入手順はNGINX入門へ。使用する製品が能動的なチェックを行うか、通常の通信の失敗を使うかも確認してください。
ヘルスチェックで、何を確かめるか
「HTTP応答が返る」だけでは、DBへ保存できることまで分からない場合があります。チェックするパス、応答コード、タイムアウト、連続失敗・成功の条件を決めます。故障の検知と復旧の復帰には時間がかかりえます。
AWS ALBでは、登録先がすべてunhealthyの場合にそれらへ送るfail openが文書化されています。「チェックがあるから故障先への通信が必ずゼロ」とは考えないようにしましょう。
もう少し詳しく:状態と入口の冗長化
セッション維持は同じ担当へ送る仕組みで、状態の複製ではありません。カートやログイン情報を引き継ぐには、共有ストアや保存方法も設計します。
担当を増やしても、入口や共通DBが一つの故障点なら全体は止まります。入口の冗長性、接続の排出、ログや失敗率を確認しましょう。オートスケーリングの仕組みは担当の増減、CDNの仕組みは配信とキャッシュの話です。
ペンギン先生のまとめ
「ロードバランサー」って出てきたら「届いた仕事を、複数の担当へ振り分ける受付」と思えばだいたいOK! 担当の状態と、カートなどの保存先もセットで考えよう。
参考資料
- NGINX:HTTP load balancing — 振り分け方法・受動的チェック
- AWS:ALB health checks — 異常判定とfail open
- AWS:Target group attributes — セッション維持と登録解除