ADC

MQTT負荷分散

メッセージキューテレメトリトランスポート (MQTT) は、モノのインターネット (IoT) 用の OASIS 標準メッセージングプロトコルです。MQTT は、IoT システム内で効果的な通信を実現する柔軟で使いやすいテクノロジーです。MQTT はブローカーベースのプロトコルで、クライアントとブローカー間のメッセージ交換を容易にするために広く使用されています。

MQTT には次の主な利点があるため、お使いの IoT デバイスに最適なオプションです。

  • 信頼性
  • 迅速な応答時間
  • サポートできるデバイス数は無制限
  • 多対多のコミュニケーションに最適なパブリッシュ/サブスクライブメッセージ

IoTは、センサー、ソフトウェア、ネットワーク接続、および必要な電子機器が組み込まれた相互接続されたデバイスのネットワークです。組み込みコンポーネントにより、IoT デバイスはデータを収集して交換できます。IoTデバイスの使用の増加は、ネットワークインフラストラクチャに複数の課題をもたらしますが、その主な課題はスケールです。IoTデバイスを大規模に導入する場合、各IoTデバイスによって生成されたデータを迅速に分析する必要があります。スケール要件とリソースの効率的な使用を実現するには、ブローカープールの負荷を均等に分散する必要があります。MQTTプロトコルのサポートにより、IoT展開でCitrix ADCアプライアンスを使用して、MQTTトラフィックの負荷分散を行うことができます。

次の図は、Citrix ADCアプライアンスを使用してMQTTトラフィックの負荷を分散するMQTTアーキテクチャを示しています。

MQTT システム

MQTT プロトコルを使用した IoT デプロイメントには、次のコンポーネントがあります。

  • MQTT ブローカー。クライアントからすべてのメッセージを受信し、そのメッセージを適切な宛先クライアントにルーティングするサーバー。ブローカーは、すべてのメッセージの受信、メッセージのフィルタリング、各メッセージの購読者の決定、および購読しているクライアントへのメッセージの送信を行います。ブローカーは、すべてのメッセージが通過する中心的なハブです。
  • MQTT クライアント。マイクロコントローラーから本格的なサーバーまで、MQTT ライブラリを実行し、ネットワーク経由で MQTT ブローカーに接続するあらゆるデバイス。発行元とサブスクライバーの両方が MQTT クライアントです。発行元とサブスクライバーのラベルは、クライアントがメッセージをパブリッシュしているのか、それともサブスクライブしてメッセージを受信しているのかを示します。
  • MQTT ロードバランサー。Citrix ADCアプライアンスは、MQTTトラフィックを負荷分散するためにMQTT負荷分散仮想サーバーで構成されています。

一般的な IoT 展開では、ブローカー(サーバーのクラスタ)が IoT デバイスのグループ(IoT クライアント)を管理します。Citrix ADCアプライアンスは、クライアント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. [ **トラフィック管理 ] > [ 負荷分散 ] > [ 仮想サーバー] に移動し、MQTT または MQTT_TLS タイプの負荷分散仮想サーバーを作成します。**
  2. MQTT タイプのサービスまたはサービスグループを作成します。
  3. サービスを MQTT 仮想サーバーにバインドします。
  4. [保存] をクリックします。

MQTT メッセージ長の制限

NetScalerアプライアンスは、メッセージ長が65536バイトを超えるメッセージをジャンボパケットとして扱い、デフォルトで破棄します。 dropmqttjumbomessage lb パラメータは、ジャンボパケットを処理するかどうかを決定します。このパラメータはデフォルトで YESに設定されています。つまり、ジャンボ MQTT パケットはデフォルトでドロップされます。このパラメータを NOに設定すると、ADC アプライアンスはメッセージ長が 65536 バイトを超えるパケットも処理します。

CLIを使用してジャンボパケットを処理するようにADCアプライアンスを設定するには:

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

例:

set lb parameter –dropMqttJumboMessage no
<!--NeedCopy-->
MQTT負荷分散