负载均衡方案应是在网站建设初期就应考虑的问题,不过有时随着访问流量的爆炸性增长,超出决策者的意料,这也就成为不得不面对的问题。当我们在引入某种负载均衡方案乃至具体实施时,像其他的许多方案一样,首先是确定当前及将来的应用需求,然后在代价与收效之间做出权衡。负载均衡策略的优劣及其实现的难易程度有两个关键因素:一是负载均衡算法,二是对网络系统状况的检测方式和能力。考虑到服务请求的不同类型、服务器的不同处理能力以及随机选择造成的负载分配不均匀等问题,为了更加合理的把负载分配给内部的多个服务器,就需要应用相应的能够正确反映各个服务器处理能力及网络状态的负载均衡算法,而良好的负载均衡策略应有对网络故障、服务器系统故障、应用服务故障的检测方式和能力。
2.Nginx 负载均衡的实现
Nginx 的负载均衡是一个基于内容和应用的七层交换负载均衡,是以反向代理服务器方式实现负载均衡。因此使用Nginx 实现服务器负载均衡的关键在于ngx_http_upstream_hash_module 模块的使用和设置Nginx 反向代理配置。
(1)Nginx 的upstream 模块所支持负载均衡的算法:
1)默认的方式是轮询,每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器宕机,能自动剔除。
2)权重轮询均衡:可以指定轮询几率,权重(weight)和访问比率成正比,用于后端服务器性能不均的情况。
3)每个请求按访问ip 的hash 结果分配,这样每个访客固定访问一个后端服务器,在有些应用情况下,需要将来自同一客户端的所有请求都分配给同一台服务器去负担,例如服务器将客户端注册、购物等服务请求信息保存的本地数据库的情况下,把客户端的子请求分配给同一台服务器来处理就显的至关重要了。
4)按后端服务器的响应时间来分配请求,响应时间短的优先分配。
5)按访问url 的hash 结果来分配请求,使每个url 定向到同一个后端服务器,后端服务器为缓存时比较有效。在nginx.conf 配置文件中,用upstream 指令定义一组(以4 台服务器为例)负载均衡后端服务器池:
upstream servername {
server 192.168.1.10:80 weight=1 max_fails=3 fail_timeout=60s;
server 192.168.1.11:80 weight=1 max_fails=3 fail_timeout=60s;
server 192.168.1.12:80 weight=1 max_fails=3 fail_timeout=60s;
server 192.168.1.13:80 weight=1 max_fails=3 fail_timeout=60s;
}
其中,servername 是服务器组名;Weight:设置服务器的权重,默认值是1,权重值越大那么该服务器被访问到的几率就越大;max_fails 和fail_timeout :这两个是关联的,如果某台服务器在fail_timeout 时间内出现了max_fails 次连接失败,那么Nginx 就会认为那个服务器已经宕机,从而在fail_timeout 时间内不再去查询它。
(2)设置Nginx 的反向代理配置
反向代理方式与普通的代理方式有所不同,标准代理方式是客户使用代理访问多个外部Web 服务器,反向代理方式是多个客户使用它访问内部Web 服务器,使用反向代理服务器可以将请求转发给内部的Web 服务器,从而提升静态网页的访问速度。因此可以使用这种技术,让代理服务器将请求均匀转发给多台内部Web 服务器之一上,从而达到负载均衡的目的。
使用反向代理的好处是,可以将负载均衡和代理服务器的高速缓存技术结合在一起,提供有益的性能,具备额外的安全性,外部客户不能直接访问真实的服务器。并且实现起来可以实现较好的负载均衡策略,将负载可以非常均衡的分给内部服务器,不会出现负载集中到某个服务器的偶然现象。
在nginx.conf 配置文件中,进行反向代理配置:
server{
listen 80;
server_name www.domain.com *.domain.com;
location /
{
proxy_pass http://servername;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
}
access_log off;
}
其中:proxy_pass http://servername 用于指定反向代理的服务器池; proxy_set_header Host $host 当后端Web服务器上也配置有多个虚拟主机时,需要用该Header 来区分反向代理哪个主机名;proxy_set_header X-Forwarded-For$remote_addr; 如果后端Web 服务器上的程序需要获取用户IP,就从该Header 头获取。
3.Nginx 负载均衡的双机热备
Nginx 处理所有流量受限于机器I/O 和配置;本身的Bug也还是难以避免的;Nginx 没有现成的双机热备方案,所以跑在单机上还是风险较大,单机上的事情全都很难说。因此,可以通过KeepAlived 来实现Nginx 负载均衡的双机热备。正常情况下,两台Nginx 负载均衡服务器全部处于活动状态,对外提供服务。通过两台服务器之间的互相检测机制,当主服务器上的检测程序发现自身的Nginx 无法访问时,停止绑定虚拟IP,改由备用服务器绑定虚拟IP,同时由主服务器给网关发送Arping 包,保证了网关上IP、MAC 地址对应关系能够马上更改,能够做到强行接管虚拟IP。
4.在Nginx 负载均衡服务器上设置缓存,加快服务器响应速度
Nginx 从0.7.48 版本开始,支持了类似Squid 的缓存功能,缓存把URL 及相关组合当作Key,用md5 编码哈希后保存。对于修改实时性要求不高的图片、Flash、CSS 样式文件、JavaScript 文件,可以在Nginx 反向代理(负载均衡)服务器上设置缓存,不用每次请求都转发到后端Web 服务器,加快了响应速度。同时也可以减少Nginx 与后端Web 服务器的连接数,提高了Nginx 处理性能。
总之,对架设中小型网站的企业,如果没有资金去购买昂贵的四/七层负载均衡交换机,那么可以使用Nginx 是不错的七层负载均衡选择,并且可以通过Nginx+Keepalived 实现Nginx 负载均衡双机互备,任意一台机器发生故障,对方都能够将虚拟IP 接管。而对于有资金购买四/七层负载均衡交换机的大型网站,Nginx 可以作为F5 BIG-IP 等硬件负载均衡交换机七层交换的有力补充。
本文详细介绍了Nginx负载均衡的实施要素,包括负载均衡算法、Nginx负载均衡的实现(如使用ngx_http_upstream_hash_module模块和设置反向代理配置)、双机热备机制(通过KeepAlived实现),以及在Nginx负载均衡服务器上设置缓存以提高响应速度的方法。

被折叠的 条评论
为什么被折叠?



