1. 负载均衡 当一台服务器的性能达到极限时,我们可以使用服务器集群来提高网站的整体性能。那么,在服务器集群中,需要有一台服务器充当调度者的角色,用户的所有请求都会首先由它接收,调度者再根据每台服务器的负载情况将请求分配给某一台后端服务器去处理。 那么在这个过程中,调度者如何合理分配任务,保证所有后端服务器都将性能充分发挥,从而保持服务器集群的整体性能最优,这就是负载均衡问题。 Nginx是一款面向性能设计的HTTP服务器,相较于Apache、lighttpd具有占有内存少,稳定性高等优势。 2. 反向代理实现负载均衡 实现负载均衡的方式主要有三种 (一)HTTP重定向实现负载均衡 (二)DNS负载均衡(三)反向代理 由于不同用户的访问时间、访问页面深度有所不同,从而每个用户对各自的后端服务器所造成的压力也不同以上前两种方式都不能真正实现服务器的负载均衡,只不过是把请求次数平均分配给每台服务器罢了。 反向代理服务器是一个位于实际服务器之前的服务器,所有向我们网站发来的请求都首先要经过反向代理服务器,服务器根据用户的请求要么直接将结果返回给用户,要么将请求交给后端服务器处理,再返回给用户。反向代理服务器就可以充当服务器集群的调度者,它可以根据当前后端服务器的负载情况,将请求转发给一台合适的服务器,并将处理结果返回给用户。 3. 优点
隐藏后端服务器。 与HTTP重定向相比,反向代理能够隐藏后端服务器,所有浏览器都不会与后端服务器直接交互,从而能够确保调度者的控制权,提升集群的整体性能。故障转移 与DNS负载均衡相比,反向代理能够更快速地移除故障结点。当监控程序发现某一后端服务器出现故障时,能够及时通知反向代理服务器,并立即将其删除。合理分配任务 HTTP重定向和DNS负载均衡都无法实现真正意义上的负载均衡,也就是调度服务器无法根据后端服务器的实际负载情况分配任务。但反向代理服务器支持手动设定每台后端服务器的权重。我们可以根据服务器的配置设置不同的权重,权重的不同会导致被调度者选中的概率的不同。
4. 缺点
调度者压力过大 由于所有的请求都先由反向代理服务器处理,那么当请求量超过调度服务器的最大负载时,调度服务器的吞吐率降低会直接降低集群的整体性能。制约扩展 当后端服务器也无法满足巨大的吞吐量时,就需要增加后端服务器的数量,可没办法无限量地增加,因为会受到调度服务器的最大吞吐量的制约。我是在VirturBox上安装了三台虚拟机,系统是centos6.5。调度服务器用的是nginx服务器,其他服务器随意。 192.168.1.106 web服务器 192.168.1.105 web服务器 192.168.1.104 负载均衡服务器 这三台虚拟机环境都要配好,在他们自己本机都能够运行起来,然后直接配置负载均衡服务器就行了。
server{ listen 80; server_name www.example.com; charset utf-8; location / { root /opt/wwwroot/default; index index.html inded.htm; proxy_pass http://www.example.com; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_forwarded-for; } } $remote_addr与$httpd_x_forwarded_for用以记录客户端的ip地址 后台服务器可以通过X-Forwarded-For获取用户的真实IP地址。下边这一部分是在http模块中
upstream www.example.com{ server 192.168.1.105 wehght=1; server 192.168.1.106 weight=2; }下面修改负载均衡服务器的hosts文件,将www.example.com指向192.168.1.104,然后分别修改105和106的index.html里边的文件。访问www.example.com如果页面内容交替显示,则表示配置成功。 以上就简单实现了负载均衡。下边有一些详细的具体配置。
nginx的upstream目前支持4种方式的分配 #1、轮询(默认) #每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。 #2、weight #指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。 #例如: #upstream bakend { # server 192.168.0.14 weight=10; # server 192.168.0.15 weight=10; #} #2、ip_hash #每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。 #例如: #upstream bakend { # ip_hash; # server 192.168.0.14:88; # server 192.168.0.15:80; #} #3、fair(第三方) #按后端服务器的响应时间来分配请求,响应时间短的优先分配。 #upstream backend { # server server1; # server server2; # fair; #} #4、url_hash(第三方) #按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。 upstream resinserver{#定义负载均衡设备的Ip及设备状态 ip_hash; server 127.0.0.1:8000 down; server 127.0.0.1:8080 weight=2; server 127.0.0.1:6801; server 127.0.0.1:6802 backup; }
每个设备的状态设置为: 1.down 表示当前的server暂时不参与负载 2.weight 默认为1.weight越大,负载的权重就越大。 3.max_fails :允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误 4.fail_timeout:max_fails次失败后,暂停的时间。 5.backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。