负载均衡
L4 vs L7
| 维度 | L4(传输层) | L7(应用层) |
|---|---|---|
| 工作层 | TCP/UDP | HTTP/HTTPS |
| 决策依据 | IP + 端口 | URL、Header、Cookie |
| 性能 | 极高(内核态) | 较高(用户态) |
| 功能 | 简单转发 | URL 路由、Header 改写、WAF |
| 代表 | LVS、云 NLB | Nginx、HAProxy、云 ALB |
LVS 四层负载均衡
| 模式 | 说明 | 适用场景 |
|---|---|---|
| DR(直接路由) | 请求经 LVS,响应由 RS 直接回客户端 | 同 VLAN,性能最佳 |
| NAT | 请求和响应都经 LVS | 跨网段,LVS 可能瓶颈 |
| TUN(隧道) | IP 隧道封装转发 | 跨机房 |
ipvsadm 配置 DR 模式
# 添加虚拟服务(VIP:80)
ipvsadm -A -t 10.0.0.100:80 -s wrr
# 添加 Real Server
ipvsadm -a -t 10.0.0.100:80 -r 10.0.1.10:80 -g -w 3
ipvsadm -a -t 10.0.0.100:80 -r 10.0.1.11:80 -g -w 2
# -g: DR 模式 -w: 权重
HAProxy 七层负载均衡
/etc/haproxy/haproxy.cfg
global
maxconn 50000
log /dev/log local0
defaults
mode http
timeout connect 5s
timeout client 30s
timeout server 30s
option httplog
frontend web
bind *:80
bind *:443 ssl crt /etc/ssl/cert.pem
# URL 路由
acl is_api path_beg /api
use_backend api_servers if is_api
default_backend web_servers
backend web_servers
balance roundrobin
option httpchk GET /health
server web1 10.0.1.10:8080 check weight 3
server web2 10.0.1.11:8080 check weight 2
backend api_servers
balance leastconn
server api1 10.0.2.10:3000 check
server api2 10.0.2.11:3000 check
# 监控页面
listen stats
bind *:8404
stats enable
stats uri /stats
stats auth admin:password
常见面试问题
Q1: Nginx 和 HAProxy 做负载均衡怎么选?
答案:
| 维度 | Nginx | HAProxy |
|---|---|---|
| 定位 | Web 服务器 + 反向代理 | 专业负载均衡器 |
| L4 | stream 模块支持 | 原生支持 |
| 健康检查 | 开源版被动检查 | 主动 + 被动 |
| 监控 | 需额外模块 | 内置 stats 页面 |
| 适用 | Web 服务 + 反向代理 | 纯负载均衡、TCP 代理 |
小规模 Web 用 Nginx 一站式搞定,大规模或需要复杂负载均衡策略用 HAProxy。