今天发现一个奇怪的现象,前端请求后端服务多次后会超时一次,经过多次验证确定是大概10s左右就会超时一次,检查后端服务,发现其中一个节点已经夯死。
但是我们的nginx负载均衡策略是轮询机制,按照配置来看应该是每隔一次请求轮询到失败的节点时超时一次才对。为什么是每隔10s超时一次呢?
upstream app_server {
server 192.168.15.98:9080 max_fails=1 fail_timeout=10s;
server 192.168.15.99:9080 max_fails=1 fail_timeout=10s;
}
原来,Nginx负载均衡的检查模块中,有两个参数:max_fails和fail_timeout。
默认:fail_timeout为10s,max_fails为1次。
原理:Nginx是基于连接探测的,如果发现后端异常,在单位周期为fail_timeout设置的时间中失败次数达到max_fails次,这个周期次数内,如果后端同一个节点不可用,那么就将把节点标记为不可用,并等待下一个周期(同样时长为fail_timeout)再一次去请求,判断是否连接是否成功。
这样就能说明我们发现的现象了。即在10s以内后端失败了1次【即1次请求超时】,那么这个后端就被标识为不可用了,所以在接下来的10s期间,nginx都会把请求分配给正常的后端【即多次的请求正常】。