VMware vSAN OSA存储策略:虚拟机分布式对象存储的深度解析

VMware vSAN OSA存储策略:虚拟机分布式对象存储的深度解析
一、引言
VMware vSAN(Virtual SAN)是 VMware 提供的超融合软件定义存储 (SDS) 解决方案,将本地服务器(ESXi 主机)的直连存储(SSD+HDD) 聚合成一个分布式存储池。vSAN 支持两种存储架构:传统的 OSA(Original Storage Architecture)和全新的 ESA(Express Storage Architecture)。本篇重点讲解 OSA 模式下的存储策略(Storage Policy)原理、对象分布机理,以及如何使用 PowerCLI 和 vSphere REST API 配置与验证策略。
二、vSAN OSA 存储架构概述
2.1 OSA 架构要点
磁盘组 (Disk Group)
- 每个 ESXi 主机可配置一个或多个磁盘组。
- 每个磁盘组包含一个或多个缓存盘(Cache Tier,通常为 NVMe/SSD)和若干容量盘(Capacity Tier,HDD 或 SSD)。
- 缓存盘分为读写缓存:前 70% 用于写缓存(写缓冲),后 30% 用于读取缓存(读加速)。
对象与组件 (Object & Component)
- vSAN 将虚拟机的 VMDK、快照等对象切分为更小的“组件”(Component)。
- 每个组件会根据存储策略在多个主机磁盘组之间以镜像 (RAID-1) 或条带 (RAID-0/5/6) 方式分布。
- 对象最小组件大小为 1MB。
见证 (Witness)
- 在 FTT(Failures To Tolerate,可容忍故障数)> 0 情况下,vSAN 会在“见证”主机上存储一个只包含元数据的小型组件(Witness)。
- Witness 用于仲裁故障期间数据可用性。
策略关键属性
- FTT(故障容忍数):决定对象需要几个副本。
- Stripe Width(条带宽度):决定对象条带数,即将对象切分为多少组件并分布到不同磁盘组。
- Object Space Reservation (OSR,对象空间保留率):决定预留的容量百分比(例如 100% 保留表示 Full-thick)。
- Caching / Checksum / Flash Read Cache Reservation / IOPS Limit 等:影响性能和保护机制。
2.2 OSA 与 ESA 的差异
- OSA:基于 ESXi 传统的存储架构,依赖 VMkernel 存储栈,将磁盘组中的缓存盘和容量盘通过 VMFS-like 逻辑聚合。组件以普通文件方式存储在本地磁盘。
- ESA:引入 Linux 用户态 vSAN 代理、更高 IO 处理性能、更灵活的 SSD+NVMe 支持以及更优的去重/压缩性能。本文暂不展开 ESA,重点关注广泛应用的 OSA 架构。
三、vSAN 存储策略详细分析
3.1 FTT (Failures To Tolerate)
FTT 指定可容忍多少台主机或磁盘组故障。
- FTT=0:无容错,所有组件仅存一份;
- FTT=1:可容忍 1 个故障,需要两份数据副本(镜像)+见证;
- FTT=2:可容忍 2 个故障,需要三份副本+见证;
- 以此类推。
- 影响:FTT 越高,占用磁盘容量越多,但数据可靠性越强。
3.2 Stripe Width(条带宽度)
- 决定对象被拆分成多少个组件,分别分布在不同磁盘组中。
- 例如:Stripe Width=2,FTT=1,则 vSAN 将对象拆成 2 个数据组件,分别放在不同主机的磁盘组,以实现并行读写。再加上 1 个 Witness(只存元数据),共 3 个组件。
- 注意:Stripe Width 最多不能超过 (主机数 * 每主机磁盘组数) 减去 FTT。配置过高会导致无法部署对象。
3.3 Object Space Reservation (OSR)
定义为 Full-Thick、Thin 或者某个百分比保留。
- 100% OSR = Full-Thick:立即为整个对象分配所有容量,在容量盘上形成连续空间。
- <100% OSR = Thin:仅为写入的数据分配存储空间,节省容量但会产生碎片、写扩散。
- 影响:Full-Thick 提供最优性能,Thin 野置空间更节省。
3.4 Flash Read Cache Reservation & IOPS Limit
- 可以为特定存储策略指定读缓存保留容量(Cache Reservation),保证某些关键虚拟机能使用足够 SSD 缓存。
- IOPS Limit 用于限制单个对象的最大 IOPS,以防止热点干扰集群。
3.5 Checksum & Force Provisioning
- Checksum:开启后组件写入时会计算 CRC,以检测数据损坏。
- Force Provisioning:在集群资源不足时(例如可容忍分布式 RAID 需求不足)仍强制创建对象,但可能降低保护级别,需谨慎使用。
四、vSAN OSA 对象分布机理图解
(请参考上方“图1:vSAN OSA 存储架构示意图”)
图1 展示了典型3节点 OSA 集群中的磁盘组布局与组件分布:
- 每台主机拥有一个磁盘组,包含 1 个 SSD 缓存与 2 个 HDD 组成容量层。
- 对象 A(红色节点)为 FTT=1、StripeWidth=1 的 VM 磁盘:两个数据副本分别放在 Host1 和 Host2 的 HDD 上;见证组件 W 放在 Host3 上的 SSD 上。
- 对象 B(蓝色节点)为 FTT=1、StripeWidth=2 的 VM 磁盘:拆成两个数据组件,分别分布在 Host2、Host3;见证组件放置在 Host1 上。这样读写可以并行访问两组组件。
通过上述图示,可以直观理解 OSA 模式下 vSAN 如何在不同主机之间分散对象组件,实现性能与容错的平衡。
五、PowerCLI / REST API 代码示例
以下示例将演示如何在 OSA 集群上创建并应用自定义存储策略。
5.1 PowerCLI 示例:创建 vSAN 存储策略
# 连接 vCenter
Connect-VIServer -Server vcsa.example.com -User administrator@vsphere.local -Password 'YourPassword!'
# 创建一个新的存储策略名为 "OSA-Policy"
$policyName = "OSA-Policy"
$profile = New-SpbmProfile -Name $policyName -Description "vSAN OSA 自定义策略"
# 添加规则:FTT = 1
Add-SpbmRule -SPBMProfile $profile -RuleId "hostFailuresToTolerate" -Value 1
# 添加规则:Stripe Width = 2
Add-SpbmRule -SPBMProfile $profile -RuleId "proportionalCapacity" -Value 2
# 添加规则:OSR=100% (Full Thick)
Add-SpbmRule -SPBMProfile $profile -RuleId "objectSpaceReservation" -Value 100
# 添加规则:开启数据校验 (Checksum = true)
Add-SpbmRule -SPBMProfile $profile -RuleId "checksumEnabled" -Value $true
# 添加规则:Flash Read Cache Reservation 10%
Add-SpbmRule -SPBMProfile $profile -RuleId "cacheReservation" -Value 10
# 添加规则:IOPS 限制 10000
Add-SpbmRule -SPBMProfile $profile -RuleId "iopsLimit" -Value 10000
Write-Host "已创建并配置存储策略:$policyName"
# 查看规则
Get-SpbmRule -SPBMProfile $profile | Format-Table
解释:
- 通过
New-SpbmProfile
创建一个空白策略,然后使用Add-SpbmRule
添加每个关键属性。hostFailuresToTolerate
对应 FTT;proportionalCapacity
对应 Strike Width;objectSpaceReservation
对应 OSR;checksumEnabled
开启校验;cacheReservation
指定读缓存保留;iopsLimit
限制 IOPS。
完成后,可将此策略应用到虚拟机磁盘(VMDK)或虚拟机级别。
5.2 PowerCLI 示例:将存储策略应用到虚拟机磁盘
# 假设已有虚拟机名为 "WebVM",获取其硬盘信息
$vm = Get-VM -Name "WebVM"
$hardDisk = Get-HardDisk -VM $vm
# 应用存储策略到第一个硬盘
Set-SpbmEntityConfiguration -Entity $hardDisk -StoragePolicy $policyName
Write-Host "已将存储策略 $policyName 应用到 WebVM 的硬盘。"
5.3 vSphere REST API 示例:创建与应用存储策略
下面以 curl 调用为例,假设 vCenter 已获取到访问 Token VC_TOKEN
。
5.3.1 获取所有现有规则 ID
curl -k -u "${VC_USER}:${VC_PASS}" -X GET "https://vcsa.example.com/rest/appliance/storage/policy/property" \
-H "vmware-api-session-id: ${VC_TOKEN}"
输出示例(简化):
{
"value": [
{ "id": "hostFailuresToTolerate", "display_name": "FTT" },
{ "id": "proportionalCapacity", "display_name": "Stripe Width" },
{ "id": "objectSpaceReservation", "display_name": "OSR" },
{ "id": "checksumEnabled", "display_name": "Checksum" },
{ "id": "cacheReservation", "display_name": "Flash Read Cache Reservation" },
{ "id": "iopsLimit", "display_name": "IOPS Limit" }
]
}
5.3.2 创建自定义存储策略
curl -k -u "${VC_USER}:${VC_PASS}" -X POST "https://vcsa.example.com/rest/appliance/storage/policy" \
-H "vmware-api-session-id: ${VC_TOKEN}" \
-H "Content-Type: application/json" \
-d '{
"create_spec": {
"name": "OSA-Policy-API",
"description": "通过 API 创建的 OSA 存储策略",
"rules": [
{
"id": "hostFailuresToTolerate",
"properties": { "hostFailuresToTolerate": 1 }
},
{
"id": "proportionalCapacity",
"properties": { "proportionalCapacity": 2 }
},
{
"id": "objectSpaceReservation",
"properties": { "objectSpaceReservation": 100 }
},
{
"id": "checksumEnabled",
"properties": { "checksumEnabled": true }
},
{
"id": "cacheReservation",
"properties": { "cacheReservation": 10 }
},
{
"id": "iopsLimit",
"properties": { "iopsLimit": 10000 }
}
]
}
}'
返回示例:
{
"value": {
"policy_id": "policy-12345",
"name": "OSA-Policy-API",
"description": "通过 API 创建的 OSA 存储策略"
}
}
5.3.3 将策略应用到虚拟机硬盘
# 获取虚拟机 ID
VM_ID=$(curl -k -u "${VC_USER}:${VC_PASS}" -X GET "https://vcsa.example.com/rest/vcenter/vm?filter.names=WebVM" \
-H "vmware-api-session-id: ${VC_TOKEN}" | jq -r '.value[0].vm')
# 获取硬盘设备 ID(假设只一个硬盘)
DISK_ID=$(curl -k -u "${VC_USER}:${VC_PASS}" -X GET "https://vcsa.example.com/rest/vcenter/vm/${VM_ID}/hardware/disk" \
-H "vmware-api-session-id: ${VC_TOKEN}" | jq -r '.value[0].disk')
# 应用策略
curl -k -u "${VC_USER}:${VC_PASS}" -X POST "https://vcsa.example.com/rest/vcenter/vm/${VM_ID}/hardware/disk/${DISK_ID}/storage/policy" \
-H "vmware-api-session-id: ${VC_TOKEN}" \
-H "Content-Type: application/json" \
-d '{
"policy": "policy-12345"
}'
说明:
- 先通过 API 获取各规则 ID;
- 然后通过
POST /rest/appliance/storage/policy
创建自定义策略,返回policy_id
;- 最后查出虚拟机和硬盘 ID,将策略通过
POST /rest/vcenter/vm/.../hardware/disk/.../storage/policy
应用。
六、实战注意事项与最佳实践
跨故障域部署
- 在机架或机房级别设置故障域 (Fault Domain),确保副本分布在不同物理区域。
- 配合 FTT=1 或更高,保证单机柜断电也能继续提供服务。
磁盘组配置
- 建议每个磁盘组使用至少 1 个高速 NVMe/SSD 作为缓存盘与 1-2 块容量盘;
- 对于 I/O 密集型工作负载,可选用全 SSD 磁盘组。
策略验证(SPBM 策略健康检查)
- 在 vSphere Client → vSAN → 监控 → 策略健康中,可看到各对象是否满足策略。
- 定期检查对象重建 (Resync) 状态,防止因节点故障导致数据重分发过慢。
容量与性能监控
- 利用 vRealize Operations Manager (vROps) 对 vSAN 性能进行监控,包括延迟、吞吐、缓存命中率等。
- 注意 IOPS Limit 设置,避免对关键 VM 预留不够的缓存引发性能瓶颈。
升级与兼容
- 升级 ESXi/vSAN 版本时,注意 OSA 架构在高版本中可能会被 ESA 功能限制。
- 升级 vCenter 及 ESXi 时,先在非生产环境进行验证,确保策略正常迁移与应用。
七、常见问题解答
Q1:为什么 FTT=1 下还需要 Witness?
- Witness 组件只存储元数据,不占用大容量的空间。其作用在于当一个数据副本所在主机宕机时,通过仲裁见证组件决定哪个副本为活动副本,保证 quorum。
Q2:Stripe Width 设置为 1 与 2 的区别?
- Stripe Width=1:对象只有一个数据组件和一个 Witness(FTT=1)。仅利用单个磁盘组写入,性能偏低但资源消耗最少。
- Stripe Width=2:对象拆为 2 个数据组件,可并行写入两组磁盘组,提高性能;代价是占用更多磁盘组资源,并且需要更多磁盘组满足策略。
Q3:为什么在 OSA 中不建议使用 RAID-5/6(Erasure Coding)?
- 在 vSAN 6.6 前版本,Erasure Coding 仅支持 ESA 架构;OSA 只支持镜像 (RAID-1)。Erasure Coding 带来更高空间利用率,但在 OSA 中性能开销较高且不灵活。
Q4:如何排查对象无法满足策略?
- 在 vSphere Client → vSAN → 对象浏览器 中,查看 “组件不满足策略” 警报,定位哪些对象因哪些原因失败(磁盘组空间不足、主机离线、故障域不足等)。
八、总结
本文全面介绍了 VMware vSAN OSA 存储策略的关键属性(FTT、Stripe Width、OSR、缓存保留、IOPS 限制、校验等),并通过“图1”直观演示了 OSA 模式下对象组件的分布机理。同时给出了 PowerCLI 与 vSphere REST API 代码示例,演示如何创建、配置并验证策略。
评论已关闭