弹性伸缩基础:核心概念与触发机制
在平台工程与 SRE 实践中,弹性伸缩(Auto Scaling)是保障服务稳定性、控制成本的核心能力。它允许系统根据实时负载自动调整资源数量,避免过度配置或资源不足。本章将深入剖析弹性伸缩的定义、水平与垂直伸缩的差异,以及常见的触发指标。
什么是弹性伸缩
弹性伸缩是指系统能够根据预设策略或实时监控数据,自动增加或减少计算资源(如虚拟机、容器实例、Pod)的能力。其目标是在保证服务质量(SLA)的前提下,实现资源供给与业务需求的最佳匹配。
核心价值:弹性伸缩并非简单的“自动扩容”,而是包含“缩容”的闭环。缩容在低负载时释放闲置资源,直接降低云支出,是 FinOps 实践的关键环节。
一个完整的弹性伸缩系统通常包含以下组件:
- 监控采集器:持续收集 CPU、内存、请求延迟等指标。
- 策略引擎:根据指标阈值或预测模型,判断是否需要调整副本数。
- 执行器:调用云 API 或编排平台(如 Kubernetes)执行扩缩容操作。
- 冷却/稳定窗口:防止指标抖动导致频繁伸缩(Thrashing)。
水平伸缩 vs 垂直伸缩
两种伸缩模式在架构设计、成本模型和运维复杂度上存在本质差异。下表从多个维度进行对比:
| 对比维度 | 水平伸缩(Scale Out/In) | 垂直伸缩(Scale Up/Down) |
|---|---|---|
| 操作方式 | 增加/减少实例数量 | 增加/减少单实例规格(CPU/内存) |
| 典型场景 | 无状态微服务、Web 前端 | 有状态数据库、单体应用 |
| 扩容上限 | 理论上无限(受限于集群配额) | 受物理机/虚拟机最大规格限制 |
| 弹性速度 | 较快(分钟级启动新实例) | 较慢(需重启实例生效) |
| 成本模型 | 线性增长,粒度细 | 跳跃式增长,易造成浪费 |
| 架构要求 | 需支持负载均衡、无状态设计 | 对应用代码侵入小 |
平台工程建议:优先采用水平伸缩。对于无法水平伸缩的有状态组件(如数据库主库),可结合垂直伸缩与读写分离架构,将读流量水平扩展。
常见触发指标
弹性伸缩策略的准确性取决于触发指标的选择。单一指标往往不够全面,生产环境通常采用多指标组合或自定义指标。以下是三类最常用的触发指标:
1. CPU 使用率
- 适用场景:计算密集型服务(如数据处理、视频转码)。
- 典型阈值:目标平均 CPU 维持在 60%–75%,超过 80% 触发扩容,低于 30% 触发缩容。
- 注意事项:CPU 突刺(Spike)可能导致误伸缩,需配合稳定窗口(如持续 3 分钟超过阈值)。
2. 内存使用率
- 适用场景:内存密集型服务(如缓存、实时分析)。
- 典型阈值:目标内存使用率 70%–85%,避免 OOM(Out of Memory)导致进程被杀。
- 注意事项:Java 等语言存在堆内/堆外内存,需监控 RSS(Resident Set Size)而非仅 JVM 堆。
3. 请求数/并发连接数
- 适用场景:Web 服务、API 网关、消息队列消费者。
- 典型阈值:每秒请求数(RPS)或活跃连接数超过实例处理能力的 80%。
- 注意事项:请求数指标通常与延迟(P99 Latency)结合使用,避免“请求堆积但响应慢”的假象。
避坑指南:不要仅依赖 CPU 或内存作为唯一指标。例如,I/O 密集型服务(如数据库)在 CPU 很低时可能已出现连接池耗尽。建议结合应用层自定义指标(如队列深度、线程池活跃度)进行综合判断。
指标组合策略示例
下表展示了一个典型 Web 服务的多指标弹性伸缩策略配置:
| 触发条件 | 指标 | 阈值 | 持续时间 | 伸缩动作 |
|---|---|---|---|---|
| 扩容条件 1 | CPU 使用率 | > 75% | 3 分钟 | 增加 2 个实例 |
| 扩容条件 2 | 请求数/实例 | > 1000 RPS | 2 分钟 | 增加 4 个实例 |
| 缩容条件 1 | CPU 使用率 | < 30% | 10 分钟 | 减少 1 个实例 |
| 缩容条件 2 | 内存使用率 | < 40% | 10 分钟 | 减少 1 个实例 |
最佳实践:缩容策略应比扩容更保守(更长的持续时间、更小的步长),避免因短暂低峰导致频繁缩容再扩容,造成资源抖动。