Mastodon
Windows Server 2025BlogMicrosoft

How to Configure Cluster Quorum in Windows Server 2025

How to Configure Cluster Quorum in Windows Server 2025

Cluster quorum configuration represents one of the most critical architectural decisions in Windows Server 2025 failover clustering deployments. This comprehensive guide delivers expert-level instruction on configuring all three witness types—cloud witness (Azure Storage), disk witness (shared storage), and file share witness (SMB)—complete with PowerShell automation, troubleshooting procedures, and production-tested best practices.

Whether you’re implementing a two-node Hyper-V cluster, a multi-site stretched cluster, or a Storage Spaces Direct deployment, proper quorum configuration prevents split-brain scenarios that could cause catastrophic data corruption. This tutorial equips IT professionals with the knowledge to design, implement, and maintain highly available Windows Server 2025 clusters that deliver genuine business value through maximized uptime.

Understanding Cluster Quorum Fundamentals

What is Cluster Quorum?

In Windows Server failover clustering, quorum is a voting mechanism that determines how many failures a cluster can sustain while remaining operational. Each node in the cluster receives one vote, and the quorum witness (if configured) provides an additional vote. For the cluster to continue running, more than half of the total votes must be available—calculated as floor(TotalVotes / 2) + 1.

This majority-based voting system prevents “split-brain” scenarios where isolated cluster partitions each believe they represent the authoritative cluster state. Without proper quorum, such scenarios could lead to data corruption when multiple partitions simultaneously attempt to modify the same resources.

The Mathematics of Quorum

Consider these examples:

3-node cluster (no witness)

  • Total votes: 3
  • Required: floor(3/2) + 1 = 2 votes
  • Failure tolerance: Can lose 1 node

4-node cluster with witness

  • Total votes: 5
  • Required: floor(5/2) + 1 = 3 votes
  • Failure tolerance: Can lose 2 nodes

2-node cluster with witness

  • Total votes: 3
  • Required: floor(3/2) + 1 = 2 votes
  • Failure tolerance: Can lose 1 node OR the witness

Why Witnesses Matter

For clusters with even numbers of nodes, configuring a witness is recommended to avoid tie scenarios during failures. The witness provides the deciding vote that enables one partition to achieve majority while the other shuts down gracefully.

Without a witness, a two-node cluster losing one node would have only 1 of 2 votes (50%), failing to meet the >50% requirement. Adding a witness creates 3 total votes, allowing the surviving node plus witness (2 of 3 votes, 67%) to maintain quorum.

2. Witness Types and Selection Criteria

Windows Server 2025 supports three witness implementations, each optimized for specific deployment scenarios.

Cloud Witness (Azure Storage)

Cloud witness uses Azure Blob Storage to store a small blob file that acts as the quorum witness, eliminating the need for a third physical datacenter.

Advantages:

  • No on-premises infrastructure required
  • Built-in Azure redundancy
  • Minimal cost (typically under $1 monthly)
  • Ideal for multi-site stretched clusters
  • Simple configuration and maintenance

Best For:

  • Clusters with reliable internet connectivity
  • Organizations with Azure subscriptions
  • Two-site deployments without a third location
  • Cloud-first strategies

Requirements:

  • Azure subscription and storage account
  • HTTPS (port 443) outbound connectivity
  • Access to Azure Blob Storage endpoints

Disk Witness (Shared Storage)

A disk witness uses a small shared disk accessible by all cluster nodes to maintain cluster configuration information.

Advantages:

  • Highest reliability when storage is highly available
  • No external dependencies or internet requirement
  • Traditional, well-understood model
  • Works in air-gapped environments

Best For:

  • Failover Cluster Instances (FCIs) with shared storage
  • Single-site clusters with SAN/iSCSI
  • Azure deployments using Azure shared disks
  • Environments requiring offline operation

Requirements:

  • Shared storage infrastructure (SAN, iSCSI, Azure shared disks)
  • Minimum 512 MB disk size
  • SCSI-3 Persistent Reservations support

File Share Witness (SMB)

A file share witness uses an SMB file share hosted on a separate server to maintain cluster information in a log file.

Advantages:

  • No shared storage required
  • Can use existing file servers
  • Geographically flexible placement
  • Works with NAS devices

Best For:

  • Clusters without shared storage
  • Three-site deployments (witness in third site)
  • Environments with unreliable internet
  • Multi-site with replicated storage

Requirements:

  • SMB 2.0 or later
  • Separate file server or NAS device
  • Proper permissions (CNO Full Control)
  • Network connectivity on port 445

3. Prerequisites and Planning

System Requirements

Operating System:

  • Windows Server 2025 Standard or Datacenter
  • Failover Clustering feature installed
  • PowerShell 5.1 or later

Network Requirements:

  • Private cluster network configured
  • Name resolution (DNS) functional
  • For cloud witness: HTTPS (443) to Azure
  • For file share witness: SMB (445) to file server

Active Directory (domain-joined clusters):

  • Cluster Name Object (CNO) created
  • Proper OU permissions
  • CNO has Create Computer Objects rights

Planning Your Configuration

For 2-node clusters: Witness is essential—without it, losing one node causes cluster failure.

For odd-numbered clusters (3, 5, 7): Node Majority without witness works well, but adding a witness provides one additional failure tolerance.

For even-numbered clusters (4, 6, 8): Configure a witness to maintain an odd total vote count and avoid tie scenarios.

Geographic considerations:

  • Single site: Cloud witness or disk witness
  • Two sites: Cloud witness (eliminates third datacenter need)
  • Three+ sites: File share witness in third site or cloud witness

4. Configuring Cloud Witness (Azure Storage)

Step 1: Create Azure Storage Account

Cloud witness requires an Azure Storage account where the cluster writes configuration information.

Using Azure Portal:

  1. Navigate to portal.azure.com
  2. Select Create a resourceStorage account
  3. Configure:
    • Storage account name: Globally unique (e.g., “cluster01witness2025”)
    • Region: Closest to cluster nodes
    • Performance: Standard
    • Redundancy: Locally-redundant storage (LRS)
  4. Click Review + Create

Using PowerShell:

powershell

# Connect to Azure
Connect-AzAccount

# Define variables
$resourceGroupName = "ClusterWitness-RG"
$location = "East US"
$storageAccountName = "cluster01witness2025"

# Create storage account
New-AzStorageAccount `
    -ResourceGroupName $resourceGroupName `
    -Name $storageAccountName `
    -Location $location `
    -SkuName Standard_LRS `
    -Kind StorageV2

Step 2: Retrieve Access Keys

In the Azure Portal:

  1. Navigate to your storage account
  2. Under Security + networking, select Access keys
  3. Click Show keys
  4. Copy the key1 (primary access key)

Step 3: Configure Cloud Witness on Cluster

Using Failover Cluster Manager:

  1. Open Failover Cluster Manager
  2. Select your cluster → Configure Cluster Quorum Settings
  3. Select Select the quorum witnessNext
  4. Select Configure a cloud witnessNext
  5. Enter:
    • Azure Storage account name
    • Primary access key
  6. Click NextFinish

Using PowerShell:

powershell

# Configure cloud witness
$clusterName = "CLUSTER01"
$storageAccountName = "cluster01witness2025"
$storageAccountKey = "PASTE_YOUR_PRIMARY_KEY_HERE"

Set-ClusterQuorum -Cluster $clusterName `
    -CloudWitness `
    -AccountName $storageAccountName `
    -AccessKey $storageAccountKey

# Verify configuration
Get-ClusterQuorum -Cluster $clusterName

Expected output:

Cluster        : CLUSTER01
QuorumResource : Cloud Witness  
QuorumType     : NodeAndCloudMajority

Step 4: Verify Operation

powershell

# Check witness resource status
Get-ClusterResource | Where-Object {$_.ResourceType -eq "Cloud Witness"}

# Verify blob creation in Azure Portal
# Navigate to storage account → Containers → msft-cloud-witness

# Test connectivity
Test-NetConnection -ComputerName "$storageAccountName.blob.core.windows.net" -Port 443

5. Configuring Disk Witness (Shared Storage)

Step 1: Prepare Shared Disk

Requirements:

  • Size: Minimum 512 MB (1 GB recommended)
  • File system: NTFS or ReFS
  • Partition: GPT recommended
  • Accessibility: Visible to all cluster nodes

For Azure Shared Disks:

  1. Create shared disk in Azure Portal:
    • Disks+ Create
    • Size: 4 GiB Standard SSD
    • Enable Share this disk
    • Set max shares = node count
  2. Attach to all cluster VMs

Initialize disk (one node):

powershell

# List new disks
Get-Disk | Where-Object {$_.PartitionStyle -eq "RAW"}

# Initialize and format  
$disk = Get-Disk -Number 2  # Replace with actual disk number
Initialize-Disk -Number $disk.Number -PartitionStyle GPT
New-Partition -DiskNumber $disk.Number -UseMaximumSize -AssignDriveLetter
Format-Volume -DriveLetter E -FileSystem NTFS -NewFileSystemLabel "WitnessDisk"

Step 2: Add Disk to Cluster

Using Failover Cluster Manager:

  1. Right-click StorageAdd Disk
  2. Select the witness disk → OK
  3. Rename disk to “Witness Disk”

Using PowerShell:

powershell

# Add disk to cluster
Get-ClusterAvailableDisk | Where-Object {$_.Size -eq 1GB} | Add-ClusterDisk

# Rename
Get-ClusterResource | Where-Object {$_.ResourceType -eq "Physical Disk"} | 
    Rename-ClusterResource -NewName "Witness Disk"

Step 3: Configure as Quorum Witness

Using Failover Cluster Manager:

  1. Select cluster → Configure Cluster Quorum Settings
  2. Select Select the quorum witnessNext
  3. Select Configure a disk witnessNext
  4. Select “Witness Disk” → NextFinish

Using PowerShell:

powershell

# Configure disk witness
Set-ClusterQuorum -NodeAndDiskMajority "Witness Disk"

# Verify
Get-ClusterQuorum

Known Issue: Windows Server 2025 Two-Node Clusters

Windows Server 2025 has a known timing issue where gracefully shutting down the node owning the disk witness can cause quorum loss in two-node clusters.

Workaround:

powershell

# Before restarting node owning cluster group
Move-ClusterGroup -Name "Cluster Group" -Node "NODE02"

# Now safe to restart NODE01
Restart-Computer -ComputerName "NODE01"

Alternative: Switch to cloud witness if internet connectivity is available.

6. Configuring File Share Witness (SMB)

Step 1: Create File Share (Domain-Joined)

On file share server:

powershell

# Create folder
$witnessPath = "C:\ClusterWitness"
New-Item -Path $witnessPath -ItemType Directory

# Create SMB share
$shareName = "FSW-Cluster01"
$clusterCNO = "DOMAIN\Cluster01$"

New-SmbShare -Name $shareName `
    -Path $witnessPath `
    -FullAccess $clusterCNO

# Configure NTFS permissions
$acl = Get-Acl -Path $witnessPath
$identity = New-Object System.Security.Principal.NTAccount($clusterCNO)
$accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule(
    $identity, "FullControl", "ContainerInherit,ObjectInherit", "None", "Allow"
)
$acl.AddAccessRule($accessRule)
Set-Acl -Path $witnessPath -AclObject $acl

Step 2: Configure File Share Witness on Cluster

Using Failover Cluster Manager:

  1. Select cluster → Configure Cluster Quorum Settings
  2. Select Select the quorum witnessNext
  3. Select Configure a file share witnessNext
  4. Enter UNC path: \\FileServer01\FSW-Cluster01
  5. Click NextFinish

Using PowerShell:

powershell

# Configure file share witness
$fileSharePath = "\\FileServer01\FSW-Cluster01"
Set-ClusterQuorum -NodeAndFileShareMajority $fileSharePath

# Verify
Get-ClusterQuorum

Workgroup Configuration (Non-Domain)

For workgroup clusters or non-domain file servers:

powershell

# Create local account on file server
$username = "ClusterWitness"
$password = ConvertTo-SecureString "P@ssw0rd!Complex" -AsPlainText -Force
New-LocalUser -Name $username -Password $password -PasswordNeverExpires

# Create share with local account permissions
New-SmbShare -Name "FSW-Cluster01" -Path "C:\ClusterWitness" -FullAccess $username

# On cluster, configure with credentials
Set-ClusterQuorum -FileShareWitness "\\FileServer01\FSW-Cluster01" `
    -Credential (Get-Credential)
# When prompted, enter the local account credentials

7. Dynamic Quorum and Advanced Features

Understanding Dynamic Quorum

Dynamic Quorum automatically adjusts node votes to preserve majority during sequential failures, enabling “last man standing” behavior.

When enabled (default), Windows Server 2025:

  • Tracks active cluster membership
  • Disables votes on failed nodes
  • Adjusts required vote thresholds dynamically
  • Can enable single-node operation temporarily

Dynamic Witness

Dynamic Witness automatically adjusts whether the witness has a vote based on whether there’s an even or odd number of voting nodes.

Logic:

  • Odd number of nodes → Witness vote disabled (not needed)
  • Even number of nodes → Witness vote enabled (provides tiebreaker)

Example (4-node cluster with witness):

  • Normal: 4 nodes (witness disabled) = 4 votes, need 3
  • One node fails: 3 nodes + witness = 4 votes, need 3
  • Two nodes fail: 2 nodes + witness = 3 votes, need 2 ✓

Verify Dynamic Features

powershell

# Check Dynamic Quorum and Dynamic Witness status
Get-Cluster | Format-List *Dynamic*

# Should show:
# DynamicQuorum : 1 (enabled)
# DynamicWitness : 1 (enabled)

# View per-node vote status
Get-ClusterNode | Format-Table NodeName, State, DynamicWeight, NodeWeight

Managing Node Votes

For specific scenarios (e.g., DR site nodes):

powershell

# Disable vote on DR node
(Get-ClusterNode -Name "NODE-DR").NodeWeight = 0

# Re-enable vote
(Get-ClusterNode -Name "NODE-DR").NodeWeight = 1

8. Verification and Monitoring

Initial Verification

powershell

# Display quorum configuration
Get-ClusterQuorum | Format-List

# Check witness resource status
Get-ClusterResource | Where-Object {$_.ResourceType -like "*Witness*"} | 
    Format-List Name, State, ResourceType

# Verify node votes
Get-ClusterNode | Format-Table NodeName, State, DynamicWeight, NodeWeight

# Calculate current votes
$activeVotes = (Get-ClusterNode | Where-Object {$_.State -eq "Up" -and $_.DynamicWeight -eq 1}).Count
$witnessVote = (Get-ClusterResource | Where-Object {$_.ResourceType -like "*Witness*" -and $_.State -eq "Online"}).Count
$totalVotes = $activeVotes + $witnessVote
$requiredVotes = [Math]::Floor($totalVotes / 2) + 1

Write-Host "Active votes: $activeVotes"
Write-Host "Witness vote: $witnessVote"  
Write-Host "Total votes: $totalVotes"
Write-Host "Required for quorum: $requiredVotes"

Functional Testing

powershell

# Test single node failure
$testNode = "NODE02"
Suspend-ClusterNode -Name $testNode
Start-Sleep -Seconds 10

# Verify cluster remains online
Get-Cluster | Format-List State  # Should show "Up"

# Resume node
Resume-ClusterNode -Name $testNode

Monitoring Script

powershell

function Test-ClusterQuorumHealth {
    $issues = @()
    $cluster = Get-Cluster
    
    # Check cluster state
    if ($cluster.State -ne "Up") {
        $issues += "CRITICAL: Cluster state is $($cluster.State)"
    }
    
    # Check witness
    $witness = Get-ClusterResource | Where-Object {$_.ResourceType -like "*Witness*"}
    if ($witness -and $witness.State -ne "Online") {
        $issues += "WARNING: Witness is $($witness.State)"
    }
    
    # Check votes
    $activeVotes = (Get-ClusterNode | Where-Object {$_.State -eq "Up" -and $_.DynamicWeight -eq 1}).Count
    $witnessVote = if ($witness -and $witness.State -eq "Online") {1} else {0}
    $totalVotes = $activeVotes + $witnessVote
    $required = [Math]::Floor($totalVotes / 2) + 1
    
    if ($activeVotes -le $required) {
        $issues += "CRITICAL: Only $activeVotes votes available, $required required"
    }
    
    # Display results
    if ($issues.Count -eq 0) {
        Write-Host "OK: Cluster quorum is healthy" -ForegroundColor Green
    } else {
        Write-Host "ISSUES DETECTED:" -ForegroundColor Red
        $issues | ForEach-Object { Write-Host "  $_" -ForegroundColor Yellow }
    }
}

# Run check
Test-ClusterQuorumHealth

Event Log Monitoring

powershell

# Query quorum-related events
$eventIDs = @(1564, 1569, 1570, 1177, 1135)

Get-WinEvent -FilterHashtable @{
    LogName = 'Microsoft-Windows-FailoverClustering/Operational'
    ID = $eventIDs
    StartTime = (Get-Date).AddHours(-24)
} | Format-Table TimeCreated, Id, Message -Wrap

Conclusion

Proper cluster quorum configuration is fundamental to achieving true high availability in Windows Server 2025 environments. This comprehensive guide has equipped you with expert knowledge spanning foundational concepts, detailed configuration procedures for all three witness types, advanced troubleshooting techniques, and production-tested best practices.

80%
Awesome
  • Design

Leave a Response