Share via


Confiabilidade nas Máquinas Virtuais

Este artigo contém recomendações de confiabilidade específicas para Máquinas Virtuais, bem como informações detalhadas sobre a resiliência regional de VM com zonas de disponibilidade e recuperação de desastre entre regiões e continuidade do negócio.

Para ter uma visão geral arquitetônica da confiabilidade no Azure, confira Confiabilidade do Azure.

Recomendações de confiabilidade

Essa seção contém recomendações para obter resiliência e disponibilidade. Cada recomendação se enquadra em uma das duas categorias:

  • Os itens de integridade abrangem áreas como itens de configuração e a função adequada dos principais componentes que compõem a carga de trabalho do Azure, como configurações de recursos do Azure, dependências de outros serviços e assim por diante.

  • Os itens de risco abrangem áreas como requisitos de disponibilidade e recuperação, teste, monitoramento, implantação e outros itens que, se deixados não resolvidos, aumentam as chances de problemas no ambiente.

Matriz de prioridade de recomendações de confiabilidade

Cada recomendação é marcada de acordo com a seguinte matriz de prioridade:

Imagem Prioridade Descrição
Alto Correção imediata necessária.
Médio Correção dentro de 3 a 6 meses.
Baixo Precisa de revisão.

Resumo das recomendações de confiabilidade

Categoria Prioridade Recomendação
Alta disponibilidade Executar cargas de trabalho de produção em duas ou mais VMs usando os Conjuntos de Dimensionamento de Máquinas Virtuais do Microsoft Azure Flex
Implantar VMs entre zonas de disponibilidade ou usar os Conjuntos de Dimensionamento de Máquinas Virtuais
Migrar VMs usando conjuntos de disponibilidade para Conjuntos de Dimensionamento de Máquinas Virtuais Flex
Usar discos gerenciados para discos de VM
Recuperação de Desastre Replique VMs usando o Azure Site Recovery
Fazer backup de dados em suas VMs com o serviço de Backup do Azure
Desempenho Hospedar dados de aplicativo e de banco de dados em um disco de dados
As VMs de produção devem usar discos SSD
Habilitar a rede acelerada (AccelNet)
Quando a AccelNet está habilitada, você deve atualizar manualmente o driver NIC GuestOS
Gerenciamento VM-9: atentar-se a VMs no estado Parado
Usar configurações de manutenção para a VM
Segurança As VMs não devem ter um IP público associado diretamente
Adaptadores de Rede Virtual têm um NSG associado
O encaminhamento de IP só deve ser habilitado para soluções de virtualização de rede
O acesso à rede para o disco da VM deve ser definido como “Desabilitar o acesso público e habilitar o acesso privado”
Habilitar a criptografia de disco e a criptografia de dados inativos por padrão
Rede Os servidores DNS do cliente devem ser configurados no nível da Rede Virtual
Storage Os discos compartilhados só devem ser habilitados em servidores clusterizados
Conformidade Verifique se suas VMs estão em conformidade com as Políticas do Azure
Monitoring Habilitar insights da VM
Definir configurações de diagnóstico para todos os recursos do Azure

Alta disponibilidade

Executar cargas de trabalho de produção em duas ou mais VMs usando o VMSS (Conjuntos de Dimensionamento de Máquinas Virtuais do Microsoft Azure) Flex

Para proteger as cargas de trabalho do aplicativo contra o tempo de inatividade devido à indisponibilidade temporária de um disco ou VM, recomendamos executar cargas de trabalho de produção em duas ou mais VMs usando o Conjuntos de Dimensionamento de Máquinas Virtuais Flex.

Para executar cargas de trabalho de produção, você pode usar:

// Azure Resource Graph Query
// Find all VMs that are not associated with a VMSS Flex instance
resources
| where type =~ 'Microsoft.Compute/virtualMachines'
| where isnull(properties.virtualMachineScaleSet.id)
| project recommendationId="vm-1", name, id, tags

Implantar VMs entre zonas de disponibilidade ou usar os Conjuntos de Dimensionamento de Máquinas Virtuais*

Ao criar suas VMs, use zonas de disponibilidade para proteger seus aplicativos e dados contra falhas indesejadas de datacenter. Para obter mais informações sobre zonas de disponibilidade para VMs, consulte Suporte à zona de disponibilidade nesse documento.

Para obter informações sobre como habilitar o suporte a zonas de disponibilidade ao criar sua VM, consulte criar suporte à zona de disponibilidade.

Para obter informações sobre como migrar suas VMs existentes para o suporte à zona de disponibilidade, consulte migrar para a zona de disponibilidade.

// Azure Resource Graph Query
// Find all VMs that are not assigned to a Zone
Resources
| where type =~ 'Microsoft.Compute/virtualMachines'
| where isnull(zones)
| project recommendationId="vm-2", name, id, tags, param1="No Zone"

Migrar VMs usando conjuntos de disponibilidade para Conjuntos de Dimensionamento de Máquinas Virtuais Flex

Modernize suas cargas de trabalho migrando-as de VMs para Conjuntos de Dimensionamento de Máquinas Virtuais Flex.

Com o Conjuntos de Dimensionamento de Máquinas Virtuais Flex, você pode implantar suas VMs de uma das duas maneiras:

  • Entre zonas
  • Na mesma zona, mas em FDs (domínios de falha) e domínios de atualização (UD) automaticamente.

Em um aplicativo de N camadas, é recomendável colocar cada camada de aplicativo em seu próprio Conjuntos de Dimensionamento de Máquinas Virtuais Flex.

// Azure Resource Graph Query
// Find all VMs using Availability Sets
resources
| where type =~ 'Microsoft.Compute/virtualMachines'
| where isnotnull(properties.availabilitySet)
| project recommendationId = "vm-3", name, id, tags, param1=strcat("availabilitySet: ",properties.availabilitySet.id)

Usar discos gerenciados para discos de VM*

Para fornecer melhor confiabilidade para VMs em um conjunto de disponibilidade, use discos gerenciados. Os discos gerenciados estão suficientemente isolados uns dos outros para evitar pontos únicos de falha. Além disso, os discos gerenciados não estão sujeitos a limites de IOPS de VHDs criados em uma conta de armazenamento.

// Azure Resource Graph Query
// Find all VMs that are not using Managed Disks
Resources
| where type =~ 'Microsoft.Compute/virtualMachines'
| where isnull(properties.storageProfile.osDisk.managedDisk)
| project recommendationId = "vm-5", name, id, tags

Recuperação de desastre

Replique VMs usando o Azure Site Recovery

Quando você replicar VMs do Azure usando o Azure Site Recovery, todos os discos de VM serão replicados continuamente para a região de destino assincronamente. Os pontos de recuperação são criados a cada poucos minutos, o que fornece um RPO (Objetivo de Ponto de Recuperação) na ordem dos minutos. Você pode realizar simulações de recuperação de desastre quantas vezes quiser sem afetar o aplicativo de produção ou a replicação contínua.

Para saber como executar uma análise de recuperação de desastre, consulte Executar um failover de teste.

// Azure Resource Graph Query
// Find all VMs that do NOT have replication with ASR enabled
// Run query to see results.
resources
| where type =~ 'Microsoft.Compute/virtualMachines'
| project name, id, tags
| join kind=leftouter (
    recoveryservicesresources
    | where type =~ 'Microsoft.RecoveryServices/vaults/replicationFabrics/replicationProtectionContainers/replicationProtectedItems'
    | where properties.providerSpecificDetails.dataSourceInfo.datasourceType =~ 'AzureVm'
    | project id=properties.providerSpecificDetails.dataSourceInfo.resourceId
    | extend name=strcat_array(array_slice(split(id, '/'), 8, -1), '/')
) on name
| where isnull(id1)
| project-away id1
| project-away name1
| project recommendationId = "vm-4", name, id, tags
| order by id asc

Fazer backup de dados em suas VMs com o serviço de Backup do Azure

O serviço de Backup do Azure fornece soluções simples, seguras e econômicas para fazer backup de seus dados e recuperá-los da nuvem do Microsoft Azure. Para obter mais informações, consulte O que é o serviço de Backup do Azure.

// Azure Resource Graph Query
// Find all VMs that do NOT have Backup enabled
// Run query to see results.
resources
| where type =~ 'Microsoft.Compute/virtualMachines'
| project name, id, tags
| join kind=leftouter (
    recoveryservicesresources
    | where type =~ 'Microsoft.RecoveryServices/vaults/backupFabrics/protectionContainers/protectedItems'
    | where properties.dataSourceInfo.datasourceType =~ 'Microsoft.Compute/virtualMachines'
    | project idBackupEnabled=properties.sourceResourceId
    | extend name=strcat_array(array_slice(split(idBackupEnabled, '/'), 8, -1), '/')
) on name
| where isnull(idBackupEnabled)
| project-away idBackupEnabled
| project-away name1
| project recommendationId = "vm-7", name, id, tags
| order by id asc

Desempenho

Hospedar dados de aplicativo e de banco de dados em um disco de dados

Um disco de dados é um disco gerenciado anexado a uma VM. Use o disco de dados para armazenar dados do aplicativo ou outros dados importantes. Discos de dados são registrados como unidades SCSI e rotulados com a letra que você escolher. Hospedar seus dados em um disco de dados facilita o backup ou a restauração deles. Você também pode migrar o disco sem precisar mover toda a VM e o Sistema Operacional. Além disso, você pode selecionar um SKU de disco diferente, com tipo, tamanho e desempenho diferentes que atendam aos seus requisitos. Para obter mais informações sobre discos de dados, consulte Discos de Dados.

// Azure Resource Graph Query
// Find all VMs that only have OS Disk
Resources
| where type =~ 'Microsoft.Compute/virtualMachines'
| where array_length(properties.storageProfile.dataDisks) < 1
| project recommendationId = "vm-6", name, id, tags

As VMs de produção devem usar discos SSD

Os discos SSD Premium dão suporte a discos de alto desempenho e baixa latência para aplicativos com uso intensivo de E/S e cargas de trabalho de produção. Os discos SSD Standard são uma opção econômica de armazenamento otimizado para cargas de trabalho que necessitam de desempenho consistente em níveis de IOPS mais baixos.

É recomendável que você faça o seguinte:

  • Use discos HDD Standard para cenários de Desenvolvimento/Teste e cargas de trabalho menos críticas com o menor custo.
  • Use discos SSD Premium em vez de discos HDD Standard com suas VMs com capacidade premium. Para qualquer VM de Instância Única usando armazenamento premium para todos os discos de dados e de sistema operacional, o Azure garante a Conectividade de Máquina Virtual de pelo menos 99,9%.

Se você quiser atualizar do HDD Standard para discos SSD Premium, considere os seguintes problemas:

  • A atualização requer uma reinicialização da VM e esse processo leva 3 a 5 minutos para ser concluído.
  • Se as VMs na lista forem VMs de produção críticas, avalie os benefícios da disponibilidade aprimorada confrontando-os com o custo de discos Premium.

Para obter mais informações sobre discos gerenciados do Azure e tipos de discos, consulte Tipos de disco gerenciado do Azure.

// Azure Resource Graph Query
// Find all disks with StandardHDD sku attached to VMs
Resources
| where type =~ 'Microsoft.Compute/disks'
| where sku.name == 'Standard_LRS' and sku.tier == 'Standard'
| where managedBy != ""
| project recommendationId = "vm-8", name, id, tags, param1=strcat("managedBy: ", managedBy)

Habilitar a rede acelerada (AccelNet)

A AccelNet permite SR-IOV (virtualização de E/S de raiz única) para uma VM, melhorando muito seu desempenho de rede. Esse caminho de alto desempenho ignora o host do caminho de dados, o que reduz a latência, a tremulação e a utilização da CPU para as cargas de trabalho de rede mais exigentes nos tipos de VM compatíveis.

Para obter mais informações sobre rede acelerada, confira Rede acelerada

// Azure Resource Graph Query
// Find all VM NICs that do not have Accelerated Networking enabled
resources
| where type =~ 'Microsoft.Compute/virtualMachines'
| mv-expand nic = properties.networkProfile.networkInterfaces
| project name, id, tags, lowerCaseNicId = tolower(nic.id), vmSize = tostring(properties.hardwareProfile.vmSize)
| join kind = inner (
    resources
    | where type =~ 'Microsoft.Network/networkInterfaces'
    | where properties.enableAcceleratedNetworking == false
    | project nicName = split(id, "/")[8], lowerCaseNicId = tolower(id)
    )
    on lowerCaseNicId
| summarize nicNames = make_set(nicName) by name, id, tostring(tags), vmSize
| extend param1 = strcat("NicName: ", strcat_array(nicNames, ", ")), param2 = strcat("VMSize: ", vmSize)
| project recommendationId = "vm-10", name, id, tags, param1, param2
| order by id asc

Quando a AccelNet está habilitada, você deve atualizar manualmente o driver NIC GuestOS

Quando a AccelNet está habilitada, a interface de Rede Virtual padrão do Azure no GuestOS é substituída por uma interface Mellanox. Como resultado, o driver NIC GuestOS é fornecido pela Mellanox, fornecedora de terceiros. Embora as imagens do Marketplace mantidas pela Microsoft sejam oferecidas com a versão mais recente dos drivers Mellanox, depois que a VM é implantada, você precisa atualizar manualmente o driver NIC GuestOS a cada seis meses.

// cannot-be-validated-with-arg

Gerenciamento

Examinar VMs no estado parado

As instâncias de VM passam por estados diferentes, incluindo estados de provisionamento e energia. Se uma VM estiver em um estado parado, a VM pode estar enfrentando um problema ou pode não ser mais necessária e poderá ser removida para ajudar a reduzir os custos.

// Azure Resource Graph Query
// Find all VMs that are NOT running
Resources
| where type =~ 'Microsoft.Compute/virtualMachines'
| where properties.extended.instanceView.powerState.displayStatus != 'VM running'
| project recommendationId = "vm-9", name, id, tags

Usar configurações de manutenção para a VM

Para garantir que as atualizações/interrupções da VM sejam feitas em um período planejado, use as definições de configuração de manutenção para agendar e gerenciar atualizações. Para obter mais informações sobre como gerenciar atualizações de VM com configurações de manutenção, consulte Gerenciando atualizações de VM com Configurações de Manutenção.

// Azure Resource Graph Query
// Find VMS that do not have maintenance configuration assigned
Resources
| extend resourceId = tolower(id)
| project name, location, type, id, tags, resourceId, properties
| where type =~ 'Microsoft.Compute/virtualMachines'
| join kind=leftouter (
maintenanceresources
| where type =~ "microsoft.maintenance/configurationassignments"
| project planName = name, type, maintenanceProps = properties
| extend resourceId = tostring(maintenanceProps.resourceId)
) on resourceId
| where isnull(maintenanceProps)
| project recommendationId = "vm-22",name, id, tags
| order by id asc

Segurança

As VMs não devem ter um IP público associado diretamente

Se uma VM exigir conectividade com a Internet de saída, é recomendável que você use o Gateway da NAT ou o Firewall do Azure. O Gateway da NAT ou o Firewall do Azure ajudam a aumentar a segurança e a resiliência do serviço, pois ambos os serviços têm disponibilidade maior e portas SNAT (Conversão de Endereços de Rede de Origem). Para conectividade com a Internet de entrada, é recomendável que você use uma solução de balanceamento de carga, como o Azure Load Balancer e o Gateway de Aplicativo.

// Azure Resource Graph Query
// Find all VMs with PublicIPs directly associated with them
Resources
| where type =~ 'Microsoft.Compute/virtualMachines'
| where isnotnull(properties.networkProfile.networkInterfaces)
| mv-expand nic=properties.networkProfile.networkInterfaces
| project name, id, tags, nicId = nic.id
| extend nicId = tostring(nicId)
| join kind=inner (
    Resources
    | where type =~ 'Microsoft.Network/networkInterfaces'
    | where isnotnull(properties.ipConfigurations)
    | mv-expand ipconfig=properties.ipConfigurations
    | extend publicIp = tostring(ipconfig.properties.publicIPAddress.id)
    | where publicIp != ""
    | project name, nicId = tostring(id), publicIp
) on nicId
| project recommendationId = "vm-12", name, id, tags
| order by id asc

Os adaptadores de rede da VM têm um NSG (Grupo de Segurança de Rede) associado*

É recomendável associar um NSG a uma sub-rede ou a um adaptador de rede, mas não a ambos. Como as regras em um NSG associado a uma sub-rede podem entrar em conflito com as regras em um NSG associado a um adaptador de rede, você pode ter problemas de comunicação inesperados que exigem a solução de problemas. Para obter mais informações, consulte Tráfego intra-sub-rede.

// Azure Resource Graph Query
// Provides a list of virtual machines and associated NICs that do have an NSG associated to them and also an NSG associated to the subnet.
Resources
| where type =~ 'Microsoft.Network/networkInterfaces'
| where isnotnull(properties.networkSecurityGroup)
| mv-expand ipConfigurations = properties.ipConfigurations, nsg = properties.networkSecurityGroup
| project nicId = tostring(id), subnetId = tostring(ipConfigurations.properties.subnet.id), nsgName=split(nsg.id, '/')[8]
| parse kind=regex subnetId with '/virtualNetworks/' virtualNetwork '/subnets/' subnet
    | join kind=inner (
        Resources
        | where type =~ 'Microsoft.Network/NetworkSecurityGroups' and isnotnull(properties.subnets)
        | project name, resourceGroup, subnet=properties.subnets
        | mv-expand subnet
        | project subnetId=tostring(subnet.id)
    ) on subnetId
    | project nicId
| join kind=leftouter (
    Resources
    | where type =~ 'Microsoft.Compute/virtualMachines'
    | where isnotnull(properties.networkProfile.networkInterfaces)
    | mv-expand nic=properties.networkProfile.networkInterfaces
    | project vmName = name, vmId = id, tags, nicId = nic.id, nicName=split(nic.id, '/')[8]
    | extend nicId = tostring(nicId)
) on nicId
| project recommendationId = "vm-13", name=vmName, id = vmId, tags, param1 = strcat("nic-name=", nicName)

O encaminhamento de IP só deve ser habilitado para soluções de virtualização de rede

O encaminhamento de IP permite que o adaptador de rede da máquina virtual:

  • Receba o tráfego de rede não destinado a um dos endereços IP atribuídos a qualquer uma das configurações de IP atribuídas ao adaptador de rede.

  • Envie o tráfego de rede com um endereço IP de origem diferente daquele atribuído a uma das configurações de IP do adaptador de rede.

A seguinte configuração de IP deve ser habilitada para cada interface de rede conectada à VM que recebe o tráfego que a VM precisa encaminhar. Uma VM poderá encaminhar tráfego se tiver vários adaptadores de rede ou um único adaptador de rede conectado a ela. Embora o encaminhamento de IP seja uma configuração do Azure, a VM também deve executar um aplicativo capaz de encaminhar o tráfego, como, por exemplo, firewall, otimização de WAN e aplicativos de balanceamento de carga.

Para saber como habilitar ou desabilitar o encaminhamento de IP, consulte Habilitar ou desabilitar o encaminhamento de IP.

// Azure Resource Graph Query
// Find all VM NICs that have IPForwarding enabled. This feature is usually only required for Network Virtual Appliances
Resources
| where type =~ 'Microsoft.Compute/virtualMachines'
| where isnotnull(properties.networkProfile.networkInterfaces)
| mv-expand nic=properties.networkProfile.networkInterfaces
| project name, id, tags, nicId = nic.id
| extend nicId = tostring(nicId)
| join kind=inner (
    Resources
    | where type =~ 'Microsoft.Network/networkInterfaces'
    | where properties.enableIPForwarding == true
    | project nicId = tostring(id)
) on nicId
| project recommendationId = "vm-14", name, id, tags
| order by id asc

O acesso à rede para o disco da VM deve ser definido como “Desabilitar o acesso público e habilitar o acesso privado”

É recomendável definir o acesso à rede de disco da VM como "Desabilitar o acesso público e habilitar o acesso privado" e criar um ponto de extremidade privado. Para saber como criar um ponto de extremidade privado, confira Criar um ponto de extremidade privado.

// Azure Resource Graph Query
// Find all Disks with "Enable public access from all networks" enabled
resources
| where type =~ 'Microsoft.Compute/disks'
| where properties.publicNetworkAccess == "Enabled"
| project id, name, tags, lowerCaseDiskId = tolower(id)
| join kind = leftouter (
    resources
    | where type =~ 'Microsoft.Compute/virtualMachines'
    | project osDiskVmName = name, lowerCaseOsDiskId = tolower(properties.storageProfile.osDisk.managedDisk.id)
    | join kind = fullouter (
        resources
        | where type =~ 'Microsoft.Compute/virtualMachines'
        | mv-expand dataDisks = properties.storageProfile.dataDisks
        | project dataDiskVmName = name, lowerCaseDataDiskId = tolower(dataDisks.managedDisk.id)
        )
        on $left.lowerCaseOsDiskId == $right.lowerCaseDataDiskId
    | project lowerCaseDiskId = coalesce(lowerCaseOsDiskId, lowerCaseDataDiskId), vmName = coalesce(osDiskVmName, dataDiskVmName)
    )
    on lowerCaseDiskId
| summarize vmNames = make_set(vmName) by name, id, tostring(tags)
| extend param1 = iif(isempty(vmNames[0]), "VMName: n/a", strcat("VMName: ", strcat_array(vmNames, ", ")))
| project recommendationId = "vm-17", name, id, tags, param1
| order by id asc

Habilitar a criptografia de disco e a criptografia de dados inativos por padrão

Há vários tipos de criptografia disponíveis para seus discos gerenciados, incluindo ADE (Azure Disk Encryption), SSE (criptografia do lado do servidor) e criptografia no host.

  • O Azure Disk Encryption ajuda a proteger seus dados e a atender aos compromissos de conformidade e segurança da sua organização.
  • A criptografia do servidor do Armazenamento em Disco do Azure (também conhecida como criptografia de dados inativos ou criptografia do Armazenamento do Azure) criptografa automaticamente os dados armazenados nos discos gerenciados do Azure (SO e discos de dados) quando eles persistem nos clusters de armazenamento.
  • A criptografia no host assegura que os dados armazenados no host da VM que hospeda sua VM sejam criptografados inativo e os fluxos sejam criptografados para os clusters de armazenamento.
  • A criptografia de disco confidencial associa chaves de criptografia de disco ao TPM da VM e torna o conteúdo do disco protegido acessível somente para a VM.

Para obter mais informações sobre as opções de criptografia de disco gerenciado, consulte Visão geral das opções de criptografia de disco gerenciado.

// under-development

Rede

Os servidores DNS devem ser configurados no nível da Rede Virtual

Configure o Servidor DNS na Rede Virtual para evitar inconsistências de resolução de nomes em todo o ambiente. Para obter mais informações sobre a resolução de nomes para recursos em redes virtuais do Azure, consulte Resolução de nomes para VMs e serviços de nuvem.

// Azure Resource Graph Query
// Find all VM NICs that have DNS Server settings configured in any of the NICs
Resources
| where type =~ 'Microsoft.Compute/virtualMachines'
| where isnotnull(properties.networkProfile.networkInterfaces)
| mv-expand nic=properties.networkProfile.networkInterfaces
| project name, id, tags, nicId = nic.id
| extend nicId = tostring(nicId)
| join kind=inner (
    Resources
    | where type =~ 'Microsoft.Network/networkInterfaces'
    | project name, id, dnsServers = properties.dnsSettings.dnsServers
    | extend hasDns = array_length(dnsServers) >= 1
    | where hasDns != 0
    | project name, nicId = tostring(id)
) on nicId
| project recommendationId = "vm-15", name, id, tags
| order by id asc

Armazenamento

Os discos compartilhados só devem ser habilitados em servidores clusterizados

Os discos compartilhados do Azure são um recurso para os discos gerenciados do Azure, que permitem anexar um disco gerenciado a várias VMs simultaneamente. Anexar um disco gerenciado a várias VMs permite implantar novos aplicativos clusterizados ou migrar os existentes para o Azure. Os discos compartilhados só devem ser usados nas situações em que o disco é atribuído a mais de um membro de VM de um cluster.

Para saber mais sobre como habilitar discos compartilhados para discos gerenciados, consulte Habilitar disco compartilhado.

// Azure Resource Graph Query
// Find all Disks configured to be Shared. This is not an indication of an issue, but if a disk with this configuration is assigned to two or more VMs without a proper disk control mechanism (like a WSFC) it can lead to data loss
resources
| where type =~ 'Microsoft.Compute/disks'
| where isnotnull(properties.maxShares)
| project id, name, tags, lowerCaseDiskId = tolower(id), diskState = tostring(properties.diskState)
| join kind = leftouter (
    resources
    | where type =~ 'Microsoft.Compute/virtualMachines'
    | project osDiskVmName = name, lowerCaseOsDiskId = tolower(properties.storageProfile.osDisk.managedDisk.id)
    | join kind = fullouter (
        resources
        | where type =~ 'Microsoft.Compute/virtualMachines'
        | mv-expand dataDisks = properties.storageProfile.dataDisks
        | project dataDiskVmName = name, lowerCaseDataDiskId = tolower(dataDisks.managedDisk.id)
        )
        on $left.lowerCaseOsDiskId == $right.lowerCaseDataDiskId
    | project lowerCaseDiskId = coalesce(lowerCaseOsDiskId, lowerCaseDataDiskId), vmName = coalesce(osDiskVmName, dataDiskVmName)
    )
    on lowerCaseDiskId
| summarize vmNames = make_set(vmName) by name, id, tostring(tags), diskState
| extend param1 = strcat("DiskState: ", diskState), param2 = iif(isempty(vmNames[0]), "VMName: n/a", strcat("VMName: ", strcat_array(vmNames, ", ")))
| project recommendationId = "vm-16", name, id, tags, param1, param2
| order by id asc

Conformidade

Verifique se suas VMs estão em conformidade com as Políticas do Azure

É importante proteger a sua máquina virtual (VM) para os aplicativos que são executados. Proteger suas VMs pode incluir um ou mais serviços do Azure e recursos que abrangem o acesso seguro a suas máquinas virtuais e armazenamento seguro de seus dados. Para obter mais informações sobre como manter sua VM e aplicativos seguros, consulte Controles de Conformidade Regulatória do Azure Policy para as Máquinas Virtuais do Azure.

// Azure Resource Graph Query
// Find all VMs in "NonCompliant" state with Azure Policies
PolicyResources
| where type =~ "Microsoft.PolicyInsights/policyStates" and properties.resourceType =~ "Microsoft.Compute/virtualMachines" and properties.complianceState =~ "NonCompliant"
| project
    policyAssignmentName = properties.policyAssignmentName,
    policyDefinitionName = properties.policyDefinitionName,
    lowerCasePolicyDefinitionIdOfPolicyState = tolower(properties.policyDefinitionId),
    lowerCaseVmIdOfPolicyState = tolower(properties.resourceId)
| join kind = leftouter (
    PolicyResources
    | where type =~ "Microsoft.Authorization/policyDefinitions"
    | project lowerCasePolicyDefinitionId = tolower(id), policyDefinitionDisplayName = properties.displayName
    )
    on $left.lowerCasePolicyDefinitionIdOfPolicyState == $right.lowerCasePolicyDefinitionId
| project policyAssignmentName, policyDefinitionName, policyDefinitionDisplayName, lowerCaseVmIdOfPolicyState
| join kind = leftouter (
    Resources
    | where type =~ "Microsoft.Compute/virtualMachines"
    | project vmName = name, vmId = id, vmTags = tags, lowerCaseVmId = tolower(id)
    )
    on $left.lowerCaseVmIdOfPolicyState == $right.lowerCaseVmId
| extend
    param1 = strcat("AssignmentName: ", policyAssignmentName),
    param2 = strcat("DefinitionName: ", policyDefinitionDisplayName),  // Align to Azure portal's term.
    param3 = strcat("DefinitionID: ", policyDefinitionName)            // Align to Azure portal's term.
| project recommendationId = "vm-18", name = vmName, id = vmId, tags = vmTags, param1, param2, param3

Monitoramento

Habilitar insights da VM

Habilite o VM Insights para obter mais visibilidade na integridade e no desempenho de seu conjunto de dimensionamento de máquinas virtuais. O VM Insights fornece informações sobre o desempenho e a integridade de suas VMs e conjuntos de dimensionamento de máquinas virtuais, monitorando seus processos em execução e dependências em outros recursos. O VM Insights pode ajudar a fornecer desempenho e disponibilidade previsíveis de aplicativos vitais identificando gargalos de desempenho e problemas de rede. Os Insights podem ajudar a entender se um problema está relacionado a outras dependências.

// Azure Resource Graph Query
// Check for VMs without Azure Monitoring Agent extension installed, missing Data Collection Rule or Data Collection Rule without performance enabled.
Resources
| where type == 'microsoft.compute/virtualmachines'
| project idVm = tolower(id), name, tags
| join kind=leftouter (
    InsightsResources
    | where type =~ "Microsoft.Insights/dataCollectionRuleAssociations" and id has "Microsoft.Compute/virtualMachines"
    | project idDcr = tolower(properties.dataCollectionRuleId), idVmDcr = tolower(substring(id, 0, indexof(id, "/providers/Microsoft.Insights/dataCollectionRuleAssociations/"))))
on $left.idVm == $right.idVmDcr
| join kind=leftouter (
    Resources
    | where type =~ "Microsoft.Insights/dataCollectionRules"
    | extend
        isPerformanceEnabled = iif(properties.dataSources.performanceCounters contains "Microsoft-InsightsMetrics" and properties.dataFlows contains "Microsoft-InsightsMetrics", true, false),
        isMapEnabled = iif(properties.dataSources.extensions contains "Microsoft-ServiceMap" and properties.dataSources.extensions contains "DependencyAgent" and properties.dataFlows contains "Microsoft-ServiceMap", true, false)//,
    | where isPerformanceEnabled or isMapEnabled
    | project dcrName = name, isPerformanceEnabled, isMapEnabled, idDcr = tolower(id))
on $left.idDcr == $right.idDcr
| join kind=leftouter (
    Resources
        | where type == 'microsoft.compute/virtualmachines/extensions' and (name contains 'AzureMonitorWindowsAgent' or name contains 'AzureMonitorLinuxAgent')
        | extend idVmExtension = tolower(substring(id, 0, indexof(id, '/extensions'))), extensionName = name)
on $left.idVm == $right.idVmExtension
| where isPerformanceEnabled != 1 or (extensionName != 'AzureMonitorWindowsAgent' and extensionName != 'AzureMonitorLinuxAgent')
| project recommendationId = "vm-20", name, id = idVm, tags, param1 = strcat('MonitoringExtension:', extensionName), param2 = strcat('DataCollectionRuleId:', idDcr), param3 = strcat('isPerformanceEnabled:', isPerformanceEnabled)

Definir configurações de diagnóstico para todos os recursos do Azure

As métricas de plataforma são enviadas automaticamente e sem configuração para métricas do Azure Monitor. Os logs de plataforma apresentam informações detalhadas de diagnóstico e auditoria para recursos do Azure e para a plataforma do Azure da qual eles dependem e são um dos tipos a seguir:

  • Os logs de recursos que não são coletados até que sejam roteados para um destino.
  • Os logs de atividades que existem por conta própria, mas podem ser roteados para outros locais.

Cada recurso do Azure requer sua própria configuração de diagnóstico, o que define os seguintes critérios:

  • Fontes o tipo de dados de log e métrica a ser enviado aos destinos definidos na configuração. Os tipos disponíveis variam de acordo com o tipo de recurso.
  • Destinos: um ou mais destinos para envio.

Uma única configuração de diagnóstico pode definir apenas um de cada um dos destinos. Se desejar enviar dados para mais de um tipo de destino específico (por exemplo, dois workspaces do Log Analytics diferentes), crie várias configurações. Cada recurso pode ter até cinco configurações de diagnóstico.

Para mais informações, confira Configurações de diagnóstico no Azure Monitor.

// Azure Resource Graph Query
// Find all Virtual Machines without diagnostic settings enabled/with diagnostic settings enabled but not configured both performance counters and event logs/syslogs.
resources
| where type =~ "microsoft.compute/virtualmachines"
| project name, id, tags, lowerCaseVmId = tolower(id)
| join kind = leftouter (
    resources
    | where type =~ "Microsoft.Compute/virtualMachines/extensions" and properties.publisher =~ "Microsoft.Azure.Diagnostics"
    | project
        lowerCaseVmIdOfExtension = tolower(substring(id, 0, indexof(id, "/extensions/"))),
        extensionType = properties.type,
        provisioningState = properties.provisioningState,
        storageAccount = properties.settings.StorageAccount,
        // Windows
        wadPerfCounters = properties.settings.WadCfg.DiagnosticMonitorConfiguration.PerformanceCounters.PerformanceCounterConfiguration,
        wadEventLogs = properties.settings.WadCfg.DiagnosticMonitorConfiguration.WindowsEventLog,
        // Linux
        ladPerfCounters = properties.settings.ladCfg.diagnosticMonitorConfiguration.performanceCounters.performanceCounterConfiguration,
        ladSyslog = properties.settings.ladCfg.diagnosticMonitorConfiguration.syslogEvents
    | extend
        // Windows
        isWadPerfCountersConfigured = iif(array_length(wadPerfCounters) > 0, true, false),
        isWadEventLogsConfigured = iif(isnotnull(wadEventLogs) and array_length(wadEventLogs.DataSource) > 0, true, false),
        // Linux
        isLadPerfCountersConfigured = iif(array_length(ladPerfCounters) > 0, true, false),
        isLadSyslogConfigured = isnotnull(ladSyslog)
    | project
        lowerCaseVmIdOfExtension,
        extensionType,
        provisioningState,
        storageAccount,
        isPerfCountersConfigured = case(extensionType =~ "IaaSDiagnostics", isWadPerfCountersConfigured, extensionType =~ "LinuxDiagnostic", isLadPerfCountersConfigured, false),
        isEventLogsConfigured = case(extensionType =~ "IaaSDiagnostics", isWadEventLogsConfigured, extensionType =~ "LinuxDiagnostic", isLadSyslogConfigured, false)
    )
    on $left.lowerCaseVmId == $right.lowerCaseVmIdOfExtension
| where isempty(lowerCaseVmIdOfExtension) or provisioningState !~ "Succeeded" or not(isPerfCountersConfigured and isEventLogsConfigured)
| extend
    param1 = strcat("DiagnosticSetting: ", iif(isnotnull(extensionType), strcat("Enabled, partially configured (", extensionType, ")"), "Not enabled")),
    param2 = strcat("ProvisioningState: ", iif(isnotnull(provisioningState), provisioningState, "n/a")),
    param3 = strcat("storageAccount: ", iif(isnotnull(storageAccount), storageAccount, "n/a")),
    param4 = strcat("PerformanceCounters: ", case(isnull(isPerfCountersConfigured), "n/a", isPerfCountersConfigured, "Configured", "Not configured")),
    param5 = strcat("EventLogs/Syslogs: ", case(isnull(isEventLogsConfigured), "n/a", isEventLogsConfigured, "Configured", "Not configured"))
| project recommendationId = "vm-21", name, id, tags, param1, param2, param3, param4, param5

Suporte à zona de disponibilidade

As zonas de disponibilidade do Azure são pelo menos três grupos de datacenters separados fisicamente em cada região do Azure. Os datacenters dentro de cada zona são equipados com energia, resfriamento e infraestrutura de rede independentes. Em caso de falha de uma zona local, as zonas de disponibilidade foram projetadas de modo que, se uma zona é afetada, os serviços regionais, a capacidade e a alta disponibilidade têm suporte nas duas zonas restantes.

As falhas podem variar de falhas de software e hardware a eventos como terremotos, inundações e incêndios. A tolerância a falhas é obtida devido à redundância e ao isolamento lógico dos serviços do Azure. Para obter informações detalhadas sobre as zonas de disponibilidade no Azure, confira Regiões e zonas de disponibilidade.

Os serviços habilitados para zonas de disponibilidade do Azure foram projetados para fornecer o nível ideal de resiliência e flexibilidade. Eles podem ser configurados de duas maneiras. Eles podem ter redundância de zona, com replicação automática entre zonas, ou podem ser zonais, com instâncias fixadas em uma zona específica. Você também pode combinar essas abordagens. Para obter mais informações sobre a arquitetura zonal versus com redundância de zona, confira Recomendações para usar zonas e regiões de disponibilidade.

As máquinas virtuais dão suporte a zonas de disponibilidade com três zonas de disponibilidade por região do Azure com suporte e também são com redundância de zona e zonal. Para obter mais informações, confira suporte a zonas de disponibilidade. O cliente é responsável por configurar e migrar suas máquinas virtuais para disponibilidade.

Para saber mais sobre as opções de preparação da zona de disponibilidade, confira:

Pré-requisitos

Aprimoramentos do SLA

Como as zonas de disponibilidade são fisicamente separadas e fornecem fonte de energia, rede e refrigeração distintas, os SLAs (Contratos de nível de serviço) aumentam. Para saber mais, confira SLA para máquinas virtuais.

Criar um recurso com zonas de disponibilidade habilitadas

Comece criando uma máquina virtual (VM) com a zona de disponibilidade habilitada nas seguintes opções de implantação abaixo:

Suporte a failover zonal

Você pode configurar máquinas virtuais para fazer failover em outra zona usando o serviço Site Recovery. Para obter mais informações, confira Site Recovery.

Tolerância a falhas

As máquinas virtuais podem fazer failover para outro servidor em um cluster, com o sistema operacional da VM reiniciando no novo servidor. Você deve consultar o processo de failover para recuperação de desastre, reunindo máquinas virtuais no planejamento de recuperação e executando exercícios de recuperação de desastre para garantir que sua solução de tolerância a falhas seja bem-sucedida.

Para obter mais informações, confira os processos de recuperação de sites.

Experiência de zona inoperante

Durante uma interrupção em toda a zona, você deve esperar uma breve degradação do desempenho, até que a autocorreção do serviço de máquina virtual reequilibre a capacidade subjacente para se ajustar às zonas íntegras. A autorrecuperação não depende da restauração da zona; espera-se que o estado de auto correção de serviço gerenciado pela Microsoft compense uma zona perdida, usando a capacidade de outras zonas.

Você também deve se preparar para a possibilidade de interrupção de uma região inteira. Se houver uma interrupção de serviço em uma região inteira, as cópias localmente redundantes de seus dados ficarão temporariamente indisponíveis. Se a replicação geográfica estiver habilitada, três cópias adicionais de seus blobs e tabelas de Armazenamento do Microsoft Azure serão armazenadas em uma região diferente. Quando há uma interrupção regional completa ou um desastre no qual a região primária não é recuperável, o Azure remapeia todas as entradas DNS para a região replicada geograficamente.

Preparação e recuperação de interrupção de zona

A orientação a seguir é fornecida para máquinas virtuais do Azure durante uma interrupção do serviço de toda a região onde seu aplicativo de máquina virtual do Azure é implantado:

Design de baixa latência

Entre Regiões (região secundária), Assinatura Integrada (versão prévia) e Zona Integrada (versão prévia) são opções disponíveis a serem consideradas ao projetar uma solução de máquina virtual de baixa latência. Para obter mais informações sobre essas opções, confira os métodos de restauração com suporte.

Importante

Ao recusar a implantação com reconhecimento de zona, você abre mão da proteção contra o isolamento de falhas subjacentes. O uso de SKUs que não dão suporte a zonas de disponibilidade ou a recusa da configuração da zona de disponibilidade força a dependência de recursos que não obedecem ao posicionamento e à separação da zona (incluindo dependências subjacentes desses recursos). Não se deve esperar que esses recursos sobrevivam a cenários de zona inativa. As soluções que alavancam tais recursos devem definir uma estratégia de recuperação de desastre e configurar uma recuperação da solução em outra região.

Técnicas de implantação segura

Ao optar pelo isolamento de zonas de disponibilidade, utilize técnicas de implantação seguras para código de aplicativo e atualizações de aplicativos. Além de configurar o Azure Site Recovery e implementar qualquer uma das seguintes técnicas de implantação seguras para VMs:

Como a Microsoft executa atualizações de manutenção planejadas periodicamente, pode haver casos raros em que essas atualizações exijam uma reinicialização de sua máquina virtual para aplicar as atualizações necessárias à infraestrutura subjacente. Para saber mais, confira as considerações de disponibilidade durante a manutenção agendada.

Antes de atualizar o próximo conjunto de nós em outra zona, você deve executar as seguintes tarefas:

Migrar para o suporte às zonas de disponibilidade

Para saber como migrar uma VM para o suporte à zona de disponibilidade, consulte Migrar Máquinas Virtuais e Conjuntos de Dimensionamento de Máquinas Virtuais para o suporte à zona de disponibilidade.

Recuperação de desastre entre regiões e continuidade dos negócios

A DR (recuperação de desastre) trata da recuperação após eventos de alto impacto, como desastres naturais ou implantações com falha, que resultam em tempo de inatividade e perda de dados. Seja qual for a causa, a melhor solução para um desastre é um plano de DR bem definido e testado e um design de aplicativo que dê suporte ativo à DR. Antes de começar a pensar em criar seu plano de recuperação de desastre, confira Recomendações para criar uma estratégia de recuperação de desastre.

Quando o assunto é DR, a Microsoft usa o modelo de responsabilidade compartilhada. Em um modelo de responsabilidade compartilhada, a Microsoft garante que a infraestrutura de linha de base e os serviços de plataforma estejam disponíveis. Ao mesmo tempo, muitos serviços do Azure não replicam dados automaticamente nem retornam de uma região com falha para a replicação cruzada em outra região habilitada. Para esses serviços, você é responsável por configurar um plano de recuperação de desastre que funcione para sua carga de trabalho. A maioria dos serviços executados nas ofertas de PaaS (plataforma como serviço) do Azure fornece recursos e diretrizes para dar suporte à DR. Além disso, você pode usar recursos específicos do serviço para dar suporte a uma recuperação rápida, a fim de ajudar a desenvolver seu plano de DR.

Você pode usar a restauração Entre Regiões para restaurar VMs do Azure por meio de regiões emparelhadas. Com a restauração Entre Regiões, você pode restaurar todas as VMs do Azure para o ponto de recuperação selecionado se o backup for feito na região secundária. Para obter mais informações sobre a restauração Entre Regiões, consulte a entrada da tabela Entre Regiões em nossas opções de restauração.

Recuperação de desastre na geografia de várias regiões

No caso de uma interrupção de serviço em toda a região, a Microsoft trabalha diligentemente para restaurar o serviço da máquina virtual. Porém, você ainda deve contar com outras estratégias de backup específicas ao aplicativo para chegar ao nível mais alto de disponibilidade. Para obter mais informações, consulte a seção sobre Estratégias de Dados para Recuperação de Desastre.

Detecção, notificação e gerenciamento de interrupção

O hardware ou a infraestrutura física da máquina virtual podem falhar inesperadamente. As falhas inesperadas podem incluir falhas na rede local, falhas no disco local ou outras falhas no nível de rack. Quando detectada, a plataforma do Azure migra automaticamente (repara) a máquina virtual para um computador físico íntegro no mesmo datacenter. Durante o procedimento de recuperação, as máquinas virtuais ficarão inativas (reinicialização) e, em alguns casos, perderão a unidade temporária. O sistema operacional e os discos de dados anexados são sempre preservados.

Para obter informações mais detalhadas sobre interrupções de serviço de máquina virtual, confira asdiretrizes de recuperação de desastre.

Configurar a recuperação de desastre e a detecção de interrupções

Ao configurar a recuperação de desastre para máquinas virtuais, entenda o que o Azure Site Recovery fornece. Habilite a recuperação de desastre para máquinas virtuais com os métodos abaixo:

Recuperação de desastre na geografia de região única

Com a recuperação de desastre configurada, as VMs do Azure são replicadas de maneira contínua para outra região de destino. Se ocorrer uma interrupção, você poderá fazer failover das VMs para a região secundária e acessá-las nela.

Quando você replicar VMs do Azure usando a Recuperação de Site, todos os discos de VM serão replicados continuamente para a região de destino assincronamente. Os pontos de recuperação são criados a cada poucos minutos, o que concede um RPO (Objetivo de Ponto de Recuperação) na ordem dos minutos. Você pode realizar simulações de recuperação de desastre quantas vezes quiser sem afetar o aplicativo de produção ou a replicação contínua. Para saber mais, confira Realizar uma análise detalhada da recuperação de desastre para o Azure.

Para obter mais informações, confira componentes arquitetônicos de VMs do Azure e emparelhamento de região.

Capacidade e resiliência proativa de recuperação de desastre

A Microsoft e seus clientes operam ao abrigo do Modelo de Responsabilidade Compartilhada. A responsabilidade compartilhada significa que, para DR habilitada pelo cliente (serviços responsáveis pelo cliente), você deve abordar a DR para qualquer serviço que implemente e controle. Para garantir que a recuperação seja proativa, você sempre deve pré-implantar secundárias porque não há garantia de capacidade no momento do impacto para aqueles que não foram pré-alocados.

Para implantar máquinas virtuais, você pode usar o modo de orquestração flexível em Conjuntos de Dimensionamento de Máquinas Virtuais. Todos os tamanhos da VM podem ser usados com o modo de orquestração flexível. O modo de orquestração flexível também oferece garantias de alta disponibilidade (até 1000 VMs), distribuindo VMs por domínios de falha em uma região ou dentro de uma zona de disponibilidade.

Próximas etapas