4、弹性伸缩基础:水平伸缩与垂直伸缩、基于阈值的伸缩、基于预测的伸缩、基于事件的伸缩

弹性伸缩是服务画像驱动 SLA 落地的核心执行层。没有正确的伸缩基础,任何健康口径量化都只是纸上谈兵。本章从两个维度展开:伸缩模式(水平 vs 垂直)和伸缩触发方式(阈值、预测、事件)。理解这些基础,才能为后续“服务画像-弹性策略映射”建立技术共识。

4.1 水平伸缩与垂直伸缩

伸缩模式决定了资源调整的粒度与速度。下表对比两种模式在 SLA 场景下的关键差异:

对比维度 水平伸缩(Scale Out/In) 垂直伸缩(Scale Up/Down)
操作对象 增加/减少实例数量 增加/减少单实例规格(CPU/内存)
伸缩粒度 整实例(通常 1 个副本) 按规格阶梯(如 2C4G → 4C8G)
生效速度 分钟级(镜像拉取+调度) 秒级(热调整或重启)
SLA 影响 扩容期间请求分布变化,需配合负载均衡 缩容可能触发连接中断,需优雅排空
适用场景 无状态服务、微服务、Web 层 有状态服务、数据库、单机瓶颈
成本模型 线性增长,按实例数计费 阶梯式增长,高规格溢价明显
运维建议:在服务画像中,水平伸缩应作为默认首选模式,因为它与分布式架构的故障域隔离天然匹配。垂直伸缩仅用于无法水平拆分的组件(如单节点数据库),且需设置规格上限以避免单点过大。

下图展示了水平伸缩与垂直伸缩在集群拓扑上的直观差异:

水平伸缩 vs 垂直伸缩 拓扑对比 水平伸缩(Scale Out/In) 实例 1 实例 2 实例 3(新增) 负载均衡器 垂直伸缩(Scale Up/Down) 2C4G (原规格) 4C8G (升级后) 关键区别: • 水平伸缩:实例数变化,单实例规格不变,适合无状态服务。 • 垂直伸缩:实例数不变,单实例规格变化,适合有状态服务。 • 混合策略:先水平扩容至一定规模,再对瓶颈节点垂直升配。

4.2 基于阈值的伸缩

基于阈值的伸缩是最成熟、最广泛使用的触发方式。它通过预设指标上下界,当指标持续越界时触发伸缩动作。核心要素包括:

  • 指标选择:CPU 使用率、内存使用率、请求 QPS、响应延迟 P99、连接数等。
  • 阈值设定:上限触发扩容,下限触发缩容。需设置冷却时间避免抖动。
  • 聚合窗口:通常取 1-5 分钟的平均值或百分位值,过滤瞬时毛刺。
  • 步长策略:每次伸缩的实例数或规格变化量。
常见陷阱:阈值伸缩容易陷入“振荡循环”——指标刚降到下限触发缩容,缩容后负载回升又触发扩容。解决方案:设置合理的冷却时间(Cooldown)和上下阈值之间保留死区(Dead Zone),例如扩容阈值 70%,缩容阈值 30%,中间 30%-70% 为稳定区。

下表给出一个典型 Web 服务的阈值伸缩配置示例:

指标 扩容阈值 缩容阈值 聚合窗口 冷却时间 步长
CPU 使用率 > 75% 持续 3 分钟 < 30% 持续 5 分钟 1 分钟平均值 扩容后 300s / 缩容后 600s +2 实例 / -1 实例
请求 QPS > 1000/s 持续 2 分钟 < 300/s 持续 5 分钟 1 分钟 P50 扩容后 180s / 缩容后 300s +50% 当前实例数
响应延迟 P99 > 500ms 持续 2 分钟 < 200ms 持续 5 分钟 1 分钟 P99 扩容后 120s / 缩容后 600s +3 实例 / -2 实例

4.3 基于预测的伸缩

基于预测的伸缩利用历史数据训练模型,提前预判未来负载变化,在负载到达之前完成资源准备。它解决了阈值伸缩“被动响应”的滞后问题。

预测伸缩的核心流程:

  1. 数据采集:收集至少 14 天以上的历史指标(QPS、CPU、连接数等),按小时/天粒度聚合。
  2. 模式识别:识别日周期、周周期、节假日等规律性模式。
  3. 模型训练:使用 ARIMA、Prophet、LSTM 等算法生成预测曲线。
  4. 策略生成:将预测结果转化为定时伸缩计划或动态调整基线。
  5. 反馈修正:对比实际负载与预测值,调整模型参数。
适用条件:预测伸缩最适合周期性明显的服务,例如:早高峰资讯类应用、晚高峰电商平台、月末结算系统。对于突发性流量(如热点事件),预测伸缩无法覆盖,需配合阈值或事件伸缩兜底。

下图展示预测伸缩与阈值伸缩的时序配合关系:

预测伸缩 vs 阈值伸缩 时序配合 00:00 06:00 12:00 18:00 24:00 实际负载 预测负载 扩容阈值 缩容阈值 提前扩容 预测伸缩在负载爬升前完成资源准备,避免阈值伸缩的滞后响应;实际负载偏离预测时,阈值伸缩作为安全兜底。

4.4 基于事件的伸缩

基于事件的伸缩响应特定业务事件或基础设施事件,通常用于处理不可预测的突发流量或计划内变更。事件来源包括:

  • 业务事件:秒杀活动开始、直播开播、大促流量预热、批量任务提交。
  • 基础设施事件:节点故障、AZ 故障、网络分区、自动恢复。
  • 运维事件:版本发布、配置变更、数据库迁移、计划内停机。
  • 外部事件:上游服务降级、下游限流、第三方 API 超时。

事件伸缩通常通过 Webhook 或 消息队列 触发,与 CI/CD 管道、监控告警系统、业务中台集成。典型实现方式:

# 事件伸缩 Webhook 示例(Kubernetes HPA + Prometheus Adapter)
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: event-driven-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: web-service
  minReplicas: 5
  maxReplicas: 50
  metrics:
  - type: Object
    object:
      metric:
        name: events_total
      describedObject:
        apiVersion: v1
        kind: Service
        name: event-bus
      target:
        type: Value
        value: "100"  # 每秒事件数超过 100 触发扩容
  behavior:
    scaleUp:
      stabilizationWindowSeconds: 0  # 事件伸缩不设冷却,立即响应
      policies:
      - type: Percent
        value: 200
        periodSeconds: 60
    scaleDown:
      stabilizationWindowSeconds: 300
      policies:
      - type: Pods
        value: 5
        periodSeconds: 60
最佳实践:事件伸缩应作为最高优先级的触发方式,覆盖阈值和预测无法处理的场景。建议为每个事件定义明确的伸缩预案,包括目标实例数、预热策略、优雅排空策略。事件结束后,通过冷却窗口逐步回缩,避免“脉冲式”伸缩。

4.5 三种触发方式的协同策略

在实际生产环境中,三种触发方式并非互斥,而是形成分层协同的伸缩体系:

触发方式 响应速度 适用场景 协同角色
基于事件 秒级 突发流量、计划内变更、故障转移 第一响应层,立即执行
基于阈值 分钟级 常规负载波动、无规律流量 持续监控层,兜底保障
基于预测 小时级(提前规划) 周期性负载、可预见的流量波峰 规划层,提前准备资源

推荐的分层策略:预测伸缩做长期规划,提前调整基线实例数;阈值伸缩做短期调整,应对预测偏差;事件伸缩做紧急响应,处理不可预测的突发。三层配合,才能实现 SLA 要求的“既不过度配置浪费成本,也不配置不足影响可用性”。