块存储把数据切成固定大小的“块”按编号管理,适合数据库和虚拟机;对象存储把数据打包成“对象”附带元数据,适合海量文件存储和云原生场景。两者的设计目标完全不同,不是谁替代谁的关系,而是各管一摊。
块存储到底是什么:一块块拼出来的“硬盘”
块存储的逻辑很直白,就像把一块大硬盘切成很多小方块,每个方块有唯一地址,服务器通过SCSI、iSCSI、FC这类协议直接读写这些方块,你不需要知道文件叫什么,只需要告诉存储系统“把第N块读出来”。
块存储的工作机制
- 数据被拆分成固定大小的块,常见尺寸是4KB或8KB
- 每个块有独立的逻辑块地址(LBA),操作系统把它当成裸设备
- 文件系统(比如ext4、XFS、NTFS)跑在这些块之上,格式化后变成你熟悉的C盘、D盘或挂载点
这意味着块存储对操作系统来说就是一块“原始硬盘”,你可以在上面装Windows、跑Oracle、搭Kubernetes节点,怎么折腾都行。
典型应用场景
- 数据库:MySQL、PostgreSQL这类业务对时延极其敏感,块存储的延迟通常能做到毫秒甚至亚毫秒级
- 虚拟机虚拟磁盘:VMware、OpenStack里的虚拟硬盘文件本质上是块设备的映射
- 容器持久化存储:StatefulSet挂载的云盘就是块存储,因为容器需要像裸设备一样使用存储
云服务器数据盘就是块存储的典型形态,你买一台云主机,默认系统盘和数据盘都是块存储,因为操作系统内核必须依赖块接口读写字节约数据。
对象存储是什么:一个桶里装万物
对象存储的思维完全变了,它不再管“块”的概念,而是把每个文件、图片、视频视为一个对象,每个对象由三部分组成:
- 数据本身(Data)
- 元数据(Metadata,比如文件名、大小、创建时间、自定义标签)
- 全局唯一ID(Key)
你通过HTTP RESTful API(PUT、GET、DELETE)来操作对象,不需要挂载,不需要格式化,直接“扔”进去取出来。
对象存储的语法和特点
- 存储桶(Bucket)是顶层容器,类似文件夹但又不是文件夹
- 对象扁平排列,没有嵌套目录层级,但可以通过Key前缀模拟目录结构
- 元数据极其丰富,可以自定义标签做检索和分类
- 扩展性极强,一个桶放多少对象几乎无上限

国内云厂商的对象存储(如简米云OSS、酷番云COS、华为云OBS)本质上都是S3协议的变体,API风格一致,迁移成本很低。
谁在用对象存储
- 静态网站托管:把HTML、CSS、JS扔进桶里,配好CDN,秒开
- 图片与视频存储:社交媒体、电商平台的商品图基本都放对象存储
- 大数据分析:数据湖的底层存储几乎全部基于对象存储,因为S3协议是Spark、Flink、Presto的原生接口
- 备份归档:低频访问的数据用对象存储的冷归档类型,成本极低
块存储与对象存储的核心差异对比
要真正区分两者,不是看“谁快谁慢”,而是看访问方式和数据模型的底层差异。
访问协议不同
- 块存储走的是块协议:iSCSI(基于TCP/IP)、FC(光纤通道)、NVMe-oF
- 对象存储走的是HTTP协议:RESTful API,本质上是网络请求
这意味着块存储的客户端是操作系统内核,对象存储的客户端是应用程序代码,一个需要挂载,一个不需要挂载。
数据组织粒度不同
| 维度 | 块存储 | 对象存储 |
|---|---|---|
| 最小单元 | 固定大小的块 | 完整的对象 |
| 元数据 | 很少,只有地址 | 丰富,可自定义 |
| 目录结构 | 有,依赖文件系统 | 扁平,用Key模拟 |
| 修改方式 | 随机读写任意块 | 整体覆盖或部分更新(S3也支持范围读) |
块存储允许你精确修改某一个字节,对象存储通常需要重新上传整个对象这是语义上的根本区别。
时延与吞吐的取舍
- 块存储追求低延迟,适合频繁随机读写
- 对象存储追求高吞吐

,适合大文件顺序读写
业内专家指出,块存储的时延通常比对象存储低一个数量级,但对象存储的带宽扩展能力远超块存储,单桶聚合吞吐能轻松跑到数十Gbps。
扩展性与成本
块存储扩容往往需要规划LUN、挂载新磁盘,操作复杂且受限于单机或集群的规模上限,对象存储从设计之初就是分布式、无状态,添加节点就能线性扩容。
成本方面,同样容量下对象存储的单价通常比块存储低一半以上(主流云厂商标准型块存储价格约为0.0004元/GB/时,对象存储标准型约0.12元/GB/月,换算后差距明显),这决定了备份归档类业务几乎不会考虑块存储。
到底该选块存储还是对象存储:实操判断指南
别听厂商吹概念,直接看你的业务场景怎么对号入座。
选块存储的硬条件
- 你要装操作系统
- 你要跑传统数据库(MySQL、SQL Server、Oracle)
- 你要挂载给虚拟机或裸金属服务器
- 你对延迟有极致要求,且数据量在TB级别以内
- 你用的是Kubernetes StatefulSet且需要ReadWriteOnce
一句话:只要需要“格式化”的存储,就是块存储。
选对象存储的硬条件
- 数据是文件、图片、视频、日志等非结构化数据
- 你需要通过HTTP API直接读写,不需要挂载
- 数据量在PB级别以上,海量小文件或超大文件
- 你需要跨地域容灾、版本管理、生命周期管理
- 你要做静态网站托管或数据湖分析
对象存储适合存“结果”,比如用户上传的头像、生成的报表、归档的日志;块存储适合存“过程”,比如正在运行的数据库文件、正在写的系统日志。
具体实操示例
在云上搭建WordPress网站
- 数据库(MySQL)放块存储云盘
- 网页代码放云服务器系统盘(也是块存储)
- 上传的图片、插件包放对象存储桶,再用CDN加速
搭建Hadoop大数据集群
- HDFS的DataNode数据目录挂载多块云盘(块存储)
- 但如果用的是云原生数据湖,直接让Spark读取对象存储桶,省掉HDFS
做视频监控存储

- 视频流写入块存储在低于100路摄像头时也能扛住,但成本高
- 改成对象存储,直接把RTMP流切片后用PUT请求写入桶,存储成本降一半以上
块存储和对象存储的未来会互相融合吗
行业共识认为,两者短期内不会融合,但边界在模糊,具体表现如下:
- 对象存储也在做低延迟优化,比如S3 Express One Zone这一类产品,时延已经压到毫秒级
- 块存储也在做云原生改良,比如AWS的EBS gp3允许按需调整IOPS和吞吐
- 新协议如NVMe-oF让块存储可以通过网络访问,延迟接近本地盘
- 文件存储夹在中间,既有NFS/SMB的语义,又可以像对象一样做快照和共享
但核心逻辑不会变:数据库永远需要块存储的随机读写能力,海量文件永远适合对象存储的扁平寻址,除非未来出现完全革新的存储介质和访问协议,否则这个分工继续保持。
Q&A:关于块存储和对象存储的常见疑问
块存储和对象存储能直接用同一个盘吗
不能直接混用,块存储必须先挂载并格式化,对象存储只能通过API访问,如果想同时拥有两者,可以在块存储上装文件系统,再通过NFS共享,但这不是对象存储语义,更实际的做法是各用各的,中间用网关(比如MinIO)做转换。
用MinIO搭建私有对象存储与公有云对象存储价格相差多少
MinIO可以在普通服务器上运行,硬件成本取决于配置,一台双路32核、64GB内存、4块4TB NVMe盘的主机大约能提供近16TB裸容量,硬件加运维折算下来约合0.1元/GB/月(不含机房电费和人工),公有云对象存储标准型约0.12元/GB/月,但无需运维,还自带跨可用区冗余,数据量小自建划算,PB级数据建议直接买云服务。
为什么有人说数据库也可以用对象存储
部分新型数据库(如TiDB、CockroachDB)开始支持把S3作为日志或冷数据存储层,因为列的压缩后数据很多是只读的,不需要随机写,但热数据依然在本地块存储或内存中,对象存储只承担归档角色,目前没有一个主流数据库敢把全部数据放对象存储上跑在线事务。