三种存储回答的是同一个问题的不同答案:数据放在磁盘上,你以什么“单位”读写它——按块、按文件,还是按整个对象。这个选择基本决定了你的系统能干什么、不能干什么。
块存储:一摞没有标签的抽屉
块存储(block storage)把磁盘切成固定大小的块(block),每块一个编号,系统只知道“编号 + 一段数据”,并不关心里面装的是什么。像一排快递柜:A-01、A-02……你说“读第 1024 号柜子里的一段”,它就把这段数据给你;你说“把这段写回去”,它原地覆盖。
所以块存储能精确到字节地改、随机读写快、延迟低。代价是“记录”得你自己做:哪个块属于哪个文件、文件有多长,块存储一概不管。谁来管?文件系统。
文件存储:给抽屉贴上目录和文件名
文件存储(file storage)在块之上加了一层文件系统(file system),于是有了目录、文件名、权限、锁。像图书馆:不光有书架,还有书名、索书号和借阅登记。
它最大的好处是能通过 NFS、SMB 这类协议挂载(mount)成机器上的一个目录,老程序照常 open/read/write,几乎不用改代码;多台机器还能同时看到同一棵目录树。代价是元数据操作变重,海量小文件和高并发写入会成为瓶颈。
对象存储:报单号取整件包裹
对象存储(object storage)直接放弃目录树,改成扁平的“桶 + 键(key)”:每个对象(object)= 键 + 数据 + 元数据(metadata),通过 HTTP 接口整件存、整件取。像快递驿站,你报单号,它把整个包裹递给你——想改里面一支笔,也得整件换掉重新寄。
换来的是近乎无限的横向扩展、多副本带来的耐久性,以及版本控制、生命周期策略这类能力。
| 对比项 | 块存储 | 文件存储 | 对象存储 |
|---|---|---|---|
| 读写单位 | 固定大小的块 | 文件 | 整个对象 |
| 能否原地改一个字节 | 能 | 能 | 不能,要整对象重写 |
| 能否像目录一样挂载 | 要先格式化出文件系统 | 能 | 需网关套壳才能 |
| 能否无限堆 | 受卷容量约束 | 中等 | 近乎无限 |
| 典型接口 | 块设备协议 | NFS / SMB | HTTP API |
怎么选:三问
能不能改一个字节?要,选块存储。能不能像目录一样挂载?要,选文件存储。会不会一直堆、堆到很大?会,选对象存储。
AI 场景里的常见组合:训练数据集和模型权重(checkpoint)放对象存储,训练机本地用块存储做高速缓存,多机共享代码和小文件用文件存储。对象存储也能通过网关以文件接口暴露,但那是套壳,别指望它有本地文件系统的性能。具体规格和计费方式,以各家官方页面为准。
