Migration HiveMQ

Migration HiveMQ sans interruption : faire tourner deux brokers MQTT en parallèle et migrer les clients par vagues

Une migration HiveMQ sans interruption maintient les deux brokers en service pendant que les clients migrent. Ce guide présente un relais Python complet entre HiveMQ Cloud et ConnectMQ, la façon d'éviter les boucles de messages, le bon ordre des vagues et une bascule en toute sécurité.

Deux brokers MQTT fonctionnant en parallèle avec un relais qui transfère les messages pendant que les appareils migrent par vagues de HiveMQ vers ConnectMQ
Essayez-le sur votre propre broker MQTTObtenez un broker MQTT privé et managé avec l’offre Free et partez d’exemples de code prêts à l’emploi.
Essayer gratuitement Exemples de code Aucune carte bancaire requise

Le moyen le plus sûr de quitter HiveMQ Cloud Serverless sans interrompre le service consiste à faire tourner les deux brokers en parallèle pendant un temps et à relayer les messages entre eux. Les appareils et les applications peuvent alors migrer groupe par groupe, et un appareil encore sur HiveMQ continue de dialoguer avec une application qui a déjà migré. Cet article montre comment construire ce relais, comment éviter les boucles de messages et comment migrer les clients par vagues avant l'échéance du 31 décembre 2026.

Pourquoi un relais est nécessaire

Ni HiveMQ Cloud Serverless ni un broker cloud managé comme ConnectMQ ne créeront pour vous un pont vers un autre broker côté cloud. La solution est un petit processus de relais que vous exploitez vous-même : il se connecte aux deux brokers comme un client MQTT ordinaire, s'abonne à des topics choisis d'un côté et les republie de l'autre. Comme il ne s'agit que d'un client, il fonctionne avec n'importe quel broker conforme aux standards et ne nécessite aucune permission particulière.

 devices (still on HiveMQ) --> HiveMQ Serverless --relay--> ConnectMQ --> moved consumers
 moved command senders     --> ConnectMQ        --relay--> HiveMQ Serverless --> devices

Si vous exploitez déjà Mosquitto sur site, sa fonction de bridge peut faire le même travail ; voir migrer Mosquitto vers un broker MQTT cloud et configuration d'un bridge Mosquitto.

Le problème des boucles et comment l'éviter

Si le relais transfère le topic site1/# de HiveMQ vers ConnectMQ et aussi de ConnectMQ vers HiveMQ, chaque message fait des allers-retours à l'infini. Empêchez les boucles dès la conception :

  • Transférez dans un seul sens. La télémétrie circule dans un sens (de l'ancien vers le nouveau), les commandes dans l'autre (du nouveau vers l'ancien). Ne transférez jamais le même filtre de topic dans les deux sens.
  • Utilisez l'option No Local de MQTT 5 sur les abonnements, pour que le relais ne reçoive pas ses propres publications sur le même broker.
  • Marquez les messages relayés avec une user property MQTT 5, comme relayed=1, et ignorez les messages qui la portent déjà.

Le script ci-dessous applique ces trois règles.

Un relais complet en Python

Ce relais utilise paho-mqtt 2.x et MQTT 5 des deux côtés. La télémétrie et les statuts vont de HiveMQ vers ConnectMQ ; les commandes vont de ConnectMQ vers HiveMQ.

# pip install "paho-mqtt>=2.0"
import os, ssl
import paho.mqtt.client as mqtt
from paho.mqtt.packettypes import PacketTypes
from paho.mqtt.properties import Properties
from paho.mqtt.subscribeoptions import SubscribeOptions

# Filtres de topics par sens (ne jamais mettre le même filtre dans les deux)
OLD_TO_NEW = ["site1/+/telemetry", "site1/+/status"]
NEW_TO_OLD = ["site1/+/cmd"]

def make_client(client_id, user, password):
    c = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id=client_id, protocol=mqtt.MQTTv5)
    c.username_pw_set(user, password)
    c.tls_set(cert_reqs=ssl.CERT_REQUIRED)
    c.reconnect_delay_set(min_delay=1, max_delay=60)
    return c

old = make_client("relay-old-1", os.environ["HIVEMQ_USER"], os.environ["HIVEMQ_PASSWORD"])
new = make_client(os.environ["CMQ_CLIENT_ID"] + "_relay", os.environ["CMQ_USER"], os.environ["CMQ_PASSWORD"])

def is_relayed(msg):
    props = getattr(msg, "properties", None)
    return any(k == "relayed" for k, _ in (getattr(props, "UserProperty", None) or []))

def forward(target):
    def on_message(client, userdata, msg):
        if is_relayed(msg):
            return
        props = Properties(PacketTypes.PUBLISH)
        props.UserProperty = [("relayed", "1")]
        target.publish(msg.topic, msg.payload, qos=min(msg.qos, 1), retain=msg.retain, properties=props)
    return on_message

def subscriber(filters):
    def on_connect(client, userdata, flags, reason_code, properties):
        print("connected:", reason_code, "subscribing to", filters)
        opts = SubscribeOptions(qos=1, noLocal=True)
        for f in filters:
            client.subscribe(f, options=opts)
    return on_connect

old.on_connect, old.on_message = subscriber(OLD_TO_NEW), forward(new)
new.on_connect, new.on_message = subscriber(NEW_TO_OLD), forward(old)

old.connect(os.environ["HIVEMQ_HOST"], 8883)
new.connect("broker.connectmq.com", 8883)
new.loop_start()
old.loop_forever()

Exécutez-le sur un hôte fiable, proche des deux brokers, par exemple une petite VM cloud ou un conteneur, avec les identifiants dans des variables d'environnement. La QoS est plafonnée à 1 pour que le relais fonctionne sur le plan Serverless gratuit ; passez-la à 2 à partir de Serverless (Paid) si vos flux l'exigent. Les flags retain sont conservés : les messages de statut retenus publiés sur HiveMQ apparaissent donc aussi comme retenus sur ConnectMQ.

Deux remarques pratiques :

  • Le relais compte pour une connexion sur chaque broker. Incluez-le dans le dimensionnement du nouveau plan.
  • Supervisez-le comme un composant de production. Si le relais s'arrête, les messages entre clients migrés et non migrés s'arrêtent aussi. Exécutez-le sous systemd ou avec une politique de redémarrage de conteneur.

Le plan de vagues

Migrez les clients dans un ordre qui préserve chaque flux de données.

Vague Qui migre Pourquoi dans cet ordre
0 Démarrage du relais Les deux brokers voient la même télémétrie et les mêmes commandes
1 Consommateurs backend : bases de données, moteurs de règles, Node-RED, tableaux de bord Ils reçoivent les données des appareils via le relais
2 Un groupe pilote d'appareils issus de sites et de versions de firmware différents Validation en conditions réelles avec un risque limité
3 à N Les appareils restants, par lots, par site ou par gamme de produits Déploiement maîtrisé avec points de contrôle
Finale Les producteurs de commandes, puis arrêt du relais Les appareils sont déjà sur le nouveau broker

Après chaque vague, vérifiez que :

  • Le nombre de connexions dans le tableau de bord ConnectMQ correspond au nombre de clients migrés.
  • Les topics attendus apparaissent dans l'explorateur de topics en direct.
  • L'état de connexion de chaque client sur $SYS/broker/connection/{clientId}/state indique que les appareils migrés sont en ligne.
  • Aucun client migré ne se connecte encore à HiveMQ (vérifiez la console HiveMQ).
  • Le nombre de connexions reste dans les limites du plan ; les clients MQTT 5 reçoivent 0x97 en cas de dépassement de quota.

Retour arrière

Tant que l'ancien cluster fonctionne, chaque vague peut être annulée en restaurant les paramètres de connexion précédents. Gardez les anciens paramètres disponibles dans votre système de provisioning jusqu'à la fin de la dernière vague. C'est la principale raison de ne pas repousser la migration aux derniers jours de décembre : après le 31 décembre 2026, il n'y a plus rien vers quoi revenir.

Checklist de bascule

  1. Tous les appareils et toutes les applications tournent sur le nouveau broker.
  2. La console HiveMQ n'affiche plus aucune connexion client en dehors du relais.
  3. L'état retenu est présent sur le nouveau broker, republié par les appareils ou restauré depuis un export. Voir suppression des données HiveMQ Serverless.
  4. Arrêtez le relais et surveillez pendant une journée tout client qui réapparaîtrait sur HiveMQ.
  5. Supprimez le cluster HiveMQ Serverless et retirez l'ancien nom d'hôte de la configuration, des valeurs par défaut du firmware et de la documentation.

Pour le processus de bout en bout, consultez le guide de migration HiveMQ Serverless. Vous pouvez construire et tester le relais dès aujourd'hui avec un broker gratuit sur app.connectmq.com.

Questions fréquentes

HiveMQ Cloud peut-il faire un pont direct vers ConnectMQ ?

Pas côté cloud. Exécutez un client relais comme le script ci-dessus, ou un bridge Mosquitto sur votre propre infrastructure, qui se connecte aux deux brokers comme un client MQTT normal.

Les appareils remarqueront-ils la migration ?

Les appareils qui migrent subissent une brève reconnexion lorsque leurs paramètres changent. Ceux qui n'ont pas encore migré ne voient aucun changement, car le relais continue d'acheminer leurs données vers les applications migrées.

Le relais ajoute-t-il de la latence ?

Il ajoute un saut supplémentaire, généralement de quelques millisecondes à quelques dizaines de millisecondes selon l'endroit où il tourne. Placez-le près des deux brokers et retirez-le une fois la migration terminée.

Le relais doit-il utiliser la QoS 1 ou la QoS 2 ?

La QoS 1 est un bon choix par défaut et fonctionne sur tous les plans ConnectMQ. Assurez-vous que les consommateurs gèrent les doublons occasionnels, que la QoS 1 autorise. N'utilisez la QoS 2 que là où les doublons sont inacceptables et si votre plan la prend en charge.

Articles liés

Alternative à HiveMQ Serverless : passez au broker MQTT serverless de ConnectMQ Cloud

Les utilisateurs de HiveMQ Cloud Serverless Free et Pay As You Go qui veulent garder la même expérience sans serveur peuvent passer au broker MQTT serverless de ConnectMQ Cloud. Découvrez les plans, les limites, les endpoints, les outils intégrés et comment connecter votre premier appareil en quelques minutes.

6 min de lecture

Tous les articles →

Votre broker MQTT privé, à quelques clics

Créez un compte, récupérez les identifiants de votre broker et connectez votre premier appareil — aucun serveur à installer, mettre à jour ou dimensionner.