深入剖析Nginx调度算法

Posted 云烟旧梦

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入剖析Nginx调度算法相关的知识,希望对你有一定的参考价值。

        各位同学大家好!我是张岩峰,这是我在nginx社区一直以来发表的第一篇博文。之前在社区也进行了一场直播课,看到很多同学说我很年轻,哈哈,是的!我这么年轻都可以会这么多,那么你应该也可以的!虽然年轻但是我经历的一些项目经验还是很丰富的。以后我会在这个社区多多做分享,大家一起努力学习。

       老师微信:feng0523fengxxx,老师邀你进微信交流群,一起交流经验。

       QQ交流群:1127825548

       只有多碰撞才会有技术上的突破!

        原文地址:​​https://www.nginx.org.cn/article/detail/520​

        录播地址:​​https://www.nginx.org.cn/course/detail/20​

深入剖析Nginx调度算法_nginx

   Nginx负载均衡相信很多同学都很熟悉吧,但是你真的了解它吗?今天小张带大家来深入了解一下Nginx的调度算法,我们来看下Nginx负载均衡是如何将流量转发给后端的。


1、轮询

       轮询,在nginx配置文件中是这样定义的,如下所示:

       upstream zhang_demo

               server 192.168.43.101:8080;

               server 192.168.43.102:8080;

       

       那么他是怎么工作的呢?假如现在有用户请求我们的WEB服务器,大家想一想,这个请求该给谁呢?因为我们用的是轮询算法,所以现在当请求进入时,首先会把请求给 192.168.43.101:8080,当第二个请求进入时会把请求给 192.168.43.102:8080,第三个请求给101,这就是轮询。很简单吧!

       总的来说:每个请求会按顺序逐一分配到不同的后端服务器。顺序为:ABABABAB.....


2、加权轮询

       加权轮询,在nginx配置文件中是这样定义的,如下所示:  

       upstream myweb

               server 192.168.43.101:8080 weight=1;

               server 192.168.43.102:8080 weight=2;

       

       加权轮询其实也很容易理解,看到上面的配置,大家应该发现和轮询算法有些不一样了吧,多了一个 weight的配置,这个 weight就是设置权重值的,Nginx负载均衡器会根据配置的权重的大小而分发给不同服务器不同数量的请求。如果不设置,则默认为1。

       那么我们上面的配置,当用户访问进来负载均衡器是如何分发请求的呢?101=A、102=B,那么顺序为:ABBABBABBABBABB......

       注意:值越大分配的请求越多。


3、ip_hash

       ip_hash ,在nginx配置文件中是这样定义的,如下所示:   

        upstream myweb

                 server 192.168.43.101:8080;

                 server 192.168.43.102:8080;

                 ip_hash;

       

       什么是ip_hash呢?其实也是很好理解的,假如你现在有两台服务器101和102,101和102服务器是我们的电商网站,如果当用户正在浏览购买商品时,加入到了购物车内,现在要去付款。那么肯定要跳转到另一个界面,对吧,这是客户一定会再发起请求。那么这时候如果请求给到了102服务器,那么可想而知,购物车空空如也。那么ip_hash就出现了,可以很好的帮我们解决这种局面。每个请求按访问IP的hash分配,这样来自同一IP固定访问一个后台服务器。

       总结:nginx负载均衡器会让相同的客户端ip请求相同的服务器


4、least_hash

       least_hash ,在nginx配置文件中是这样定义的,如下所示:     

       upstream myweb 

               least_conn;

               server 192.168.43.101:8080;

               server 192.168.43.102:8080;

       

       least_hash这个很简单,假如又来了!哈哈,假如有两台服务器,101服务器目前有48个用户请求,102服务器目前有40个用户请求,那么新来的访问请求,负载均衡器会给102服务器。 least_hash就是最少链接数,哪个机器连接数少就发分发给哪个机器。


5、url_hash

       url_hash按访问的URL的哈希结果来分配请求,使每个URL定向到一台后端服务器,可以进一步提高后端缓存服务器的效率。Nginx本身不支持url_hash,如果需要这种调度算法,则必须安装Nginx的hash软件包。

         大家可能光看上面这句话会有些不明白,没关系,这里我画了一幅图,如下:

深入剖析Nginx调度算法_nginx_02

  url_hash其实就是当用户发起访问请求时,如果请求的资源文件是a1.index那么这个请求会落到43.101这台服务器上,同理,如果请求的资源文件是a2.index那么这个请求会落到43.102这台服务器上。这样说大家是不是就很明白了。


6、fair

       fair,在nginx配置文件中是这样定义的,如下所示:   

       upstream myweb 

             fair;

             server 192.168.43.101:8080;

             server 192.168.43.102:8080;

         

       fair是比上面几种更加智能的负载均衡算法。此种算法可以根据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx本身是不支持fair的,如果需要使用这种调度算法,必须下载Nginx的upstream_fair模块。


       好了,通过本章的学习大家应该要懂的Nginx负载均衡器的调度算法是如何将流量调度出去的,这很重要。仅仅会使用轮询、加权轮询这还是不够的,在高并发环境下,这种肯定是不合适的。一起努力、一起加油,不一定只有年纪大技术才高,我一个00后,都可以做到如此,你们也是都可以的。

        我的名言分享给大家:十年磨剑无人知一朝出剑震天下!

以上是关于深入剖析Nginx调度算法的主要内容,如果未能解决你的问题,请参考以下文章

Nginx技术深入剖析

Nginx技术深入剖析

深入剖析 HIVE 的锁和事务机制

深入剖析 HIVE 的锁和事务机制

Nginx Location和Rewrite深入剖析

Linux(内核剖析):08---进程调度之Linux调度算法(调度器类公平调度(CFS))