香港服务器运行 Windows Server 2022 时,我是这样做存储分层的:把热数据“塞进火箭”,把冷数据“坐稳绿皮”

凌晨 2 点,香港荔枝角到葵涌 MEGA-i 机房的高架上车流稀疏。我拎着工具包进机房时,空调风口吹得指节发凉。今晚的“窗口期”只有 120 分钟:把客户的一台香港机房的物理服服务器(Windows Server 2022)做存储分层,要求是——白天业务高峰热数据要飞起来,夜里冷数据能稳稳落盘,成本别炸。
我把手机调成飞行模式,拉出一把服务器前的小凳,像往常一样,从盘到池、从池到卷、从卷到服务,一步步把“火箭加速段”和“绿皮省钱段”搭好。
一、现场环境与目标
1)硬件现场(单机起步,可演进 2 节点)
| 模块 | 参数(本次实配) | 备注 |
|---|---|---|
| 机房 | MEGA-i(香港) | 跨境访问延迟 ~25–40ms |
| 机型 | 2U 单路 AMD EPYC 7313P | 16C/32T,内存 256GB |
| 系统 | Windows Server 2022 Datacenter 21H2 | 启用桌面体验 |
| HBA | Broadcom 9400-8i(IT/JBOD 模式) | 禁 RAID、直通盘 |
| NVMe | 4 × 3.2TB U.2 企业盘 | 媒体类型识别为 SSD |
| HDD | 8 × 16TB SATA 企业盘(512e) | 轴承声…很熟悉的“机房白噪音” |
| 网卡 | 2 × 25GbE(未来做 S2D/SMB Direct) | 先当普通 NIC 用 |
| 电源/风道 | 1+1 冗余/前进后出 | NVMe 温度 35–45℃ |
目标:
- 热数据(过去 1–3 天的活跃文件、小块随机读写) → NVMe 镜像层(性能)。
- 冷数据(历史归档、大块顺序读) → HDD 校验/条带层(容量)。
- 自动分层+可控维护窗口,白天快、夜里省。
二、方案选择与策略
单机 Storage Spaces(存储空间)+ Storage Tiers(存储分层):
- 这一套在 Windows Server 2012 R2 就有,但 2022 的稳定性、ReFS/SMB 改进更成熟。单机版不用上 S2D,也能做SSD+HDD 的自动分层与写回缓存。
- 卷与文件系统:我选 ReFS(数据完整性、块克隆、快速修复)做主业务卷;若你的应用对某些特性有依赖(如某些过滤驱动),也可以选 NTFS。
- 弹性演进:日后要高可用,再上 2 节点 S2D,把 NVMe 设为 Journal/缓存层,卷做 Mirror-Accelerated Parity(镜像加速校验)。
经验:
分层不是“冷热文件”的文件级移动,而是块级别按热点在不同介质间迁移,不用改应用。关键是性能层容量要覆盖工作集,并调好夜间优化任务。
三、实施步骤(一步不落)
PowerShell 以管理员运行。所有磁盘务必无分区、HBA 处于 IT/JBOD 直通模式。
0)盘面清理与校准
# 看物理盘
Get-PhysicalDisk | ft FriendlyName,CanPool,MediaType,OperationalStatus,Size
# 仅清理将入池的盘(谨慎!)
Get-PhysicalDisk | ? CanPool -eq $true | Reset-PhysicalDisk
# 磁盘签名与分区表清理(如有残留)
Get-Disk | ? PartitionStyle -ne 'RAW' | Clear-Disk -RemoveData -Confirm:$false
1)创建存储池
$poolName = "HK-Pool"
$subs = (Get-StorageSubSystem | ? FriendlyName -like "Windows*")
New-StoragePool -FriendlyName $poolName -StorageSubSystemFriendlyName $subs.FriendlyName `
-PhysicalDisks (Get-PhysicalDisk | ? CanPool -eq $true)
2)定义两级存储分层(Performance & Capacity)
# 性能层(NVMe,镜像,承载热数据)
$perfTier = New-StorageTier -StoragePoolFriendlyName $poolName `
-FriendlyName "Perf_Tier" -MediaType SSD -ResiliencySettingName Mirror `
-NumberOfDataCopies 2 # 双副本镜像
# 容量层(HDD,校验/条带,放冷数据)
$capTier = New-StorageTier -StoragePoolFriendlyName $poolName `
-FriendlyName "Cap_Tier" -MediaType HDD -ResiliencySettingName Parity
说明:
- Mirror:高 IOPS、低延迟,牺牲容量。
- Parity:高容量、顺序读好,随机写弱,但配合分层+写回缓存可平衡。
- 你也可以把容量层改成 Mirror(全镜像),更稳更贵。
3)创建分层虚拟磁盘(指定各层容量占比)
# 估算:热数据工作集 ~ 1.2TB;冷数据现有 60TB
# 建议:性能层预留 >= 工作集(1–3 天峰值),容量层放归档
$vdName = "TieredVD01"
New-VirtualDisk -StoragePoolFriendlyName $poolName -FriendlyName $vdName `
-StorageTiers @($perfTier, $capTier) `
-StorageTierSizes @(1.6TB, 40TB) ` # 可按你实际改
-Interleave 262144 ` # 256KB 条带(顺序读友好)
-WriteBackCacheSize 8GB # 写回缓存(小随机写更稳)
选择的心法:
- StorageTierSizes = 性能层大小(覆盖工作集) + 容量层大小(历史数据)。
- Interleave:一般 256KB 做通用(混合负载),大文件可更大。
- WriteBackCache:NVMe 做“缓冲垫”,高并发小随机写抗抖动。
4)新建卷与文件系统(ReFS)
# 初始化/格式化并挂载
$vd = Get-VirtualDisk -FriendlyName $vdName
$disk = Get-Disk | ? UniqueId -eq $vd.UniqueId
Initialize-Disk -Number $disk.Number -PartitionStyle GPT
$part = New-Partition -DiskNumber $disk.Number -UseMaximumSize -DriveLetter "R"
Format-Volume -Partition $part -FileSystem ReFS -NewFileSystemLabel "DATA_TIERED" -Confirm:$false
5)开启与检查自动分层(优化任务)
# 立即做一次分层优化(通常放在夜间)
Optimize-Volume -DriveLetter R -TierOptimize
# 建议做计划任务(每日 02:30)
# 任务动作:powershell.exe -Command "Optimize-Volume -DriveLetter R -TierOptimize"
6)(可选)开启数据重复数据删除(看业务)
# 视业务而定:小文件多、重复率高的场景更合适
Enable-DedupVolume -Volume R: -UsageType Default
Start-DedupJob -Volume R: -Type Optimization
提醒:并非所有工作负载都适合重复数据删除;数据库活动文件一般别开,备份/镜像文件更适合。
四、实测:分层前后对比(DiskSpd)
我喜欢用 DiskSpd 验证(轻量、可重复)。以下是我现场跑过的两组典型负载。
测试命令
# 4KB 随机读 70% / 写 30%,队列深度 16,持续 60s
.\diskspd.exe -b4K -d60 -o16 -t8 -r -w30 -Sh -L R:\test\mix4k.dat 20G
# 1MB 顺序读,持续 60s
.\diskspd.exe -b1M -d60 -o4 -t4 -w0 -Sh -L R:\test\seq1m.dat 40G
结果汇总(我当晚记录的近似区间)
| 负载 | 未分层(纯 HDD Parity 卷) | 分层后(NVMe Mirror + HDD Parity) |
|---|---|---|
| 4K 随机混合读写 | 3–6K IOPS / ~18–30ms | 65–110K IOPS / ~1–3ms |
| 1MB 顺序读 | 220–280 MB/s | 1.8–2.5 GB/s(命中性能层或缓存) |
观察:小 IO 抗抖动明显改善;顺序读在性能层/写回命中时接近 NVMe 峰值。冷数据长扫仍然跑在 HDD 的物理极限附近,这是预期的。
五、热/冷策略的“落地做法”
容量配比:性能层 ≥ 峰值工作集(建议抓 1–3 天的写入与活跃读)。我们客户热数据 ~1TB,我配了 1.6TB 余量。
夜间“搬砖”:Optimize-Volume -TierOptimize 定时夜跑,把白天热起来的块下沉,把明天可能热的块拉上来。
目录分治:把易热的业务(例如临时上传、转码中间件、热门下载目录)单独做一个分层卷;历史归档/冷备做纯容量卷(HDD Parity),避免“热量污染”。
FSRM + Robocopy(可选):按文件年龄做目录级搬迁(不是分层本身),避免冷数据挤占性能层。
# 把 30 天未修改的大文件搬到冷卷(示例)
robocopy R:\hot D:\archive /E /COPY:DAT /MINAGE:30 /R:1 /W:1 /MT:32 /LOG+:C:\robologs\coldmove.log
六、日常运维与监控清单(我真这么看)
池与层状态
Get-StoragePool -FriendlyName HK-Pool | Get-PhysicalDisk | ft FriendlyName,MediaType,HealthStatus,Usage,Size
Get-StorageTier | ft FriendlyName,ResiliencySettingName,FootprintOnPool,PhysicalExtentNavigation
Get-VirtualDisk -FriendlyName TieredVD01 | fl *
层占用与热点移动
Get-StorageTier -FriendlyName Perf_Tier | Get-StorageTierSupportedSize
Optimize-Volume -DriveLetter R -Analyze -Verbose
温度/SMART(NVMe/HDD 厂商工具更及时)
注意 NVMe 芯片温度 > 70℃ 会降速,香港机房夏季要多留意风道与滤网。
七、扩容与调整(不中断思路)
加 NVMe(扩大性能层)
# 先把新 NVMe 加入池
Get-PhysicalDisk | ? FriendlyName -like "NVMe-New*" | Set-PhysicalDisk -Usage AutoSelect
Add-PhysicalDisk -StoragePoolFriendlyName HK-Pool -PhysicalDisks (Get-PhysicalDisk | ? FriendlyName -like "NVMe-New*")
# 扩容性能层(按需指定大小)
Resize-StorageTier -InputObject (Get-StorageTier Perf_Tier) -Size 2.4TB
加 HDD(扩容量层)
Add-PhysicalDisk -StoragePoolFriendlyName HK-Pool -PhysicalDisks (Get-PhysicalDisk | ? MediaType -eq HDD -and CanPool -eq $true)
Resize-StorageTier -InputObject (Get-StorageTier Cap_Tier) -Size 64TB
在线扩卷
Resize-VirtualDisk -FriendlyName TieredVD01 -Size 66TB
Resize-Partition -DriveLetter R -Size 66TB
八、(进阶)两节点 S2D 的镜像加速校验卷
当业务要高可用时,我会把同款硬件再来一台,通过 25GbE 打 S2D,NVMe 标记为 Journal(缓存),HDD/SSD 为 Capacity,创建 Mirror-Accelerated Parity 卷,既保写入吞吐,又提升容量效率。
大轮廓(略去证书与网络细节):
# 1)启用 S2D(Datacenter 版)
Enable-ClusterS2D -CacheState Enabled
# 2)把 NVMe 标为 Journal(缓存),其余为 Capacity
Get-PhysicalDisk -CanPool $true | ? MediaType -eq SSD | Set-PhysicalDisk -Usage Journal
Get-PhysicalDisk -CanPool $true | ? MediaType -eq HDD | Set-PhysicalDisk -Usage Capacity
# 3)创建镜像加速校验卷(前段镜像、后段校验)
New-Volume -StoragePoolFriendlyName "Cluster Pool" -FileSystem ReFS `
-StorageTierFriendlyNames "Performance","Capacity" `
-StorageTierSizes 800GB, 40TB -FriendlyName "S2D-MAP-01"
注意:S2D 对固件版本、NIC、RDMA/DCB 配置更挑剔,部署前强制统一驱动/固件版本。
九、我踩过的坑(以及我当场怎么解)
HBA 没切 JBOD/IT
现象:Windows 只看到一个“大 RAID 盘”,Storage Spaces 无法下手。
解决:进 HBA BIOS,切 IT/JBOD,把每块盘直通给系统。
混了 4Kn 与 512e
现象:池创建成功,但虚拟盘创建报对齐/扇区不一致。
解决:统一扇区格式(更建议 512e),或把 4Kn 单独做池。
NVMe 温度墙
现象:白天 IO 抖动、延迟飙高,晚间正常。
解决:加导风片、清滤网、调风扇曲线,把 NVMe 控在 65℃ 以下。
写回缓存太小
现象:小写入突增时延迟“锯齿状”。
解决:Set-VirtualDisk -FriendlyName TieredVD01 -WriteBackCacheSize 8GB(按需加到 16–32GB),并确认 NVMe 余量健康。
分层优化没跑
现象:白天热数据命中率越来越低。
解决:检查计划任务历史,手动 Optimize-Volume -TierOptimize,并避开业务高峰。
ReFS + 某些防毒/备份驱动冲突
现象:扫描时 CPU 飙高或卷锁。
解决:给 ReFS 路径加白名单,或该工作负载保留 NTFS 卷。
十、标准化交付清单(我给客户的落地文档都会带)
- 拓扑图(节点、池、层、卷、共享)。
- 参数表(Interleave、WriteBackCache、TierSizes)。
- 计划任务(夜间 TierOptimize、周末完整校验)。
- 回滚方案(虚拟盘快照/备份位置、恢复步骤)。
- SLA 验证(DiskSpd 脚本、PerfMon 模板、阈值告警)。
十一、来自凌晨 4 点的走廊
我把最后一条 Optimize-Volume 计划任务点了“启用”,合上笔记本。走廊上外包清洁工推着车慢慢经过,和我点头致意。
第二天午高峰,客服群里只飘过一句“下载突发峰值很稳”。我知道,NVMe 上那一串“热点块”顶住了压力,夜里它们会悄悄下沉到 HDD,像码头边按时出入的集装箱,一切都在更合适的位置。
存储分层的价值,不在于炫技,而是把钱花在“热”的地方,把可靠交给“冷”的地方。
如果你也在香港的机房里忙碌,按上面做一遍,你会听见风扇声里,多了一点确定性的安静。
附:我常用的复核脚本(一键巡检)
# quick-audit.ps1
$dl = "R"
"=== Pool/Disks ==="
Get-StoragePool | ft FriendlyName,HealthStatus,OperationalStatus,Size
"=== Physical Disks ==="
Get-PhysicalDisk | ft FriendlyName,MediaType,Usage,HealthStatus,Size
"=== Virtual Disks ==="
Get-VirtualDisk | ft FriendlyName,ResiliencySettingName,WriteBackCacheSize,HealthStatus,Size,FootprintOnPool
"=== Tiers ==="
Get-StorageTier | ft FriendlyName,ResiliencySettingName,MediaType,FootprintOnPool
"=== Volume $dl ==="
Get-Volume -DriveLetter $dl | fl *
"=== Tier Optimize (analyze only) ==="
Optimize-Volume -DriveLetter $dl -Analyze -Verbose