nginx的三大主角功能之一:负载均衡。主要应用在集群上面,根据机器的承载能力给予不同的处理权重。这些权重的方式可以通过三种方式来实现。分别是:ip_hash
、weight
和轮询。每个使用的场景有所不同,下面来细说。
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
时,会匹配进入到location
,proxy_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
作为解决方案就是个不错的选择。
还有一种情况需要说明一下,如果集群中的机器存在部分宕机的情况下,请求会自动分配到服务正常的机器上。不会影响服务的使用。基本外部是无感知的。