nginx负载均衡指令least_conn的真正含义

负载均衡指令least_conn的含义,按照nginx文档的说法:

Specifies that a group should use a load balancing method where a request is passed to the server with the least number of active connections, taking into account weights of servers. If there are several such servers, they are tried in turn using a weighted round-robin balancing method.

意思是请求将被传递给当前拥有最少活跃连接的server,同时考虑权重weight的因素。

但权重因素是如何被考虑进去的呢?

查看nginx源码,在http模块ngx_http_upstream_least_conn_module.c中,决定“最少连接”的逻辑是这样的:

if (best == NULL || peer->conns * best->weight < best->conns * peer->weight)
{
    best = peer; //选择peer为当前server
    many = 0;
    p = i;

} else if (peer->conns * best->weight == best->conns * peer->weight) {
    many = 1;
}

其中peer->conns * best->weight < best->conns * peer->weight这一段很关键,我们做个不等式推到,就知道其等价于下面的不等式:

peer->conns/peer->weight < best->conns/best->weight

可见比较的其实是conns/weight的大小。上面代码的逻辑就是,当peer的conns/weight小于best时,就把peer赋值给best。因此最终best是选取的conns/weight的最小的那个。

因此least_conn指令实际的含义就是,选取活跃连接数与权重weight的比值最小者为下一个处理请求的server。当然,上一次已选的server和已达到最大连接数的server照例不在选择的范围。

例如一个upstream有三台server:

upstream backend {
    zone backends 64k;
    least_conn;
    server 10.10.10.2 weight=2;
    server 10.10.10.4 weight=1;
    server 10.10.10.6 weight=1; 
}

假如上一个请求选择了第二台10.10.10.4,下一个请求到来,通过比较剩下可用的server的conns/weight值来决定选哪一台。

如果10.10.10.2连接数为100,10.10.10.6连接数为80,因为权重分别是2和1,因此计算结果
100/2=50, 80/1 =80。因为 50 < 80 所以选择第一台而不选第三台。尽管连接数第一台要大于第三台。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要通过 Nginx 的 `least_conn` 策略实现 WebSocket 的负载均衡,需要按照以下步骤: 1. 在 Nginx 配置文件中添加两个后端服务器的地址和端口,例如: ``` upstream backend { least_conn; server 192.168.1.101:8080; server 192.168.1.102:8080; } ``` 这里我定义了一个名为 `backend` 的 upstream,使用 `least_conn` 策略,并将两个服务器的地址和端口分别指定为 `192.168.1.101:8080` 和 `192.168.1.102:8080`。 2. 在 Nginx 配置文件中添加 WebSocket 相关的设置,例如: ``` map $http_upgrade $connection_upgrade { default upgrade; '' close; } server { listen 80; server_name example.com; location / { proxy_pass http://backend; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } ``` 这里我添加了一个名为 `map` 的指令,用于将 HTTP 协议的 Upgrade 头信息转换为 Connection 头信息,以便支持 WebSocket 协议。然后,在虚拟主机的 location 中,我设置了一些 WebSocket 相关的头信息,包括 `Upgrade`、`Connection` 和 `proxy_http_version`,以确保 Nginx 能够正确地识别和转发 WebSocket 请求。 3. 最后,重启 Nginx 服务器以使配置文件生效。 这样,当客户端请求该虚拟主机时,Nginx 会按照 `least_conn` 策略将请求转发到两个后端服务器中的一个,并正确地处理 WebSocket 协议,从而实现 WebSocket 的负载均衡

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值