Introduction

Azure Availability Sets distribute VMs across fault domains (physical racks) and update domains (maintenance groups) to provide high availability. When misconfigured, all VMs may be in the same fault domain, meaning a single rack failure or Azure update can take down your entire application.

Symptoms

All VMs in same fault domain:

```bash $ az vm availability-set show \ --name my-avail-set \ --resource-group my-rg \ --query 'virtualMachines[*].id'

# Check fault domains: $ az vm list --resource-group my-rg --query '[].{Name:name, FaultDomain:zones}'

# All VMs show same fault domain = no redundancy ```

SLA not met during outage:

```bash # During Azure planned maintenance, all VMs went down $ az vm list --resource-group my-rg --query '[?powerState!="running"]'

# All VMs offline simultaneously ```

VM creation in availability set fails:

```bash $ az vm create --name vm3 --resource-group my-rg --availability-set my-avail-set

"error": { "code": "OperationNotAllowed", "message": "Availability set is already associated with a different proximity placement group" } ```

Common Causes

  1. 1.All VMs in same fault domain - Created before fault domain awareness
  2. 2.Incorrect domain count - Fault/update domains less than VM count
  3. 3.Proximity placement group conflict - Availability set in different PPG
  4. 4.VM SKU mismatch - VM sizes not supported in availability set
  5. 5.Managed disk alignment - VMs with unmanaged disks in same storage account
  6. 6.Capacity constraints - Azure region doesn't have spread capacity
  7. 7.Legacy configuration - Availability set created before managed disks

Step-by-Step Fix

  1. 1.Check logs for specific error messages
  2. 2.Verify configuration settings
  3. 3.Test network connectivity
  4. 4.Review recent changes
  5. 5.Apply corrective action
  6. 6.Verify the fix

Step 1: Check Availability Set Configuration

bash
# Get availability set details
az vm availability-set show \
  --name my-avail-set \
  --resource-group my-rg \
  --query '{Name:name, FaultDomains:platformFaultDomainCount, UpdateDomains:platformUpdateDomainCount, VMs:virtualMachines}'

Step 2: Check VM Fault Domain Distribution

```bash # List all VMs in availability set with their fault domains az vm availability-set show \ --name my-avail-set \ --resource-group my-rg \ --query 'virtualMachines[].{VM:id, InstanceView:instanceView}' -o json | \ jq '.[] | {VM: .VM, FaultDomain: .InstanceView.platformFaultDomain}'

# Ideal distribution: # VM1 -> Fault Domain 0 # VM2 -> Fault Domain 1 # VM3 -> Fault Domain 2 ```

Step 3: Verify Domain Counts

```bash # Check configured domain counts az vm availability-set show \ --name my-avail-set \ --resource-group my-rg \ --query '{FaultDomains:platformFaultDomainCount, UpdateDomains:platformUpdateDomainCount}'

# Azure defaults: # Fault Domains: 2 or 3 (region dependent) # Update Domains: 5 (can be up to 20) ```

Step 4: Recreate Availability Set with Correct Domains

```bash # Create new availability set with proper domain counts az vm availability-set create \ --name my-avail-set-new \ --resource-group my-rg \ --platform-fault-domain-count 3 \ --platform-update-domain-count 5 \ --sku Aligned # Required for managed disks

# The 'Aligned' SKU ensures fault domains align with managed disk storage ```

Step 5: Move VMs to New Availability Set

```bash # VMs cannot change availability set without redeployment # Option 1: Deallocate, recreate

# Deallocate VM az vm deallocate --name vm1 --resource-group my-rg

# Delete VM (keep disks and NIC) az vm delete --name vm1 --resource-group my-rg --keep-disks

# Recreate VM in new availability set az vm create \ --name vm1 \ --resource-group my-rg \ --availability-set my-avail-set-new \ --attach-os-disk vm1_OsDisk \ --nics vm1Nic \ --os-type Linux ```

Step 6: Check Proximity Placement Group

```bash # Check if availability set is in a proximity placement group az vm availability-set show \ --name my-avail-set \ --resource-group my-rg \ --query proximityPlacementGroup

# If in PPG, all VMs are in same datacenter # This conflicts with spreading across fault domains # Consider removing from PPG or using Availability Zones instead ```

Step 7: Verify VM Sizes Support Availability Set

```bash # Check VM sizes available for availability set az vm list-sizes --location eastus --query "[?contains(name, 'Standard_DS')]"

# Some newer VM series may not support availability sets: # - Use Availability Zones instead for better SLA # - Or use VM Scale Sets for managed distribution ```

Step 8: Check for Capacity Issues

```bash # If Azure can't spread VMs across fault domains due to capacity az vm availability-set show \ --name my-avail-set \ --resource-group my-rg \ --query statuses

# Look for capacity-related warnings ```

Step 9: Consider Availability Zones Instead

```bash # For better redundancy, use Availability Zones # Zones provide 99.99% SLA vs 99.95% for availability sets

# Create VMs in different zones az vm create --name vm1 --resource-group my-rg --zone 1 az vm create --name vm2 --resource-group my-rg --zone 2 az vm create --name vm3 --resource-group my-rg --zone 3

# Note: Availability Zones require region support az account list-locations --query "[?contains(metadata.features, 'availabilityZones')].name" ```

Step 10: Monitor with Health probes

```bash # Set up health monitoring for availability az network lb probe create \ --lb-name my-lb \ --resource-group my-rg \ --name my-probe \ --protocol http \ --port 80 \ --path /health

# Configure load balancer to route traffic only to healthy VMs ```

Availability Set vs Availability Zones

FeatureAvailability SetAvailability Zones
SLA99.95%99.99%
Failure protectionRack-levelDatacenter-level
Minimum VMs for HA22
CostNo extraCross-zone data transfer
Region supportAll regionsSelect regions

Verification

```bash # Check VM distribution across fault domains for vm in $(az vm availability-set show --name my-avail-set --resource-group my-rg --query 'virtualMachines[].id' -o tsv); do vm_name=$(basename $vm) fault_domain=$(az vm get-instance-view --name $vm_name --resource-group my-rg --query 'instanceView.platformFaultDomain' -o tsv) echo "$vm_name: Fault Domain $fault_domain" done

# Should show VMs distributed across different fault domains (0, 1, 2)

# Test by simulating planned maintenance # Azure will update one update domain at a time ```

  • [Fix Azure VM Not Starting](/articles/fix-azure-vm-not-starting)
  • [Fix Azure Load Balancer Probe Failing](/articles/fix-azure-load-balancer-probe-failing)
  • [Fix Azure VM Extension Failed](/articles/fix-azure-vm-extension-failed)
  • [Technical troubleshooting: Fix Azure Aks Pod Crashloopbackoff Issue in Azure](azure-aks-pod-crashloopbackoff)
  • [Technical troubleshooting: Fix Azure Api Management Policy Expression Runtime](azure-api-management-policy-expression-runtime-error)
  • [Technical troubleshooting: Fix Azure App Configuration Feature Flag Not Refre](azure-app-configuration-feature-flag-not-refreshing)
  • [Technical troubleshooting: Fix Azure App Service 503 Always On Disabled Issue](azure-app-service-503-always-on-disabled)
  • [Technical troubleshooting: Fix Azure Application Gateway Err SSL Unrecognized](azure-application-gateway-err-ssl-unrecognized-name-alert)

<script type="application/ld+json"> { "@context": "https://schema.org", "@type": "TechArticle", "headline": "Fix Azure Availability Set Misconfigured", "description": "Troubleshoot Azure availability set misconfigurations. Fix fault domains, update domains, and VM placement for redundancy.", "url": "https://www.fixwikihub.com/fix-azure-availability-set-misconfigured", "publisher": { "@type": "Organization", "name": "FixWikiHub", "url": "https://www.fixwikihub.com" }, "author": { "@type": "Person", "name": "FixWikiHub Editorial Team" }, "datePublished": "2026-04-02T02:38:49.928Z", "dateModified": "2026-04-02T02:38:49.928Z" } </script>