Bereitstellungsplanung für Azure IoT Einsatz

Viele Azure IoT Einsatz Einstellungen sind bei der Bereitstellung festgelegt und können nur durch eine erneute Bereitstellung geändert werden. Planen Sie vor der Bereitstellung Die Clustertopologie, die Broker-Kardinalität, das Speicherprofil und die optionalen Brokereinstellungen, die Sie benötigen. In diesem Artikel werden die Entscheidungen zusammengefasst, die Sie treffen sollten.

Die Architektur verstehen

Azure IoT Einsatz ist eine Reihe modularer, kubernetes-nativer Dienste, die in einem Azure Arc-fähigen Cluster bereitgestellt werden. Zu den wichtigsten Komponenten gehören:

Bestandteil Purpose
MQTT-Broker Hochleistungs-MQTT 3.1.1 und 5 Broker für Edge-Messaging
Connector für OPC UA Sammelt Daten von OPC UA-Servern und veröffentlicht in MQTT
Datenflüsse Leitet Daten weiter, transformiert sie und sendet sie an Cloud-Endpunkte.
Azure Geräteregistrierung Cloudbasierte Registrierung für Geräte, Objekte und Schemas
Akri-Dienste Geräteerkennung und Protokolladapter
Statusspeicher Key-Value-Persistenzschicht im MQTT-Broker

In der gesamten Dokumentation werden zwei Begriffe verwendet:

  • Bereitstellung – Die Instanz, Arc-Erweiterungen, benutzerdefinierte Standorte und alle konfigurierbaren Ressourcen (Ressourcen, Geräte, Datenflüsse).
  • Instanz – Die übergeordnete Ressource, die die Dienste bündelt.

Auswählen der Clustertopologie

Bevor Sie die Bereitstellung ausführen, entscheiden Sie, ob Sie einen Einzelknoten oder einen Cluster mit mehreren Knoten benötigen. Diese Entscheidung bestimmt die Hardwareanforderungen und die Broker-Kardinalitätseinstellungen.

Topologie Anwendungsfall Mindesthardware
Einzelknoten Kleinere Bereitstellungen, bei denen hohe Verfügbarkeit nicht erforderlich ist 4 vCPUs, 16 GB RAM, 30 GB Speicher
Mehrere Knoten (3-5 Knoten) Hohe Verfügbarkeit und höhere Durchsatzanforderungen 8 vCPUs, 32 GB RAM pro Knoten

Important

Die Kardinalität wird nur bei der Bereitstellung festgelegt. Eine neue Bereitstellung ist erforderlich, wenn die Kardinalitätseinstellungen geändert werden müssen.

Brokerkardinalität verstehen

Die Kardinalität ist die Anzahl der Frontend-Replikate, Frontend-Worker, Backend-Partitionen und Backend-Worker in der Broker-Bereitstellung. Die Kardinalität steuert, wie der Broker horizontal skaliert und wie widerstandsfähig er gegenüber Ausfällen von Pods oder Nodes ist.

Der MQTT-Broker verfügt über eine zweistufige Architektur: Frontend-Pods verarbeiten Clientverbindungen und Protokollverarbeitung, während Back-End-Pods nachrichtenspeicherung und -übermittlung verarbeiten. Das Verständnis, wie die einzelnen Ebenen skaliert werden, ist für die Kapazitätsplanung wichtig.

Frontend

Frontend-Pods akzeptieren MQTT-Clientverbindungen und weiterleiten Nachrichten an das Back-End. Front-End-Pods speichern keine Nachrichten selbst. Es gibt zwei Haupteinstellungen für die Front-End-Ebene:

  • Replikate: Die Anzahl der bereitzustellenden Front-End-Pods. Das Hinzufügen weiterer Frontend-Replikate erhöht die Anzahl gleichzeitiger Client-Verbindungen, die der Broker verarbeiten kann, und sorgt für Hochverfügbarkeit, falls einer der Frontend-Pods ausfällt.
  • Workers: Die Anzahl der logischen Worker pro Front-End-Pod. Durch das Hinzufügen weiterer Mitarbeiter kann der Frontend-Pod mehr CPU-Kerne verwenden. Jeder Worker kann bis zu einem CPU-Kern verbrauchen.

Back-End-Kette

Backend-Pods übernehmen die Nachrichtenspeicherung und -zustellung. Es gibt drei Haupteinstellungen für die Back-End-Ebene:

  • Partitionen: Die Anzahl der bereitzustellenden Partitionen. Partitionen sind die Einheit der horizontalen Skalierung für den Nachrichtendurchsatz. Durch einen Prozess, der als Sharding bezeichnet wird, verarbeitet jede Partition einen Teil der Nachrichten, die nach Thema und Sitzung gehardet werden. Die Front-End-Pods verteilen den Nachrichtendatenverkehr auf die Partitionen. Durch das Hinzufügen weiterer Partitionen erhöht sich der gesamte Nachrichtendurchsatz, den der Broker verarbeiten kann.
  • Redundanzfaktor: Die Anzahl der Back-End-Pods, die pro Partition bereitgestellt werden sollen. Durch das Erhöhen des Redundanzfaktors erhöht sich die Anzahl der Datenkopien, um Resilienz gegenüber Knotenfehlern im Cluster zu ermöglichen.
  • Worker: Die Anzahl der Worker pro Back-End-Pod. Mitarbeiter sind die Einheit der vertikalen Skalierung innerhalb einer Partition . Durch das Hinzufügen weiterer Mitarbeiter kann der Back-End-Pod mehr CPU-Kerne auf demselben Knoten verwenden. Jeder Worker kann bis zu zwei CPU-Kerne nutzen. Achten Sie daher darauf, beim Erhöhen der Anzahl der Worker pro Replikat die Anzahl der CPU-Kerne im Cluster nicht zu überschreiten.

Note

Die Effektivität der Partitionsskalierung hängt davon ab, wie gleichmäßig der Themenbereich auf Partitionen verteilt ist. Eine stark schiefe Verteilung kann Hotspots auf einer einzelnen Partition erstellen.

Important

Der Back-End-Redundanzfaktor muss 2 oder höher sein. Der Broker benötigt mindestens zwei Backend-Replikate pro Partition für Hochverfügbarkeit und die Unterstützung von Rolling Updates. Das Festlegen des Redundanzfaktors auf 1 führt zu einem Bereitstellungsvalidierungsfehler.

Durchsatzschätzung

Die Leistung einer einzelnen Partition hängt stark von den CPU-Merkmalen des Knotens ab, auf dem sie ausgeführt wird. Als Faustregel erwarten Sie ungefähr 5.000 bis 6.000 QoS 1-Nachrichten pro Sekunde pro Partition mit 8-KB-Nutzlasten auf einer 2-GHz-CPU (~4-GHz Turbo). Die reale Leistung hängt von vielen Faktoren ab. Verwenden Sie diese Zahl also nur als Ausgangspunkt für die Kapazitätsplanung.

Detaillierte Benchmarkdaten finden Sie unter MQTT Broker Performance Benchmarking.

Empfehlungen für einen einzelnen Knoten

  • Frontend-Replikate: Auf 1 festgelegt.
  • Front-End-Worker: Legen Sie die Hälfte der CPU-Kerne pro Knoten fest.
  • Back-End-Replikate (Redundanzfaktor): Legen Sie auf mindestens 2 fest, damit der Broker Rollupdates ausführen kann.

Beispiel: Einzelner Knoten, 4 CPU-Kerne

Front-End-Einstellung Wert Back-End-Einstellung Wert
Replikate 1 Redundanzfaktor 2
Arbeitskräfte 2 Arbeitskräfte 1
Partitionen 1

Empfehlungen für mehrere Knoten

Die folgenden Werte werden für eine optimale Leistung empfohlen. Bei großen Clustern mit geringem Datenverkehr können diese Werte niedriger als die Empfehlungen festgelegt werden, ohne Probleme zu verursachen. Weitere Überlegungen wie Arbeitsspeicher (RAM) und Leistungsmerkmale werden in den folgenden Abschnitten erläutert. Testen Sie ihre Konfiguration immer mit der erwarteten Workload, um die Leistung zu bestätigen.

  • Front-End-Replikate: Gleich der Anzahl der Knoten im Cluster setzen.
  • Front-End-Worker: Legen Sie die Hälfte der CPU-Kerne pro Knoten fest.
  • Backend-Replikate (Redundanzfaktor): Für Redundanz und Unterstützung für Rolling Updates auf 2 festlegen.
  • Back-End-Partitionen: Legen Sie gleich der Anzahl der Knoten im Cluster fest.
  • Back-End-Mitarbeiter: Legen Sie die Hälfte der CPU-Kerne pro Knoten fest.

Beispiel: 3-Knoten-Cluster, 8 CPU-Kerne pro Knoten

Front-End-Einstellung Wert Back-End-Einstellung Wert
Replikate 3 Redundanzfaktor 2
Arbeitskräfte 4 Arbeitskräfte 4
Partitionen 3

Beispiel: 5-Knoten-Cluster, 16 CPU-Kerne pro Knoten

Front-End-Einstellung Wert Back-End-Einstellung Wert
Replikate 5 Redundanzfaktor 2
Arbeitskräfte 8 Arbeitskräfte 8
Partitionen 5

Important

Die Gesamtanzahl der Frontend- und Back-End-Worker pro Knoten sollte die Anzahl der cpu-Kerne, die auf diesem Knoten verfügbar sind, nicht überschreiten. Eine Überprovisionierung von Workern über die verfügbaren Kerne hinaus kann zu Konkurrenz um CPU-Ressourcen führen und die Leistung beeinträchtigen.

CPU-Ressourcenbeschränkungen

Um Ressourcenverhungern im Cluster zu verhindern, kann der Broker so konfiguriert werden, dass Kubernetes CPU-Ressourcengrenzwerte basierend auf den Kardinalitätseinstellungen angefordert werden. Wenn diese Option aktiviert ist, erhöht die Skalierung der Anzahl von Replikaten oder Workern proportional die erforderlichen CPU-Ressourcen.

Important

Der Standardwert für generateResourceLimits.cpu hängt von der Bereitstellungsmethode ab:

  • Azure CLI (az iot ops create): Disabled Standardmäßig, um Bereitstellungsfehler in ressourcenbeschränkten Clustern wie Clustern mit einem Knoten zu vermeiden, bei denen CPU-Anforderungen verfügbare Ressourcen überschreiten können.
  • REST-API, Bicep und ARM-Vorlagen: Enabled standardmäßig. Wenn Sie mit diesen Methoden bereitstellen, ohne generateResourceLimits.cpu explizit festzulegen, werden CPU-Ressourcenlimits automatisch festgelegt.

Wenn Sie CPU-Ressourcenbeschränkungen aktivieren, stellen Sie sicher, dass Ihr Cluster über genügend CPU-Ressourcen verfügt, um die Anforderungen des Brokers basierend auf Ihrer Kardinalitätskonfiguration zu erfüllen.

Die Standardeinstellung für REST-API-, Bicep- und ARM-Vorlagen ist in der Broker-API-Spezifikation definiert.

Der MQTT-Broker fordert CPU-Ressourcen pro Pod basierend auf der Anzahl der konfigurierten Mitarbeiter an:

  • Frontend-Pods: 1,0 CPU pro Worker
  • Back-End-Pods: 2.0 CPU pro Worker

Verwenden Sie die folgenden Formeln, um die CPU-Gesamtanforderungen zu berechnen:

Bestandteil Formula
Front-End-CPU replicas × frontend.workers × 1.0 CPU
Back-End-CPU partitions × redundancyFactor × backend.workers × 2.0 CPU
Gesamtbroker-CPU Frontend CPU + Back-End-CPU

Vorsicht

Der Broker ist nicht die einzige Komponente, die CPU auf dem Cluster verbraucht. Andere Azure IoT Einsatz-Komponenten (z. B. die Datenfluss-Engine, den OPC UA-Connector und die System-Pods) reservieren auch CPU-Ressourcen, in der Regel 200-300m im Aggregat. Achten Sie bei der Planung der Clusterkapazität darauf, diesen Aufwand über die CPU-Anforderungen des Brokers zu berücksichtigen. Wenn die von allen Pods angeforderte gesamte CPU die verfügbare CPU auf Ihrem Cluster überschreitet, bleiben Brokerpods in einem Pending-Zustand hängen.

Beispiel: kleiner Cluster

Erwägen Sie einen 2-Knoten-Cluster mit 4 CPU-Kernen pro Knoten (insgesamt 8 Kerne) mit der folgenden Kardinalität:

{
  "cardinality": {
    "frontend": {
      "replicas": 2,
      "workers": 2
    },
    "backendChain": {
      "partitions": 1,
      "redundancyFactor": 2,
      "workers": 1
    }
  }
}

Der Broker fordert Folgendes an:

  • Frontend CPU: 2 Replikas × 2 Arbeiter × 1:0 = 4:0 CPU
  • Backend-CPU: 1 Partition × 2 RF × 1 Worker × 2,0 = 4,0 CPU
  • Gesamtbroker-CPU: 8.0 CPU

Diese Konfiguration fordert 8.0 CPU auf einem Cluster mit nur 8 Kernen an, wobei für andere Azure IoT Einsatz Komponenten (200-300m) oder für Kubernetes-System pods nichts übrig bleibt. Die Broker-Pods verbleiben im Zustand Pending mit Fehlern vom Typ Insufficient cpu.

Um dies zu beheben, fügen Sie entweder weitere Knoten hinzu, erhöhen Sie die Kerne pro Knoten, oder verringern Sie die Broker-Kardinalität.

Beispiel: größere Bereitstellung

Die folgende Kardinalität fordert deutlich mehr CPU-Ressourcen an:

{
  "cardinality": {
    "frontend": {
      "replicas": 3,
      "workers": 2
    },
    "backendChain": {
      "partitions": 3,
      "redundancyFactor": 2,
      "workers": 2
    }
  }
}
  • Frontend CPU: 2 Replikas × 2 Arbeiter × 1:0 = 6:0 CPU
  • Back-End-CPU: 3 Partitionen × 2 RF × 2 Worker × 2,0 = 24.0 CPU
  • Gesamt-Broker CPU: 30.0 CPU

Ein Cluster benötigt mindestens 30 verfügbare CPU-Kerne allein für Broker-Pods sowie zusätzliche Kapazität für andere Azure IoT Einsatz-Komponenten und Kubernetes-System-Pods.

Konfiguration der CPU-Ressourcenbeschränkung

CPU-Ressourcengrenzwerte werden vom generateResourceLimits.cpu Feld in der Brokerressource gesteuert. Diese Konfiguration wird nur mithilfe des --broker-config-file Flags unterstützt, wenn Sie Azure IoT Einsatz mithilfe des az iot ops create Befehls bereitstellen. Weitere Informationen finden Sie unter Azure CLI-Unterstützung für die erweiterte MQTT-Brokerkonfiguration.

Bereiten Sie eine Brokerkonfigurationsdatei vor, indem Sie der GenerateResourceLimits-API-Referenz folgen. Die folgenden Beispiele zeigen die beiden möglichen Werte:

{
  "generateResourceLimits": {
    "cpu": "Enabled"
  }
}

Oder

{
  "generateResourceLimits": {
    "cpu": "Disabled"
  }
}

Wählen Sie Ihr Speicherprofil aus.

Das Speicherprofil steuert die maximale MQTT-Nachrichtengröße, die der Broker akzeptiert, die Speicherauslastung im Leerlauf und die maximale Speicherauslastung der einzelnen Pods. Entscheiden Sie sich für das richtige Speicherprofil vor der Bereitstellung basierend auf den erwarteten Nachrichtengrößen und dem Durchsatz.

Speicherprofil Maximale Nachrichtengröße Frontend-Arbeitsspeicher im Leerlauf (pro Pod) Maximaler Frontend-Speicher (pro Pod) Backend-Speicher im Leerlauf (pro Pod) Maximaler Back-End-Speicher (pro Pod) Anwendungsfall
Winzig 4 MB ~29 MiB ~99 MiB ~41 MiB ~102 MiB Geringer Datenverkehr, nur kleine Pakete
Low 16 MB ~33 MiB ~387 MiB ~66 MiB ~390 MiB Begrenzter Arbeitsspeicher, kleine Pakete
Mittel (Standard) 64 MB ~169 MiB ~1,9 GiB ~211 MiB ~1,5 GiB Moderater Datenverkehr und Nachrichtengrößen
Hoch 256 MB ~4,9 GiB ~4,9 GiB ~5,8 GiB ~5,8 GiB Hoher Durchsatz, große Nachrichten

Note

Die Speicherwerte in der Tabelle gelten je Pod. Alle Mitarbeiter innerhalb eines Pods nutzen dieselbe Speicherzuweisung – durch das Hinzufügen weiterer Mitarbeiter wird der Speichergrenzwert des Pods nicht erhöht.

Warning

Der Broker lehnt Nachrichten ab, wenn die Speicherauslastung 75% Kapazität erreicht. Wählen Sie ein Profil mit ausreichenden Reserven für Ihre erwarteten Nachrichtengrößen und den erwarteten Durchsatz aus.

Eingehender Puffer und Rückdruck

Jedes Speicherprofil definiert eine maximale Eingehende Puffergröße für PUBLISH-Daten pro Back-End-Worker. Wenn der Puffer 75% Kapazität erreicht, aktiviert der Broker Backpressure-Mechanismen und beginnt mit dem Ablehnen eingehender Nachrichten. Abgelehnte Pakete erhalten als Antwort ein PUBACK mit dem Fehlercode Kontingent überschritten.

Die folgende Tabelle zeigt die Größe der eingehenden Puffer für jeden Mitarbeiter für jedes Profil:

Speicherprofil Maximale Größe des Eingabepuffers (pro Worker) Effektiver Puffer (bei 75% Rückdruck)
Winzig ~16 MiB ~12 MiB
Low ~64 MiB ~48 MiB
Mittel ~576 MiB ~432 MiB
Hoch ~2 GiB ~1,5 GiB

Berücksichtigen Sie bei der Auswahl eines Speicherprofils Folgendes:

  • Klein: Es sollte nur ein Frontend verwendet werden. Nur Pakete senden, die kleiner als 4 MiB sind.
  • Niedrig: Es sollten nur ein oder zwei Frontends verwendet werden. Senden Sie nur Pakete, die kleiner als 16 MiB sind.
  • Mittel: Geeignet für die meisten Produktionsworkloads mit moderaten Nachrichtengrößen.
  • Hoch: Verwenden Sie diese Eigenschaft, wenn Sie große Nachrichten oder hohen Durchsatz mit großen Puffern verarbeiten müssen.

Der gesamte Brokerspeicher hängt sowohl vom Speicherprofil als auch von der Kardinalität ab (Anzahl der Frontend-Replikate, Back-End-Partitionen und Redundanzfaktor). Mehr Pods bedeuten mehr Gesamtspeicher. Informationen zum gemessenen geplanten Ressourcenverbrauch in verschiedenen Konfigurationen finden Sie unter Baseline-Ressourcenprofile.

Berechnen der Gesamtspeicherauslastung

Sie können die Gesamtspeicherauslastung mit dieser Formel berechnen:

M_total = (R_fe × M_fe) + (P_be × RF_be × M_be × W_be)

Ort:

Variable Description
M_total Gesamtspeicherauslastung
R_fe Die Anzahl der Frontend-Replikate
M_fe Die Speicherauslastung der einzelnen Frontend-Replikate
P_be Die Anzahl der Backend-Partitionen
RF_be Back-End-Redundanzfaktor
M_be Die Speicherauslastung der einzelnen Back-End-Replikate
W_be Die Anzahl der Arbeitskräfte pro Backend-Replikat

Wenn Sie z. B. das Profil für mittleren Speicher auswählen, verfügt das Profil über eine Frontend-Speicherauslastung von 1,9 GiB und eine Back-End-Speicherauslastung von 1.5 GiB. Angenommen, die Brokerkonfiguration ist 2 Frontend-Replikate, 2 Back-End-Partitionen und ein Back-End-Redundanzfaktor von 2. Die Gesamtspeicherauslastung lautet:

M_total = (2 × 1.9 GiB) + (2 × 2 × 1.5 GiB × 2)
        = 15.8 GiB

Im Vergleich dazu verfügt das Tiny-Speicherprofil über eine Frontend-Speicherauslastung von 99 MiB und eine Back-End-Speicherauslastung von 102 MiB. Bei derselben Brokerkonfiguration lautet die Gesamtspeicherauslastung:

M_total = (2 × 99 MiB) + (2 × 2 × 102 MiB × 2)
        = 198 MiB + 816 MiB
        = 1014 MiB (≈ 1.0 GiB)

Speicherprofilkonfiguration

Wenn Sie IoT-Vorgänge mithilfe des az iot ops create Befehls bereitstellen, gibt der --broker-mem-profile Parameter die Speicherprofileinstellungen an.

Mit dem folgenden Befehl wird das Speicherprofil beispielsweise auf Tiny festgelegt (andere Parameter werden der Kürze halber weggelassen):

az iot ops create ... --broker-mem-profile Tiny

Weitere Informationen finden Sie unter az iot ops create optionale Parameter.

Optionale Brokereinstellungen

Die folgenden Brokereinstellungen werden auch zur Bereitstellungszeit konfiguriert und können danach nicht mehr geändert werden. Überprüfen Sie diese, wenn sie für Ihr Szenario gelten:

  • Disk-backed message buffer – Puffern von Nachrichten auf datenträger, wenn Abonnentenwarteschlangen den verfügbaren Arbeitsspeicher überschreiten. Nützlich für dauerhafte Sitzungen und Konnektivitätsprobleme.
  • Persistenz – Schreiben Sie kritische Brokerdaten auf den Datenträger, um sie über Neustarts hinweg beizubehalten.
  • Diagnose – Konfigurieren von Metriken, Protokollen und Selbstüberprüfungssonden für den MQTT-Broker.
  • Erweiterte MQTT-Optionen – Anpassen des Sitzungsablaufs, Ablauf der Nachricht, Begrenzungen der Abonnentenwarteschlange und Keep-Alive-Einstellungen.
  • Interne Datenverkehrsverschlüsselung – Konfigurieren der Verschlüsselung des internen Datenverkehrs zwischen Broker-Frontend- und Back-End-Pods (standardmäßig aktiviert).

Nächste Schritte