快速结论
- 核心价值:高峰自动扩容不宕机,低谷自动缩容省成本
- 触发方式:基于监控指标(CPU/内存)或定时计划
- 必备前提:应用必须是无状态的,才能安全地水平扩展
- 成本节省:合理配置弹性伸缩,通常节省30-50%的服务器费用
弹性伸缩解决什么问题?
场景一:电商促销
- 平时:100台服务器
- 618/双十一:流量100倍,需要1000台服务器
- 弹性伸缩:自动在30分钟内扩容到1000台,活动结束后自动缩回
场景二:视频网站
- 白天:流量低,20台服务器
- 晚上8-11点:流量高峰,需要100台
- 弹性伸缩:定时在18:00扩容,23:00缩容
传统方案的问题:
- 按峰值配置:高峰保住,低谷浪费(通常浪费60-70%)
- 按均值配置:高峰宕机,影响用户体验和营收
弹性伸缩的解法: 随需扩展,按量付费,鱼和熊掌兼得。
弹性伸缩的前提:无状态应用
弹性伸缩的本质是水平扩展(增加服务器数量),前提是:
✅ 适合弹性伸缩:
- Web服务器/API服务器
- 批处理Worker
- 无状态微服务
❌ 不适合弹性伸缩:
- 数据库(需要数据同步,扩展复杂)
- 有状态的缓存(Redis集群扩展需要数据迁移)
- 需要本地磁盘存储的应用
使应用无状态的关键改造:
- Session存储从本地内存迁移到Redis
- 文件上传存储到对象存储(OSS/COS),而非本地磁盘
- 日志输出到ELK或云日志服务,而非本地文件
阿里云弹性伸缩(ESS)配置详解
核心概念
- 伸缩组(Scaling Group):一组可弹性伸缩的ECS实例集合
- 伸缩配置(Scaling Configuration):新实例的规格模板(实例类型、系统盘、镜像)
- 伸缩规则(Scaling Rule):定义如何扩/缩容(增加N台、调整到N台、百分比增减)
- 触发任务(Scheduled Task / Cloud Monitor Alarm):何时执行伸缩规则
第一步:创建伸缩组
控制台路径:弹性伸缩 → 伸缩组 → 创建
配置:
- 伸缩组名称:webapp-scaling-group
- 组内最小实例数:2(保障最低可用性)
- 组内最大实例数:20(控制成本上限)
- 默认冷却时间:300秒(防止频繁扩缩)
- 关联负载均衡:SLB实例ID(新实例自动加入)
- 关联数据库白名单:RDS白名单分组(新实例IP自动加入)第二步:创建伸缩配置(实例模板)
实例规格:ecs.c6.xlarge(4核8G)
系统镜像:自定义镜像(已安装应用的基础镜像)
系统盘:高效云盘 40GB
安全组:web-sg(已配置80/443入站规则)
用户数据(启动脚本):
#!/bin/bash
systemctl start nginx
systemctl start myapp
# 注册到服务发现
curl -X PUT http://consul:8500/v1/agent/service/register -d '...'第三步:创建伸缩规则
扩容规则:
- 规则名称:scale-out-by-2
- 执行方式:增加2台ECS
- 最小调整量:1
缩容规则:
- 规则名称:scale-in-by-1
- 执行方式:减少1台ECS
- 最小调整量:1第四步:创建触发条件
基于CPU的自动伸缩:
告警触发(扩容):
- 指标:CPU平均使用率
- 条件:>70%
- 持续:3个统计周期(每周期1分钟)
- 执行:scale-out-by-2
告警触发(缩容):
- 指标:CPU平均使用率
- 条件:<30%
- 持续:5个统计周期
- 执行:scale-in-by-1定时任务(双十一预扩容):
定时任务一:
- 名称:pre-618-scale-out
- 执行时间:2026-06-17 20:00:00
- 执行规则:调整到50台(提前扩容)
定时任务二:
- 名称:post-618-scale-in
- 执行时间:2026-06-19 00:00:00
- 执行规则:调整到10台(活动结束缩容)腾讯云弹性伸缩(AS)配置
腾讯云AS与阿里云ESS功能类似,配置逻辑相同,这里重点介绍差异点:
混合模式:Spot实例 + 按需实例
腾讯云AS支持在伸缩组中混用Spot实例(竞价实例)和按需实例:
伸缩组配置:
- 基础保障:2台按需实例(保证最低可用)
- 弹性扩容:优先使用Spot实例(节省60-80%费用)
- Spot被回收时:自动补充按需实例这个功能可以在不影响可用性的前提下,大幅降低扩容成本。
弹性伸缩优化技巧
1. 缩短实例启动时间
新实例启动时间决定扩容响应速度,目标:5分钟内完成扩容
优化手段:
- 使用预先安装好应用的自定义镜像(比脚本安装快3-5分钟)
- 使用实例预热功能:实例启动后等待N分钟再加入负载均衡
- 将依赖文件打包进镜像,减少启动时的下载
# 制作包含应用的自定义镜像
# 在已安装好应用的实例上执行
aliyun ecs CreateImage \
--InstanceId i-xxxxxxxx \
--ImageName "webapp-v1.0-20260326" \
--Description "包含Nginx+Node.js应用的基础镜像"2. 合理设置冷却期
冷却期(Cooldown Period):一次伸缩操作完成后,等待一段时间再评估下一次伸缩。
过短冷却期 -> 频繁扩缩,实例来不及初始化 过长冷却期 -> 响应迟钝,高峰来了来不及扩容
建议配置:
- 扩容冷却期:120-300秒(根据实例启动时间)
- 缩容冷却期:600-1800秒(保守一些,避免频繁缩容)
3. 生命周期钩子(Instance Lifecycle Hooks)
在实例加入/退出伸缩组时执行自定义操作:
实例加入时(LAUNCHING):
- 注册到服务发现(Consul/Eureka)
- 预热本地缓存
- 数据库连接池初始化
实例退出时(TERMINATING):
- 从服务发现注销
- 等待正在处理的请求完成(Graceful Shutdown)
- 清理临时文件
# 生命周期脚本示例
#!/bin/bash
# 实例退出前的优雅关闭
# 从负载均衡摘除(此时ESS已处理)
# 等待现有连接处理完毕
sleep 30
# 通知服务发现
curl -X PUT "http://consul:8500/v1/agent/service/deregister/myapp-$(hostname)"
# 完成生命周期动作,允许实例被终止
HOOK_TOKEN=$1
aliyun ess CompleteLifecycleAction \
--LifecycleHookId $HOOK_ID \
--LifecycleActionToken $HOOK_TOKEN \
--LifecycleActionResult CONTINUE成本估算:弹性伸缩节省了多少钱?
案例:某电商网站
| 方案 | 常规 | 高峰(一年20天) | 年费用 |
|---|---|---|---|
| 固定20台 | 20台×200元=4000/月 | 够用 | 48000元 |
| 固定50台 | 50台×200元=10000/月 | 高峰保障 | 120000元 |
| 弹性伸缩 | 5台×200元=1000/月 | 自动扩到50台 | 约22000元 |
弹性伸缩节省:48000-22000 = 26000元/年(54%)
说明:弹性伸缩的前提是按量付费,而按量单价通常是包年价的 3-4 倍——高峰期短时扩容划算,常态负载还是包年更省。扩容实例选什么规格、按量还是包月竞价,可以先用云服务器比价看各档活动价,已上线资源的浪费排查用成本优化顾问自查。
推荐方案
流量平稳的网站:不需要弹性伸缩,固定配置即可
流量有规律波动(白天高、晚上低):定时伸缩,按时间表扩缩容
流量不规律(电商活动、内容爆发):阿里云ESS + 基于监控的动态伸缩
极致降本:腾讯云AS + Spot实例混合模式,节省60-80%扩容成本
延伸阅读
- 云服务器选购避坑指南 2026:扩容前先了解配置选型与续费价规则
- 阿里云、腾讯云、华为云服务器对比 2026:跨平台选型与产品线对比
- 比价雷达:扩容实例的当前活动价台账
- 成本优化顾问:上线后的资源浪费在线自查
更新时间:2026年10月20日。云厂商控制台界面可能调整,配置路径以官方文档为准。
弹性伸缩是云计算的精髓,善用它,你的架构就真正"活"了起来。