Implementatieplanning voor Azure IoT-bewerkingen

Veel Azure IoT-bewerkingen-instellingen zijn opgelost tijdens de implementatie en kunnen alleen worden gewijzigd door opnieuw te implementeren. Voordat u implementeert, plant u uw clustertopologie, het aantal brokers, het geheugenprofiel en de optionele brokerinstellingen die u nodig hebt. In dit artikel vindt u een overzicht van de beslissingen die u moet nemen.

Inzicht in de architectuur

Azure IoT-bewerkingen is een set modulaire, systeemeigen Kubernetes-services die zijn geïmplementeerd op een cluster met Azure Arc ingeschakeld. Belangrijke onderdelen zijn:

Component Purpose
MQTT-broker Hoogwaardige MQTT 3.1.1- en 5-broker voor edge-berichtenverkeer
Connector voor OPC UA Verzamelt gegevens van OPC UA-servers en publiceert naar MQTT
Gegevensstromen Gegevens routeren, transformeren en pushen naar cloudeindpunten
apparaatregister Azure Cloudregister voor apparaten, assets en schema's
Akri-services Apparaatherkenning en protocoladapters
Statusarchief Persistentielaag voor sleutelwaarde in de MQTT-broker

In de documentatie worden twee termen gebruikt:

  • Implementatie : het exemplaar, Arc-extensies, aangepaste locaties en alle configureerbare resources (assets, apparaten, gegevensstromen).
  • Instantie — De bovenliggende bron die de diensten bundelt.

Uw clustertopologie kiezen

Voordat u implementeert, moet u beslissen of u een cluster met één knooppunt of meerdere knooppunten nodig hebt. Deze beslissing bepaalt de hardwarevereisten en de instellingen voor de brokerkardinaliteit.

Topologie Gebruiksituatie Minimale hardware
Eén knooppunt Kleinere implementaties waarbij hoge beschikbaarheid niet is vereist 4 vCPU's, 16 GB RAM,30 GB opslagruimte
Meerdere knooppunten (3-5 knooppunten) Hoge beschikbaarheid en hogere doorvoervereisten 8 vCPU's, 32 GB RAM per knooppunt

Belangrijk

Kardinaliteit wordt alleen ingesteld tijdens de implementatie. Er is een nieuwe implementatie vereist als de kardinaliteitsinstellingen moeten worden gewijzigd.

Begrijp de kardinaliteit van brokers

Kardinaliteit is het aantal frontend-replica's, frontend-workers, backend-partities en backend-workers in de brokerimplementatie. Kardinaliteit bepaalt hoe de broker horizontaal wordt geschaald en hoe tolerant deze is voor pod- of knooppuntfouten.

De MQTT-broker heeft een architectuur met twee lagen: front-endpods verwerken clientverbindingen en protocolverwerking, terwijl back-endpods berichtenopslag en -bezorging verwerken. Begrijpen hoe elke laag wordt geschaald, is belangrijk voor capaciteitsplanning.

Front-end

Front-endpods accepteren MQTT-clientverbindingen en sturen berichten door naar de back-end. Frontend-pods slaan zelf geen berichten op. Er zijn twee hoofdinstellingen voor de front-endlaag:

  • Replica’s: het aantal frontend-pods dat moet worden uitgerold. Het toevoegen van meer frontendreplica’s verhoogt het aantal gelijktijdige clientverbindingen dat de broker kan verwerken en biedt een hoge beschikbaarheid als een van de frontendpods uitvalt.
  • Werknemers: het aantal logische werkrollen per front-endpod. Door meer werkrollen toe te voegen, kan de front-endpod meer CPU-kernen gebruiken. Elke worker kan maximaal één CPU-kern gebruiken.

Back-end keten

Backendpods zorgen voor de opslag en aflevering van berichten. Er zijn drie hoofdinstellingen voor de back-endlaag:

  • Partities: het aantal partities dat moet worden geïmplementeerd. Partities zijn de eenheid van horizontaal schalen voor berichtdoorvoer. Via een proces met de naam sharding verwerkt elke partitie een deel van de berichten, geshard op onderwerp en sessie. De frontendpods verdelen het berichtverkeer over de partities. Door meer partities toe te voegen, neemt de totale berichtdoorvoer toe die de broker kan verwerken.
  • Redundantiefactor: Het aantal backend-pods dat per partitie moet worden uitgerold. Het verhogen van de redundantiefactor verhoogt het aantal gegevenskopieën om tolerantie te bieden tegen knooppuntfouten in het cluster.
  • Workers: het aantal workers per backend-pod. Workers vormen de eenheid van verticale schaalvergroting binnen een partitie — door meer workers toe te voegen, kan de backend-pod meer CPU-kernen op hetzelfde knooppunt gebruiken. Elke werkrol kan maximaal twee CPU-kernen verbruiken, dus wees voorzichtig wanneer u het aantal werkrollen per replica verhoogt om het aantal CPU-kernen in het cluster niet te overschrijden.

Note

De effectiviteit van het schalen van partities is afhankelijk van hoe gelijkmatig de onderwerpruimte over partities wordt verdeeld. Een zeer scheef verdeelde distributie kan hotspots op één partitie maken.

Belangrijk

De back-endredundantiefactor moet 2 of hoger zijn. De broker vereist ten minste twee backendreplica's per partitie voor hoge beschikbaarheid en ondersteuning van rolling updates.

Schatting van doorvoer

De prestaties van een afzonderlijke partitie zijn sterk afhankelijk van de CPU-kenmerken van het knooppunt waarop deze wordt uitgevoerd. Als vuistregel verwacht u ongeveer 5.000 tot 6.000 QoS 1-berichten per seconde per partitie met nettoladingen van 8 kB op een CPU van 2 GHz (~4-GHz turbo). Prestaties in de praktijk zijn afhankelijk van veel factoren, dus gebruik dit nummer alleen als uitgangspunt voor capaciteitsplanning.

Zie MQTT Broker-prestatiebenchmarking voor gedetailleerde benchmarkgegevens.

Aanbevelingen voor één knooppunt

  • Frontend-replica's: Zijn ingesteld op 1.
  • Front-endwerkers: stel in op de helft van het aantal CPU-kernen per knooppunt.
  • Backendreplica's (redundantiefactor): Stel in op ten minste 2, zodat de broker gefaseerde updates kan uitvoeren.

Voorbeeld: één knooppunt, 4 CPU-kernen

Frontend-instelling Waarde Backend-instelling Waarde
Replica's 1 Redundantiefactor 2
Medewerkers 2 Medewerkers 1
Partitions 1

Aanbevelingen voor meerdere knooppunten

De volgende waarden worden aanbevolen voor optimale prestaties. Voor grote clusters met weinig verkeer kunnen deze waarden lager worden ingesteld dan de aanbevelingen zonder problemen te veroorzaken. In de volgende secties worden meer overwegingen besproken, zoals geheugen (RAM) en prestatiekenmerken. Test uw configuratie altijd met de verwachte workload om de prestaties te bevestigen.

  • Frontendreplica’s: Stel dit gelijk aan het aantal knooppunten in het cluster.
  • Front-endwerkers: stel in op de helft van het aantal CPU-kernen per knooppunt.
  • Backendreplica's (redundantiefactor): ingesteld op 2 voor redundantie en ondersteuning van rolling updates.
  • Backendpartities: Stel deze in op het aantal knooppunten in het cluster.
  • Back-endmedewerkers: ingesteld op de helft van het aantal CPU-kernen per knooppunt.

Voorbeeld: cluster met 3 knooppunten, 8 CPU-kernen per knooppunt

Frontend-instelling Waarde Backend-instelling Waarde
Replica's 3 Redundantiefactor 2
Medewerkers 4 Medewerkers 4
Partitions 3

Voorbeeld: cluster met 5 knooppunten, 16 CPU-kernen per knooppunt

Frontend-instelling Waarde Backend-instelling Waarde
Replica's 5 Redundantiefactor 2
Medewerkers 8 Medewerkers 8
Partitions 5

Belangrijk

Het totale aantal front-end- en back-endmedewerkers per knooppunt mag niet groter zijn dan het aantal CPU-kernen dat beschikbaar is op dat knooppunt. Het toewijzen van meer workers dan er processorkernen beschikbaar zijn, kan leiden tot CPU-contentie en prestatieverlies.

Limieten voor CPU-resources

Om resource-uitputting in het cluster te voorkomen, kan de broker zodanig worden geconfigureerd dat het Kubernetes CPU-resourcelimieten aanvraagt op basis van de kardinaliteitsinstellingen. Wanneer deze functie is ingeschakeld, verhoogt het schalen van het aantal replica's of werkrollen proportioneel de vereiste CPU-resources.

Belangrijk

De standaardwaarde voor generateResourceLimits.cpu hangt af van de implementatiemethode.

  • Azure CLI (az iot ops create): Disabled standaard om mislukte implementaties te voorkomen op clusters met beperkte resources, zoals clusters met één knooppunt, waar de CPU-aanvragen hoger kunnen zijn dan de beschikbare resources.
  • REST API-, Bicep- en ARM-sjablonen: Enabled standaard. Als u met deze methoden implementeert zonder expliciet in te stellen generateResourceLimits.cpu, worden cpu-resourcelimieten automatisch toegepast.

Als u CPU-resourcelimieten inschakelt, moet u ervoor zorgen dat uw cluster voldoende CPU-resources heeft om te voldoen aan de aanvragen van de broker op basis van uw kardinaliteitsconfiguratie.

De standaardwaarde voor REST API-, Bicep- en ARM-sjablonen wordt gedefinieerd in de broker-API-specificatie.

De MQTT-broker vraagt CPU-resources per pod aan op basis van het aantal geconfigureerde werkrollen:

  • Front-endpods: 1,0 CPU per werkrol
  • Back-endpods: 2.0 CPU per werknemer

Gebruik de volgende formules om de totale CPU-vereisten te berekenen:

Component Formula
Frontend-CPU replicas frontend.workers × 1,0 CPU
Backend-CPU partitions redundancyFactor × × backend.workers × 2,0 CPU
Totale broker-CPU Front-end-CPU + back-end-CPU

Waarschuwing

De broker is niet het enige onderdeel dat CPU op het cluster verbruikt. Andere Azure IoT-bewerkingen-onderdelen (zoals de dataflow-engine, OPC UA-connector en systeempods) reserveren ook CPU-bronnen, doorgaans in totaal 200-300m. Wanneer u clustercapaciteit plant, moet u rekening houden met deze overhead boven op de CPU-vereisten van de broker. Als het totale CPU-verbruik dat door alle pods wordt aangevraagd, groter is dan de beschikbare CPU op uw cluster, blijven brokerpods in een Pending status hangen.

Voorbeeld: klein cluster

Overweeg een cluster met 2 knooppunten met 4 CPU-kernen per knooppunt (totaal 8 kernen) met de volgende kardinaliteit:

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

De makelaar vraagt:

  • Front-end CPU: 2 replica's × 2 werkers × 1,0 = 4,0 CPU
  • Back-end CPU: 1 partitie × 2 RF × 1 werkrol × 2,0 = 4,0 CPU
  • Totale broker-CPU: 8.0 CPU

Deze configuratie vraagt 8.0 CPU op een cluster aan met slechts 8 kernen, waardoor er niets voor andere Azure IoT-bewerkingen onderdelen (200-300m) of voor Kubernetes-systeempods blijft. De broker-pods blijven in de status Pending met Insufficient cpu fouten.

U kunt dit oplossen door meer knooppunten toe te voegen, kernen per knooppunt te verhogen of de kardinaliteit van de broker te verminderen.

Voorbeeld: grotere implementatie

De volgende kardinaliteit vraagt aanzienlijk meer CPU-resources aan:

{
  "cardinality": {
    "frontend": {
      "replicas": 3,
      "workers": 2
    },
    "backendChain": {
      "partitions": 3,
      "redundancyFactor": 2,
      "workers": 2
    }
  }
}
  • Front-end CPU: 3 replica's × 2 werkrollen × 1,0 = 6,0 CPU
  • Back-end CPU: 3 partities × 2 RF × 2 werkers × 2,0 = 24,0 CPU
  • Totale CPU van broker: 30,0 CPU

Een cluster heeft minimaal 30 CPU-kernen nodig die alleen beschikbaar zijn voor brokerpods, plus ruimte voor andere Azure IoT-bewerkingen onderdelen en Kubernetes-systeempods.

Configuratie van CPU-resourcelimiet

CPU-resourcelimieten worden bepaald door het generateResourceLimits.cpu veld in de Broker-resource. Deze configuratie wordt alleen ondersteund door de --broker-config-file vlag te gebruiken wanneer u Azure IoT-bewerkingen implementeert met behulp van de az iot ops create opdracht. Zie Azure CLI ondersteuning voor geavanceerde MQTT-brokerconfiguratie voor meer informatie.

Bereid een Broker-configuratiebestand voor door de Api-verwijzing GenerateResourceLimits te volgen. In de volgende voorbeelden ziet u de twee mogelijke waarden:

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

Of

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

Uw geheugenprofiel kiezen

Het geheugenprofiel bepaalt de maximale MQTT-berichtgrootte die de broker accepteert, niet-actief geheugengebruik en het maximale geheugengebruik van elke pod. Bepaal het juiste geheugenprofiel voordat u implementeert op basis van de verwachte berichtgrootten en doorvoer.

Geheugenprofiel Maximale berichtgrootte Inactief frontendgeheugen (per pod) Maximaal front-endgeheugen (per pod) Inactief backendgeheugen (per pod) Maximaal back-endgeheugen (per pod) Gebruiksituatie
Tiny 4 MB ~29 MiB ~99 MiB ~41 MiB ~102 MiB Weinig verkeer, alleen kleine pakketten
Low 16 MB ~33 MiB ~387 MiB ~66 MiB ~390 MiB Beperkt geheugen, kleine pakketten
Gemiddeld (standaard) 64 MB ~169 MiB ~1,9 GiB ~211 MiB ~1,5 GiB Gemiddelde verkeers- en berichtgrootten
Hoog 256 MB ~4,9 GiB ~4,9 GiB ~5,8 GiB ~5,8 GiB Hoge doorvoer, grote berichten

Note

De geheugenwaarden in de tabel zijn per pod. Alle werknemers binnen een pod delen dezelfde geheugentoewijzing. Als u meer werkrollen toevoegt, wordt de geheugenlimiet van de pod niet verhoogd.

Warning

De broker weigert berichten wanneer het geheugengebruik 75% capaciteit bereikt. Kies een profiel met voldoende hoofdruimte voor de verwachte berichtgrootten en doorvoer.

Binnenkomende buffer en tegendruk

Elk geheugenprofiel definieert een maximale binnenkomende buffergrootte voor PUBLISH-gegevens per back-endwerkrol. Wanneer de buffer 75% capaciteit bereikt, activeert de broker backpressuremechanismen en begint de binnenkomende berichten te weigeren. Geweigerde pakketten ontvangen een PUBACK-antwoord met een quotum overschreden foutcode.

De volgende tabel toont de grootten van de binnenkomende buffers per worker voor elk profiel:

Geheugenprofiel Maximale invoerbuffer (per worker) Effectieve buffer (bij 75% backpressuur)
Tiny ~16 MiB ~12 MiB
Low ~64 MiB ~48 MiB
Gemiddeld ~576 MiB ~432 MiB
Hoog ~2 GiB ~1,5 GiB

Wanneer u een geheugenprofiel kiest, kunt u het volgende overwegen:

  • Klein: Er moet slechts één front-end worden gebruikt. Alleen pakketten verzenden die kleiner zijn dan 4 MiB.
  • Laag: Er moeten slechts één of twee front-ends worden gebruikt. Alleen pakketten verzenden die kleiner zijn dan 16 MiB.
  • Gemiddeld: geschikt voor de meeste productieworkloads met gemiddelde berichtgrootten.
  • Hoog: Gebruik deze optie wanneer u grote berichten of hoge doorvoer met grote buffers moet verwerken.

Het totale brokergeheugen is afhankelijk van zowel het geheugenprofiel als de kardinaliteit (aantal front-endreplica's, back-endpartities en redundantiefactor). Meer pods betekenen in totaal meer geheugen. Zie Basislijnresourceprofielen voor gemeten verbruik van basislijnresources in verschillende configuraties.

Het totale geheugengebruik berekenen

U kunt het totale geheugengebruik berekenen met deze formule:

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

Where:

Variable Description
M_total Totaal geheugengebruik
R_fe Het aantal frontendreplica's
M_fe Het geheugengebruik van elke frontend-replica
P_be Het aantal backend-partities
RF_be Factor voor backend-redundantie
M_be Het geheugengebruik van elke backend-replica
W_be Het aantal werknemers per back-endreplica

Als u bijvoorbeeld het profiel Gemiddeld geheugen kiest, heeft het profiel een front-endgeheugengebruik van 1.9 GiB en een back-endgeheugengebruik van 1,5 GiB. Stel dat de brokerconfiguratie bestaat uit 2 frontend-replica's, 2 backend-partities en een backend-redundantiefactor van 2. Het totale geheugengebruik is:

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

Ter vergelijking: het tiny geheugenprofiel heeft een front-endgeheugengebruik van 99 MiB en een back-endgeheugengebruik van 102 MiB. Met dezelfde brokerconfiguratie is het totale geheugengebruik:

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

Configuratie van geheugenprofiel

Wanneer u IoT-bewerkingen implementeert met behulp van de az iot ops create opdracht, geeft de --broker-mem-profile parameter de instellingen voor het geheugenprofiel op.

Met de volgende opdracht wordt bijvoorbeeld het geheugenprofiel Tiny ingesteld op (andere parameters worden weggelaten om kortheid te bepalen):

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

Zie az iot ops create optionele parameters voor meer informatie.

Optionele brokerinstellingen

De volgende brokerinstellingen worden ook geconfigureerd tijdens de implementatie en kunnen daarna niet meer worden gewijzigd. Controleer deze als ze van toepassing zijn op uw scenario:

  • Schijfgebaseerde berichtbuffer — Buffer berichten op schijf wanneer abonneewachtrijen groter worden dan het beschikbare geheugen. Handig voor permanente sessies en connectiviteitsproblemen.
  • Persistentie : schrijf kritieke brokergegevens naar de schijf om deze tijdens het opnieuw opstarten te behouden.
  • Diagnostische gegevens: configureer metrische gegevens, logboeken en zelfcontroletests voor de MQTT-broker.
  • Geavanceerde MQTT-opties : het verlopen van sessies, het verlopen van berichten, de limieten voor de abonneewachtrij en de instellingen voor keep alive aanpassen.
  • Interne verkeersversleuteling: configureer versleuteling van intern verkeer tussen broker-front-end- en back-endpods (standaard ingeschakeld).

Volgende stappen