4. 弹性负载均衡ALB/NLB
在 AWS 高可用 Web 架构中,弹性负载均衡(Elastic Load Balancing,ELB)是流量进入系统的第一道“分发与健康筛选”关口。它把来自互联网或内网的请求,按规则转发到多个可用区(AZ)中的后端目标,并在目标异常时自动摘除,从而让业务在单台实例、单个 AZ 甚至单个应用版本故障时仍能继续服务。AWS 提供两类主力负载均衡器:面向 HTTP/HTTPS 的 Application Load Balancer(ALB) 和面向 TCP/UDP/TLS 的 Network Load Balancer(NLB)。理解它们的监听器、目标组、健康检查、跨 AZ 分发和 TLS 终止方式,是设计高可用 Web 系统的核心基本功。
监听器:流量的入口规则
监听器(Listener)是负载均衡器上“监听某个端口和协议”的入口。创建 ALB 时,至少要配置一个监听器,例如 HTTP:80 或 HTTPS:443;每个监听器绑定一组规则(Rule),规则由“条件 + 动作”组成。条件可以匹配路径、主机头、HTTP 方法、查询字符串、源 IP 等;动作可以是转发到某个目标组、重定向、返回固定响应,或做认证。ALB 支持基于内容的路由,因此非常适合把 /api/* 转发到 API 目标组、把 /static/* 转发到静态资源目标组,实现微服务或前后端分离的流量拆分。
NLB 的监听器则工作在传输层,监听 TCP、UDP 或 TLS 端口,规则相对简单,主要动作是转发到目标组。NLB 不解析 HTTP 内容,因此没有基于路径或主机头的路由能力,但它具备极低延迟、超高吞吐和静态 IP(每个 AZ 一个弹性 IP)等特性,适合数据库代理、游戏网关、MQTT、gRPC 等场景。
目标组:后端注册与分发单元
目标组(Target Group)是负载均衡器转发请求的“后端集合”。目标可以是 EC2 实例、IP 地址、Lambda 函数,或另一个 ALB(NLB 支持)。目标组需要指定协议、端口和 VPC,并绑定健康检查配置。一个负载均衡器可以有多个目标组,一个目标组也可以被多个监听器规则引用。目标组是跨 AZ 高可用的关键:当目标组中注册了多个 AZ 的实例时,负载均衡器节点会优先把流量分发到同 AZ 的健康目标,减少跨 AZ 延迟和流量费用。
健康检查:自动摘除异常目标
健康检查(Health Check)决定目标是否“可接收流量”。ALB 默认使用 HTTP/HTTPS 检查,可指定路径(如 /health)、端口、成功码(如 200)、间隔(默认 30 秒)、超时(默认 5 秒)、健康阈值(默认 5 次连续成功)和不健康阈值(默认 2 次连续失败)。NLB 支持 TCP、HTTP、HTTPS 健康检查。健康检查必须指向一个能真实反映应用状态的端点,而不是仅返回 200 的静态页;否则会出现“实例健康但业务不可用”的假阳性。对于有依赖的服务,健康检查应验证数据库连接、缓存连接或关键下游,但也要避免检查过重导致自身成为瓶颈。
跨 AZ 负载均衡:同 AZ 优先与健康筛选
当 ALB 或 NLB 启用多个 AZ 时,每个 AZ 都会有一个负载均衡器节点。客户端请求先到达某个节点,节点再根据目标组中健康目标的分布进行转发。默认情况下,负载均衡器会优先把请求转发到与当前节点同 AZ 的健康目标,以降低延迟和跨 AZ 流量成本;如果同 AZ 没有健康目标,才会转发到其他 AZ。这种“同 AZ 优先、跨 AZ 兜底”的机制,使得单个 AZ 整体故障时,流量可以自动切换到其他 AZ 的健康实例,业务不中断。需要注意的是,跨 AZ 负载均衡默认开启,但目标组中必须注册多个 AZ 的目标,否则无法实现真正的跨 AZ 容灾。
SSL/TLS 终止:证书放在哪里
SSL/TLS 终止指负载均衡器负责与客户端完成 TLS 握手、解密请求,再把明文或重新加密的请求转发给后端。ALB 支持在监听器上配置 ACM 证书或 IAM 证书,实现 HTTPS 终止;NLB 支持 TLS 监听器,同样可以终止 TLS。终止在负载均衡器上的好处是:后端实例无需处理证书和加解密,降低 CPU 开销;证书集中管理,便于轮换;可以统一启用安全策略(如 TLS 1.2+)。如果合规要求端到端加密,也可以在 ALB 上配置“HTTPS 监听器 + 后端 HTTPS 目标组”,实现重新加密。对于 NLB,还可以配置 TLS 监听器 + TCP 目标组,把加密流量直接透传到后端,由后端自行终止。
ALB 与 NLB 的关键差异
| 维度 | ALB | NLB |
|---|---|---|
| 工作层级 | 应用层(HTTP/HTTPS) | 传输层(TCP/UDP/TLS) |
| 路由能力 | 路径、主机头、方法、查询串 | 端口级转发 |
| 静态 IP | 不支持(用 Global Accelerator 可缓解) | 每个 AZ 一个弹性 IP |
| 健康检查 | HTTP/HTTPS | TCP/HTTP/HTTPS |
| 典型场景 | Web 应用、微服务、API 网关 | 数据库代理、游戏、MQTT、gRPC |
一个可参考的配置示例
假设一个 Web 业务部署在 us-east-1a 和 us-east-1b 两个 AZ,前端实例监听 80 端口,健康检查路径为 /health。可以按如下思路配置:
ALB 监听器:
HTTPS:443 → 默认规则转发到 TG-WEB
证书:ACM 证书(*.example.com)
安全策略:ELBSecurityPolicy-TLS13-1-2-2021-06
目标组 TG-WEB:
协议:HTTP,端口:80
VPC:vpc-0a1b2c3d
健康检查:HTTP GET /health,成功码 200
间隔 15s,超时 5s,健康阈值 3,不健康阈值 2
注册目标:
i-0aaa111(us-east-1a)
i-0bbb222(us-east-1b)
跨 AZ:启用
配置完成后,可以通过 ALB 的 DNS 名称访问业务,并在目标组“目标”页签观察每个目标的状态:healthy 表示健康检查通过,unhealthy 表示连续失败达到阈值,unused 表示未注册到监听器规则。若某个实例显示 unhealthy,应优先检查安全组是否放行负载均衡器所在子网的流量、健康检查路径是否返回 200、应用是否真正启动完成。对于生产环境,建议健康检查间隔不要过短,避免在应用启动或短暂抖动时被误摘除;同时配合 ALB 的“慢启动”或 NLB 的连接耗尽等待,让新实例有足够时间预热。
总结来说,ALB 和 NLB 的选择取决于协议与路由需求:需要 HTTP 内容路由、TLS 终止和丰富规则时选 ALB;需要极低延迟、静态 IP 或 TCP/UDP 转发时选 NLB。无论选哪种,监听器定义入口、目标组定义后端、健康检查定义可用性判断、跨 AZ 定义容灾范围、TLS 终止定义加密边界,这五个要素共同决定了负载均衡层的高可用质量。