2、存储基础回顾:块存储、文件存储、对象存储的核心原理与适用场景
聊存储之前,我先问个问题:你平时用U盘拷文件,和用网盘备份照片,底层是一回事吗?
很多人觉得都是存数据,能有多大区别。但真到了云原生场景下,选错存储类型,性能直接崩给你看。我见过不少团队,把对象存储当块存储用,结果延迟高到怀疑人生。
今天咱们就把这三种存储扒开看看。说白了,它们就是数据在硬盘上的三种组织方式,各有各的脾气。
2.1 块存储:最底层的“裸盘”操作
块存储,你可以想象成一块巨大的乐高底板。每个块就是一个标准大小的积木颗粒(通常是512字节或4KB)。操作系统可以直接在上面搭积木——格式化、建文件系统、分区,想怎么玩都行。
我早期做虚拟化时,给虚拟机分配的就是块存储。那时候最头疼的是,一台物理机上的虚拟机多了,I/O争抢特别严重。后来才明白,块存储虽然性能好,但共享起来很麻烦。
核心特征:
- 以固定大小的块为单位读写
- 通过SCSI、iSCSI、FC等协议访问
- 操作系统直接管理,可以格式化、分区
- 性能最高,延迟最低
适用场景:
- 数据库(MySQL、PostgreSQL)的数据盘
- 虚拟机的系统盘
- 高性能计算场景
- 需要低延迟、高IOPS的应用
避坑指南:我曾经帮一个团队排查数据库性能问题,发现他们用NFS挂载MySQL数据目录。结果呢?一个慢查询拖垮了整个存储网络。数据库这种对延迟敏感的应用,老老实实用块存储,别图省事。
2.2 文件存储:最熟悉的“文件夹”模式
文件存储,说白了就是你电脑上的C盘、D盘。它有个树状目录结构,文件有名字、有路径、有元数据(创建时间、权限等)。
你想想看,为什么Windows的共享文件夹、Linux的NFS这么流行?因为人类天生就习惯用文件夹管理东西。文件存储把底层的块组织成了人类友好的形式。
核心特征:
- 以文件和目录为基本单位
- 通过NFS、CIFS/SMB等协议访问
- 有完整的文件系统语义(锁、权限、元数据)
- 适合多人协作、共享访问
适用场景:
- 用户主目录、共享文档
- 媒体文件存储(视频、图片)
- 日志集中存储
- 需要POSIX兼容的应用
个人经验:我习惯在Kubernetes里用NFS做ReadWriteMany的PVC。但要注意,NFS的元数据操作性能一般,如果目录下有上万个文件,ls命令都能卡半天。嗯,这时候就该考虑对象存储了。
2.3 对象存储:云原生的“扁平化”存储
对象存储,这是云原生时代的主角。它没有目录结构,只有“桶”(Bucket)和“对象”(Object)。每个对象有一个唯一的ID,你可以往上面挂一堆自定义元数据。
为什么会这样设计?因为互联网场景下,文件数量动辄几十亿,传统的树状目录根本扛不住。对象存储把数据分散到成千上万台机器上,通过哈希算法快速定位,天生就是为海量数据准备的。
核心特征:
- 以对象为单位,每个对象包含数据、元数据、唯一ID
- 通过HTTP/HTTPS协议访问(RESTful API)
- 无限扩展,理论上可以存任意数量的对象
- 不支持原地修改,只能覆盖或删除
适用场景:
- 静态网站托管(图片、CSS、JS)
- 备份与归档
- 大数据分析(数据湖)
- 云原生应用的持久化存储(如MinIO、Ceph RGW)
注意:对象存储不支持POSIX文件系统语义。你不能像操作本地文件一样用mv、cp命令。我曾经见过有人试图用对象存储跑MySQL,结果发现根本没法做文件锁——这完全是两个世界的东西。
2.4 三种存储的对比
| 维度 | 块存储 | 文件存储 | 对象存储 |
|---|---|---|---|
| 访问协议 | iSCSI、FC、SCSI | NFS、CIFS/SMB | HTTP/HTTPS (S3、Swift) |
| 数据组织 | 固定大小块 | 树状目录+文件 | 扁平化桶+对象 |
| 性能 | 最高 | 中等 | 较低(延迟高) |
| 扩展性 | 有限(受硬件限制) | 中等(受元数据服务器限制) | 无限(分布式架构) |
| 典型产品 | EBS、SAN、本地盘 | EFS、NAS、GlusterFS | S3、MinIO、Ceph RGW |
| 适用场景 | 数据库、虚拟机 | 共享文件、日志 | 静态数据、备份、大数据 |
2.5 云原生环境下的选型建议
在Kubernetes里,这三种存储都有对应的实现。我个人习惯这样选:
- 有状态应用(数据库、消息队列):用块存储,比如AWS EBS、GCP Persistent Disk。性能稳定,延迟可控。
- 共享配置、日志:用文件存储,比如NFS、AWS EFS。方便多个Pod同时读写。
- 静态数据、备份、大数据:用对象存储,比如MinIO、AWS S3。成本低,扩展性好。
一个小技巧:如果你在Kubernetes里用对象存储,记得用CSI驱动(如AWS EBS CSI Driver、MinIO CSI Driver)。这样Pod可以直接挂载,不用在应用里写S3客户端代码。我最近的项目就是这么干的,省了不少事。
好了,三种存储的核心原理和适用场景就聊到这儿。下一节咱们会深入Kubernetes的存储架构,看看PV、PVC、StorageClass这些概念到底怎么用。到时候你会发现,理解了块、文件、对象这三种存储,K8s的存储体系就通透了一半。