nginx upstream failover 容错机制

2024-03-18 10:18

本文主要是介绍nginx upstream failover 容错机制,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.   摘要

(1)       结论

详细描述了nginx记录失效节点的6种状态(time out、connect refuse、500、502、503、504,后四项5XX需要配置proxy_next_upstream中的状态才可以生效)、失效节点的触发条件和节点的恢复条件、所有节点失效后nginx会进行恢复并进行重新监听。

(2)       Nginx 负载均衡方式介绍

Nginx的负载均衡方式一共有5种:rr(轮询模式)、ip_hash、fair、url_hash,  weight(加权)。

(3)       Ngxin负载均衡和相关反向代理配置内容

Nginx负载均衡和与容错相关的反向代理的配置。

(4)       获取后端流程

后端server的自动容错流程图。

(5)       测试环境和测试结果

针对几种错误方式进行自动容错测试。

2.   结论

(1)       nginx 判断节点失效状态

Nginx 默认判断失败节点状态以connect refuse和time out状态为准,不以HTTP错误状态进行判断失败,因为HTTP只要能返回状态说明该节点还可以正常连接,所以nginx判断其还是存活状态;除非添加了proxy_next_upstream指令设置对404、502、503、504、500和time out等错误进行转到备机处理,在next_upstream过程中,会对fails进行累加,如果备用机处理还是错误则直接返回错误信息(但404不进行记录到错误数,如果不配置错误状态也不对其进行错误状态记录),综述,nginx记录错误数量只记录timeout 、connect refuse、502、500、503、504这6种状态,timeout和connect refuse是永远被记录错误状态,而502、500、503、504只有在配置proxy_next_upstream后nginx才会记录这4种HTTP错误到fails中,当fails大于等于max_fails时,则该节点失效;

(2)       nginx 处理节点失效和恢复的触发条件

nginx可以通过设置max_fails(最大尝试失败次数)和fail_timeout(失效时间,在到达最大尝试失败次数后,在fail_timeout的时间范围内节点被置为失效,除非所有节点都失效,否则该时间内,节点不进行恢复)对节点失败的尝试次数和失效时间进行设置。

当超过最大尝试次数或失效时间未超过配置失效时间,则nginx会对节点状会置为失效状态,nginx不对该后端进行连接,直到超过失效时间或者所有节点都失效后,该节点重新置为有效,重新探测。也就是在下个fail_timeout中,原来被判定为down的后端server是不可能得到接收数据机会的,即使它恢复过来了!然后再过一个fail_timeout,nginx 会尝试去通过发送数据请求到这个down的后端服务器上去测试它是否起来没有。


(3)       所有节点失效后nginx将重新恢复所有节点进行探测

如果探测所有节点均失效,备机也为失效时,那么nginx会对所有节点恢复为有效,重新尝试探测有效节点,如果探测到有效节点则返回正确节点内容,如果还是全部错误,那么继续探测下去,当没有正确信息时,节点失效时默认返回状态为502,但是下次访问节点时会继续探测正确节点,直到找到正确的为止。

3.   nginx负载均衡

Nginx的负载均衡方式一共有4种:rr(轮询模式)、ip_hash、fair、url_hash;

Nginx自带的2种负载均衡为rr和ip_hash,fair和url_hash为第三方的插件,nginx在不配置负载均衡的模式下,默认采用rr负载均衡模式。

l  RR负载均衡模式:

每个请求按时间顺序逐一分配到不同的后端服务器,如果超过了最大失败次数后(max_fails,默认1),在失效时间内(fail_timeout,默认10秒),该节点失效权重变为0,超过失效时间后,则恢复正常,或者全部节点都为down后,那么将所有节点都恢复为有效继续探测,一般来说rr可以根据权重来进行均匀分配。

l  Ip_hash负载均衡模式:

每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题,但是ip_hash会造成负载不均,有的服务请求接受多,有的服务请求接受少,所以不建议采用ip_hash模式,session共享问题可用后端服务的session共享代替nginx的ip_hash。

l  Fair(第三方)负载均衡模式:

按后端服务器的响应时间来分配请求,响应时间短的优先分配。

l  url_hash(第三方)负载均衡模式:

和ip_hash算法类似,是对每个请求按url的hash结果分配,使每个URL定向到一个同 一个后端服务器,但是也会造成分配不均的问题,这种模式后端服务器为缓存时比较好。

4.   Nginx 负载均衡配置

Nginx的负载均衡采用的是upstream模块

其中默认的采用的负载均衡模式是轮询模式rr(round_robin),具体配置如下:

1)    指令:

ip_hash

语法:ip_hash 
默认值:none 
使用字段:upstream 
这个指令将基于客户端连接的IP地址来分发请求。
哈希的关键字是客户端的C类网络地址,这个功能将保证这个客户端请求总是被转发到一台服务器上,但是如果这台服务器不可用,那么请求将转发到另外的服务器上,这将保证某个客户端有很大概率总是连接到一台服务器。
无法将权重(weight)与ip_hash联合使用来分发连接。如果有某台服务器不可用,你必须标记其为“down”,如下例:

upstream backend {

  ip_hash;

  server   backend1.example.com;

  server   backend2.example.com;

  server   backend3.example.com  down;

  server   backend4.example.com;

}

server

语法:server name [parameters] 
默认值:none 
使用字段:upstream 
指定后端服务器的名称和一些参数,可以使用域名,IP,端口,或者unix socket。如果指定为域名,则首先将其解析为IP。

l  weight = NUMBER - 设置服务器权重,默认为1。

l  max_fails = NUMBER - 在一定时间内(这个时间在fail_timeout参数中设置)检查这个服务器是否可用时产生的最多失败请求数,默认为1,将其设置为0可以关闭检查,这些错误在proxy_next_upstream或fastcgi_next_upstream(404错误不会使max_fails增加)中定义。

l  fail_timeout = TIME - 在这个时间内产生了max_fails所设置大小的失败尝试连接请求后这个服务器可能不可用,同样它指定了服务器不可用的时间(在下一次尝试连接请求发起之前),默认为10秒,fail_timeout与前端响应时间没有直接关系,不过可以使用proxy_connect_timeout和proxy_read_timeout来控制。

l  down - 标记服务器处于离线状态,通常和ip_hash一起使用。

l  backup - (0.6.7或更高)如果所有的非备份服务器都宕机或繁忙,则使用本服务器(无法和ip_hash指令搭配使用)。

示例配置

upstream  backend  {

  server   backend1.example.com    weight=5;

  server   127.0.0.1:8080          max_fails=3  fail_timeout=30s;

  server   unix:/tmp/backend3;

}

注意:如果你只使用一台上游服务器,nginx将设置一个内置变量为1,即max_fails和fail_timeout参数不会被处理。
结果:如果nginx不能连接到上游,请求将丢失。
解决:使用多台上游服务器。

upstream

语法:upstream name { … } 
默认值:none 
使用字段:http 
这个字段设置一群服务器,可以将这个字段放在proxy_pass和fastcgi_pass指令中作为一个单独的实体,它们可以可以是监听不同端口的服务器,并且也可以是同时监听TCP和Unix socket的服务器。
服务器可以指定不同的权重,默认为1。
示例配置

upstream backend {

  server backend1.example.com weight=5;

  server 127.0.0.1:8080       max_fails=3  fail_timeout=30s;

  server unix:/tmp/backend3;

}

请求将按照轮询的方式分发到后端服务器,但同时也会考虑权重。
在上面的例子中如果每次发生7个请求,5个请求将被发送到backend1.example.com,其他两台将分别得到一个请求,如果有一台服务器不可用,那么请求将被转发到下一台服务器,直到所有的服务器检查都通过。如果所有的服务器都无法通过检查,那么将返回给客户端最后一台工作的服务器产生的结果。

2)    变量

版本0.5.18以后,可以通过log_module中的变量来记录日志:

log_format timing '$remote_addr - $remote_user [$time_local]  $request '

  'upstream_response_time $upstream_response_time '

  'msec $msec request_time $request_time';

 

log_format up_head '$remote_addr - $remote_user [$time_local]  $request '

  'upstream_http_content_type $upstream_http_content_type';

l  $upstream_addr

前端服务器处理请求的服务器地址

l  $upstream_cache_status

0.8.3版本中其值可能为:

MISS 

EXPIRED - expired。请求被传送到后端。

UPDATING - expired。由于proxy/fastcgi_cache_use_stale正在更新,将使用旧的应答。

STALE - expired。由于proxy/fastcgi_cache_use_stale,后端将得到过期的应答。

HIT

l  $upstream_status

前端服务器的响应状态。

l  $upstream_response_time

前端服务器的应答时间,精确到毫秒,不同的应答以逗号和冒号分开。

l  $upstream_http_$HEADER

随意的HTTP协议头,如:$upstream_http_host

l  $upstream_http_host

 

3)    Proxy指令:

proxy_next_upstream

语法:proxy_next_upstream

 [error|timeout|invalid_header|http_500|http_502|http_503|http_504|http_404|off] 
默认值:proxy_next_upstream error timeout 
使用字段:http, server, location 
确定在何种情况下请求将转发到下一个服务器:

error - 在连接到一个服务器,发送一个请求,或者读取应答时发生错误。

timeout - 在连接到服务器,转发请求或者读取应答时发生超时。

invalid_header - 服务器返回空的或者错误的应答。

http_500 - 服务器返回500代码。

http_502 - 服务器返回502代码。

http_503 - 服务器返回503代码。

http_504 - 服务器返回504代码。

http_404 - 服务器返回404代码。

off - 禁止转发请求到下一台服务器。

转发请求只发生在没有数据传递到客户端的过程中。

其中记录到nginx后端错误数量的有500、502、503、504、timeout,404不记录错误。

proxy_connect_timeout

语法:proxy_connect_timeout timeout_in_seconds 
默认值:proxy_connect_timeout 60s 
使用字段:http, server, location 
指定一个连接到代理服务器的超时时间,单位为秒,需要注意的是这个时间最好不要超过75秒。
这个时间并不是指服务器传回页面的时间(这个时间由proxy_read_timeout声明)。如果你的前端代理服务器是正常运行的,但是遇到一些状况(例如没有足够的线程去处理请求,请求将被放在一个连接池中延迟处理),那么这个声明无助于服务器去建立连接。
可以通过指定时间单位以免引起混乱,支持的时间单位有”s”(秒), “ms”(毫秒), “y”(年), “M”(月), “w”(周), “d”(日), “h”(小时),和 “m”(分钟)。
这个值不能大于597小时。

proxy_read_timeout

语法:proxy_read_timeout time 
默认值:proxy_read_timeout 60s 
使用字段:http, server, location 
决定读取后端服务器应答的超时时间,单位为秒,它决定nginx将等待多久时间来取得一个请求的应答。超时时间是指完成了两次握手后并且状态为established的超时时间。
相对于proxy_connect_timeout,这个时间可以扑捉到一台将你的连接放入连接池延迟处理并且没有数据传送的服务器,注意不要将此值设置太低,某些情况下代理服务器将花很长的时间来获得页面应答(例如如当接收一个需要很多计算的报表时),当然你可以在不同的location里面设置不同的值。
可以通过指定时间单位以免引起混乱,支持的时间单位有”s”(秒), “ms”(毫秒), “y”(年), “M”(月), “w”(周), “d”(日), “h”(小时),和 “m”(分钟)。
这个值不能大于597小时。

proxy_send_timeout

语法:proxy_send_timeout seconds 
默认值:proxy_send_timeout 60s 
使用字段:http, server, location 
设置代理服务器转发请求的超时时间,单位为秒,同样指完成两次握手后的时间,如果超过这个时间代理服务器没有数据转发到被代理服务器,nginx将关闭连接。
可以通过指定时间单位以免引起混乱,支持的时间单位有”s”(秒), “ms”(毫秒), “y”(年), “M”(月), “w”(周), “d”(日), “h”(小时),和 “m”(分钟)。
这个值不能大于597小时。

 

 

5.   获取后端流程

GET_RR_PEER: 通过RR算法获取后端流程

K:是判断peer是否宕机和判断失效状态算法

 

FAIL:尝试次数用尽有,跳转到失败流程,如果有备机,备机再尝试监听,如果监听失败则返回NGX_BUSY,成功则返回当前状态。

6.   测试环境

操作系统:centos5.6

Cpu:16核

内存:32g

Web 服务器:nginx

Web 应用服务器:tomcat(2台)

7.   测试结果

l  设置tomcat1超时时间,造成超时状态(总有一台server为有效状态):

Tomcat1的connectionTimeout 设置为-1,永远超时,nginx设置tomcat1和tomcat2权重为10,tomcat1的max_fails为10,fail_timeout=120;在连接tomcat1的10次后,返回给nginx为10次超时,ngxin判断tomcat1为失效,然后将tomcat1超时时间恢复为1000重新启动tomcat1,在这段时间内nginx判断tomcat1还是失效状态,所以在2分钟后,nginx继续监听到tomcat1正常后,那么nginx会将tomcat1判断为有效,将连接继续均匀分配到2个tomcat上。

l  设置tomcat1连接数量,造成超时状态(总有一台server为有效状态):

Tomcat1的线程数量设置为1,nginx设置tomcat1和tomcat2权重为10,tomcat1的max_fails为10,fail_timeout=120;在连接tomcat1超过线程接受数量后,tomcat1会返回超时状态,在返回给nginx10次超时状态后,ngxin判断tomcat1为失效,然后将tomcat线程数量恢复为700,重新启动tomcat1,在这段时间内nginx判断tomcat1还是失效状态,超过2分钟失效后,nginx继续监听到tomcat1正常后,那么nginx会将tomcat1判断为有效,将连接继续均匀分配到2个tomcat上。

l  设置tomcat1关闭,造成拒绝状态(总有一台server为有效状态):

Tomcat1为关闭,nginx设置tomcat1和tomcat2权重为10,tomcat1的max_fails为10,fail_timeout=120;在连接tomcat1的10次后,nginx收到tomcat1返回connect refuse状态,ngxin判断tomcat1为失效,然后重新启动tomcat1,在这段时间内nginx判断tomcat1还是失效状态,超过2分钟失效后,nginx继续监听到tomcat1正常后,那么nginx会将tomcat1判断为有效,将连接继续均匀分配到2个tomcat上。

l  设置tomcat1在nginx1标记失效,tomcat1恢复正常,在nginx失效范围内,将全部服务变为失效,然后重启:

Tomcat1为关闭,nginx设置tomcat1和tomcat2权重为10,tomcat1的max_fails为10,fail_timeout=120;在连接tomcat1的10次后,nginx收到tomcat1返回connect refuse状态,ngxin判断tomcat1为失效,然后重新启动tomcat1,在这段时间内nginx判断tomcat1还是失效状态,然后将tomcat2关闭,然后重启tomcat2,由于所有服务均失效,所以nginx 将所有服务重新置为有效进行监听,然后将2连接均匀分布到了tomcat1和tomcat2上。

l  http错误状态,nginx是否记录失效:

nginx设置tomcat1和tomcat2权重为10,tomcat1的max_fails为10,fail_timeout=120;配置proxy_next_upstream 500、404、502、503、504、timeout后,当HTTP状态为500、502、503、504(timeout和refuse默认是记录失效的)时,nginx会判断该次请求为失败记录失败状态,其他所有HTTP均不记录失败。

这篇关于nginx upstream failover 容错机制的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/822021

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Java ArrayList扩容机制 (源码解读)

结论:初始长度为10,若所需长度小于1.5倍原长度,则按照1.5倍扩容。若不够用则按照所需长度扩容。 一. 明确类内部重要变量含义         1:数组默认长度         2:这是一个共享的空数组实例,用于明确创建长度为0时的ArrayList ,比如通过 new ArrayList<>(0),ArrayList 内部的数组 elementData 会指向这个 EMPTY_EL

【编程底层思考】垃圾收集机制,GC算法,垃圾收集器类型概述

Java的垃圾收集(Garbage Collection,GC)机制是Java语言的一大特色,它负责自动管理内存的回收,释放不再使用的对象所占用的内存。以下是对Java垃圾收集机制的详细介绍: 一、垃圾收集机制概述: 对象存活判断:垃圾收集器定期检查堆内存中的对象,判断哪些对象是“垃圾”,即不再被任何引用链直接或间接引用的对象。内存回收:将判断为垃圾的对象占用的内存进行回收,以便重新使用。

【Tools】大模型中的自注意力机制

摇来摇去摇碎点点的金黄 伸手牵来一片梦的霞光 南方的小巷推开多情的门窗 年轻和我们歌唱 摇来摇去摇着温柔的阳光 轻轻托起一件梦的衣裳 古老的都市每天都改变模样                      🎵 方芳《摇太阳》 自注意力机制(Self-Attention)是一种在Transformer等大模型中经常使用的注意力机制。该机制通过对输入序列中的每个元素计算与其他元素之间的相似性,

如何通俗理解注意力机制?

1、注意力机制(Attention Mechanism)是机器学习和深度学习中一种模拟人类注意力的方法,用于提高模型在处理大量信息时的效率和效果。通俗地理解,它就像是在一堆信息中找到最重要的部分,把注意力集中在这些关键点上,从而更好地完成任务。以下是几个简单的比喻来帮助理解注意力机制: 2、寻找重点:想象一下,你在阅读一篇文章的时候,有些段落特别重要,你会特别注意这些段落,反复阅读,而对其他部分

【Tools】大模型中的注意力机制

摇来摇去摇碎点点的金黄 伸手牵来一片梦的霞光 南方的小巷推开多情的门窗 年轻和我们歌唱 摇来摇去摇着温柔的阳光 轻轻托起一件梦的衣裳 古老的都市每天都改变模样                      🎵 方芳《摇太阳》 在大模型中,注意力机制是一种重要的技术,它被广泛应用于自然语言处理领域,特别是在机器翻译和语言模型中。 注意力机制的基本思想是通过计算输入序列中各个位置的权重,以确

Windows下Nginx的安装及开机启动

1、将nginx-1.16.1.zip解压拷贝至D:\web\nginx目录下。 2、启动Nginx,两种方法: (1)直接双击nginx.exe,双击后一个黑色的弹窗一闪而过。 (2)打开cmd命令窗口,切换到nginx目录下,输入命令 nginx.exe 或者 start nginx ,回车即可。 3、检查nginx是否启动成功。 直接在浏览器地址栏输入网址 http://lo

nginx介绍及常用功能

什么是nginx nginx跟Apache一样,是一个web服务器(网站服务器),通过HTTP协议提供各种网络服务。 Apache:重量级的,不支持高并发的服务器。在Apache上运行数以万计的并发访问,会导致服务器消耗大量内存。操作系统对其进行进程或线程间的切换也消耗了大量的CPU资源,导致HTTP请求的平均响应速度降低。这些都决定了Apache不可能成为高性能WEB服务器  nginx:

web群集--nginx配置文件location匹配符的优先级顺序详解及验证

文章目录 前言优先级顺序优先级顺序(详解)1. 精确匹配(Exact Match)2. 正则表达式匹配(Regex Match)3. 前缀匹配(Prefix Match) 匹配规则的综合应用验证优先级 前言 location的作用 在 NGINX 中,location 指令用于定义如何处理特定的请求 URI。由于网站往往需要不同的处理方式来适应各种请求,NGINX 提供了多种匹

FreeRTOS内部机制学习03(事件组内部机制)

文章目录 事件组使用的场景事件组的核心以及Set事件API做的事情事件组的特殊之处事件组为什么不关闭中断xEventGroupSetBitsFromISR内部是怎么做的? 事件组使用的场景 学校组织秋游,组长在等待: 张三:我到了 李四:我到了 王五:我到了 组长说:好,大家都到齐了,出发! 秋游回来第二天就要提交一篇心得报告,组长在焦急等待:张三、李四、王五谁先写好就交谁的