Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Muitas configurações de Operações do Azure IoT são corrigidas no momento da implantação e só podem ser alteradas reimplantando. Antes de implantar, planeje a topologia do cluster, a cardinalidade do agente, o perfil de memória e as configurações opcionais do agente de que você precisa. Este artigo resume as decisões que você deve tomar.
Entender a arquitetura
Operações do Azure IoT é um conjunto de serviços modulares e nativos do Kubernetes implantados em um cluster habilitado para Azure Arc. Os componentes principais incluem:
| Componente | Purpose |
|---|---|
| Agente MQTT | Agente MQTT 3.1.1 e MQTT 5 de alto desempenho para mensagens de borda |
| Conector para OPC UA | Coleta dados de servidores OPC UA e publica no MQTT |
| Fluxos de dados | Roteia, transforma e envia dados para endpoints na nuvem |
| Registro de dispositivo Azure | Registro baseado em nuvem para dispositivos, ativos e esquemas |
| Serviços Akri | Descoberta de dispositivos e adaptadores de protocolo |
| Repositório de estado | Camada de persistência de chave-valor do Agente MQTT |
Dois termos são usados em toda a documentação:
- Implantação – a instância, as extensões do Arc, os locais personalizados e todos os recursos configuráveis (ativos, dispositivos, fluxos de dados).
- Instância — o recurso pai que agrupa os serviços.
Escolha sua topologia de cluster
Antes de implantar, decida se você precisa de um cluster de nó único ou de vários nós. Essa decisão determina os requisitos de hardware e as configurações de cardinalidade do agente.
| Topology | Caso de uso | Hardware mínimo |
|---|---|---|
| Nó único | Implantações menores em que a alta disponibilidade não é necessária | 4 vCPUs, 16 GB de RAM, 30 GB de armazenamento |
| Vários nós (3 a 5 nós) | Alta disponibilidade e requisitos de taxa de transferência mais alta | 8 vCPUs, 32 GB de RAM por nó |
Importante
A cardinalidade é definida somente no momento da implantação. Uma nova implantação será necessária se as configurações de cardinalidade precisarem ser alteradas.
Entenda a cardinalidade do broker
Cardinalidade é o número de réplicas de front-end, trabalhos de front-end, partições de back-end e trabalhos de back-end na implantação do agente. A cardinalidade controla como o agente é escalado horizontalmente e quão resiliente ele é a falhas de pod ou nó.
O agente MQTT tem uma arquitetura de duas camadas: os pods de front-end lidam com conexões de cliente e processamento de protocolo, enquanto os pods de back-end lidam com o armazenamento e a entrega de mensagens. Entender como cada camada é dimensionada é importante para o planejamento de capacidade.
Frontend
Os pods de front-end aceitam conexões de cliente MQTT e encaminham mensagens para o back-end. Os pods de front-end não armazenam mensagens por conta própria. Há duas configurações principais para a camada de front-end:
- Réplicas: o número de pods de front-end a serem implantados. Adicionar mais réplicas de front-end aumenta o número de conexões simultâneas de clientes que o agente pode suportar e fornece alta disponibilidade caso um dos pods de front-end falhe.
- Trabalhadores: o número de trabalhadores lógicos por pod de front-end. Adicionar mais trabalhadores permite que o pod de front-end use mais núcleos de CPU. Cada worker pode consumir até um núcleo de CPU.
Cadeia de back-end
Os pods de back-end fazem o armazenamento e a entrega de mensagens. Há três configurações principais para a camada de back-end:
- Partições: o número de partições a serem implantadas. Partições são a unidade de dimensionamento horizontal para taxa de transferência de mensagem. Por meio de um processo chamado fragmentação, cada partição manipula uma parte das mensagens, fragmentada por tópico e sessão. Os pods de front-end distribuem o tráfego de mensagens entre as partições. Adicionar mais partições aumenta a taxa de transferência total de mensagens que o agente pode manipular.
- Fator de redundância: o número de pods de back-end a serem implantados por partição. Aumentar o fator de redundância aumenta o número de cópias de dados para fornecer resiliência contra falhas de nó no cluster.
- Trabalhadores: o número de trabalhadores por pod de backend. Trabalhadores são a unidade de dimensionamento vertical em uma partição — adicionar mais trabalhadores permite que o pod de back-end use mais núcleos de CPU no mesmo nó. Cada trabalho pode consumir até dois núcleos de CPU, portanto, tenha cuidado ao aumentar o número de trabalhadores por réplica para não exceder o número de núcleos de CPU no cluster.
Note
A eficácia do escalonamento de partições depende de quão uniformemente o espaço de tópicos está distribuído entre as partições. Uma distribuição altamente distorcida pode criar hotspots em uma única partição.
Importante
O fator de redundância de back-end deve ser 2 ou maior. O broker requer pelo menos duas réplicas de backend por partição para garantir alta disponibilidade e suporte a atualizações contínuas.
Estimativa de taxa de transferência
O desempenho de uma partição específica depende fortemente das características da CPU do nó em que está em execução. Como regra geral, espere cerca de 5.000 a 6.000 mensagens QoS 1 por segundo por partição com cargas de 8 KB em uma CPU de 2 GHz (~4 GHz turbo). O desempenho do mundo real depende de muitos fatores, portanto, use esse número apenas como ponto de partida para o planejamento da capacidade.
Para obter dados de parâmetro de comparação detalhados, consulte o benchmarking de desempenho do MQTT Broker.
Recomendações de nó único
- Réplicas de front-end: definidas como 1.
- Trabalhos de front-end: defina como metade do número de núcleos de CPU por nó.
- Réplicas de back-end (fator de redundância): defina pelo menos 2 para que o agente possa executar atualizações contínuas.
Exemplo: nó único, 4 núcleos de CPU
| Configuração de front-end | Value | Configuração do back-end | Value |
|---|---|---|---|
| Replicas | 1 | Fator de redundância | 2 |
| Trabalhadores | 2 | Trabalhadores | 1 |
| Partitions | 1 |
Recomendações de vários nós
Os valores a seguir são recomendados para um desempenho ideal. Para clusters grandes com tráfego baixo, esses valores podem ser definidos abaixo das recomendações sem causar problemas. Mais considerações, como memória (RAM) e características de desempenho, são discutidas nas seções a seguir. Sempre teste sua configuração com a carga de trabalho esperada para confirmar o desempenho.
- Réplicas de front-end: defina igual ao número de nós no cluster.
- Trabalhos de front-end: defina como metade do número de núcleos de CPU por nó.
- Réplicas de backend (fator de redundância): Defina como 2 para redundância e suporte a atualizações contínuas.
- Partições de backend: Defina como igual ao número de nós do cluster.
- Trabalhadores de back-end: defina como metade do número de núcleos de CPU por nó.
Exemplo: cluster de 3 nós, 8 núcleos de CPU por nó
| Configuração de front-end | Value | Configuração do back-end | Value |
|---|---|---|---|
| Replicas | 3 | Fator de redundância | 2 |
| Trabalhadores | 4 | Trabalhadores | 4 |
| Partitions | 3 |
Exemplo: cluster de 5 nós, 16 núcleos de CPU por nó
| Configuração de front-end | Value | Configuração do back-end | Value |
|---|---|---|---|
| Replicas | 5 | Fator de redundância | 2 |
| Trabalhadores | 8 | Trabalhadores | 8 |
| Partitions | 5 |
Importante
O número total de trabalhos de front-end e back-end por nó não deve exceder o número de núcleos de CPU disponíveis nesse nó. Trabalhadores de provisionamento excessivo além dos núcleos disponíveis podem causar contenção de CPU e degradar o desempenho.
Limites de recursos da CPU
Para evitar a falta de recursos no cluster, o broker pode ser configurado para solicitar limites de recursos de CPU do Kubernetes baseando-se nas configurações de cardinalidade. Quando habilitado, o dimensionamento do número de réplicas ou trabalhadores aumenta proporcionalmente os recursos de CPU necessários.
Importante
O valor padrão para generateResourceLimits.cpu depende do método de implantação:
-
CLI do Azure (
az iot ops create):Disabledpor padrão, para evitar falhas de implantação em clusters restritos a recursos, como clusters de nó único em que as solicitações de CPU podem exceder os recursos disponíveis. -
Modelos da API REST, Bicep e ARM:
Enabledpor padrão. Se você implantar com esses métodos sem definirgenerateResourceLimits.cpuexplicitamente, os limites de recursos da CPU serão aplicados automaticamente.
Se você ativar os limites de recursos da CPU, certifique-se de que seu cluster tenha recursos de CPU suficientes para atender às solicitações do broker com base na sua configuração de cardinalidade.
O padrão para a API REST, o Bicep e os modelos do ARM é definido na especificação da API do Broker.
O Agente MQTT solicita recursos de CPU por pod com base no número de trabalhadores configurados:
- Pods de front-end: 1,0 CPU por trabalhador
- Pods de back-end: 2,0 CPU por trabalhador
Use as seguintes fórmulas para calcular os requisitos totais de CPU:
| Componente | Formula |
|---|---|
| CPU de front-end |
replicas × frontend.workers × 1,0 CPU |
| CPU de back-end |
partitions × redundancyFactor × backend.workers × 2,0 CPU |
| CPU total do agente | CPU de front-end + CPU de back-end |
Caution
O broker não é o único componente que consome CPU no cluster. Outros componentes de Operações do Azure IoT (como o mecanismo de fluxo de dados, o conector OPC UA e os pods do sistema) também reservam recursos da CPU, normalmente de 200 a 300 m no total. Ao planejar a capacidade do cluster, certifique-se de considerar essa sobrecarga sobre os requisitos de CPU do broker. Se o total de CPU solicitado por todos os pods exceder a CPU disponível no seu cluster, os pods do broker ficam presos em um estado Pending.
Exemplo: cluster pequeno
Considere um cluster de 2 nós com 4 núcleos de CPU por nó (total de 8 núcleos) com a seguinte cardinalidade:
{
"cardinality": {
"frontend": {
"replicas": 2,
"workers": 2
},
"backendChain": {
"partitions": 1,
"redundancyFactor": 2,
"workers": 1
}
}
}
As solicitações do agente:
- CPU de front-end: 2 réplicas × 2 trabalhadores × 1,0 = 4,0 CPU
- CPU de back-end: 1 partição × 2 RF × 1 trabalhador × 2,0 = 4,0 CPU
- CPU total do agente: 8,0 CPU
Essa configuração solicita 8,0 CPUs em um cluster com apenas 8 núcleos, o que não deixa nada para outros componentes do Operações do Azure IoT (200-300m) nem para pods do sistema do Kubernetes. Os pods do agente permanecem em estado Pending com erros Insufficient cpu.
Para resolver isso, adicione mais nós, aumente os núcleos por nó ou reduza a cardinalidade do agente.
Exemplo: implantação maior
A cardinalidade a seguir solicita significativamente mais recursos de CPU:
{
"cardinality": {
"frontend": {
"replicas": 3,
"workers": 2
},
"backendChain": {
"partitions": 3,
"redundancyFactor": 2,
"workers": 2
}
}
}
- CPU de front-end: 3 réplicas × 2 trabalhadores × 1,0 = 6,0 CPU
- CPU de back-end: 3 partições × 2 RF × 2 trabalhadores × 2,0 = 24,0 CPU
- CPU total do agente: 30,0 CPU
Um cluster precisa de pelo menos 30 núcleos de CPU disponíveis somente para os pods de agente, além de capacidade adicional para outros componentes do Operações do Azure IoT e pods do sistema do Kubernetes.
Configuração de limite de recursos da CPU
Os limites de recursos da CPU são controlados pelo generateResourceLimits.cpu campo no recurso Broker. Essa configuração só tem suporte usando o --broker-config-file sinalizador quando você implanta Operações do Azure IoT usando o az iot ops create comando. Para obter mais informações, consulte o suporte da CLI do Azure para a configuração avançada do agente MQTT.
Prepare um arquivo de configuração do Broker seguindo a referência da API GenerateResourceLimits . Os exemplos a seguir mostram os dois valores possíveis:
{
"generateResourceLimits": {
"cpu": "Enabled"
}
}
Ou
{
"generateResourceLimits": {
"cpu": "Disabled"
}
}
Escolha seu perfil de memória
O perfil de memória controla o tamanho máximo das mensagens MQTT que o broker aceita, o uso de memória ociosa e o uso máximo de memória de cada pod. Decida sobre o perfil de memória correto antes da implantação com base nos tamanhos e na taxa de transferência esperados da mensagem.
| Perfil de memória | Tamanho máximo da mensagem | Memória de frontend ociosa (por pod) | Memória de front-end máxima (por pod) | Memória ociosa do backend (por pod) | Memória máxima do backend (por pod) | Caso de uso |
|---|---|---|---|---|---|---|
| Pequena | 4 MB | ~29 MiB | ~99 MiB | ~41 MiB | ~102 MiB | Tráfego baixo, apenas pacotes pequenos |
| Baixo | 16 MB | ~33 MiB | ~387 MiB | ~66 MiB | ~390 MiB | Memória limitada, pacotes pequenos |
| Médio (padrão) | 64 MB | ~169 MiB | ~1,9 GiB | ~211 MiB | ~1,5 GiB | Tamanhos moderados de tráfego e mensagem |
| High | 256 MB | ~4,9 GiB | ~4,9 GiB | ~5,8 GiB | ~5,8 GiB | Alta taxa de transferência, mensagens grandes |
Note
Os valores de memória na tabela referem-se a cada pod. Todos os trabalhadores em um pod compartilham a mesma alocação de memória — adicionar mais trabalhadores não aumenta o limite de memória do pod.
Warning
O broker rejeita mensagens quando o uso de memória atinge 75% da capacidade. Escolha um perfil com margem suficiente para os tamanhos de mensagem e a taxa de transferência esperados.
Buffer de entrada e retropresão
Cada perfil de memória define um tamanho máximo de buffer de entrada para dados PUBLISH por trabalho de back-end. Quando o buffer atinge 75% da capacidade, o broker ativa mecanismos de backpressure e começa a rejeitar mensagens recebidas. Os pacotes rejeitados recebem uma resposta PUBACK com o código de erro Cota excedida.
A tabela a seguir mostra os tamanhos de buffer de entrada por trabalhador para cada perfil:
| Perfil de memória | Buffer de entrada máximo (por trabalhador) | Buffer efetivo (a 75% de contrapressão) |
|---|---|---|
| Pequena | ~16 MiB | ~12 MiB |
| Baixo | ~64 MiB | ~48 MiB |
| Medium | ~576 MiB | ~432 MiB |
| High | ~2 GiB | ~1,5 GiB |
Ao escolher um perfil de memória, considere:
- Minúsculo: apenas um front-end deve ser usado. Enviar apenas pacotes menores que 4 MiB.
- Baixo: apenas um ou dois front-ends devem ser usados. Envie apenas pacotes menores que 16 MiB.
- Médio: adequado para a maioria das cargas de trabalho de produção com mensagens de tamanho moderado.
- Alta: use quando precisar lidar com mensagens grandes ou alta taxa de transferência com buffers grandes.
A memória total do agente depende tanto do perfil de memória quanto da cardinalidade (número de réplicas de front-end, partições de back-end e fator de redundância). Mais pods significam mais memória total. Para obter o consumo de recursos de linha de base medido em diferentes configurações, consulte perfis de recurso de linha de base.
Calcular o uso total de memória
Você pode calcular o uso total de memória com esta fórmula:
M_total = (R_fe × M_fe) + (P_be × RF_be × M_be × W_be)
Em que:
| Variable | Description |
|---|---|
| M_total | Uso total de memória |
| R_fe | O número de réplicas de front-end |
| M_fe | O uso de memória de cada réplica de front-end |
| P_be | O número de partições de back-end |
| RF_be | Fator de redundância do backend |
| M_be | O uso de memória de cada réplica de back-end |
| W_be | O número de trabalhos por réplica de back-end |
Por exemplo, se você escolher o perfil de memória média , o perfil terá um uso de memória de front-end de 1,9 GiB e um uso de memória de back-end de 1,5 GiB. Suponha que a configuração do corretor seja de 2 réplicas front-end, 2 partições back-end e um fator de redundância back-end de 2. O uso total de memória é:
M_total = (2 × 1.9 GiB) + (2 × 2 × 1.5 GiB × 2)
= 15.8 GiB
Em comparação, o perfil de memória Tiny tem uso de memória no frontend de 99 MiB e no backend de 102 MiB. Com a mesma configuração do broker, o uso total de memória é:
M_total = (2 × 99 MiB) + (2 × 2 × 102 MiB × 2)
= 198 MiB + 816 MiB
= 1014 MiB (≈ 1.0 GiB)
Configuração do perfil de memória
Quando você implanta operações de IoT usando o az iot ops create comando, o --broker-mem-profile parâmetro especifica as configurações de perfil de memória.
Por exemplo, o comando a seguir define o perfil de memória como Tiny (outros parâmetros são omitidos para brevidade):
az iot ops create ... --broker-mem-profile Tiny
Para saber mais, consulte az iot ops create parâmetros opcionais.
Configurações opcionais do agente
As configurações do broker a seguir também são definidas durante a implantação e não podem ser alteradas posteriormente. Examine-os se eles se aplicam ao seu cenário:
- Buffer de mensagens armazenado em disco — Armazena mensagens em disco quando as filas dos assinantes excedem a memória disponível. Útil para sessões persistentes e desafios de conectividade.
- Persistência — Escreva dados críticos do broker em disco para preservá-los após reinicializações.
- Diagnósticos — Configure métricas, logs e sondas de autoverificação para o broker MQTT.
- Opções avançadas do MQTT — personalize a expiração da sessão, a expiração da mensagem, os limites de fila do assinante e as configurações de manutenção.
- Criptografia do tráfego interno — Configure a criptografia do tráfego interno entre os pods de frontend e backend do broker (ativada por padrão).