【Nginx的负载均衡(调度算法)及容错处理】要须心地收汗马,孔孟行世目杲杲。这篇文章主要讲述Nginx的负载均衡(调度算法)及容错处理相关的知识,希望能为你提供帮助。
nginx常用的负载均衡调度算法
1. 轮询(请求被依次分配到上游服务器)
upstream swoole_serverserver 192.168.1.10:9501;
server 192.168.1.11:9501;
server 192.168.1.12:9501;
2. 加权轮询(轮询的同时,权重高一点的上游服务器被分配的请求多一些)
upstream swoole_serverserver 192.168.1.10:9501 weigth=10;
server 192.168.1.11:9501 weigth=6;
server 192.168.1.12:9501 weigth=8;
3. ip hash(可以保证同一IP的请求被转发到同一台上游服务器)
upstream swoole_serverip_hash;
server 192.168.1.10:9501;
server 192.168.1.11:9501;
server 192.168.1.12:9501;
4. url hash(可以保证相同的url的请求被转发到同一台上游服务器)
upstream swoole_serverurl_hash;
server 192.168.1.10:9501;
server 192.168.1.11:9501;
server 192.168.1.12:9501;
5. 最少连接数(连接处理少的上游服务器会被优先分配请求进行处理)
upstream swoole_serverleast_conn;
server 192.168.1.10:9501;
server 192.168.1.11:9501;
server 192.168.1.12:9501;
6. upstream-fair第三方服务均衡调度模块参见:https://github.com/gnosek/nginx-upstream-fair
upstream swoole_serverfair;
server 192.168.1.10:9501;
server 192.168.1.11:9501;
server 192.168.1.12:9501;
......
7. 其他自定义调度算法(按照自定义规则评分)
常用规则如下:
1.cpu占用
2.内存占用
3.连接数
......
负载均衡的容错处理upstream 失败重试机制
- max_fails 最大失败次数
- fail_timeout 在指定时间内失败
示例如下:
upstream swoole_server#默认轮询
server 192.168.1.10:9501 max_fails=2 fails_timeout=20s;
server 192.168.1.11:9501 max_fails=2 fails_timeout=20s;
server 192.168.1.12:9501 max_fails=2 fails_timeout=20s;
#server 192.168.1.12:9501 max_fails=2 fails_timeout=20s;
#在20s内出现两次失败,则该台上游服务器会被熔断20s,20s后会再次重试转发请求给该台服务器。
更精确的配置出错重试
- proxy_next_upstream 指定什么情况下才进行重试
- proxy_next_upstream_tries 指定失败后进行重试的累积次数(默认0表示不限制次数)
- proxy_connect_timeout nginx连接后端的超时时间
- proxy_read_timeout 连接成功后,后端服务器的响应时间(代理接收超时时间)
- proxy_send_timeout #后端服务器的回传时间(代理发送超时时间)
location /server #指定什么情况下才进行重试
proxy_next_upstream error timeout http_500;
#指定失败后进行重试的累积次数(0表示不限制)
proxy_next_upstream_tries0;
#超时相关设置proxy_connect_timeout 60s;
#nginx连接后端的超时时间
proxy_read_timeout 60s;
#连接成功后,后端服务器的响应时间(代理接收超时时间)
proxy_send_timeout 60s;
#后端服务器的回传时间(代理发送超时时间)proxy_pass http://swoole_server;
特定场景下负载均衡下存在的问题
#upstream负载均衡的系统默认配置
proxy_next_upstream error timeout;
#默认是error错误和timeout超时
proxy_next_upstream_tries0;
如果上游服务器的最大执行时间为100s,nginx的代理接收响应时间为60s。
此时进行的重试机制,则存在问题。
假如:张三进行充值操作,请求发给上游服务器A,A执行时间为100s,proxy_read_timeout为60s
于是负载均衡重试充值请求,将请求发给上游服务器B,再次进行充值。最后导致张三充值了两次。
推荐阅读
- #yyds干货盘点# 解决华为机试(杨辉三角的变形)
- Linux系列(systemctl/service redhat6 redhat7区别)
- FPGA设计实用分享02 之 XILINX的可参数化FIFO
- docker 的基本操作指令 2
- Linux系列(vi 用/查找到字符 切换到下一个)
- 微服务工程中,基础组件应用
- Docker容器引擎——安装部署和镜像容器的基本操作
- Dubbo服务如何优雅的校验参数
- #yyds干货盘点# 在120篇系列专栏中,才能学会 python beautifulsoup4 模块,7000字博客+爬第九工场网