1 / 11
文档名称:

解析Nginx负载均衡.doc

格式:doc   大小:410KB   页数:11页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

解析Nginx负载均衡.doc

上传人:书犹药也 2020/3/12 文件大小:410 KB

下载得到文件列表

解析Nginx负载均衡.doc

文档介绍

文档介绍:对于一个大型网站来说,负载均衡是永恒的话题。随着硬件技术的迅猛发展,越来越多的负载均衡硬件设备涌现出来,如F5BIG-IP、Scaler、Radware等等,虽然能够解决问题,但其高昂的价格却往往令人望而却步,因此负载均衡软件依然是大部分公司的不二之选。nginx作为webserver的后起之秀,其优秀的反向代理功能和灵活的负载均衡策略受到了业界广泛的关注。本文将以工业生产为背景,从设计实现和具体应用等方面详细介绍nginx负载均衡策略。关键字:,负载均衡(loadbalance)已经不再是一个很陌生的话题,顾名思义,负载均衡即是将负载分摊到不同的服务单元,既保证服务的可用性,又保证响应足够快,给用户很好的体验。快速增长的访问量和数据流量催生了各式各样的负载均衡产品,很多专业的负载均衡硬件提供了很好的功能,但却价格不菲,这使得负载均衡软件大受欢迎,nginx就是其中的一个。nginx第一个公开版本发布于,。它的特点是稳定性高、功能强大、资源消耗低,从其当前的市场占有而言,nginx大有与apache抢市场的势头。其中不得不提到的一个特性就是其负载均衡功能,这也成了很多公司选择它的主要原因。本文将从源码的角度介绍nginx的内置负载均衡策略和扩展负载均衡策略,以实际的工业生产为案例,对比各负载均衡策略,为nginx使用者提供参考。:内置策略和扩展策略。内置策略包含加权轮询和iphash,在默认情况下这两种策略会编译进nginx内核,只需在nginx配置中指明参数即可。扩展策略有很多,如fair、通用hash、consistenthash等,默认不编译进nginx内核。由于在nginx版本升级中负载均衡的代码没有本质性的变化,,从源码角度分析各个策略。(weightedroundrobin)轮询的原理很简单,首先我们介绍一下轮询的基本流程。如下是处理一次请求的流程图:图中有两点需要注意,第一,如果能够把加权轮询算法分为先深搜索和先广搜索,那么nginx采用的是先深搜索算法,即将首先将请求都分给高权重的机器,直到该机器的权值降到了比其它机器低,才开始将请求分给下一个高权重的机器;第二,当所有后端机器都down掉时,nginx会立即将所有机器的标志位清成初始状态,以避免造成所有的机器都处在timeout的状态,从而导致整个前端被夯住。接下来看下源码。nginx源码的目录结构很清晰,加权轮询所在路径为nginx-.[c|h],在源码的基础上,针对重要的、不易理解的地方我加了注释。:从变量命名中,我们就能够大致猜出其作用。其中,current_weight和weight的区别主要是前者为权重排序的值,随着处理请求会动态的变化,后者是配置值,用于恢复初始状态。接下来看下轮询的创立过程,代码如下图所示。这里有个tried变量需要做些说明。tried中记录了服务器当前是否被尝试连接过。她是一个位图。如果服务器数量小于32,则只需在一个int中即可记录下所有服务器状态。如果服务器数量大于32,则需在内存池中申请内存来存储。对该位图数组的使用可参考如下代码:最后是实际的策略代码,逻辑很简单,代码实现也只有30行,直接上代码。,流程和轮询很类似,只是其中的算法和具体的策略有些变化,如下图所示:iphash算法的核心实现如下图:从代码中能够看出,hash值既与ip有关又与后端机器的数量有关。经过测试,上述算法能够连续产生1045个互异的value,这是该算法的硬限制。对此nginx使用了保护机制,当经过20次hash依然找不到可用的机器时,算法退化成轮询。因此,从本质上说,iphash算法是一种变相的轮询算法,如果两个ip的初始hash值恰好相同,那么来自这两个ip的请求将永远落在同一台服务器上,这为均衡性埋下了很深的隐患。,默认不被编译进nginx内核。其原理是根据后端服务器的响应时间判断负载情况,从中选出负载最轻的机器进行分流。这种策略具有很强的自适应性,可是实际的网络环境往往不是那么简单,因此要慎用。、一致性hash这两种也是扩展策略,在具体的实现上有些差别,通用hash比较简单,能够以nginx内置的变量为key进行hash,一致性hash采用了nginx内置的一致