Distributed Availability Groups - Das DBA-Tool fuer Migration & Multi-Site
Zwei Cluster, eine Loesung: Wie Distributed AGs Server-Migrationen, OS-Wechsel und standortuebergreifende Disaster Recovery mit minimaler Downtime ermoeglichen - und warum dieses oft unterschaetzte Feature fuer jeden DBA unverzichtbar ist.
Eine verteilte Verfuegbarkeitsgruppe verbindet zwei separate Availability Groups ueber verschiedene Windows Server Failover Cluster (WSFC) hinweg. Die einzelnen AGs koennen sich an unterschiedlichen Orten befinden - ob lokal, in der Public Cloud oder plattformuebergreifend.
Klassische AG
- Alle Knoten in einem WSFC
- Maximal 8 Replicas
- Kein gemeinsamer Storage
- Abhaengig von Windows Cluster
Distributed AG
- Verbindet zwei unabhaengige WSFC
- Bis zu 18 Replicas (9+9)
- Kein gemeinsamer Cluster
- Vollstaendig in SQL Server verwaltet
Der entscheidende Vorteil: Durch die Aufteilung auf zwei Cluster wird der Netzwerk-Traffic ueber das WAN halbiert. Jede AG synchronisiert intern zwischen ihren eigenen Knoten - nur der Forwarding-Knoten schickt Daten an den zweiten Cluster.
- Migration on-premises nach Cloud (Azure, AWS)
- Standortuebergreifende Disaster Recovery (zwei Rechenzentren)
- Upgrade von SQL Server 2016/2019 auf 2022/2025
- Wechsel des Betriebssystems (Windows nach Linux)
- Wechsel der Hardware-Plattform ohne Downtime
In all diesen Szenarien ist die Distributed AG die eleganteste Loesung mit minimaler Downtime. Der Konfigurationsaufwand ist hoeher als bei einer klassischen AG - zahlt sich aber durch Flexibilitaet und geringere Netzwerklasten aus.
Datenbanken lassen sich live mit minimaler Downtime von lokalen Systemen nach Azure, AWS oder in neue Rechenzentren verschieben. Die DAG synchronisiert im Hintergrund - beim Cutover erfolgt ein einfacher Failover. Die Applikation bemerkt den Wechsel kaum.
Da beide AGs vollstaendig unabhaengig sind, kann die Ziel-AG eine neuere SQL-Version oder ein anderes Betriebssystem nutzen. SQL 2016 auf Windows nach SQL 2025 auf Linux - ohne Produktionsausfall.
Software
- SQL Server Enterprise (ab 2016)
- Auf beiden Seiten identisch
- Database Mirroring Endpoints
Netzwerk
- Port 1433 und 5022 offen
- Namensaufloesung funktioniert
- FQDN fuer Listener-URL verwenden
Authentifizierung
- Service Account auf beiden Seiten
- GRANT CONNECT ON ENDPOINT
- GRANT CREATE ANY DATABASE
Die Distributed AG laeuft waehrend des Seedens auf ASYNCHRONOUS_COMMIT - das minimiert die Netzwerklast. Vor dem geplanten Failover muss auf SYNCHRONOUS_COMMIT umgestellt werden um sicherzustellen dass kein Datenverlust entsteht.
Wer auf dem Zielnode die Datenbankzustaende prueft, sieht haeufig eine Kombination die auf den ersten Blick widersprüchlich wirkt:
| Spalte | Wert | Bedeutung |
|---|---|---|
synchronization_state_desc |
SYNCHRONIZED | Log ist aufgeholt - kein Rueckstand zum Primary |
database_state_desc |
IN_RECOVERY | Secondary wendet permanent Log-Bloecke an |
ONLINE, Secondary zeigt IN_RECOVERY - beide koennen gleichzeitig SYNCHRONIZED sein.
Fazit: Alle Datenbanken SYNCHRONIZED = Failover kann ausgefuehrt werden - unabhaengig davon ob database_state_desc IN_RECOVERY zeigt.
Nach dem Failover nimmt die alte AG die Rolle Secondary in der Distributed AG ein. Sie laeuft weiter - die Datenbanken sind synchronisiert aber nur lesbar. Das ist kein Fehler, sondern der eingebaute Rollback-Plan.
| Ebene | Zustand nach Failover |
|---|---|
| Distributed AG Rolle | SECONDARY |
| Lokale AG intern | Primaer-Knoten bleibt Primaer in OnPremAG |
| Datenbanken | SYNCHRONIZED - nur lesbar |
| Schreibzugriff | Nicht moeglich |
ALTER AVAILABILITY GROUP [DistributedAG] FAILOVER auf dem alten Primary.| Problem | Details & Loesung |
|---|---|
| Keine GUI | Distributed AGs lassen sich nicht ueber den SSMS-Assistenten erstellen. Rein T-SQL - oder sqmSQLTool verwenden. |
| FQDN Pflicht | LISTENER_URL muss den vollstaendigen DNS-Namen enthalten (TCP://server.domain.local:5022). Kurzname schlaegt fehl. |
| Service Account | Der Service Account des Quellservers muss auf dem Zielserver als Login existieren und GRANT CONNECT ON ENDPOINT haben. |
| Netzwerk & Firewall | Port 5022 zwischen beiden Clustern muss offen sein. Keine Deep-Inspection, kein Bandwidth-Throttling. |
| Systemdatenbanken | Logins, SQL Agent Jobs und Linked Server migrieren nicht automatisch. dbatools hilft: Copy-DbaLogin, Copy-DbaAgentJob. |
Mit SQL Server 2025 wird die interne Synchronisation der Distributed AG weiter optimiert:
Netzwerk-Effizienz
Weniger Bandbreitenverbrauch bei der Replikation ueber lange Distanzen durch verbesserte Komprimierung.
Cloud-Performance
Bessere Performance in Cloud- und Multi-Datacenter-Szenarien durch optimierte Latenz-Kompensation.
Abwaertskompatibel
Vollstaendige Kompatibilitaet zu bestehenden Distributed AGs - kein Rebuild erforderlich.
Nach dem Distributed AG Failover laufen alle Schreibzugriffe auf dem neuen Cluster. Clients verbinden sich aber noch ueber den alten Listener. Der Listener muss zum neuen Cluster wandern - und dabei lauern die groessten Fallstricke.
Listener_PROD (der alte)
- Liegt auf dem alten Cluster
- Der DNS-Name den alle Applikationen kennen
- Verbindungsstring in jeder Config-Datei
- Darf sich nie aendern - sonst muessen alle Apps angepasst werden
- Ziel: zum neuen Cluster wandern
Listener_TEMP (der neue)
- Liegt auf dem neuen Cluster
- Wurde beim Aufbau der neuen AG benoetigt
- Die Distributed AG braucht eine LISTENER_URL auf beiden Seiten
- Nur intern verwendet - keine Applikation kennt ihn
- Wird nach Migration geloescht
Die Distributed AG kommuniziert zwischen den Clustern ausschliesslich ueber Listener-URLs. Beim Erstellen der Distributed AG muss fuer beide AGs eine LISTENER_URL angegeben werden. Da Listener_PROD noch auf dem alten Cluster liegt, braucht die neue AG einen eigenen temporaeren Listener - nur fuer den Aufbau der Distributed AG Verbindung.
Ab jetzt ist AG_NEW der neue Primary. Clients verbinden aber noch ueber Listener_PROD auf den alten Cluster!
Das AD-Team hat die Cluster-Ressource bereits angelegt - daher OHNE IP-Angabe. SQL Server findet die vorhandene Cluster-Ressource automatisch.
Get-ClusterResource | Where-Object Name -eq 'Listener_PROD'DNS-TTL vorab auf 300 Sekunden reduzieren - dann propagiert die neue IP schneller.
| Schritt | Wer | Wo |
|---|---|---|
| Distributed AG Failover | DBA | SQLNODE1 (alter Primary) |
| REMOVE LISTENER | DBA zuerst! | SQLNODE1 (alte AG) |
| Cluster-Ressource tauschen + SPNs | AD-Team | Beide Cluster |
| ADD LISTENER | DBA | SQLNODE3 (neue AG) |
| Validierung + DNS flush | DBA + App-Team | SQLNODE3 + Clients |
Die Distributed AG ist so konzipiert, dass ein Rueckweg immer moeglich ist - solange die richtige Reihenfolge eingehalten und nichts voreilig geloescht wird.
Der Failover wurde ausgefuehrt, aber auf dem neuen System gibt es Probleme. Die alte AG laeuft noch als Secondary - Rueckfall ist einfach:
Listener_PROD wurde bereits auf den neuen Cluster verschoben, aber Clients koennen nicht verbinden oder Datenbanken sind nicht erreichbar:
Klassischer Fehler: Das AD-Team hat die Cluster-Ressource geloescht bevor der Listener aus der SQL AG entfernt wurde. Alle Datenbanken sind in RECOVERY MODE.
| Objekt | Loeschen erst wenn... |
|---|---|
| Distributed AG | Neue AG laeuft stabil, alle Tests bestanden, Produktionsphase > 24h |
| AG_OLD (alte AG) | Distributed AG bereits geloescht, keine Abhaengigkeiten mehr |
| Listener_TEMP | Listener_PROD auf neuer AG aktiv und getestet, keine App verwendet Listener_TEMP |
| Alte Server | Alles oben erledigt + Backups vorhanden + Change-Freigabe |
Alle beschriebenen Schritte lassen sich mit sqmSQLTool automatisieren. Die Funktionen uebernehmen FQDN-Konfiguration, Service Account Grants, AutoSeed-Berechtigungen und Validierung - und ersetzen die manuellen T-SQL-Bloecke aus diesem Artikel.
| Schritt | sqmSQLTool Funktion | Beschreibung |
|---|---|---|
| Distributed AG aufbauen | New-sqmDistributedAvailabilityGroup |
Erstellt die Distributed AG auf Primary und Secondary inkl. FQDN, Service Account Login, GRANT CONNECT und GRANT CREATE ANY DATABASE. |
| Datenbank hinzufuegen | Add-sqmDatabaseToDistributedAg |
Fuegt eine einzelne Datenbank zur Distributed AG hinzu und startet AutoSeed. |
| Synchronisation ueberwachen | Get-sqmDistributedAgHealth |
Health-Report fuer alle Distributed AGs: Sync-Status, LSN-Lag, Replica-Zustand, Datenbankstatus. Output als TXT und CSV. |
| Failover-Bereitschaft pruefen | Test-sqmDistributedAgReadiness |
Prueft alle Voraussetzungen vor dem Failover. Gibt Readiness-Score 0-100 zurueck. Empfehlung: erst ab Score > 90 failovern. |
| Failover durchfuehren | Invoke-sqmDistributedFailover |
Kontrollierter Failover mit Sicherheitspruefungen. Benoetigt explizites -Force oder ShouldProcess-Bestaetigung. |
| Listener vorbereiten | Prepare-sqmListenerForMigration |
Entfernt SQL AG-Abhaengigkeit vom Listener BEVOR das Cluster-Team die Ressource loescht. Verhindert RECOVERY MODE auf allen Datenbanken. |
| Listener abschliessen | Complete-sqmListenerMigration |
Re-registriert den Listener nach Cluster-Neuanlage. Validiert dass alle Datenbanken ONLINE zurueckkehren. |
| Konfiguration exportieren | Export-sqmAlwaysOnConfiguration |
Exportiert die vollstaendige AG-Konfiguration als Dokumentation vor und nach der Migration. |
https://github.com/JankeUwe/sqmSQLTool
Empfehlung fuer den Einsatz
Skriptvorlagen verwenden, Failover gruendlich in einer Staging-Umgebung testen. sqmSQLTool automatisiert den kompletten Aufbau inklusive FQDN-Konfiguration, Service Account Grants und AutoSeed-Berechtigungen.
sqmSQLTool auf GitHub