收稿日期:2020年6月13日,修回日期:2020年7月15日
基金项目:四川省重大科技专项课题(编号:2018GZDX0005,2019YFG0399);中央高校基本科研业务费专项(编号:2682019CX63)资助。作者简介:葛钰,男,硕士研究生,研究方向:云计算、计算机网络。李洪赭,男,博士研究生,研究方向:网络与信息安全。李赛飞,男,工程师,研究方向:铁路信号系统网络安全。
1引言
随着计算机互联网技术的迅猛发展,人们可以
足不出户的进行网购,社交,视频等活动,享受了互联网技术带来的巨大便利。同时,用户的激增和需求的多样性给互联网公司带来了巨大的挑战。2016年国内购票网站12306 每日PV 值高达400亿[1]。由阿里巴巴公司创建的双十一促销活动,能
够同时支撑亿万用户在线访问,面对如此巨大的流量冲击,服务器很容易出现因过载而宕机的现象[2],传统的单一服务器无法支撑如此庞大的业务需求。使用服务器集技术能够同时满足网络服务的性能需求,将多台计算机按一定的拓扑结构有效地组织起来共同完成指定任务的计算机系统就是集系统[3]。集技术可在较低成本条件下满足网络服务高可用、高性能要求[4]。按照集的应用
一种web 服务器集自适应动态负载均衡设计与
实现
葛钰李洪赭李赛飞
(西南交通大学信息科学与技术学院
成都
611756)
随着互联网技术的蓬勃发展,电商平台、视频网站等大量涌现,为人们日常生活增加了极大的便利。与此同
时,由于用户规模的逐步庞大,高并发成为大规模网站需要解决的问题。基于Nginx 作为反向代理为后端web 服务器集起负载均衡的方式在各大大型网站广泛运用。论文针对Nginx 的加权最小连接算法存在的问题进行优化,根据后端服务器运行状态进行周期性读取各项参数,确定下一个周期内权重分配,动态修改权值并通过多次实验确定论文设计的方式能够提高负载均衡效率。
关键词
Nginx ;web 服务器集;最小加权连接;动态负载均衡
中图分类号
TP393;TP918
DOI :10.3969/j.issn.1672-9722.2020.12.036
Design and Implementation of Adaptive Dynamic Load Balancing
for Web Server Clusters
GE Yu
LI Hongzhe
LI Saifei
(School of Information Science and Technology ,Southwest Jiaotong University ,Chengdu
611756)
Abstract
With the rapid development of Internet technology ,a large number of e-commerce platforms and video websites
have emerged ,which greatly facilitates people 's daily life.At the same time ,due to the gradual increase of the user scale ,high con⁃currency has become a problem to be solved for large-scale websites.As a reverse proxy ,Nginx is widely used for load balancing of
backend web server clusters in various large websites.In this paper ,the problems existing in the weighted least connections algo⁃rithm of Nginx are optimized.According to the running state of the backend server ,the parameters are obtained periodically to deter⁃mine the weight distribution in the next cycle.The weights are dynamically modified and the method designed in this paper is deter⁃
mined through multiple experiments to improve the load balancing efficiency.
Key Words Nginx ,web server cluster ,weighted least connection ,dynamic load balancing
Class Number
TP393,TP918
2020年第12期计算机与数字工程
领域不同,可将集分为三种:高可用集、高性能计算集和负载均衡集[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 Connec⁃tions,LC),加权最小连接(Weighted Least Connec⁃tions,WLC)。静态调度算法是在服务器运行前给定分配策略,动态调度算法根据连接数以及事先设定的权重进行分配。各种算法都没有考虑在运行中服务器当前的性能状态。
负载均衡器的作用
不同的后端服务器的配置不尽相同,对于处理客户端的请求速度有快有慢,最小连接数算法是根据后端服务器当前的连接情况,动态地选取集中目前连接数最少的一台服务器来处理当前的请求,合理地分流到各个服务器,提高利用效率。加权最小连接数算法是最小连接数算法的超集。遍历后端服务器,比较每个后端服务器的连接数与权重的比值,选取该值最小的服务器,即:
C(S
m
)/W(S
m
)=min{C(S
i
)/W(S
i
)}(1)
其中为C(S
m
)/W(S
m
)目标服务器连接数与权重比
值,min{C(S
i
)/W(S
i
)}表示取得该比值的最小值。如果目标服务器比值刚好等于最小值时,那么下次请求为该服务器进行处理。加权最小连接数算法不仅考虑了服务器的连接数,还考虑了服务器的性能。不过该算法的缺点也很明显,权重由手动设置,权重较大的服务器在接入很多请求之后也会继续分配请求,使得负载不均衡,并且由于不同的请求其连接权重和时间都有差距,该算法无法根据各个后端服务器当前真实的负载状况,进行动态的修改权重。
3自适应动态负载均衡的设计与实现3.1自适应动态负载均衡算法设计
基于加权最小连接数算法进行改进,各后端节点权值并不应该在手动设置之后就不再改变,应根据服务器负载性能进行周期性更改,能够保证上一个周期内性能最好的服务器在下一个周期中承担更多的连接,而负载足够多的服务器接受少一些的请求,从而使得集一直处于最佳状态。本文选取CPU空闲率、内存空闲率以及IO空闲率作为负载性能评价准则,根据此三项重要性能的使用情况对权值进行动态修改。为防止在周期点瞬时读取性
3003
第48卷
能参数可能造成的不准确性和误差较大的情况,采取在T 、T /2时刻分别读取并计算求取平均值的方式来代表T 时间内各参数性能。同时周期T 如果较小那么会导致过于频繁收集各性能参数所带来的额外消耗,周期T 如果较大那么会导致负载信息收集不及时,造成一定时间内负载不均衡的情况,故T 的取值需要进行实验测定。
3.1.1
权值计算方法
我们使用S i 表示某台后端服务器,使用F (S i )
表示权值,那么此时各台服务器权值计算方式为
F (S i )=P *(k cpu *(1-C T 2
+C T 2)+k mem *(1-M T 2+M T 2)+k io *(1-I T 2+I T
2
))(2)
其中C T 2
、C T 表示CPU 在T 、T 2时刻的使用率,
M T 2、M T 分别表示内存在T 、T 2时刻的使用率,
I T 2
、I T 分别表示IO 在T 、T 2时刻的使用率,将T 、T 2
时刻的值读取并求取平均值可求出服务器各参
数使用率,空闲率也随之可得。k cpu 、k mem 、k io 分别表示CPU 、内存、IO 在性能中影响程度的大小,其中
k cpu +k mem +k io =1
(3)
根据服务器性能、实际经验,出于研究和学习的目的我们分别设定k cpu =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%的情况较少,故不用考虑其中,上述情况可以表示为
ìíî
ïïïïïïïïïïïïC T
2+C T 2<0.8and M T 2
+M T
2
<0.8p =1C T 2+C T 2³0.8or M T 2
+M T
2
³0.8p =0.5C T 2+C T 2
³0.9or
M T 2
+M T
2
³0.9
p =0.1
(4)用各个服务器在每个周期内根据自身性能状况计算权重,若每个周期内都需要对权值进行更新,则会对Nginx 负载均衡器的负担过重。故在一些请求比较稳定的周期内,各服务器性能参数波动不大导致F (S i )值的变化也不大的时候,我们就不需要进行更新权值的操作。此时可以设置一个临界值来控制是否进行权值更新,在波动范围超过临界值的时候才更新权值,表示为
ìí
î||F Old (S i )-F (S i )£C F New (S i )=F Old (S i )
||F Old (S i
)
-F (S i )>C F New (S i )=F (S i )(5)在本周期的F (S i )和上个周期F Old (S i )F Old (S i )绝对差值小于C 的时候,权值不更改。在绝对差值大于C 的时候权值才会变更。
3.1.3
负载均衡器权重计算
在计算完各个服务器权值之后,此时的各个
F ()S i 为小数,而Nginx 负载均衡器需要一个整数,我们就需要进行负载均衡器权重计算,由于我们是按照各服务器CPU 空闲率,内存空闲率以及IO 空闲率进行权值计算,后端服务器各性能参数空闲率越高,则F ()S i 值越高,那么再下一个周期在负载均衡器所分得的权重应该越大,这样在下个周期内,就会有更多请求到达此服务器,同理,F ()S i 值越低,在负载均衡器端的权重应该越小,故我们可以按照各服务器F ()S i 与åi =1
n
F (S i
)占比的方式确
定,即
ì
íî
ïïïïïïïïïïïïïïïïïïïï
w 1=F (S 1)åi =1n F (S i )*N w 2
=F (S 2)åi =1n F (S i )*N
w n =F (S n )åi =1n F (S i )*N (6)其中N 为整数,可根据后端服务器个数进行灵活调整,通过上述方式我们可以计算出各服务器在负载均衡器的权重值w 1 w 2 w n 。
3.2
自适应动态负载均衡实现方式设计
本在各后端服务器添加性能收集模块,采集各
服务器CPU 、内存、IO 磁盘信息,通过Socket 通信发送给权值计算模块。权值计算模块接收各服务器发送的消息进行处理,并根据上述算法计算出各服务器的权重值,通过post 方法传送到权重修改模
葛钰等:一种web 服务器集自适应动态负载均衡设计与实现3004
2020年第12期计算机与数字工程块。权重修改模块包括服务注册发现中心Consul 以及负载均衡器Nginx ,Nginx 配置文件中upstream 模块配置基础负载均衡算法以及后端服务器数据接收转发,如图1
所示配置。
图1
Nginx upstream 模块配置
基础算法为least_Conn ,即最小连接算法,注册配置upsync 模块,upsync_type=consul ,表示服务注册中心使用consul 。将后端服务器ip 地址和JSON 信息挂载到服务注册中心,JSON 信息中的Weight 即表示该服务器权重值。如图2
所示。
图2consul kv 中心挂载显示
Nginx 会通过upsync 模块每隔0.5s 从服务注册
发现中心拉取后端服务器ip 地址以及权重信息配置到upstream 模块里面。upstream 模块收到ip 地
址及其权重信息,就可以根据配置变更权重分配。这样系统就能达到自适应动态负载均衡。整个系统的流程图如图3
所示。
图3整个系统流程图4实验
在实验之前,需要搭建测试环境,本论文基于
Nginx 做的设计实验,故需要一台Nginx 服务器做负
载均衡器、后端Web 服务器集、进行压力测试的
客户端。为保证实验的严谨性,避免由于服务器性能相近导致权重分配相近。故后端服务器的配置两两不同,实验环境配置如表1。
表1
实验环境配置
IP 地址
192.168.89.100192.168.89.105192.168.89.139192.168.89.161192.168.89.188用途
客户端
负载均衡器后端服务器后端服务器后端服务器处理器双核双核双核双核四核内
4G 4G 4G 2G 4G 磁盘大小50G
40G 40G 100G 40G
软件配
JMeter Nginx Tomcat Tomcat
Tomcat
客户端使用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 时能够得到最低平均响应时间,此时集系统性能最佳。
3005
第48
图5平均响应时间与周期T关系折线
实验二,本文设计的自适应动态负载均衡方法基于加权最小连接算法进行改进,那么需要在同一个集环境下分别用两种负载均衡算法进行压力测试,进行对比。故本实验采用JMeter模拟100~
1500,每隔100并发用户分别对两种负载均衡算法进行测试一分钟的方式,一共得到15组数据。且每次测试选取平均响应时间以及吞吐量作为性能优劣的判断。平均响应时间越小,页面响应的时间越短,系统性能越好。而吞吐量越大,那么该系统能够容纳同时访问的数据量越大,系统性能越好。为保证数据的可靠性,每组数据分别测试三次求取平均值。测试数据如表2所示。
表2两种算法的平均响应时间与吞吐量
并发量(QPS)
100 200 300 400 500 600 700 800 900 1000 1100 1200 1300 1400 1500
自适应动态负载均衡
平均响应
时间(ms)
95
192
276
364
452
546
613
695
788
831
903
969
1001
1052
1098
吞吐量
(reqs/sec)
1047
1050
1016
1014
1028
1017
1014
982
963
972
967
1013
1043
1011
1015
加权最小连接
平均响应
时间(ms)
82
180
272
358
463
571
656
727
820
874
957
1032
1127
1226
1304
吞吐量
(reqs/sec)
1043
1057
1018
983
986
1004
980
952
957
956
976
980
1023
996
978
由表2和图6所示,总体来看,随着并发量的增加,两种算法的平均响应时间是在逐步增大。在
100~200并发用户量的时候,加权最小连接算法的平均响应时间要略好于本文的设计的自适应动态负载均衡算法。这是因为并发量较小的时候,各后
端服务器性能消耗较低,此时存在于各后端服务器
的性能收集模块会消耗一定性能,导致响应时间略
高。在并发量300~500的时候,两者响应时间差别
不大。之后随着并发量的逐步提高,由于能够动态
改变服务器的权重,自适应动态负载均衡算法的优
势显现出来,响应时间逐渐与加权最小连接算法拉
开差距。在并发量为1500时,本文的自适应动态
负载均衡算法响应时间优于加权最小连接算法15.8%,并且随着并发量提升,加权最小连接算法的错误率显著增加,而自适应动态负载均衡算法仅为
其一半左右。从表2结合图7来看,吞吐量波动范
围不大,在大部分阶段都是自适应动态负载均衡算
法的吞吐量好于加权最小连接算法。由此可见,随
着并发量的提高,不管是响应时间还是吞吐量都能
得到优化。
图6
平均响应时间与并发量关系折线
图7吞吐量与并发量关系折线
5结语
本文基于Nginx的集系统的加权最小连接算
葛钰等:一种web服务器集自适应动态负载均衡设计与实现3006

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。