MQTT其独特的优点在物联网技术得到广泛应用,但服务器处理大量的请求时,MQTT服务器可能会出现宕机等问题,本文从优化负载均衡入手,对消息队列、CPU利用率、内存利用率的比重系数进行分析,利用新的权值计算方法,使系统负载更加均匀地分发至集群各服务器,总体平均响应时间更短,通过实验数据表明负载差能由原来的8%下降到4%左右,提高了MQTT服务器集群系统的使用效率,具有一定的实用价值。<br/>The unique advantage of MQTT is widely used in the Internet of things technology, but when the server processes a large number of requests, MQTT server may have downtime and other problems. This paper starts with optimizing the load balance, analyzes the proportion coefficient of message queue, CPU utilization and memory utilization, and uses the new weight calculation method, making the system load more evenly distributed to the cluster servers, and the overall average response time is shorter. The experimental data show that the load difference can be reduced from the original 8% to about 4%. It improves the efficiency of MQTT server cluster system and has a certain practical value.
李嘉钰
浙江理工大学信息学院,浙江 杭州
收稿日期:2020年7月8日;录用日期:2020年7月21日;发布日期:2020年7月28日
MQTT其独特的优点在物联网技术得到广泛应用,但服务器处理大量的请求时,MQTT服务器可能会出现宕机等问题,本文从优化负载均衡入手,对消息队列、CPU利用率、内存利用率的比重系数进行分析,利用新的权值计算方法,使系统负载更加均匀地分发至集群各服务器,总体平均响应时间更短,通过实验数据表明负载差能由原来的8%下降到4%左右,提高了MQTT服务器集群系统的使用效率,具有一定的实用价值。
关键词 :MQTT协议,负载均衡,改进算法,权值修改,Nginx技术
Copyright © 2020 by author(s) and Hans Publishers Inc.
This work is licensed under the Creative Commons Attribution International License (CC BY 4.0).
http://creativecommons.org/licenses/by/4.0/
随着越来越多的工业设备接入物联网,因处理器能力、网络带宽等具有局限性,所以对其通信技术提出了更高的要求 [
本文的方法在兼顾MQTT服务器成本的同时解决了MQTT服务器系统稳定性问题。利用动态负载数据平衡分配策略 [
本文通过对服务器连接算法进行优化,推出一种新的MQTT服务器动态负载均衡算法。新算法通过提取当前MQTT服务器的相关运行性能及状态参数,改变其权值计算公式计算出为对应的权值,能够实时根据后端服务器的运行状态和负载状况,实时优化用户数据的重新定向 [
图1. 动态负载均衡算法
权值修改模块运行在集群系统前端的Nginx负载均衡器之上,权值修改模块被嵌入到Nginx中 [
Nginx负载均衡器需与下游客户端基于MQTT协议进行通信,但它与上游后端服务器的通讯是基于TCP的事件驱动架构的 [
对后端服务器动态权值的实时获取并更新,主要用到权值修改函数updateWeight(),在修改权值之前需对包含权值信息的peers指针加锁,完成修改后再解锁 [
当负载均衡器分发用户请求时,会调用后端各台服务器的函数,重新对后端服务器进行选择。当负载均衡器启动以后,就绑定Socket通信端口建立UDP服务,对指定端口进行监听,同时用recv()函数接收后端服务器发送的权值信息。调用fork()函数创建子进程,建立并发服务器,以接收到的权值更新原来保存在后端的服务器权值信息,各服务器的权值是作为分发用户连接请求的依据。负载均衡器其工作的流程见图2所示:
图2. 负载均衡器的工作流程图
在改进的负载均衡算法中,MQTT服务器集群中的各台服务器周期性的收集自身负载信息和连接数,得出权值后发送给Nginx负载均衡器,根据各服务器的权值和负载通过筛选 [
当前MQTT服务器加权最小连接算法,无法对服务器实际负载进行合理的分配,且权值是由人为凭经验设置,在负载分发时固定不会变,在本文提出的改进算法中,各MQTT服务器节点根据自身CPU利用率和内存使用率两个性能指标,从而反映出了服务器的实际负载情况,再结合当前用户连接数计算得出综合负载,最后根据综合负载得出各个服务器节点的权值。在改进的负载均衡算法中,为了防止频繁的计算和发送权值会影响MQTT服务器和负载均衡器的性能,各MQTT服务器需周期性的去计算自身权值,计算得出权值与上一周期的权值进行比较,若权值变化率不大于 Δ t 的权值将不会发送至负载均衡器。选取T和 Δ t 的值需经过实验验证得到。改进算法工作模型见图3所示:
图3. 改进算法工作模型
权值计算公式如下:
W i = W i + A ∗ S U − A L ( S i ) 3
其中SU是系统利用率,A为可动态调整的系数(不为0),AL(Si)是服务器的综合负载值 [
选择两类指标作为确定负载情况的因素 [
l o a d i = R 1 ∗ S i + R 2 ∗ D i + R 3 ∗ C i + R 4 ∗ M i + R 5 ∗ P i + R 6 ∗ T i
S i 为连接数指标,表示单个服务器的连接数与平均值的比值。 D i 为磁盘利用率, C i 为CPU利用率, M i 为内存利用率, P i 为工作进程数, T i 为响应时间。R表示各负载参数重要程度的一组系数。
从服务器的实时性能参数以及状态参数两类参数。服务器实时性能值计算如下:
F ( S i ) = [ R 1 , R 2 ] ∗ [ 1 − C P U ( S i ) 1 − M E M O R Y ( S i ) ]
R 1 , R 2 为CPU利用率,内存利用率的比重系数,且 R 1 + R 2 = 1 。 C P U ( S i ) 和 M E M O R Y ( S i ) 分别表示服务器 S i 的CPU利用率,内存利用率。其中CPU利用率更能反映当前节点的实时性能,从而取 R 1 , R 2 的值分别为0.6和0.4 [
当前负载均衡调度分为集中式调度和分布式调度两种,这两种调度方式都需要一个负载均衡器来作为核心节点进行任务分配 [
Δ t = | W e i g h t ( t 2 ) − W e i g h t ( t 1 ) t 2 − t 1 |
1) W e i g h t ( t 1 ) :当前服务器在 t 1 时刻的权值;
2) W e i g h t ( t 2 ) :当前服务器在 t 2 时刻的权值;
3) Δ t :当前服务器在一个发送周期内的权值变化率,其中 t 2 > t 1 。
权值用最少上报策略,周期T内的权值变化率与预先设定的 Δ t 值比较,当T内的权值变化率小于 Δ t 值时,服务器将不会发送权值至核心节点,只在本地修改保存的权值信息。如果当前服务器权值变化率大于 Δ t ,则将新权值发送至核心节点。在周期T内如果核心节点没有收到权值,则按前面保存的该服务器的权值分发负载。
本文使用了三台八核高性能服务器搭载系统,服务器配置信息参数为:CPU主频为4.00 GHz,采用Intel(R) Core(TM) i7-4790K处理器,32 G内存,2 T硬盘,操作系统版本为Ubuntu 16.04.2。本文实验测试程序使用Java编写,JDK版本为1.8,Nginx使用1.13.9版本。通过开源压力测试工具Jmeter模拟终端设备大量的TCP连接,使用多台压测机器在局域网中对系统进行性能测试。压测机器使用3台四核CPU的计算机,其配置信息参数为:Intel(R) Core(TM) i5-7200U处理器,8 G内存,256 G固态硬盘,操作系统为Win10。实验在局域网中进行,机器间通过百兆交换机相连,因此本文实验不考虑带宽的影响。
通过获取当前时刻的CPU的活动信息,分别为用户状态的运行时间、系统内核相关的运行时间、空闲状态的运行时间。CPU性能指标各项数据见表1所示:
各项数据名称 | 描述(从系统启动累积到当前时刻) |
---|---|
user | 用户态的运行时间,不包含nice值为负进程 |
nice | nice值为负的进程所占用的CPU时间 |
system | 处于核心态的运行时间 |
idle | 除IO等待时间以外的其它等待时间 |
iowait | IO等待时间 |
irq | 硬中断时间 |
softirq | 软中断时间 |
表1. CPU性能指标各项数据
Nginx收到连接请求后,通过添加代码来获取的后端服务器动态权值进行更新,对修改权值之前需对权值的指针加锁,修改完后解锁。主要加解锁函数代码见图4所示:
图4. 加解锁函数代码
本文实验将基于WLC、基于WRR以及WRR改进的算法三种方案进行比较。通过测定各服务器的 CPU负载率,内存利用率接近程度可以比较直观地看出算法的负载均衡效果。
本文根据这三种算法方案进行测试。三种算法的响应时间见表2所示,并发请求相应时间对比图见图5所示:
并发请求连接数 | WLC算法 | WRR算法 | 改进算法 |
---|---|---|---|
150 | 265 | 590 | 270 |
300 | 545 | 715 | 605 |
450 | 800 | 1115 | 835 |
600 | 1355 | 1495 | 1280 |
750 | 1610 | 2120 | 1505 |
900 | 2380 | 2410 | 2025 |
1050 | 2570 | 2690 | 2445 |
1200 | 3005 | 3095 | 2790 |
1350 | 3245 | 3475 | 2965 |
1500 | 3395 | 3490 | 3025 |
表2. 三种算法的响应时间
图5. 并发请求相应时间对比图
当并发请求连接数为1500时,观察服务器的内存利用率和CPU利用率的接近度。CPU利用率图见图6,内存利用率见图7所示:
图6. CPU利用率图
图7. 内存利用率图
由此可得,在总体负载水平较轻时,改进算法相比加权最小连接算法的负载均衡效果提高并不明显 [
本文主要提出了一种基于MQTT负载均衡算法的改进设计方案,从优化负载均衡入手,分析MQTT服务器权值的算法设计及权值上报设计,MQTT服务器集群中的各台服务器周期性地收集自身负载信息和连接数,得出权值后发送给Nginx负载均衡器,根据各服务器的权值和负载通过筛选,得出合适的服务器去应答新的用户数据连接请求。对服务器负载进行实时分析及负载的重新权值计算及分配,使系统负载更加均匀地分发至集群各服务器。
从多次实验及实际应用数据来看,对消息队列、CPU利用率、内存利用率的比重系数进行分析,利用权值修改函数updateWeight(),在修改权值之前对包含权值信息的peers指针加锁对权值修改模块优化更新,这种新的MQTT负载均衡算法能使各服务器之间的负载差下降,MQTT服务器集群系统的使用效率提高;因此在用户并发请求连接数较多时,总体平均响应时间将会有一程度的缩短,使MQTT服务器集群在一个较为稳定的工况下运行,防止出现数据堵塞而宕机等情况发生。
根据本方案设计的系统已投入智慧校园项目的使用,在实际场景的应用中未出现数据交互不稳定情况,且系统运行效果较好。
本课题得到浙江理工大学本科生科研创新计划重点项目(2019ZD-28)、浙江理工大学本科生科研创新计划一般项目(2019YB-24)资助。
李嘉钰. MQTT服务器动态负载均衡的研究与应用Research and Application of Dynamic Load Balancing in MQTT Server[J]. 软件工程与应用, 2020, 09(04): 262-271. https://doi.org/10.12677/SEA.2020.94029