mqtt服务器性能分析,MQTT服务器动态负载均衡的研究与应用

  • Post author:
  • Post category:其他


1. 引言

随着越来越多的工业设备接入物联网,因处理器能力、网络带宽等具有局限性,所以对其通信技术提出了更高的要求 [1]。作为网页标准的HTTP,已不能满足机器之间的大规模沟通,其请求/回答模式不再合适,取而代之的是发布/订阅模式 [1]。这种模式就是轻量级、可扩展的MQTT可以施展拳脚的舞台,MQTT技术在汽车软件、智能家居、智慧医疗等方面有着广泛的应用。近来MQTT的优势被深度发掘,当有大量的MQTT协议的用户数据和设备实时数据需要存储在服务器端,会使得设备与服务器的交互相当频繁,当服务器接收到大量的数据请求时,MQTT服务器可能会出现宕机等现象。因此,MQTT服务器的负载均衡问题变得突出。传统的单台MQTT服务器处理能力已无法适应现代物联网大量数据请求 [1] [2],所以需要部署服务器集群系统。对不同性能的MQTT服务器,如何给其分配最适合其性能的任务量,协同处理和合理分配外部请求等需要一个负载分配平衡系统。由此可见引入MQTT服务器的负载均衡显得尤为重要 [3]。

2. 概述

本文的方法在兼顾MQTT服务器成本的同时解决了MQTT服务器系统稳定性问题。利用动态负载数据平衡分配策略 [4],对消息队列、CPU利用率、内存利用率的比重系数进行分析,用权值修改函数update Weight(),对权值修改模块优化更新,把用户请求均衡地重定向到其它站点,让系统在不增加硬件投入的情况下发挥最大的效能。当出现高并发量但单台MQTT服务器无法满足需求时,传统方法需要高性能的服务器才可以获得额外的服务资源 [1] [5]。本文的方法是通过增加MQTT服务器的数量并增加MQTT服务器均衡算法就能解决问题。当一开始不知道到底需要多高性能的服务器才能够处理所有需要挂载在其下的设备的请求,每当有设备量增加时,本文通过计算与测试,准确的添加所需要的最高性价比的服务器。

3. 负载均衡器和消息队列

3.1. Nginx负载均衡器

本文通过对服务器连接算法进行优化,推出一种新的MQTT服务器动态负载均衡算法。新算法通过提取当前MQTT服务器的相关运行性能及状态参数,改变其权值计算公式计算出为对应的权值,能够实时根据后端服务器的运行状态和负载状况,实时优化用户数据的重新定向 [6]。各MQTT服务器发送权值至Nginx负载均衡器后,负载均衡模块中写入新权值,当有新的用户请求任务时,负载均衡器会根据各服务器的写入的新权值比例关系进行分发。动态负载均衡算法见图1所示:

6f60bf97fadbc4368dfa9d05dcca76aa.png

Figure 1. Dynamic load balancing algorithm

图1. 动态负载均衡算法

3.2. 权值修改模块

权值修改模块运行在集群系统前端的Nginx负载均衡器之上,权值修改模块被嵌入到Nginx中 [5],为了能够较好的分发用户连接请求,与MQTT各服务器集群进行通信 [5],该模块需实现接收后台各服务器发送的权值,对此前保存的权值进行更新,此算法与的静态权值相比,更能够实时并精确反映各服务器真实的负载情况 [5];根据各服务器权值间比例关系将用户连接请求分发至合理的服务器。

Nginx负载均衡器需与下游客户端基于MQTT协议进行通信,但它与上游后端服务器的通讯是基于TCP的事件驱动架构的 [5]。Nginx负载均衡器向后端服务器发送用户请求时,需要stream模块中的具体负载均衡算法的配合,在后端服务器集群中选择出一台合适的服务器用来处理用户请求 [5] [7]。

对后端服务器动态权值的实时获取并更新,主要用到权值修改函数updateWeight(),在修改权值之前需对包含权值信息的peers指针