ADC

MQTT 负载平衡

消息队列遥测传输 (MQTT) 是用于物联网 (IoT) 的 OASIS 标准消息协议。MQTT 是一种灵活且易于使用的技术,可在物联网系统内提供有效的通信。MQTT 是一种基于代理的协议,被广泛用于促进客户端和代理之间的消息交换。

MQTT 的以下主要优势使其成为您的 IoT 设备的理想选择:

  • 可靠性
  • 响应时间快
  • 能够支持无限的设备
  • 发布/订阅最适合多对多通信的消息

物联网是由嵌入传感器、软件、网络连接和必要电子设备的互联设备组成的网络。嵌入式组件使物联网设备能够收集和交换数据。物联网设备使用的增加给网络基础设施带来了多重挑战,其中最突出的挑战是规模。在物联网设备的大规模部署中,需要快速分析每台物联网设备生成的数据。为了达到规模要求和资源的有效利用,必须均匀分配代理池中的负载。在 MQTT 协议的支持下,您可以在物联网部署中使用 NetScaler 设备对 MQTT 流量进行负载平衡。

下图描述了使用 NetScaler 设备对 MQTT 流量进行负载平衡的 MQTT 架构。

MQTT 系统

采用 MQTT 协议的 IoT 部署包含以下组件:

  • MQTT 代理。一种服务器,它接收来自客户端的所有消息,然后将消息路由到相应的目标客户端。代理负责接收所有消息、筛选消息、确定谁订阅了每条消息,并将消息发送给这些订阅的客户端。代理是每条消息都必须经过的中心枢纽。
  • MQTT 客户端。任何设备,从微控制器到成熟的服务器,它运行 MQTT 库并通过网络连接到 MQTT 代理。发布者和订阅者都是 MQTT 客户端。发布者和订阅者标签指的是客户端是在发布消息还是订阅接收消息。
  • MQTT 负载均衡器。NetScaler 设备配置了 MQTT 负载平衡虚拟服务器,用于对 MQTT 流量进行负载平衡。

在典型的物联网部署中,代理(服务器群集)管理物联网设备组(物联网客户端)。NetScaler 设备根据各种参数(例如客户端 ID、主题和用户名)对流向代理的 MQTT 流量进行负载平衡。

为 MQTT 流量配置负载平衡

要让 NetScaler 设备对 MQTT 流量进行负载平衡,请执行以下配置任务:

  1. 配置 MQTT/MQTT_TLS 服务或服务组。
  2. 配置 MQTT/MQTT_TLS 负载平衡虚拟服务器。
  3. 将 MQTT/MQTT_TLS 服务绑定到 MQTT/MQTT_TLS 负载平衡虚拟服务器。
  4. 配置 MQTT/MQTT_TLS 内容交换虚拟服务器。
  5. 配置内容切换操作以指定目标负载平衡虚拟服务器
  6. 配置内容交换策略。
  7. 将内容交换策略绑定到已配置为重定向到特定负载平衡虚拟服务器的内容交换虚拟服务器。
  8. 保存配置。

使用 CLI 为 MQTT 流量配置负载平衡

配置 MQTT/MQTT_TLS 服务或服务组。

add service <name> <IP> <protocol> <port>
add servicegroup <ServiceGroupName> <Protocol>
bind servicegroup <serviceGroupName> <IP> <port>
<!--NeedCopy-->

示例:

add service srvc1 10.106.163.3 MQTT 1883
add servicegroup srvcg1 MQTT
bind servicegroup srvcg1 10.106.163.3 1883
<!--NeedCopy-->

配置 MQTT/MQTT_TLS 负载平衡虚拟服务器。

add lb vserver <name> <protocol> <IPAddress> <port>
<!--NeedCopy-->

示例:

add lb vserver lb1 MQTT 10.106.163.9 1883
<!--NeedCopy-->

将 MQTT/MQTT_TLS 服务或服务组绑定到 MQTT 负载平衡虚拟服务器。

bind lb vserver <name> <serviceName>
bind lb vserver <name> <servicegroupName>
<!--NeedCopy-->

示例:

bind lb vserver lb1 srvc1
bind lb vserver lb1 srvcg1
<!--NeedCopy-->

配置 MQTT/MQTT_TLS 内容交换虚拟服务器。

add cs vserver <name> <protocol> <IPAddress> <port>
<!--NeedCopy-->

示例:

add cs vserver cs1 MQTT 10.106.163.13 1883
<!--NeedCopy-->

配置内容切换操作以指定目标负载平衡虚拟服务器。

add cs action <name> -targetLBVserver <string> [-comment <string>]
<!--NeedCopy-->

示例:

add cs action act1 -targetlbvserver lbv1
<!--NeedCopy-->

配置内容交换策略。

add cs policy <policyName> [-url <string> | -rule <expression>] –action <actName>
<!--NeedCopy-->

示例:

add cs policy cspol1  -rule  “MQTT.COMMAND.EQ(CONNECT) && MQTT.CONNECT.FLAGS.QOS.eq(2)” -action act1
<!--NeedCopy-->

将内容交换策略绑定到已配置为重定向到特定负载平衡虚拟服务器的内容交换虚拟服务器。

bind cs vserver <virtualServerName> -policyName <policyName> -priority <positiveInteger>
<!--NeedCopy-->

示例:

bind cs vserver cs1 –policyName cspol1 -priority 20
<!--NeedCopy-->

保存配置。

save ns config
<!--NeedCopy-->

使用 GUI 为 MQTT 流量配置负载平衡

  1. 导航到“流量管理”>“负载平衡”>“虚拟服务器”,然后创建 MQTTMQTT_TLS 类型的负载平衡虚拟服务器。
  2. 创建 MQTT 类型的服务或服务组。
  3. 将服务绑定到 MQTT 虚拟服务器。
  4. 单击保存

MQTT 消息长度限制

NetScaler 设备将消息长度超过 65536 字节的消息视为巨型数据包,并在默认情况下将其丢弃。dropmqttjumbomessage lb 参数决定是否处理巨型数据包。默认情况下,此参数设置为 YES,这意味着默认情况下会丢弃巨型 MQTT 数据包。如果将此参数设置为 NO,则 ADC 设备甚至会处理消息长度大于 65536 字节的数据包。

要将 ADC 设备配置为使用 CLI 处理巨型数据包,请执行以下操作:

Set lb parameter –dropMqttJumboMessage [YES | NO]
<!--NeedCopy-->

示例:

set lb parameter –dropMqttJumboMessage no
<!--NeedCopy-->
MQTT 负载平衡