|
| 1 | +--- |
| 2 | +title: Create a Storage Spaces Direct Campus Cluster |
| 3 | +description: Learn how to deploy a Storage Spaces Direct campus cluster for high availability and fault tolerance on Windows Server 2025 or later. |
| 4 | +#customer intent: As an IT administrator, I want to create a Storage Spaces Direct campus cluster so that I can ensure rack-level resiliency for my workloads across two physical locations. |
| 5 | +author: robinharwood |
| 6 | +ms.author: roharwoo |
| 7 | +ms.reviewer: robhind |
| 8 | +ms.date: 05/29/2026 |
| 9 | +ms.topic: how-to |
| 10 | +ai-usage: ai-assisted |
| 11 | +--- |
| 12 | + |
| 13 | +# Create a Storage Spaces Direct campus cluster |
| 14 | + |
| 15 | +A campus cluster is a failover cluster that distributes nodes and data across two physical racks in separate rooms or buildings within the same campus. This topology keeps your workloads available when an entire rack goes offline, such as during a power, network, or cooling outage. |
| 16 | + |
| 17 | +This article shows you how to create a four-node (2+2) Storage Spaces Direct campus cluster on Windows Server 2025 or later, with two nodes in each rack-level fault domain. The cluster uses Storage Spaces Direct for storage and Resilient File System (ReFS) for the file system. |
| 18 | + |
| 19 | +For more information about campus cluster architecture, supported configurations, and how it compares to other topologies, see [Failover Clustering topologies](topologies.md). |
| 20 | + |
| 21 | +## Prerequisites |
| 22 | + |
| 23 | +- Windows Server 2025 or later with the 2025-12 security update ([KB5072033](https://support.microsoft.com/help/5072033)) installed on every node in the failover cluster. |
| 24 | +- All-flash capacity drives of the same type on every node (SSD or NVMe). Don't use HDDs and don't configure a caching tier. |
| 25 | +- An equal number of nodes in each of the two rack-level fault domains. For supported node configurations, see [Failover Clustering topologies](topologies.md). This article shows the 2+2 configuration. |
| 26 | +- Exactly two rack-level fault domains, with cluster nodes spanning both racks. |
| 27 | +- Direct-attached storage that follows your hardware original equipment manufacturer (OEM) guidelines, including driver versions. |
| 28 | +- A quorum witness (file share witness, disk witness, cloud witness, or USB witness) in a third physical location, separate from the two campus cluster racks. |
| 29 | + |
| 30 | +For optimal performance and resiliency, use the following configurations: |
| 31 | + |
| 32 | +- A separate network path from each rack to the cluster quorum resource. |
| 33 | +- Redundant top-of-rack (TOR) switches, core switches, and dedicated networks for Storage Spaces Direct storage traffic to minimize single points of failure and maximize workload uptime and durability. |
| 34 | +- Network latency of 1 ms or less between racks. Use the [PsPing](/sysinternals/downloads/psping) utility to measure network latency. |
| 35 | +- Remote direct memory access (RDMA) network interface cards (NICs) and switches to achieve up to 30% CPU savings on your cluster. |
| 36 | + |
| 37 | +## Create the campus failover cluster |
| 38 | + |
| 39 | +To create a Storage Spaces Direct campus cluster on Windows Server 2025 or later, complete these high-level steps in order: |
| 40 | + |
| 41 | +1. Create a failover cluster without storage. |
| 42 | +1. Define two rack fault domains. |
| 43 | +1. Enable Storage Spaces Direct. |
| 44 | +1. Create volumes on the storage pool. |
| 45 | + |
| 46 | +This section covers the first step: creating the failover cluster without storage. |
| 47 | + |
| 48 | +#### [PowerShell](#tab/powershell) |
| 49 | + |
| 50 | +To create the failover cluster, use the [New-Cluster](/powershell/module/failoverclusters/new-cluster) cmdlet. |
| 51 | + |
| 52 | +1. Run PowerShell on your computer in an elevated session. |
| 53 | + |
| 54 | +1. Run the following command to create the cluster without storage: |
| 55 | + |
| 56 | + ```powershell |
| 57 | + New-Cluster -Name <ClusterName> -Node <Node1,Node2,Node3,Node4> -NoStorage |
| 58 | + ``` |
| 59 | + |
| 60 | + Replace `<ClusterName>` with your cluster name and `<Node1,Node2,Node3,Node4>` with your node names. |
| 61 | + |
| 62 | +#### [Failover Cluster Manager](#tab/fcm) |
| 63 | + |
| 64 | +To create the failover cluster, use Failover Cluster Manager. |
| 65 | + |
| 66 | +1. From the Windows desktop, open the **Start** menu, and then select the **Server Manager** tile. |
| 67 | + |
| 68 | +1. On the **Tools** menu, select **Failover Cluster Manager**. |
| 69 | + |
| 70 | +1. In the **Failover Cluster Manager** pane, under **Management**, select **Create Cluster**. The Create Cluster Wizard opens. |
| 71 | + |
| 72 | +1. On the **Before You Begin** page, select **Next**. |
| 73 | + |
| 74 | +1. On the **Select Servers** page, in the **Enter name** box, enter the name of a server to add as a failover cluster node, and then select **Add**. Repeat this step for each of the four nodes. When you're finished, select **Next**. |
| 75 | + |
| 76 | +1. On the **Validation Warning** page, select **Yes** to run cluster validation, and then select **Next**. Complete the Validate a Configuration Wizard. |
| 77 | + |
| 78 | +1. On the **Access Point for Administering the Cluster** page, enter a name for the cluster. If the servers don't use Dynamic Host Configuration Protocol (DHCP), configure one or more static IP addresses for the failover cluster. Select **Next**. |
| 79 | + |
| 80 | +1. On the **Confirmation** page, clear the **Add all eligible storage to the cluster** checkbox because you configure storage later when enabling Storage Spaces Direct. Select **Next**. |
| 81 | + |
| 82 | +1. On the **Summary** page, confirm that the wizard created the failover cluster successfully, and then select **Finish**. |
| 83 | + |
| 84 | +--- |
| 85 | + |
| 86 | +## Define rack fault domains for the campus cluster |
| 87 | + |
| 88 | +After you create the campus failover cluster, define two rack fault domains before you enable Storage Spaces Direct. Rack fault domains tell Storage Spaces Direct how to place data copies across the two physical racks so the cluster can tolerate the loss of an entire rack. |
| 89 | + |
| 90 | +> [!IMPORTANT] |
| 91 | +> Define fault domains before you enable Storage Spaces Direct. After you create the pool and volumes, data doesn't retroactively move in response to changes to the fault domain topology. |
| 92 | +
|
| 93 | +#### [PowerShell](#tab/powershell) |
| 94 | + |
| 95 | +Here's how to define fault domains by using PowerShell. |
| 96 | + |
| 97 | +1. Run PowerShell on your computer in an elevated session. |
| 98 | + |
| 99 | +1. Run the following command to define two rack fault domains, with two nodes in each rack: |
| 100 | + |
| 101 | + ```powershell |
| 102 | + Set-ClusterFaultDomain -XML @" |
| 103 | + <Topology> |
| 104 | + <Site Name="Campus"> |
| 105 | + <Rack Name="Room1"> |
| 106 | + <Node Name="Node1"/> |
| 107 | + <Node Name="Node2"/> |
| 108 | + </Rack> |
| 109 | + <Rack Name="Room2"> |
| 110 | + <Node Name="Node3"/> |
| 111 | + <Node Name="Node4"/> |
| 112 | + </Rack> |
| 113 | + </Site> |
| 114 | + </Topology> |
| 115 | + "@ |
| 116 | + ``` |
| 117 | + |
| 118 | + Replace the node names with your actual node names, and update the site and rack names as appropriate for your environment. |
| 119 | + |
| 120 | +1. Verify the fault domain configuration by running: |
| 121 | + |
| 122 | + ```powershell |
| 123 | + Get-ClusterFaultDomain |
| 124 | + ``` |
| 125 | + |
| 126 | +For alternative methods to define fault domains, including by using individual PowerShell cmdlets, see [Fault domain awareness](fault-domains.md). |
| 127 | + |
| 128 | +#### [Failover Cluster Manager](#tab/fcm) |
| 129 | + |
| 130 | +Failover Cluster Manager doesn't support configuring rack-level fault domains through the GUI. Use PowerShell to define fault domains. |
| 131 | + |
| 132 | +1. Run PowerShell on your computer in an elevated session. |
| 133 | + |
| 134 | +1. Run the following command to define two rack fault domains, with two nodes in each rack: |
| 135 | + |
| 136 | + ```powershell |
| 137 | + Set-ClusterFaultDomain -XML @" |
| 138 | + <Topology> |
| 139 | + <Site Name="Campus"> |
| 140 | + <Rack Name="Room1"> |
| 141 | + <Node Name="Node1"/> |
| 142 | + <Node Name="Node2"/> |
| 143 | + </Rack> |
| 144 | + <Rack Name="Room2"> |
| 145 | + <Node Name="Node3"/> |
| 146 | + <Node Name="Node4"/> |
| 147 | + </Rack> |
| 148 | + </Site> |
| 149 | + </Topology> |
| 150 | + "@ |
| 151 | + ``` |
| 152 | + |
| 153 | + Replace the node names with your actual node names. |
| 154 | + |
| 155 | +1. Verify the fault domain configuration by running: |
| 156 | + |
| 157 | + ```powershell |
| 158 | + Get-ClusterFaultDomain |
| 159 | + ``` |
| 160 | + |
| 161 | +--- |
| 162 | + |
| 163 | +## Enable Storage Spaces Direct on the campus cluster |
| 164 | + |
| 165 | +After you define the two rack fault domains, enable Storage Spaces Direct on the campus cluster. When you enable Storage Spaces Direct, it creates the storage pool and configures it for rack-level fault tolerance. |
| 166 | + |
| 167 | +#### [PowerShell](#tab/powershell) |
| 168 | + |
| 169 | +Here's how to enable Storage Spaces Direct by using the [Enable-ClusterStorageSpacesDirect](/powershell/module/failoverclusters/enable-clusterstoragespacesdirect) cmdlet. |
| 170 | + |
| 171 | +1. Run PowerShell on your computer in an elevated session. |
| 172 | + |
| 173 | +1. Enable Storage Spaces Direct on the cluster: |
| 174 | + |
| 175 | + ```powershell |
| 176 | + Enable-ClusterStorageSpacesDirect |
| 177 | + ``` |
| 178 | + |
| 179 | +1. Update the storage pool to use the latest features: |
| 180 | + |
| 181 | + ```powershell |
| 182 | + Get-StoragePool S2D* | Update-StoragePool |
| 183 | + ``` |
| 184 | + |
| 185 | +1. Verify that the storage pool version is 29 or later. A campus cluster requires storage pool version 29 for rack-level fault domain awareness: |
| 186 | + |
| 187 | + ```powershell |
| 188 | + (Get-CimInstance -Namespace root/microsoft/windows/storage ` |
| 189 | + -ClassName MSFT_StoragePool ` |
| 190 | + -Filter 'IsPrimordial = false').CimInstanceProperties['Version'].Value |
| 191 | + ``` |
| 192 | + |
| 193 | +1. Verify that the storage pool's `FaultDomainAwareness` property has the value `StorageRack`. This value confirms that Storage Spaces Direct places data copies across the two rack fault domains: |
| 194 | + |
| 195 | + ```powershell |
| 196 | + Get-StoragePool -FriendlyName S2D* | Format-List FaultDomainAwareness |
| 197 | + ``` |
| 198 | + |
| 199 | +#### [Failover Cluster Manager](#tab/fcm) |
| 200 | + |
| 201 | +Here's how to enable Storage Spaces Direct by using Failover Cluster Manager. |
| 202 | + |
| 203 | +1. In **Failover Cluster Manager**, expand the cluster name, and then select **Storage** > **Pools**. |
| 204 | + |
| 205 | +1. Right-click **Pools**, and then select **Enable Storage Spaces Direct**. |
| 206 | + |
| 207 | +1. Complete the wizard to enable Storage Spaces Direct on the cluster. |
| 208 | + |
| 209 | +1. After enabling Storage Spaces Direct, use PowerShell to update the storage pool and verify the configuration: |
| 210 | + |
| 211 | + ```powershell |
| 212 | + Get-StoragePool S2D* | Update-StoragePool |
| 213 | + ``` |
| 214 | + |
| 215 | +1. Verify that the storage pool version is 29 or later. A campus cluster requires storage pool version 29 for rack-level fault domain awareness: |
| 216 | + |
| 217 | + ```powershell |
| 218 | + (Get-CimInstance -Namespace root/microsoft/windows/storage ` |
| 219 | + -ClassName MSFT_StoragePool ` |
| 220 | + -Filter 'IsPrimordial = false').CimInstanceProperties['Version'].Value |
| 221 | + ``` |
| 222 | + |
| 223 | +1. Verify that the storage pool's `FaultDomainAwareness` property has the value `StorageRack`. This value confirms that Storage Spaces Direct places data copies across the two rack fault domains: |
| 224 | + |
| 225 | + ```powershell |
| 226 | + Get-StoragePool -FriendlyName S2D* | Format-List FaultDomainAwareness |
| 227 | + ``` |
| 228 | + |
| 229 | +--- |
| 230 | + |
| 231 | +## Create volumes on the campus cluster |
| 232 | + |
| 233 | +Create volumes on the Storage Spaces Direct pool based on your resiliency requirements. For a 2+2 campus cluster (two nodes in each of two racks), use four-copy mirrored volumes. A four-copy volume places one copy of data on each node, so the cluster can survive the loss of an entire rack and one additional node at the same time. |
| 234 | + |
| 235 | +The following table compares the two volume resiliency options for a 2+2 campus cluster: |
| 236 | + |
| 237 | +| Volume type | Storage efficiency | Fault tolerance | |
| 238 | +|---|---|---| |
| 239 | +| Four-copy mirror | 25% | Survives loss of an entire rack plus one additional node. | |
| 240 | +| Two-copy mirror | 50% | Survives loss of one node. Doesn't survive loss of an entire rack. | |
| 241 | + |
| 242 | +For more information about volume resiliency options, see [Fault tolerance and storage efficiency](../storage/storage-spaces/fault-tolerance.md). |
| 243 | + |
| 244 | +#### [PowerShell](#tab/powershell) |
| 245 | + |
| 246 | +To create a four-copy mirrored volume by using PowerShell, follow these steps: |
| 247 | + |
| 248 | +1. Run PowerShell on your computer in an elevated session. |
| 249 | + |
| 250 | +1. Run the following command to create a four-copy volume: |
| 251 | + |
| 252 | + ```powershell |
| 253 | + New-Volume -FriendlyName "FourCopyVolume" ` |
| 254 | + -StoragePoolFriendlyName S2D* ` |
| 255 | + -FileSystem CSVFS_ReFS ` |
| 256 | + -Size 500GB ` |
| 257 | + -ResiliencySettingName Mirror ` |
| 258 | + -PhysicalDiskRedundancy 3 ` |
| 259 | + -ProvisioningType Fixed ` |
| 260 | + -NumberOfDataCopies 4 ` |
| 261 | + -NumberOfColumns 3 |
| 262 | + ``` |
| 263 | + |
| 264 | + To create a two-copy volume instead, set `-PhysicalDiskRedundancy 1` and remove the `-NumberOfDataCopies` and `-NumberOfColumns` parameters. To use thin provisioning, change `-ProvisioningType` to `Thin`. |
| 265 | + |
| 266 | +For more information about resiliency types and storage efficiency, see [Fault tolerance and storage efficiency](../storage/storage-spaces/fault-tolerance.md). |
| 267 | + |
| 268 | +#### [Failover Cluster Manager](#tab/fcm) |
| 269 | + |
| 270 | +Here's how to create volumes using Failover Cluster Manager. To create four-copy volumes, use PowerShell. |
| 271 | + |
| 272 | +1. In **Failover Cluster Manager**, expand the cluster name, and then select **Storage** > **Pools**. |
| 273 | + |
| 274 | +1. Right-click the **S2D** storage pool, and then select **New Virtual Disk**. |
| 275 | + |
| 276 | +1. In the New Virtual Disk Wizard, enter a name for the volume. |
| 277 | + |
| 278 | +1. On the **Storage Layout** page, select **Mirror**. |
| 279 | + |
| 280 | +1. On the **Resiliency Settings** page, select **Two-way mirror** for a two-copy volume. |
| 281 | + |
| 282 | +1. On the **Provisioning Type** page, select either **Fixed** or **Thin**. |
| 283 | + |
| 284 | +1. Specify the size for the volume and complete the wizard. |
| 285 | + |
| 286 | +1. After you create the virtual disk, right-click it and select **New Volume** to format it by using ReFS. |
| 287 | + |
| 288 | +--- |
| 289 | + |
| 290 | +## Scale the campus cluster by adding nodes |
| 291 | + |
| 292 | +You can grow a campus cluster from 1+1 to 2+2, 3+3, 4+4, or 5+5 by adding one node at a time to a rack and then to the cluster. For each new node, first add it to the rack fault domain by using [New-ClusterFaultDomain](/powershell/module/failoverclusters/new-clusterfaultdomain), and then add it to the cluster by using [Add-ClusterNode](/powershell/module/failoverclusters/add-clusternode). |
| 293 | + |
| 294 | +The following example adds `Node5` to `Room1` and `Node6` to `Room2`: |
| 295 | + |
| 296 | +```powershell |
| 297 | +$nodeName = 'Node5' |
| 298 | +$rackFaultDomainName = 'Room1' |
| 299 | +New-ClusterFaultDomain -Type Node -Name $nodeName -FaultDomain $rackFaultDomainName |
| 300 | +Add-ClusterNode -Name $nodeName |
| 301 | +
|
| 302 | +$nodeName = 'Node6' |
| 303 | +$rackFaultDomainName = 'Room2' |
| 304 | +New-ClusterFaultDomain -Type Node -Name $nodeName -FaultDomain $rackFaultDomainName |
| 305 | +Add-ClusterNode -Name $nodeName |
| 306 | +``` |
| 307 | + |
| 308 | +Repeat the pattern, alternating racks, until you reach your target configuration. Always keep an equal number of nodes in each rack. |
| 309 | + |
| 310 | +## Related content |
| 311 | + |
| 312 | +- [Deploy a quorum witness](deploy-quorum-witness.md) |
| 313 | +- [Fault domain awareness](fault-domains.md) |
| 314 | +- [Announcing support for S2D Campus Cluster on Windows Server 2025](https://techcommunity.microsoft.com/blog/failoverclustering/announcing-support-for-s2d-campus-cluster-on-windows-server-2025/4477075) |
0 commit comments