负载平衡
1)她在建筑中的原因和位置
平衡器是客户端和后端团队之间的"旋转栅门"。他的目标是:- 可用性(无单一故障点)、潜伏性(p95向下)、规模(水平)、安全性(TLS/WAF)、版本可管理性(金丝雀/蓝绿色)。
- Edge/Global: Anycast, GSLB/GeoDNS, CDN/Edge-LB, DDoS.
- L4(TCP/UDP):NLB,磁悬浮物,无终止代理。
- L7(HTTP/2,gRPC,WebSocket,QUIC):路由路由/标头/粘贴,kesh/压缩/中继。
- Data-tier: DB-прокси (PgBouncer/ProxySQL), Redis Cluster/Consistent Hash, Kafka partitioning.
2)平衡模型和算法
Round-Robin (RR):简单均匀。
Least Connections (LC):适用于长连接器(WS, gRPC)。
Least Request/Power of Two (P2C):比较两个随机性-良好的速度/质量平衡。
重量RR/LC:金丝雀/"热"指甲的重量。
一致性冻结(CH):无表会话粘性(cart,Redis)。
Maglev/Flow-hash:快速L3/L4分发,具有耐翻转性。
Latency-aware:选择滑动p50/p95。
EWMA:考虑延误的历史。
建议: L7的默认P2C(least-request);对于stateful/cash-consistent hash;для WS/gRPC — least-connections.
3)Apstrims健康: 检查和"驱逐"
Health-checks: TCP, HTTP 200/匹配 тела, gRPC status;间距/时间间隔/错误阈值。
Outlier Ejection:"嘈杂"实例的自动排序(consecutive-5xx,success-rate-ejection)。
慢启动和扭曲:新实例的软输入(体重逐渐增加)。
连接绘制:在关闭/丢弃时,活动连接的"凿子"没有悬崖。
4)会议和粘性(粘性)
Cookie-stickiness (L7): `Set-Cookie: lb=
按键CH: "hash (userId'sessionId'cartId)"。
IP-hash-仅在封闭的网络上(NAT断开)。
TTL粘性+fallback在noda处。
重要的是:尽量减少粘性需求→在实例外存储状态(Redis/DB/JWT)。
5)全球平衡(GTM/GSLB)
Anycast+健康问题:一个IP,流量到最近的PoP;自动捕获器。
GeoDNS/Latency-DNS:地理/延迟响应。
区域集群:"居民数据"保留在该地区(GDPR);具有复制功能的区域间故障切换。
政治:地质块,按帐户/令牌排列"stikeregion"。
6)协议和功能
HTTP/2:多重性,优先事项;需要一个熟练的连接池。
gRPC:长寿流→ least-connections,激进的健康检查。
WebSocket/SSE:连接粘性,大的idle-taymauts,TCP保持活力。
QUIC/HTTP/3:快速起步,抵御损失;留意MTU/path-MTU。
TLS-termination/mTLS:在edge/L7-LB上磨碎;内部-mTLS/identity (SPIFFE)。
7)过载保护(超载控制)
Rate-limit: per-IP, per-key, per-route;burst+sustain.
Adaptive Concurrency (Envoy):同时查询的动态极限。
Queue/Surge-buffer:队列大小有限,诚实拒绝503。
Hedging/Parallel赛车:复制慢速查询(仅偶数)。
Timeout预算:分开连接/阅读/写入。
Backpressure:"503+Retry-After",带有抖动的客户指数回溯。
慢速保护:读/写定时器,最低速度。
8)发布和流量管理
Canary (weighted): 1–5–10–25–50–100% с guardrails (p95, 5xx, timeouts).
蓝绿色:即时滚动,回滚-DNS/LB。
Shadow/Mirror:不影响响应的请求副本;PII掩盖。
Header/Claim-routing: `X-Canary: 1` или `JWT.claims.region/role`.
9)自动滑行和排水
HPA/ASG по CPU+RPS+p95+queue-depth.
PreStop hook:等待连接器完成。
Warm pool/instance reuse:减少冷启动。
能力规划:目标"utilization 60-70%"在p95是正常的。
10)可观察性和SLO
LB度量标准:RPS,p50/p95/p99,4xx/5xx,开放连接,queue-len,ejections,retries,hit-ratio kesha。
Tracing: "traceparent /x-request-id"通过LB →服务→ DB。
Logs:结构,PII/PAN面具,与启示录共鸣。
沿途的SLO: 例如"latency p95 ≤ 300 ms","可用性≥ 99。9%`, `5xx ≤ 0.5%`.
Alerts:按偏差(burn-rate SLO, ejection, 5xx/timeout)。
11)数据平衡和缓存
PostgreSQL/MySQL:
Read/Write split (ProxySQL/pgpool) + read-replicas;sticky-txn.
Failover: RPO=0的同步副本(更贵)。
Redis:
Redis Cluster + hash-slot;会议-CH;Taymauts/Retryable errors。
Kafka/Redpanda:
通过分党和消费者群体实现平衡;不要与HTTP-LB混淆。
Object Storage (S3/MinIO): multi-region failover через GSLB/replication.
12)K8s和云LB
服务(ClusterIP/NodePort/LoadBalancer)是基本的L4。
Ingress/Gateway API-L7路由,金丝雀重量,TLS。
AWS: NLB (L4,高带宽),ALB (L7, WAF, sticky, header-routing)。
GCP: Global LB (L7/HTTP(S) с Anycast), TCP/UDP proxy LB.
Azure: Front Door (global), Application Gateway (L7), Load Balancer (L4).
13)配置示例
13.1 NGINX (L7, least_conn, sticky, canary)
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, health, slowstart, stick-table)
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, outlier, retries, adaptive concurrency)
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 (Gateway API, weighted canary)
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)算法。
- 健康检查和检测阈值已配置。
- Slow-start, warmup, connection-drein包括在内。
- TLS/mTLS,HSTS,安全密码;HTTP/2/3必要时。
- Sticky/CH仅在需要时;TTL и fallback.
[] Rate-limit/burst, timeouts, retry-budget, adaptive concurrency.
- Logi/Traces:"trace-id"滚动;PII掩盖。
- SLO/Alerta p95/5xx/elexes/queue-len。
- 金丝雀重量+回滚计划;大变化下的影子。
用于支付/合规路由
- POST等效性(Idempotency-Key)。
- PSP之间的失败;same-method验证。
- 错误代码已归一化;每个客户的ETA/原因。
用于DB/缓存
- RW-split/复制件;Taymauts, network retry-y.
- Redis的CH/slot-hash;防护"热键"。
- 监控延迟和复制记录。
15)质量指标(最低限度)
Latency p50/p95/p99路线/方法。
Error rate 4xx/5xx, timeout/overflow.
Open/active connections, queue depth, retry count.
Outlier效果和原因。
Sticky hit-ratio / cache hit-ratio.
GSLB:区域分配,操纵器,PoP可用性。
16)反模式
一个没有冗余的整体式LB。
Sticky会话是"全力以赴",而不是带走病情。
全局无限队列(隐藏问题,融化p99)。
没有jitter/预算的 retrai是查询的"风暴"。
没有受信任代理列表的"X-Forwarded-For"信任。
脱落时没有drain → WS/gRPC悬崖。
在自动滑行中不考虑长寿命连接器。
17) iGaming特点
高峰和锦标赛:参考书/列表上的微型赛车(1-5 s),轮流自动滑冰。
Live games/strims: LC for long connects,优先考虑最近的PoP。
付款:地理/货币/金额/提供商路由;严格的taymouts和idemputity。
负责任的游戏和合规性:即使降级,也优先跳过限制/锁定请求(策略失效/关闭)。
18)实施过程(4冲刺)
1.交通地图:协议,p95/p99负载,关键路线。
2.LB配置:算法,健康/outlier,TLS,限制/时间限制,观察能力。
3.GSLB/Edge:Anycast/GeoDNS,PoP helscheck,区域数据策略。
4.发布策略:canary/shadow, SLO alerts, autoscale+drain,事后分析。
最终的spargalka
根据流量类型(P2C/LC/CH)和连接长度选择算法。
保持apstrims"健康":health-checks+ outlier+slow-start+ drain。
管理峰值负载:rate-limit, adaptive concurrency,有故障的队列。
使用GSLB/Anycast实现全球可用性和按地区划分的合规性。
可观察性和SLO是强制性的;发行版-通过带有回滚计划的canary/shadow。
在可能的情况下-从实例中删除会话时间,从LB中消除粘性。