ECS 弹性伸缩 + SLB:高可用架构完整指南
在现代云原生架构中,根据需求波动动态调整计算资源的能力已不再是可选项——而是一项基本要求。阿里云提供了两项紧密集成的服务,共同交付弹性、高可用的应用基础设施:弹性计算服务(ECS)弹性伸缩和负载均衡(SLB)。正确配置后,这些服务能够确保您的应用在流量高峰期间保持响应,同时在空闲时段最大限度地降低成本。
本综合指南将带您深入了解在阿里云上设计、配置和优化 ECS 弹性伸缩与 SLB 的方方面面。无论您是将工作负载从本地数据中心迁移到云上,还是从头构建全新的云原生应用,本文所述的模式和实践都将帮助您构建弹性且成本高效的架构。
理解 ECS 弹性伸缩
阿里云弹性伸缩是一项全托管服务,可根据预定义的条件自动调整伸缩组中 ECS 实例的数量。它使您能够在无需人工干预的情况下保持应用的可用性并优化资源成本。
核心概念
在深入配置之前,理解以下基础构建块至关重要:
伸缩组: 一组共享相同配置并作为一个单元进行管理的 ECS 实例的逻辑集合。伸缩组定义了最小、最大和期望实例数,以及关联的交换机和 SLB。
伸缩配置: 一个模板,用于定义伸缩组启动新 ECS 实例的实例规格、镜像 ID、安全组、系统盘和密钥对。每个伸缩组同一时间只能有一个活跃的伸缩配置。
伸缩规则: 定义如何进行伸缩的策略——可以是添加或删除固定数量的实例,也可以是将当前容量调整到目标百分比。伸缩规则可以手动触发、按计划触发,或由云监控告警触发。
伸缩触发器: 调用伸缩规则的事件或条件。常见的触发器包括用于可预测流量模式的定时任务,基于 CPU、内存或网络利用率阈值的云监控指标告警,以及针对不规则需求模式的事件驱动触发器。
冷却时间: 在伸缩活动之后的一个可配置时间窗口(默认 300 秒),在此期间伸缩组将忽略额外的触发器。冷却时间可防止震荡——即快速扩容/缩容循环——并在进一步调整之前给新实例留出稳定运行的时间。
伸缩模式
阿里云弹性伸缩支持多种运维模式,以适应不同的工作负载模式:
1. 固定实例数模式: 伸缩组维持恒定数量的实例。如果某实例变得不健康,ECS 弹性伸缩将自动替换它。此模式适用于需要稳定容量的有状态工作负载。
2. 定时伸缩模式: 按预定义的计划在特定时间触发伸缩规则。此模式适用于可预测的流量模式,例如企业应用在工作时间扩容、夜间缩容。
3. 动态伸缩模式: 云监控指标告警根据实时指标触发伸缩规则。这是流量可变的 Web 应用和微服务最常见的模式。
4. 预测伸缩模式: 阿里云使用机器学习算法分析历史指标数据,在需求高峰出现之前预先扩展资源。预测伸缩对于电商平台在促销活动期间尤为有效。
负载均衡(SLB)深度解析
负载均衡(SLB)是阿里云的四层和七层负载均衡服务。它将入站流量分发到多个后端 ECS 实例,从而提高应用的可用性和容错能力。
SLB 架构
阿里云 SLB 运行在高可用的分布式架构上。当您创建 SLB 实例时,阿里云会在所选区域内的多个可用区部署冗余的负载均衡节点。您无需管理底层基础设施——阿里云会透明地处理故障转移、SLB 自身的扩容以及软件更新。
SLB 的核心组件包括:
- 监听器: 使用配置的协议(TCP、UDP、HTTP 或 HTTPS)和端口检查连接请求的进程。每个 SLB 实例可以有多个监听器,使单个负载均衡器能够在不同端口上为不同应用提供服务。 - 后端服务器组: 接收来自 SLB 流量的 ECS 实例集合。实例可以通过手动方式添加到后端服务器组,也可以通过弹性伸缩自动添加。 - 健康检查: SLB 定期向后端服务器发送健康检查请求以验证其可用性。不健康的实例会被自动移出流量轮询,直到恢复为止,从而确保零停机故障转移。
SLB 实例类型
阿里云提供两个 SLB 产品层级:
| 特性 | 共享型 SLB | 性能保障型 SLB | |---------|----------------------|---------------------| | 性能 | 共享资源,吞吐量可变 | 专用资源,吞吐量有保障 | | 最大连接数 | 最高 5,000(取决于规格) | 最高 1,000,000 | | QPS(HTTP/HTTPS) | 最高 5,000 | 最高 500,000 | | SLA | 无性能 SLA | 99.95% 可用性 SLA | | 适用场景 | 开发、测试、低流量应用 | 生产环境、高流量、企业级应用 |
对于生产工作负载,务必使用性能保障型 SLB,以确保在负载下具有一致的延迟和吞吐量。
负载均衡算法
SLB 支持多种流量分发调度算法:
- 轮询(rr): 请求按顺序依次分发到每个后端服务器。对于同构后端实例来说简单有效。 - 加权轮询(wrr): 为每个后端服务器分配权重,请求按权重比例分发。当后端实例具有不同处理能力时使用此算法。 - 加权最小连接数(wlc): 流量流向活动连接数最少的服务器,并按服务器容量加权。最适用于长连接场景(WebSocket、数据库代理)。 - 一致性哈希(ch): 具有相同源 IP 地址的请求始终路由到同一个后端服务器。适用于需要会话保持但无需服务器端会话存储的场景。
弹性伸缩与 SLB 集成
当弹性伸缩和 SLB 协同工作时,阿里云计算服务的真正威力才得以显现。以下是分步配置指南:
步骤一:创建 SLB 实例
进入 SLB 控制台,创建性能保障型 SLB 实例,并配置至少一个监听器。对于 Web 应用,在 80 端口创建 HTTP 监听器(如持有 SSL 证书则在 443 端口创建 HTTPS 监听器)。记下 SLB 实例 ID——创建伸缩组时需要用到。
步骤二:定义伸缩配置
创建伸缩配置并指定:
- 实例类型系列(例如,通用型选 ecs.g6) - 镜像 ID(预先安装好应用的自定义镜像,或基础的 CentOS/Ubuntu/阿里云 Linux 镜像) - 已配置相应入站规则的安全组 - 系统盘大小和类型(推荐使用 Ultra Disk 或 ESSD) - 用于 SSH 访问的密钥对或密码 - 用于初始化的 User Data 脚本(安装依赖、拉取应用代码、启动服务)
`bash
#!/bin/bash
示例 User Data 初始化脚本
yum update -y yum install -y nginx systemctl enable nginx systemctl start nginx echo "<h1>Alibaba Cloud Auto Scaling Demo</h1>" > /usr/share/nginx/html/index.html`步骤三:创建伸缩组
创建伸缩组并将其关联到 SLB 实例。关键参数:
- 交换机: 选择应用运行所在 VPC 中的交换机。为实现多可用区高可用,请选择至少两个可用区的交换机。 - SLB 关联: 选择 SLB 实例和默认后端服务器组。可选地,还可关联虚拟服务器组(VServer Group)以实现基于 URL 的路由。 - 移除策略: 选择优先移除最早实例、最新实例还是最早伸缩配置的实例。对于生产环境,移除最早实例通常最安全。 - 健康检查: 同时启用 SLB 健康检查和伸缩组健康检查。伸缩组健康检查通过监控 ECS 级健康状况(系统状态、磁盘状态)来补充 SLB 健康检查。
步骤四:配置伸缩规则和触发器
至少创建两条伸缩规则——一条用于扩容,一条用于缩容:
扩容规则示例: - 操作:添加 2 台实例 - 冷却时间:300 秒
缩容规则示例: - 操作:移除 1 台实例 - 冷却时间:600 秒(更长的冷却时间防止激进缩容)
然后创建云监控告警触发器:
- 扩容触发器: 伸缩组内平均 CPU 利用率在连续 5 分钟内 > 70% - 缩容触发器: 伸缩组内平均 CPU 利用率在连续 10 分钟内 < 30%
健康检查配置最佳实践
健康检查对于确保只有健康实例提供流量至关重要。配置不当的健康检查可能导致误报(将健康实例标记为不健康)或漏报(不健康实例继续接收流量)。
SLB 健康检查参数
对于 HTTP/HTTPS 监听器:
- 检查域名: 用于健康检查请求的域名。可以使用 $_ip 作为后端服务器 IP 的占位符。
- 检查 URI: 应用中返回 200 OK 状态的路径。应创建专用的 /health 端点来验证后端依赖(数据库连接、缓存可用性),而不仅仅是返回静态响应。
- 检查间隔: SLB 发送健康检查请求的频率(默认 2 秒)。对于生产环境,5-10 秒通常足够,并能减少不必要的负载。
- 健康阈值: 将实例标记为健康之前所需的连续成功检查次数(默认 3 次)。对于大多数应用,2-3 次即可。
- 不健康阈值: 将实例标记为不健康之前所需的连续失败检查次数(默认 3 次)。将此值设低(2 次)可加快故障转移。
弹性伸缩的优雅启动期
当弹性伸缩启动新实例时,它们需要时间启动、安装软件并开始提供流量。默认冷却时间和预热时间(在关联了 SLB 的伸缩组中可用)用于控制这一过程:
- 默认冷却时间: 在当前伸缩活动稳定期间阻止额外的伸缩活动。建议值:300 秒。 - 实例预热时间: 在此期间新实例不受缩容影响。将此值设置为应用完全就绪所需的时间(通常 180-600 秒)。
高级伸缩模式
多可用区高可用
将伸缩组分布到多个可用区,以应对可用区级故障。创建伸缩组时至少选择两个可用区的交换机(阿里云区域通常有 2-3 个可用区)。伸缩组以轮询方式将新实例分布在所选交换机中。
配合使用多可用区 SLB 部署。性能保障型 SLB 实例会自动跨该区域内的可用区部署,提供透明的故障转移。
混合实例类型与抢占式实例
为优化成本并提高实例可用性,您可以将伸缩组配置为使用多种实例类型并包含抢占式实例:
- 多种实例类型: 指定一个实例类型列表(例如 ecs.g6.large、ecs.g6.xlarge、ecs.g7.large)。如果主要类型的容量不足,伸缩组会自动使用备用类型。 - 抢占式实例: 配置一定比例的实例使用抢占式定价模式,最高可节省 90% 的成本。将抢占式实例和按量付费实例组合使用,以实现成本与可靠性的平衡。重要提示:始终保留足够的按量付费基准容量,以在抢占式实例被回收时处理流量。
生命周期挂钩
生命周期挂钩使您能够在实例被添加到后端服务器组或从其中移除之前执行自定义操作:
- 扩容生命周期挂钩: 将实例暂停在 Pending:Wait 状态,允许您在实例接收线上流量之前运行配置管理(Ansible、Puppet)、向外部监控注册实例或预热应用缓存。
- 缩容生命周期挂钩: 将实例暂停在 Terminating:Wait 状态,为您提供时间优雅地排空连接、刷新日志或从外部服务注销,然后再终止实例。
生命周期挂钩与阿里云消息服务(MNS)或 EventBridge 集成,以触发您的自定义自动化工作流。
监控与可观测性
有效的伸缩需要对伸缩组和 SLB 都具有可见性。阿里云提供多种监控工具:
云监控指标
需要监控的关键指标:
- 伸缩组指标: 活跃实例数、CPU 利用率(平均/最大值)、内存利用率、网络入/出流量 - SLB 指标: 活跃连接数、每秒新建连接数、QPS、HTTP 2xx/4xx/5xx 状态码比例、后端服务器健康状态、请求延迟(上游响应时间)
SLB 访问日志
启用 SLB 访问日志以捕获详细的请求信息,包括客户端 IP、请求 URL、响应状态码和上游响应时间。访问日志存储在 OSS 中,可使用 MaxCompute 或日志服务(SLS)进行分析,用于流量模式分析和故障排查。
弹性伸缩通知
通过 MNS 或 EventBridge 配置弹性伸缩事件通知,以接收以下告警: - 伸缩活动(成功、失败、因配额限制被拒绝) - 实例生命周期事件 - 健康检查失败
将这些通知与您的事件管理系统(PagerDuty、OpsGenie 或自定义 Webhook)集成,以实现实时运营感知。
成本优化策略
弹性伸缩通过使实例数量与需求保持一致,天然地优化了成本,但额外的策略可以进一步降低支出:
1. 合理设定基准容量: 分析历史指标数据,确定低流量时段所需的最小实例数。将伸缩组的最小值设定为此值,而非一个任意数字。
2. 为基准容量使用预留实例: 为最小实例数购买预留实例(1 年或 3 年承诺)。预留实例相比按量付费最高可节省 65% 的成本。弹性伸缩会自动将预留实例折扣应用于符合条件的实例。
3. 定时缩容: 对于具有可预测日间模式的工作负载,配置定时伸缩规则,在已知的低流量时间窗口(例如夜间、周末)减少容量。
4. 合理选择实例规格: 定期审查云监控指标。如果实例在峰值时持续显示 CPU/内存利用率较低,请考虑在伸缩配置中切换到更小的实例类型。
5. 利用节省计划: 阿里云节省计划可跨实例系列和区域提供灵活的折扣,与预留实例互补,用于覆盖容量中的可变部分。
常见问题排查
问题:新实例未接收到流量
原因: - SLB 健康检查失败(检查 URI 不正确,安全组阻止了来自 SLB 子网的健康检查流量) - 实例预热时间尚未结束 - 应用未启动或未在预期端口上监听
解决方法: 验证 SLB 健康检查配置,确保安全组允许来自 SLB 健康检查 IP 段(100.64.0.0/10)的入站流量,并检查新实例上的应用日志。
问题:未按预期触发扩容
原因: - 上一次伸缩活动的冷却时间尚未结束 - 云监控告警阈值未达到(检查评估周期和统计类型) - 区域内的实例配额不足(ECS vCPU 或实例数限制)
解决方法: 检查弹性伸缩活动日志以查看被拒绝的伸缩活动,如有必要提交工单提高 ECS 配额,并验证告警配置。
问题:伸缩组无法启动实例
原因: - 伸缩配置无效(镜像已删除、磁盘不足、安全组无效) - 交换机无可用 IP 地址 - 所选实例类型在该可用区容量不足
解决方法: 检查伸缩活动历史记录中的具体错误信息,在伸缩配置中添加备用实例类型,或在其他可用区添加交换机。
总结
阿里云 ECS 弹性伸缩和负载均衡共同构成了弹性、高可用应用架构的主干。通过实施本指南所述的模式——多可用区分布、合理的健康检查调优、生命周期挂钩和全面的监控——您可以构建出能够自动适应需求变化、同时保持性能并控制成本的系统。
成功的关键在于迭代调优:从保守的伸缩阈值开始,监控真实世界的流量模式,然后逐步优化伸缩规则和触发器。借助阿里云的弹性伸缩和 SLB,您拥有在生产规模上实现云原生弹性所需的一切工具。
> 本文由 chengzicloud.cloud 提供,点击访问首页了解更多