Home / Azure

AzureHow-toIntermediate

Azure VM high availability: availability zones, availability sets and VM scale sets

Compare availability sets, zones and flexible scale sets, design a two-tier zone-redundant VM deployment with a Standard Load Balancer, and test that it really survives a zone failure.

Deepak Bhardwaj2 min read

Applies toAzure Virtual Machines, Virtual Machine Scale Sets (Flexible), Standard Load Balancer

The options

Option Protects against VM SLA (2+ VMs) Notes
Single VM (Premium SSD) Nothing beyond host healing 99.9% See the standalone post
Availability set Rack/host failure, planned maintenance (fault and update domains) 99.95% One datacenter; legacy but still valid in regions without zones
Availability zones Datacenter (zone) failure 99.99% Needs zone-redundant/zonal dependencies too
Flexible VM scale set across zones Zone failure + autoscale + fleet management 99.99% Recommended for new stateless tiers

Choose zones whenever the region supports them. Availability sets and zones can't be combined for the same VM.

Design: zone-redundant web tier

           Standard Load Balancer (zone-redundant frontend)
             ┌─────────────┼─────────────┐
       vm-web-1 (zone 1) vm-web-2 (zone 2) vm-web-3 (zone 3)
az vmss create -g rg-web -n vmss-web --orchestration-mode Flexible \
  --image Ubuntu2204 --vm-sku Standard_D2ds_v5 --instance-count 3 \
  --zones 1 2 3 --platform-fault-domain-count 1 \
  --vnet-name spoke-web --subnet snet-web \
  --lb lb-web --upgrade-policy-mode Rolling

Health probe on the application path, not just TCP:

az network lb probe create -g rg-web --lb-name lb-web -n http-health --protocol Http --port 80 --path /healthz

Everything in the path must be zonal or zone-redundant

  • Load balancer Standard SKU, public IP Standard with zone-redundant frontend.
  • Disks: zonal (follow the VM) or ZRS disks for shared/failover scenarios.
  • NAT gateway is zonal: use one per zone, or let the firewall in the hub handle egress.
  • Database tier: zone-redundant Azure SQL, or SQL Server AG with replicas in different zones.
  • App state: no local sessions. Use Redis (zone-redundant tier) or a database.

Capacity planning

With 3 zones and N+1 thinking: if one zone fails, the remaining 2/3 of instances must carry the load. Either run at ≤ 66% utilisation or let autoscale add instances quickly (and confirm quota and SKU capacity in the remaining zones).

Test it

  • Stop all instances in one zone during a test window and watch the load balancer and app metrics.
  • Use Azure Chaos Studio experiments (VM shutdown, zone-down via NSG faults) for repeatable tests.
az vm list -g rg-web --query "[].{name:name, zone:zones[0], power:powerState}" -d -o table

Tip

Document which components are zonal, zone-redundant or regional only. Single points of failure usually hide in the "regional only" column: an old Basic SKU IP, a single NVA, a VM-based DNS server.