ロードバランシング
所要時間
約45分
学べること
- ロードバランシングの基本概念とアルゴリズム
- L4(Transport Layer)とL7(Application Layer)ロードバランサーの違い
- ヘルスチェックとセッション維持の仕組み
- ロードバランサーとDNSの連携
- 一般的なロードバランシングパターン
前提知識
- 01-dns-fundamentals.md の内容
- TCP/IPの基礎知識
- HTTP/HTTPSの基本
1. ロードバランシングの基礎
1.1 ロードバランシングとは
ロードバランシングは、複数のサーバーに対してトラフィックを分散させる技術です。
┌─────────────────────────────────────────────────────────────┐
│ ロードバランサーなし vs あり │
├─────────────────────────────────────────────────────────────┤
│ │
│ 【ロードバランサーなし】 │
│ クライアント │
│ │ │
│ └───────► サーバー1(100%の負荷) │
│ │
│ 問題点: │
│ - 単一障害点(SPOF) │
│ - スケーラビリティの限界 │
│ - メンテナンス時のダウンタイム │
│ │
│ 【ロードバランサーあり】 │
│ クライアント │
│ │ │
│ ▼ │
│ ┌────────────────┐ │
│ │ ロードバランサー │ │
│ └────────────────┘ │
│ │ │
│ ├───────► サーバー1(33%の負荷) │
│ ├───────► サーバー2(33%の負荷) │
│ └───────► サーバー3(33%の負荷) │
│ │
│ 利点: │
│ - 高可用性(1台故障しても継続) │
│ - 水平スケーリング(サーバー追加で対応) │
│ - ゼロダウンタイムデプロイ │
│ │
└─────────────────────────────────────────────────────────────┘
1.2 ロードバランシングの目的
1. 高可用性(High Availability)
- サーバー障害時の自動フェイルオーバー
- サービスの継続性確保
2. スケーラビリティ
- 水平スケーリング(サーバー台数追加)
- トラフィック増加への対応
3. パフォーマンス
- 負荷分散による応答速度向上
- リソースの効率的利用
4. メンテナンス性
- ローリングアップデート
- ゼロダウンタイムデプロイ
2. ロードバランシングアルゴリズム
2.1 主要なアルゴリズム
ラウンドロビン(Round Robin)
最もシンプルなアルゴリズム。順番にリクエストを振 り分けます。
┌─────────────────────────────────────────────────────────────┐
│ ラウンドロビン │
├─────────────────────────────────────────────────────────────┤
│ │
│ リクエスト1 → サーバー1 │
│ リクエスト2 → サーバー2 │
│ リクエスト3 → サーバー3 │
│ リクエスト4 → サーバー1 ← 最初に戻る │
│ リクエスト5 → サーバー2 │
│ ... │
│ │
│ 利点: │
│ - 実装がシンプル │
│ - 均等に分散 │
│ │
│ 欠点: │
│ - サーバーの性能差を考慮しない │
│ - リクエストの重さを考慮しない │
│ │
└─────────────────────────────────────────────────────────────┘
重み付けラウンドロビン(Weighted Round Robin)
サーバーの性能に応じて重みを設定します。
サーバー1: 重み 3(性能高)
サーバー2: 重み 2(性能中)
サーバー3: 重み 1(性能低)
リクエスト1 → サーバー1
リクエスト2 → サーバー1
リクエスト3 → サーバー1
リクエスト4 → サーバー2
リクエスト5 → サーバー2
リクエスト6 → サーバー3
リクエスト7 → サーバー1 ← 最初に戻る
最小接続数(Least Connections)
現在の接続数が最も少ないサーバーにリクエストを振り分けます。
┌─────────────────────────────────────────────────────────────┐
│ 最小接続数 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 現在の状態: │
│ サーバー1: 5接続 │
│ サーバー2: 3接続 ← 最小 │
│ サーバー3: 7接続 │
│ │
│ 新しいリクエスト → サーバー2に振り分け │
│ │
│ 利点: │
│ - 長時間接続に適している(WebSocket等) │
│ - 動的に負荷を均等化 │
│ │
│ 欠点: │
│ - 接続数の追跡が必要(オーバーヘッド) │
│ │
└─────────────────────────────────────────────────────────────┘
IPハッシュ(IP Hash / Source IP Affinity)
クライアントのIPアドレスに基づいてサーバーを決定します。
hash(クライアントIP) % サーバー数 = サーバーインデックス
例:
hash(192.168.1.10) % 3 = 1 → サーバー2
hash(192.168.1.20) % 3 = 0 → サーバー1
hash(192.168.1.30) % 3 = 2 → サーバー3
利点:
- 同一クライアントは常に同一サーバーに接続
- セッション維持(Session Affinity / Sticky Session)
欠点:
- サーバー数変更時に再分散が発生
- 負荷が偏る可能性
最小レスポンスタイム(Least Response Time)
応答時間が最も短いサーバーにリクエストを振り分けます。
サーバー1: 平均応答時間 50ms
サーバー2: 平均応答時間 30ms ← 最速
サーバー3: 平均応答時間 80ms
新しいリクエスト → サーバー2に振り分け
利点:
- パフォーマンス最適化
- 動的に最速サーバーを選択
欠点:
- 応答時間の計測が必要(複雑)
3. L4 vs L7 ロードバランサー
3.1 OSI参照モデルとロードバランサー
┌─────────────────────────────────────────────────────────────┐
│ L4 vs L7 ロードバランサー │
├─────────────────────────────────────────────────────────────┤
│ │
│ OSI参照モデル │
│ ┌─────────────────────┐ │
│ │ 7. アプリケーション │ ← L7ロードバランサー │
│ ├─────────────────────┤ (HTTP/HTTPS、URLパス、ヘッダー) │
│ │ 6. プレゼンテーション│ │
│ ├─────────────────────┤ │
│ │ 5. セッション │ │
│ ├─────────────────────┤ │
│ │ 4. トランスポート │ ← L4ロードバランサー │
│ ├─────────────────────┤ (TCP/UDP、IPアドレス、ポート) │
│ │ 3. ネット ワーク │ │
│ ├─────────────────────┤ │
│ │ 2. データリンク │ │
│ ├─────────────────────┤ │
│ │ 1. 物理 │ │
│ └─────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
3.2 L4ロードバランサー(Transport Layer)
L4ロードバランサーは、IPアドレスとポート番号に基づいてトラフィックを分散します。
┌─────────────────────────────────────────────────────────────┐
│ L4ロードバランサーの動作 │
├─────────────────────────────────────────────────────────────┤
│ │
│ クライアント (192.168.1.10:54321) │
│ │ │
│ │ TCP SYN → lb.example.com:443 │
│ ▼ │
│ ┌──────────────────────┐ │
│ │ L4ロードバランサー │ │
│ │ (lb.example.com) │ │
│ └──────────────────────┘ │
│ │ │
│ │ 判断基準: │
│ │ - 送信元IP: 192.168.1.10 │
│ │ - 送信元ポート: 54321 │
│ │ - 宛先IP: lb.example.com │
│ │ - 宛先ポート: 443 │
│ │ - プロトコル: TCP │
│ │ │
│ ├───► Server1 (10.0.1.10:443) │
│ ├───► Server2 (10.0.1.11:443) │
│ └───► Server3 (10.0.1.12:443) │
│ │
│ ※ HTTPヘッダーやペイロードは見ない │
│ │
└─────────────────────────────────────────────────────────────┘
L4の特徴:
利点:
- 高速(パケット検査が少ない)
- 低レイテンシー
- あらゆるTCP/UDPトラフィックに対応
- SSL終端不要(パススルー可能)
欠点:
- URLパスベースのルーティング不可
- HTTP/HTTPSヘッダーの利用不可
- コンテンツベースのルーティング不可
用途:
- 非HTTPトラフィック(DB、SMTP、DNS等)
- 超高速処理が必要な場合
- SSL/TLSをバックエンドで処理したい場合
3.3 L7ロードバランサー(Application Layer)
L7ロードバランサーは、HTTPリクエストの内容に基づいてトラフィックを分散します。
┌─────────────────────────────────────────────────────────────┐
│ L7ロードバランサーの動作 │
├─────────────────────────────────────────────────────────────┤
│ │
│ クライアント │
│ │ │
│ │ GET /api/users HTTP/1.1 │
│ │ Host: example.com │
│ │ User-Agent: Mobile │
│ ▼ │
│ ┌──────────────────────┐ │
│ │ L7ロードバランサー │ │
│ │ (Nginx/HAProxy) │ │
│ └──────────────────────┘ │
│ │ │
│ │ 判断基準: │
│ │ - URLパス: /api/users │
│ │ - ホストヘッダー: example.com │
│ │ - HTTPメソッド: GET │
│ │ - User-Agentヘッダー: Mobile │
│ │ - Cookieの有無 │
│ │ │
│ ├───► /api/* → API Server (10.0.1.10) │
│ ├───► /static/* → Static Server (10.0.1.20) │
│ └───► /* → App Server (10.0.1.30) │
│ │
└─────────────────────────────────────────────────────────────┘
L7の特徴:
利点:
- URLパスベースのルーティング
- ホストヘッダーベースのルーティン グ
- HTTPヘッダーの読み書き
- WebSocketサポート
- SSL/TLS終端(証明書管理の一元化)
- コンテンツベースのルーティング
欠点:
- L4より低速(HTTP解析が必要)
- HTTP/HTTPS専用
用途:
- Webアプリケーション
- マイクロサービス(パスベースルーティング)
- コンテナ環境(複数サービスの統合)
4. 実践的なロードバランサー設定
4.1 ロードバランサーの選択基準
ロードバランサーを選択する際の一般的な考慮事項:
┌─────────────────────────────────────────────────────────────┐
│ ロードバランサー選択基準 │
├─────────────────────────────────────────────────────────────┤
│ │
│ L7ロードバランサー(アプリケーション層) │
│ 推奨ケース: │
│ - HTTP/HTTPSトラフィック │
│ - URLパスベースルーティングが必要 │
│ - SSL/TLS終端が必要 │
│ - WebSocketサポートが必要 │
│ 例: Nginx, HAProxy, Apache mod_proxy │
│ │
│ L4ロードバランサー(トランスポート層) │
│ 推奨ケース: │
│ - 非HTTPプロトコル(TCP/UDP) │
│ - 超高速処理が必要 │
│ - SSL/TLSをバックエンドで処理 │
│ - データベース接続の負荷分散 │
│ 例: HAProxy (TCPモード), LVS, Nginx Stream │
│ │
└─────────────────────────────────────────────────────────────┘