本文详细剖析了Nginx常用负载均衡算法的核心原理和适用场景,包括默认的轮询(Round Robin)算法、加权轮询算法、IP哈希算法、最少连接数算法以及哈希算法。文章通过清晰的理论解析与具体配置示例,帮助开发者深入理解不同算法的特点与局限性,为实际场景选择合适的负载均衡策略提供参考依据。
一.轮询(Round Robin)算法(默认)
1.原理
-
将客户端请求依次循环分配到每个服务器上。
-
无状态,简单高效,但无法考虑服务器性能和负载情况。
2.应用场景
-
各服务器配置、性能相近且请求处理时间相对均衡。
3.示例
upstream myapp {
server 192.168.1.101;
server 192.168.1.102;
server 192.168.1.103;
}
server {
listen 80;
location / {
proxy_pass http://myapp;
}
}
以上配置,客户端请求将依次转发到3台服务器。
二.加权轮询(Weighted Round Robin)
1.原理
-
在轮询基础上,根据设定的权重(weight)值,提高或降低服务器被选择的概率。
-
权重越高,被访问次数越多。
2.应用场景
-
服务器硬件差异较大,性能存在明显差异的场景。
3.示例
upstream myapp {
server 192.168.1.101 weight=3; # 权重3,占请求的50%
server 192.168.1.102 weight=2; # 权重2,占请求的33%
server 192.168.1.103 weight=1; # 权重1,占请求的17%
}
server {
listen 80;
location / {
proxy_pass http://myapp;
}
}
此时,每6个请求中:
-
服务器1分得3个
-
服务器2分得2个
-
服务器3分得1个
三.IP Hash(基于客户端IP哈希算法)
1.原理
-
根据客户端的IP地址进行哈希运算,将来自同一IP的请求始终分发给固定的一台服务器。
-
保证会话一致性(Session Sticky),常用于保持用户登录状态。
2.应用场景
-
用户登录态的Web应用(如购物车、电商、登录会话管理等)。
3.示例
upstream myapp {
ip_hash;
server 192.168.1.101;
server 192.168.1.102;
server 192.168.1.103;
}
server {
listen 80;
location / {
proxy_pass http://myapp;
}
}
来自相同客户端IP的所有请求,都将转发到同一台服务器。
四.最少连接数(Least Connections)
1.原理
-
优先分配请求到当前连接数最少的服务器。
-
动态考虑服务器实际负载情况,适用于处理时间不同的请求,有效避免某台服务器过载。
2.应用场景
-
后端服务器性能差异较大,或请求处理时长不稳定的情况。
3.示例
upstream myapp {
least_conn;
server 192.168.1.101;
server 192.168.1.102;
server 192.168.1.103;
}
server {
listen 80;
location / {
proxy_pass http://myapp;
}
}
Nginx实时统计各服务器连接数,总是选择连接数最少的服务器进行转发。
五.哈希算法(Hash)
1.原理
-
根据特定请求属性(如URL、Cookie、Header)进行哈希计算,将具有相同哈希值的请求分发到同一台服务器。
-
常用于缓存场景,提升缓存命中率。
2.应用场景
-
CDN缓存,提升内容缓存命中率。
-
根据URI实现高效缓存策略。
3.示例(基于URI)
upstream myapp {
hash $request_uri consistent;
server 192.168.1.101;
server 192.168.1.102;
server 192.168.1.103;
}
server {
listen 80;
location / {
proxy_pass http://myapp;
}
}
同一个URI总会被转发到同一服务器,有利于提高缓存利用率。
六.各种算法的比较总结
算法 | 优点 | 缺点 | 适用场景 |
---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
以上算法选择参考建议,如下所示:
-
若服务器性能均衡,简单使用轮询。
-
若需要考虑性能差异,使用加权轮询。
-
若保持用户状态优先,使用 IP Hash。
-
若实时平衡负载,则用最少连接数算法。
-
若提升缓存效率(如CDN),使用基于哈希的负载均衡算法。
知识星球服务内容:Dify源码剖析及答疑,Dify对话系统源码,NLP电子书籍报告下载,公众号所有付费资料。加微信buxingtianxia21进NLP工程化资料群。
(文:NLP工程化)