HiveMQ Migration

Kesintisiz HiveMQ Geçişi: İki MQTT Broker'ı Paralel Çalıştırın ve İstemcileri Dalgalar Hâlinde Taşıyın

Kesintisiz bir HiveMQ geçişi, istemciler taşınırken her iki broker'ı da çalışır durumda tutar. Bu rehber HiveMQ Cloud ile ConnectMQ arasında eksiksiz bir Python relay'ini, mesaj döngülerinden nasıl kaçınılacağını, doğru dalga sırasını ve geçişin nasıl güvenle tamamlanacağını gösteriyor.

Cihazlar HiveMQ'dan ConnectMQ'ya dalgalar hâlinde taşınırken mesajları aktaran bir relay ile paralel çalışan iki MQTT broker
Bunu kendi MQTT broker’ınızda çalıştırınFree planla özel, yönetilen bir MQTT broker alın ve hazır kod örnekleriyle başlayın.
Ücretsiz deneyin Kod örnekleri Kart gerekmez

HiveMQ Cloud Serverless'tan hizmeti kesintiye uğratmadan ayrılmanın en güvenli yolu, iki broker'ı bir süre paralel çalıştırmak ve mesajları aralarında aktarmaktır. Böylece cihazlar ve uygulamalar grup grup taşınabilir; hâlâ HiveMQ'da olan bir cihaz, çoktan taşınmış bir uygulamayla konuşmaya devam eder. Bu makale bu relay'i nasıl kuracağınızı, mesaj döngülerinden nasıl kaçınacağınızı ve istemcileri 31 Aralık 2026 son tarihinden önce dalgalar hâlinde nasıl taşıyacağınızı gösteriyor.

Neden Bir Relay Gerekiyor?

Ne HiveMQ Cloud Serverless ne de ConnectMQ gibi yönetilen bir bulut broker, bulut tarafında sizin için başka bir broker'a köprü kurar. Çözüm, sizin çalıştırdığınız küçük bir relay sürecidir: her iki broker'a da sıradan bir MQTT istemcisi olarak bağlanır, bir taraftaki seçili topic'lere abone olur ve bunları diğer tarafta yeniden yayınlar. Yalnızca bir istemci olduğu için standartlara dayalı her broker ile çalışır ve özel izin gerektirmez.

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

Sahada zaten Mosquitto çalıştırıyorsanız, bridge özelliği aynı işi görebilir; Mosquitto'yu bulut MQTT broker'a taşıma ve Mosquitto bridge yapılandırması yazılarına bakın.

Döngü Sorunu ve Ondan Nasıl Kaçınılır?

Relay site1/# topic'ini hem HiveMQ'dan ConnectMQ'ya hem de ConnectMQ'dan HiveMQ'ya aktarırsa, her mesaj sonsuza kadar ileri geri sekip durur. Döngüleri tasarım yoluyla önleyin:

  • Yöne göre aktarın. Telemetri bir yönde (eskiden yeniye), komutlar diğer yönde (yeniden eskiye) akar. Aynı topic filtresini her iki yönde aktarmayın.
  • Aboneliklerde MQTT 5 No Local kullanın; böylece relay aynı broker üzerinde kendi yayınlarını almaz.
  • Aktarılan mesajları işaretleyin. relayed=1 gibi bir MQTT 5 user property kullanın ve bunu zaten taşıyan mesajları atın.

Aşağıdaki betik bu üçünü de uygular.

Python ile Eksiksiz Bir Relay

Bu relay her iki tarafta da paho-mqtt 2.x ve MQTT 5 kullanır. Telemetri ve durum mesajları HiveMQ'dan ConnectMQ'ya, komutlar ise ConnectMQ'dan HiveMQ'ya aktarılır.

# 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

# Yön başına topic filtreleri (aynı filtreyi asla iki yönde birden listelemeyin)
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()

Betiği her iki broker'a da yakın, güvenilir bir host üzerinde (örneğin küçük bir bulut VM'inde veya bir container'da), kimlik bilgilerini ortam değişkenlerinde tutarak çalıştırın. Relay'in ücretsiz Serverless planında çalışması için QoS 1 ile sınırlandırılmıştır; akışlarınız gerektiriyorsa Serverless (Paid) ve üzerinde 2'ye yükseltin. Retain bayrakları korunur; bu yüzden HiveMQ'da yayınlanan retained durum mesajları ConnectMQ'da da retained olarak görünür.

İki pratik not:

  • Relay her broker'da bir bağlantı olarak sayılır. Yeni planı boyutlandırırken onu da hesaba katın.
  • Onu bir üretim bileşeni gibi izleyin. Relay durursa, taşınmış ve taşınmamış istemciler arasındaki mesajlar da durur. Onu systemd altında veya bir container yeniden başlatma politikasıyla çalıştırın.

Dalga Planı

İstemcileri her veri akışının çalışmaya devam edeceği bir sırayla taşıyın.

Dalga Kim taşınıyor? Neden bu sırayla?
0 Relay başlar Her iki broker da aynı telemetriyi ve komutları görür
1 Backend tüketicileri: veritabanları, kural motorları, Node-RED, dashboard'lar Cihaz verilerini relay üzerinden alırlar
2 Farklı sahalardan ve firmware sürümlerinden pilot bir cihaz grubu Sınırlı riskle gerçek dünyada doğrulama
3'ten N'ye Kalan cihazlar, saha veya ürün hattına göre gruplar hâlinde Kontrol noktalarıyla kontrollü dağıtım
Son Komut üreticileri, ardından relay durdurulur Cihazlar zaten yeni broker'dadır

Her dalgadan sonra şunları kontrol edin:

  • ConnectMQ dashboard'undaki bağlantı sayısı taşınan istemci sayısıyla eşleşiyor.
  • Beklenen topic'ler canlı topic gezgininde görünüyor.
  • $SYS/broker/connection/{clientId}/state üzerindeki istemci başına bağlantı durumu taşınan cihazları çevrimiçi gösteriyor.
  • Taşınan hiçbir istemci hâlâ HiveMQ'ya bağlanmıyor (HiveMQ konsolunu kontrol edin).
  • Bağlantı sayısı plan limitleri içinde kalıyor; bir kota aşılırsa MQTT 5 istemcileri 0x97 alır.

Geri Dönüş

Eski küme hâlâ çalışırken her dalga, önceki bağlantı ayarları geri yüklenerek geri alınabilir. Son dalga tamamlanana kadar eski ayarları provisioning sisteminizde erişilebilir tutun. Geçişi aralığın son günlerine bırakmamanın ana nedeni budur: 31 Aralık 2026'dan sonra geri dönülecek bir yer kalmaz.

Geçiş Kontrol Listesi

  1. Tüm cihazlar ve uygulamalar yeni broker'da çalışıyor.
  2. HiveMQ konsolu relay dışında hiçbir istemci bağlantısı göstermiyor.
  3. Retained durum yeni broker'da mevcut; cihazlar tarafından yeniden yayınlanmış veya dışa aktarılan veriden geri yüklenmiş. HiveMQ Serverless veri silme yazısına bakın.
  4. Relay'i durdurun ve HiveMQ'da yeniden ortaya çıkan herhangi bir istemci için bir gün boyunca izleyin.
  5. HiveMQ Serverless kümesini silin ve eski hostname'i yapılandırmadan, firmware varsayılanlarından ve dokümantasyondan kaldırın.

Uçtan uca süreç için HiveMQ Serverless geçiş rehberine bakın. Relay'i bugün app.connectmq.com adresindeki ücretsiz bir broker'a karşı kurup test edebilirsiniz.

Sık Sorulan Sorular

HiveMQ Cloud doğrudan ConnectMQ'ya köprü kurabilir mi?

Bulut tarafında hayır. Yukarıdaki betik gibi bir relay istemcisini ya da kendi altyapınızda, her iki broker'a da normal bir MQTT istemcisi olarak bağlanan bir Mosquitto bridge'i çalıştırın.

Cihazlar geçişi fark edecek mi?

Taşınan cihazlar, ayarları değiştiğinde kısa bir yeniden bağlanma yaşar. Henüz taşınmamış cihazlar hiçbir değişiklik görmez; çünkü relay onların verilerini taşınmış uygulamalara akıtmaya devam eder.

Relay gecikme ekler mi?

Fazladan bir atlama ekler; nerede çalıştığına bağlı olarak genellikle birkaç milisaniye ile onlarca milisaniye arasında. Onu her iki broker'a da yakın konumlandırın ve geçiş tamamlandığında kaldırın.

Relay QoS 1 mi yoksa QoS 2 mi kullanmalı?

QoS 1 iyi bir varsayılandır ve her ConnectMQ planında çalışır. Tüketicilerin QoS 1'in izin verdiği ara sıra oluşan kopyaları ele aldığından emin olun. QoS 2'yi yalnızca kopyaların kabul edilemez olduğu ve planınızın desteklediği yerlerde kullanın.

İlgili yazılar

HiveMQ Migration Lisansı mı, Yönetilen MQTT Broker mı? Ekibinize Hangi Yol Uyar?

HiveMQ'nun ücretsiz Migration lisansı, Serverless kullanıcılarına 12 ay boyunca 100 bağlantı ve saniyede 100 mesajla self-managed bir Enterprise Broker sunuyor. Bu yolun gerçekte neler gerektirdiğini, yönetilen bir MQTT broker ile nasıl karşılaştırıldığını ve nasıl karar vereceğinizi anlatıyoruz.

5 dk okuma

Tüm yazılar →

Özel MQTT broker’ınız birkaç tık uzağınızda

Hesabınızı oluşturun, broker kimlik bilgilerinizi alın ve ilk cihazınızı bağlayın — kurulacak, yamalanacak ya da ölçeklendirilecek sunucu yok.