RustFS 统一存储 — 完整设计开发计划(中文版)
RustFS 统一存储 — 完整设计开发计划(中文版)
文档编号: RUSTFS-PLAN-001(总执行计划)
状态: 草案
版本: 1.0.0
权威设计: RUSTFS-MD-DESIGN-005(全新构建,无迁移)
支撑文档: FEAT-001、LLD-001(I/O 栈)、LLD-002(随机读)、
MD-DESIGN-001/002(元数据)、MD-DESIGN-003(xl.meta——已废止)
语言: 中文 (English mirror: rustfs-dev-plan-EN.md)
1. 项目概述
1.1 目标
在全新代码库上构建云原生统一存储平台,通过单一命名空间对同一份数据提供:
- 文件(POSIX)——高带宽、低延迟,针对 AI "一次写入、多次 fseek/fread" 负载优化。
- 对象(S3)——完整 S3 兼容 API。
- 块——经 iSCSI 与 NVMe-oF 的 VM / 裸金属磁盘。
1.2 架构(最终,源自 DESIGN-005)
无状态 MDS + 事务型 KV + 公式驱动布局
数据面客户端 ↔ chunk 直连(MDS 永不在数据路径上)
chunk 服务把经验证的 RS / bitrot / 磁盘 / heal 作为库复用
无迁移、无 xl.meta、无共存——系统只见自己的格式
1.3 非目标(v1)
✗ 去重(暂缓——需全局内容索引;破坏简洁性)
✗ 与任何旧 on-disk 格式的向后兼容(全新构建)
✗ 多区域双活(后续;v1 为单区域 + 异步复制)
2. 组件 / Crate 映射
Crate / 模块 职责 track
──────────────────── ────────────────────────────────────── ─────
rustfs-kv TransactionalKv trait;内嵌 A(元数据)
(redb/RocksDB)+ TiKV 后端
rustfs-inode InodeAttr、Layout、DentValue、Volume、 A
ExtentEntry、键编解码
rustfs-placement HRW 放置、ClusterMap、偏移→chunk 换算 A(A+C 共享)
(MDS 与客户端共享)
rustfs-mds 无状态元数据服务;文件系统语义事务; A
inode 区段分配器;gRPC
chunk-format on-disk chunk 格式规范 + 编解码 B(数据)
(自校验内联 bitrot)
chunk-store 全新 ChunkStore:chunk-key 寻址, B
复用 RS/bitrot/磁盘/heal 库
packing 小文件打包:容器管理(append/seal)、 B
Slice 指针、打/解包、压实 GC。容器即大的
内部文件 → 复用 chunk-store。
ecstore-core(复用) Reed-Solomon 编解码 B(既有)
bitrot(复用) 流式 HighwayHash bitrot B(既有)
disk-io(复用/新) io_uring 磁盘引擎 + 缓冲池 B
heal(复用) 重建数学 B(既有)
rustfs-client 客户端内核:放置、集群映射缓存、 C(客户端)
元数据缓存、重试/对冲、熔断、chunk 传输
rustfs-fuse FUSE 挂载;预读(顺序)+ 随机读路径; C
无租约缓存
s3-frontend 构建于 MDS + ChunkStore 之上的 S3 API C
block-frontend 卷管理(EXTM、精简/COW)、iSCSI、 C
NVMe-oF target
rustfs-rdma RDMA 数据面传输 D(平台)
obs / metrics(复用) OpenTelemetry + Prometheus D
test-harness 一致性 + 混沌 + 基准 测试台 D
3. 开发 Track(可并行)
Track A — 元数据 rustfs-kv、inode、placement、mds
Track B — 数据 chunk-format、chunk-store、packing(+ 复用 RS/bitrot/磁盘/heal)
Track C — 客户端 client、fuse、s3-frontend、block-frontend
Track D — 平台 rdma、可观测性、HA、测试、基准
Phase 0 之后,A 与 B 并行;C 在 A+B 暴露稳定 API 后启动;D 的测试台从 Phase 1 起 持续运行,性能/RDMA 置后。
4. 分阶段计划、里程碑、验收
Phase 0 — 设计冻结与脚手架 (M0)
确定开放问题(DESIGN-005 §6):
Q1 KV 后端:先内嵌 redb/RocksDB;HA 用 TiKV。
Q2 inline_threshold(默认 16 KiB;按后端上限)。
Q3 on-disk chunk 格式规范(stripe_unit、内联 bitrot 块、chunk-key 路径)。
Q4 默认存储策略(数据集用 EC k+m;块/小文件用副本)。
Q5 ChunkStore = 全新薄存储(确认),复用 RS/bitrot/磁盘/heal。
搭建:
· 单仓 crate 骨架、CI(构建/测试/lint/覆盖率)、特性开关
· Protobuf 线协议契约(MDS gRPC、ChunkStore gRPC、GetClusterMap)
· chunk-format 规范文档 + 黄金测试向量
· 测试台骨架(一致性/混沌/基准占位)
M0 验收:所有 crate 骨架在 CI 通过;protobuf + chunk-format 规范评审并冻结;
Q1–Q5 已决策并记录。
工作量:约 1 个月。
Phase 1 — 元数据内核 (M1) [Track A]
交付:
· rustfs-kv:TransactionalKv trait + 内嵌后端;SSI 语义;CAS
· rustfs-inode:全部类型 + 键编解码 + 序列化
· rustfs-placement:对集群映射做 HRW;偏移→chunk;确定性 dist/path
· rustfs-mds:inode 区段分配器;create/lookup/getattr/setattr/mkdir/
rmdir/readdir/rename/unlink/link/symlink/xattr 各为单次 KV 事务;
OpenLayout、GetClusterMap、CommitWrite、卷 RPC(可桩);gRPC 服务端
· VIDX 版本行;PEND/DELQ 行定义
M1 验收:
· 全部元数据操作在内嵌 KV 上通过单元 + 集成测试
· 跨目录 rename 原子(事务测试)
· readdir 为单次范围扫描;lookup/getattr 单次 get(性能断言)
· 崩溃测试:操作中途杀 MDS → 重启后 KV 一致
工作量:约 2.5 个月。
Phase 2 — 数据面 / chunk 服务 (M2) [Track B]
交付:
· chunk-format:自校验 on-disk 格式;编解码;黄金向量通过
· disk-io:io_uring 引擎(逐盘 ring、固定缓冲)+ tokio::fs 兜底
· chunk-store:write_chunk/read_chunk/delete_chunk(chunk-key、字节范围);
复用 RS 编解码;读时内联 bitrot 校验;分片损坏/缺失时 heal 重建
· packing:容器管理(open/append/seal)、Slice 读路径、按容器 CMTA
(dead_bytes)、压实 GC;容器即大的内部文件,复用 chunk-store + 公式布局
· 放置集成:chunk_set/path/dist 与 MDS 计算完全一致
· 新 file_id 的 PEND 写意图;孤儿 GC 巡查器;DELQ chunk GC
M2 验收:
· 写一个 chunk,按任意字节范围读回,逐字节一致
· 在盘上损坏一个分片 → 仍能经重建读取成功;heal 修复
· 客户端与 MDS 对 10^6 个随机 key 计算出完全一致的位置
· 4 KiB 读的 EC 部分读放大 < 1.2x(LLD-002 目标)
· 把 10^6 个小文件打包进容器;经 Slice 逐个读回;删除后压实回收空间
(KV 无数据本体;验证 KV 仅存元数据)
工作量:约 3.5 个月(与 Phase 1 尾部重叠)。
Phase 3 — 客户端 + FUSE(POSIX MVP) (M3) ★ 关键可用里程碑 [Track C]
交付:
· rustfs-client:放置引擎、集群映射缓存、元数据缓存(基于 version、
close-to-open)、重试/退避、对冲读、熔断、chunk 传输(先 gRPC,后 io_uring TCP)
· rustfs-fuse:open/read/write/seek/close/stat/readdir/mkdir/rename/unlink/
truncate/fsync;内联小文件快路径
· 预读引擎(顺序 + 跨步检测)
· 随机读路径:open 时取全量 chunkmap、片段缓存(TinyLFU)、高 QD 路径;
尊重 posix_fadvise
· 崩溃一致性:先数据后 CommitWrite;PEND 生命周期
M3 验收:
· 挂载;dd 1 GiB 写 + md5 读回;ls -la;cp;rename;rm
· "一次写入、多次 fseek/fread":fio randread > 目标 IOPS;p99 达标
· 顺序读接近 DSS 聚合带宽(预读生效)
· 多进程读者(模拟 DataLoader)open 后读取不再打 MDS(无租约 version 缓存生效)
工作量:约 3 个月。
Phase 4 — S3 统一命名空间 (M4) [Track C]
交付:
· s3-frontend:PutObject/GetObject/DeleteObject/ListObjects(V2)/HeadObject;
分段(暂存 parts → Complete 时写 formula chunk);范围 GET;条件请求;
对象标签;桶操作
· 桶↔目录映射(/buckets/<bucket>/<key>);ListObjects = readdir
· 经 VIDX 的版本
M4 验收:
· s3-tests 一致性套件通过(核心 + 分段 + 版本子集)
· 经 S3 写入的数据可经 FUSE 挂载读取,反之亦然(同一 inode)
· 10^7 对象桶的 ListObjects 为每目录 O(1)(延迟证明)
工作量:约 2 个月。
Phase 5 — 块存储 (M5) [Track C]
交付:
· block-frontend 卷管理:EXTM 区段映射;精简配置;COW 快照;克隆;扩容
· NBD 服务(最简,供测试)→ iSCSI target(生产)→ NVMe-oF
· 写顺序 WAL;SYNCHRONIZE_CACHE/flush 语义;UNMAP/TRIM
M5 验收:
· 创建卷;经 iSCSI 挂载;从中引导一台 QEMU/KVM 虚机
· 快照 + 克隆 + 扩容验证;虚机 fsync 后数据一致
· 4 KiB 随机写延迟达标(LLD-001)
工作量:约 3 个月。
Phase 6 — HA 与横向扩展 (M6) [Track A + D]
交付:
· rustfs-kv 的 TiKV 后端(集群、分布式事务)
· 负载均衡 / 客户端轮询后多个无状态 MDS;会话故障转移
· 集群映射 epoch 变化 → 公式重定位 → 在线再平衡
(copy-then-switch,限速);节点增删;节点丢失时 heal
M6 验收:
· 负载下杀一个 MDS 实例 → 客户端故障转移,无错误外泄
· 增加一个节点 → 数据在线再平衡,客户端 I/O 影响 < 10%
· KV 元数据操作随 MDS 实例数近线性扩展(mdtest)
工作量:约 2.5 个月。
Phase 7 — 性能与加固 (M7) [Track D]
交付:
· RDMA 数据面传输(读用 READ 拉取,写用 WRITE 推送);
传输协商(RDMA → io_uring TCP → gRPC)
· io_uring 调优:SEND_ZC、IOPOLL 随机读 ring、NUMA 绑定
· 随机读:访问计划提示 API + 框架 shim;DSS 热片段层
· FUSE-over-io_uring(内核 ≥ 6.14)带兜底
· (可选)GPUDirect Storage 路径
M7 验收(LLD-001/002 目标):
· 4 KiB 随机读 p50 < 15 µs(RDMA),p99 < 50 µs
· 随机读 > 500 K IOPS/客户端(RDMA、EC 部分读)
· 带访问计划的乱序 epoch 训练:相比无计划 > 5x;GPU 利用率 > 90%
· 顺序聚合带宽随 DSS 节点线性扩展
工作量:约 3.5 个月。
Phase 8 — 生产就绪 (M8 / GA) [Track D]
交付:
· 可观测性:MDS/ChunkStore/客户端 的指标、追踪、仪表板
· IAM/策略集成;静态加密(复用);审计
· 运维工具:集群引导、节点生命周期、KV 备份/恢复
· Kubernetes CSI 驱动(RWX FUSE,RWO 块)
· 浸泡(30 天)+ 混沌 + Jepsen 式一致性测试 全绿
· 文档(管理、API、调优)——双语
M8 验收:通过生产就绪评审;满足 GA 标准。
工作量:约 3 个月(与 Phase 7 重叠)。
5. 里程碑时间线(粗略,约 8–10 人团队)
季度 在研里程碑 可用产出
──────── ───────────────────────────────────────── ────────────────────────
Q1 M0 冻结;M1 元数据内核;M2 启动 —
Q2 M2 chunk 完成;M3 FUSE MVP ★ POSIX 可用(fseek/fread)
Q3 M4 S3;M5 块启动 文件 + 对象统一
Q4 M5 块完成;M6 HA 块 + 集群 HA
Q5 M7 性能 达到 AI 性能目标
Q6 M8 生产就绪 GA
到 POSIX MVP 的关键路径: M0 → M1 → M2 → M3 ≈ 7–9 个月
到 GA 的关键路径: ≈ 18–24 个月
并行:M0 后 Track A 与 B 并行;Track C(FUSE)在 Phase 2 中期对接(先 mock 后真实 API)启动;Track D 测试从 M1 起运行。
6. 依赖图(构建顺序)
┌── rustfs-kv ──┐
M0 ──────┤ ├── rustfs-mds ──┐
└── rustfs-inode┘ │
│ ├── rustfs-client ── rustfs-fuse (M3)
rustfs-placement(共享)──────────┤ ├── s3-frontend (M4)
│ └── block-frontend (M5)
┌── chunk-format ──┐ │
M0 ──────┤ ├── chunk-store ──┘
└── disk-io ───────┘ (复用 RS/bitrot/heal)
│
rustfs-rdma ─────────────────────┴── 性能 (M7)
TiKV 后端 ──────────────────────────── HA (M6)
7. 测试与验证策略
层级 内容 时机
───────────── ───────────────────────────────────────── ──────────────
单元 逐 crate 逻辑、编解码、事务 各阶段,CI 门禁
集成 MDS + ChunkStore + 客户端 端到端 从 M2 起
一致性套件 POSIX(pjdfstest)、S3(s3-tests)、 M3 / M4 / M5
块(fio、libiscsi/SCSI 合规)
混沌 杀 MDS、杀 chunk 节点、分区、 从 M2;M6 门禁
写中途崩溃(PEND/GC 正确性)
一致性 对 KV 事务 + rename/create 做 Jepsen 式 M1 + M6
性能 fio(IOPS/延迟)、IOR/mdtest(并行)、 M3 基线;M7 目标
真实 GPU 训练(利用率)
浸泡 30 天连续负载 + 故障注入 M8
回归 每次合并的 CI 性能 + 正确性门禁 持续
8. 风险登记
风险 缓解
──────────────────────────────────── ──────────────────────────────────────────
FUSE 开销限制 POSIX 吞吐 FUSE-over-io_uring(M7);后续原生客户端;
M3 早期度量
io_uring 内核版本碎片化 trait 抽象的 disk-io + tokio::fs 兜底;
特性探测
商用集群无 RDMA 传输协商 → io_uring TCP
KV(元数据)成为瓶颈 基于 version 的客户端缓存;数据本体**绝不**
入 KV(打包,见 M2);TiKV 分片;M1/M6 基准
亿万级小文件(AI 数据集、node_modules、 打包进大容器(M2);KV 只存元数据 + Slice
pip/conda、临时构建) 指针;客户端写批量化;inline 上限仅给 ≤~1KB;
压实 GC 按高churn(临时/依赖树)定容量
公式放置 vs 再平衡 集群映射 epoch + HRW(最小迁移);
copy-then-switch 在线再平衡(M6)
数据与 KV 提交之间的崩溃窗口 PEND 写意图 + GC 巡查器;M2/M3 混沌验证
chunk on-disk 格式错误代价高 M0 冻结格式 + 黄金向量;格式头带版本以备将来
ChunkStore 全新构建范围蔓延 严格把 RS/bitrot/磁盘/heal 作为库复用;
外壳保持薄(M2 范围守门)
EC 部分写放大(块) 策略路由:块/随机写用副本;写一次数据集用 EC
打包压实在大量删除/临时文件churn下滞后 压实器吞吐按 churn 定容;按容器 dead_bytes
阈值触发;相对客户端 I/O 限速(类同再平衡)
9. 完成定义(逐里程碑)
M0 规范冻结,骨架 CI 全绿,Q1–Q6 已记录
M1 元数据操作在内嵌 KV 上正确 + 原子 + 崩溃安全
M2 chunk 读写逐字节一致、自校验、损坏可 heal、公式一致;小文件打包
(打包/读取/压实)可用;验证 KV 仅存元数据
M3 POSIX 挂载以目标 IOPS/延迟服务 fseek/fread 负载
M4 S3 一致性 + 文件/对象双向可见 + O(1) 列举
M5 虚机从块卷引导;快照/克隆/扩容正确
M6 MDS 故障转移 + 在线再平衡 + 元数据线性扩展
M7 AI 性能目标达成(RDMA 延迟、IOPS、计划乱序吞吐)
M8 可观测性 + CSI + 浸泡/混沌/一致性全绿;通过 PRR → GA
10. 团队结构(建议,约 8–10 人)
2 元数据(Track A):KV 抽象、MDS、placement
2 数据(Track B):chunk-format、chunk-store、packing、disk-io/io_uring
2–3 客户端(Track C):FUSE、S3、块 前端
1–2 平台(Track D):RDMA、可观测性、HA、CSI
1 测试/性能工程(测试台、一致性、混沌、基准)——从第一天起
1 技术负责人 / 架构师(负责规范、跨 track API、设计冻结)
11. 首批行动(未来 2 周)
1. 冻结 on-disk chunk 格式(Q3):编写 chunk-format 规范 + 黄金向量。
2. 锁定 protobuf 线协议契约(MDS + ChunkStore + GetClusterMap)。
3. 决策 KV:在 TransactionalKv 后立起内嵌 redb/RocksDB;预研 TiKV。
4. 立起单仓 crate 骨架 + CI + 测试台外壳。
5. 预研 rustfs-placement(HRW + 集群映射),用单元测试证明 客户端/MDS 一致——
它支撑整个"公式"论点,必须尽早钉死。
12. 小结
一套全新、单模型的统一存储:事务型 KV 之上的无状态 MDS(只存元数据,绝不存数据
本体)、纯公式布局、客户端直连数据面、复用经验证 RS/bitrot/磁盘/heal 的薄 chunk
存储,以及面向 AI 数据集与代码/依赖树中亿万级小文件的一等小文件打包。跨 4 条并行
track、8 个里程碑构建;POSIX MVP 约 7–9 个月,GA 约 18–24 个月。无迁移、无共存、
无遗留格式——永远。
英文镜像:rustfs-dev-plan-EN.md。执行权威设计 RUSTFS-MD-DESIGN-005, 辅以 FEAT-001、LLD-001、LLD-002。