之前有很多朋友问关于nginx的upstream模块中max_fails及fail_timeout,这两个指令,分别是配置关于负载均衡过程中,对于上游(后端)服务器的失败尝试次数和不可用时间,很多人不是很理解这两个参数到底怎么用,以及具体的含义
先看官网文档中的描述
官网文档中解释max_fails是指在fail_timeout配置的时间内,服务器通信失败的次数,默认为1,即在fail_timeout时间内,1次请求失败即不再尝试,将请求根据hash规则,转发到下一个上游服务
fail_timeout有两种含义:
当已经确认上游服务不可用时,是指与上游服务器通信失败次数的时间
服务器不可用的时间段
默认是10s
文字不是很好理解,搭建个实验环境,环境如下:
nginx
php-fpm(x2)
nginx通过fast-cgi将php请求转发到php-fpm,这里php-fpm服务即上游服务,设置upstream,负载php-fpm
upstream按照默认配置,即max_fails=1,fail_timeout=10
现在通过tailf分别监听两个php-fpm日志
请求4次,因为是默认轮询的,所以可以看时间,轮询将请求分发到两个php-fpm上游
可以从上面的日志中看到,按照轮询规则,下次请求应该落到php-fpm2上面,接着,关掉php-fpm1,继续请求
可以看到,php-fpm1肯定是不响应了,php-fpm2正常响应,接着看下nginx日志
可以看到,关掉php-fpm1后,发起的请求,本来第二次请求(1758)应该分发到php-fpm1的,然后从nginx错误日志可以看到,连接php-fpm1失败,这里只做了一次失败尝试,然后nginx将请求转发到php-fpm2处理了
接着将max_fails设置为2,继续上面的请求
开启php-fpm1,继续请求,两个负载轮询转发请求
接着继续关掉php-fpm1,连续发起多次请求,查看日志
所有请求都在php-fpm2上,看nginx错误日志
两次轮询到php-fpm1的时候,失败,之后不会再将请求分发到php-fpm1上游服务
接着,不开启php-fpm1,继续发起多次请求,由于默认的fail_timeout=10,所以在上面的失败检测10s之后再次发起请求,查看日志
继续分发到php-fpm2,接着看nginx错误日志
可以看到,过了fail_timeout的时间后,ngxin会再次将请求发往fpm-php1进行尝试,尝试2次失败后,在fail_timeout时间内,不会再将请求分发,
这里有几个误区:
nginx记录了连接上游失败,这个请求就返回错误请求,或这个请求丢失没处理
这个理解是错误的,nginx只是记录了失败的请求到日志,并将这个请求又转发到了可用的其他上游服务,知道所有上游都不可用时,才会返回错误状态
max_fails是指连续请求失败的次数
max_fails是在fail_timeout指定的时间内的失败次数,请求还是按照配置的负载均衡算法来走,并不是第一次请求失败之后,继续将这个请求在尝试一次,达到失败次数之后,标记为不可用
fail_timeout越短越好
当访问量大的时候,fail_timeout设置太短,会导致不断的尝试与不可用上游的连接,耗费大量的tcp资源进行连接
fail_timeout越长越好
当访问量大的时候,fail_timeout设置太长,会导致负载不均衡,有可能会击穿某个上游后端,达不到负载的效果
水晶光电在半导体新产品、新技术进行业务布局
PLC设计的油田污水处理模糊控制系统
诺基亚N系列重归?360手机曝光自家新机N5
弱电机柜布线这样做 告别脏乱差
一文详解雷电接口的前世今生
详解Nginx负载均衡配置误区
新时代新发展,西部最大年度盛会闪耀登场!
沪电股份5G+汽车板驱动增长 毫米波雷达用PCB增添新动力
MAX4999 USB 2.0差分8:1复用器
基于STM32的PS2遥控小车
对英飞凌有史最大手笔30亿美元购IR的几点看法
柔性导电复合材料:青岛科技大自修复有机硅应变传感器取得新进展
精谱测控熔喷无纺布表面污点在线检测设备高精度
教程:投影仪的Soc芯片参数怎么看?AmlogiT982性能表现如何?
创维A4演绎极简智能生活新潮流,免遥控的新智能时代
Arcolectric与BioCote开发独特的抗菌电子器件
lm1117稳压电路图
Si3933 125KHz三通道低功耗唤醒接收器芯片概述
是否可以同时安装多个版本的AD软件
传统汽车产业链将发生颠覆性变革