`

nginx负载均衡原理

阅读更多

        对于一个大型网站来说,负载均衡是永恒的话题。随着硬件技术的迅猛发展,越来越多的负载均衡硬件设备涌现出来,如F5 BIG-IP、Citrix NetScaler、Radware等等,虽然可以解决问题,但其高昂的价格却往往令人望而却步,因此负载均衡软件仍然是大部分公司的不二之选。nginx作为webserver的后起之秀,其优秀的反向代理功能和灵活的负载均衡策略受到了业界广泛的关注。本文将以工业生产为背景,从设计实现和具体应用等方面详细介绍nginx负载均衡策略。

一.前言

        随着互联网信息的爆炸性增长,负载均衡(load balance)已经不再是一个很陌生的话题,顾名思义,负载均衡即是将负载分摊到不同的服务单元,既保证服务的可用性,又保证响应足够快,给用户很好的体验。快速增长的访问量和数据流量催生了各式各样的负载均衡产品,很多专业的负载均衡硬件提供了很好的功能,但却价格不菲,这使得负载均衡软件大受欢迎,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)

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

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

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

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

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


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


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


2. ip hash

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


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


         从代码中可以看出,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。

 

三. 对比测试

        本测试主要为了对比各个策略的均衡性、一致性、容灾性等,从而分析出其中的差异性,并据此给出各自的适用场景。为了能够全面、客观的测试nginx的负载均衡策略,我们采用了两个测试工具、在不同场景下做测试,以此来降低环境对测试结果造成的影响。首先简单介绍测试工具、测试网络拓扑和基本的测试流程。

1. 测试工具

1)easyABC

        easyABC是公司内部开发的性能测试工具,采用epool模型实现,简单易上手,可以模拟GET/POST请求,极限情况下可以提供上万的压力,在公司内部得到了广泛的使用。由于被测试对象为反向代理服务器,因此需要在其后端搭建桩服务器,这里用nginx作为桩webserver,提供最基本的静态文件服务。

2)polygraph

        polygraph是一款免费的性能测试工具,以对缓存服务、代理、交换机等方面的测试见长。它有规范的配置语言PGL(Polygraph Language),为软件提供了强大的灵活性。其工作原理如下图所示:


        polygraph提供client端和server端,将测试目标nginx放在二者之间,三者之间的网络交互均走http协议,只需配置ip+port即可。client端可以配置虚拟robot的个数以及每个robot发请求的速率,并向代理服务器发起随机的静态文件请求,server端将按照请求的url生成随机大小的静态文件做响应。这也是选用这个测试软件的一个主要原因:可以产生随机的url作为nginx各种hash策略的key。

        另外,polygraph还提供了日志分析工具,功能比较丰富,感兴趣的同学可以参考附录中的相关材料。

2. 测试环境

        本测试运行在5台物理机上,其中被测对象单独搭在一台8核机器上,另外四台4核机器分别搭建了easyABC、webserver桩和polygraph,如下图所示:


3. 测试方案

        首先介绍下关键的测试指标:

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

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

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

        以上述指标为指导,我们针对如下四个测试场景分别用easyABC和polygraph进行测试:

        场景1 server_*均正常提供服务;

        场景2 server_4挂掉,其他正常;

        场景3 server_3、server_4挂掉,其他正常;

        场景4 server_*均恢复正常服务。

        上述四个场景将按照时间顺序进行,每个场景将建立在上一个场景基础上,被测试对象无需做任何操作,以最大程度模拟实际情况。另外,考虑到测试工具自身的特点,在easyabc上的测试压力在17000左右,polygraph上的测试压力在4000左右。以上测试均保证被测试对象可以正常工作,且无任何notice级别以上(alert/error/warn)的日志出现,在每个场景中记录下server_*的qps用于最后的策略分析。

4. 测试结果

        表1和图1是轮询策略在两种测试工具下的负载情况。对比在两种测试工具下的测试结果会发现,结果完全一致,因此可以排除测试工具的影响。从图表中可以看出,轮询策略对于均衡性和容灾性都可以做到很好的满足。



        表2和图2是fair策略在两种测试工具下的负载情况。fair策略受环境影响非常大,在排除了测试工具的干扰之后,结果仍然有非常大的抖动。从直观上讲,这完全不满足均衡性。但是从另一个角度出发,恰恰是由于这种自适应性确保了在复杂的网络环境中能够物尽所用。因此,在应用到工业生产中之前,需要在具体的环境中做好测试工作。



        以下图表是各种hash策略,所不同的仅仅是hash key或者是具体的算法实现,因此一起做对比。实际测试中发现,通用hash和一致性hash均存在一个问题:当某台后端的机器挂掉时,原有落到这台机器上的流量会丢失,但是在ip hash中就不存在这样的问题。正如上文中对ip hash源码的分析,当ip hash失效时,会退化为轮询策略,因此不会有丢失流量的情况。从这个层面上说,ip hash也可以看成是轮询的升级版。


        图5为ip hash策略,ip hash是nginx内置策略,可以看做是前两种策略的特例:以来源ip为key。由于测试工具不便于模拟海量ip下的请求,因此这里截取线上实际的情况加以分析,如下图所示:


        图中前1/3使用轮询策略,中间段使用ip hash策略,后1/3仍然是轮询策略。可以明显的看出,ip hash的均衡性存在着很大的问题。原因并不难分析,在实际的网络环境中,有大量的高校出口路由器ip、企业出口路由器ip等网络节点,这些节点带来的流量往往是普通用户的成百上千倍,而ip hash策略恰恰是按照ip来划分流量,因此造成上述后果也就自然而然了。

 

四. 总结与展望

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


        以上从源码和实际的测试数据角度分析说明了nginx负载均衡的策略,并给出了各种策略适合的应用场景。通过本文的分析不难发现,无论哪种策略都不是万金油,在具体的场景下应该选择哪种策略一定程度上依赖于使用者对这些策略的熟悉程度。希望本文的分析和测试数据能够对读者有所帮助,更希望有越来越多、越来越好的负载均衡策略产出。

 

文章来源:http://blog.csdn.net/chabale/article/details/8955280

  • 大小: 12.5 KB
  • 大小: 20.8 KB
  • 大小: 15 KB
  • 大小: 9.7 KB
  • 大小: 32.8 KB
  • 大小: 12.8 KB
  • 大小: 7.2 KB
  • 大小: 8.2 KB
  • 大小: 27.4 KB
  • 大小: 32.2 KB
  • 大小: 19.2 KB
  • 大小: 32.1 KB
  • 大小: 19.9 KB
  • 大小: 53.1 KB
  • 大小: 23.1 KB
  • 大小: 32.7 KB
分享到:
评论

相关推荐

    nginx负载均衡配置,宕机自动切换方式

    在传统的nginx负载均衡配置中,并未直接提供后端服务器健康检查的功能,但nginx提供了几个重要的指令来帮助我们设置超时和重试机制,来间接保障服务的可用性。例如,proxy_connect_timeout指令用于设置nginx尝试连接...

    nginx负载均衡实现

    ### Nginx负载均衡实现 #### 一、负载均衡概念及必要性 负载均衡是一种用于在网络环境中分散工作负载的技术,通常用于改善网络性能、提高可用性和最大化资源利用。当单台服务器难以应对高流量和并发请求时,负载...

    nginx负载均衡配置文件实例

    ### Nginx负载均衡的基本原理 Nginx的负载均衡主要通过`upstream`模块实现,它可以将客户端的请求分发到多个后端服务器上。通过不同的负载均衡策略,如轮询、权重、最少连接数等,Nginx可以在服务器集群中智能地...

    nginx 负载均衡

    一、Nginx 负载均衡原理 Nginx的负载均衡主要通过反向代理实现,它接收来自客户端的请求,然后根据预设的负载均衡策略,将这些请求转发到后端的一组服务器上,以此来分散压力,保证整体系统的稳定性和性能。这不仅...

    Linux下nginx负载均衡

    本文将详细解析"Linux下Nginx负载均衡"这一主题,包括Nginx的基本概念、配置原理以及如何在Linux系统中设置负载均衡。 Nginx是一款高性能的HTTP和反向代理服务器,同时也是一款邮件协议代理服务器。它的主要特点是...

    张宴 使用Nginx轻松实现开源负载均衡

    2. Nginx负载均衡原理: - 轮询(Round Robin):每个请求按时间顺序轮流分配到不同的后端服务器,如果后端服务器出现故障,会自动排除故障服务器,将请求转发到其他正常的服务器。 - 权重(Weighted Round Robin...

    nginx负载均衡配置文件demo

    **Nginx负载均衡配置详解** 在高并发的互联网应用环境中,服务器的性能优化和负载分发至关重要。这里我们探讨的是如何使用Nginx作为反向代理和负载均衡器,来提升系统的整体处理能力,特别是在处理静态内容和优化...

    nginx负载均衡配置-windows.docx

    nginx 负载均衡配置-windows.docx 本文档主要介绍了在 Windows 平台上使用 Nginx 实现负载均衡的配置方法...通过阅读本文档,读者可以了解 Nginx 负载均衡的基本原理和配置方法,从而更好地应用 Nginx 在实际项目中。

    深入理解Nginx负载均衡与调优

    该文档以Nginx为基础,详细梳理了负载均衡的原理,以及优化方式,和实现步骤,无论新手还是大虾都可以从中得到深入体会。

    企业级keepalived高可用实战与Nginx负载均衡视频教程.zip

    3. Nginx负载均衡配置:学习Nginx的负载均衡器配置,包括轮询、最少连接、IP哈希等多种策略,以及如何根据业务需求选择合适的策略。 4. Keepalived与Nginx的集成:如何结合两者实现高可用性和负载均衡,确保即使在...

    nginx+redis负载均衡、session共享

    在构建高性能、高可用的Web服务时,"nginx+redis负载均衡、session共享"是一个常见的解决方案。这个方案结合了Nginx的反向代理和负载均衡能力,以及Redis的内存数据存储和分布式特性,用于处理高并发场景下的HTTP...

    nginx负载均衡服务器

    **一、Nginx负载均衡原理** Nginx的负载均衡主要通过其HTTP模块中的upstream配置实现。它可以根据不同的策略将客户端请求分发到不同的后端服务器上,常见的策略包括: 1. **轮询(round-robin)**:每个请求按时间...

    nginx 负载均衡与反向代理资源

    1. **负载均衡原理**:通过将来自客户端的请求分发到多个后端服务器,负载均衡可以防止单一服务器过载,提高系统整体性能和可用性。 2. **轮询策略**:Nginx默认的负载均衡策略是轮询,每个请求按顺序分配到不同的...

    Nginx与tomcat 负载均衡

    Nginx与Tomcat的负载均衡 Nginx与Tomcat的负载均衡是指通过Nginx服务器来实现Tomcat...* 负载均衡的实现原理和效果 通过上述步骤和知识点,我们可以实现高性能负载均衡的Tomcat集群,以提高系统的可扩展性和高性能。

    nginx1.8 负载均衡

    一、Nginx 负载均衡的基本原理 Nginx 作为前端服务器,接收来自客户端的请求,然后根据预设的策略将这些请求分发到后端的一组服务器上。这种机制可以确保多个服务器共同处理工作负载,提高整体性能,同时确保即使...

    解析nginx负载均衡

    ### 解析nginx负载均衡 #### 一、负载均衡的重要性及应用场景 对于现代互联网服务而言,负载均衡不仅是确保网站稳定运行的关键技术之一,更是提高用户体验、优化资源利用的重要手段。随着互联网流量的持续增长以及...

    企业级Nginx负载均衡与keepalived高可用实战

    ### 企业级Nginx负载均衡与Keepalived高可用实战 #### 一、Nginx负载均衡技术概述 在互联网环境下,随着访问量的不断增长,单一服务器往往难以满足需求,这时候就需要采用负载均衡技术来分担请求压力。Nginx作为一...

Global site tag (gtag.js) - Google Analytics