的数据块映射)
S2DStorage Spaces Direct的 chunk mapping数据块映射本质是它整个分布式存储系统的核心地址系统。你可以把它理解为把一个虚拟磁盘VHDX/CSV 卷中的逻辑数据块映射到集群中所有物理磁盘上的分布式坐标系统。一、先给结论S2D 的 chunk mapping 是什么S2D 使用的是一种虚拟化分层映射结构Virtualized Extent-Based Mapping核心结构Volume (CSVFS) ↓ Storage Spaces Virtual Disk ↓ Slab / Chunk Mapping Table核心 ↓ Extents逻辑块 ↓ Physical Disk Fault Domain详细描述CSVFSCluster Shared Volume File System 是 S2D 最常用的接入层但它本身不负责块在哪。CSV 只解决多个节点同时挂载同一个卷、并发访问不冲突把 I/O 重定向到协调节点coordinator node。也就是说S2D 的地址在 CSV 之下不在 CSV 之上。这个分层的好处是上层的 NTFS、应用程序、Hyper-V 看到的还是普通块设备VHDX/CSV完全感知不到底下是几十块 NVMe 还是混插的 HDDSSD。Virtual Disk 这一层是 S2D 自己抽象出来的逻辑盘对应Get-VirtualDisk的对象。Slab/Chunk Mapping Table 是 S2D 内部维护的私货对外不可见。二、S2D 的Chunk到底是什么在 S2D 中chunk通常指固定大小的逻辑分配单元Extent / Slab。典型粒度1 GB常见 slab size或更细粒度 extent⚠️注意它不是 RAID stripe unit而是虚拟存储分配单位。详细描述Slab 是 S2D 里的分配单位allocation unit。一个 Virtual Disk 会被切成很多个 Slab每个 Slab 独立决定副本策略、独立做故障恢复。所以 Slab 不能太小否则映射表爆炸也不能太大否则小文件浪费空间。1 GB 是 S2D 的默认值也是工业界共识。Extent 在 S2D 内部文档里更接近chunk是 S2D 内部用于 I/O 调度的更小单位。一个 Slab 由若干个 Extent 组成Extent 的粒度通常和存储总线/扇区对齐常见 256 KB 或 1 MB。Slab ≠ Stripe Unit。RAID-5/6 的 stripe unit 决定的是一次写跨几个盘、校验块放哪S2D 的 Slab 决定的是一段连续逻辑地址放哪几个盘不参与条带打散S2D 的 parity 是按 Slab 分组的而不是按字节条带。还有一个容易混淆的概念是interleave是 S2D Virtual Disk 的一个属性描述一次 I/O 跨多少块物理盘做并行写入。Interleave 和 Slab 是两个正交的东西一个管扇区怎么散一个管块放哪里。三、核心结构三层映射模型S2D chunk mapping 不是一层而是三层结构1️⃣ 第一层虚拟卷 → Extent逻辑层例如VHDX / CSV Volume ↓ Logical Block Address (LBA)被切分为1 MB / 256 KBI/O 粒度汇聚成 extents逻辑连续块2️⃣ 第二层Extent → SlabS2D 核心这是关键层Slab S2D 的分配与调度单位每个 slab大小通常为 1 GB属于某个虚拟磁盘VDisk绑定副本策略mirror / parity映射表Slab ID → {Disk1, Disk7, Disk12}2-way mirror → 2 个物理位置3-way mirror → 3 个物理位置Parity单奇偶→ 1 数据 1 校验多盘双奇偶 → 1 数据 2 校验3️⃣ 第三层Slab → Physical Disk Extent最终落到NVMe / SSD / HDD具体 offset物理地址Slab ↓ Physical Extent ↓ Disk sector address详细描述LBA 到 Extent 的切分取决于两个东西底层磁盘的physical sector sizeS2D 默认按 4 KB 对齐但如果是高级格式 512e 也会兼容以及Get-VirtualDisk | Get-StorageTier的Interleave属性。Mirror 和 Parity 是 Per-Slab 策略。这意味着同一个 VDisk 里可以有前面 100 GB 是三副本后面 1 TB 是双副本——实际生产中很少这么用但能力是具备的。副本 / 校验的具体盘不是 Slab 内部决定的而是由 S2D 的 placement 算法 决定的。Slab 表格里只记录放哪了不记录为什么放那。Sector address 落到磁盘时S2D 还会再走一层physical disk 的 sector 偏移。如果你的盘是分区过的partitionedS2D 会自动避开分区表所在区域避免把元数据写到分区头。四、S2D Chunk Mapping 的核心数据结构内部维护一个关键结构Mapping Table类似分布式 FAT / inode字段含义Slab ID逻辑块编号Policymirror / parityFault Domain节点 / 机架Disk list实际存储位置Offset物理位置Health state是否降级详解描述这张表在 S2D 里叫 allocation map 或 slab allocation map由 Cluster ServiceClusSvc 统一管理不会 单独存在某一个节点上。它通过集群注册表 / 分布式协调类似 Raft 思路保持一致。所以即使一个节点掉电这张表也不会丢。Health state 至少包含Healthy/Degraded一个副本丢了/Shrinking正在回收/InRepair正在重建。Get-VirtualDisk | Get-StorageReliabilityCounter能看到一部分。Disk list 不是写死的——它会随时间漂移。系统会周期性调用rebalancer根据当前 IO 热度、容量、故障域分布悄悄 调整某些 Slab 的位置业内叫slab rebalancing。这意味着你在两台机器上跑Get-PhysicalDisk | Get-StorageReliabilityCounter看到的在某盘上分配了多少会变化。没写进表的内容S2D 的 mapping table 里不存数据本身这是显然的也不存文件路径 / 文件名。文件级元数据归 NTFS / ReFS 管chunk mapping 只管盘上的字节属于哪一块逻辑地址。五、一个真实写入示例假设2-way mirror3 节点集群Node A / B / C写入一个 4 MB 文件Step 1切块4 MB → 4 × 1 MB extentsStep 2分配 slabExtentSlabE1S1001E2S1002E3S1003E4S1004Step 3映射到物理磁盘chunk mappingS1001Primary: Node A / NVMe0 Replica: Node B / NVMe1 S1002Primary: Node B Replica: Node C S1003Primary: Node C Replica: Node AStep 4写入路径App write ↓ CSVFS ↓ SBL (Storage Bus Layer) ↓ Chunk mapping lookup ↓ Parallel write to disks详细描述SBLStorage Bus Layer 是 S2D 内核态的核心组件它把逻辑 I/O翻译成对 Physical Disk 的具体 I/O 请求。如果把整个 S2D 比作一个数据库SBL 就是执行引擎。CSVFS 的协调节点coordinator 不一定和 Primary 节点一致。比如应用跑在 Node ANode A 是 coordinatorI/O 被 forward 到 Node BB 才是 Slab S1001 的 Primary 之一。S2D 不要求写主本必须走 Primary 节点这是它和某些 SAN 协议不一样的地方。写盘顺序mirror 模式下 S2D 默认不是同步双写而是 write-back cache 异步同步。如果开了 Storage Bus Cache混插 S2D 里的性能层数据会先写 SSD cache再 async 落 HDD。这对延迟很敏感的应用SQL Server 事务日志、Hyper-V VHDX runtime是关键。写穿write-through模式如果你用纯 NVMe 全闪 S2D没有混合层行为退化为两份都落盘才返回成功延迟更稳但 RT 更高。Parity 写入比 Mirror 复杂得多。Parity 模式下 S2D 还要做读改写read-modify-write和重组reconstruct write。一次 4 KB 写入可能涉及读出整个 stripe几 MB、计算新校验、写回。这是 S2D Parity 比 Mirror 慢几十倍的根本原因。六、S2D Chunk Mapping 的关键特性1️⃣ 动态分布Dynamic Placement不固定 RAID stripe每个 slab 可在任何磁盘。 类似 Ceph CRUSH但微软实现。2️⃣ 故障域感知Fault Domain Awarenessmapping 会避免同一节点、同一机架放同一副本。3️⃣ 自动重建Rebalance当新加节点 / 磁盘失效 时系统会 Re-map slabs → 重新分布。4️⃣ 负载均衡IO aware placement不是只看容量还看IO 热度、latency、queue depth。详细描述故障域Fault Domain, FD 不仅是节点和机架。在 Azure Stack HCI 里FD 还能细到机箱chassis、机柜顶rack top、电源回路。Get-ClusterFaultDomain可以看完整层级。一个 3-way mirror 的副本一定落在 3 个互不重叠的故障域里。Rebalance 不是瞬间完成。新加节点后Start-StorageReliabilityCounter或 storage job 会在后台慢慢搬 slab速率被限流避免影响业务 IO整个池可能要几小时到几天才完全 rebalance 完。期间性能会有抖动。磁盘失效 vs 节点失效 的处理路径不一样单盘坏S2D 触发 Repair job按 Slab 重建坏的那个副本。整机掉cluster 先仲裁quorum——超过半数节点在线才继续服务只要还能保持 quorum受影响 Slab 进入degraded awaiting repair修复由剩余节点上的副本承担。仲裁丢失所有 Slab 暂时停服。这是为什么 S2D 集群推荐 2N1 节点容忍 1 节点挂而不是 2N。IO 感知的再分布 在 S2D 里叫 Storage Aware Placement但它不是实时的。是后台周期任务间隔几十分钟到几小时。所以你会看到刚加完节点第一天没动静第二天才看到磁盘读写开始迁移这种现象。七、Chunk Mapping vs RAID特性S2D Chunk MappingRAID单位slab (1 GB)stripe unit管理方式分布式映射表控制器固定扩展性线性扩展有上限重建slab 级别disk 级别故障域节点级磁盘级详细描述扩展性 这一点是 S2D 的最大卖点。传统硬件 RAID 控制器有最大盘数限制一般 16-32且性能随盘数非线性增长控制器是瓶颈。S2D 因为 placement 在软件层做且分布到所有节点能扩展到 4 节点 / 16 节点 / 64 节点Azure Stack HCI 单集群上限。RAID 的重建是替换整盘——换了新盘控制器把整盘数据按 stripe 顺序重新算出来写回去。S2D 的重建是按 Slab 重建——只重建那些副本数不足的 Slab其他 Slab 根本不需要动。所以 S2D 重建时 IO 影响远比 RAID 小且是后台限流的。RAID 没有故障域概念它的冗余度是盘级别的。S2D 故障域是节点/机架级——这意味着即使坏一块盘cluster 还会照常服务即使坏一个节点剩下的节点会接手所有该节点上的 slab 重映射。这就是 S2D 能在线换节点的原因。RAID 5 的写入惩罚write penalty 在 S2D Parity 上也存在但 S2D 通过全闪性能层 写回 cache 缓解。一句话总结S2D 把RAID 卡做的事情抽到了分布式软件层且粒度从盘降到了slab。八、一个关键理解S2D chunk mapping 本质不是存储结构而是一个分布式一致性数据地址系统Distributed Storage Addressing Layer它同时负责数据放哪里副本在哪如何恢复如何迁移如何负载均衡详细描述分布式一致性 是关键词——S2D 的 mapping table 是集群范围内一致的这和每台机器各管各的 RAID有本质区别。任何一次 slab 迁移、任何一次副本重分配都需要集群所有节点达成一致。地址系统 而不是 存储系统——注意区分。S2D 的 mapping 只管地址 → 物理位置不管这些位置上放的是什么字节。字节本身由底层 Physical Disk 负责文件结构由 NTFS / ReFS 负责。它同时是五件事placement放置、replication复制、repair恢复、migration迁移、balancing均衡。传统存储系统通常只能做其中一两件S2D 把它打包成一张统一表是它能像超融合一样灵活的根本原因。类比真实分布式系统S2D 的 chunk mapping 接近 Ceph 的 OSD map PG map 的合体但比 Ceph 简单Ceph 的 CRUSH 算法有显式权重 / 拓扑规则S2D 是内部启发式也类似 HDFS 的 NameNode 元数据但 NameNode 是单点S2D 是分布式共识。九、类比系统类比RAID单机数组NTFS 文件系统inodeS2D chunk mapping分布式 inode 路由表Ceph CRUSH同类系统但更显式算法详细描述和 Ceph 的更精确对比Ceph PG ≈ S2D Slab都是分配单位Ceph OSD ≈ S2D Physical DiskCeph OSD Map / CRUSH Map ≈ S2D Fault Domain 配置Ceph Pool ≈ S2D Storage Pool / Virtual Disk核心区别Ceph 显式分离OSD Map盘在不在 CRUSH Map怎么放 PG Map数据归谁三张表S2D 把它合并成一张 distributed mapping table。这是 S2D 部署更简单、但精细控制不如 Ceph 的原因。和传统 SAN 的对比传统 SANNetApp / VMware vSAN / 华为 OceanStor的地址系统通常叫 LUN Mapping / VMFS Metadata——它们基本是控制器单点决策 客户端缓存模型扩到几十节点就吃力。S2D 是端到端分布式决策这是它能跑超融合的根本。建立直觉的最快方式把 S2D 想象成每块盘都自己是一台小 Ceph OSD而 chunk mapping 就是这些 OSD 共同维护的分布式大脑。