为什么用Nginx
Nginx是经过实践证明的、安全稳定的反向代理服务器,淘宝、新浪等大型互联网公司都有Nginx的身影。Nginx经过线上各种网络环境验证,能够帮你隔离各种复杂的网络环境,轻松支持10000+的同时在线连接数,同时拥有多种成熟的负载均衡策略,能够方便横向拓展后端服务。今天我们说一说Nginx负载均衡策略。
Nginx有以下几种负载均衡策略
1、基于轮询方式
轮询是基本的配置方法,它是upstream模块默认的负载均衡默认策略。每个请求会按时间顺序逐一分配到不同的后端服务器。
2、依据IP(ip_hash)分配
指定负载均衡器按照基于客户端IP的分配方式,这个方法确保了相同的客户端的请求一直发送到相同的服务器,以保证session会话。这样每个访客都固定访问一个后端服务器,可以解决session不能跨服务器的问题。
3、基于权重(weight)分配
每个upstream下服务会有一个权重(weight)配置,这个权重就是请求派发的概率,权重越大请求派发给服务的机会越大,可以根据服务资源情况分配权重。
4、少连接(least_conn)方式
把请求转发给连接数较少的后端服务器。轮询算法是把请求平均的转发给各个后端,使它们的负载大致相同;但是有些请求占用的时间很长,会导致其所在的后端负载较高,这种情况下少连接方式分配方式就可以达到更好的负载均衡效果。
当我们修改Nginx配置时可以在不停机的情况下执行命令(nginx -s reload)更新应用配置,这让在不修改Nginx源码情况下通行修改配置文件实现动态调整负载均衡提供了可能。今天重点介绍一下基于Nginx权重分配的动态负载均衡架构实现,系统结构如下面所示。
在这个架构中每个服务需提供以下通用接口
1、服务接口配置查询接口
每个服务可配置自身接口访问控制信息,比如启用哪些接口、禁用哪些接口以及接口分组等配置。
2、资源使用情况查询接口
每个服务提供接口查询所在服务器以及自身资源使用情况,比如CPU、内存、磁盘等使用情况。
监控服务会定期查询每个服务的资源使用情况以及接口配置。如资源使用率过高、内存不足、网络延迟越久则权重越小,同时监控服务还可以实现异常服务告警功能,配置每个服务默认权重,终监控服务会根据这些信息计算出每个服务接口的权重信息,同时监控服务会提供接口来查询服务权重信息。Nginx运行用户下会部署一个配置文件更新程序,这个程序会定时到监控服务查询具体服务接口权重信息,当发现权重信息有变化时会更新Nginx配置,然后执行命令(nginx -s reload)更新应用负载均衡配置信息。
上述负载均衡系统应注意以下问题
- 正常情况下整个系统的负载均衡应该是相对稳定,如果负载均衡配置变动太频繁会导致Nginx不稳定,但服务器CPU使用情况是波动的,这就要求监控服务负载均衡算法不能对CPU使用率太过敏感,生产上CPU使用率可以定50%、80%、90%几个权重梯度,只有突破新梯度时权重才会发生变化。
- 为保证系统高可用性,负载均衡权重有变化时应先备份现有Nginx配置文件,然后再更新Nginx配备文件,更新失败可以回退配置文件。