AWS ELB

AWS Elastic Load Balancing (ELB)

第一章:ELB 核心概念

Elastic Load Balancing (ELB) 是一种高度可用且可扩展的服务,它能自动将传入的应用程序或网络流量分发到多个目标(如 EC2 实例、容器 ECS、Lambda 函数和 IP 地址)。

1. 核心运行逻辑

  • 多可用区部署:创建负载均衡器时,必须从至少两个可用区(AZ)中各指定一个公共子网。这确保了当某个 AZ 发生故障时,流量可以自动导向其他健康的 AZ。
  • 健康检查:ELB 持续监控注册目标的健康状况,并仅将请求路由到健康的实例。
  • 删除保护:建议开启此功能,防止负载均衡器被意外删除。
  • SSL 卸载 (SSL Offloading):ELB 可以终止来自客户端的 SSL 连接,并以非加密形式将请求发送到后端,从而减轻后端服务器的计算压力。

2. 基础组件与目标类型

  • Listener (监听器):检查连接请求的进程,配置前端要监听的协议和端口。
  • Target Group (目标组):后端资源的逻辑分组。ELB 将请求路由到目标组,而不是直接路由到单一实例。
  • 目标类型 (Target Types)
    • Instance ID:传统的 EC2 实例。
    • IP Address:可以是 VPC 内的私有 IP,也可以是本地数据中心的 IP(通过 VPN/DX 连接,实现混合云负载均衡)。
    • Lambda Function:仅 ALB 支持。
    • ALB:NLB 的目标组可以指向一个 ALB(即 NLB -> ALB -> EC2 架构),用于同时获得静态 IP 和 Layer 7 路由功能。

第二章:三种核心负载均衡器类型对比

1. Application Load Balancer (ALB) —— 应用层 (L7)

ALB 工作在 OSI 模型的第七层,专门处理 HTTP 和 HTTPS 流量。

  • 智能路由规则
    • 基于路径的路由:例如将 /api 发往一组服务器,将 /images 发往另一组。
    • 基于主机名的路由:例如根据域名 example.comtest.com 进行分发。
    • 基于查询字符串/HTTP 标头/HTTP 方法的路由
  • 高级功能
    • 支持重定向:可将 HTTP 请求自动重定向到 HTTPS。
    • 自定义响应:可以直接返回固定的 HTML 页面或响应(如 404/200,或 503 维护页面),无需转发给后端。
    • Lambda 集成:可以将 Lambda 函数作为目标组。
    • gRPC 支持:适用于高性能微服务通信。
    • WebSocket & HTTP/2:原生支持。
    • 身份验证:支持 OIDC 兼容的身份提供商和 Amazon Cognito。
    • 双栈支持:支持 IPv4 和 IPv6 目标。

2. Network Load Balancer (NLB) —— 传输层 (L4)

NLB 工作在第四层,专门处理 TCP、UDP 和 TLS 流量,适合对性能要求极高的场景。

  • 极致性能:能够处理每秒数百万次的突发请求,延迟极低。
  • 静态 IP 地址:每个启用的可用区都会获得一个静态 IP,并且可以关联弹性 IP (EIP)。这是需要防火墙白名单场景的首选。
  • 源 IP 保留:对于实例类型目标,NLB 可以直接透传客户端的原始 IP 到后端。
  • ALB 作为目标:NLB 可以直接将流量转发到 ALB(仅限 TCP 监听器)。
  • QUIC 协议支持:适用于超低延迟的流媒体和通信。
  • 适用场景:游戏服务器、实时流媒体、即时通讯、需要静态入口 IP 的应用。

3. Gateway Load Balancer (GWLB) —— 网络层 (L3)

GWLB 用于在 VPC 前端部署、扩展和管理第三方虚拟防火墙、入侵检测系统 (IDS/IPS) 等设备。

  • 透明代理:在网络层运行,流量透明地传递给注册的安全设备,不执行 SSL 卸载等操作。
  • 封装协议:使用 GENEVE 协议 (端口 6081) 跨网络边界封装和传递流量给后端设备。
  • GWLB 终端节点:通过终端节点创建安全、低延迟的连接。

第三章:关键高级特性深度解析

1. 跨可用区负载均衡 (Cross-Zone Load Balancing)

  • 机制:开启后,负载均衡器会将其流量均匀分发到所有已启用的 AZ 中的所有注册目标。如果不开启,每个负载均衡器节点只分配给自己所在 AZ 的目标(可能导致 AZ 间节点数量不对称时,部分节点负载极高)。
  • 默认状态:ALB 默认启用(不收跨区流量费用);NLB 默认禁用(开启后跨区流量收费)。

2. 会话保持 (Sticky Sessions / Session Affinity)

  • 功能:将同一用户的多次请求始终导向同一个后端目标。
  • ALB 实现:通过负载均衡器生成的 Cookie 或应用程序自定义的 Cookie 来实现,适用于有状态应用。
  • NLB 实现:基于源 IP 地址。

3. 连接排空 / 注销延迟 (Connection Draining / Deregistration Delay)

  • 功能:当某个实例进行缩容、被注销或健康检查失败时,ELB 会停止向其发送新请求,但允许现有的在途请求在超时时间内完成处理,防止切断用户正在进行的事务。
  • 默认时间:默认 300 秒。

4. 慢启动模式 (Slow Start)

  • 功能:给新加入的目标组的实例一段时间进行“预热”,在这段时间内,发送给它的请求量会逐渐增加。

5. 获取真实客户端 IP

  • ALB:由于经过 L7 代理,后端看到的“源 IP”是 ALB 的私有 IP。真实的客户端 IP 存储在 HTTP Header X-Forwarded-For 中,后端应用必须解析该 Header 才能获取真实用户 IP。
  • NLB:可以配置开启 Preserve Client IP (源 IP 保留) 属性,直接将客户端 IP 透传到后端,无需解析 Header。

第四章:健康检查状态全解析

目标在负载均衡器中会有以下几种状态:

  • Initial:正在注册目标或健康检查正在进行中。
  • Healthy:目标健康,可以接收流量。
  • Unhealthy:目标未响应健康检查或检查失败。
  • Unused:目标未注册到目标组,或者目标组未关联到监听器规则。
  • Draining:目标正在注销,正在进行连接排空处理。

第五章:安全与合规

  • TLS 1.3 支持:ALB 和 NLB 均支持最新的 TLS 1.3 协议。
  • SNI (Server Name Indication):允许一个监听器托管多个 SSL 证书,服务于多个域名。ALB 和 NLB 都支持。
  • WAF 集成:可以直接挂载 AWS WAF 防御 Web 攻击(仅 ALB 支持。如果使用 NLB 又需要 WAF,通常需要在前端加 CloudFront)。
  • 身份验证:ALB 支持 JWT (JSON Web Token) 验证和相互 TLS (mTLS) 身份验证。
  • 安全组:可以直接将安全组关联到 ALB 和 NLB,以过滤进出负载均衡器的流量。
  • 证书管理:最佳实践是在 ACM (AWS Certificate Manager) 中集中管理 SSL 证书并绑定到 ELB 监听器上,而不是在每台后端 EC2 上配置证书。

第六章:架构师对比与决策速查

特性Application (ALB)Network (NLB)Gateway (GWLB)
层级Layer 7Layer 4Layer 3
协议HTTP, HTTPS, gRPCTCP, UDP, TLSIP
性能高 (秒级扩展)极致 (亚秒级扩展)
固定 IP不支持 (仅 DNS)支持 (静态 IP / EIP)不支持
路由路径、主机、查询参数仅监听器端口/协议不支持
身份验证支持不支持不支持
SSL 卸载支持支持不支持

架构选型速查表

  • 满足 [HTTP/HTTPS] + [Layer 7 routing / URL path] 要求 $\rightarrow$ ALB
  • 满足 [千万级并发请求][超低延迟][必须静态 IP] $\rightarrow$ NLB
  • 处理 [第三方防火墙 / IPS / IDS] 等安全设备 $\rightarrow$ GWLB
  • 适合 [微服务 / 容器组][动态端口映射] $\rightarrow$ ALB

第七章:监控与日志

  • CloudWatch 指标:实时获取请求计数、延迟、错误率等数据。
  • 访问日志 (Access Logs):详细记录发往负载均衡器的每一个请求(例如客户端 IP、请求路径等),日志会存储在 S3 桶中。默认是关闭的,需要手动开启。
  • VPC Flow Logs:监控进入 NLB 的网络流数据。
  • CloudTrail:审计所有对 ELB API 的调用。

第八章:计费逻辑

  • ALB/NLB:按小时计费,并按使用的 LCU(负载均衡器容量单位)计费。
  • GWLB:按小时计费,并按使用的 GLCU 计费。
  • CLB:按小时计费,并按数据传输量(GB)计费。

第九章:常见故障排查 (Troubleshooting)

掌握 ELB 返回的经典 HTTP 状态码对于排查异常至关重要:

  • 502 Bad Gateway (错误网关):通常是 ELB 无法连接到后端实例。原因可能是后端服务挂掉不响应,或后端返回了格式错误的响应。
  • 503 Service Unavailable (服务不可用):目标组里没有任何健康的目标(All Targets Unhealthy),或者所有的后端都处于满载状态导致无法处理新请求。
  • 504 Gateway Timeout (网关超时):后端实例处理请求的时间过长(超过了 ELB 的 Idle Timeout 配置),或是网络连接超时(例如后端的 Security Group 拒绝了来自 ELB 的流量)。