nginx基础学习(四):nginx的upstream实现负载均衡


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

1. upstream的三种策略

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

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

ip_hash > weight > 轮询

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

2. upstream使用

2.1 upstream配置语法

upstream <名称> {
	[ip_hash策略];
    server <服务信息> [权重信息];
    server <服务信息> [权重信息];
}
  • 名称:必填,为当前负载均衡的策略定义一个名称,这个名称是自定义的,保证唯一性。
  • ip_hash策略:选填,用于指定使用ip_hash
  • 服务信息:必填,集群中提供服务的虚拟机地址,如:168.192.0.1:8080
  • 权重信息:选填,需要用weight指定每台虚拟机的权重信息。

2.2 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共享的问题。

2.3 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上。

2.4 轮询示例

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

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

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

5. 总结

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

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


文章作者: 程序猿洞晓
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 程序猿洞晓 !
评论
 上一篇
nginx基础学习(五):nginx实现防盗链、跨域、缓存、压缩功能介绍 nginx基础学习(五):nginx实现防盗链、跨域、缓存、压缩功能介绍
nginx除了三大主功能,还有很多其它实用的功能,系列文章的第五篇就让我们一起看看nginx的防盗链、跨域、缓存、压缩等功能。……。通过blog.itcrud.com访问本博客的网站,在返回的js脚本文件里面又发出了ajax请求获取文章列表,但是这个ajax请求的域名不是blog.itcrud.com/list,而是请求的……
2019-01-07
下一篇 
nginx基础学习(三):nginx的rewrite重定向和if判断使用 nginx基础学习(三):nginx的rewrite重定向和if判断使用
nginx的安装、启动关闭退出重启基本操作命令、nginx.conf配置文件了解、location的root、alias、proxy系列的数据都已经写过了,有兴趣了解的可以看看文末的推荐文章。location里面的东西真的很多,也是非常重要的。可以说在配置nginx过程中90%都是在配置location。这一篇文章的目的是写location中的另一个……
2019-01-03
  目录