Nginx的负载均衡与调度算法

一、什么是负载均衡


随着互联网的发展,网站的访问量也越来越大,服务器网站所提供的服务模式也在发生着改变,例如:当一台服务器无法承受巨大的访问流量时,使用多台服务器共同承载访问流量;再比如对客户的访问做资源判断,静态资源请求使用调度器调度到后端静态服务器群进行响应,动态资源请求调度到后端动态资源服务器群进行响应。这样就可以使用户访问量得到有效的负载的效果。而Nginx可以做到对用户访问量的负载均衡效果。

二、负载均衡调度算法

1、轮询(默认调度算法)

特点:每个请求按时间顺序逐一分配到不同的后端服务器处理。
适用业务场景:后端服务器硬件性能配置完全一致,业务无特殊要求时使用。

upstream backendserver { 
server 192.168.0.14:80 max_fails=2 fail_timeout=10s; 
server 192.168.0.15:80 max_fails=2 fail_timeout=10s; 
} 

2、加权轮询

特点:指定轮询几率,weight值(权重)和访问比例成正比,用户请求按权重比例分配。
适用业务场景:用于后端服务器硬件性处理能力不平均的情形。

upstream backendserver { 
server 192.168.0.14:80 weight=5 max_fails=2 fail_timeout=10s; 
server 192.168.0.15:80 weight=10 max_fails=2 fail_timeout=10s;
}

  

3、ip_hash

特点:每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session会话保持问题。
适用业务场景:适用于需要账号登录的系统,会话连接保持的业务。

upstream backendserver { 
ip_hash; 
server 192.168.0.14:80 max_fails=2 fail_timeout=10s; 
server 192.168.0.15:80 max_fails=2 fail_timeout=10s; 
} 

  

4、最少连接数 least_conn

特点:按nginx反向代理与后端服务器之间的连接数,连接数最少的优先分配。

适用业务场景:适用于客户端与后端服务器需要保持长连接的业务。

upstream backendserver { 
least_conn;
server 192.168.0.14:80 max_fails=2 fail_timeout=10s; 
server 192.168.0.15:80 max_fails=2 fail_timeout=10s; 
} 

  

5、fair(需编译安装第三方模块 ngx_http_upstream_fair_module)

特点:按后端服务器的响应时间来分配请求,响应时间短的优先分配。
适用业务场景:对访问响应速度有一定要求的业务。

upstream backendserver {
fair; 
server 192.168.0.14:80 max_fails=2 fail_timeout=10s; 
server 192.168.0.15:80 max_fails=2 fail_timeout=10s; 
}

  

6、url_hash(需编译安装第三方模块 ngx_http_upstream_hash_module)

特点:按访问url的hash结果来分配请求,使同一个url访问到同一个后端服务器。
适用业务场景:适用于后端服务器为缓存服务器时比较有效。

upstream backendserver { 
server 192.168.0.14:80 max_fails=2 fail_timeout=10s;
server 192.168.0.15:80 max_fails=2 fail_timeout=10s; 
hash $request_uri; 
}

  

三、负载均衡展示


反向代理端:192.168.126.135
后端服务器:192.168.126.130   192.168.126.133
配置轮询

1)修改代理服务器的主配置文件

 1 [root@proxy ~]#vim /usr/local/nginx/conf/nginx.conf
 2 http {                   //upstream必须要在http段配置;
 3     include       mime.types; 
 4     default_type  application/octet-stream;
 5     proxy_cache_path /cache/nginx/ levels=1:1 keys_zone=mycache:32m;
 6 
 7     upstream  upstream_server {     //这里是定义了一个名字叫做upstream_server的后端服务器池,并把后端
 8         server  192.168.126.130;        的服务器添加到此池中;
 9         server 192.168.126.133;
10 
11     }
12 
13 
14 
15         location / {
16            proxy_pass http://upstream_server;
17         }
18 
19 [root@proxy ~]# /usr/local/nginx/sbin/nginx   -s reload 
20 [root@proxy ~]# 
21 [root@proxy ~]# ss -tunlp | grep nginx 
22 tcp    LISTEN     0      128       *:80                    *:*                   users:(("nginx",pid=7260,fd=6),("nginx",pid=7255,fd=6))
23 [root@proxy ~]# 

2)定义后端服务器的web页面
web1

1 [root@www ~]#vim /var/www/html/index.html
2 <h1>Test Page form  web1 </h1>
3 [root@www ~]# systemctl restart httpd 
4 [root@www ~]# 

web2

1 [root@web2 ~]# vim /var/www/html/index.html 
2 <h1>Test Page from web2</h1>
3 [root@web2 ~]# service  httpd  restart 
4 停止 httpd:                                               [失败]
5 正在启动 httpd:httpd: apr_sockaddr_info_get() failed for web2
6 httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
7                                                            [确定]
8 [root@web2 ~]# 

3)访问测试(默认为轮询)

 

 有时,我们会根据后端服务器性能的高低来负载客户端流量,这时我们就希望性能强的服务器可以尽量多的处理用户请求,性能差一点的服务器处理少一点用户请求;我们就需要用到加权轮询这个调度算法。

加权轮询配置:
1)修改nginx代理服务器的配置文件

1 [root@proxy conf]# vim nginx.conf
2     include       mime.types;
3     default_type  application/octet-stream;
4     upstream  upstream_server {
5         server  192.168.126.130 weight=2;  //修改第一个server的权重为2;
6         server 192.168.126.133 weight=1;  //修改第二个server的权重为1;
7 
8     }

2)重载配置文件并查看

1 [root@proxy conf]# /usr/local/nginx/sbin/nginx -s reload
2 [root@proxy conf]# 

还有时,我们希望同一个ip地址的客户端请求只发送到后端固定的server服务器,因为可能客户端会有session信息的需要,这时,我们就不得不把同一个ip客户端请求始终调度到同一台server服务器上,此时,便可以使用ip_hash算法。

ip_hash配置:
1)修改nginx负载均衡器的配置文件

1 http {
2     include       mime.types;
3     default_type  application/octet-stream;
4     upstream  upstream_server {
5         ip_hash;    //指明使用ip_hash算法进行调度;
6         server  192.168.126.130;
7         server 192.168.126.133;
8 
9     }

2)重载配置并查看(此时,不管如何刷新,都只会调度到同一台后端服务器上)

 1 [root@proxy conf]# /usr/local/nginx/sbin/nginx -s reload

2 [root@proxy conf]# 

 

还有时,我们会根据服务器当前连接客户端的数量来进行调度,连接较少的服务器端可以把新请求发送给它,这样可以尽量做到结果公平;这就需要用到least_connection最少连接数算法。
least_conn调度算法配置:
1)修改nginx负载均衡器配置文件

1 http {
2     include       mime.types;
3     default_type  application/octet-stream;
4     upstream  upstream_server {
5         least_conn;  //指明使用最少连接数算法;
6         server  192.168.126.130;
7         server 192.168.126.133;
8     }

2)重载配置文件,并查看(用于只有我一个客户端请求,所以对后端server的连接数是相同的,此时和轮询的效果相同)

 1 [root@proxy conf]# /usr/local/nginx/sbin/nginx -s reload

2 [root@proxy conf]#  

其他常用配置项:

1    upstream  upstream_server {
2         #fair;  //使用响应时长最短调度算法;
3         server  192.168.126.130 down;  //down表示当前server不参与负载均衡调度;
4         server 192.168.126.133 backup; //backup表示作为备用服务器,当其他服务器出现问题是,才调度到这个server;
5     }
6       max_fails:代理服务器允许的请求后端服务器的最大失败次数,默认为1,当请求一次失败后,就认为此后端服务器挂掉了,就不会把用户请求调度到此服务器上;
7       fail_timeout:请求失败后的超时时长;

 原文:https://blog.csdn.net/Micky_Yang/article/details/89156306

原文地址:https://www.cnblogs.com/sucretan2010/p/12528608.html