基于Nginx的DRC集群动态负载均衡策略

2022-05-05 13:38:00倪雅婷杨文晖黄安琪
计算机与现代化 2022年4期
关键词:均衡器权值集群

倪雅婷,杨文晖,苗 放,黄安琪,蒋 媛

(1.成都理工大学计算机与网络安全学院,四川 成都 610059; 2.成都大学大数据研究院,四川 成都 610106)

0 引 言

在互联网高速发展下,新一代信息技术不断升级优化并催生海量数据。面对数据规模爆炸式增长,做到多源异构数据融合流通,苗放教授于2012年提出了面向数据的体系架构(Data-Oriented Architecture, DOA)。该架构采用“面向数据和以数据为核心”的思想建立一种数据大平台与碎片化应用的数据生态系统,为有效解决大数据时代所面临软件体系结构的问题提供基础理论和方法技术支撑[1-2]。数据注册中心(Data Register Center, DRC)作为DOA的核心系统,对广义数据进行自动注册,通过统一注册标准提取数据描述信息,形成逻辑资源池并存储至注册中间库[3-5]。DRC是分散存储的多源异构数据和资源目录间的纽带,它对数据的注册信息进行存储与管理,提供检索、定位与调度等数据服务,为各种碎片化和个性化应用提供数据支撑[6-8]。

由于所有数据的注册与访问都要经过DRC,访问量增大的同时给数据注册中心带来了巨大的压力,所以DRC的访问性能尤为关键[9]。单机服务显然无法应对大数据时代下的大规模数据流量及高并发访问需求,DRC很容易因为过载而宕机[10]。为避免上述情况构建DRC集群,多个相互独立的数据注册中心组合成为一个庞大的集群,统一对外提供服务。根据集群的功能和结构可分为高性能计算集群、高可用集群与负载均衡集群。高性能计算集群通过高速连接方式将多台计算机链接起来,拆分复杂计算问题为并行运行的小问题,在公共消息传递层上进行通信以运行这些并行应用程序,而DRC集群内部通过微引擎为数据注册与上层应用支撑提供服务,需要处理的访问请求来源于数据注册任务以及对数据的获取,所以对高性能计算的需求并不突出。高可用集群重点考虑集群的容错性,通过构建冗余集群消除部分故障,以此防止数据丢失。文献[11]通过在OpenStack云计算平台中部署MySQL Cluster搭建小型数据注册中心集群来优化DRC性能,虽然实现了集群高可用但并没有对DRC访问请求的合理调度进行深入研究。相对于高性能计算集群和高可用集群,负载均衡集群通过负载均衡技术可以应对大规模数据流量及高并发访问的场景,分散单台服务器的访问压力,避免过载宕机对系统和业务的影响,并且减少了冗余节点对资源的消耗,降低了成本[12]。

负载均衡技术主要是通过专门的硬件或软件设备结合算法进行实现,但硬件设备造价高昂,导致成本过高,而使用软件实现负载均衡不仅成本低而且拥有更好的扩展性[13]。LVS(Linux Virtual Server)和Nginx都是目前较为流行的基于软件的负载均衡。Nginx使用反向代理服务,在网络结构中,它工作于第7层,相比工作在第4层的LVS拥有更多的使用场景及兼容性[14]。使用Nginx对网络的依赖远小于LVS,只要网络连接正常即可,而LVS则需要向托管商至少申请多一个网络地址来做虚拟网络地址。Nginx配置简单灵活,具有高并发能力,且内存消耗低,支持第三方模块扩展,因此本文选择Nginx作为DRC集群的负载均衡器。

负载均衡器通过负载均衡策略将访问请求尽量均衡分发给不同的服务器处理,并且当其中一个节点出现异常时,该节点的资源可以移动到其他节点上,避免集群出现瘫痪[15-16]。由此可见负载的调度策略成为集群能否提供稳定且高质量服务的关键。随着负载均衡的广泛发展,国内外许多学者对降低负载消耗、提升负载性能及效率展开了研究。Li等人[17]提出了一种基于中间节点的边缘计算任务分配负载均衡策略来平衡云计算中边缘节点间的负载。文献[18]提出了一种基于Nginx+Keepalived的云平台即时响应解决方案,满足了高并发下低时延的请求响应。在负载算法方面,Bosque等人[19]提出了一种基于索引的异构集群负载均衡算法。该算法能够在集群中每个节点的内核数量和每个内核的计算能力不同的情况下实现负载均衡,但忽略了服务器节点的运行负载情况。张星宇等人[20]对Nginx原有的轮询负载均衡算法提出了一种改进的动态加权轮询算法,虽然考虑了服务器实际负载状况,但只根据综合负载修改权值容易因频繁的权值修改引起集群抖动。文献[21]提出了一种权值分配调度算法,通过计算实际负载,将请求分配至综合负载值最小的节点上,提升了Web服务器集群的负载效果。

综上所述,负载均衡技术在集群面对大流量访问时具有重要地位。本文在DRC集群中使用Nginx负载均衡技术解决高并发访问的服务过载问题,通过分析负载均衡技术,对Nginx负载均衡策略的不足进行优化设计,提出一种由动态配置、负载收集、算法调度3个模块组成的动态负载均衡策略;搭建DRC集群对负载策略的各个模块进行实现,并在调度模块中在最小连接调度算法的基础上给出自适应负载均衡算法的实现方法;使整个DRC Cluster在每个周期都处于最佳负载状态,提升集群的访问性能,为上层应用与检索提供高质量服务。

1 负载均衡策略分析

Nginx作为一款功能优秀的反向代理服务器已应用在国内外许多知名门户网站[22]。客户端与代理服务器建立连接请求后,客户端传来的访问请求由Nginx接收,并根据负载策略将请求分发至具体的后端服务器,处理完成后再将响应结果返回至客户端[23-24]。启动负载均衡器后,会产生一个Master进程,每个Master又会产生多个Worker进程,其中Master进程负责管理这些Worker进程[25-26]。Nginx通过修改代理服务配置参数改变负载权值,其中upstream文件配置集群负载的分配策略,每个upstream负责维护一张静态路由表,每次收到请求后,会根据信息检索路由表,并按照具体调度算法来选择某个服务器转发请求。但是由于路由表是静态的,每次都需要恢复负载均衡器并重新加载conf配置文件,导致负载性能下降,对集群高并发下的大规模访问效率有较大影响。

负载均衡技术通过负载算法将高并发请求合理地分发至服务器集群中的各个节点,常见的负载均衡算法主要有轮询(Round Robin, RR)、加权轮询(Weighted Round Robin, WRR)、最小连接数(Least Connections, LC)以及加权最小连接(Weighted Least Connections, WLC)[27-29]。在实际应用场景中,服务器处理客户端或后台应用的请求服务时间具有差异性,若是采用简单的随机均衡或轮询算法,那么伴随工作时间的增加,不同服务器中的进程数会严重失衡,所以无法实现真正的负载均衡。而最小连接数算法可以记录每一个节点服务器当前正在处理的连接数量,当收到新请求时,会自动地将请求分配至当前连接数最少的节点服务器,从而使集群负载更加均衡。

加权最小连接算法在最小连接算法的基础上通过权值衡量各个节点的处理性能,服务器的缺省权值为1。若S0,S1,…,Sn-1代表一组n台服务器,W(Si)代表服务器Si对应的权值且此值大于0,C(Si)代表服务器Si正在处理的连接数,其中i=0,1,…,n-1。加权最小连接选取遍历服务器后,每个服务器连接数与权重的最小比值,即:

C(Sm)/W(Sm)=min{C(Si)/W(Si)}

(1)

若目标服务器的连接数C(Si)与权值W(Si)的比值等于该最小比值,则选取该服务器处理下一次请求。

使用加权最小连接算法首先在Nginx的upstream配置块中声明内置的least_conn指令和weight权重值,least_conn的解析指令函数为ngx_http_upstream_least_conn,该指令可指定初始化此upstream配置模块的uscf→peer.init_upstream函数,并且指定其中server指令的支持属性,包括NGX_HTTP_UPSTREAM_WEIGHT支持weight属性。加权最小连接算法的具体流程可描述为:

1)对于每个请求,for (peer=peers→peer, i=0; peer; peer=peer→next, i++)遍历集群中的所有可用服务器。

2)执行语句peer→conns*best→weight

3)pc→sockaddr用来存放所选取服务器的地址,随后对此地址进行连接。

4)如果无法从集群中选取一台节点服务器,则启动备用集群,重新调用函数执行此流程。

该算法也有不足之处:1)服务器权值一般是初始手动设置的并在一段时间后要再次人工更新,若手动更新不及时会导致权值大的服务器随着连接数不断增多而被分配更多的工作任务;2)由于不同请求对DRC节点服务器的资源要求差异较大,连接数和静态权重并不能绝对反映服务器运行状态。

因此需要对Nginx的负载均衡策略和WLC调度算法根据实际运行情况进行优化。

2 DRC集群动态负载均衡策略设计与实现

2.1 动态负载均衡策略总体框架

为了解决负载均衡器反复加载负载配置的问题,实现动态权值的分配调度,DRC集群的动态负载均衡策略由动态配置、负载收集、算法调度3个模块组成,整个集群的负载流程如图1所示。

在DRC集群中各服务器节点添加负载收集模块,定期获取节点服务器的负载信息,当集群收到数据注册或上层应用的http请求访问时,算法调度模块接收各服务器发送的性能指标参数并运行负载算法进行调度,根据算法调度模块得出t时刻各个服务节点的负载权值。将得到的权值及服务器地址发送至动态配置模块,该模块通过服务挂载和动态路由动态调正后端服务列表的流量。其中服务挂载使用HTTP长轮询触发变更及配置更改。负载均衡器的upstream配置块通过动态路由以固定间隔从服务挂载中心拉取实时权重信息及服务器地址,并根据更新后的服务器列表对集群服务器进行轮询,获取此时的服务器连接数,与刚刚得到的动态权值做比值,寻找满足C(Sm)/W(Sm)=min{C(Si)/W(Si)}条件的服务器分配调度任务,从而返回性能最佳的服务器处理请求,以平滑伸缩的方式使整个集群达到最优负载均衡状态。

2.2 算法调度模块

2.2.1 自适应负载均衡算法设计

算法调度模块是整个负载均衡策略的核心模块,一个高效的负载调度算法可以提升整个集群的负载效率。针对第1章分析得到的WLC的缺陷,设计自适应负载均衡算法对DRC节点服务器的负载信息进行监测,并给出新的计算方式和度量指标,根据各服务器的实时负载来调整当前服务器的权重分配。由于服务器性能指标之间相互独立,所以使用加权和法的线性组合负载评价指标构建服务器负载状态的数学模型。若cij(i=1,2,…,n;j=1,2,…,m)是各负载性能评价指标,其中i代表集群中第i个节点,j代表该节点中第j项性能评价指标。wj是各项负载评价指标中的权系数。则服务器负载状态的函数表达式为:

(2)

服务器的运行资源是负载均衡的重要指标,本文选取CPU、内存及磁盘的使用率作为集群负载评价指标。算法采用周期性收集服务器性能指标的方式收集负载信息,通过实验确定最佳的性能信息收集周期。将获得的服务器节点负载信息结合公式(2)得到服务器在运行中的实时负载权值Wui:

Wui=Wdi(kcpu(1-Ucpu)+kmem(1-Umem)+kio(1-Uio))

(3)

其中,Wdi表示第i个节点权值的常量调整因子,Wdi>0,默认值为1,权系数kcpu、kmem、kio分别表示CPU、内存、IO在服务器中的影响程度,且:

kcpu+kmem+kio=1

(4)

根据服务器过往学习经验结合DRC集群特点设定kcpu:kmem:kio=6:3:1。Ucpu、Umem、Uio分别表示某周期T内CPU、内存、IO的使用率。考虑到启动时性能指标读取瞬间会存在抖动,取t(T)和t(T/2)时刻各服务器性能参数的平均值作为公式(3)中的节点性能指标。

通过运算得到负载权值Wui后,计算各个服务器节点的负载权值与所有服务器节点负载权值的比值,可以得到节点Si在负载均衡器的权重占比:

(5)

其中C为常量系数,用于调整权重占比为整数,方便负载均衡器读取权重进行分配调度。

2.2.2 常量调整因子及权重更新阈值

自适应负载均衡算法的整体流程如图2所示。

图2 自适应负载均衡算法流程图

在公式(3)计算负载权值Wui时,引入了Wdi表示第i个节点权值的常量调整因子,Wdi>0,默认值为1。通过调整因子在集群资源使用率不均衡时做出动态调整。CPU和内存使用率在真实使用场景中可能达到高负载或超载状态,且个位数的CPU及内存使用率的变化没有实际意义,所以本文将CPU和内存的使用率划分为3个范围:[0,80)、[80,90)、[90,100]。当CPU或内存使用率高于80%表示服务器已达到高负载状态,Wdi降低至0.5;当使用率高于90%表示服务器已经处于超载状态,Wdi调整为0.1。不同状态下常量调整因子的变化可以及时调整服务器的负载权值,通过调整因子和服务器指标的实时反馈可以使运行中性能差的节点服务器的权重大大减低,从而在下一个周期改换性能较好的服务器处理请求。

本文提出的负载均衡算法是根据DRC集群服务器节点的实时负载信息计算节点权重的,但是频繁更新节点权重会使集群发生抖动。因此有必要设置阈值N,根据一段时间内节点服务器资源使用率的波动差作为权重修改的判断条件,W(Tn)表示第n个周期Tn服务器Si的负载权重,W(Tn-1)为第n-1个周期Tn-1服务器Si的负载权重,所以各节点运行时的权重波动差为:

ΔW(Si)=|W(Tn)-W(Tn-1)|

(6)

若ΔW(Si)≤N,权值不更改,当ΔW(Si)>N时,才对权值进行更新。

2.3 负载收集模块

负载信息采集通过Java语言开发,部署程序在各个DRC节点,负载收集模块调用Scheduled(fixed-Rate=time)方法添加定时任务,以固定时间周期更新负载信息。在各个负载信息收集函数中添加commandList命令链表从/proc目录读取性能指标,proc文件系统提供了以文件系统形式访问系统的内核数据接口来获取系统信息,通过计算活动信息得到各性能指标的实时使用率。

1)函数getCpuUse, commandList.add("cat /proc/stat")读取服务器CPU活动信息。

2)函数getMemUse, commandList.add("cat /proc/meminfo")读取内存相关信息。

3)系统设备中IO的负载使用状况可以使用iostat进行检测。安装命令包后,在函数getIoUse中,使用commandList.add("iostat -d -x")采集磁盘IO使用率。

2.4 动态配置模块

动态配置模块实现后端服务器的动态流量,将算法调度得到的负载权重动态平滑地写入负载均衡器的配置中。动态配置模块的工作流程如图3所示。

图3 动态配置模块的工作流程

在初次启动负载均衡器时,将服务挂载及动态路由写入负载均衡器的conf文件下的upstream中,交由Master进程解析。其配置如图4所示。

图4 upstream配置

upstream通过upsync_type配置consul作为服务挂载,动态路由使用upsync每隔0.5 s从后端服务列表拉取权重信息及服务器地址,upsync不仅会更新Nginx的路由缓存信息,还会把upstream后端节点的server列表dump到本地的指定路径中,以保证本地server信息与consul的一致性。解析配置文件成功后,开始Worker进程的初始化,使用consul的HTTP API添加后端服务节点和自适应负载算法得到的节点权值至key/value中,K/V服务是一个键值对,相当于Nginx的DB。consul Web的K/V服务列表如图5所示。

图5 consul Web服务挂载

若发现负载权值需要调整,在命令链表command添加("curl -X PUT -d"+"weight="+calculation+"http://10.252.250.154:8500/v1/kv/upstreams/Myserver/"+ip+":7777");更新consul server挂载的各服务器列表信息。节点更新权重成功后打印日志如图6所示。

图6 节点更新日志

upsync拉取consul的后端server列表,并利用K/V服务,使Nginx的每个Worker进程都独立地拉取upstream的配置。如果拉取成功,就更新各自的路由缓存信息以及server的weight属性。如果拉取失败则打开配置dump后端列表的文件,并提取之前dump下来的server信息,然后进行upstream路由的更新,最后便调度匹配的节点服务器处理请求。

3 实 验

3.1 实验环境

本实验为模拟集群的实际运行状态使用5台机器搭建测试环境,其中1台测试机用来测试访问连接,1台作为负载均衡器及consul server,剩余3台搭建小型DRC集群,实验环境集群构架如图7所示。

图7 实验环境集群架构图

测试环境采用集群形式搭建,负载均衡器作为反向代理服务器对请求进行任务的调度分配。实验环境配置见表1,DRC Cluster接收处理访问请求。在测试机使用Apache Jmeter压力测试软件模拟高并发环境,对DRC集群在不同负载策略下的访问性能进行综合测试及分析。

表1 实验环境配置

3.2 实验测试及分析

首先确定服务器性能指标收集周期,实验选取平均响应时间作为衡量负载效果,平均响应时间是指单个request从测试机发出请求到接受服务器响应之间的平均耗时。本实验采集周期测试范围为3 s~8 s。实验分别选取访问连接并发数为800和1200的情况下,对DRC集群进行压力访问。实验测试数据如图8所示。

图8 周期与平均响应时间关系图

由图8可知,3 s~4 s时读取服务器信息过于频繁,增加了资源消耗。随着采集周期变大,平均响应时间逐渐减少,在5 s时集群的平均响应时间达到最少。而后随着采集周期不断增大,负载权重更新不及时又导致响应时间增多。所以实验选取每5 s采集服务器性能指标并计算集群服务器负载权重。

为测试本文动态负载均衡策略的自适应负载算法的有效性和可用性,准备13组数据在同一DRC集群环境下进行压力测试。通过Jmeter设置并发连接数从100至1300的情况下,每次增加100并发量,每组测3次,最终取平均值,分别对加权最小连接数算法(实验组1)、动态加权轮询算法[21](实验组2)与本文算法(实验组3)进行测试。对比分析不同并发数下集群的平均响应时间,实验结果见表2。

表2 平均响应时间/ms

结合表2和图9可以看出,从13组实验结果可以看出随着并发连接数逐渐增加,3组实验平均响应时间都逐渐增大。

图9 并发数与平均响应时间关系折线图

通过WLC算法(实验组1)和本文算法(实验组3)的对比测试可以看出:实验组在并发数为100~300时,由于访问量相对较少而读取服务器性能指标进行负载权重的计算会消耗少量资源,所以WLC算法的平均响应时间略少于本文算法。但是,当并发连接数从400开始时,由于并发连接数增加,使得负载量不断增加,读取服务器的资源消耗可以忽略不计,本文算法的平均响应时间开始优于加权最小连接算法。并发量在400~500时,2种算法的平均响应时间相差不大,当并发量为1000时,集群进入高负载状态,本文算法可以根据服务器实时性能自适应调整负载权值,所以响应时间与加权最小连接算法拉开一定差距。

通过动态加权轮询算法(实验组2)和本文算法(实验组3)的对比测试可以看出:在不同并发量下,本文算法整体响应时间优于动态轮询算法。在并发数小于1000时,本文算法的平均响应时间略优于动态轮询算法,两者相差不大。之后随着并发量增多本文算法逐渐拉开差距。

综合分析实验结果来看,可以得出本文的动态负载均衡策略响应时间整体优于动态轮询算法,在DRC集群处于高负载时要优于传统的加权最小连接算法。

4 结束语

本文采用Nginx实现大规模数据流量下DRC集群的访问服务,研究分析负载均衡策略,提出了一种动态负载均衡策略并分别从设计和实现方式加以详细阐述,其中动态配置模块实现负载配置的动态拉取,减少了静态路由带来的额外资源消耗及人工消耗。算法调度模块对加权最小连接算法进行优化,给出自适应负载均衡算法,通过周期性收集服务器性能指标,引入常量调整因子及权重更新阈值计算节点服务器的实时权重,确定下一个周期的服务器权重占比。最后通过搭建DRC集群,不断递增并发连接数进行高并发测试。通过多次实验结果对比分析,本文提出的负载均衡策略能够处理大规模的并发访问需求,减少响应时间。并且在高并发访问场景下,本文算法比普通负载策略的最小连接算法有更好的负载均衡效果及稳定性,可以为数据注册与上层应用提供稳定的高可用服务。接下来可以对负载信息收集周期预测做进一步研究,增强服务器负载权值计算结果的精确性。

猜你喜欢
均衡器权值集群
一种融合时间权值和用户行为序列的电影推荐模型
CONTENTS
海上小型无人机集群的反制装备需求与应对之策研究
一种无人机集群发射回收装置的控制系统设计
电子制作(2018年11期)2018-08-04 03:25:40
Python与Spark集群在收费数据分析中的应用
基于权值动量的RBM加速学习算法研究
自动化学报(2017年7期)2017-04-18 13:41:02
勤快又呆萌的集群机器人
无线传感网OFDM系统中信道均衡器的电路实现
电子器件(2015年5期)2015-12-29 08:42:39
一种基于LC振荡电路的串联蓄电池均衡器
电源技术(2015年1期)2015-08-22 11:16:14
基于LMS 算法的自适应均衡器仿真研究