Nginx负载均衡算法分析[通俗易懂]

Nginx负载均衡算法分析[通俗易懂]随着互联网信息的爆炸性增长,负载均衡(loadbalance)已经不再是一个很陌生的话题,顾名思义,负载均衡即是将负载分摊到不同的服务单元,既保证服务的可用性,又保证响应足够快,给用户很好的体验。快速增长的访问量和数据流量催生了各式各样的负载均衡产品,很多专业的负载均衡硬件提供了很好的功能,但却价格不菲(如F5BIG-IP、CitrixNetScaler、Radware等等,虽然可以解决问题

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

随着互联网信息的爆炸性增长,负载均衡(load balance)已经不再是一个很陌生的话题,顾名思义,负载均衡即是将负载分摊到不同的服务单元,既保证服务的可用性,又保证响应足够快,给用户很好的体验。快速增长的访问量和数据流量催生了各式各样的负载均衡产品,很多专业的负载均衡硬件提供了很好的功能,但却价格不菲(如F5 BIG-IP、Citrix NetScaler、Radware等等,虽然可以解决问题,但其高昂的价格却往往令人望而却步),这使得负载均衡软件大受欢迎,nginx就是其中的一个。

nginx第一个公开版本发布于2004年,2011年发布了1.0版本。它的特点是稳定性高、功能强大、资源消耗低,从其目前的市场占有而言,nginx大有与apache抢市场的势头。其中不得不提到的一个特性就是其负载均衡功能,这也成了很多公司选择它的主要原因。本文将从源码的角度介绍nginx的内置负载均衡策略和扩展负载均衡策略,以实际的工业生产为案例,对比各负载均衡策略,为nginx使用者提供参考。

nginx的负载均衡策略可以划分为两大类:内置策略和扩展策略。内置策略包含加权轮询和ip hash,在默认情况下这两种策略会编译进nginx内核,只需在nginx配置中指明参数即可。扩展策略有很多,如fair、通用hash、consistent hash等,默认不编译进nginx内核。由于在nginx版本升级中负载均衡的代码没有本质性的变化,因此下面将以nginx1.0.15稳定版为例,从源码角度分析各个策略。

1. 加权轮询(weighted round robin)

轮询的原理很简单,首先我们介绍一下轮询的基本流程。如下是处理一次请求的流程图:

image

图中有两点需要注意,第一,如果可以把加权轮询算法分为先深搜索和先广搜索,那么nginx采用的是先深搜索算法,即将首先将请求都分给高权重的机器,直到该机器的权值降到了比其他机器低,才开始将请求分给下一个高权重的机器;第二,当所有后端机器都down掉时,nginx会立即将所有机器的标志位清成初始状态,以避免造成所有的机器都处在timeout的状态,从而导致整个前端被夯住。

接下来看下源码。nginx源码的目录结构很清晰,加权轮询所在路径为nginx-1.0.15/src/http/ngx_http_upstream_round_robin.[c|h],在源码的基础上,针对重要的、不易理解的地方我加了注释。首先看下ngx_http_upstream_round_robin.h中的重要声明:

image从变量命名中,我们就可以大致猜出其作用。其中,current_weight和weight的区别主要是前者为权重排序的值,随着处理请求会动态的变化,后者是配置值,用于恢复初始状态。

接下来看下轮询的创建过程,代码如下图所示。

image这里有个tried变量需要做些说明。tried中记录了服务器当前是否被尝试连接过。他是一个位图。如果服务器数量小于32,则只需在一个int中即可记录下所有服务器状态。如果服务器数量大于32,则需在内存池中申请内存来存储。对该位图数组的使用可参考如下代码:

image最后是实际的策略代码,逻辑很简单,代码实现也只有30行,直接上代码。

image

2. ip hash

ip hash是nginx内置的另一个负载均衡的策略,流程和轮询很类似,只是其中的算法和具体的策略有些变化,如下图所示:

imageip hash算法的核心实现如下图:

image从代码中可以看出,hash值既与ip有关又与后端机器的数量有关。经过测试,上述算法可以连续产生1045个互异的value,这是该算法的硬限制。对此nginx使用了保护机制,当经过20次hash仍然找不到可用的机器时,算法退化成轮询。因此,从本质上说,ip hash算法是一种变相的轮询算法,如果两个ip的初始hash值恰好相同,那么来自这两个ip的请求将永远落在同一台服务器上,这为均衡性埋下了很深的隐患。

3. fair

fair策略是扩展策略,默认不被编译进nginx内核。其原理是根据后端服务器的响应时间判断负载情况,从中选出负载最轻的机器进行分流。这种策略具有很强的自适应性,但是实际的网络环境往往不是那么简单,因此要慎用。

4. 通用hash、一致性hash

这两种也是扩展策略,在具体的实现上有些差别,通用hash比较简单,可以以nginx内置的变量为key进行hash,一致性hash采用了nginx内置的一致性hash环,可以支持memcache。

对上面的集中负载均衡算法进行测试(测试工具polygraph),考察下面三个关键的测试指标:

均衡性:是否能够将请求均匀的发送给后端

一致性:同一个key的请求,是否能落到同一台机器

容灾性:当部分后端机器挂掉时,是否能够正常工作

通过实际的对比测试,我们对nginx各个负载均衡策略进行了验证。下面从均衡性、一致性、容灾性以及适用场景等角度对比各种策略。

image无论哪种策略都不是万金油,在具体的场景下应该选择哪种策略一定程度上依赖于使用者对这些策略的熟悉程度。希望本文的分析和测试数据能够对读者有所帮助,更希望有越来越多、越来越好的负载均衡策略产出。

参考资料

http://wiki.nginx.org/HttpUpstreamConsistentHash

http://wiki.nginx.org/HttpUpstreamFairModule

http://wiki.nginx.org/HttpUpstreamRequestHashModule

http://www.web-polygraph.org/

http://nginx.org/

 

本文节选自:http://stblog.baidu-tech.com/?p=2027

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/182798.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 怎么修改mysql的表名称_mysql怎么修改表名?「建议收藏」

    怎么修改mysql的表名称_mysql怎么修改表名?「建议收藏」本篇文章将和大家讲述如何快速修改mysql表名,有同样需要的朋友学习一下吧,希望你看后能有所帮助。mysql修改表名的方法:具体步骤:打开cmd->输入“mysql-uroot-p”->输入密码,进入mysql->输入“altertablerenameto/asnew_tablename;”下面的代码包括了创建表的过程:#创建表结构.这样的建表方式,不仅仅是表的结构…

  • CSS Opacity属性对层叠上下文的影响

    CSS Opacity属性对层叠上下文的影响今天在遇到一个opacity过渡的时候,遇到了一个奇怪的问题:父元素设置了opacity。子元素设置了z-index:-1

  • OSG与CEGUI集成过程

    OSG与CEGUI集成过程最近做了一段时间的CEGUI和OSG之间的结合,有一点小小的收获。写一篇文章来记录所做的一点点事情。下面写一点CEGUI和OSG之间结合的东西。一.整体过程概述:CEGUI作为OSG的Drawable集成到OSG中。CEGUI继承osg::Drawable类,作为一个Drawable完成初始化,加入到一个节点中(osg::Geode)。然后将该节点在Viewerd执行realize()

  • Linux Shell经典面试题

    Linux Shell经典面试题

    2021年11月23日
  • vs2008sp1下载_vs2008激活成功教程版

    vs2008sp1下载_vs2008激活成功教程版安装VS2005SP1安装补丁包补充说明症状当您尝试运行MicrosoftWindowsServer2003或MicrosoftWindowsXP,计算机上安装大MicrosoftWindowsInstaller.msi)程序包或大型MicrosoftWindowsInstaller修补程序(.msp)程序包您可能会收到以下错误信息:错误1718。FileNa

  • Matlab常用绘图颜色搭配[通俗易懂]

    Matlab常用绘图颜色搭配[通俗易懂]推荐几款常用的离散色系搭配,并且附带matlab箱线图作为实例参考!

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号