一、Nginx负载均衡(健康检查)

  负载均衡是指的是把请求均匀的分摊到多个服务器上处理。

  一般常见的负载均衡有两种:

  1. 客户端与反向代理服务器之间的DNS负载均衡
  2. 反向代理服务器与应用服务器之间的负载均衡(这种负载均衡有很多,可以是weblogic的负载均衡,可以是Apache+Tomcat负载均衡,也可以是nginx负载均衡,这里只讨论nginx负载均衡)。

  负载均衡的关键在于如何使请求均匀的分摊到服务器上。这里考量均匀不仅仅只的是请求数量上的一致,还有服务器压力的平均。如何均匀的分摊,取决于所选的负载均衡策略。

  一)NGINX主动式后端服务健康检查

  Nginx负载均衡简单配置:​​http://blog.51cto.com/13178102/2063271​

  后端健康检查​

​  http://tengine.taobao.org/document_cn/http_upstream_check_cn.html​

  二)Nginx upstream配置实现多服务器无感知切换

  1、Nginx的配置如下

upstream adminProxy{
server 192.168.1.120:7851 weight=2 max_fails=3 fail_timeout=100s;
server 192.168.1.121:7851 weight=2 max_fails=3 fail_timeout=100s;
}


server {
listen 80;
server_name dev.manage.com;
root /home/work/app/dist;
index index.html;
location /sys {
proxy_pass http://adminProxy;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_next_upstream http_502 http_504 error timeout invalid_header;
}
}

  max_fails = 3 fail_timeout=100s  表示 ${fail_timeout}(100秒)时间内出现${max-fails}(3次)次失败,就会把这个机器状态置为down(下线),就是失败$(fail_timeout)(100秒)时间后,会重新尝试启用这服务器;

  但是这还是不够的;因为这样的话,一个服务器要被请求3次才会被下线,也就是说,会有3次错误的请求;返回502或者是error;

  所以我们还要启用proxy_next_upstream 功能: 在服务器返回502,504,错误,超时 的时候;允许转发到其他服务器;

proxy_next_upstream http_502 http_504 error timeout invalid_header;

  启用该功能需要在nginx.conf中添加 

proxy_next_upstream on

  三)DNS负载均衡与Nginx负载均衡

  1、DNS负载均衡

  dns负载均衡是通过DNS服务器实现的,主要用于把请求均匀的分布到nginx服务器上。其实真是情况中可能是用来根据地域区分请求。但是一个地域中的请求还算需要均匀的分配到nginx服务器上的。

  有两个缺点:一个是无法区分服务是否挂掉,即时某个NGINX服务器挂掉了,DNS仍然会分配。另一个是DNS缓存的问题,用户访问网站,网站域名被DNS服务器解析为某个IP。这个IP一般情况都会在客户端本地进行缓存,短时间内下次再访问这个域名,会直接从缓存中拿,无法达到真正的均匀,但这对服务器影响不算太大。重要的请求个数无法真正的做到均衡,比如每个Nginx服务器拿到100个请求,但是所有的耗时大请求都集中到某一台服务器中,那么这个服务器压力将会很大。其他的会比较空闲。

  2、Nginx负载均衡

  nginx是目前流行的,优秀的反向代理服务器(其实他不仅仅是反向代理服务器,还是web服务器,也可以是邮件代理服务器,感谢俄罗斯人的智慧)。nginx作为反向代理服务器,主要负责把请求均匀的分摊到应用服务器中。为了达到均匀,Nginx有五种负载均衡策略。

    1.轮询

  请求依次轮流往每个应用服务器上进行分配,分配策略比较简单。
  缺点:不均匀,可能会出现,某些服务器接受的请求较重,负载压力重,有些负荷小,不可控。另外服务器之间需要进行session同步。

    2.权重轮询

  在轮询的基础上给每个应用服务器一定的权重,比如三台服务器,权重设置为 0.4:0.4:0.2。来到10个请求(序号1到10),那么根据轮询以及权重,序号1、4、 6、 9的请求会打到 第一台服务器上,序号 2、 5 、7 、10 的请求会打到第二台服务器上,剩余序号3 、 8的 请求打到第三台服务器上。
  优点:可以根据情况进行调整。可控,仍然需要进行session同步。

    3.IP-hash

  优点:无需进行session同步,固定IP会固定访问一台服务器。
  缺点:恶意攻击,会造成某台服务器压垮。提供的服务不同,面向的地区不同,IP可能会出现集中,造成不均匀,不可控。

    4.fair

  这种相当于自适应,会根据服务器处理请求的速度进行负载均衡分配。处理请求最早结束的,拿到下一个请求。看上去是不是很好。但是一般都不使用,说是考虑到网络不稳定因素。还有待研究。这种也需要进行session同步。

    5.URL-hash

  这种是根据URL进行hash,这样某些请求永远打某台服务器。利于利用服务器的缓存,但是可能由于URL的哈希值分布不均匀,以及业务侧重造成某些服务器压力大,某些负荷低。这种也需要进行session同步。

  目前比较流行的配置是使用第二种进行配置,但是实际生产中还是需要根据业务特点进行配置,每种策略都具有每种策略的优缺点。