前置知识: 云计算

负载均衡与自动伸缩

6 min中级

ELB 三种负载均衡器选型、Auto Scaling 伸缩策略、健康检查与容量规划实战。

前置知识与学习目标

负载均衡(LB)把流量分摊到多台实例,自动伸缩(Auto Scaling)按负载 调整实例数量——两者组合成云上「弹性」的完整闭环:LB 让多实例有意义, AS 让实例数量可变。本文以 AWS 三个负载均衡器与 EC2 Auto Scaling 为主 线展开,选型思路对 Azure/GCP 同样适用(Azure Load Balancer/Application Gateway、GCP 网络负载均衡/HTTPS 负载均衡是同构概念)。

完成本文后,你应当能够:为业务选对负载均衡器;配置目标追踪等伸缩 策略;理解两套健康检查的差异;避免伸缩滞后与抖动两类经典问题。

1. 负载均衡器三兄弟

1.1 全景对比

flowchart LR
    U[客户端] -->|TCP/UDP| NLB[NLB 网络型 L4<br/>超高性能/静态 IP]
    U -->|HTTP/HTTPS/gRPC| ALB[ALB 应用型 L7<br/>路由/证书/WAF]
    NLB --> T[目标组<br/>实例/IP/Lambda]
    ALB --> T
    T --> EC[EC2/ECS 后端]
维度ALB(应用型 L7)NLB(网络型 L4)CLB(经典型,旧)
工作层次HTTP/HTTPS/gRPCTCP/UDP/TLSL4 兼旧(也含部分 L7)
路由能力路径/主机名/Header/查询串端口/监听器级极有限
性能模型弹性节点固定源 IP、超低延迟、亿级连接旧架构
IP 类型弹性分配每可用区静态 IP(可挂 EIP)随机
典型场景Web/API 入口游戏服/物联网/MQTT、数据库前端存量迁移

选型口诀:看协议不看感觉——HTTP 族选 ALB;非 HTTP(TCP/UDP 长连接) 或需要静态 IP/极高吞吐选 NLB;CLB 仅在存量架构中遇到,新设计不考虑。

1.2 ALB 的关键能力

# ALB 监听器规则示意(Terraform/控制台同构):按路径分流到不同目标组
listener_rules:
  - priority: 1
    action: forward
    condition: {path_pattern: "/api/*"}
    target_group: api-tg        # API 服务
  - priority: 2
    action: forward
    condition: {path_pattern: "/admin/*", source_ip: "10.0.0.0/8"}
    target_group: admin-tg      # 仅内网可访问的管理面
  - priority: 100
    action: forward
    condition: default
    target_group: web-tg        # 兜底

ALB 原生集成 AWS WAF(应用防火墙)、ACM 证书自动续期、OIDC/Cognito 认证(在 LB 层就挡住未登录请求)。目标组除了 EC2 实例,还能直接挂 ECS 任务、IP 目标(混合部署)、甚至 Lambda——Serverless 后端的常用入口。

1.3 NLB 的关键能力

  • 每可用区一个静态 IP(可绑弹性 IP),下游防火墙/白名单友好;
  • 连接级别性能高且延迟低,支持每秒数百万连接,无需预热;
  • 支持 Proxy Protocol v2 传递真实源 IP(L4 不改包,后端看不到 X-Forwarded-For);
  • 可与 ALB 叠加:NLB 在前(静态 IP)+ ALB 在后(L7 路由)的组合架构。

2. Auto Scaling:让实例数量变成策略

2.1 组成三件套

启动模板(Launch Template)
   = 新实例的「出生证明」:AMI、规格、安全组、User Data
Auto Scaling 组(ASG)
   = 容量管理单元:min/max/desired、分布在哪些子网
伸缩策略(Scaling Policy)
   = 什么时候调 desired:目标追踪/步进/定时
项说明经验值
min保底容量>= 2(跨 AZ 抗单点)
desired期望容量稳态水位
max上限结合预算设硬顶,防失控扩容
AZ 再平衡自动均衡跨 AZ 实例保持默认开启

2.2 伸缩策略四型

策略原理适用
目标追踪「保持 CPU 40%」,自动加减绝大多数场景(首选)
步进按指标区间阶梯式加减需要不对称扩缩
定时日历时间点调整可预测的潮汐流量
预测式机器学习预测 + 提前扩每日强周期 + 长启动时间
# 目标追踪:平均 CPU 保持 40%,伸缩速度由 ASG 自动优化
aws autoscaling put-scaling-policy \
  --auto-scaling-group-name web-asg \
  --policy-name cpu40-target \
  --policy-type TargetTrackingScaling \
  --target-tracking-configuration '{
    "PredefinedMetricSpecification": {"PredefinedMetricType": "ASGAverageCPUUtilization"},
    "TargetValue": 40.0
  }'

# 负载均衡请求数目标追踪:每个实例每分钟最多 1000 次请求
aws autoscaling put-scaling-policy \
  --auto-scaling-group-name web-asg \
  --policy-name req-target \
  --policy-type TargetTrackingScaling \
  --target-tracking-configuration '{
    "PredefinedMetricSpecification": {
      "PredefinedMetricType": "ALBRequestCountPerTarget",
      "ResourceLabel": "app/my-alb/12345/targetgroup/web-tg/67890"
    },
    "TargetValue": 1000.0
  }'

陷阱一:目标追踪指标必须与容量成比例(CPU、请求数/实例可以, 队列长度、P99 延迟不成比例,不适合目标追踪)。

陷阱二:缩容比扩容危险。给指标加合适的目标值缓冲(如 CPU 40% 而非 70%),并依赖 ASG 内置的缩容冷却,避免「抖动」(扩了又缩、缩了又扩)。

3. 健康检查:两套体系,职责不同

层检查什么动作
EC2 状态检查(系统级)硬件/电源/网络/内核挂死ASG 自动替换故障实例
ELB 目标组健康检查(应用级)端口可连 + HTTP 状态码/路径不健康目标停止接收流量
# 目标组健康检查配置:打真实业务路径,而非 /
aws elbv2 modify-target-group \
  --target-group-arn arn:aws:elasticloadbalancing:...:targetgroup/web-tg/... \
  --health-check-path /healthz \
  --health-check-interval-seconds 15 \
  --healthy-threshold-count 2 \
  --unhealthy-threshold-count 3 \
  --matcher HttpCode=200-399

两套检查的分工决定了「谁踢谁」:实例宕机由 EC2 检查触发替换;应用假死 (进程在、服务不可用)只能靠 ELB 应用级检查发现。应用要实现 /healthz 语义——200 代表「能处理请求」,依赖的数据库不可用时可以 返回 503(读路径不可用即不接流量)。

陷阱:健康检查过严(阈值 1 次、间隔 5 秒)会让短暂 GC 停顿或部署 抖动变成「实例被踢 -> 全组重启风暴」;过松则故障实例继续接流量。 生产典型值:间隔 10-30 秒、连续 2-3 次失败判定不健康。

4. 最佳实践

4.1 伸缩滞后与预热

扩容不是瞬时的:指标反应延迟(1-3 分钟)+ 启动模板拉起实例(1-5 分钟)

  • 应用预热(连接池/JIT/缓存)+ 健康检查通过,全链路可达 5-10 分钟。 对策:
  • 指标留提前量:目标值设得保守(40% 而不是 90%);
  • 定时策略覆盖已知高峰(大促、整点任务);
  • 预测式伸缩应对强日周期负载;
  • LB/ASG 现已自动弹性扩容,无 historic 预热义务,但应用自身的 预热(慢启动:新实例权重渐进)仍需设计。

4.2 容量预留与成本

手段作用
ON-Demand 容量预留确保关键时刻一定能拿到实例(容量保障)
Savings Plans/预留折扣价覆盖稳态基线
Spot + 混合 ASG基线按需 + 弹性层 Spot(可省 60-90%)

ASG 的容量再平衡(Capacity Rebalancing)可在 Spot 回收前主动替换, 配合多实例类型的「属性式」扩容(多种规格+多种购买选项)是弹性层的 标准省钱姿势。

4.3 与部署的协同

  • 滚动发布依赖 ASG:新启动模板 -> 滚动替换(Instance Refresh);
  • 缩容默认按「最旧的启动配置」淘汰实例,与发布节奏冲突时需自定义 缩容策略(如优先淘汰最旧实例或按可用区均衡);
  • 实例保护(--protect-from-scale-in)可防止关键实例被缩容误杀。

小结

  • 初学者要点:HTTP 业务选 ALB、TCP/UDP 或要静态 IP 选 NLB、CLB 不用于 新设计;ASG 三件套(启动模板/组/策略);伸缩策略首选目标追踪,指标 必须与容量成比例;健康检查分 EC2 系统级与 ELB 应用级两层,各管各的。
  • 进阶注意:扩容全链路 5-10 分钟,峰值前要有定时/预测式伸缩兜底; 缩容参数保守化防抖动;应用必须实现语义化 /healthz;Spot 混合 ASG + 容量再平衡是弹性层省钱的成熟方案;缩容淘汰顺序要与发布节奏 一起设计,防止刚发布的实例被先杀。