Day02_08_Nginx教程之负载均衡策略(6种)_一一哥Sun的博客-程序员宅基地

技术标签: 运维技术  

Nginx负载均衡策略(6种)

一. 关于Nginx的负载均衡

在服务器集群中,Nginx起到一个代理服务器的角色(即反向代理),为了避免单独一个服务器压力过大,将来自用户的请求转发给不同的服务器.

二. Nginx负载均衡策略

负载均衡用于从"upstream"模块定义的后端服务器列表中选取一台服务器接受用户的请求。一个最基本的upstream模块是这样的,模块内的server是服务器列表:

#动态服务器组
upstream dynamic_syc {
    server localhost:8080;  #tomcat 7.0
    server localhost:8081;  #tomcat 8.0
    server localhost:8082;  #tomcat 8.5
    server localhost:8083;  #tomcat 9.0
}

在upstream模块配置完成后,要让指定的访问反向代理到服务器列表:

#其他页面反向代理到tomcat容器
location ~ .*$ {
    index index.jsp index.html;
    proxy_pass http://dynamic_syc;
}

这就是最基本的负载均衡实例,但这不足以满足实际需求;目前Nginx服务器的upstream模块支持6种方式的分配:

在这里,只详细说明Nginx自带的负载均衡策略,第三方不多描述。

1. 轮询

最基本的配置方法,上面的例子就是轮询的方式,它是upstream模块默认的负载均衡默认策略。每个请求会按时间顺序逐一分配到不同的后端服务器。

有如下参数:

注意:

  • 在轮询中,如果服务器down掉了,会自动剔除该服务器。

  • 缺省配置就是轮询策略。

  • 此策略适合服务器配置相当,无状态且短平快的服务使用。

2. weight

权重方式,在轮询策略的基础上指定轮询的几率。例子如下:

#动态服务器组
 upstream dynamic_syc {
     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参数用于指定轮询几率,weight的默认值为1,;weight的数值与访问比率成正比,比如Tomcat 7.0被访问的几率为其他服务器的两倍。

注意:

  • 权重越高分配到需要处理的请求越多。

  • 此策略可以与least_conn和ip_hash结合使用。

  • 此策略比较适合服务器的硬件配置差别比较大的情况。

3. ip_hash

指定负载均衡器按照基于客户端IP的分配方式,这个方法确保了相同的客户端的请求一直发送到相同的服务器,以保证session会话。这样每个访客都固定访问一个后端服务器,可以解决session不能跨服务器的问题。

#动态服务器组
upstream dynamic_syc {
    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

把请求转发给连接数较少的后端服务器。轮询算法是把请求平均的转发给各个后端,使它们的负载大致相同;但是,有些请求占用的时间很长,会导致其所在的后端负载较高。这种情况下,least_conn这种方式就可以达到更好的负载均衡效果。

#动态服务器组
upstream dynamic_syc {
    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. 第三方策略

第三方的负载均衡策略的实现需要安装第三方插件。

1️⃣. fair

按照服务器端的响应时间来分配请求,响应时间短的优先分配。

#动态服务器组
upstream dynamic_syc {
    server localhost:8080;  #tomcat 7.0
    server localhost:8081;  #tomcat 8.0
    server localhost:8082;  #tomcat 8.5
    server localhost:8083;  #tomcat 9.0
    fair;    #实现响应时间短的优先分配
}

2️⃣. url_hash

按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,要配合缓存命中来使用。同一个资源多次请求,可能会到达不同的服务器上,导致不必要的多次下载,缓存命中率不高,以及一些资源时间的浪费。而使用url_hash,可以使得同一个url(也就是同一个资源请求)会到达同一台服务器,一旦缓存住了资源,再此收到请求,就可以从缓存中读取。 

#动态服务器组
upstream dynamic_syc {
    hash $request_uri;    #实现每个url定向到同一个后端服务器
    server localhost:8080;  #tomcat 7.0
    server localhost:8081;  #tomcat 8.0
    server localhost:8082;  #tomcat 8.5
    server localhost:8083;  #tomcat 9.0
}
```  

 三. 总结

以上便是6种负载均衡策略的实现方式,其中除了轮询和轮询权重外,都是Nginx根据不同的算法实现的。在实际运用中,需要根据不同的场景选择性运用,大都是多种策略结合使用以达到实际需求。
 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/syc000666/article/details/90445905

智能推荐

卜若的代码笔记系列-unity系列-第一章:json-5001_卜若的博客-程序员宅基地

1.该系列算的上是unity的网络应用,嗯,不讲基础的,要基础的网上太多了。2.服务器请参考本人的sringboot系列的讲解3.正文:unity提供了一个类JsonUtility 最常用的是两个静态方法JsonUtility.ToJson(player)JsonUtility.FromJson<Player>(temp);前者是将对象序列化,转换...

jQuery Webcam Plugin jscam.swf文件反编译工具使用说明_daxzsxttn23337760的博客-程序员宅基地

jQuery webcam plugin是一个在ie,firefox,chrome下都可以用的摄像头摄像及拍照用的插件。(http://www.xarg.org/project/jquery-webcam-plugin/)在官方下载的源代码中提供的jscam.js生成的图片是320x240的图,用高清摄橡头时发挥不了它的价值,在一些业务需求下,如用摄像头拍证件照等,需要更高...

linkin大话数据结构--Set_LinkinPark8林肯的博客-程序员宅基地

Set 集合Set 集合不允许包含相同的元素,如果试把两个相同的元素加入同一个 Set 集合中,则添加操作失败。Set 判断两个对象是否相同不是使用 == 运算符,而是根据 equals 方法Set是Collection子接口;Set和Collection基本上一样,一点除外:Set无法记住添加的顺序,不允许包含重复的元素。当试图添加两个相同元素进Set集合,添加操作失败,

[论文笔记]Neurosurgeon: Collaborative Intelligence Between the Cloud and Mobile Edge_zl吉姆餐厅的博客-程序员宅基地

keypointsHow feasible it is to execute large-scale intelligent workloads on today’s mobile platforms?At what point is the cost of transferring speech and image data over the wireless network too high to justify cloud processing?What role should the mob

forum.php 下载,PHPWind Forums_古不帅的纸盒子的博客-程序员宅基地

PHPWind 是一套采用 php+mysql 数据库 方式运行并可生成 html 页面的全新且完善的强大系统. 我们希望作为一个开源.共享的软件,PHPWind 可以以其流畅的速度与高负载能力激起各位加入PHPWind阵营的热情!共同打造专业品牌PHPWind.NetPHPWind 除了具备多重子版块.和后台用户组权限可以自由组合外, 还具备分版块控制生成html页面、可选用的所见即所得编辑器、...

用plsql连接数据库 报错 无法解析指定的连接标识符 ora06413 连接未打开_花空城落又几梦的博客-程序员宅基地

把plsql默认安装路径的文件夹D:\Program Files(x86)\PLSQL Developer改成D:\Program Files\PLSQL Developer。因为多了个()所以不识别。

随便推点

[译]体素技术介绍_海洋_的博客-程序员宅基地_体素

A voxel representation of a scene has spatial data as opposed to the conventional rasterization view (as stored in a render target) which just has a slice of depth value. A voxelized scene can be easi...

完整详解swift GCD系列(三)dispatch_group_ruglcc的博客-程序员宅基地

原创Blog,转载请注明出处http://blog.csdn.net/column/details/swift-gcd.html一、dispatch_group把一组任务提交到队列中,这些队列可以不相关,然后坚挺这组任务完成的事件。几个用到的函数1、dispatch_group_create创建一个调度任务组[plain] view plain copy

神经网络是如何进行预测的_MoveFlower的博客-程序员宅基地_预测神经网络

上一篇文章中我们已经知道了如何将数据输入到神经网络中。那么神经网络是如何根据这些数据进行预测的呢?我们将一张图片输入到神经网络中,神经网络是如何预测这张图中是否有猫的呢??这个预测的过程其实只是基于一个简单的公式:z = dot(w,x) + b。看到这个公式,完全不懂~~不少同学可能被吓得小鸡鸡都萎缩了一截。不用怕,看完我下面的解说后,你就会觉得其实它的原理很简单。就像玻璃栈道一样,只是看起来可怕而已。上面公式中的x代表着输入特征向量,假设只有3个特征,那么x就可以用(x1,x2,x3)来表示

Spark 启动 java.lang.ClassNotFoundException: parquet.hadoop.ParquetOutputCommitter_徴心的博客-程序员宅基地

Spark启动报 java.lang.ClassNotFoundException: parquet.hadoop.ParquetOutputCommitter 我安装的是hadoop-2.6.0-cdh5.12.1和spark-1.6.0-cdh5.12.1 解决的版本是 将下面的jar包下载下来放到Spark的启动ClassPath下,然后重启Spark<dependency> <

mysql 连接池超时问题_Agly_Charlie的博客-程序员宅基地

文章目录mysql 连接池超时问题查看超时参数修改修改超时参数查看超时参数参考MySQL中interactive_timeout和wait_timeout的区别interactive_timeoutwait_timeout总结参考mysql 连接池超时问题Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: T...

union-find算法(java实现)_JacobGo的博客-程序员宅基地

首先是最原始union-find的代码package union.find;import java.util.Scanner;public class UF { private int[] id; // 分量id(以触点作为索引) private int count; // 分量数量 public UF(int N) { count = N; id = new int[

推荐文章

热门文章

相关标签