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
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
- In vCenter, select cluster → Configure → vSAN → Services
- Enable vSAN
- Configure vSAN network (VMkernel adapter with vSAN traffic type)
- Add disk groups from each host
Via PowerCLI:
# 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:
# 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 $rulesvSAN Monitoring
# 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 $clustervSAN Fault Domains (Rack Awareness)
For multi-rack deployments, configure fault domains to ensure replicas don't land on the same rack:
# 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 $clusterStretched Cluster (Active-Active across 2 Sites)
Site A (3 hosts) ←→ Witness Host ←→ Site B (3 hosts)
↑
Witness at third site or cloudProvides RPO=0 across sites — if Site A fails, Site B continues serving VMs from the same datastore.
Troubleshooting vSAN
# 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