SQL Server AlwaysOn & WFC-Quorum
Vor- und Nachteile im Überblick
Ein strukturierter Leitfaden über die drei HA-Architekturen – Availability Groups, Failover Cluster Instances und deren Kombination – mit und ohne WSFC-Quorum, Lizenzbewertung sowie konkreten PowerShell-Beispielen für SQL-Administratoren.
Grundlagen – WFC, AG und FCI
SQL Server AlwaysOn ist ein Überbegriff für zwei technisch eigenständige HA-Konzepte: die Availability Groups (AG) auf Datenbankebene und die Failover Cluster Instances (FCI) auf Instanzebene. Beide setzen auf den Windows Server Failover Cluster (WSFC) auf – einem verteilten Dienst, der Knoten, Ressourcen und das Quorum verwaltet.
Availability Group (AG)
Eine AG bündelt eine Gruppe von Benutzerdatenbanken, die gemeinsam auf synchronisierte Replikate gespiegelt werden. Der Primär-Replikat nimmt Lese-/Schreibzugriffe entgegen; Sekundär-Replikate können für Lesezugriffe, Backup und Reporting genutzt werden. Bis zu 9 Sekundär-Replikate (SQL Server 2022) sind möglich, davon bis zu 3 synchron.
Failover Cluster Instance (FCI)
Eine FCI präsentiert dem Netzwerk eine einzelne virtuelle SQL Server-Instanz hinter einer virtuellen IP. Die Datenbankdateien liegen auf einem gemeinsamen Speicher (Shared Disk, CSV, SMB 3.0). Bei einem Knotenausfall übernimmt ein anderer Knoten die virtuelle IP und den freigegebenen Speicher – der SQL Server startet auf dem neuen Knoten neu. Es findet kein synchrones Daten-Streaming statt.
AG + FCI kombiniert
In Enterprise-Umgebungen werden beide Technologien kombiniert: FCIs als hochverfügbare Knoten innerhalb einer AG. So besteht Schutz sowohl vor Knotenausfällen (FCI-Ebene) als auch vor Standortausfällen (AG-Ebene).
| Kriterium | Availability Group | Failover Cluster Instance | AG auf FCI-Knoten |
|---|---|---|---|
| Ebene | Datenbank-Gruppe | SQL-Instanz | Instanz + Datenbank |
| Speichermodell | Lokal je Knoten | Shared Disk / CSV | Shared Disk pro FCI + Replikation |
| RTO | Sehr gering (Sekunden) | Mittel (Neustart: 30–120 s) | Sehr gering |
| RPO | 0 (synchron) / minimal (asynchron) | Letzter Commit auf Shared Storage | 0 (synchron) |
| Read-Scale-Out | Ja (Sekundär lesbar) | Nein | Ja |
| Systemdatenbanken HA | Nein | Ja | Ja |
| Automatisches Failover | Ja (mit Quorum) | Ja (mit Quorum) | Ja |
| WSFC erforderlich | Optional (Clusterless möglich) | Immer | Immer |
WSFC Quorum-Varianten
Das Quorum verhindert Split-Brain-Szenarien: Nur die Partition, die eine Mehrheit der Quorum-Stimmen hält, darf weiterhin als aktiver Cluster operieren. SQL Server selbst kennt kein eigenes Quorum-Protokoll – er verlässt sich vollständig auf den WSFC.
Node Majority
Nur Knoten stimmen. Kein Witness-Element. Failover solange Mehrheit erreichbar.
Node & Disk Witness
Knoten + freigegebener Cluster-Datenträger als Quorum-Disk. Klassisch für 2-Knoten.
Node & File Share Witness
SMB-Dateifreigabe als Witness. Kein eigener Speicher nötig; geeignet für Multi-Site.
Cloud Witness
Azure Blob Storage als Witness (ab WS 2016). Ideal für hybride Szenarien.
Node & Disk Witness (CSV)
Cluster Shared Volume kombiniert Datenspeicher und Quorum-Stimme – typisch bei FCI.
Ohne Quorum (FORCE)
ForceQuorum startet den Cluster erzwungen ohne Mehrheit. Ausschließlich für Notfall-DR.
| Quorum-Modell | Knotenanzahl | Witness | Ausfalltoleranz | Empfehlung |
|---|---|---|---|---|
| Node Majority | Ungerade (3, 5, 7 …) | Keiner | (n−1)/2 Knoten | Gut für ≥ 3 Knoten |
| Node Majority | Gerade (2, 4 …) | Keiner | Kritisch bei Gleichstand | Vermeiden |
| Node & Disk Witness | Gerade | Shared Disk | n/2 Knoten + Witness | Klassisch, SPOF |
| Node & File Share Witness | Beliebig | SMB Share | n/2 Knoten + Witness | Empfohlen |
| Cloud Witness | Beliebig | Azure Blob | n/2 Knoten + Witness | Empfohlen ab WS 2016 |
| ForceQuorum | Beliebig | — | Keiner (manuell) | Nur Notfall-DR |
# Aktuellen Quorum-Modus anzeigen
Get-ClusterQuorum -Cluster "SQLCLUSTER01"
# File Share Witness konfigurieren
Set-ClusterQuorum -Cluster "SQLCLUSTER01" `
-NodeAndFileShareMajority "\\fileserver\quorum_share"
# Cloud Witness setzen (ab Windows Server 2016)
Set-ClusterQuorum -Cluster "SQLCLUSTER01" `
-CloudWitness `
-AccountName "mystorage" `
-AccessKey "<Base64-Key>" `
-Endpoint "core.windows.net"
# Knotengewichtung prüfen (Dynamisches Quorum)
Get-ClusterNode | Select-Object Name, NodeWeight, State
Availability Groups mit Quorum
Der Standardbetrieb einer AG setzt ein funktionierendes WSFC-Quorum voraus. Nur so kann ein automatisches Failover sicher ausgeführt werden: Der Cluster vergewissert sich, dass eine Mehrheit der Stimmen vorliegt, bevor das Sekundär-Replikat zur neuen Primärinstanz promoted wird.
✔ Vorteile
- Automatisches Failover ohne manuellen Eingriff
- Split-Brain-Schutz durch Quorum-Abstimmung
- Health-Monitoring auf Cluster- und SQL-Ebene
- Lesbare Sekundär-Replikate für Reporting / Backup
- Bis zu 9 Replikate (SQL 2022), davon 3 synchron
- Listener verteilt Leseverkehr automatisch (Read-Scale)
- Automatisches Page Repair über Partnerreplikat
- DTC-Transaktionen unterstützt (ab SQL 2016 SP2)
✗ Nachteile
- Systemdatenbanken (master, msdb) nicht repliziert
- Login-Synchronisation muss manuell / per Skript erfolgen
- WSFC-Infrastruktur und AD-Abhängigkeit
- Netzwerk-Overhead durch synchrone Replikation
- Synchrones Failover erhöht Transaktionslatenz minimal
- Asynchrones Replikat: potenzieller Datenverlust beim Failover
Synchron vs. asynchron – Replikationsmodi
| Modus | Commit-Verhalten | RPO | RTO | Auto Failover | Einsatz |
|---|---|---|---|---|---|
| Synchronous-Commit | Warten auf Remote-Acknowledge | 0 – kein Datenverlust | Sekunden | Ja | Primär-Site / LAN / Datacenter |
| Asynchronous-Commit | Sofortiger Commit, kein Warten | Minimal (letzter Log-Block) | Minuten (manuell) | Nein | DR-Site / WAN / Geo-Redundanz |
# Neue Availability Group anlegen (synchron, Auto Failover)
New-DbaAvailabilityGroup `
-Primary "SQL-NODE1" `
-Secondary "SQL-NODE2" `
-Name "AG_PROD" `
-Database "AppDB", "ReportDB" `
-SeedingMode "Automatic" `
-AvailabilityMode "SynchronousCommit" `
-FailoverMode "Automatic" `
-Confirm:$false
# Asynchrones DR-Replikat an bestehende AG anfügen
Add-DbaAgReplica `
-SqlInstance "SQL-NODE1" `
-Replica "SQL-DR" `
-AvailabilityGroup "AG_PROD" `
-AvailabilityMode "AsynchronousCommit" `
-FailoverMode "Manual"
# AG-Gesundheitsstatus abrufen
Get-DbaAgDatabase -SqlInstance "SQL-NODE1" -AvailabilityGroup "AG_PROD" |
Select-Object Name, SynchronizationState, IsJoined, IsSuspended
Availability Groups ohne Quorum (Clusterless / Force)
Seit SQL Server 2017 können AGs auch ohne WSFC betrieben werden (Clusterless AG). Daneben gibt es den Notfallbefehl FORCE_FAILOVER_ALLOW_DATA_LOSS für Situationen, in denen der Cluster kein Quorum mehr hat und der Primär dauerhaft nicht erreichbar ist.
Clusterless AG (ab SQL Server 2017)
✔ Vorteile
- Kein WSFC / Active Directory erforderlich
- Plattformübergreifend: Windows + Linux in einer AG
- Read-Scale ohne Failover-Automatismus
- Einfacheres Setup für reine Replikations-Szenarien
- Geringere Infrastrukturkosten
✗ Nachteile
- Kein automatisches Failover möglich
- Kein AG-Listener ohne WSFC (keine virtuelle IP)
- Manuelles Failover mit potenziellem Datenverlust
- Kein Health-Monitoring durch Windows-Cluster
- Nur für Read-Scale- oder DR-Szenarien geeignet
Force-Failover (FORCE_FAILOVER_ALLOW_DATA_LOSS)
| Szenario | Betriebsmodus | Auto Failover | Listener | Datenverlustrisiko | Einsatz |
|---|---|---|---|---|---|
| Standard AG + WSFC | Mit Quorum | Ja | Ja | Keiner (synchron) | Produktion |
| Clusterless AG | Ohne WSFC | Nein | Nein | Minimal (async) | Read-Scale, Linux, Cross-Plattform |
| ForceQuorum + Force Failover | Quorum erzwungen | Nein | Manuell | Hoch (async Replikat) | Nur Disaster Recovery |
-- !! Nur im Notfall !!
-- Schritt 1: WSFC Quorum auf dem verbleibenden Knoten erzwingen
Start-ClusterNode -FixQuorum
-- Schritt 2: Force Failover auf dem Sekundär-Replikat ausführen
ALTER AVAILABILITY GROUP [AG_PROD]
FORCE_FAILOVER_ALLOW_DATA_LOSS;
-- Schritt 3: Nach Wiederherstellung – alten Primär als Sekundär joinen
ALTER DATABASE [AppDB] SET HADR RESUME;
ALTER AVAILABILITY GROUP [AG_PROD] SET (ROLE = SECONDARY);
-- Clusterless AG erstellen (SQL Server 2017+, CLUSTER_TYPE = NONE)
CREATE AVAILABILITY GROUP [AG_READSCALE]
WITH (CLUSTER_TYPE = NONE)
FOR DATABASE [AppDB]
REPLICA ON
N'SQL-NODE1' WITH (ENDPOINT_URL = N'TCP://node1:5022',
AVAILABILITY_MODE = SYNCHRONOUS_COMMIT, FAILOVER_MODE = MANUAL),
N'SQL-NODE2' WITH (ENDPOINT_URL = N'TCP://node2:5022',
AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT, FAILOVER_MODE = MANUAL);
Failover Cluster Instance (FCI)
Die FCI bietet HA auf Instanzebene. Da alle Knoten denselben freigegebenen Speicher nutzen, entfällt die Datenreplikation – der Failover ist ein Neustart der SQL-Instanz auf einem anderen Knoten unter Übernahme der gemeinsamen Ressourcen (virtuelle IP, Name, Speicher).
✔ Vorteile FCI
- Alle Systemdatenbanken (master, msdb) sind HA-fähig
- Logins, Jobs, Linked Server liegen auf dem Shared Storage
- Transparenz für Applikationen (virtuelle IP / Name)
- Kein datenbankspezifisches Setup nötig
- Einfaches Lizenzierungsmodell (Aktiv/Passiv mit SA)
- Passiv-Knoten ohne SQL Server-Lizenz (SA-berechtigt)
✗ Nachteile FCI
- Shared Storage = potenzieller Single Point of Failure
- RTO höher als AG (Instanz-Neustart: 30–120 s)
- Passiv-Knoten im Aktiv/Passiv-Modus ohne Nutzung
- Shared Disk erfordert SAN / iSCSI / SMB 3.0
- Kein Read-Scale-Out (kein Sekundär-Lesezugriff)
- Kein georedundantes Failover ohne AG-Kombination
Aktiv/Aktiv vs. Aktiv/Passiv FCI
| Modell | Instanzen | Ressourcennutzung | Lizenz Passiv-Knoten | Failover-Ziel |
|---|---|---|---|---|
| Aktiv / Passiv (1:1) | 1 aktive Instanz | 50 % (Passiv wartet) | Lizenzfrei mit SA | Passiv-Knoten übernimmt |
| Aktiv / Aktiv (N+M) | Mehrere Instanzen | Hoch (alle Knoten aktiv) | Jeder Knoten benötigt Lizenz | Gegenseitig / dediziert |
| Aktiv / Passiv (N+1) | N aktive, 1 passiv | Effizient | 1 Lizenz für Passiv (SA) | 1 Passiv für alle Aktiven |
# SQL Server Cluster-Ressourcen anzeigen
Get-ClusterResource | Where-Object { $_.ResourceType -eq "SQL Server" } |
Select-Object Name, State, OwnerNode
# Aktuellen Eigentümerknoten ermitteln
Get-ClusterGroup -Cluster "SQLCLUSTER01" |
Where-Object { $_.Name -like "SQL*" } |
Select-Object Name, OwnerNode, State
# Geplanten Knotenwechsel durchführen
Move-ClusterGroup -Name "SQL Server (MSSQLSERVER)" `
-Node "SQL-NODE2"
# Cluster-Informationen per SMO / dbaTools abrufen
$srv = Connect-DbaInstance -SqlInstance "SQLCLUSTER01"
$srv.IsClustered
$srv.ClusterName
$srv.ClusterQuorumState
Lizenzmodelle – Aktiv/Passiv & Software Assurance
Die Wahl des HA-Modells hat direkte Auswirkungen auf die SQL Server-Lizenzkosten. Microsoft gewährt unter bestimmten Bedingungen Lizenzerleichterungen für Hochverfügbarkeits-Replikate.
| Szenario | Technologie | SA erforderlich | Passiv lizenzfrei | Anzahl | Bedingung |
|---|---|---|---|---|---|
| FCI Aktiv/Passiv (1:1) | FCI | Ja | Ja | 1 | Passiv-Knoten: keine aktiven Abfragen |
| FCI Aktiv/Aktiv | FCI | — | Nein | 0 | Alle Knoten benötigen Lizenz |
| AG – 1 synchrones Replikat passiv | AG | Ja | Ja | 1 | Sekundär nicht für Reads genutzt |
| AG – Lesbare Sekundäre | AG | — | Nein | 0 | Read-Zugriff = aktive Nutzung = Lizenz |
| AG – DR-Replikat (asynchron, passiv) | AG | Ja | Ja | 1 | Kein aktiver Zugriff auf das DR-Replikat |
| Enterprise – unbegrenzt passive Replikate | AG / FCI | Ja (Ent.) | Ja | Unbegrenzt | Enterprise Edition + SA; kein aktiver Zugriff |
Entscheidungsmatrix – Welche Architektur wann?
| Anforderung | AG + Quorum | AG ohne Quorum | FCI | AG auf FCI |
|---|---|---|---|---|
| RPO = 0 (kein Datenverlust) | ✔ Synchron | ✗ | ⚠ Shared Storage | ✔ |
| Automatisches Failover | ✔ | ✗ | ✔ | ✔ |
| Systemdatenbanken HA | ✗ | ✗ | ✔ | ✔ |
| Read-Scale-Out | ✔ | ✔ | ✗ | ✔ |
| Georedundanz / Multi-Site | ✔ Asynchron | ✔ manuell | ✗ | ✔ |
| Kein Shared Storage erforderlich | ✔ | ✔ | ✗ | ✗ |
| Linux / Cross-Plattform | ⚠ Pacemaker | ✔ CLUSTER_TYPE=NONE | ⚠ Pacemaker | ✗ |
| Passiv-Knoten lizenzfrei (SA) | ✔ 1 passiv | ✗ | ✔ Aktiv/Passiv | ✔ |
| RTO < 30 Sekunden | ✔ | ✗ | ⚠ 30–120 s | ✔ |
| Geringe Infrastrukturkosten | ✔ | ✔ | ✗ SAN/iSCSI | ✗ höchste Kosten |
# Alle AGs mit Replikat-Details
Get-DbaAvailabilityGroup -SqlInstance "SQL-NODE1" |
Select-Object Name, PrimaryReplica, AutomatedBackupPreference,
HealthCheckInterval, FailureConditionLevel
# Synchronisierungszustand aller AG-Datenbanken
Get-DbaAgDatabase -SqlInstance "SQL-NODE1" |
Format-Table AvailabilityGroup, Name, SynchronizationState,
SynchronizationHealth, EstimatedDataLoss,
EstimatedRecoveryTime -AutoSize
# Replikat-Latenz und Log-Send-Queue (relevant für async DR)
Get-DbaAgReplica -SqlInstance "SQL-NODE1" -AvailabilityGroup "AG_PROD" |
Select-Object Name, Role, AvailabilityMode, FailoverMode,
LogSendQueueSize, RedoQueueSize, LastSentTime, LastRedoneTime