网络笔记:负载均衡:四层 vs 七层
发布于:
本文深入解析四层(L4)和七层(L7)负载均衡的工作原理、适用场景、性能特征和工程实践。
本文把”四层 vs 七层负载均衡”讲清楚一个核心差异:看不看得懂请求。L4 看连接/五元组;L7 看 HTTP/gRPC 等应用协议,因此能做更复杂的路由与治理,但也更贵、更复杂。
1. L4(传输层)负载均衡:以连接为单位
可以将它理解为”高性能转发器”:
- 主要依据:IP/Port/Protocol(五元组)、连接状态
- 常见能力:NAT、连接保持、健康检查、简单调度算法
优点:吞吐高、延迟低、实现相对简单;缺点:不理解请求内容,难以做细粒度治理。
1.1 L4 的工作原理
flowchart TD
A[Client] --> B[L4 Load Balancer]
B --> C[Backend 1]
B --> D[Backend 2]
B --> E[Backend 3]
B --> F[基于五元组]
F --> G[IP + Port + Protocol]
B --> H[连接级转发]
H --> I[高性能]
1.2 L4 的转发机制
sequenceDiagram
participant C as Client
participant L4 as L4 Load Balancer
participant B as Backend
C->>L4: TCP SYN
L4->>L4: 选择 Backend (基于五元组)
L4->>B: 转发 SYN
B-->>L4: SYN-ACK
L4-->>C: 转发 SYN-ACK
C->>L4: ACK
L4->>B: 转发 ACK
Note over C,B: 建立连接后,后续数据包直接转发
1.3 L4 的调度算法
flowchart TD
A[L4 调度算法] --> B[轮询 Round Robin]
A --> C[加权轮询 Weighted RR]
A --> D[最少连接 Least Connections]
A --> E[源 IP 哈希 Source IP Hash]
B --> F[简单公平]
C --> G[考虑权重]
D --> H[负载均衡]
E --> I[会话保持]
2. L7(应用层)负载均衡:以请求为单位
它能理解 HTTP/gRPC:
- 依据:Host/Path/Header/Cookie、method 等
- 常见能力:路由/灰度/鉴权/WAF/限流/观测(指标与日志更丰富)
代价:需要解析协议、通常还会承担 TLS 终止,CPU/内存开销更大,配置也更复杂。
2.1 L7 的工作原理
flowchart TD
A[Client] --> B[L7 Load Balancer]
B --> C[解析 HTTP/gRPC]
B --> D[路由决策]
D --> E[Backend 1]
D --> F[Backend 2]
D --> G[Backend 3]
B --> H[基于请求内容]
H --> I[Host/Path/Header]
2.2 L7 的请求处理流程
sequenceDiagram
participant C as Client
participant L7 as L7 Load Balancer
participant B as Backend
C->>L7: HTTP Request
L7->>L7: 解析请求
L7->>L7: 路由决策 (基于 Host/Path)
L7->>B: 转发请求
B-->>L7: HTTP Response
L7-->>C: 转发响应
Note over L7: 每个请求都经过解析和路由
2.3 L7 的路由能力
flowchart TD
A[L7 路由能力] --> B[基于 Host]
A --> C[基于 Path]
A --> D[基于 Header]
A --> E[基于 Cookie]
B --> F[多域名路由]
C --> G[路径路由]
D --> H[灰度发布]
E --> I[会话保持]
3. L4 vs L7:核心差异对比
3.1 功能对比
| 特性 | L4 | L7 |
|---|---|---|
| 转发粒度 | 连接级 | 请求级 |
| 协议理解 | 无 | HTTP/gRPC |
| 路由能力 | 简单(五元组) | 复杂(请求内容) |
| 性能 | 高吞吐、低延迟 | 相对较低 |
| CPU 开销 | 低 | 高(解析协议) |
| 配置复杂度 | 简单 | 复杂 |
3.2 性能对比
flowchart TD
A[负载均衡性能] --> B[L4]
A --> C[L7]
B --> D[高吞吐]
B --> E[低延迟]
B --> F[低 CPU]
C --> G[中等吞吐]
C --> H[中等延迟]
C --> I[高 CPU]
D --> J[适合高并发]
G --> K[适合复杂路由]
3.3 适用场景对比
flowchart TD
A[场景选择] --> B{需要协议理解?}
B -->|否| C[L4]
B -->|是| D{需要复杂路由?}
D -->|否| E[L4 或 L7]
D -->|是| F[L7]
C --> G[高性能转发]
E --> H[简单路由]
F --> I[复杂治理]
4. 选择建议(非常工程化)
- 追求极致转发性能、协议无关:优先 L4
- 需要按路径/域名路由、灰度、鉴权、限流:选择 L7
- 大型系统常见组合:入口 L7(治理)+ 内部 L4(高性能转发/连接层面)
4.1 架构组合
flowchart TD
A[用户] --> B[L7 入口]
B --> C[路由/鉴权/限流]
C --> D[L4 内部]
D --> E[高性能转发]
E --> F[Backend]
B --> G[治理能力]
D --> H[转发性能]
4.2 选型决策树
flowchart TD
A[负载均衡选型] --> B{需要协议理解?}
B -->|否| C[选择 L4]
B -->|是| D{需要复杂路由?}
D -->|否| E{需要 TLS 终止?}
E -->|是| F[选择 L7]
E -->|否| G[L4 或 L7]
D -->|是| H[选择 L7]
C --> I[高性能转发]
F --> J[TLS 终止]
H --> K[复杂治理]
5. 排查清单(线上常用)
- 瓶颈在哪:L7 是否 CPU 打满(TLS/解析)?L4 是否在 conntrack/NAT 上吃资源?
- 连接 vs 请求:问题是连接堆积(L4)还是请求排队(L7)?
- 健康检查/摘除:是否健康检查不准确导致把流量打到坏实例?
- 超时与重试:是否因重试导致流量放大(尤其 L7 更常见)?
5.1 排障流程
flowchart TD
A[负载均衡问题] --> B{性能问题?}
B -->|是| C{CPU 高?}
B -->|否| D{连接/请求堆积?}
C -->|是| E{L7?}
E -->|是| F[TLS/解析瓶颈]
E -->|否| G[conntrack/NAT 瓶颈]
D -->|连接堆积| H[L4 连接问题]
D -->|请求堆积| I[L7 请求问题]
F --> J[优化 TLS/解析]
G --> K[优化 conntrack]
H --> L[优化连接管理]
I --> M[优化请求处理]
5.2 常见问题
flowchart TD
A[常见问题] --> B[健康检查不准确]
A --> C[超时设置不当]
A --> D[重试放大流量]
A --> E[连接/请求堆积]
B --> F[流量打到坏实例]
C --> G[请求超时]
D --> H[流量放大]
E --> I[性能下降]
6. 实际案例
6.1 案例:L7 CPU 瓶颈
问题:L7 负载均衡器 CPU 占用高
分析:
- TLS 终止占用大量 CPU
- HTTP 解析开销大
- 单核热点
优化:
- 使用硬件加速(TLS offload)
- 优化 HTTP 解析
- 增加实例数
结果:CPU 占用降低 60%
6.2 案例:L4 连接数限制
问题:L4 负载均衡器连接数达到上限
分析:
- conntrack 表满
- 连接保持时间长
- 连接复用不足
优化:
- 增加 conntrack 表大小
- 优化连接保持时间
- 提高连接复用率
结果:连接数上限提升 3 倍
7. 设计原则与最佳实践
7.1 设计原则
- 性能优先:L4 用于高性能转发
- 功能优先:L7 用于复杂治理
- 组合使用:入口 L7 + 内部 L4
7.2 最佳实践
flowchart TD
A[负载均衡最佳实践] --> B[合理选型]
A --> C[健康检查]
A --> D[超时设置]
A --> E[监控告警]
B --> F[L4 高性能]
B --> G[L7 复杂治理]
C --> H[准确及时]
D --> I[合理配置]
E --> J[及时发现问题]
8. 小结
L4 强在”快”,L7 强在”懂”。选型时优先按业务需要的”治理能力”来定,再用架构组合把性能与能力同时拿到。
核心要点:
- L4 基于连接/五元组转发,性能高但功能简单
- L7 基于请求内容路由,功能强但性能相对较低
- 大型系统通常组合使用:入口 L7 + 内部 L4
- 排障时区分连接问题和请求问题
选型建议:
- 追求极致性能 → L4
- 需要复杂路由/治理 → L7
- 大型系统 → L7 入口 + L4 内部