基于Nginx服务器负载均衡技术的研究与改进

2018-03-29 04:34张云许江淳李玉惠王志伟史鹏坤
软件 2017年8期

张云 许江淳 李玉惠 王志伟 史鹏坤

摘要:为了减轻快速增长的网络负载压力,本文为web后端服务器集群搭建了基于Nginx的负载均衡服务器,将其作为集群的反向代理服务器,使集群具备了负载均衡的功能,对负载均衡算法进行了分析。并针对Ngmx自带负载均衡策略的缺陷提出了一种动态自适应负载均衡算法,改进型加权最小连接数算法,同时对其算法进行了设计。测试的实验结果验证了改进型加权最小连接数算法的可行性。

关键词:Nginx;服务器集群;均衡策略;动态自适应负载均衡算法

中图分类号:TP3-05 文献标识码:A DOI:10.3969/j.issn.1003-6970.2017.08.002

本文著录格式:张云,许江淳,李玉惠,等.基于服务器负载均衡技术的研究与改进[J].软件,2017,38(7):06-12

随着移动互联网的蓬勃发展,传统运营商的主要利润点如短信及话费的利润受到前所未有的冲击。为适应新时代的新形势,各大运营商均已在网络支撑方面传统的运维体系已出现在面对大量网络负荷时请求处理缓慢,服务器负载过重导致页面无响应等使用户使用体验较差等状况。因此各大运营商均将建立新一代集中运维体系作为一个重要缓解网络压力手段。

本文针对Nginx自带的算法不能考虑服务器集群中各个具体服务器的实时负载情况单纯按照初始设定来经行网络请求分配的问题,对Linux操作系统和Nginx服务器源码进行分析和研究,着重对负载均衡算法进行了优化从而达到减少服务器响应时间的同时提高服务器性能的稳定性,进而使用户获得更好的网络服务体验。

1 Nginx服务器

1.1 Nginx的模块体系

Nginx的内部结构是由核心部分和一系列功能检块组成的,这样使得每个模块的功能相对简单,便于对系统进行功能扩展,各模块之间的关系如图1所示:

标准的Nginx模块一般可分为五大类:核心模块,邮件服务模块,可选Http模块,标准Http模块和第三方模块。

http模块和mail模块分别处理http相关协议与邮件相关协议(如SMTP/IMAP/POP3等)的各类事件,同时确保这些事件能以正确的顺序来调用其它相关功能模块。

(1)事件模块(event module),用于搭建独立的事件处理框架包括独立的事件处理机制和事物响应机制,为nginx处理各种不同事物提供保障。

(2)handler模块(phase handler),用来处理具体的用户请求并同时生成待响应内容。

(3)filter模块(out putfilter),用来处理像客户端发送的响应,通过该模块可以对服务器向客户端的输出经行修改。

(4)反向代理模块(upstream),Nginx可作为反向代理服务器,用户先将请求发送到反向代理服务器,反向代理服务器再根据请求类型或路由参数将具体请求在提交给真正处理请求的后端服务器,读取响应数据并将该数据在传回客户端。

(5)负载均衡模块(load-balancer),该模块内含多种负载均衡算法,与upstream模块同时使用,当upstream配置文件中使用不同标记时调用该模块中不同算法来实现不同的负载均衡策略。

(6)第三方模块(extend module),具体使用时如Nginx自带模块并不能很好解决实际问题时,用户需可自行添加一些模块。

1.2 Nginx的服务器架构

Nginx在运行时会产生一个主进程和多个工作进程,同时也会产生一些cache相关进程。工作时,客户端发出新的网络请求时,Ngmx服务器会与后端服务器进行通信,根据具体的负载均衡策略Ngmx会将请求提交给不同的服务器,服务器接到这些请求时会进行数据的处理以及相关页面的渲染,然后将这些处理后的内容提交给Nginx服务器,Nginx服务器再将接收到的处理结果反馈给客户端。

当客户端访问的是一些常用数据时,Ngmx服务器会根据客户端发送的请求来确定客户端所需要的具体内容同时根据该请求来访问不同的缓存服务器,缓存服务器给Nginx返回具体数据后,Nginx将缓存服务返回的数据直接反馈给客户端以此来降低服务器的负荷,从而减少网络服务的响应时间。该模型中Nginx的主进程,工作进程,缓存服务器,后端服务器之间关系架构如图2所示:

1.3 Nginx的反向代理

反向代理是通过一种反向代理的手段将请求发送给反向代理服务器,反向代理服务器再将请求发送给后端服务器,同时后端服务器也将数据的处理结果发送给反向代理服务器,接收到这些数据后反向代理服务器再将数据返回给客户端。通过这种方法使服务器集群在客户端看来只需访问反向代理服务器,减轻了客户端发送请求的网络资源开销。反向代理服务器基本原理示意图3所示:

1.4 Nginx的负载均衡

按照OSI网络模型,Nginx所实现的负载均衡是处于第七层的Web负载均衡,适用于Web服务器集群。负载均衡策略的划分有很多种,在此按照最常用的分类方式将Nginx的负载均衡策略划分为两种:内置负载均衡策略和扩展负载均衡策略。其中,内置策略包括加权轮询(Round Robin)策略,ip_hash策略和最小连接数(Least Connected)策略,默认情況下,Nginx使用轮询策略将网络请求传送到应用服务器,不需要任何精确配置,只使用基本设置就可以进行工作,一个精简的Nginx负载均衡配置可以如下所示:

该段配置利用upstream模块,将本地三个端口(3000,3001,3002)中对应的服务器程序当作三个负载均衡资源并按照轮询策略将这些资源自动写人一张轮询列表中,当服务器接收到客户端请求时会将请求按照(3000,3001,3002)的顺序依次分配给这三个端口对应的服务器程序。

2 动态自适应负载均衡算法的设计

2.1 负载均衡算法的基本思路

当服务器负载较小时服务器的处理能力相似,则请求分配到任意服务器对与用户的体验差距都不大,而为了一定程度上减轻负载均衡处理器的工作量,当存在服务器内存及CPU使用率低于20%时,带宽占用率相近的情况下采取Nginx自带的最小连接数策略。

当全部服务器的内存或CPU使用率高于20%时:将后端服务器的CPU占用伞,内存占用率以及带宽占用率作为影响因子,根据每个因子的权值向量,amem,anet计算平均负载冗余(其中n为服务器数量):

同时计算具体每台服务器的负载冗余值:

将计算得出的负载冗余值小于平均负载冗余的服务器列为备选服务器,使之列人备选服务器表,然后再对列入备选服务器表的服务器采取最小接数负载均衡算法进行负载均衡。直到备选服务器列表中所有服务器负载都大于该平均值时重新计算负载冗余。

其算法示意图为图4所示:

2.2 改进型加权最小连接数算法

加权最小连接数调度算法是一种动态的负载均衡算法,其思想如下:假设服务器集群用服务器集合S={S1,S2,…,Sn}(n>l)来表示,每个服务器的权值用W(Si)(l

当服务器节点Si又满足公式(4):

根据加权最小连接数调度算法的思想,此时,只要满足式子(4),就优先给服务器Si分配负载。

由于服务器的当前连接数并不能准确代表服务器的实际负载量,随着系统的运行,各个服务器的处理能力和状态会不断地发生变化。因此,提出一种改进型加权最小连接数算法来重新计算权值。

改进型加权最小连接数算法是在将新的连接请求分配到具体服务器之前会进行服务器负载冗余值计算,具体的计算需要提取服务器的运行参数作为负载因子,与所对应的权值相乘作为具体的负载冗余度。下面将介绍具体负载因子的提取方法和与之对应的权值计算方法。

对于云平台服务器而言,为了达到满足负载均衡的效果,选取如下动态负载因子作为判决条件:CPU使用率内存使用率t/wew/,网络带宽使用率以及最小连接数算法所关注的服务器当前请求中请求的数量num。

加权最小连接数的各个因子的权值计算:

该算法中因权值向量的选择会直接影响到最终服务器负载冗余计算的结果,且因为有多个权值,人为确定的值产生的计算结果会与实际情况产生偏差。

因此本文选择模拟退火算法来确定具体的权值向量。模拟退火算法来源于固体退火原理,是一种基于概率的算法,其过程分为:先将待加热体加至充分高温,随后使其缓慢冷却,加温过程中,加热体内部粒子内能随温度升高逐渐增大,冷却过程中其内部粒子内能逐渐趋向有序,在不同温度时加热体本身都处在相应的平衡态,最后降至常温时达到基态,内能在基态时达到最小值。

模拟退火算法是一种可以较好解决组合优化问题的算法,并且最终结果与初始态无关,其结果更倾向于全局最优解。

本文选用的模拟退火算法模型如图5所示:

具体过程为先在服务器集群中随机抽取一台机器作为测试机器,暂时屏蔽其他机器,使用模拟工具模拟发送请求并提交给该测试服务器,同时记录本文所选择的三个负载因子,和服务器响应时间。根据公式:

计算权值向量,并将结果记录于权值向量组

三元方程组表示该负载均衡模型,表示具体服务器的负载情况,R表示具体网络请求,S为选择函数表示该服务器负载情况与分配至该服务器请求的映射关系。T表示集群对于请求的响应时间,定义G 所以具体服务器负载为:

目标函数可以定义为:

若服务器达到最佳负载状态则该服务器性能与其对应的负载得到较完美匹配,服务器集群也同时处在一个较为理想的运行状态。根据所定义的目标函数我们可以分析出,目标函数值越小则越接近理想状态。对于模拟退火算法:s= 收敛时,目标函数得到最小值。

根据模拟退火算法原理,该模型的迭代过程为:

产生新解:即为解集,中的某一列即为某个权值向量的解,对现有解中元素进行部分或全部的替换,产生新解所使用的方式确定了解的结构。同时避免了了陷人局部最优解。

计算新解的目标函数:将新解带入目标函数中,使用监测工具获取服务器集群的平均响应时间,并计算目标函数。

接受新解:计算目标函数值与前一个目标函数值的差值,并以此确定新解是否可以被接受,根据Metropolis原則,新解的接受概率可以表示为:

其中,t表示当前温度,也就是说集群的平均响应时间比之前更小则接受新解,反之根据公式t越高接受新解概率越大,随着算法持续进行,t将会越来越低,所产生的解也随之逐步收敛。

降温:该算法每执行一次t都会逐渐减小,算法的解逐步收敛。本文所建立的模型在进行第n次迭代时,t根据公式:

确定,在此我们选择初始温度&=10000。

停止:为使算法在合理时间内输出结果,根据模型的收敛速度,定义该算法在t<0.1时停止,根据我们的实验该算法在大约迭代227次后停止,本文将算法结束后最后输出的权值向量作为最终负载因子的权值向量。

3 测试结果分析

3.1 服务器性能测试

在进行测试时,先将需要监测的服务器ip加入sP0tlight的监听服务器列表中,并将服务器须监测的进程列入spotlight的进程监控器中。下文将列出并发测试及负载测试时服务器资源的实时监控如图6所示:

图6中第二幅曲线图即为后端服务器的cpu性能曲线,其中深蓝色为配置本文所研究改进型加权最小连接数策略时后端服务器cpu性能曲线,橙色为配置最小连接数策略时后端服务器cpu性能曲线,黄色为配置加权轮循策略时cpu性能曲线,浅蓝色为Nginx服务器本身cpu性能曲线。可以看出本文所研究的负载均衡策略对于后端服务器cpu资源占用情况与Nginx自带最小连接数策略相比,曲线走势基本一致,但cpu负载明显降低。与加权轮

询策略相比,虽然有时加权轮询具有一定优势,但大部分时间cpu使用率高于本文所研究的改进型加权最小连接数策略,且采用加权轮询策略时cpu的性能震荡明显比本文所研究算法剧烈。由于加权轮询策略算法简洁,并不需要采集具体服务器参数,因此对cpu的压力在部分情况下优于最小连接数以及本文所采用的改进型加权最小连接数策略,所以从cpu性能来看本文所研究算法基本达到预期结果。

以上三图(图7,图8,图9)分别为配置加权轮询,最小连接数和本文所研究改进型加权最小连接数策略时服务器集群的带宽及内存使用率。通过对比可以得出带宽使用率在使用加权轮循策略时服务器内存及网络带宽使用率震荡最为剧烈[17],其次为最小连接数,本文所采用的改进算法虽然在带宽及内存负载较小时使用率略高,但总体性能震荡最小集群性能也最稳定。

3.2 网络请求响应时间测试

本文选用httping作为请求响应时间的测试X具,通过事先录制好的脚本在服务器不同负载状况下向服务器发送请求并记录服务器响应时间。以下三图(图10,图11,图12)分别是有五万,十万,十五万工单时服务器对模拟请求的的平均响应时间。

通过服务器响应时间曲线图可以看出,当并发连接数较少时改进型加权最小连接数算法与最小连接数算法基本相同,服务器响应时间大于加权轮询算法,这主要是因为加权轮循算法并不涉及后端服务器日志文件的读取,也不需要权值的计算,因此网络开销较小。但随着并发连接数的增大加权轮询与最小连接数算法的服务器响应时间趋于一致,而改进型加权最小连接数算法的服务器响应时间逐渐体现出优势。因此可以看出改进型加权最小连接数算法随着负载的逐渐增大服务器响应时间方面对于加权轮循与最小连接数算法的优势也越来越明显。

4 结束语

本文介绍了Nginx服务器架构,在加权最小连接数调度算法的基础上提出改进型加权最小连接数算法,选择用模拟退火算法来重新确定权值向量。利用性能检测工具spotlight对改进型加权最小连接数,加权轮循,最小连接数三种算法从服务器资源利用率与网络请求响应时间两方面进行了系统的测试,详细分析了三种算法应用在服务器集群中对于集群系统性能的影响。通过实验对比验证了改进型加权最小连接数算法的优势。