书接上回:
从零开发分布式文件系统(一) :100G读写带宽,百万IO请求文件系统怎么实现的
/dev/sdaX
),路径最短,延迟极低(纳秒/微秒级)。画外音:
所以,JuiceFS、沧海存储、3FS 等国产存储系统, 不会去走 GPFS/Lustre 一模一样的老路,而是会结合自身技术优势和市场需求,
走出一条差异化的发展道路。它们可能会在以下方面发力:
这才是明智和可持续的发展路径。
维度 | 常见疑问 | 关键技术 | 解决方案 |
---|---|---|---|
元引擎 | JuiceFS 内置元服务 | 外部数据库驱动 | 提前规划 Redis/TiKV |
一致性 | 两者一样 POSIX 强一致 | JuiceFS 元强一致但数据 close-to-open | 关闭缓存或 3FS |
rename 风暴 | 3FS 无瓶颈 | FDB 乐观事务会冲突 | keyspace 设计+热点分片 |
小文件性能 | 两者差不多 | 3FS RDMA,本地 NVMe;JuiceFS 走对象存储 | JuiceFS 用小文件打包 |
可运维性 | JuiceFS 部署简单 | HA/扩容/热点规避需自管 | Meta Proxy 或企业版 |
AI 训练场景 | 可互换 | 3FS 专为大模型高并发元操作设计 | AI→3FS,湖→JuiceFS |
特性维度 | JuiceFS | 沧海存储(百度智能云) | 3FS (Fire-Flyer File System) |
---|---|---|---|
核心架构 | 数据与元数据分离,元数据存于数据库(Redis/MySQL等),数据存于对象存储(S3、OSS、MinIO等) | 统一分布式存储底座,支持对象存储(BOS)、文件存储(CFS/AFS),元数据与数据分离 | 元数据与数据分离,数据存于本地NVMe SSD,元数据依赖FoundationDB |
数据持久化位置 | 对象存储(云上或自建) | 百度智能云底层存储 | 本地NVMe SSD |
扩展性 | 弹性扩展,元数据引擎和对象存储可独立扩容 | 支持EB级别扩展,统一存储底座支持平滑扩展 | 存储层需自行管理扩展,元数据服务可水平扩展 |
缓存机制 | 支持本地缓存和分布式缓存(企业版) | 依赖百度智能云底层优化,具体机制未公开 | 无额外缓存设计(直接访问高速本地磁盘) |
网络协议 | 基于 TCP/IP | 未公开具体协议,支持标准S3/NSF等访问接口 | 支持 RDMA(远程直接内存访问),高吞吐、低延迟 |
POSIX兼容性 | 完全兼容 POSIX | 文件存储CFS/AFS支持POSIX,对象存储BOS为对象接口 | 部分兼容POSIX(如文件长度最终一致,但不支持ACL、快照等高级功能) |
适用场景 | 云原生、AI训练、大数据分析、Kubernetes持久化存储、文件共享与协作 | 对象存储(BOS):云存储、备份归档、静态资源分发 文件存储(CFS/AFS):高性能计算、AI训练、企业文件共享 | 大规模AI训练和推理(高带宽、低延迟读取场景) |
冗余与一致性 | 数据可靠性由对象存储保障,元数据依赖数据库事务 | 多副本、EC纠删码,强一致性保障 | 多副本,基于CRAQ协议实现强一致性 |
运维成本 | 较低,无需管理物理存储,依赖云服务或自建对象存储 | 作为云服务,用户无需关心底层运维 | 较高,需自行管理本地SSD硬件和数据副本 |
特色功能 | 数据压缩、加密、快照、多云数据同步、S3网关代理 | 作为百度智能云存储基座,支持多种存储服务统一集成 | Native Client(绕过FUSE,零拷贝,极致低延迟) |
开源/商业形态 | 社区版开源(Apache 2.0),企业版提供高级功能和支持 | 商业云服务(百度智能云) | 开源(MIT协议) |
JuiceFS
3FS 整个系统由四个部分组成,分别是 Cluster Manager、Client、Meta Service、Storage Service。
所有组件均接入 RDMA 网络实现高速互联,DeepSeek 内部实际使用的是 InfiniBand。
维度 | 常见误区 | 正解 | 实战解决方案 |
---|---|---|---|
元引擎 | JuiceFS 内置元服务 | 外部数据库驱动 | 提前规划 Redis/TiKV |
一致性 | 两者一样 POSIX 强一致 | JuiceFS 元强一致但数据 close-to-open | 关闭缓存或 3FS |
rename 风暴 | 3FS 无瓶颈 | FDB 乐观事务会冲突 | keyspace 设计+热点分片 |
小文件性能 | 两者差不多 | 3FS RDMA,本地 NVMe;JuiceFS 走对象存储 | JuiceFS 用小文件打包 |
可运维性 | JuiceFS 部署简单 | HA/扩容/热点规避需自管 | Meta Proxy 或企业版 |
AI 训练场景 | 可互换 | 3FS 专为大模型高并发元操作设计 | AI→3FS,湖→JuiceFS |
在大模型训练与推理中,数据访问模式和普通大数据分析、数据湖场景完全不同,
主要体现在 元数据操作(metadata operation)极度密集。
假设 GPT 训练一轮 每个 GPU 每秒 1,000 次文件 open+stat+read 8 张卡 = 8,000 ops/s 200 节点集群 = 1,600,000 ops/s → 纯元操作洪峰
操作密集指 元操作(metadata ops)洪峰,包括:
open
/ close
stat
/ list
mkdir
/ rmdir
在 AI workload 中,IO 吞吐反而不是瓶颈,每秒上百万的元操作才是杀手。
在大模型场景下,文件系统面临的元数据访问压力非常不同于传统 OLAP:
场景 | 特征 | 典型操作 |
---|---|---|
数据加载 (DataLoader) | 随机小文件访问,每个 batch 都要随机读取若干样本 | stat() + open() + read() 非常频繁 |
Checkpoint / Snapshot | 周期性大规模写入,且强一致要求 | rename()、fsync()、stat() |
推理多租户 | 同一模型多副本并行加载 | 相同小文件被高频打开 |
特点:
JuiceFS 元数据有两种模式:
结果:DataLoader 每次 open/stat 文件都受制于元数据延迟,GPU 会频繁 idle。
结论:TiKV 模式解决了“容量”,但在 AI workload 下会 拖慢吞吐。
(1) RDMA:绕过内核、零拷贝加速
(2) 无状态 Meta:横向扩展
(3) CRAQ(Chain Replication with Apportioned Queries)
对比项 | JuiceFS(Redis 模式) | 3FS 无状态 Meta |
---|---|---|
元数据存储 | Redis 单点 / TiKV Raft | 分布式 KV + Shared Log |
MetaServer 状态 | 有状态 | 无状态 |
扩展方式 | Redis/TiKV 水平扩展受限 | MetaServer 可无限水平扩展 |
元操作 QPS | 单 Redis ~ 20W QPS | > 100W QPS |
效果:支持百万级 QPS 的元数据访问,DataLoader 不再受制于元数据延迟。
3FS 无状态 Meta:
Tidb 也是这样设计呀?
层级 | 角色与状态 |
---|---|
TiDB Server | SQL 层 / 计算节点,无状态,请求路由 + 执行计划生成,内存缓存热点数据即可,节点挂掉无持久状态 |
PD (Placement Driver) | 集群元信息管理(Region 映射、Leader 信息、TSO 时间戳),有状态,必须持久化,否则集群无法定位数据 |
TiKV | KV 存储节点,有状态,存储实际数据 + Raft 日志,维护 Region 状态机 |
File metadata operations (e.g. open or create files/directories) are sent to metadata services, which implement the file system semantics. Metadata services are stateless, since file metadata are stored in a transactional key-value store (e.g. FoundationDB). Clients can connect to any metadata service
对比 3FS 无状态 MetaServer
特性 | JuiceFS + TiKV | 3FS MetaServer |
---|---|---|
节点是否持久化状态 | 有状态:Leader 保存 Raft 日志和状态机 | 无状态:节点不保存全局元数据状态,只做路由/缓存 |
元数据访问路径 | 写必须访问 Leader | 写可发到任意 MetaServer 节点,由底层 KV/log 保证一致性 |
扩展方式 | Leader 受限,高频操作瓶颈 | 任意节点处理请求 → 水平扩展天然分散 |
节点崩溃恢复 | Raft 日志回放恢复 | 节点无状态 → 秒级恢复 |
原文:
特性 | JuiceFS + TiKV | 3FS(DeepSeek) |
---|---|---|
元数据一致性 | Raft 强一致,多数派提交 | CRAQ 顺序复制 + 日志一致 |
写路径长度 | Leader + Follower 多轮 RTT | 单链尾写入,一轮 RTT |
单次写元延迟(p99) | 10~15ms | <1ms |
读取策略 | 只能读 Leader | 任意节点可读 |
AI workload 适配 | 差,易卡在元数据瓶颈 | 好,针对训练优化 |
💡 类比理解:就像银行转账——必须经过记账员A→B→行长C签字,三方全部确认才算成功,缺一不可
节点状态 | 读取行为 | 是否最新数据 | 原理 |
---|---|---|---|
Clean | 直接返回本地数据 | ✅ 是 | 该节点数据已通过 Tail 确认,与链尾完全一致 |
Dirty | 先向 Tail 查询最新版本 | ✅ 是 | Tail 拥有全局最新版本(所有写入必经它),查询后返回已提交的最新数据 |
未同步 | 从 Tail 拉取最新数据 | ✅ 是 | 节点可能落后于 Tail,但通过查询 Tail 强制同步 |
💡 关键:无论读哪个节点,最终依赖 Tail 的权威版本兜底! 即使中间节点数据未提交(Dirty),也会通过查询 Tail 获得最新值,绝不会返回旧数据。
当读取命中 Dirty 节点时,需额外向 Tail 查询。RDMA 的价值在此凸显:
对比项 | JuiceFS | 3FS |
---|---|---|
传输协议 | TCP / HTTP Range | RDMA |
内核路径 | 走 Linux TCP 栈 | 绕过内核,用户态直通 |
内存复制 | 至少 2 次 memcpy | 零拷贝 |
p99 延迟 | ms 级 | 亚毫秒 |
3FS 引入 CRAQ(Chain Replication with Asynchronous Quorums),写入与读取路径彻底优化:
效果:
https://time.geekbang.org/column/article/286082
c++周刊目的陪你一起快速冲击大厂面试
21天C++面试冲刺周刊
因为,21天就够了, 足够让我火力全开,
一万年太久,只争三周
小提示:不要把他看成一个出售给你产品,我只出售给自己 在公司做任何事情事情, 都必须清楚拆解需求功能,开发周期,最后得到什么结果, 同样面试准备也是如此,给自己一个期限 21 天,给自己大纲,然后给自己 21 天学习结果,这样自己才能安心准备下去。
曾经有一个让我心跳加速的岗位放在我面前, 我没有珍惜。 等到别人拿到 offer 的那一刻, 我才追悔莫及!
人世间,最痛苦的事情, 不是没钱吃饭, 也不是没房没车, 而是——错过了那个能让我逆天改命的机会!
如果上天再给我一次机会, 我一定会对那个岗位说三个字: “我要你!”
如果非要在这份“心动”上加一个期限, 一万年太久了…… 我只想要——21天!
你可能面临两种选择
“这个岗位太难了,我先准备一下吧。” 于是你准备1天、1周、1个月、1年…… 等再回头,3年就这样过去了。
终于等来一场面试, 你觉得问题很简单,张口就答, 结果用“几千元思维”回答“百万年薪岗位”。
一次面试失利,也许就意味着和理想岗位失之交臂。
在你犹豫的这几年里, 找工作的成本越来越高:
等你回过头来,发现不仅机会没了, 连准备的方向都变了。
让你学到每个 c++知识,都关联一个经典面试,并对对应开源项目实践
这也是我的面试方法: