Skip to content
Back to Blog
VMware

VMware vSAN: Hyper-Converged Storage Configuration

Configure VMware vSAN for hyper-converged storage: disk groups, policies, stretched clusters, and deduplication/compression.

Sep 2025
16 min read

Introduction

vSAN (Virtual SAN) is VMware's hyperconverged storage solution built into vSphere. Instead of external SAN/NAS storage, vSAN uses local disks on ESXi hosts and creates a shared datastore across the cluster. This guide covers design decisions, deployment, and management.

vSAN Architecture

TEXT
ESXi Host 1        ESXi Host 2        ESXi Host 3
[NVMe Cache]       [NVMe Cache]       [NVMe Cache]
[HDD Capacity]     [HDD Capacity]     [HDD Capacity]
[HDD Capacity]     [HDD Capacity]     [HDD Capacity]
       |                  |                  |
       └──────────────────┴──────────────────┘
                    vSAN Network (10GbE+)
                    vSAN Datastore (shared)

Disk Groups

Each host contributes one or more disk groups to vSAN:

  • 1 cache tier disk (NVMe or SSD) per disk group
  • 1-7 capacity tier disks (HDD or SSD) per disk group

Cache handles write buffering and read caching. Capacity stores the actual data.

Requirements

  • Minimum 3 ESXi hosts (for FTT=1 with RAID-1)
  • vSAN license (Standard, Advanced, Enterprise)
  • 10GbE dedicated vSAN network (25GbE recommended)
  • Solid-state cache tier
  • Same hardware across hosts is NOT required but simplifies management

vSAN Storage Policies

vSAN uses storage policies to control data protection:

FTT (Failures To Tolerate):
  • FTT=1, RAID-1: 3 hosts minimum, 2x overhead
  • FTT=1, RAID-5: 4 hosts minimum, 1.33x overhead (erasure coding)
  • FTT=2, RAID-6: 6 hosts minimum, 1.5x overhead

Enabling vSAN

  1. In vCenter, select cluster → Configure → vSAN → Services
  2. Enable vSAN
  3. Configure vSAN network (VMkernel adapter with vSAN traffic type)
  4. Add disk groups from each host

Via PowerCLI:

POWERSHELL
# Connect to vCenter
Connect-VIServer -Server vcenter.company.com

# Enable vSAN on cluster
$cluster = Get-Cluster "Production"
Set-VsanClusterConfiguration -Cluster $cluster -VsanEnabled $true

# Configure disk groups
$hosts = Get-VMHost -Location $cluster
foreach ($esxiHost in $hosts) {
    $cacheDisk = Get-VMHostDisk -VMHost $esxiHost | Where-Object {$_.CapacityGB -lt 500 -and $_.SSDEnabled}
    $capacityDisks = Get-VMHostDisk -VMHost $esxiHost | Where-Object {$_.CapacityGB -gt 500}
    
    New-VsanDiskGroup -VMHost $esxiHost -SsdCanonicalName $cacheDisk.CanonicalName `
        -DataDiskCanonicalName ($capacityDisks | Select-Object -ExpandProperty CanonicalName)
}

Creating Storage Policies

In vCenter: Policies and Profiles → VM Storage Policies → Create

Or via PowerCLI:

POWERSHELL
# Create policy with FTT=1, RAID-5 (erasure coding)
$rules = New-SpbmRuleSet -AllOfRules @(
    New-SpbmRule -Capability (Get-SpbmCapability -Name "VSAN.hostFailuresToTolerate") -Value 1,
    New-SpbmRule -Capability (Get-SpbmCapability -Name "VSAN.replicaPreference") -Value "RAID-5/RAID-6 (Erasure Coding) - Capacity"
)

New-SpbmStoragePolicy -Name "Gold-RAID5" -RuleSet $rules

vSAN Monitoring

POWERSHELL
# Check vSAN health
Get-VsanView -Id "VsanVcClusterHealthSystem-vsan-cluster-health-system" |
    ForEach-Object { $_.VsanQueryVcClusterHealthSummary($cluster.Id, $null, $null, $true, $null, $null) }

# Check disk health
Get-VsanDisk | Where-Object {$_.State -ne "inUse"} | Select-Object CanonicalName, State

# Check resync status
Get-VsanResyncStatus -Cluster $cluster

# Check vSAN capacity
Get-VsanSpaceUsage -Cluster $cluster

vSAN Fault Domains (Rack Awareness)

For multi-rack deployments, configure fault domains to ensure replicas don't land on the same rack:

POWERSHELL
# Create fault domains
New-VsanFaultDomain -Name "Rack-A" -VMHost @("esxi1", "esxi2", "esxi3") -Cluster $cluster
New-VsanFaultDomain -Name "Rack-B" -VMHost @("esxi4", "esxi5", "esxi6") -Cluster $cluster
New-VsanFaultDomain -Name "Rack-C" -VMHost @("esxi7", "esxi8", "esxi9") -Cluster $cluster

Stretched Cluster (Active-Active across 2 Sites)

TEXT
Site A (3 hosts) ←→ Witness Host ←→ Site B (3 hosts)
                 ↑
         Witness at third site or cloud

Provides RPO=0 across sites — if Site A fails, Site B continues serving VMs from the same datastore.

Troubleshooting vSAN

BASH
# On ESXi host shell
# Check vSAN network
esxcli vsan network list

# Check disk health
esxcli storage core device list

# Check vSAN cluster status
esxcli vsan cluster get

# Check objects
esxcli vsan debug object list | head -20

# View vSAN logs
cat /var/log/vsanmgmt.log | grep -i error | tail -50