Nginx常见负载均衡算法和第三方负载均衡算法

Nginx负载均衡算法

首先呢我在这里给大家先介绍一下什么是负载均衡,他的常见算法有哪些。

Nginx他是一个扩展性非常强大的WEB服务器软件,他能够支持除自己本身以外的第三方调度算法,如:fair、url_hash等等。

负载均衡(参照网络)

负载均衡建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。

负载均衡(Load Balance)其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。

常见的调度算法

Nginx本身支持的算法:轮询(RR)、加权轮询(WRR)、ip_hash、least_conn

轮询(Round-Robin,RR):默认情况下Nginx服务器实现负载均衡的算法就是轮询,轮询策略按照顺序选择组内服务器处理请求。如果一个服务器在处理请求的过程中出现错误,请求会被顺次交给组内的下一个服务器进行处理,以此类推,直到返回正常的响应为止。但如果所有的组内服务器都出错,则返回最后一个服务器的处理结果。
例子:
upstream rr {
server 192.168.1.10;
server 192.168.1.20;
server 192.168.1.30;
}

加权轮询(Weighted Round-Robin,WRR):为组内服务器设置权重,权重值高的服务器被优先用于处理请求。此时组内服务器的选择策略为加权轮询。组内所有服务器的权重默认设置为1,即采用轮询处理请求。
例子:
upstream wrr {
server 192.168.1.10 weight=3;
server 192.168.1.20 weight=2;
server 192.168.1.30 weight=1;
}

ip_hash:ip_hash用于实现会话保持功能,将某个客户端的多次请求定向到组内同一台服务器上,保证客户端与服务器之间建立稳定的会话。只有当服务器处于无效(down)的状态时,客户端请求才会被下一个服务器接收和处理。注意:使用ip_hash后不能使用weight,ip_hash和主要根据客户端IP地址分配服务器,因此在整个系统中,Nginx服务器应该是处于最前端的服务器,这样才可以获取到客户端IP地址,否则它得到的IP地址将是位于它前面的服务器地址,从而就会产生问题。
例子:
upstream iphash {
ip_hash;
server 192.168.1.10;
server 192.168.1.20;
server 192.168.1.30;
}

least_conn:least_conn用于为网络连接分配服务器组内的服务器,在功能上实现了最小连接数负载均衡算法,在选择组内的服务器时,考虑各服务器权重的同时,每次选择的都是当前网络连接最少的那台服务器,如果这样的服务器有多台,就采用加权轮询选择权重值大的服务器。
例子:
upstream leastconn {
least_conn;
server 192.168.1.10 weight=3;
server 192.168.1.20 weight=2;
server 192.168.1.30 weight=1;
}

第三方调度算法

Nginx扩展第三方模块后得到的算法:fair、url_hash等(还有好多,这里就列举两种常见的第三方)。

fair:用于为响应时间分配服务器组内的服务器,他是按后端服务器的响应时间来分配请求,响应时间越短的越优先分配,需要第三方模块的支持nginx-upstream-fair-master
例子:
upstream fair {
fair;
server 192.168.1.10;
server 192.168.1.20;
server 192.168.1.30;
}

url_hash:按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。注意:使用hash后不能使用weight。需要第三方模块的支持ngx_http_upstream_hash_module
upstream urlhash {
server 192.168.1.10;
server 192.168.1.20;
server 192.168.1.30;
hash $request_uri;
hash_method crc32;
}

server指令

该指令用于设置组内的服务器。
server address [parameters];

address,服务器的地址,可以是包含端口号的IP地址(IP:Port)、域名或者以"unix:"为前缀用于进程间通信的Unix Domain Socket。

parameter,为当前服务器配置更多属性。这些属性变量包括以下内容:

weight=number,为组内服务器设置权重,权重值高的服务器被优先用于处理请求。此时组内服务器的选择策略为加权轮询策略。组内所有服务器的权重默认设置为1,即采用轮询调度原则处理请求。

max_fails=number,设置一个请求失败的次数。在一定时间范围内,当对组内某台服务器请求失败的次数超过该变量设置的值时,认为该服务器无效(down)。请求失败的各种情况与proxy_next_upstream指令的配置相匹配。默认设置为1。如果设置为0,则不使用上面的办法检查服务器是否有效。

fail_timeout=time,有两个作用,一是设置max_fails指令尝试请求某台组内服务器的时间,即学习max_fails指令时提到的"一定时间范围内";另一个作用是在检查服务器是否有效时,如果一台服务器被认为是无效(down)的,该变量设置的时间为认为服务器无效的持续时间。在这个时间内不再检查该服务器的状态,并一直认为它是无效(down)的。默认设置为10s。

backup,将某台组内服务器标记为备用服务器,只有当正常的服务器处于无效(down)状态或者繁忙(busy)状态时,该服务器才被用来处理客户端请求。
down,将某台组内服务器标记为永久的无效状态,通常与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;
}

猜你喜欢

转载自blog.csdn.net/qq_42279077/article/details/89033890