如何动态增减服务器_弹性伸缩配置详解【操作】

12次阅读

动态伸缩核心是云平台基于负载自动触发伸缩组动作,关键在指标组合(如 requestcountpertarget+cpu)、健康检查就绪信号、生命周期挂钩优雅缩容及配额 / 网络配置排查。

如何动态增减服务器_弹性伸缩配置详解【操作】

动态增减服务器不是靠手动加机器或删实例实现的,核心是让云平台根据负载自动触发伸缩组(Auto Scaling Group)的扩缩容动作。关键不在“怎么点按钮”,而在于指标选择、冷却时间、实例启动模板是否真正就绪。

伸缩策略里用 CPU 利用率还是请求量做触发条件?

单纯看 CPUUtilization 容易误判:比如 Java 应用刚启动时 GC 频繁拉高 CPU,但实际没流量;或 I/O 密集型服务 CPU 低却已打满磁盘带宽。更稳的做法是组合指标:

  • Web 层优先用 RequestCountPerTarget(ALB/NLB 指标)或自定义上报的 QPS
  • 后台任务队列用 SQS 的 ApproximateNumberOfMessagesVisible
  • 必须配一个兜底指标,比如 CPUUtilization > 70% 持续 5 分钟,防突发长连接占满内存

注意:不同云厂商指标命名和延迟不同,AWS CloudWatch 默认 1 分钟粒度,阿里云监控可能有 2–3 分钟延迟,策略里的「持续周期」得留出缓冲。

为什么新实例启动后立刻被标记为 Unhealthy?

常见原因是健康检查(Health Check)在实例还没完成应用部署时就发起了探测。典型表现是伸缩组反复创建销毁同一台实例。

  • 确保启动模板中 UserData 脚本末尾有明确的「就绪信号」,比如 AWS 上用 cfn-signal,阿里云用 ecs-sync
  • 把 ELB/ALB 的健康检查路径设为 /healthz,并在应用里实现该接口——只在依赖服务(DB、Redis)连通且主逻辑加载完成后才返回 200
  • 伸缩组的 HealthCheckGracePeriod 至少设为 300 秒(5 分钟),给初始化留足时间

缩容时老实例被直接终止,用户请求中断怎么办?

默认行为就是立即终止,但你可以控制生命周期:

  • 在伸缩组启用 Termination Policy 并设为 OldestInstanceDefault,避免随机杀掉正在处理长请求的实例
  • 更可靠的是结合生命周期挂钩(Lifecycle Hook):设置 Terminating:Wait,让实例进入等待状态,此时可调用 API 触发 drain 操作(如从注册中心下线、关闭新连接、等待活跃请求结束)
  • Nginx 或 Envoy 前端需配置 proxy_next_upstream 或重试策略,容忍后端短暂不可用

别忘了:缩容前务必确认所有实例都通过了应用层健康检查,否则生命周期挂钩可能等不到你预期的信号就超时强制终止。

伸缩组扩到 100 台却卡在 20 台不动?

这不是策略问题,是账户配额或资源不足卡住的。先查三处:

  • AWS:检查 ec2:RunInstances 权限是否允许指定的 InstanceTypeSubnet 组合;再看 On-Demand Instance Limit 是否触及上限(尤其新账号默认只有 20 vCPU)
  • 阿里云:确认目标可用区是否有库存,DescribeZones 返回的 AvailableResourceListInstanceType 状态是否为 Available
  • 所有平台都要检查启动模板引用的 SecurityGroupKeyPair 是否在目标 VPC 内存在且可访问

最常被忽略的是子网路由表没配好,导致新实例获取不到元数据服务(169.254.169.254),UserData 根本不执行,整条链路就断在第一步。

text=ZqhQzanResources