nginx的三大主角功能之一:负载均衡。主要应用在集群上面,根据机器的承载能力给予不同的处理权重。这些权重的方式可以通过三种方式来实现。分别是:ip_hashweight和轮询。每个使用的场景有所不同,下面来细说。

upstream的三种策略

  • ip_hash:通过ip来计算hash值,根据hash值将分配到不同的机器中,同一个hash值会一直落在一台机器上(也就是同一个ip)。
  • weight:通过设置权重值指定集群中不同机器的权重,权重越高,落到该机器的请求次数越多。
  • 轮询:将请求均匀的分配到集群中的每一台机器上。

轮询不需要特殊设置,是直接的默认方式。这三种方式优先级是不同,如下:

ip_hash > weight > 轮询

ip_hash是优先级最高,当配置了ip_hash,其他两种配置就会失效,只会根据ip_hash策略。配置了weight也是同样,轮询会失效。

upstream使用

upstream配置语法
upstream <名称> {
	[ip_hash策略];
    server <服务信息> [权重信息];
    server <服务信息> [权重信息];
}
  • 名称:必填,为当前负载均衡的策略定义一个名称,这个名称是自定义的,保证唯一性。
  • ip_hash策略:选填,用于指定使用ip_hash
  • 服务信息:必填,集群中提供服务的虚拟机地址,如:168.192.0.1:8080
  • 权重信息:选填,需要用weight指定每台虚拟机的权重信息。
ip_hash示例
upstream demo {
		ip_hash;
        server 192.168.0.1:8080;
        server 192.168.0.2:9090;
}
server {
    listen 80;
    server_name test.xxx.com;
 	location / {
        proxy_pass http://demo/;
 	}
}

当请求test.xxx.com时,会匹配进入到locationproxy_pass指定了upstream,此时就会根据ip_hash,对当前的请求IP做hash计算,得到最终会落到那台机器上。以后同一个ip请求,都会落到这个机器上。在某些项目中,可以考虑用这种方式来解决session共享的问题。

weight示例
upstream demo {
        server 192.168.0.1:8080 weight 2;
        server 192.168.0.2:9090 weight 1;
}
server {
    # …… 同上面的示例
}

请求test.xxx.com时,会两次落在192.168.0.1:8080机器上,一次落在192.168.0.2:9090上。

轮询示例

轮询很简单,采用默认即可。如下:

upstream demo {
        server 192.168.0.1:8080;
        server 192.168.0.2:9090;   
}

请求会均匀的落在两台机器上。

总结

根据不同的场景来适用不同的方式,一般使用默认即可。在多台机器性能有差异的情况下,可以考虑设置不同的权重,让性能好的机器不浪费,性能差的机器不超负荷。ip_hash一般用的比较少,不能保证负载的均衡性,要是运气衰的时候,有可能导致一台机器瞬时命中过多被弄死。个人感觉ip_hash更适用于一个小的应用,单台机器本身就是可以承载所有请求,之所以使用集群是用来提高服务的高可用,但是集群又有session共享问题,所以使用ip_hash作为解决方案就是个不错的选择。

还有一种情况需要说明一下,如果集群中的机器存在部分宕机的情况下,请求会自动分配到服务正常的机器上。不会影响服务的使用。基本外部是无感知的。