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的存储体系就通透了一半。