华为云 ECS 弹性伸缩实战:构建高可用自动扩缩容架构
摘要
本文深入讲解华为云 ECS 弹性伸缩(Auto Scaling)的核心原理与生产级实践,涵盖伸缩组配置、告警策略设计、多可用区部署、冷却时间调优等关键内容,帮助读者从零构建一套可应对流量波动的自动扩缩容架构。
一、为什么你需要弹性伸缩
业务流量从来不是一条直线。电商大促、新版本发布、定时批处理、突发舆情事件——每一次波动都可能让你的服务器集群措手不及。
传统应对方式只有两种:
- 按峰值预留:资源长期闲置,成本居高不下。
- 人工手动扩容:响应滞后,业务可能已经受损。
华为云 ECS 弹性伸缩(Auto Scaling)正是为解决这一矛盾而生:根据预设策略自动增加或减少 ECS 实例,在流量低谷时释放资源以节省成本,在流量高峰时快速扩容以保障业务连续性。
二、核心概念:先搞懂这些再动手
在动手配置之前,必须理解弹性伸缩的几个核心组件:
2.1 伸缩组(Scaling Group)
伸缩组是弹性伸缩的基本管理单元。它定义了一组具有相同配置的 ECS 实例集合,包括:
- 期望实例数:伸缩组希望维持的实例数量,这是伸缩组的"目标态"。
- 最小实例数:无论负载多低,伸缩组不会缩减到这个数量以下,保障业务基线容量。
- 最大实例数:无论负载多高,伸缩组不会超过这个数量,防止成本失控。
- 移出策略:当需要缩减时,优先移出哪台实例(最早创建的、健康检查失败的等)。
2.2 伸缩策略(Scaling Policy)
伸缩策略决定了"何时扩"和"何时缩"。华为云提供三种策略类型:
| 策略类型 | 触发方式 | 适用场景 |
|---|---|---|
| 告警策略 | 云监控指标(CPU、内存、网络等)达到阈值 | 应对不可预知的流量波动 |
| 定时策略 | 固定时间点触发 | 已知流量规律(如每日高峰) |
| 周期策略 | 按周期重复触发 | 每日/每周固定规律性业务 |
2.3 冷却时间(Cooldown)
冷却时间是弹性伸缩中最容易被忽视、却最关键的参数。它表示一次伸缩活动结束后,在多长时间内不再接受新的伸缩触发。
为什么需要冷却?
假设 CPU 使用率刚超过 80%,触发扩容。新实例启动需要 1-2 分钟,在这期间 CPU 可能继续攀升。如果冷却时间过短,系统可能在实例尚未就绪时再次触发扩容,造成"震荡"——实例数反复横跳,既浪费资源又影响稳定性。
推荐值:
- 告警策略冷却时间:180 秒(3 分钟)
- 定时/周期策略:无需冷却(按计划执行)
2.4 健康检查
弹性伸缩会定期对组内实例进行健康检查。不健康的实例会被自动替换。这保证了伸缩组内始终是"可用"的实例,而非仅仅"存在"的实例。
三、架构设计:生产级伸缩组怎么搭
3.1 多可用区部署
生产环境绝不能只部署在一个可用区。华为云伸缩组支持跨可用区(AZ)部署,当某个可用区出现故障时,流量自动切换到其他可用区,实例也会在其他可用区补充创建。
配置建议:
- 选择至少 2 个可用区,优先选择同区域内的不同物理 AZ。
- 设置可用区优先级,将主业务 AZ 放在前面。
- 开启"均衡分布"策略,确保实例在各可用区均匀分布。
3.2 实例配置模板
弹性伸缩创建的实例基于"实例启动模板",而非直接引用某台 ECS。模板中应包含:
- 镜像(推荐使用自定义镜像,预装业务依赖)
- 实例规格(建议选择 2-3 种规格,扩容时按优先级尝试,避免单一规格库存不足)
- 安全组
- 登录密钥对
- 用户数据(User Data,用于初始化脚本)
关键提醒:自定义镜像必须经过充分测试。伸缩组创建实例时不会执行你手工配置的那套流程,一切依赖镜像和 User Data。
3.3 网络与负载均衡集成
伸缩组应与 ELB(弹性负载均衡)绑定。新创建的实例自动挂载到 ELB 后端服务器组,无需手动操作。
配置要点:
- 在伸缩组中关联 ELB 的后端服务器组。
- 配置健康检查端口与路径,确保 ELB 能正确判断实例健康状态。
- 设置"加权轮询"或"最小连接数"调度算法,让流量合理分配。
四、实战配置:从零搭建一套伸缩组
4.1 创建实例启动模板
- 进入 ECS 控制台,选择"实例启动模板"。
- 点击"创建模板",填写模板名称。
- 选择已测试通过的自定义镜像。
- 实例规格选择:推荐配置 2-3 种备选规格(如 s6.large.2、sn3.large.2),按优先级排列。
- 安全组选择业务安全组,开放必要端口。
- 密钥对选择已有的 SSH 密钥。
- User Data 中写入初始化脚本(如安装依赖、拉取配置、启动服务)。
4.2 创建伸缩组
- 进入弹性伸缩控制台,点击"创建伸缩组"。
- 填写伸缩组名称。
- 选择刚创建的实例启动模板。
- 选择网络(VPC)和至少 2 个可用区。
- 设置实例数:
- 最小实例数:2(保障基线容量)
- 期望实例数:2(初始状态)
- 最大实例数:20(防止成本失控)
- 关联 ELB 后端服务器组。
- 设置移除策略:默认"最早创建的实例"。
- 开启健康检查,间隔 60 秒,连续 3 次失败判定不健康。
4.3 配置伸缩策略
扩容策略(告警策略):
- 指标:CPU 平均使用率
- 阈值:> 75%
- 统计周期:连续 3 个周期,每个周期 60 秒
- 冷却时间:180 秒
- 伸缩动作:增加 2 台实例
缩容策略(告警策略):
- 指标:CPU 平均使用率
- 阈值:< 30%
- 统计周期:连续 5 个周期,每个周期 60 秒(缩容条件更严格,避免频繁震荡)
- 冷却时间:300 秒
- 伸缩动作:减少 1 台实例
定时策略(可选):
- 如果业务有明确的每日高峰(如 10:00-12:00),可配置定时扩容 3 台实例。
- 高峰结束后配置定时缩容。
4.4 验证伸缩效果
- 在伸缩组中手动添加 1 台实例,确认 ELB 能正常挂载。
- 模拟高负载(使用压测工具或手动提升 CPU),观察是否触发扩容。
- 扩容后确认新实例能正常接收流量(ELB 后端状态为"健康")。
- 负载下降后,观察缩容是否按预期执行。
- 检查伸缩活动日志,确认无异常。
五、生产级调优建议
5.1 避免"震荡"的进阶策略
震荡是弹性伸缩最常见的问题。除了设置合理的冷却时间,还可以:
- 分层阈值:扩容阈值 75%,缩容阈值 30%,留出 45% 的缓冲带,避免在临界值附近反复触发。
- 阶梯式扩容:首次扩容 2 台,若 CPU 仍高,等待一个冷却周期后再扩容 2 台,而不是一次性扩容 10 台。
- 缩容保守:缩容动作的触发条件应比扩容更严格(更多周期、更低阈值),宁可多留几台,也不要过早释放。
5.2 实例规格的库存风险
华为云不同规格的实例在各可用区的库存是动态的。如果伸缩组只配置了一种规格,当该规格库存不足时,扩容会失败。
解决方案:
- 在启动模板中配置 2-3 种兼容规格,按优先级排列。
- 扩容时伸缩组会按优先级尝试,直到找到有库存的规格。
- 定期监控伸缩活动日志,关注"规格库存不足"的告警。
5.3 镜像与初始化的一致性
伸缩组创建的实例必须与手工创建的实例行为一致。这要求:
- 自定义镜像中预装所有业务依赖(JDK、Python、Node.js 等)。
- 配置文件从配置中心(如 Nacos、Consul)拉取,而非硬编码在镜像中。
- 日志统一输出到 LTS(日志服务),而非本地文件。
- 应用启动脚本在 User Data 中实现,确保每次初始化行为一致。
5.4 成本控制
弹性伸缩虽然智能,但仍有成本失控的风险:
- 设置最大实例数上限:根据业务峰值预算,设置合理的最大实例数。
- 配置费用告警:在云监控中设置费用阈值,当伸缩产生的费用接近预算时告警。
- 使用竞价实例:对于可中断的批处理任务,优先使用竞价实例,成本可降低 50%-90%。
- 定期清理闲置伸缩组:业务下线后及时删除伸缩组,避免残留资源继续计费。
5.5 监控与告警
弹性伸缩本身也需要被监控:
| 监控指标 | 告警阈值 | 说明 |
|---|---|---|
| 伸缩组实例数 | 持续等于最大值 | 可能已达容量上限,需关注 |
| 伸缩活动失败次数 | 1 次/5 分钟 | 规格库存不足或模板配置错误 |
| 健康检查失败率 | > 10% | 实例或应用存在问题 |
| 冷却时间内频繁触发 | 连续 3 次 | 阈值设置不合理,存在震荡风险 |
六、常见问题与避坑指南
Q1:扩容后新实例 ELB 健康检查失败?
原因:新实例启动后应用尚未完全启动,ELB 健康检查就已开始。
解决:
- 在 ELB 健康检查中增加"健康检查延迟"(如 60 秒)。
- 在 User Data 中确保应用完全启动后再退出脚本。
- 应用自身实现健康检查接口(如 /health),ELB 配置该路径。
Q2:缩容时误删了重要实例?
原因:移出策略配置不当,或实例没有设置"缩容保护"。
解决:
- 对需要保留的实例开启"实例缩容保护"。
- 移出策略选择"最早创建的实例",而非"随机"。
- 缩容前确认实例上无重要会话或任务。
Q3:伸缩组实例数一直达不到期望值?
原因:可能是最大实例数限制、规格库存不足、或子网 IP 耗尽。
解决:
- 查看伸缩活动日志,定位具体失败原因。
- 检查子网可用 IP 数量。
- 增加备选规格。
Q4:定时策略和告警策略冲突怎么办?
原因:定时策略在高峰前扩容,告警策略在高峰中继续扩容,导致实例数超出预期。
解决:
- 定时策略与告警策略的伸缩方向应一致(高峰期只扩容不缩容)。
- 在定时策略的"执行时间"段内,降低告警策略的扩容阈值,避免叠加。
- 或干脆在高峰时段禁用告警策略,完全依赖定时策略。
七、总结
ECS 弹性伸缩不是"开箱即用"的功能,而是一套需要精心设计的架构体系。核心要点回顾:
- 伸缩组是基础:合理设置最小、期望、最大实例数,绑定 ELB 实现流量自动分发。
- 策略是大脑:告警策略应对突发,定时策略应对规律,两者配合使用。
- 冷却时间是安全阀:防止震荡,保障扩容实例有足够时间启动并生效。
- 多可用区是底线:单 AZ 部署在云上等于没有容灾。
- 镜像与初始化是根基:伸缩出来的实例必须和手工实例行为一致。
- 监控与成本是保障:弹性不是无限制,设置上限和告警,避免成本失控。
弹性伸缩的终极目标不是"自动",而是"恰到好处"——在正确的时间,有正确数量的正确实例,以正确的成本运行。这需要持续的调优与迭代,而非一次性配置。
本文由华为云社区发布,欢迎转载分享,请注明出处。
- 点赞
- 收藏
- 关注作者
评论(0)