Skip to content

Azure Regions & Zone Redundancy

Key Points

  • Region = a set of datacenters in a geographic area. Availability Zone (AZ) = independent physical datacenter within a region (separate power, cooling, network). Most major regions have 3 zones.
  • Paired regions (East US ↔ West US, North Europe ↔ West Europe) get coordinated maintenance windows and pair-aware geo-replication. Microsoft is moving away from strict pairing for newer regions (Azure Regional Pairs deprecation announced for many services).
  • Zone-redundant SKUs auto-spread across 3 zones (you don't pick a zone). Zonal SKUs pin to a specific zone (1, 2, 3) — for proximity to other zonal resources.
  • Geo-redundancy is async to a paired region: GRS, GZRS, RA-GRS, RA-GZRS. RPO is seconds-to-minutes; expect data loss in unplanned failover.
  • Don't accidentally mix zone-redundant compute with zonal storage — your "zone-resilient" app actually has a zonal SPOF.

Concepts (deep dive)

Region structure

Geography (e.g., United States)
 ├─ Region (East US)
 │   ├─ AZ 1  ─ datacenter cluster
 │   ├─ AZ 2  ─ datacenter cluster
 │   └─ AZ 3  ─ datacenter cluster
 └─ Region (West US)
     └─ ...

A region is one or more buildings within ~100 km of each other; round-trip latency between zones in a region is typically 1–2 ms.

Paired regions

Microsoft historically paired regions for: - Coordinated maintenance: paired regions are not patched simultaneously. - Sequential platform updates: rollbacks possible across the pair. - Geo-replication targets: GRS/GZRS replicate to the pair by default. - Same geography: data residency stays inside a sovereign boundary.

Region Pair
East US West US
East US 2 Central US
North Europe West Europe
UK South UK West
Australia East Australia Southeast

⚠️ Newer regions are not paired. Azure published a guidance shift: many newer services let you pick the geo-replication target explicitly. Don't assume "GRS = my paired region" without checking the service docs.

Availability zones

Region: East US
 ┌──────────────────────────────────────────────────┐
 │  AZ 1            AZ 2            AZ 3            │
 │ ┌──────┐        ┌──────┐        ┌──────┐         │
 │ │ DC   │        │ DC   │        │ DC   │         │
 │ │ pwr  │        │ pwr  │        │ pwr  │         │
 │ │ net  │        │ net  │        │ net  │         │
 │ │ cool │        │ cool │        │ cool │         │
 │ └──────┘        └──────┘        └──────┘         │
 │   └────── ms-level latency ──────┘               │
 └──────────────────────────────────────────────────┘

Each AZ has independent power, cooling, networking. A zone outage takes out one DC; the other two keep running.

Zonal vs zone-redundant

Zonal Zone-redundant
You pick A specific zone (1, 2, 3) No — service auto-spreads
Failure mode Down if that zone fails Resilient to one zone failure
Use case Co-locate with zonal partner (e.g., VM near zonal disk) Default HA
Examples VM, managed disk, public IP (zonal) ZRS storage, App Service Premium v3 ZR, Azure SQL DB ZR, Front Door (always global)

💡 The trap: a zone-redundant App Service Plan with a zonal SQL Database = your DB is the SPOF. Always check the stateful tier.

Service zone-redundancy support (commonly asked)

Service Mode
Storage Account ZRS / GZRS Zone-redundant
Azure SQL DB Business Critical / Hyperscale Optional zone-redundant
App Service Plan Premium v3 Zone-redundant (>=3 instances)
AKS cluster Zone-redundant control plane + zonal node pools you spread
Azure Load Balancer Standard Zone-redundant frontend by default
Public IP Standard Zonal or zone-redundant
VM Zonal — you spread N VMs across zones
Application Gateway v2 Zone-redundant
Cosmos DB Zone-redundant if "Availability Zones" enabled per region
Service Bus / Event Hubs Premium Zone-redundant by default

Geo-redundant storage variants

LRS   ─ 3 copies in 1 DC (1 zone)
ZRS   ─ 3 copies across 3 zones in 1 region
GRS   ─ LRS + async LRS in paired region
GZRS  ─ ZRS + async LRS in paired region
RA-*  ─ Read-Access variant; paired region readable
  • RPO for GRS/GZRS: typically <15 minutes, often seconds.
  • Failover is manual for most services until you initiate it (or Microsoft does in catastrophic regional loss).
  • Cost: GRS roughly 2× LRS for write traffic; ZRS small premium over LRS.

Designing for zone failure (within region)

Goal: tolerate one of 3 zones going dark.

   Front Door / App Gateway (zone-redundant)
   ┌────────┼────────┐
   │        │        │
   AZ1     AZ2      AZ3
   App     App      App
   instance×N  zone-redundant pool
       Azure SQL DB (Business Critical, ZR)
       Storage GZRS / Cosmos with AZ

Checklist: - ✅ Load balancer / ingress: zone-redundant - ✅ Compute: zone-redundant SKU OR ≥3 instances spread zonal - ✅ Stateful tier: ZR-enabled - ✅ Storage: ZRS/GZRS - ✅ Caching layer: Redis Premium with zone redundancy - ❌ Don't pin to one zone unless that's an explicit design choice (low-latency colocation)

Designing for region failure

A region disaster (rare but real — Sydney Sept 2018, Texas Feb 2021) requires cross-region architecture.

Active-active (paired stamps)

   Front Door (global, anycast)
    ┌───┴───┐
   East US  West US
    stamp    stamp
   (full)   (full)
        ↕ Cosmos multi-region writes
        ↕ Storage GZRS / cross-region read

Both regions serve traffic. Higher cost; lowest RTO. Requires multi-master data tier (Cosmos with multi-region writes, or app-level conflict resolution).

Active-passive (warm standby)

   Traffic Manager / Front Door
   Primary (East US)  ──asynch──►  DR (West US)
   full traffic                    minimum compute,
                                   read replicas

DR scaled to minimum; promote on failover. Cheaper; minutes-to-hours RTO.

Pilot light / cold DR

ARM templates ready, no compute running. Cheapest, but RTO is hours/days. Acceptable for low-tier services.

Read-your-writes after regional failover

GRS/GZRS failover means promoting the secondary to primary. Any writes after the last replication will be lost. App design should: - Tolerate idempotent retries for writes lost during failover. - Use Cosmos Session consistency + multi-region writes for read-your-writes guarantees. - Track event sourcing or outbox for replay after failover.

Compliance / data residency

  • Geographies group regions by sovereignty: US, Europe, China, Government.
  • Data sovereignty: paired regions are in the same geography — your data does not leave the boundary on geo-replication.
  • Sovereign clouds: Azure US Government, Azure China (operated by 21Vianet). Azure Germany was sunset; data moved to mainstream German regions.

⚠️ GDPR / data residency: explicitly choose region pair (or single region with ZRS only) to keep data in-jurisdiction. Some EU customers refuse cross-Atlantic geo replication entirely.

Cost: what zone/geo redundancy actually costs

Choice Relative storage cost Relative compute cost
LRS / single zone
ZRS / zone-redundant ~1.25× ~3× (need 3 instances)
GRS ~2× (compute unaffected)
GZRS ~2.5×
Cross-region active-active varies ~2× for full duplicate

💡 Don't pay for GZRS on transient telemetry; LRS is fine for replaceable data.

Decision matrix

SLA target Architecture
99.9% Single region, single zone
99.95% Single region, zone-redundant
99.99% Multi-region active-passive
99.999% Multi-region active-active + Front Door

How it works under the hood

  • AZs are physically separate but share the regional fabric controllers and global Azure control plane. A zone outage is a data-plane event, not a control-plane.
  • GRS replication uses Azure's internal pipeline: writes commit to LRS first, then async to paired region. Lag depends on write volume.
  • Geo-failover flips DNS / control-plane targets; it's not instant — typically tens of minutes to coordinate, plus app reconfiguration.
  • Front Door uses anycast: same IP advertised from 100+ POPs; BGP routes clients to nearest healthy edge.
  • Traffic Manager is DNS-based: clients resolve to a region's IP via TM-controlled DNS; respects TTL (usually 60s).

Code: correct vs wrong

❌ Wrong: zone-redundant app + zonal storage

// App Service Plan zone-redundant: ✅
plan: { sku: 'P1v3', zoneRedundant: true }

// But linked Storage Account is LRS: ❌
storage: { sku: 'Standard_LRS' }

App tier survives a zone outage; storage doesn't. Whole stack down.

✅ Correct: matched redundancy

plan:    { sku: 'P1v3', zoneRedundant: true }
storage: { sku: 'Standard_ZRS' }
sql:     { sku: 'BusinessCritical', zoneRedundant: true }

❌ Wrong: 2-region active-active without multi-master DB

Both regions accept writes into the same SQL DB → split-brain or one region writes blindly fail.

✅ Correct: Cosmos multi-region writes OR partition by region

new CosmosClientOptions
{
    ApplicationRegion = Regions.EastUS,
    ConsistencyLevel = ConsistencyLevel.Session
};
// Cosmos account configured with multi-region writes enabled

❌ Wrong: hardcoded region name

var endpoint = "https://myacct.eastus.kusto.windows.net";

Failover requires code change.

✅ Correct: configuration-driven

var endpoint = config["DataEndpoint"];   // can swap on failover

Design patterns for this topic

Pattern 1 — "Zone-redundant by default"

  • Intent: make HA the default; pay the small premium for ZR SKUs everywhere.

Pattern 2 — "Active-passive paired region"

  • Intent: affordable DR with minutes-to-hours RTO.

Pattern 3 — "Active-active with Front Door"

  • Intent: lowest RTO; users always hit nearest healthy region.

Pattern 4 — "Stateful tier matches stateless"

  • Intent: never have zone-redundant app over zonal data.

Pattern 5 — "Failover drill quarterly"

  • Intent: rehearse so the DR plan actually works.

Pros & cons / trade-offs

Aspect Pros Cons
Zonal Co-location latency SPOF on zone
Zone-redundant Auto-HA in region ~25-30% cost premium
Geo-redundant Survives region loss Async, RPO seconds-minutes
Active-active Lowest RTO Highest cost, complex consistency
Active-passive Affordable DR RTO minutes-hours
Paired region default Coordinated maintenance Some newer regions unpaired

When to use / when to avoid

  • Use zone-redundant SKUs as default for any prod workload above tier 3.
  • Use GZRS for compliance-critical data and tier 1 services.
  • Use active-active for global SaaS and tier-0 services.
  • Avoid GRS for transient/derivable data — pay for what you actually need to recover.
  • Avoid mixing zonal and zone-redundant tiers — easy to create silent SPOFs.
  • Avoid assuming Microsoft will failover for you — most services require manual initiation.

Interview Q&A

Q1. Region vs zone? Region = geographic area with one or more datacenters. Zone = physically independent DC within a region (own power/cooling/network).

Q2. Paired regions? Microsoft pairs regions (East US ↔ West US) for coordinated maintenance and default geo-replication targets. Newer regions may not be paired.

Q3. Zonal vs zone-redundant? Zonal = pinned to specific zone. Zone-redundant = service auto-spreads across zones for HA.

Q4. LRS / ZRS / GRS / GZRS? LRS: 1 zone. ZRS: across zones. GRS: LRS + async to paired region. GZRS: ZRS + async cross-region.

Q5. RPO for GRS? Async, typically <15 min, often seconds. Failover may lose recent writes.

Q6. How to design for zone failure? Use ZR SKUs for compute, storage, and stateful tier. Don't mix.

Q7. Active-active vs active-passive? Active-active: both regions serve, lowest RTO, highest cost. Active-passive: standby promoted on failover, cheaper.

Q8. Front Door vs Traffic Manager for global? Front Door: L7 anycast, edge cache, WAF. Traffic Manager: DNS-only, supports any protocol.

Q9. Manual vs auto failover? Most services manual; you initiate. Cosmos can auto-failover writes if configured.

Q10. Why not always GZRS? Cost (~2.5× LRS) + write latency. Use only where data loss is unacceptable.

Q11. App Service zone redundancy? Premium v3 plan with zoneRedundant: true and ≥3 instances.

Q12. Read-your-writes after region failover? Some recent writes may be lost (async lag). Design idempotent writes; consider Cosmos multi-region with Session consistency.


Gotchas / common mistakes

  • ⚠️ Zonal disk on zone-redundant VM scale set — disk pin defeats HA.
  • ⚠️ GRS = paired region assumed — verify; some newer regions configurable.
  • ⚠️ No DR drill — paper plans break in practice.
  • ⚠️ Forgetting DNS / config — failover code path references primary endpoints.
  • ⚠️ Writes during failover — async lag = data loss; warn users.
  • ⚠️ Cost surprise — GZRS doubles write cost; not free.
  • ⚠️ Mix of zonal and zone-redundant in same stack.
  • ⚠️ Cosmos not enabled for AZ — by default, region replicas may not span zones; check setting.

Further reading