3、负载均衡入门:负载均衡的作用、四层负载均衡(LVS/HAProxy)、七层负载均衡(Nginx)
各位同学,咱们今天聊聊负载均衡。
说实话,我刚开始做架构那会儿,觉得负载均衡不就是个流量分发器嘛,有啥好讲的?直到有一次线上事故,单机扛不住流量,直接挂了。那时候我才真正意识到——负载均衡不是锦上添花,而是高可用的命根子。
3.1 负载均衡到底在解决什么问题?
说白了,负载均衡就干三件事:
- 分摊压力:把用户请求分散到多台服务器上,别让一台机器累死。
- 提高可用性:某台机器挂了,流量自动切到其他机器,用户无感知。
- 弹性伸缩:流量大了加机器,流量小了减机器,负载均衡自动适配。
我遇到过最典型的场景:双十一大促,流量突然暴涨10倍。如果没有负载均衡,单机直接被打趴,用户全得骂娘。有了它,后端加几台机器,流量一分,稳如老狗。
核心观点:负载均衡是高可用的第一道防线。没有它,后面谈什么容灾、限流、降级都是扯淡。
3.2 四层负载均衡:LVS 和 HAProxy
四层负载均衡,工作在 OSI 模型的传输层(TCP/UDP)。它不关心你的请求内容是什么,只看 IP 和端口。
你想想看,它就像一个快递分拣员,只看包裹上的地址(IP:端口),不看里面装的是啥。所以速度极快,性能极高。
3.2.1 LVS(Linux Virtual Server)
LVS 是 Linux 内核自带的负载均衡方案。我个人的习惯是,只要对性能要求极高,首选 LVS。
它有三种工作模式:
| 模式 | 原理 | 特点 |
|---|---|---|
| NAT | 修改目标IP,转发给后端 | 简单,但后端响应要经过LVS,容易成瓶颈 |
| DR | 修改MAC地址,直接路由 | 性能最高,后端响应直接返回客户端 |
| TUN | IP隧道封装 | 适合跨机房、跨网络场景 |
我在项目中用得最多的是 DR 模式。记得有一次,客户要求单机 QPS 达到 10 万以上,我直接上了 LVS DR,后端挂 4 台 Nginx,轻松搞定。
避坑指南:我曾经在配置 LVS DR 模式时,忘了设置后端服务器的 lo 接口 VIP,结果流量死活转发不过去。嗯,这个细节一定要记住——后端机器必须配置 VIP 到 lo 接口,并且关闭 ARP 响应。
3.2.2 HAProxy
HAProxy 是另一个四层负载均衡利器。它比 LVS 更灵活,支持更丰富的健康检查和调度算法。
我建议你在以下场景用 HAProxy:
- 需要精细化的健康检查(比如检查 HTTP 状态码)
- 需要 SSL 卸载(把 HTTPS 解密交给 HAProxy)
- 需要更灵活的流量控制(比如按权重分配)
一个简单的 HAProxy 配置示例:
frontend web-front
bind *:80
default_backend web-back
backend web-back
balance roundrobin
server web1 192.168.1.10:80 check
server web2 192.168.1.11:80 check
server web3 192.168.1.12:80 check backup
你看,配置很直观。balance roundrobin 就是轮询,check 表示健康检查,backup 表示备用服务器。我一般会配一个 backup,万一主服务器全挂了,至少还有个兜底的。
3.3 七层负载均衡:Nginx
七层负载均衡,工作在应用层(HTTP/HTTPS)。它不仅能看 IP 和端口,还能看请求的 URL、Header、Cookie 甚至请求体内容。
说白了,四层是「快递分拣员」,七层就是「智能客服」——它能根据你的问题内容,把你转给对应的专家。
3.3.1 Nginx 的核心能力
Nginx 是我个人最常用的七层负载均衡。它有几个杀手锏:
- URL 路由:根据请求路径分发到不同后端
- 会话保持:通过 Cookie 或 IP hash 保证同一用户请求到同一台机器
- 限流限速:防止恶意流量打垮后端
- 缓存加速:静态资源直接缓存,减少后端压力
举个例子,假设你的系统有用户服务和订单服务,用 Nginx 可以这样配置:
upstream user_srv {
server 192.168.1.20:8080;
server 192.168.1.21:8080;
}
upstream order_srv {
server 192.168.1.30:8080;
server 192.168.1.31:8080;
}
server {
listen 80;
location /user/ {
proxy_pass http://user_srv;
}
location /order/ {
proxy_pass http://order_srv;
}
}
这样,/user/ 开头的请求去用户服务,/order/ 开头的去订单服务。是不是很清晰?
3.3.2 四层 vs 七层,怎么选?
很多同学问我:到底该用四层还是七层?我一般这样回答:
| 场景 | 推荐方案 | 原因 |
|---|---|---|
| 纯 TCP/UDP 流量 | 四层(LVS/HAProxy) | 性能高,延迟低 |
| HTTP 应用,需要路由 | 七层(Nginx) | 灵活,能按 URL 分发 |
| 超高并发(百万级) | 四层 + 七层组合 | LVS 扛流量,Nginx 做路由 |
| 需要 SSL 卸载 | 七层(Nginx/HAProxy) | 后端不用处理 HTTPS,减轻压力 |
注意:我曾经见过一个团队,所有流量都走七层 Nginx,结果 QPS 到 5 万就扛不住了。后来在前面加了一层 LVS,直接干到 20 万。记住——四层负责「快」,七层负责「聪明」,两者配合才是王道。
3.4 小结
今天咱们聊了负载均衡的入门知识。总结一下:
- 负载均衡的核心是分摊压力、提高可用性、弹性伸缩
- 四层负载均衡(LVS/HAProxy)性能高,适合 TCP/UDP 流量
- 七层负载均衡(Nginx)灵活,适合 HTTP 应用
- 实际生产环境,往往是四层 + 七层组合使用
下一章,我会带大家深入 Nginx 的配置细节,包括健康检查、会话保持、限流等实战技巧。到时候咱们再细聊。
一句话记住:四层管「通不通」,七层管「去哪通」。搞懂这个,负载均衡你就入门了。