4、弹性伸缩基础:什么是弹性伸缩、弹性伸缩的触发条件、伸缩策略(定时、指标、混合)
各位同学,咱们今天聊聊弹性伸缩。说实话,这个词在云原生时代已经被说烂了,但真正用好的团队其实不多。我见过太多人把弹性伸缩简单理解成「CPU 高了就加机器」,结果线上出了大问题。
弹性伸缩,说白了就是让系统像橡皮筋一样——流量大了自动拉长(扩容),流量小了自动缩回(缩容)。核心目标就一个:用最少的资源,扛住最大的流量。你想想看,如果双十一凌晨三点还在跑 100 台机器,那得浪费多少钱?
4.1 什么是弹性伸缩
先给个定义:弹性伸缩(Auto Scaling)是一种根据业务负载自动调整计算资源数量的机制。它包含两个动作——Scale Out(水平扩容)和Scale In(水平缩容)。
我个人习惯把弹性伸缩分成三个层次:
- 实例级伸缩:增减虚拟机或容器实例。这是最常用的,比如 K8s 的 HPA(Horizontal Pod Autoscaler)。
- 集群级伸缩:增减整个集群的节点。比如 AWS 的 Auto Scaling Group,或者 K8s 的 Cluster Autoscaler。
- 架构级伸缩:结合服务拆分、数据库读写分离、缓存策略等,从架构层面实现弹性。这个层次最高,也最难。
核心要点:弹性伸缩不是万能的。如果你的应用启动需要 10 分钟,那面对突发流量基本来不及。所以,弹性伸缩的前提是「快速启动」——镜像要小、依赖要少、启动脚本要优化。
我在项目中遇到过一家电商公司,他们每次扩容都要等 5 分钟才能拉起新实例。结果双十一流量峰值只持续了 3 分钟,等机器起来,流量已经过去了。这就是典型的「伸缩滞后」问题。
4.2 弹性伸缩的触发条件
触发条件,就是「什么时候该伸缩」。我把它分成三类:
4.2.1 基于时间
说白了就是「到点就干」。比如每天早上 9 点上班高峰,提前 10 分钟扩容;晚上 11 点后流量下降,自动缩容。这种方式最稳定,也最容易被忽视。
4.2.2 基于指标
这是最常见的。监控系统采集 CPU、内存、QPS、响应时间等指标,当指标超过阈值时触发伸缩。举个例子:
# 假设我们设置了一个伸缩规则
触发条件:CPU 使用率 > 70% 持续 3 分钟
动作:扩容 2 个实例
冷却时间:5 分钟(防止频繁伸缩)
嗯,这里要注意:指标的选择很关键。我见过有人只盯着 CPU,结果内存爆了也不管。建议至少监控 2-3 个核心指标,比如 CPU + 内存 + QPS。
4.2.3 基于预测
这个比较高级。通过历史数据预测未来的流量趋势,提前进行伸缩。比如用机器学习模型分析过去 30 天的流量模式,预测明天下午 3 点会有一次流量高峰,提前 15 分钟扩容。
我的经验:预测伸缩听起来很酷,但实际落地时准确率很难保证。我建议先用「定时 + 指标」的组合,等数据积累够了再上预测。别一上来就搞花活。
4.3 伸缩策略
策略就是「怎么伸缩」。我重点讲三种:定时策略、指标策略、混合策略。
4.3.1 定时策略
适合业务流量有固定规律的场景。比如:
| 时间段 | 动作 | 说明 |
|---|---|---|
| 08:50 | 扩容 5 台 | 准备迎接早高峰 |
| 12:00 | 缩容 3 台 | 午休时间流量下降 |
| 18:00 | 扩容 5 台 | 晚高峰来临 |
| 23:00 | 缩容 8 台 | 夜间低负载 |
定时策略的好处是「确定性高」,不会因为指标抖动而误触发。但缺点也很明显——无法应对突发流量。比如突然有个热搜,流量瞬间暴涨,定时策略就抓瞎了。
4.3.2 指标策略
这是弹性伸缩的核心。常见的指标包括:
- CPU 使用率:最基础,但容易受 IO 等待影响
- 内存使用率:适合内存密集型应用
- QPS(每秒请求数):直接反映业务压力
- 响应时间:用户体验的关键指标
- 连接数:适合数据库、缓存等中间件
我曾经踩过一个坑:只用了 CPU 作为伸缩指标,结果有一次数据库连接池满了,CPU 才 30%,系统却已经快挂了。后来我加了「连接数」和「响应时间」两个指标,情况才好转。
避坑指南:指标策略一定要设置「冷却时间」。我曾经见过一个系统,因为指标抖动太频繁,10 分钟内伸缩了 20 次,最后把数据库打崩了。冷却时间建议至少 3-5 分钟。
4.3.3 混合策略
说白了就是把定时和指标结合起来。比如:
策略示例:
1. 定时:每天 09:00 扩容到 10 台(基础保障)
2. 指标:如果 CPU > 70% 持续 3 分钟,再扩容 5 台(应对突发)
3. 定时:每天 23:00 缩容到 3 台(节省成本)
4. 指标:如果 CPU < 20% 持续 10 分钟,缩容到 5 台(避免过度预留)
混合策略的好处是「既有保障,又有弹性」。定时策略保证基础容量,指标策略应对突发流量。我个人强烈推荐这种方式,大部分生产环境都适用。
4.4 知识体系图
下面这张图总结了弹性伸缩的核心逻辑,我画出来方便大家理解:
4.5 实战建议
最后,我给大家几个实战中的建议:
- 从小规模开始:别一上来就搞全自动伸缩。先手动观察一段时间,摸清流量规律。
- 设置上下限:不管什么策略,都要设置最小实例数和最大实例数。防止缩容到 0 导致服务不可用,也防止扩容太多把预算打爆。
- 做好监控告警:伸缩动作本身也要监控。我见过一个案例,伸缩策略配置错了,一夜之间扩了 200 台机器,第二天收到账单直接傻眼。
- 灰度验证:新策略先在测试环境跑一周,确认没问题再上生产。
一个小技巧:如果你用的是 K8s,建议把 HPA 和 Cluster Autoscaler 配合使用。HPA 负责 Pod 级别的伸缩,Cluster Autoscaler 负责节点级别的伸缩。这样既能快速响应,又能节省成本。
好了,弹性伸缩的基础就讲到这里。记住一句话:伸缩不是目的,稳定才是。别为了炫技而伸缩,一切以业务稳定为前提。
公众号:蓝海资料掘金营,微信deep3321