powershelldba.de · Uwe Janke

Distributed AG On-Prem to Azure over ExpressRoute: Migration vs. Permanent DR

A reader asked a good question after configuring a Distributed Availability Group between an on-prem 2-node AG and an Azure-hosted 2-node AG in Central US, over ExpressRoute, for a multi-terabyte database: is this the right approach — and does the answer change depending on whether it's a migration or a permanent DR setup?

The Setup

Source: 2-node AlwaysOn AG, on-prem (Site A / Site B)
Target: 2-node AlwaysOn AG, Azure — Central US
Link: Distributed Availability Group over ExpressRoute
Database size: Multi-terabyte

This is a textbook Distributed AG topology: two independent WSFC clusters — one on-prem, one in Azure — chained together by a DAG link. See Distributed Availability Groups: Your DBA Tool for Migrations and Multi-Site Deployments for the architecture basics. What's worth breaking apart here is that "is DAG recommended for on-prem to Azure?" actually has two different answers depending on why you're building it.

Topology at a Glance

On-prem to Azure Distributed Availability Group over ExpressRoute An on-prem two-node AG spanning Site A and Site B connects over an ExpressRoute circuit to a two-node AG hosted in Azure Central US, linked by an asynchronous Distributed AG link. ON-PREM — WSFC CLUSTER AG_OnPrem Site A — Primary replica Site B — Secondary (Sync) 2 nodes, TB-scale DB ExpressRoute private circuit DAG link always async commit AZURE CENTRAL US — WSFC CLUSTER AG_Azure VM 1 — Local primary VM 2 — Secondary (Sync) 2 nodes, standby capacity
Two independent WSFC clusters, chained by a Distributed AG. ExpressRoute improves the private link's bandwidth and jitter; it does not make the DAG link synchronous — that's a hard product constraint, not a config choice.

Use Case 1: Migration

DAG is exactly the right tool here, ExpressRoute or not. ExpressRoute mainly makes the delta-catchup phase faster and more predictable — higher, steadier throughput than a site-to-site VPN over the public internet — which shortens the cutover window.

For the full T-SQL and step-by-step cutover sequence, see Zero-Downtime SQL Server Migration with Distributed Availability Groups: A Step-by-Step Runbook.

Use Case 2: Permanent DR

Since source and target here are two independent WSFC clusters — on-prem, and a separate cluster in Azure — DAG is actually the standard, supported pattern for this too. You can't sanely stretch a single WSFC across an on-prem datacenter and an Azure region, so DAG isn't a workaround for permanent DR, it's the correct architecture.

With ExpressRoute in place:

The constraint that surprises people: ExpressRoute is a network upgrade, not a replication-mode upgrade. It makes the async link healthier — smaller queues, more predictable lag — but the DAG link between two AGs is asynchronous by product design in both editions. There is no synchronous option across the DAG boundary, however good the circuit is.

📄 Download the DR Failover & Drill Runbook Template

The permanent-DR counterpart to the migration CutOver Runbook: a fill-in-the-blanks checklist for the two-step failover (internal on-prem failover, then the DAG failover to Azure), the app cutover, a full failback runbook back to on-prem, an abort procedure for a drill gone sideways, a recurring drill log, and an RPO/RTO worksheet. All server names, AG names, and circuit names are placeholders from a sample environment, safe to adapt for your own topology.

⬇ Download distributed-ag-dr-failover-drill-runbook.pdf

7 pages · ~214 KB · PDF · sample environment only, no real infrastructure details

Migration vs. Permanent DR, Side by Side

Aspect DAG for Migration DAG for Permanent DR
Lifespan Temporary bridge, decommissioned after cutover Indefinite, part of standing architecture
ExpressRoute's role Shortens delta-catchup, shrinks cutover window Keeps forwarder queue healthy over the long run
Failover rehearsal Once, right before the real cutover Recurring, on a schedule, including failback
Azure replica cost Short-lived, during migration window Continuous, sized for real production load
Old primary after cutover Torn down or kept briefly as rollback safety net Stays as the permanent primary; Azure is the DR leg
🔧 sqmSQLTool covers the whole DAG lifecycle: Whether you're standing up a DAG for a one-time migration or running one permanently for DR, sqmSQLTool's Distributed AG category wraps the operations you'd otherwise juggle by hand: New-sqmDistributedAvailabilityGroup creates the DAG link, Add-sqmDatabaseToDistributedAg adds databases to it, Test-sqmDistributedAgReadiness checks the forwarder queue and sync state before you promote anything, Get-sqmDistributedAgHealth gives you an ongoing health report for the ExpressRoute-fed forwarder queue, and Invoke-sqmDistributedFailover runs the promotion — useful both for a one-time cutover and for regular DR failover drills.

Full command reference: sqmSQLTool commands.

Summary

Yes to Distributed AG on-prem to Azure over ExpressRoute, for both use cases — but they're not the same project:

Seed manually at TB scale, rehearse the two-step failover before you need it, and size your RPO around "always async" rather than around circuit speed.

For the underlying architecture and failover mechanics, see Distributed Availability Groups: Your DBA Tool for Migrations and Multi-Site Deployments.