上一篇 下一篇 分享链接 返回 返回顶部

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

发布人:Minchunlin 发布时间:2025-08-28 09:12 阅读量:736


凌晨 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
目录结构
全文