弹性伸缩基础:水平伸缩与垂直伸缩、弹性伸缩组(ASG)概念、伸缩策略(定时/动态/预测)

弹性伸缩是云原生架构下实现服务容量与负载自动匹配的核心能力。在质量门禁体系中,弹性伸缩不仅是发布后的健康验证目标,更是回滚决策的重要触发条件——当伸缩行为异常(如扩容失败、缩容过度)时,系统应自动阻断发布并执行回滚。本节从伸缩模式、核心组件与策略三个维度建立基础认知。

2.1 水平伸缩 vs 垂直伸缩

两种伸缩模式在资源维度、操作粒度与适用场景上存在本质差异。下表从关键维度进行对比:

对比维度 水平伸缩(Scale Out/In) 垂直伸缩(Scale Up/Down)
操作对象 增加/减少实例数量 调整单个实例的规格(CPU/内存)
扩容上限 理论上无限(受配额与架构约束) 受物理机/虚拟机最大规格限制
生效速度 分钟级(实例启动+注册) 秒级至分钟级(热升级或重启)
架构要求 无状态应用、分布式会话 单体应用或状态敏感服务
成本模型 线性增长,按需付费 跳跃式增长,规格越高单价越贵
回滚复杂度 低(直接终止实例) 中高(需降配或重建实例)
典型场景 Web 服务、API 网关、微服务 数据库、缓存、批处理作业
质量门禁视角: 水平伸缩更适合发布期间的弹性验证,因为新增实例可以独立承载流量并接受健康检查;垂直伸缩在发布中容易引发单点故障,建议在非发布窗口执行。

下图展示了两种伸缩模式在资源池中的直观差异:

水平伸缩与垂直伸缩对比示意图 水平伸缩 vs 垂直伸缩 水平伸缩(Scale Out/In) 实例 A 实例 B 实例 C 新增实例 新增实例 垂直伸缩(Scale Up/Down) 原始规格 2C4G 升级后规格 8C32G 垂直伸缩受物理上限约束 且通常需要重启或迁移

2.2 弹性伸缩组(ASG)核心概念

弹性伸缩组(Auto Scaling Group, ASG)是管理伸缩逻辑的抽象层,它封装了实例池、健康检查、扩缩容策略与生命周期钩子。在质量门禁中,ASG 是发布验证的直接作用对象。

一个标准的 ASG 包含以下核心组件:

  • 启动配置/启动模板: 定义实例的 AMI、实例类型、安全组、密钥对等基础属性。
  • 期望容量(Desired Capacity): ASG 当前期望维持的实例数量,是伸缩控制的目标值。
  • 最小/最大容量: 伸缩边界,防止无限扩容或缩容至零。
  • 健康检查类型: 支持 EC2 状态检查与 ELB 健康检查,后者更贴近应用级可用性。
  • 生命周期钩子(Lifecycle Hook): 在实例启动/终止时暂停流程,允许执行自定义操作(如预热、日志采集)。
  • 伸缩策略: 决定何时以及如何调整容量,详见 2.3 节。
质量门禁关键指标: 发布过程中应实时监控 ASG 的 GroupInServiceInstances 与 GroupPendingInstances 指标。若 Pending 实例超过阈值且持续时间过长,说明新版本实例无法正常注册,应触发回滚。

下图展示了 ASG 的内部组件关系与实例生命周期:

弹性伸缩组(ASG)架构图 弹性伸缩组(ASG)核心架构 Auto Scaling Group (ASG) 启动配置/模板 AMI · 实例类型 · 安全组 期望容量 Desired = 3 边界控制 Min=1 · Max=10 健康检查 EC2 / ELB 实例池(Instance Pool) InService InService InService Pending Terminating 生命周期钩子(Lifecycle Hook) 实例启动前预热 · 实例终止前日志转储 · 自定义健康检查

2.3 伸缩策略:定时、动态与预测

伸缩策略决定了 ASG 何时以及如何调整容量。在质量门禁中,策略的合理配置直接影响发布期间的稳定性。三种策略的对比与适用场景如下:

策略类型 触发方式 响应速度 适用场景 质量门禁关注点
定时伸缩 基于 Cron 表达式或固定时间点 准时触发 可预测的流量高峰(如每日 10:00 促销) 发布期间应暂停定时策略,避免与滚动更新冲突
动态伸缩 基于 CloudWatch 指标阈值(CPU > 70%) 分钟级(指标采集+策略评估) 突发流量、不可预测的负载变化 验证新版本实例的指标是否正常上报,防止指标异常导致误扩缩
预测伸缩 基于历史负载的机器学习模型 提前预调度 周期性明显的业务(如工作日/周末差异) 预测模型需要持续训练,发布新版本后应重新校准预测基线

2.3.1 定时伸缩

定时伸缩适用于业务负载模式已知且稳定的场景。配置时需指定生效时间、期望容量以及重复周期。

# 定时伸缩配置示例(AWS CLI 风格)
aws autoscaling put-scheduled-update-group-action \
  --auto-scaling-group-name "prod-web-asg" \
  --scheduled-action-name "scale-up-morning" \
  --recurrence "0 9 * * 1-5" \
  --desired-capacity 10 \
  --min-size 5 \
  --max-size 20
发布期间避坑: 定时伸缩可能与滚动更新同时触发,导致实例数量在更新过程中突然变化。建议在发布窗口内临时禁用定时策略,或使用 暂停流程 功能。

2.3.2 动态伸缩

动态伸缩是最常用的策略,通常基于目标跟踪(Target Tracking)或步进调整(Step Scaling)实现。目标跟踪策略只需指定一个目标指标值(如 CPU 维持在 50%),ASG 会自动计算扩缩容步长。

# 目标跟踪伸缩策略示例(AWS CLI)
aws autoscaling put-scaling-policy \
  --auto-scaling-group-name "prod-web-asg" \
  --policy-name "cpu-target-tracking" \
  --policy-type "TargetTrackingScaling" \
  --target-tracking-configuration '{
    "TargetValue": 50.0,
    "PredefinedMetricSpecification": {
      "PredefinedMetricType": "ASGAverageCPUUtilization"
    }
  }'

动态伸缩的关键参数包括:

  • 冷却时间(Cooldown): 一次伸缩动作完成后,等待多久才能再次触发。默认 300 秒,发布期间建议适当延长。
  • 实例预热时间(Warmup): 新实例启动后,等待多久才开始采集指标。避免实例刚启动时 CPU 飙高导致连续扩容。
  • 步进调整: 根据指标偏离程度设置不同的扩容步长,例如 CPU > 80% 时扩容 2 台,CPU > 90% 时扩容 5 台。

2.3.3 预测伸缩

预测伸缩利用机器学习模型分析历史负载数据,提前预调度实例容量。它特别适合具有明显周期性的业务,如电商平台的日间高峰与夜间低谷。

预测伸缩的工作流程:

  1. 数据收集: 采集过去 14 天以上的负载指标(CPU、请求数、连接数)。
  2. 模型训练: 系统自动识别每日/每周的负载模式,生成预测模型。
  3. 容量规划: 根据预测结果,在负载上升前提前扩容,在负载下降前提前缩容。
  4. 动态修正: 预测结果与实际负载偏差较大时,动态伸缩策略会进行实时修正。
质量门禁建议: 预测伸缩在发布新版本后需要重新评估模型准确性。建议在发布验证阶段增加一项检查:对比预测容量与实际容量的偏差率,若偏差超过 20% 则视为异常,触发回滚。

三种策略并非互斥,实际生产环境中通常组合使用:

  • 以预测伸缩作为基线,提前准备容量;
  • 以动态伸缩应对突发流量,实时修正;
  • 以定时伸缩处理已知的固定事件(如数据备份、定时任务)。

下图展示了三种策略在一天内的协同工作模式:

三种伸缩策略协同工作示意图 伸缩策略协同工作模式(24 小时) 00:00 06:00 12:00 18:00 24:00 预测伸缩(基线容量) 基于历史数据预调度,容量曲线平滑变化 动态伸缩修正 定时扩容 实际容量 预测基线 实际容量 动态修正 定时触发

2.4 质量门禁中的伸缩验证要点

在发布流程中,弹性伸缩的健康验证应覆盖以下检查点:

  1. 伸缩组状态检查: 发布期间 ASG 的 HealthStatus 是否为 Healthy,是否有实例处于 Unhealthy 状态。
  2. 容量一致性检查: 实际运行实例数是否等于期望容量,偏差超过 1 台即视为异常。
  3. 伸缩策略生效检查: 模拟触发条件(如 CPU 压测),验证策略是否按预期执行扩容/缩容。
  4. 生命周期钩子检查: 钩子是否超时或失败,导致实例卡在 Pending:Wait 状态。
  5. 跨可用区分布检查: 伸缩后的实例是否均匀分布在多个可用区,避免单点故障。
回滚决策触发条件: 若上述任意检查点连续失败 3 次(或超过 5 分钟未恢复),质量门禁应自动阻断发布并触发回滚。回滚操作包括:将 ASG 的期望容量恢复至发布前值,并终止所有新版本实例。