负载均衡(Load Balance)其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。
负载均衡建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。同时,负载均衡也是解决高并发问题常用的策略。
1、负载均衡的作用
①转发功能
按照一定的算法【权重、轮询】,将客户端请求转发到不同应用服务器上,减轻单个服务器压力,提高系统并发量。
②故障移除
通过心跳检测的方式,判断应用服务器当前是否可以正常工作,如果服务器期宕掉,自动将请求发送到其他应用服务器。
③恢复添加
如检测到发生故障的应用服务器恢复工作,自动将其添加到处理用户请求队伍中。
2、负载均衡的实现策略
同样使用两个tomcat模拟两台应用服务器,端口号分别为8080 和8081
①Nginx的负载分发策略
Nginx 的 upstream目前支持的分配算法:
1)、轮询 ——1:1 轮流处理请求(默认)
每个请求按时间顺序逐一分配到不同的应用服务器,如果应用服务器宕掉,自动剔除,剩下的继续轮询。
2)、权重 ——you can you up
通过配置权重,指定轮询几率,权重和访问比率成正比,用于应用服务器性能不均的情况。
3)、ip_哈希算法
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个应用服务器,可以解决session共享的问题。
②配置Nginx的负载均衡与分发策略
通过在upstream参数中添加的应用服务器IP后添加指定参数即可实现,如:
upstream my.com{ server 127.0.0.1:81 weight=3; server 127.0.0.1:82; } server { listen 80; server_name nginx.com ; root "D:\\PHP\WWW\\nginx.com"; location / { index index.html index.htm index.php; #autoindex on; proxy_pass http://my.com; } location ~ \.php(.*)$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_split_path_info ^((?U).+\.php)(/?.+)$; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info; include fastcgi_params; } }
通过以上配置,便可以实现,在访问nginx.com这个网站时,由于配置了proxy_pass地址,所有请求都会先通过nginx反向代理服务器,在服务器将请求转发给目的主机时,读取upstream为 my.com的地址,读取分发策略,配置tomcat1权重为3,所以nginx会将大部分请求发送给服务器上的tomcat1,也就是81端口;较少部分给tomcat2来实现有条件的负载均衡,当然这个条件就是服务器1、2的硬件指数处理请求能力。
下面来看一个负载均衡配置实现的实例:
一台负载服务器,4台均衡服务器(由于是本地实验,所以这4台均衡服务器是通过指定不同的端口来模拟的,在实际项目中直接换成对应服务器的 ip 和端口号就可以了,结果和效果是一样的)
负载服务器的配置:
//my.com 可以自己任意命名,但需要跟proxy_pass 后面的域名保持一致 upstream my.com { server 127.0.0.1:81; server 127.0.0.1:82; server 127.0.0.1:83; server 127.0.0.1:84; } server { listen 80; server_name nginx.com ; root "D:\\PHP\WWW\\nginx.com"; location / { index index.html index.htm index.php; #autoindex on; proxy_pass http://my.com; } location ~ \.php(.*)$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_split_path_info ^((?U).+\.php)(/?.+)$; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info; include fastcgi_params; } }
4台负载服务器的配置:
#第一台负载服务器 server { listen 81; server_name nginx1.com ; root "D:\\PHP\WWW\\nginx1.com"; location / { index index.html index.htm index.php; #autoindex on; } location ~ \.php(.*)$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_split_path_info ^((?U).+\.php)(/?.+)$; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info; include fastcgi_params; } } #第二台负载服务器 server { listen 82; server_name nginx2.com ; root "D:\\PHP\WWW\\nginx2.com"; location / { index index.html index.htm index.php; #autoindex on; } location ~ \.php(.*)$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_split_path_info ^((?U).+\.php)(/?.+)$; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info; include fastcgi_params; } } #第三台负载服务器 server { listen 83; server_name nginx3.com ; root "D:\\PHP\WWW\\nginx3.com"; location / { index index.html index.htm index.php; #autoindex on; } location ~ \.php(.*)$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_split_path_info ^((?U).+\.php)(/?.+)$; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info; include fastcgi_params; } } #第四台负载服务器 server { listen 84; server_name nginx4.com ; root "D:\\PHP\WWW\\nginx4.com"; location / { index index.html index.htm index.php; #autoindex on; } location ~ \.php(.*)$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_split_path_info ^((?U).+\.php)(/?.+)$; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info; include fastcgi_params; } }
nginx服务器的负载均衡配置就实现了,下面来看看实际效果:
(为了看负载均衡的效果,这里对每个负载均衡服务器设置的内容都不一样,在实际项目中把每台负载均衡服务器的内容同步就好了)
(从图中可以看到,每次刷新请求到的都是不同站点的内容,这里因为请求少,而且也没有对负载均衡服务器做特殊的处理,所以这里看到的效果是4个负载均衡服务器轮询出来的)
负载均衡服务器的其他配置参数:
1)down 表示单前的server暂时不参与负载 2)weight 默认为1.weight越大,负载的权重就越大。 3)max_fails 允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误 4)fail_timeout max_fails 次失败后,暂停的时间。 5)backup 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。
例如:
upstream my.com { server 127.0.0.1:81 weight=2; server 127.0.0.1:82 down; server 127.0.0.1:83 backup; server 127.0.0.1:84; }