弹性伸缩基础:水平伸缩与垂直伸缩、弹性伸缩组(ASG)概念、伸缩策略(定时/动态/预测)
弹性伸缩是云原生架构下实现服务容量与负载自动匹配的核心能力。在质量门禁体系中,弹性伸缩不仅是发布后的健康验证目标,更是回滚决策的重要触发条件——当伸缩行为异常(如扩容失败、缩容过度)时,系统应自动阻断发布并执行回滚。本节从伸缩模式、核心组件与策略三个维度建立基础认知。
2.1 水平伸缩 vs 垂直伸缩
两种伸缩模式在资源维度、操作粒度与适用场景上存在本质差异。下表从关键维度进行对比:
| 对比维度 | 水平伸缩(Scale Out/In) | 垂直伸缩(Scale Up/Down) |
|---|---|---|
| 操作对象 | 增加/减少实例数量 | 调整单个实例的规格(CPU/内存) |
| 扩容上限 | 理论上无限(受配额与架构约束) | 受物理机/虚拟机最大规格限制 |
| 生效速度 | 分钟级(实例启动+注册) | 秒级至分钟级(热升级或重启) |
| 架构要求 | 无状态应用、分布式会话 | 单体应用或状态敏感服务 |
| 成本模型 | 线性增长,按需付费 | 跳跃式增长,规格越高单价越贵 |
| 回滚复杂度 | 低(直接终止实例) | 中高(需降配或重建实例) |
| 典型场景 | Web 服务、API 网关、微服务 | 数据库、缓存、批处理作业 |
质量门禁视角: 水平伸缩更适合发布期间的弹性验证,因为新增实例可以独立承载流量并接受健康检查;垂直伸缩在发布中容易引发单点故障,建议在非发布窗口执行。
下图展示了两种伸缩模式在资源池中的直观差异:
2.2 弹性伸缩组(ASG)核心概念
弹性伸缩组(Auto Scaling Group, ASG)是管理伸缩逻辑的抽象层,它封装了实例池、健康检查、扩缩容策略与生命周期钩子。在质量门禁中,ASG 是发布验证的直接作用对象。
一个标准的 ASG 包含以下核心组件:
- 启动配置/启动模板: 定义实例的 AMI、实例类型、安全组、密钥对等基础属性。
- 期望容量(Desired Capacity): ASG 当前期望维持的实例数量,是伸缩控制的目标值。
- 最小/最大容量: 伸缩边界,防止无限扩容或缩容至零。
- 健康检查类型: 支持 EC2 状态检查与 ELB 健康检查,后者更贴近应用级可用性。
- 生命周期钩子(Lifecycle Hook): 在实例启动/终止时暂停流程,允许执行自定义操作(如预热、日志采集)。
- 伸缩策略: 决定何时以及如何调整容量,详见 2.3 节。
质量门禁关键指标: 发布过程中应实时监控 ASG 的
GroupInServiceInstances 与 GroupPendingInstances 指标。若 Pending 实例超过阈值且持续时间过长,说明新版本实例无法正常注册,应触发回滚。
下图展示了 ASG 的内部组件关系与实例生命周期:
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 预测伸缩
预测伸缩利用机器学习模型分析历史负载数据,提前预调度实例容量。它特别适合具有明显周期性的业务,如电商平台的日间高峰与夜间低谷。
预测伸缩的工作流程:
- 数据收集: 采集过去 14 天以上的负载指标(CPU、请求数、连接数)。
- 模型训练: 系统自动识别每日/每周的负载模式,生成预测模型。
- 容量规划: 根据预测结果,在负载上升前提前扩容,在负载下降前提前缩容。
- 动态修正: 预测结果与实际负载偏差较大时,动态伸缩策略会进行实时修正。
质量门禁建议: 预测伸缩在发布新版本后需要重新评估模型准确性。建议在发布验证阶段增加一项检查:对比预测容量与实际容量的偏差率,若偏差超过 20% 则视为异常,触发回滚。
三种策略并非互斥,实际生产环境中通常组合使用:
- 以预测伸缩作为基线,提前准备容量;
- 以动态伸缩应对突发流量,实时修正;
- 以定时伸缩处理已知的固定事件(如数据备份、定时任务)。
下图展示了三种策略在一天内的协同工作模式:
2.4 质量门禁中的伸缩验证要点
在发布流程中,弹性伸缩的健康验证应覆盖以下检查点:
- 伸缩组状态检查: 发布期间 ASG 的
HealthStatus是否为Healthy,是否有实例处于Unhealthy状态。 - 容量一致性检查: 实际运行实例数是否等于期望容量,偏差超过 1 台即视为异常。
- 伸缩策略生效检查: 模拟触发条件(如 CPU 压测),验证策略是否按预期执行扩容/缩容。
- 生命周期钩子检查: 钩子是否超时或失败,导致实例卡在
Pending:Wait状态。 - 跨可用区分布检查: 伸缩后的实例是否均匀分布在多个可用区,避免单点故障。
回滚决策触发条件: 若上述任意检查点连续失败 3 次(或超过 5 分钟未恢复),质量门禁应自动阻断发布并触发回滚。回滚操作包括:将 ASG 的期望容量恢复至发布前值,并终止所有新版本实例。