在服务器集群环境中,Nginx扮演着代理服务器的角色,也被称为反向代理,其功能包括将用户请求转发到不同的服务器上,以防止单个服务器因负载过大而发生故障。本文主要介绍Nginx服务器的5种负载均衡策略及实现方式。
一、Nginx的负载均衡策略
“upstream”模块在Nginx中用于定义后端服务器列表,并从中选取服务器来接收用户的请求。例如:
#动态服务器组 upstream dynamic_zuoyu { server localhost:8080; #tomcat 7.0 server localhost:8081; #tomcat 8.0 server localhost:8082; #tomcat 8.5 server localhost:8083; #tomcat 9.0 }
要让指定的访问被反向代理到这个服务器列表,可以使用以下配置:
location ~ .*$ { index index.jsp index.html; proxy_pass http://dynamic_zuoyu; }
这就是最基本的负载均衡实例。然而,这可能无法满足所有的实际需求。因此,Nginx的upstream模块支持6种分配方式:
这里仅详细介绍Nginx自带的负载均衡策略,不包括第三方策略。
1、轮询
轮询是最基本的配置方法,也是upstream模块默认的负载均衡策略,它会依次将每个请求逐一分配到不同的后端服务器。
参数注意:
- 在轮询中,如果服务器宕机,Nginx会自动将其从服务器列表中移除;
- 缺省配置即采用轮询策略;
- 此策略适用于服务器配置相当、无状态且响应时间短的服务。
2、权重
权重方式基于轮询策略,并添加了轮询概率的配置。例如:
#动态服务器组 upstream dynamic_zuoyu { server localhost:8080 weight=2; #tomcat 7.0 server localhost:8081; #tomcat 8.0 server localhost:8082 backup; #tomcat 8.5 server localhost:8083 max_fails=3 fail_timeout=20s; #tomcat 9.0 }
weight参数用于设置轮询的概率,数值与访问比率成正比,比如上述例子中Tomcat 7.0的访问几率是其他服务器的两倍。
注意:
- 权重越高,分配到的请求越多;
- 此策略可以与least_conn和ip_hash结合使用;
- 此策略适合服务器硬件配置差异较大的情况。
3、IPhash
指定负载均衡器按照基于客户端IP的分配方式,确保来自同一客户端的请求始终发送到同一台服务器,以保证session会话的持续性。配置如下:
#动态服务器组 upstream dynamic_zuoyu { ip_hash; #保证每个访客固定访问一个后端服务器 server localhost:8080 weight=2; #tomcat 7.0 server localhost:8081; #tomcat 8.0 server localhost:8082; #tomcat 8.5 server localhost:8083 max_fails=3 fail_timeout=20s; #tomcat 9.0 }
注意:
- 在nginx版本1.3.1之前,不能在ip_hash中使用权重(weight);
- ip_hash不能与backup同时使用;
- 此策略适合有状态服务,如session;
- 当需要剔除服务器时,必须手动将其down掉。
4、最少连接数
把请求转发给连接数较少的后端服务器。与轮询不同,轮询是将请求平均分配给各个后端,而least_conn可以将长时间占用的请求转移到连接数较少的服务器上,从而优化负载均衡效果。配置如下:
#动态服务器组 upstream dynamic_zuoyu { least_conn; #把请求转发给连接数较少的后端服务器 server localhost:8080 weight=2; #tomcat 7.0 server localhost:8081; #tomcat 8.0 server localhost:8082 backup; #tomcat 8.5 server localhost:8083 max_fails=3 fail_timeout=20s; #tomcat 9.0 }
注意:此负载均衡策略适合处理时间长短不一导致服务器过载的情况。
5、第三方策略
第三方负载均衡策略需要安装额外的第三方插件。如:
- fair:根据服务器端的响应时间来分配请求,优先分配给响应时间短的服务器;
- url_hash:根据请求的URL的hash结果来分配请求,使同一个URL定向到同一台后端服务器,配合缓存命中使用。
以上便是6种负载均衡策略的实现方式,除了轮询和权重之外,都是基于Nginx的不同算法实现的。在实际运用中,需要根据具体场景灵活选择和组合使用这些策略以达到最佳的效果。
-
广告合作
-
QQ群号:707632017