负载均衡笔记
一、什么是负载均衡
负载均衡就是把用户请求分发到多台服务器上,让多台服务器共同对外提供服务。
例如原来只有一台 Tomcat:
text
用户 -> Tomcat
当访问量变大后,一台 Tomcat 可能扛不住,可以改成多台 Tomcat:
text
用户 -> 负载均衡器 -> Tomcat1
-> Tomcat2
-> Tomcat3
负载均衡器负责接收用户请求,然后按照一定规则转发给后端服务器。
二、为什么需要负载均衡
负载均衡主要解决这些问题:
- 提高并发能力:多台服务器一起处理请求。
- 提高系统可用性:某台后端服务器故障后,可以把请求转给其他服务器。
- 方便扩容:访问量变大时,可以增加新的后端节点。
- 统一入口:用户只访问一个地址,不需要关心后面有多少台服务器。
- 支持灰度发布:可以让一小部分流量先访问新版本。
三、常见角色
| 名称 | 含义 |
|---|---|
| Client | 客户端,用户浏览器或 APP |
| Load Balancer | 负载均衡器 |
| Real Server | 真实服务器,真正处理请求的后端 |
| VIP | 虚拟 IP,对外提供访问入口 |
| Tomcat | Java Web 应用服务器 |
| LVS | Linux 内核级四层负载均衡 |
| HAProxy | 常用四层/七层负载均衡软件 |
| Nginx | 常用 Web 服务器、反向代理和七层负载均衡软件 |
| Keepalived | 实现 VIP 漂移和高可用 |
四、四层负载均衡和七层负载均衡
1. 四层负载均衡
四层指 OSI 七层模型中的传输层。
四层负载均衡主要根据:
text
IP + 端口
进行转发。
例如:
text
用户访问 192.168.1.100:80
负载均衡器转发到 192.168.1.11:8080
负载均衡器转发到 192.168.1.12:8080
常见软件:
- LVS
- HAProxy 的 TCP 模式
- Nginx stream 模块
特点:
- 性能高。
- 转发效率好。
- 不关心 HTTP 请求内容。
- 不能根据 URL、Cookie、Header 做复杂转发。
2. 七层负载均衡
七层指 OSI 七层模型中的应用层。
七层负载均衡可以理解 HTTP 请求内容,例如:
- 域名
- URL 路径
- 请求头
- Cookie
- 请求方法
例如:
text
/api -> Tomcat 应用服务器
/static -> 静态资源服务器
/admin -> 后台管理服务器
常见软件:
- HAProxy
- Nginx
- Apache HTTP Server
特点:
- 转发规则更灵活。
- 适合 Web 应用。
- 可以做 HTTP 健康检查。
- 可以做会话保持、灰度发布、路径转发。
- 性能通常不如纯四层转发极限高。
五、LVS
LVS 是 Linux Virtual Server 的缩写,是 Linux 内核级负载均衡。
LVS 工作在四层,性能非常高,适合做大流量入口。
1. LVS 重要概念
| 概念 | 说明 |
|---|---|
| Director Server | LVS 负载均衡器 |
| Real Server | 后端真实服务器 |
| VIP | 对外访问的虚拟 IP |
| DIP | LVS 负载均衡器自己的 IP |
| RIP | 后端真实服务器 IP |
| CIP | 客户端 IP |
2. LVS 常见模式
| 模式 | 说明 |
|---|---|
| NAT 模式 | 请求和响应都经过 LVS,配置简单,但 LVS 压力较大 |
| DR 模式 | 请求经过 LVS,响应由后端直接返回客户端,性能高 |
| TUN 模式 | 通过隧道转发,适合跨网络场景 |
学习阶段重点掌握:
text
LVS-NAT
LVS-DR
生产环境中,LVS-DR 比较常见,因为返回流量不经过 LVS,性能更好。
3. LVS 常见调度算法
| 算法 | 名称 | 说明 |
|---|---|---|
| rr | 轮询 | 请求依次分配给后端服务器 |
| wrr | 加权轮询 | 权重高的服务器分到更多请求 |
| lc | 最少连接 | 优先分配给连接数少的服务器 |
| wlc | 加权最少连接 | 结合权重和连接数 |
| sh | 源地址哈希 | 同一个客户端尽量访问同一台后端 |
六、HAProxy
HAProxy 是常用的负载均衡软件,可以做四层负载均衡,也可以做七层负载均衡。
HAProxy 常用于 Web 应用、Tomcat 集群、API 服务入口。
1. HAProxy 优点
- 配置清晰。
- 支持四层和七层。
- 支持健康检查。
- 支持后端权重。
- 支持会话保持。
- 支持按域名、URL、Header 转发。
- 日志和排错比较方便。
2. HAProxy 简单架构
text
用户
|
HAProxy:80
|
+--------------------+
| |
Tomcat1:8080 Tomcat2:8080
3. HAProxy 配置示例
conf
global
daemon
maxconn 4096
defaults
mode http
timeout connect 5s
timeout client 50s
timeout server 50s
frontend web_front
bind *:80
default_backend tomcat_servers
backend tomcat_servers
balance roundrobin
option httpchk GET /
server tomcat1 192.168.1.11:8080 check
server tomcat2 192.168.1.12:8080 check
说明:
bind *:80:监听 80 端口。default_backend tomcat_servers:默认转发到 Tomcat 后端组。balance roundrobin:使用轮询算法。check:开启健康检查。
七、Nginx
Nginx 是非常常见的 Web 服务器,也经常用来做反向代理和负载均衡。
它在实际项目中通常有三个常见角色:
- 静态资源服务器:处理 HTML、CSS、JS、图片等静态文件。
- 反向代理服务器:接收用户请求,再转发给后端 Tomcat。
- 七层负载均衡器:根据 HTTP 请求把流量分发给多台后端服务器。
1. 正向代理和反向代理
正向代理代理的是客户端。
text
客户端 -> 代理服务器 -> 目标网站
例如公司内网通过代理服务器访问外部网站。
反向代理代理的是服务端。
text
用户 -> Nginx -> Tomcat
用户访问的是 Nginx,不直接访问后端 Tomcat。
在负载均衡中,Nginx 通常作为反向代理服务器使用。
2. Nginx 负载均衡架构
text
用户
|
Nginx:80
|
+--------------------+
| |
Tomcat1:8080 Tomcat2:8080
用户访问:
text
http://192.168.1.100
Nginx 根据配置把请求转发到后端 Tomcat。
3. Nginx 负载均衡配置示例
nginx
upstream tomcat_servers {
server 192.168.1.11:8080;
server 192.168.1.12:8080;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://tomcat_servers;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
说明:
upstream tomcat_servers:定义后端服务器组。server 192.168.1.11:8080:添加一台 Tomcat。proxy_pass http://tomcat_servers:把请求转发给后端服务器组。X-Real-IP:把真实客户端 IP 传给后端。X-Forwarded-For:记录经过的代理链路。
4. Nginx 常见负载均衡策略
轮询
默认策略,请求依次分发给后端服务器。
nginx
upstream tomcat_servers {
server 192.168.1.11:8080;
server 192.168.1.12:8080;
}
加权轮询
权重越高,分配到的请求越多。
nginx
upstream tomcat_servers {
server 192.168.1.11:8080 weight=3;
server 192.168.1.12:8080 weight=1;
}
含义:
text
Tomcat1 处理更多请求
Tomcat2 处理较少请求
ip_hash
同一个客户端 IP 尽量访问同一台后端服务器。
nginx
upstream tomcat_servers {
ip_hash;
server 192.168.1.11:8080;
server 192.168.1.12:8080;
}
这个策略常用于简单的会话保持。
5. Nginx 健康检查
开源版 Nginx 对后端健康检查主要是被动检查。
常见参数:
nginx
upstream tomcat_servers {
server 192.168.1.11:8080 max_fails=3 fail_timeout=30s;
server 192.168.1.12:8080 max_fails=3 fail_timeout=30s;
}
说明:
max_fails=3:失败 3 次后认为后端暂时不可用。fail_timeout=30s:在 30 秒内统计失败次数,并在失败后暂停一段时间。
如果需要更强的主动健康检查,可以使用 Nginx Plus,或者选择 HAProxy。
6. Nginx 动静分离
Nginx 很适合处理静态资源,Tomcat 更适合处理 Java 动态请求。
典型架构:
text
用户 -> Nginx
|-> 静态资源:Nginx 直接返回
|-> 动态请求:转发给 Tomcat
示例:
nginx
server {
listen 80;
location /static/ {
root /data/www;
}
location / {
proxy_pass http://tomcat_servers;
}
}
好处:
- 减轻 Tomcat 压力。
- 静态资源访问速度更快。
- 后端应用服务器专心处理业务逻辑。
7. Nginx 和 HAProxy 的区别
| 对比项 | Nginx | HAProxy |
|---|---|---|
| 主要定位 | Web 服务器、反向代理、负载均衡 | 专业负载均衡软件 |
| 静态资源处理 | 很强 | 通常不用于静态资源 |
| 七层转发 | 支持 | 支持 |
| 四层转发 | 通过 stream 模块支持 | 原生支持 |
| 健康检查 | 开源版偏基础 | 更强、更适合负载均衡 |
| 配置复杂度 | 上手简单 | 负载均衡配置更专业 |
| 常见场景 | 网站入口、动静分离、反向代理 | 高并发转发、API/Tomcat 集群 |
简单理解:
text
Nginx:Web 入口能力强,适合静态资源和反向代理。
HAProxy:负载均衡能力专业,适合复杂转发和健康检查。
八、Keepalived
Keepalived 主要用来解决负载均衡器本身的单点故障。
如果只有一台 HAProxy:
text
用户 -> HAProxy -> Tomcat
一旦 HAProxy 挂了,整个系统就无法访问。
所以一般会准备两台 HAProxy:
text
HAProxy1: 192.168.1.21
HAProxy2: 192.168.1.22
VIP: 192.168.1.100
Keepalived 让 VIP 默认绑定在主节点上:
text
用户 -> VIP -> HAProxy1 -> Tomcat
如果 HAProxy1 故障,VIP 自动漂移到 HAProxy2:
text
用户 -> VIP -> HAProxy2 -> Tomcat
这个过程叫:
text
主备切换
VIP 漂移
高可用
Keepalived 底层使用 VRRP 协议。
Keepalived 主备示例
主节点:
conf
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.1.100
}
}
备节点:
conf
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.1.100
}
}
主备配置的关键区别:
- 主节点
state MASTER - 备节点
state BACKUP - 主节点优先级更高,例如
priority 100 - 备节点优先级更低,例如
priority 90
九、Tomcat 在负载均衡中的作用
Tomcat 是后端应用服务器,真正处理业务请求。
例如一个 Java Web 项目部署在两台服务器上:
text
Tomcat1: 192.168.1.11:8080
Tomcat2: 192.168.1.12:8080
用户不直接访问 Tomcat,而是访问负载均衡器:
text
用户 -> HAProxy/LVS -> Tomcat
这样做的好处:
- 后端 Tomcat 可以横向扩容。
- 某台 Tomcat 挂了,可以自动摘除。
- 用户只记一个入口地址。
- 可以对 Tomcat 做滚动发布。
十、典型架构:Keepalived + HAProxy/Nginx + Tomcat
这是学习阶段和中小型生产环境中很常见的一种架构。
text
VIP: 192.168.1.100
|
+-------------+-------------+
| |
HAProxy/Nginx1 + Keepalived HAProxy/Nginx2 + Keepalived
192.168.1.21 192.168.1.22
MASTER BACKUP
| |
+-------------+-------------+
|
+----------+----------+
| |
Tomcat1:8080 Tomcat2:8080
192.168.1.11 192.168.1.12
访问流程:
- 用户访问
192.168.1.100。 - VIP 当前在 HAProxy1 上。
- HAProxy1 或 Nginx1 根据负载均衡算法选择一个 Tomcat。
- Tomcat 处理请求并返回结果。
- 如果 Tomcat1 故障,HAProxy 不再把请求发给 Tomcat1。
- 如果 HAProxy1 或 Nginx1 故障,Keepalived 把 VIP 漂移到备用节点。
十一、真实案例一:电商活动访问量暴增
场景:
一个电商网站平时访问量不大,只有一台 Tomcat:
text
用户 -> Tomcat1
平时没有问题,但到了促销活动时,大量用户同时访问商品详情页和下单接口,Tomcat1 CPU 升高,请求变慢,甚至服务不可用。
改造方案:
text
用户 -> Nginx/HAProxy -> Tomcat1
-> Tomcat2
-> Tomcat3
处理方式:
- 部署 3 台 Tomcat。
- Nginx 或 HAProxy 使用轮询、加权轮询等算法分发请求。
- 对 Tomcat 开启健康检查。
- 后续访问量继续增加时,再增加 Tomcat4、Tomcat5。
效果:
- 单台 Tomcat 压力下降。
- 整体并发能力提高。
- 某台 Tomcat 故障不会导致整个网站不可访问。
十二、真实案例二:后台系统不能中断
场景:
公司内部有一个订单管理系统,后端是两台 Tomcat,前面有一台 HAProxy:
text
用户 -> HAProxy -> Tomcat1
-> Tomcat2
虽然 Tomcat 已经有两台,但是 HAProxy 只有一台。如果 HAProxy 宕机,用户仍然无法访问系统。
改造方案:
text
用户 -> VIP
|
+-> HAProxy1 + Keepalived
|
+-> HAProxy2 + Keepalived
处理方式:
- 准备两台 HAProxy。
- 两台 HAProxy 配置相同的后端 Tomcat。
- 两台机器安装 Keepalived。
- 配置同一个 VIP。
- HAProxy1 作为主节点,HAProxy2 作为备节点。
效果:
- 正常情况下 VIP 在 HAProxy1 上。
- HAProxy1 故障后,VIP 自动漂移到 HAProxy2。
- 用户仍然访问同一个 VIP,不需要修改地址。
十三、真实案例三:根据 URL 分流
场景:
一个网站包含普通页面、接口服务和后台管理:
text
/ 普通页面
/api 接口服务
/admin 后台管理
如果所有请求都转发到同一组 Tomcat,管理不方便,也不利于扩容。
改造方案:
text
/api -> API Tomcat 集群
/admin -> Admin Tomcat 集群
/static -> 静态资源服务器
这种情况适合使用七层负载均衡,例如 Nginx 或 HAProxy。
效果:
- 不同业务可以独立扩容。
- API 压力大时,只扩容 API Tomcat。
- 后台管理可以单独做访问控制。
- 静态资源可以交给专门的静态服务器或 CDN。
十四、真实案例四:灰度发布
场景:
项目要发布新版本,但不希望所有用户立即访问新版本。
原来:
text
用户 -> Tomcat 旧版本
改造后:
text
大部分用户 -> Tomcat 旧版本
少量用户 -> Tomcat 新版本
可以在 HAProxy 中通过权重控制流量:
text
Tomcat-old 权重 90
Tomcat-new 权重 10
效果:
- 先让少量流量访问新版本。
- 观察日志、错误率、响应时间。
- 如果新版本稳定,再逐步提高权重。
- 如果新版本有问题,可以快速切回旧版本。
十五、真实案例五:Nginx 动静分离
场景:
一个 Java Web 网站既有动态接口,也有大量静态资源:
text
/api 动态接口
/login 登录页面
/static CSS、JS、图片
/upload 用户上传文件
如果所有请求都交给 Tomcat:
text
用户 -> Tomcat
Tomcat 不仅要处理业务逻辑,还要返回图片、CSS、JS,压力会比较大。
改造方案:
text
用户 -> Nginx
|-> /static Nginx 直接返回
|-> /upload Nginx 直接返回
|-> /api 转发给 Tomcat 集群
|-> /login 转发给 Tomcat 集群
效果:
- 静态资源由 Nginx 高效处理。
- Tomcat 专心处理动态业务请求。
- 页面加载速度更快。
- 后端服务器压力更小。
十六、LVS、HAProxy、Nginx、Keepalived 的选择
| 场景 | 推荐 |
|---|---|
| 学习负载均衡 | HAProxy + Tomcat |
| Web 应用负载均衡 | Nginx 或 HAProxy |
| 静态资源和动静分离 | Nginx |
| 需要高可用入口 | Keepalived + Nginx/HAProxy |
| 超大流量四层转发 | LVS |
| 需要按 URL、域名转发 | Nginx 或 HAProxy |
| 需要更专业的健康检查 | HAProxy |
| 负载均衡器不能单点 | Keepalived |
简单记忆:
text
Tomcat:真正处理请求
Nginx:Web 入口、静态资源、反向代理、七层负载均衡
HAProxy:分发 HTTP/TCP 请求
LVS:高性能四层转发
Keepalived:保证入口高可用
十七、学习实验建议
实验一:两台 Tomcat + 一台 Nginx
目标:
text
用户 -> Nginx -> Tomcat1/Tomcat2
验证:
- 访问 Nginx 地址能看到 Tomcat 页面。
- 多次刷新,请求能分发到不同 Tomcat。
- 停掉 Tomcat1 后,请求还能访问 Tomcat2。
实验二:两台 Tomcat + 一台 HAProxy
目标:
text
用户 -> HAProxy -> Tomcat1/Tomcat2
验证:
- 访问 HAProxy 地址能看到 Tomcat 页面。
- 后端 Tomcat 健康检查生效。
- 停掉 Tomcat1 后,请求还能访问 Tomcat2。
实验三:两台 Nginx/HAProxy + Keepalived
目标:
text
用户 -> VIP -> Nginx1/Nginx2 -> Tomcat
用户 -> VIP -> HAProxy1/HAProxy2 -> Tomcat
验证:
- 正常情况下 VIP 在主节点。
- 停掉主节点后,VIP 漂移到备节点。
- 用户仍然访问同一个 VIP。
实验四:LVS-DR
目标:
text
用户 -> LVS -> Real Server
验证:
- 用户访问 VIP。
- LVS 负责请求转发。
- 后端 Real Server 直接返回响应。
- LVS 压力比 NAT 模式更小。
十八、总结
负载均衡的核心思想是:
text
多台服务器一起对外提供服务,由负载均衡器统一分发请求。
常见组合:
text
Nginx + Tomcat
HAProxy + Tomcat
Keepalived + Nginx + Tomcat
Keepalived + HAProxy + Tomcat
Keepalived + LVS + Tomcat
LVS + HAProxy + Tomcat
掌握:
- Tomcat 多节点部署。
- Nginx 反向代理和动静分离。
- HAProxy 转发请求和健康检查。
- Keepalived VIP 漂移。
- LVS NAT 和 DR 模式。
记忆:
text
Tomcat 干活,Nginx/HAProxy/LVS 分活,Keepalived 保证分活的人不倒。