说到负载均衡,我想说它天生就是不公平的。为什么这么说呢?请你想象这么一个场景,一块蛋糕切成5份,现在要将它分给A、B、C3个人,基于公平原则,我们说每个人正常可以分到5/3份,但是,5/3份很明显不好进行划分,诶碰巧这个时候A中午没有吃饭,能多吃几份,B、C肚子偏饱,1份即可,基于不公平原则,我们分给A3份蛋糕,B、C个一份,这样按照一定策略将资源进行划分的方式,是一种均衡的策略。

在web应用中,一个web应用(或者说某个服务)在生产环境中一般是集群部署,然后采用负载均衡硬件(F5)或者软件(nginx)将请求分发到不同的服务主机中进行处理,很明显,这里的蛋糕就相当于我们的web request,假设有5个request进来,基于一定的均衡策略,我们可能会将其中的3个request交给A服务器去处理,B、C服务器各处理1个request。下面我画张图片简单说明这个模型:

那么使用负载均衡有什么好处呢?首先优化资源利用率,最大化吞吐量,减少延迟,再者系统的伸缩性和可靠性也得到了相应的保障。

一、Nginx 负载均衡及相关策略介绍

负载均衡技术少不了相关的均衡策略,Nginx 中提供了 4 种均衡策略,我们可以根据具体的业务场景选择合适的均衡策略。下面分别介绍这 4 中均衡策略:

  • 1、基于轮询的均衡策略:

    轮询嘛,就是说对进到nginx的request按照遍历的方式进行分发,如果request 1 分发到 Server A,那么request 2将被分发到 Server B,......以此循环类推

  • 2、基于最少连接数的均衡策略:

    最少连接,也就是说nginx会判断后端集群服务器中哪个Server当前的 Active Connection 数是最少的,那么对于每个新进来的request,nginx将该request分发给对应的Server.

  • 3、基于ip-hash的均衡策略:

    我们都知道,每个请求的客户端都有相应的ip地址,该均衡策略中,nginx将会根据相应的hash函数,对每个请求的ip作为关键字,得到的hash值将会决定将请求分发给相应Server进行处理

  • 4、基于加权轮询的均衡策略:

    加权轮询,很显然这个策略跟我们开题引入的场景是一样的,nginx会给Server配置相应的权重,权重越大,接收的request数将会越多

上面的均衡策略其实都非常很好理解,但是如果想了解其实现原理,可以看源代码,但是小编就算了,我是看不懂C、C++的。

二、Nginx 不同均衡策略的配置介绍

  • 1、基于轮询的均衡策略:

这个是Nginx默认的均衡算法,如果你不进行相关的配置,默认会执行该策略,配置如下:

http {upstream myapp1 {server srv1.example.com;server srv2.example.com;server srv3.example.com;}server {listen 80;location / {proxy_pass http://myapp1;}}
}

可以看出,nginx负载均衡使用到的指令不多,其中比较重要的两个是upstreamproxy_pass,upstream块定义一个后端小集群,里边配置相关的Server组成这个集群,同时upstream为这个集群起个相应的名字,本实例叫myapp1.proxy_pass处于location块中,表示对于所有符合/的request,将会交给哪个集群进行处理,本实例为http://myapp1

但又一点我们需要注意,上面http://myapp1myapp1必须是upstream起的名字,对于协议是使用http还是https,都无所谓,如果你的协议使用https,则将http直接改成https即可。另外,如果你在upstream中的server指令中指定了协议名,那么在proxy_pass指令中就不需要加上协议名称了。

nginx负载均衡使用反向代理实现,也就是我们上面使用到的proxy_pass指令,支持的协议不止是httphttps,同时还支持FastCGIuwsgiSCGImemcachedgRPC,如果你需要使用除了httphttps外的其他协议,我们不能使用proxy_pass指令了,应该转而使用相应的指令,如fastcgi_passuwsgi_passscgi_passmemcached_passgrpc_pass

该策略处理负载,小编认为还是有缺陷的,不能防止某台Server出现负载过高的情况。因为如果有些请求执行时间过长,而系统的并发量却非常大,那么就可能导致某台Server出现request堆积,负载过高,snowslide is possible~

  • 2、基于最少连接数的均衡策略:

该策略主要使用了least_conn指令,具体配置如下:

 upstream myapp1 {least_conn;server srv1.example.com;server srv2.example.com;server srv3.example.com;}

该策略还是比较人性化的,可以按照机器的实际情况进行刚需分配。

  • 3、基于ip-hash的均衡策略:

当然了,如果我们想实现这样一个功能,我们想让对于相同客户端的请求每次都被分发到同一个Server进行处理,上面两种策略都是不做到。此策略可确保来自同一客户端的请求始终定向到同一服务器,但此服务器不可用时除外。相关配置如下:

upstream myapp1 {ip_hash;server srv1.example.com;server srv2.example.com;server srv3.example.com;
}

既然相同客户端的请求能被同一台Server进行处理,那么相同客户端的会话Session就可以实现持久化了。

  • 4、基于加权轮询的均衡策略:

基于加权轮询的策略就不需要过多讲解了,就是在轮询的基础上加上个权重信息

upstream myapp1 {server srv1.example.com weight=3;server srv2.example.com;server srv3.example.com;
}

这种策略适合Server机器处理能力有区别的情况。

三、nginx 负载均衡更多高级特性及配置

  • 1、健康检查

    不仅人需要体检,机器也是需要体检的,那么就当nginx就是那位体检医生吧!nginx健康检查是什么呢?当我们一个request进来被分发到相应的Server进行处理后,nginx会检查该request执行是否超时,是否执行失败了等情况,然后做出相应的处理---比如说当nginx检查出Server A执行某request时报出502错误了,那么下次nginx负载均衡时就会在upstream块中将Server A排除掉,不分发请求给到Server A了。

    对于健康检查的功能,nginx提供了基本两个指令,即max_failsfail_timeout,也就是说当nginx检查到某Server发生错误的request数达到max_fails或者执行某request执行时间超过fail_timeout了,如果发生超时了,nginx将开始使用实时请求优雅地探测Server,如果有响应,则认为对应的Server还是活着的,没有毛病的。

  • 2、更多配置

    针对上面upstream块中的server指令,其格式为:server address [parameters];,里边的parameters可以有很多的参数类型,比如说指定某台Server不参与负载均衡等。具体配置详见官网链接,点击此处传送门。

Nginx 学习 —— 负载均衡相关推荐

  1. Nginx+Tomcat负载均衡、动静分离

    目录 一:Nginx实现负载均衡原理 二:Nginx动静分离原理 三:Nginx+Tomcat负载均衡.动静分离实验 3.1部署Nginx负载均衡器 3.1.1关闭防火墙,将安装nginx所需的软件包 ...

  2. Nginx 实战-负载均衡

    一.负载均衡 今天学习一下Nginx的负载均衡.由于传统软件建构的局限性,加上一台服务器处理能里的有限性,在如今高并发.业务复杂的场景下很难达到咱们的要求.但是若将很多台这样的服务器通过某种方式组成一 ...

  3. Nginx动态负载均衡与配置管理

    背景 在Nginx集群有一定的规模时,比较让人头疼的问题有2个,一是如何在不reload nginx的情况下,动态更新后端rs,减少nginx reload的性能损耗,也能更好的对接到内部的部署平台: ...

  4. Nginx搭建负载均衡集群

    (1).实验环境 youxi1 192.168.5.101 负载均衡器 youxi2 192.168.5.102 主机1 youxi3 192.168.5.103 主机2 (2).Nginx负载均衡策 ...

  5. docker nginx 配置负载均衡

    在上篇的文章中我们介绍了docker nginx配置简单的代理 在这篇文章我们介绍docker 利用nginx配置负载均衡 所谓的负载均衡是两台服务器,或者是多台服务器上面部署项目,但是访问的方式是通 ...

  6. lnmp架构——nginx的负载均衡

    lnmp架构--nginx的负载均衡 1 什么是nginx 2 nginx的作用 3 nginx的特点 4 nginx的安装以及优化 4.1 安装nginx 4.2 优化 5 nginx主配置文件操作 ...

  7. Nginx+keepalived负载均衡高可用篇第③版

    Nginx+keepalived负载均衡高可用篇第③版 对付中.小型企业,假如没有资金去购买昂贵的四/七层负载均衡交换机,那么Nginx是不错的七层负载均衡选择,并且可以通过Nginx + Keepa ...

  8. Nginx+Tomcat 负载均衡集群方案

    2019独角兽企业重金招聘Python工程师标准>>> Nginx+Tomcat 负载均衡集群方案 该方案是我之前做过的一个项目生产应用的,目前运行良好,如何您生产使用,请先做好测试 ...

  9. nginx 之负载均衡 :PHP session 跨多台服务器配置

    公司一个项目单点压力越来越大,考虑到稳定性和降压,使用nginx做负载均衡,将请求分发到多个docker上去,这里记录下PHP多服务器间的会话session共享问题,解决方案是把session单独存在 ...

最新文章

  1. zabbix 客户端安装
  2. statpot:使用mongo+bootstrap+highcharts做统计报表
  3. 远去的高考,消逝的大一……
  4. Talend Restful
  5. UA MATH566 统计理论 QE练习题2.1
  6. PE文件重定位概念学习
  7. [Material Design] 教你做一个Material风格、动画的button(MaterialButton)
  8. 整数转罗马数字Python解法
  9. 判断IMEI或MEID是否合法
  10. 系统报 “client没有所需的特权” 的解决方法
  11. 52. N-Queens II (Array; Back-Track)
  12. Kindle Paperwhite安装PDF阅读器Koreader
  13. HDU2157 How many ways??(可达矩阵+矩阵快速幂)
  14. Dapper基础入门
  15. 大盘快速缩量 变盘在即
  16. python在教育领域的应用课题_研究型案例在Python教学方法中应用
  17. 华为200万年薪“天才少年”,来自985华中科技大学
  18. 怎么把图片文件压缩到最小?
  19. SpringBoot Zxing _ Java 生成二维码(可内嵌图片)
  20. java 简单的调用类_java 调用 C# 类库搞定,三步即可,可以调用任何类及方法,很简单,非常爽啊...

热门文章

  1. Android应用程序的五大基本组件
  2. Raspberry Pi 软件源
  3. 10月第3周网络安全报告:新增信息安全漏洞308个
  4. linux rar工具
  5. BPSK,QPSK,2FSK,16QAM,64QAM信号在高斯信道与瑞利信道下的误码率性能仿真
  6. websocket规范 RFC6455 中文版
  7. Zedboard学习(二):zedboard的Linux下交叉编译环境搭建
  8. 超出网络bios会话限制_?老旧BIOS说再见,拯救者系列设置超简单
  9. static/final/常量模式
  10. Linux命令行之逗趣无极限