ロードバランシング
1)建築においてなぜ、どこにあるのか
バランサーは、クライアントとバックエンドの艦隊の間の「回転木戸」です。その目的は次のとおりです:- 可用性(1つの障害ポイントなし)、レイテンシ(p95ダウン)、スケール(水平)、セキュリティ(TLS/WAF)、リリース管理(カナリア/ブルーグリーン)。
- Edge/Global: Anycast、 GSLB/GeoDNS、 CDN/Edge-LB、 DDoS。
- L4 (TCP/UDP): NLB、 maglev、終端なしのプロキシ。
- L7 (HTTP/2、 gRPC、 WebSocket、 QUIC):パスのルーティング/ヘッダー/スタンプ、キャッシュ/圧縮/リトレイ。
- Data-tier: PgBouncer/ProxySQL、 Redis Cluster/Consistent Hash、 Kafkaパーティショニング。
2)モデルとアルゴリズムのバランス
ラウンドロビン(RR):シンプルなユニフォーム。
最小接続(LC):長い接続(WS、 gRPC)に適しています。
Reast Request/Power-of-Two (P2C): 2つのランダムなものを比較することは、良いスピード/品質バランスです。
重み付けRR/LC:カナリア/ホットノードの重み。
Consistent Hashing (CH):テーブルなしのセッション粘着性(カート、Redis)。
Maglev/Flow-hash:フラッピング抵抗と高速L3/L4分布。
レイテンシー対応:p50/p95をスライドさせて選択します。
EWMA:遅延の履歴を考慮します。
推奨事項:L7のデフォルトP2C (lest-request);ステートフル/キャッシュ-一貫性のあるハッシュ;WS/gRPC-最小接続。
3)上流の健康: 点検および「立ち退き」
ヘルスチェック:TCP、 HTTP 200/匹配は、gRPCの状態;間隔/タイムアウト/エラーしきい値。
Outlier Ejection: 「noisy」インスタンス(sequential-5xx、 success-rate-ejection)の自動除外。
スロースタート&ウォームアップ:新しいインスタンスのソフトエントリ(徐々に重量が増加)。
接続ドレイン:オフ/リセット時-中断せずにアクティブ接続の「トッピングアップ」。
4)セッションと粘着性(粘着性)
Cookie-stickiness (L7): 'Set-Cookie: lb=
CH by key: 'hash (userId' sessionId 'cartId)'。
IP-hash-クローズドネットワーク(NATブレーク)のみ。
TTL stickiness+fallback in nodal eviction。
重要:stickinessの必要性を最小限に抑え→インスタンス外の状態を格納します(Redis/DB/JWT)。
5)グローバルバランシング(GTM/GSLB)
Anycast+health-probe: 1つのIP、最寄りのPoPへのトラフィック。自動feilover。
GeoDNS/Latency-DNS: Geo/Latency Response。
地域クラスター:「居住データ」は地域(GDPR)に残ります。レプリケーションによる地域間フェイルオーバー。
政治家:地理ブロック、アカウント/トークンによる「stickeregion」。
6)議定書および特徴
HTTP/2:マルチプレックス、優先度;上流のための有能な接続プールを必要とします。
gRPC:長寿命ストリーム→最小接続、積極的な健康チェック。
WebSocket/SSE:接続の粘着性、大規模なアイドルタイムアウト、TCP keep-alive。
QUIC/HTTP/3:速い開始、損失への抵抗;MTU/patch-MTUを監視します。
TLS-termination/mTLS: edge/L7-LBで終了します。経口mTLS/identity (SPIFFE)。
7)積み過ぎ制御
Rate-limit: IPごと、キーごと、ルートごと;burst+sustain。
Adaptive Concurrency (Envoy)-同時リクエストの動的制限。
キュー/サージバッファ:フェア拒否503の制限されたキューのサイズ。
ヘッジング/パラレルレーシング:スロークエリの複製(idempotentのみ)。
タイムアウトバジェット:接続/読み取り/書き込みを分離します。
Backpressure: '503+Retry-After'、ジッタークライアント指数リトリア。
Slow-loris保護:読み取り/書き込みタイムアウト、最小速度。
8)リリースとトラフィック管理
カナリア(重み付け):1-5-10-25-50-100%ガードレール(p95、 5xx、タイムアウト)。
ブルーグリーン:インスタントスイッチ、ロールバック-DNS/LB。
Shadow/Mirror:応答に影響を与えることなくリクエストのコピー。PIIマスキング。
ヘッダー/クレーム・ルーティング:'X-Canary: 1'\\'JWT。主張しています。region/role'。
9)オートスケーリングおよび排水
HPA/ASG CPU+RPS+p95+キュー深度。
PreStopフック:接続が完了するまで待ちます。
ウォームプール/インスタンスの再利用:コールドスタートを短縮します。
容量計画:p95のターゲット'60-70%の利用'は正常です。
10)観察可能性およびSLO
LBメトリクス: RPS、 p50/p95/p99、 4xx/5xx、 open-connections、 queue-len、 ejections、 retries、 hit-ratio cache。
トレース: 'traceparent/x-request-id' (LB→services→databases)
ログ:構造、PII/PANマスク、上流との相関。
ルートSLO: 例えば、'latency p95 ≤ 300 ms'、 'availability ≥ 99。9%'、'5xx ≤ 0。5%`.
アラート:偏差によって(バーンレートSLO、放出サージ、5xx/タイムアウトの成長)。
11)データとキャッシュのバランス
PostgreSQL/MySQL:- 読み取り/書き込み分割(ProxySQL/pgpool)+読み取りレプリカ;sticky-txn。
- フェイルオーバー:RPO=0の同期レプリカ(より高価)。
- Redisクラスタ+ハッシュスロット;セッション-CH;timeouts/Retryableエラー。
- パーティショニングと消費者グループによるバランス;HTTP-LBと混同されないため。
- オブジェクトストレージ(S3/MinIO): マルチリージョンフェールオーバーGSLB/レプリケーション。
12) K8sおよびクラウドLB
サービス(ClusterIP/NodePort/LoadBalancer)-ベースL4。
Ingress/Gateway API-L7ルーティング、カナリアウェイト、TLS。
AWS: NLB (L4、高帯域幅)、ALB (L7、 WAF、スティッキー、ヘッダルーティング)。
GCP:グローバルLB (L7/HTTP (S)→Anycast)、 TCP/UDPプロキシLB。
Azure:フロントドア(グローバル)、アプリケーションゲートウェイ(L7)、ロードバランサー(L4)。
13)構成例
13.1 NGINX (L7、 least_conn、粘着性がある、カナリア)
nginx upstream api_pool {
least_conn;
server api-1:8080 max_fails=3 fail_timeout=10s;
server api-2:8080 max_fails=3 fail_timeout=10s;
sticky cookie lb_id expires=30m path=/ secure httponly;
}
map $http_x_canary $dst {
default api_pool;
1 canary_pool;
}
upstream canary_pool {
least_conn;
server api-canary:8080 weight=1;
}
server {
listen 443 ssl http2;
location /api/ {
proxy_read_timeout 5s;
proxy_connect_timeout 1s;
proxy_set_header X-Request-Id $request_id;
proxy_pass http://$dst;
}
}
13.2 HAProxy (P2C、健康、スロースタート、スティックテーブル)
haproxy backend api balance leastconn option httpchk GET /health default-server inter 3s fall 3 rise 2 slowstart 10s server s1 10. 0. 0. 11:8080 check server s2 10. 0. 0. 12:8080 check stick-table type ip size 100k expire 30m http-request track-sc0 src rate limit per IP http-request deny deny_status 429 if { sc_http_req_rate(0) gt 50 }
13.3 Envoy (P2C、アウトリエ、リトライ、適応並行性)
yaml load_assignment: {... }
lb_policy: LEAST_REQUEST least_request_lb_config: { choice_count: 2 }
outlier_detection:
consecutive_5xx: 5 interval: 5s base_ejection_time: 30s typed_extension_protocol_options:
envoy. extensions. filters. http. adaptive_concurrency. v3. AdaptiveConcurrency:
gradient_controller_config:
sample_aggregate_percentile: PERCENTILE_50 retry_policy:
retry_on: "5xx,reset,connect-failure"
num_retries: 2 per_try_timeout: 1s
13.4 Kubernetes(ゲートウェイAPI、加重カナリア)
yaml apiVersion: gateway. networking. k8s. io/v1 kind: HTTPRoute spec:
rules:
- matches: [{ path: { type: PathPrefix, value: /api }}]
backendRefs:
- name: api-v1 weight: 90 port: 8080
- name: api-v2-canary weight: 10 port: 8080
14)チェックリスト
LB/ルートリリース前
- トラフィックタイプに選択されたアルゴリズム(P2C/LC/CH)。
- ヘルスチェックと射出しきい値が設定されています。
- スロースタート、ウォームアップ、接続ドレインが有効。
- TLS/mTLS、 HSTS、セキュア暗号;必要に応じてHTTP/2/3してください。
- 粘着性がある/CH必要ならばだけ;TTLのフォールバック。
- Rate-limit/burst、 timeouts、再試行予算、adaptive concurrency。
- ログ/トレイル:'trace-id'がスローされます。PIIマスキング。
- p95/5xx/elections/queue-lenによるSLO/アラート。
- カナリア重量+ロールバックプラン;大きな変化を伴う影。
決済・コンプライアンス経路について
- Idempotency-Key。
- PSP間のフェイルオーバー;同じメソッドをチェックします。
- エラーコードは正規化されます。ETA/顧客ごとの理由。
DB/キャッシュ用
- RW分割/レプリカ;タイムアウト、ネットワークの再試行。
- RedisのCH/slot-hash;「ホットキー」に対する保護。
- レイテンシの監視とレプリケーションラグ。
15)品質指標(最小)
ルート/メソッドによるレイテンシp50/p95/p99。
エラー率4xx/5xx、タイムアウト/オーバーフロー。
開いている/アクティブな接続、キューの深さ、再試行数。
外側の放出と原因。
スティッキーヒットレシオ/キャッシュのヒットレシオ。
GSLB:地域分布、faylovers、 PoPの可用性。
16)アンチパターン
1つの保護されていないモノリシックLB。
状態を取り除くのではなく、粘着性のあるセッション「すべてのために」。
グローバル無限のキュー(問題を隠し、p99を成長させる)。
ジッタ/予算のないレトライは、要求の「嵐」です。
信頼されたプロキシのリストを除いて'X-Forwarded-For'を信頼します。
枯渇中の排水の欠如→WS/gRPCが壊れます。
オートスケール時に長寿命の接続を考慮に入れない。
17) iGaming特異性
ピークとトーナメント:ディレクトリ/リスト(1-5秒)のマイクロキャッシュ、順番に自動スケール。
ライブゲーム/ストリーム:長い接続のためのLC、最寄りのPoPの優先順位。
支払い:地理/通貨/金額/プロバイダルーティング;厳密なタイムアウトとidempotency。
責任あるプレイとコンプライアンス:劣化しても制限/ロックの要求をスキップする優先順位(フェイルオープン/ポリシーで閉じる)。
18)実装プロセス(4スプリント)
1.トラフィックマップ:プロトコル、p95/p99負荷、重要なルート。
2.LB構成:アルゴリズム、健康/外向き、TLS、制限/タイムアウト、オブザビリティ。
3.GSLB/Edge: Anycast/GeoDNS、 PoPサポート、地域データポリシー。
4.リリース戦略:カナリア/シャドウ、SLOアラート、オートスケール+ドレイン、インシデント後の分析。
最終的なチートシート
トラフィックの種類(P2C/LC/CH)と接続期間のアルゴリズムを選択します。
上流の「健康」を保ちます:健康チェック+外側+スロースタート+排水。
ピーク負荷の管理:レート制限、アダプティブ並行性、障害のあるキュー。
GSLB/Anycastを使用して、地域ごとのグローバルな可用性とコンプライアンスを実現します。
観測可能性とSLOは必須です。リリース-ロールバックプランでカナリア/シャドウ経由。
可能であれば、インスタンスからセッションを削除し、LBから粘着性。