Chapter 16 · Always On Availability Groups, Failover Cluster Instances, and HA Design

Windows Server Failover Clustering Concepts, Quorum, Nodes, Networks, and Storage

Understand WSFC quorum, witnesses, failure domains and Linux Pacemaker contrasts before layering SQL Server failover onto cluster authority.

Advanced170–215 minutesWSFC quorum design labSQL Server 2025 CU7 · 17.0.4065.4Compatibility 170 · Developer/Express simulationSSMS 22.8.2 · Last reviewed August 2026

Learning outcomes

ServiceHub now has tested backups, but recovery time is still measured in restore steps. High availability (HA) tries to keep a service reachable through selected infrastructure failures. SQL Server does not solve that problem alone. On Windows, both Failover Cluster Instances (FCIs) and traditional Availability Groups (AGs) rely on Windows Server Failover Clustering (WSFC) for node membership, health and quorum. The Database Engine contributes SQL-specific health and replica state; the cluster decides whether the infrastructure still has authority to keep resources online.

01

Explain WSFC nodes, cluster resources, quorum votes, witnesses, networks and failure domains before discussing SQL failover.

02

Distinguish cluster consensus from SQL Server data synchronization and reject the idea that the Database Engine itself prevents split brain.

03

Use majority arithmetic and failure-domain reasoning to test quorum designs instead of choosing a witness by habit.

04

Contrast Windows WSFC with Linux Pacemaker/external-cluster AG designs and clusterless read-scale designs.

05

Build a free single-instance topology simulation that makes quorum decisions observable without pretending it is a real cluster.

1. The first HA layer is authority, not data replication

A cluster must answer a dangerous question during a partition: which side is allowed to own the service? WSFC uses voting members and optional witnesses to maintain a majority. If a valid majority cannot be established, the cluster takes clustered workloads offline rather than allow competing owners. This is why quorum is part of correctness, not merely uptime tuning.

sql · record the local engine and HA feature context
SELECT SERVERPROPERTY('ProductVersion') AS product_version,       SERVERPROPERTY('ProductUpdateLevel') AS update_level,       SERVERPROPERTY('Edition') AS edition,       SERVERPROPERTY('EngineEdition') AS engine_edition,       SERVERPROPERTY('IsClustered') AS is_fci,       SERVERPROPERTY('IsHadrEnabled') AS hadr_enabled,       SERVERPROPERTY('MachineName') AS machine_name,       SERVERPROPERTY('ServerName') AS server_name;GOSELECT name, compatibility_level, recovery_model_descFROM sys.databasesWHERE name = N'ServiceHubLab';GO
Term Meaning What it does not mean
Node A server participating in the cluster membership protocol A node is not automatically a SQL replica or an FCI owner.
Quorum A majority of currently eligible voting elements Quorum does not mean the database is synchronized.
Witness An additional vote: disk, file share, or cloud witness depending on design A witness is not a SQL Server data replica.
Resource/group Cluster-managed workload object and its dependencies/ownership A healthy cluster resource does not prove application transactions succeeded.
Fencing Preventing a partitioned/failed member from independently owning protected resources Fencing is not the same as a SQL connection timeout.

2. Model the votes before installing SQL Server

sql · create a disposable single-instance HA design lab
USE ServiceHubLab;GOIF SCHEMA_ID(N'lab16') IS NULL EXEC(N'CREATE SCHEMA lab16 AUTHORIZATION dbo;');GODROP TABLE IF EXISTS lab16.FailoverDrill;DROP TABLE IF EXISTS lab16.ReplicaModel;DROP TABLE IF EXISTS lab16.ClusterVote;GOCREATE TABLE lab16.ClusterVote(  member_name sysname NOT NULL PRIMARY KEY,  member_type varchar(12) NOT NULL CHECK (member_type IN ('NODE','WITNESS')),  site_name varchar(30) NOT NULL,  has_vote bit NOT NULL,  is_reachable bit NOT NULL);CREATE TABLE lab16.ReplicaModel(  replica_name sysname NOT NULL PRIMARY KEY,  site_name varchar(30) NOT NULL,  availability_mode varchar(30) NOT NULL,  failover_mode varchar(20) NOT NULL,  role_desc varchar(12) NOT NULL,  synchronization_state varchar(30) NOT NULL,  log_send_queue_kb bigint NOT NULL DEFAULT 0,  redo_queue_kb bigint NOT NULL DEFAULT 0);CREATE TABLE lab16.FailoverDrill(  drill_id bigint IDENTITY PRIMARY KEY,  scenario varchar(80) NOT NULL,  started_at datetime2(3) NOT NULL DEFAULT SYSUTCDATETIME(),  expected_primary sysname NULL,  observed_primary sysname NULL,  data_loss_possible bit NOT NULL,  client_reconnect_required bit NOT NULL,  outcome nvarchar(300) NULL);GO
sql · simulate a two-node cluster with an independent witness
INSERT lab16.ClusterVote(member_name,member_type,site_name,has_vote,is_reachable)VALUES (N'NODE-A','NODE','Primary',1,1),       (N'NODE-B','NODE','Secondary',1,1),       (N'WITNESS','WITNESS','ThirdSite',1,1);GOSELECT member_name,member_type,site_name,has_vote,is_reachableFROM lab16.ClusterVote;SELECT SUM(CASE WHEN has_vote=1 THEN 1 ELSE 0 END) AS configured_votes,       SUM(CASE WHEN has_vote=1 AND is_reachable=1 THEN 1 ELSE 0 END) AS reachable_votesFROM lab16.ClusterVote;GO

With three configured votes, two reachable votes form a majority. Now simulate loss of one node. The remaining node plus witness can still establish authority. Simulate loss of the witness instead: both nodes together still have two of three. The lesson is not “three is magic.” The lesson is that each vote must live in a failure domain that behaves the way your outage model assumes.

sql · simulate a partition and calculate whether the surviving side has majority
UPDATE lab16.ClusterVote SET is_reachable=0 WHERE member_name=N'NODE-B';WITH q AS( SELECT SUM(CASE WHEN has_vote=1 THEN 1 ELSE 0 END) AS configured,        SUM(CASE WHEN has_vote=1 AND is_reachable=1 THEN 1 ELSE 0 END) AS reachable FROM lab16.ClusterVote)SELECT configured,reachable,       FLOOR(configured/2.0)+1 AS votes_required,       CASE WHEN reachable >= FLOOR(configured/2.0)+1 THEN 'QUORUM' ELSE 'NO QUORUM' END AS decisionFROM q;GO

3. Quorum arithmetic is only as good as the failure-domain model

A file-share witness located on the same power circuit and switch as NODE-A is not independent merely because it has a different hostname. A cloud witness introduces internet/Azure-storage dependencies. A disk witness is natural for shared-storage clusters but is usually the wrong model for a multisite AG with no shared data disk. WSFC supports dynamic quorum and witness behavior; do not freeze a simplistic “odd number of nodes” rule into an operational standard.

Wrong approach: manually force quorum during an ordinary node outage.

Forced quorum is a disaster-recovery operation that can explicitly subdivide authority. Using it as a routine availability technique can create split-brain conditions. First determine why the normal cluster lost quorum, identify the authoritative surviving partition, fence or isolate conflicting members, and follow the documented disaster-recovery procedure.

powershell · Windows PowerShell — evidence to collect on a real WSFC
# Optional Windows Server / WSFC topology only.Get-ClusterGet-ClusterNode | Format-Table Name, State, NodeWeight, DynamicWeightGet-ClusterQuorumGet-ClusterGroupGet-ClusterNetwork# Run Test-Cluster before production deployment/change according to Microsoft guidance.

4. Linux changes the cluster manager, not the need for authority

SQL Server availability groups on Linux can use Pacemaker for cluster-managed failover. SQL Server uses CLUSTER_TYPE = EXTERNAL for an external cluster manager, while CLUSTER_TYPE = NONE supports read-scale configurations with no cluster-managed failover. Neither model turns the Database Engine into a consensus system. Pacemaker requires its own quorum/fencing design; clusterless AGs require manual orchestration.

sql · inspect HA state safely even when this local instance has no AG
SELECT SERVERPROPERTY('IsHadrEnabled') AS is_hadr_enabled;SELECT cluster_name,quorum_type_desc,quorum_state_descFROM sys.dm_hadr_cluster;SELECT member_name,member_type_desc,member_state_desc,number_of_quorum_votesFROM sys.dm_hadr_cluster_members;GO-- Zero rows on a standalone/non-AG lab are expected evidence, not an error.

5. Production judgment

Quorum configuration is an infrastructure safety mechanism. Record the cluster version, Windows Server or Linux distribution, node/vote/witness placement, network and storage failure domains, cluster validation status, fencing design, and administrative ownership. Windows Server licensing/infrastructure is required for a real WSFC; Pacemaker deployments require supported Linux and cluster tooling. A single SQL Server Developer/Express instance can teach the reasoning but cannot prove cluster failover.

The next lesson places an actual SQL Server instance under cluster ownership and shows why FCI protects the instance through node failure while still retaining a single shared copy of its database storage.

Check your understanding

  1. Why can a synchronized SQL secondary still be unavailable for automatic failover if cluster quorum is lost?
  2. What is the witness voting on?
  3. Why is a witness in the same failure domain as one node weaker than it first appears?
  4. What is the safety risk of casually forcing quorum?
  5. What changes on Linux compared with WSFC-based AGs?
Review the answers

1. Because synchronization is a data state; automatic ownership/failover also requires a healthy cluster authority.

2. Cluster authority/membership, not the contents of a SQL database.

3. A single site/power/network failure can remove both votes together, defeating the assumed independence.

4. It can allow a partition to establish authority outside normal majority rules and can contribute to split brain unless competing members are fenced.

5. Pacemaker or another supported external cluster manager supplies cluster authority; the Database Engine still does not replace the cluster manager.

Authoritative references

Keep knowledge open

Help the academy stay free and grow.

If these tutorials save you time, a small donation supports new lessons, technical review, diagrams, examples, and long-term maintenance.

ETHEthereum / ERC-20 only
0x716c4Ab160C4B66F31a28AE2448BfF68fc3a2ef0

Send only Ethereum or ERC-20 compatible assets to this address.