Appearance
负载均衡算法
Nginx提供多种负载均衡算法,可以根据不同的业务需求选择合适的算法。
轮询(Round Robin)
默认算法
按顺序依次分配请求到后端服务器。
nginx
upstream backend {
server 192.168.1.10:8080;
server 192.168.1.11:8080;
server 192.168.1.12:8080;
}
server {
listen 80;
server_name lb.example.com;
location / {
proxy_pass http://backend;
}
}特点
- 简单易用
- 请求均匀分配
- 不考虑服务器性能差异
最少连接(Least Connections)
配置方法
将请求分配到当前连接数最少的服务器。
nginx
upstream backend {
least_conn;
server 192.168.1.10:8080;
server 192.168.1.11:8080;
server 192.168.1.12:8080;
}
server {
listen 80;
server_name lb.example.com;
location / {
proxy_pass http://backend;
}
}特点
- 考虑服务器当前负载
- 适合请求处理时间差异较大的场景
- 需要配合keepalive使用
IP哈希(IP Hash)
配置方法
根据客户端IP地址分配请求,同一IP的请求总是分配到同一台服务器。
nginx
upstream backend {
ip_hash;
server 192.168.1.10:8080;
server 192.168.1.11:8080;
server 192.168.1.12:8080;
}
server {
listen 80;
server_name lb.example.com;
location / {
proxy_pass http://backend;
}
}特点
- 会话保持
- 适合有状态的应用
- 可能导致负载不均
一致性哈希(Hash)
配置方法
根据自定义key进行哈希分配。
nginx
upstream backend {
hash $request_uri consistent;
server 192.168.1.10:8080;
server 192.168.1.11:8080;
server 192.168.1.12:8080;
}
server {
listen 80;
server_name lb.example.com;
location / {
proxy_pass http://backend;
}
}特点
- 灵活的哈希key
- 支持一致性哈希
- 适合缓存场景
加权轮询(Weighted Round Robin)
配置方法
根据权重分配请求,权重高的服务器分配更多请求。
nginx
upstream backend {
server 192.168.1.10:8080 weight=3;
server 192.168.1.11:8080 weight=2;
server 192.168.1.12:8080 weight=1;
}
server {
listen 80;
server_name lb.example.com;
location / {
proxy_pass http://backend;
}
}特点
- 考虑服务器性能差异
- 灵活调整权重
- 适合服务器性能不均的场景
加权最少连接(Weighted Least Connections)
配置方法
结合权重和连接数进行分配。
nginx
upstream backend {
least_conn;
server 192.168.1.10:8080 weight=3;
server 192.168.1.11:8080 weight=2;
server 192.168.1.12:8080 weight=1;
}
server {
listen 80;
server_name lb.example.com;
location / {
proxy_pass http://backend;
}
}特点
- 综合考虑权重和负载
- 适合复杂场景
- 需要仔细调优
随机(Random)
配置方法
随机选择后端服务器。
nginx
upstream backend {
random;
server 192.168.1.10:8080;
server 192.168.1.11:8080;
server 192.168.1.12:8080;
}
server {
listen 80;
server_name lb.example.com;
location / {
proxy_pass http://backend;
}
}特点
- 简单快速
- 可能导致负载不均
- 适合测试环境
算法对比
| 算法 | 会话保持 | 负载均衡 | 性能 | 适用场景 |
|---|---|---|---|---|
| 轮询 | 否 | 好 | 高 | 通用场景 |
| 最少连接 | 否 | 很好 | 中 | 请求处理时间差异大 |
| IP哈希 | 是 | 一般 | 高 | 有状态应用 |
| 一致性哈希 | 是 | 好 | 中 | 缓存场景 |
| 加权轮询 | 否 | 好 | 高 | 服务器性能不均 |
| 加权最少连接 | 否 | 很好 | 中 | 复杂场景 |
| 随机 | 否 | 一般 | 高 | 测试环境 |
选择建议
无状态应用
推荐使用轮询或最少连接:
nginx
upstream backend {
least_conn;
server 192.168.1.10:8080;
server 192.168.1.11:8080;
}有状态应用
推荐使用IP哈希:
nginx
upstream backend {
ip_hash;
server 192.168.1.10:8080;
server 192.168.1.11:8080;
}服务器性能不均
推荐使用加权轮询:
nginx
upstream backend {
server 192.168.1.10:8080 weight=3;
server 192.168.1.11:8080 weight=1;
}缓存场景
推荐使用一致性哈希:
nginx
upstream backend {
hash $request_uri consistent;
server 192.168.1.10:8080;
server 192.168.1.11:8080;
}总结
负载均衡算法的关键点:
- 轮询:简单通用,适合大多数场景
- 最少连接:考虑负载,适合请求处理时间差异大
- IP哈希:会话保持,适合有状态应用
- 一致性哈希:灵活key,适合缓存场景
- 加权:考虑性能差异,适合服务器性能不均
根据业务需求选择合适的负载均衡算法。