负载均衡实例本身的可用性常常被忽略,很多团队只关注后端服务器是否弹性,却没有把SLB的跨可用区容灾和伸缩组生命周期打通。这样的架构在遇到单可用区网络故障或突发流量时,会出现新增实例无法及时挂载、流量调度不均、甚至负载均衡本身失联的问题。要把SLB多可用区部署与弹性伸缩真正集成起来,需要先理解两者各自的高可用边界,再通过合理的分组、绑定和健康检查策略形成联动。

一、多可用区SLB的架构基础
多可用区SLB并不是简单地把负载均衡节点复制到多个机房,而是在同一地域内选择主可用区和备可用区,由平台维护一套转发集群。正常情况下流量由主可用区节点处理,当主可用区发生电力、网络或硬件故障时,系统会触发节点切换,把流量入口迁移到备可用区。这个过程对后端服务器通常是透明的,但对业务来说意味着DNS解析结果可能保持不变,转发链路却已经跨可用区切换。
规划多可用区SLB时,首先要保证后端ECS实例至少在两个可用区有容量。建议创建两个交换机,分别位于主可用区和备可用区,并将ECS均匀分布。虽然同地域不同可用区内网互通,但跨可用区会有微秒级时延增加,对于延迟敏感型业务需要评估。另一个容易出错的地方是SLB的主备可用区选择必须在创建实例时指定,后续不能随意变更,因此网络规划要前置。
二、弹性伸缩与SLB集成的关键模式
弹性伸缩组与SLB的集成通常有三种方式。第一种是直接把伸缩组关联到SLB的默认服务器组,当伸缩组扩容出ECS时,系统自动把新实例加入默认服务器组,缩容时自动移除。这种方式配置最简单,适合所有后端服务器使用相同端口和协议的场景。
第二种是关联到SLB的虚拟服务器组,不同虚拟服务器组可以对应不同域名或URL路径,适合一套负载均衡同时转发多个业务模块的场景。第三种是通过生命周期挂钩和函数计算自定义注册逻辑,适合需要在实例启动后执行初始化脚本、等待应用就绪再接入流量的复杂场景。下表对比了三种模式的适用情况。
| 集成模式 | 配置复杂度 | 适用场景 | 自动添加后端 |
|---|---|---|---|
| 默认服务器组 | 低 | 单业务、相同端口 | 是 |
| 虚拟服务器组 | 中 | 多业务共享SLB | 是 |
| 生命周期挂钩+自定义 | 高 | 启动后需要等待应用就绪 | 否,需自己调用API |
三、配置实战与命令示例
创建多可用区SLB需要指定主备可用区。下面以阿里云CLI为例,首先创建VPC和交换机,然后创建SLB实例。命令中的MasterZoneId和SlaveZoneId需要根据实际地域调整。
# 创建多可用区SLB aliyun slb CreateLoadBalancer \ --RegionId cn-hangzhou \ --LoadBalancerName slb-multi-az \ --AddressType intranet \ --VpcId vpc-xxxxxx \ --MasterZoneId cn-hangzhou-b \ --SlaveZoneId cn-hangzhou-f
创建伸缩组时要指定与SLB的关联关系,并设置最小实例数、最大实例数以及移出策略。常用的移出策略包括最早创建的实例、最新创建的实例以及最早伸缩配置对应的实例。
# 创建弹性伸缩组并关联SLB aliyun ess CreateScalingGroup \ --ScalingGroupName ess-slbdemo \ --MinSize 2 \ --MaxSize 10 \ --DefaultCooldown 300 \ --VSwitchIds '["vsw-bxxxxxx", "vsw-fxxxxxx"]' \ --LoadBalancerIds '["lb-xxxxxx"]' \ --RemovalPolicies '["OldestInstance", "OldestScalingConfiguration"]'
如果使用Terraform管理基础设施,可以把上述过程固化为代码。下面给出一个简化示例,重点是资源之间的引用关系。
resource "alicloud_slb_load_balancer" "multi_az" {
load_balancer_name = "slb-multi-az"
address_type = "intranet"
vpc_id = alicloud_vpc.main.id
master_zone_id = "cn-hangzhou-b"
slave_zone_id = "cn-hangzhou-f"
}
resource "alicloud_ess_scaling_group" "app" {
scaling_group_name = "ess-slbdemo"
min_size = 2
max_size = 10
default_cooldown = 300
vswitch_ids = [alicloud_vswitch.az_b.id, alicloud_vswitch.az_f.id]
loadbalancer_ids = [alicloud_slb_load_balancer.multi_az.id]
removal_policies = ["OldestInstance", "OldestScalingConfiguration"]
}
四、健康检查与流量调度的协同
SLB健康检查和弹性伸缩健康检查是两个独立体系,但会互相影响。SLB通过监听规则定期探测后端ECS端口,失败次数达到阈值后停止转发流量,但不会自动移除ECS。弹性伸缩则通过自己的健康检查机制判断实例是否存活,失败后可以自动移出并替换。如果SLB阈值设置得过低,可能因为一次网络抖动就把实例摘流,而伸缩组却没感知到异常,造成容量看似足够但实际可服务实例减少。反过来,如果伸缩组健康检查过严,可能频繁触发替换,加大系统抖动。
建议将SLB健康检查间隔设置为5到10秒,健康阈值3次,不健康阈值3次;弹性伸缩的健康检查则可以放宽到15到30秒,避免瞬时抖动触发缩容。同时要注意两者检查的端口必须一致,如果SLB监听的是8080端口,伸缩组配置的却是80端口,会出现SLB摘流但伸缩组认为健康的情况。
五、故障演练与调优实践
多可用区能力需要定期验证,不能等到真故障才发现配置遗漏。可以在业务低峰期通过控制台或API手动把主可用区SLB节点切换为备可用区,观察流量是否平滑过渡。更进一步的演练是断开主可用区交换机的路由,模拟整个可用区网络不可达。此时除了验证SLB切换,还要观察伸缩组是否能继续在备可用区扩容。
调优方面,首先要开启SLB删除保护,避免误删导致入口丢失。其次设置合理的最小实例数,确保两个可用区至少各有一台ECS,防止某个可用区全部缩容后流量绕过SLB直连失败。监控上重点关注每秒新建连接数、活跃连接数、健康检查失败次数和伸缩组扩容成功率。成本优化可以考虑在备可用区使用抢占式实例,但需确保按量实例足够承担核心流量。
总体来看,SLB多可用区部署与弹性伸缩集成不是一次配置就能完成的工作,而是需要在网络规划、资源关联、健康检查策略和故障演练上持续打磨。只有把静态容灾和动态扩缩容放在一起设计,才能让负载均衡真正成为弹性架构的稳定入口。