Nginx 的负载均衡模块目前支持 4种调度算法,下面进行分别介绍,其中后两项属于第三方调度算法。

先来了解一下upstream的淘宝技术团队开发的nginx模快nginx_upstream_check_module来检测后方realserver的健康状态,如果后端服务器不可用,则所有的请求不转发到这台服务器。
以下为参数意义

#server default: max_fails=1(设置最大失败次数为 1,也就是最多进行 1 次尝试,且超时时间为 (fail_timeout 这个参数里边记录的值) 10秒), fail_timeout=10s, weight=1;
#check default: 
interval=3000 # 检查请求的间隔时间。
rise=2 #检查2次正常后,服务器呗标记为up
fall=5 #在检查5次 失败后,服务器被标记为down。
timeout=1000 #超时时间1秒
type=tcp #协议类型
default_down=true; #设置后端服务器的初始状态,默认为down。

以上配置的 意义:对负载均衡条目中的所有节点,每个3秒检测一次,请求2次正常则标记 realserver状态为up,如果检测 5 次都失败,则标记 realserver的状态为down,超时时间为1秒,请求协议使用tcp,默认服务器状态为down。

1、轮询(默认 即 weight=1)。每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某台服务器宕机,故障系统被自动剔除,使用户访问不受影响。Weight 指定轮询权值,Weight值越大,分配到的访问机率越高,主要用于后端每个服务器性能不均的情况下。

upstream yp_nginx_ctc{  // 此处我们走的是 内网千兆宽带
     server 10.203.**.***; #t.web19
      server 10.203.**.***; #t.web18
      #server 10.203.**.***; #t.web4
      check interval=3000 default_down=false; 
  }

weight > 1
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
如果后端服务器down掉,能自动剔除。
比如以下配置,则6.11服务器的访问量为6.10服务器的两倍。

upstream bakend {
server 192.168.6.10 weight=1;
server 192.168.6.11 weight=2;
}

2、ip_hash。每个请求按访问 IP的 hash 结果分配,这样来自同一个 IP的访客固定访问一个后端服务器,有效解决了动态网页存在的 session 共享问题。

upstream my_nginx_ctc{
        ip_hash; 
        server 10.203.66.200; #t.erm3
        server 10.203.67.40;  #t.erm4
        #server 10.203.67.77;  #t.erm5
        server 10.203.67.51; #t.web5
        check interval=3000 default_down=false; 
    }

3、 fair。这是比上面两个更加智能的负载均衡算法。此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx本身是不支持 fair 的,如果需要使用这种调度算法,必须下载 Nginx 的 upstream_fair 模块。

upstream resinserver{
server 192.168.1.10:8080;
server 192.168.1.11:8080;
fair;
}

4、url_hash。此方法按访问 url 的 hash 结果来分配请求,使每个 url 定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率。Nginx 本身是不支持 url_hash 的,如果需要使用这种调度算法,必须安装 Nginx 的 hash 软件包。

upstream resinserver{
server 192.168.1.10:8080;
server 192.168.1.11:8080;
hash $request_uri;
hash_method crc32;
}