说说 nginx 负载均衡的几种算法
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观
前言
在 nginx
中,我们通过 upstream
命令来实现的,由 ngx_http_upstream_module 模块提供支持。
nginx 负载均衡算法
- 1:轮询(默认)
每个请求按照时间顺序逐一分配到下游的服务节点,如果其中某一节点故障,nginx 会自动剔除故障系统使用户使用不受影响。
- 2.权重(weight)
在配置文件中对下游的服务节点指定权重值 weight, weight 值越大则被分配的评率越高,一般这种负载均衡,用于节点的配置情况不一样,有的可能配置高,有的配置低。
- 3.ip_hash
对每个请求,针对 ip 进行 hash, 然后分配到后台节点,这样一来,同一 ip 会被固定分配到下游固定服务上。它能够暂时的解决集群环境中容器之间 session 共享的问题,但是不是解决的根本之道,只是权宜之策,我们试想,如果访问的好好的,家里的路由器被重启了,或者运营商分配给你的 ip 地址改变了,那么你再次访问的时候,新的 ip 就可能被分配到新的服务上,之前的 session 也就失效了。
- 4.least_conn (最少连接调度算法)
最少连接调度算法,对下游服务中连接情况,优先选择连接数最少的服务分配。
- 5.least_time (最小响应时间)
最小响应时间, 计算节点平均响应时间,然后取响应最快的那个,分配更高权重。
upstream 中可附加指令
-
1:
down
,表示当前的 server 不参与负载均衡。 -
2:
backup
, 预留的备份机,当其他所有非 backup 的机器出现故障或者忙的时候,才会请求 backup 机器,因此这台机器的压力最轻。 -
3:
max_fails
,允许请求失败的次数,默认为 1,当超过最大次数时,返回proxy_next_upstream
模块定义的错误。 -
4:
fail_timeout
, 在经历了max_fails
次失败后,暂停服务的时间,max_fails
可以和fail_timeout
一起使用。 -
5:
keepalive
连接数 N; 为每个 worker 进程保留的空闲的长连接数量, 可节约 nginx 端口,并减少连接管理的消耗
如何配置?
轮询负载
upstream webserver {
server 192.168.214.133:80 max_fails=3 fail_timeout=30s;
server 192.168.214.187:80 max_fails=3 fail_timeout=30s;
}
测试:
[root@nfs ~]# for i in {1..10};do curl www.a.com/index.html;done
web server 1 page
web server 2 page
web server 1 page
web server 2 page
web server 1 page
web server 2 page
web server 1 page
web server 2 page
web server 1 page
web server 2 page
加权轮询
upstream webserver {
server 192.168.214.133:80 weight=3 max_fails=3 fail_timeout=30s;
server 192.168.214.187:80 max_fails=3 fail_timeout=30s;
}
测试:
[root@nfs ~]# for i in {1..10};do curl www.a.com/index.html;done
web server 2 page
web server 1 page
web server 1 page
web server 1 page
web server 2 page
web server 1 page
web server 1 page
web server 1 page
web server 2 page
web server 1 page
ip_hash
upstream webserver {
ip_hash;
server 192.168.214.133:80 max_fails=3 fail_timeout=30s;
server 192.168.214.187:80 max_fails=3 fail_timeout=30s;
}
测试:
[root@nfs ~]# for i in {1..10};do curl www.a.com/index.html;done
web server 2 page
web server 2 page
web server 2 page
web server 2 page
web server 2 page
web server 2 page
web server 2 page
web server 2 page
web server 2 page
web server 2 page
least_conn 最少连接
upstream webserver {
least_conn;
server 192.168.214.133:80 weight=3 max_fails=3 fail_timeout=30s;
server 192.168.214.187:80 max_fails=3 fail_timeout=30s;
}
测试:
[root@nfs ~]# for i in {1..10};do curl www.a.com/index.html;done
web server 1 page
web server 1 page
web server 2 page
web server 1 page
web server 1 page
web server 1 page
web server 2 page
web server 1 page
web server 1 page
web server 1 page