一种web服务器集群自适应动态负载均衡设计与实现*

2021-01-19 11:01李洪赭李赛飞
计算机与数字工程 2020年12期
关键词:权值权重集群

葛 钰 李洪赭 李赛飞

(西南交通大学信息科学与技术学院 成都 611756)

1 引言

随着计算机互联网技术的迅猛发展,人们可以足不出户的进行网购,社交,视频等活动,享受了互联网技术带来的巨大便利。同时,用户的激增和需求的多样性给互联网公司带来了巨大的挑战。2016年国内购票网站12306.cn每日PV值高达400亿[1]。由阿里巴巴公司创建的双十一促销活动,能够同时支撑亿万用户在线访问,面对如此巨大的流量冲击,服务器很容易出现因过载而宕机的现象[2],传统的单一服务器无法支撑如此庞大的业务需求。使用服务器集群技术能够同时满足网络服务的性能需求,将多台计算机按一定的拓扑结构有效地组织起来共同完成指定任务的计算机系统就是集群系统[3]。集群技术可在较低成本条件下满足网络服务高可用、高性能要求[4]。按照集群的应用领域不同,可将集群分为三种:高可用集群、高性能计算集群和负载均衡集群[5]。负载均衡集群常用于高并发的Web应用或缓存应用[6]。一般由两部分组成:前端负载调度服务器和后端web服务器集群。负载均衡器负责接收客户端的请求,按照一定的分发策略将请求分发给后端服务器。负载均衡既扩展了服务器带宽,增加了吞吐量[7],提高了服务器节点及集群资源的利用率,降低了服务成本[8]。由于硬件负载均衡器价格高昂,软件负载均衡得到人们的广泛关注和应用。Nginx是一款强大的高性能Http服务器,安装和配置相对简单,对于网络依赖性小且占有内存小,包含多种负载均衡算法,能满足上万级别的请求调度[9]。目前国内外很多网站架构都采用Nginx作为负载均衡和反向代理[10]的服务器。中国大陆使用Nginx服务器的用户很多,其中包括:阿里、百度、京东、腾讯、网易等大型公司。Tengine项目为阿里巴巴将在Nginx基础上,基于淘宝自身业务进行改进的web平台并加入了一些高级特性。

负载均衡器根据负载均衡算法将客户端请求分发给后端服务器,那么负载均衡算法就是整个集群运行性能的决定性因素。国内外许多学者在负载均衡算法做过研究,提出了很多改进之处。比如Islam S[11]提出一种改进具有陈旧负载信息的最短队列负载均衡方法,Kaur K等[12]提出一种通过虚拟机蚁群算法实现负载平衡的方法,王红斌等[13]提出一种LVS集群中加权最小连接算法的改进方法,张玉芳等[14]提出一种通过节点的负载与性能比衡量节点负载权值大小来分配任务的方法,孙俊文等[15]提出一种使用模拟退火算法自适应确定权重向量,利用动态加权轮询算法动态分配请求的方法,汪佳文等[16]提出一种根据服务器实时负载情况并结合改进的Pick-K算法对权重轮询负载均衡算法进行优化的动态自适应权重轮询随机负载均衡算法。

本文基于加权最小连接算法提出一种应用在Nginx反向代理和后端服务器集群中的自适应动态负载均衡的设计与实现方法。通过收集周期T内服务器各个性能参数的平均状况,计算各服务器权重占比,改变在consul上注册的各个后端服务器KV值,Nginx使用upsync动态拉取KV值修改各服务器权重。保证在下一个周期内,性能最优的服务器权重最大,会提供更多的服务。这样使得整个集群系统在各个周期内处于最优状态,最后通过压力测试实验确定周期T,并证明该方法能够有效提高负载均衡效率。

2 负载均衡算法分析

负载均衡算法可以分为静态负载均衡算法和动态负载均衡算法。常见的静态调度算法包括:轮询(Round Robin,RR),权重轮询(Weighted Round Robin,WRR)、目标地址散列(Destination Hash,DH),一致性哈希(Consistent Hash,CH)。常见动态调度算法包括:最小连接数法(Least Connections,LC),加权最小连接(Weighted Least Connections,WLC)。静态调度算法是在服务器运行前给定分配策略,动态调度算法根据连接数以及事先设定的权重进行分配。各种算法都没有考虑在运行中服务器当前的性能状态。

不同的后端服务器的配置不尽相同,对于处理客户端的请求速度有快有慢,最小连接数算法是根据后端服务器当前的连接情况,动态地选取集群中目前连接数最少的一台服务器来处理当前的请求,合理地分流到各个服务器,提高利用效率。加权最小连接数算法是最小连接数算法的超集。遍历后端服务器,比较每个后端服务器的连接数与权重的比值,选取该值最小的服务器,即:

其中为C(S m)/W(S m)目标服务器连接数与权重比值,min{C(Si)/W(Si)}表示取得该比值的最小值。如果目标服务器比值刚好等于最小值时,那么下次请求为该服务器进行处理。加权最小连接数算法不仅考虑了服务器的连接数,还考虑了服务器的性能。不过该算法的缺点也很明显,权重由手动设置,权重较大的服务器在接入很多请求之后也会继续分配请求,使得负载不均衡,并且由于不同的请求其连接权重和时间都有差距,该算法无法根据各个后端服务器当前真实的负载状况,进行动态的修改权重。

3 自适应动态负载均衡的设计与实现

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

基于加权最小连接数算法进行改进,各后端节点权值并不应该在手动设置之后就不再改变,应根据服务器负载性能进行周期性更改,能够保证上一个周期内性能最好的服务器在下一个周期中承担更多的连接,而负载足够多的服务器接受少一些的请求,从而使得集群一直处于最佳状态。本文选取CPU空闲率、内存空闲率以及IO空闲率作为负载性能评价准则,根据此三项重要性能的使用情况对权值进行动态修改。为防止在周期点瞬时读取性能参数可能造成的不准确性和误差较大的情况,采取在T、T/2时刻分别读取并计算求取平均值的方式来代表T时间内各参数性能。同时周期T如果较小那么会导致过于频繁收集各性能参数所带来的额外消耗,周期T如果较大那么会导致负载信息收集不及时,造成一定时间内负载不均衡的情况,故T的取值需要进行实验测定。

3.1.1 权值计算方法

我们使用Si表示某台后端服务器,使用F(Si)表示权值,那么此时各台服务器权值计算方式为

根据服务器性能、实际经验,出于研究和学习的目的我们分别设定k cp u=0.6、k mem=0.3、k io=0.1。

3.1.2 权值改变参考参数及临界值

P值为权值改变的参考参数,默认为1。在服务器CPU使用率或者内存使用率高于80%时,表示此时服务器处于高负载状态,所能承受的空间不足,P值减少为一半,即为0.5,将所求权值和降低一半,减少该服务器权重。当服务器CPU使用率或者内存使用率高于90%时,表示改服务器处于超负载状态,无力承担更多负载,此时将P设置为0.1,大大降低权重,在下一个周期内将请求分配给其余服务器。IO使用率达到80%的情况较少,故不用考虑其中,上述情况可以表示为

用各个服务器在每个周期内根据自身性能状况计算权重,若每个周期内都需要对权值进行更新,则会对Nginx负载均衡器的负担过重。故在一些请求比较稳定的周期内,各服务器性能参数波动不大导致F(S i)值的变化也不大的时候,我们就不需要进行更新权值的操作。此时可以设置一个临界值来控制是否进行权值更新,在波动范围超过临界值的时候才更新权值,表示为

在本周期的F(S i)和上个周期F Old(S i)F O ld(Si)绝对差值小于C的时候,权值不更改。在绝对差值大于C的时候权值才会变更。

3.1.3 负载均衡器权重计算

在计算完各个服务器权值之后,此时的各个F(Si)为小数,而Nginx负载均衡器需要一个整数,我们就需要进行负载均衡器权重计算,由于我们是按照各服务器CPU空闲率,内存空闲率以及IO空闲率进行权值计算,后端服务器各性能参数空闲率越高,则F(Si)值越高,那么再下一个周期在负载均衡器所分得的权重应该越大,这样在下个周期内,就会有更多请求到达此服务器,同理,F(Si)值越低,在负载均衡器端的权重应该越小,故我们可以按照各服务器F(S i)与F(S i)占比的方式确定,即

其中N为整数,可根据后端服务器个数进行灵活调整,通过上述方式我们可以计算出各服务器在负载均衡器的权重值w1,w2…wn。

3.2 自适应动态负载均衡实现方式设计

本在各后端服务器添加性能收集模块,采集各服务器CPU、内存、IO磁盘信息,通过Socket通信发送给权值计算模块。权值计算模块接收各服务器发送的消息进行处理,并根据上述算法计算出各服务器的权重值,通过post方法传送到权重修改模块。权重修改模块包括服务注册发现中心Consul以及负载均衡器Nginx,Nginx配置文件中upstream模块配置基础负载均衡算法以及后端服务器数据接收转发,如图1所示配置。

图1 Nginx upstream模块配置

基础算法为least_Conn,即最小连接算法,注册配置upsync模块,upsync_type=consul,表示服务注册中心使用consul。将后端服务器ip地址和JSON信息挂载到服务注册中心,JSON信息中的Weight即表示该服务器权重值。如图2所示。

图2 consul kv中心挂载显示

Nginx会通过upsync模块每隔0.5s从服务注册发现中心拉取后端服务器ip地址以及权重信息配置到upstream模块里面。upstream模块收到ip地址及其权重信息,就可以根据配置变更权重分配。这样系统就能达到自适应动态负载均衡。整个系统的流程图如图3所示。

图3 整个系统流程图

4 实验

在实验之前,需要搭建测试环境,本论文基于Nginx做的设计实验,故需要一台Nginx服务器做负载均衡器、后端Web服务器集群、进行压力测试的客户端。为保证实验的严谨性,避免由于服务器性能相近导致权重分配相近。故后端服务器的配置两两不同,实验环境配置如表1。

表1 实验环境配置

客户端使用JMeter压力测试工具对此服务器集群进行压力测试。使用Http请求的方式压力测试负载均衡器所代理的IP地址和端口。

图4 实验环境Web服务器集群架构

实验一,在第二节自适应动态负载均衡算法描述中可知周期T是个待确定的参数,需要对集群系统进行压力测试,变化参数为周期T值。若周期T太短,那么各服务器频繁地获取性能参数,会加重对服务器性能开销,若T取值过大,那么就会导致负载均衡器对服务器权重更改缺少及时性,整个集群系统的负载能力无法得到提升。为了性能的均衡,需要对T值进行实验测定。本实验T值测试范围为5s~10s,每隔1s测试一次。测试方式为使用JMeter压力测试软件生成1000个用户对集群系统进行并发访问。评价参数为请求返回的平均响应时间(average response time),平均响应时间越小说明集群系统对用户的请求响应速度越快,则集群系统的性能越好。

由图5可以看出,在5s~7s这个阶段,由于周期较小,过于频繁地读取参数,加重了对服务器的开销,随着周期时间变大,响应时间逐步下降。而在7s到10s这个范围时,随着T值越大,对服务器权重的及时性逐渐降低,响应时间又逐步升高。故当T值等于7s时能够得到最低平均响应时间,此时集群系统性能最佳。

图5 平均响应时间与周期T关系折线

实验二,本文设计的自适应动态负载均衡方法基于加权最小连接算法进行改进,那么需要在同一个集群环境下分别用两种负载均衡算法进行压力测试,进行对比。故本实验采用JMeter模拟100~1500,每隔100并发用户分别对两种负载均衡算法进行测试一分钟的方式,一共得到15组数据。且每次测试选取平均响应时间以及吞吐量作为性能优劣的判断。平均响应时间越小,页面响应的时间越短,系统性能越好。而吞吐量越大,那么该系统能够容纳同时访问的数据量越大,系统性能越好。为保证数据的可靠性,每组数据分别测试三次求取平均值。测试数据如表2所示。

表2 两种算法的平均响应时间与吞吐量

由表2和图6所示,总体来看,随着并发量的增加,两种算法的平均响应时间是在逐步增大。在100~200并发用户量的时候,加权最小连接算法的平均响应时间要略好于本文的设计的自适应动态负载均衡算法。这是因为并发量较小的时候,各后端服务器性能消耗较低,此时存在于各后端服务器的性能收集模块会消耗一定性能,导致响应时间略高。在并发量300~500的时候,两者响应时间差别不大。之后随着并发量的逐步提高,由于能够动态改变服务器的权重,自适应动态负载均衡算法的优势显现出来,响应时间逐渐与加权最小连接算法拉开差距。在并发量为1500时,本文的自适应动态负载均衡算法响应时间优于加权最小连接算法15.8%,并且随着并发量提升,加权最小连接算法的错误率显著增加,而自适应动态负载均衡算法仅为其一半左右。从表2结合图7来看,吞吐量波动范围不大,在大部分阶段都是自适应动态负载均衡算法的吞吐量好于加权最小连接算法。由此可见,随着并发量的提高,不管是响应时间还是吞吐量都能得到优化。

图6 平均响应时间与并发量关系折线

图7 吞吐量与并发量关系折线

5 结语

本文基于Nginx的集群系统的加权最小连接算法,分析了其优劣性,提出了一种自适应动态负载均衡方法,能够根据服务器实时性能更改Nginx处各后端服务器权重,动态调节性能。并分别从算法设计和实现方式设计加以详细阐述,进行两次实验,第一次实验确定周期T的取值,第二次通过多次实验对比确定该算法能够在加权最小连接算法的基础上较大提升集群系统的负载均衡性能。但本设计还存在一定缺陷,比如临界值的确定,临界值大小确定也会影响权值的确定。若临界值过大,服务器实时性会降低,若临界值过小,那么频繁地更改也会影响集群性能。

猜你喜欢
权值权重集群
一种融合时间权值和用户行为序列的电影推荐模型
权重望寡:如何化解低地位领导的补偿性辱虐管理行为?*
功能性新材料产业集群加速形成
权重常思“浮名轻”
培育世界级汽车产业集群
为党督政勤履职 代民行权重担当
权重涨个股跌 持有白马蓝筹
勤快又呆萌的集群机器人
财务风险跟踪评价方法初探
基于洪泛查询的最短路径算法在智能交通系统中的应用