Introduction to Scale-Out File Server on Windows Server 2019
Scale-Out File Server (SoFS) is a Windows Server 2019 failover cluster role that presents Cluster Shared Volumes (CSV) as SMB 3.x file shares that all cluster nodes simultaneously serve. Unlike a traditional clustered file server where only one node owns the storage at a time, SoFS allows all nodes to actively serve the same share simultaneously, distributing the load and eliminating single-node bottlenecks. SoFS is specifically designed for hosting Hyper-V VM storage files (VHD/VHDX) and SQL Server database files over SMB 3.x.
SoFS leverages SMB Multichannel for parallel data transfer across multiple network paths, SMB Direct (RDMA) for low-latency high-throughput access, transparent failover for non-disruptive operations during node failures, and CSV Cache for in-memory caching of hot data blocks. These features combine to deliver predictable, high-performance shared storage without requiring a dedicated SAN.
Prerequisites for Scale-Out File Server
SoFS requires a Windows Server 2019 failover cluster with at least two nodes. The cluster must have shared storage — either traditional SAN LUNs added as Cluster Shared Volumes, or Storage Spaces Direct (S2D) volumes. All nodes must have 10 GbE or faster network adapters, ideally RDMA-capable for SMB Direct.
Install the Failover Clustering feature on all nodes:
Install-WindowsFeature -Name Failover-Clustering, FS-FileServer -IncludeManagementTools
Create the failover cluster (assuming shared SAN storage is already connected):
New-Cluster -Name "SoFSCluster" -Node "Node1","Node2","Node3","Node4" -StaticAddress 192.168.1.110
Creating the Scale-Out File Server Role
Add the Scale-Out File Server role to the cluster. This creates a cluster role with a virtual computer name (used in the UNC share path) and a virtual IP address:
Add-ClusterScaleOutFileServerRole -Name "SoFSServer" -Cluster "SoFSCluster"
Verify the role was created:
Get-ClusterResource -Cluster "SoFSCluster" | Where-Object {$_.ResourceType -like "*File Server*"}
Unlike a general-use file server cluster role which requires an IP address, SoFS does not require a static IP — it uses Distributed Network Name (DNN) or the cluster name for access. The SoFS role is available on all nodes simultaneously.
Adding Cluster Shared Volumes
Add shared storage as Cluster Shared Volumes that all nodes can access concurrently:
Get-ClusterAvailableDisk -Cluster "SoFSCluster" | Add-ClusterDisk
Enable CSV on the added disks:
Add-ClusterSharedVolume -Name "Cluster Disk 1" -Cluster "SoFSCluster"
Add-ClusterSharedVolume -Name "Cluster Disk 2" -Cluster "SoFSCluster"
Verify CSVs are online and accessible:
Get-ClusterSharedVolume -Cluster "SoFSCluster" | Select Name, State, OwnerNode
CSVs are accessible at C:ClusterStorageVolume1 and C:ClusterStorageVolume2 from all cluster nodes.
Creating SMB Shares on SoFS
Create SMB shares that point to CSV folders. These shares will be accessible from all nodes simultaneously:
# Create a share for Hyper-V VM files
New-SmbShare -Name "VMStorage" -Path "C:ClusterStorageVolume1VMs" -ScopeName "SoFSServer" -FullAccess "CONTOSOSYSTEM","CONTOSOHyper-V Hosts$" -Description "Hyper-V VM Storage"
# Create a share for SQL Server databases
New-SmbShare -Name "SQLData" -Path "C:ClusterStorageVolume2SQLData" -ScopeName "SoFSServer" -FullAccess "CONTOSOsqlsvc" -Description "SQL Server Database Files"
The -ScopeName parameter scopes the share to the SoFS cluster role name, so the share path is \SoFSServerVMStorage (using the cluster role name, not a physical node name).
Enable continuous availability on the share for transparent failover:
Set-SmbShare -Name "VMStorage" -ScopeName "SoFSServer" -ContinuouslyAvailable $true -EncryptData $true
Configuring CSV Cache
CSV cache allocates system memory on each cluster node for caching frequently accessed blocks from CSV volumes. Enable CSV cache and set the size:
(Get-Cluster -Name "SoFSCluster").BlockCacheSize = 8192
This sets 8 GB of CSV cache per node. For Hyper-V workloads, a larger cache significantly reduces disk I/O. View current CSV cache settings:
(Get-Cluster -Name "SoFSCluster").BlockCacheSize
Connecting Hyper-V to SoFS Storage
After creating the SoFS shares, configure Hyper-V hosts (which may or may not be the same physical servers as the SoFS cluster) to store VMs on the SoFS shares. Create a new Hyper-V VM using the SoFS share as storage:
New-VM -Name "ProdVM01" -MemoryStartupBytes 4GB -NewVHDPath "\SoFSServerVMStorageProdVM01ProdVM01.vhdx" -NewVHDSizeBytes 100GB -Path "\SoFSServerVMStorageProdVM01"
Move an existing VM’s storage to SoFS:
Move-VMStorage -VMName "ExistingVM" -DestinationStoragePath "\SoFSServerVMStorageExistingVM"
View SoFS share statistics to monitor throughput:
Get-SmbShareAccess -Name "VMStorage" -ScopeName "SoFSServer"
Get-SmbSession -ScopeName "SoFSServer" | Select ClientUserName, ClientComputerName, NumOpens, TotalRequestsProcessed
Scale-Out File Server on Windows Server 2019 provides a high-performance, scale-out SMB file storage solution that leverages all available cluster nodes to maximise throughput for demanding Hyper-V and SQL Server workloads.