一、什么是负载均衡
随着互联网的发展,网站的访问量也越来越大,服务器网站所提供的服务模式也在发生着改变,例如:当一台服务器无法承受巨大的访问流量时,使用多台服务器共同承载访问流量;再比如对客户的访问做资源判断,静态资源请求使用调度器调度到后端静态服务器群进行响应,动态资源请求调度到后端动态资源服务器群进行响应。这样就可以使用户访问量得到有效的负载的效果。而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
其他常用配置项:
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:请求失败后的超时时长;