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 的静态页;否则会出现“实例健康但业务不可用”的假阳性。对于有依赖的服务,健康检查应验证数据库连接、缓存连接或关键下游,但也要避免检查过重导致自身成为瓶颈。

ALB/NLB 流量分发与健康检查关系 互联网客户端 HTTPS / TCP 监听器 Listener ALB: HTTP/HTTPS + 规则 NLB: TCP/UDP/TLS 规则 /api/* 转发到 API 目标组 规则 /static/* 转发到静态资源目标组 目标组 TG-API HTTP:8080 /health 目标组 TG-WEB HTTP:80 /health 跨 AZ 负载均衡:同 AZ 优先,健康目标才接收流量 可用区 A EC2 健康 /health 200 EC2 不健康 连续失败 2 次 可用区 B EC2 健康 /health 200 EC2 健康 /health 200 健康检查探测 健康检查探测 自动摘除,不接收新请求 TLS 终止在 ALB/NLB

跨 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 的关键差异

维度ALBNLB
工作层级应用层(HTTP/HTTPS)传输层(TCP/UDP/TLS)
路由能力路径、主机头、方法、查询串端口级转发
静态 IP不支持(用 Global Accelerator 可缓解)每个 AZ 一个弹性 IP
健康检查HTTP/HTTPSTCP/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 的跨 AZ 负载均衡默认开启,但目标组中必须注册多个 AZ 的目标才能生效。若只注册一个 AZ,即使负载均衡器有多个节点,也无法实现 AZ 级容灾。
健康检查路径不要使用需要登录或依赖外部第三方服务的接口,否则第三方抖动会导致所有实例被同时摘除,引发全站不可用。建议健康检查只验证本机核心依赖,并设置合理的超时与阈值。

总结来说,ALB 和 NLB 的选择取决于协议与路由需求:需要 HTTP 内容路由、TLS 终止和丰富规则时选 ALB;需要极低延迟、静态 IP 或 TCP/UDP 转发时选 NLB。无论选哪种,监听器定义入口、目标组定义后端、健康检查定义可用性判断、跨 AZ 定义容灾范围、TLS 终止定义加密边界,这五个要素共同决定了负载均衡层的高可用质量。