前言
买云盘时面对"云硬盘 / NAS / 对象存储"三个菜单不知道选谁?它们对应存储世界的三种抽象:块、文件、对象。理解差异,选型就是送分题。
一、三种抽象一览
┌─ 块存储 (Block) ──────┐ ┌─ 文件存储 (File) ─────┐ ┌─ 对象存储 (Object) ─────┐
│ 裸的磁盘块 │ │ 目录/文件层级 │ │ 扁平的海量键值 │
│ 云硬盘 CBS/EBS │ │ NAS/CIFS/NFS │ │ OSS/COS/S3 │
│ │ │ │ │ │
│ OS 直接 mkfs+mount │ │ 多机同时挂载 │ │ HTTP API 增删查 │
│ 挂给虚拟机当 C盘/D盘 │ │ POSIX 文件接口 │ │ bucket + object key │
└───────────────────────┘ └────────────────────────┘ └──────────────────────────┘
像"本地硬盘" 像"共享文件夹" 像"网盘+CDN"
二、块存储:性能担当
是什么:把存储切成固定大小的"块"提供给主机,主机在上面自建文件系统。云硬盘对虚拟机来说就是一块 /dev/vdb。
# 云硬盘的日常(虚拟机视角)
lsblk
mkfs.xfs /dev/vdb1
mount /dev/vdb1 /data
# 完全是本地盘的体验 —— 数据实际落在分布式存储集群上
特点:
- 低延迟(云硬盘分等级):ESSD PL1 < 1ms 级
- 单盘挂给单个实例(共享盘是特殊形态)
- 需要自己管文件系统(快照、扩容走云 API)
- 计费:容量 + 预置性能(IOPS/吞吐)
性能等级对比(以某厂为例):
| 类型 | 典型 IOPS | 场景 |
|---|---|---|
| 普通云盘 | 数百 | 温数据、开发测试 |
| SSD 云盘 | 2万+ | 常规生产 |
| ESSD | 10万+(分 PL 等级) | 数据库、核心业务 |
适用:系统盘、数据库、任何"要像本地盘一样用"的场景。
三、文件存储:共享担当
是什么:存储服务端维护目录树,多台机器同时通过网络挂载同一份数据(NFS/SMB/CIFS 协议)。
# NFS 挂载(客户端)
dnf install -y nfs-utils
mount -t nfs 10.0.2.100:/share /mnt/share
# 20 台 web 服务器挂同一个 NAS 目录 —— 上传一次, 全部可见
特点:
- 多机共享读写(这是核心价值)
- POSIX 接口兼容,应用几乎无感
- 吞吐型(大带宽),但随机小 IO 与延迟不如块存储
- 按容量计费,比块存储贵
适用:Web 集群共享静态资源、容器共享目录(K8s 的 NFS CSI)、AI 训练数据集共享、内容管理系统。
常见坑:NFS 锁机制较弱,数据库类应用放 NFS 是自找麻烦;挂载要配
_netdev避免开机阻塞。
四、对象存储:海量担当
是什么:数据以"对象"(数据+元数据+键)形式存进扁平的 bucket,通过 HTTP REST API 读写——没有目录树,a/b/c.jpg 只是名叫 a/b/c.jpg 的 key。
# OSS 工具示例(ossutil / aws cli 同理)
ossutil cp backup.tar.gz oss://my-bucket/backup/2024-10-19.tar.gz
ossutil ls oss://my-bucket/backup/
ossutil sign oss://my-bucket/report.pdf --timeout 600 # 生成临时访问 URL
# Python SDK(阿里云 OSS 示意)
import oss2
bucket = oss2.Bucket(auth, "https://oss-cn-hangzhou.aliyuncs.com", "my-bucket")
bucket.put_object("logs/2024-10-19/app.log", open("app.log", "rb"))
data = bucket.get_object("logs/2024-10-19/app.log").read()
特点:
- 无限容量、按用量计费(每 GB 单价最低)
- 单对象最大 TB 级;不能修改只能整体重写(覆盖上传)
- 不支持 POSIX:不能 mount 后随机读写(有特殊工具模拟,但别当真盘用)
- 天然多副本/纠删码,持久性 11 个 9
- 与 CDN 无缝配合:回源到 OSS,静态资源全球加速
适用:图片/视频等静态资源、备份归档、大数据湖、日志归档、App 安装包分发。
五、对比与决策
| 维度 | 块存储 | 文件存储 | 对象存储 |
|---|---|---|---|
| 接口 | 块设备 | POSIX 文件 | HTTP API |
| 共享 | 单机(默认) | ✅ 多机 | ✅ 全球 |
| 延迟 | 最低(<1ms) | 中(ms 级) | 高(几十~几百 ms) |
| 容量 | 单盘有限(几十 TB) | 大 | 无限 |
| 随机改写 | ✅ | ✅ | ❌(整体覆盖) |
| 单位成本 | 高 | 更高 | 最低 |
| 典型负载 | 数据库/系统盘 | 共享目录 | 静态资源/备份 |
一句话决策:
- 要低延迟随机读写(数据库)→ 块存储
- 要多机共享的目录→ 文件存储
- 要海量便宜 + 一次写入多次读取 → 对象存储
六、经典组合架构
┌─ CDN ─┐
用户 ──► 域名 ──────►│ 边缘缓存 │──未命中──► 对象存储 OSS(图片/JS/CSS)
└────────┘
应用服务器 ──► 数据库 ──► 块存储(云硬盘, ESSD)
│
└──► /shared/upload ──► 文件存储 NAS(多机共享)
│
└──► 每日备份 ──► 对象存储归档(低频/冷存储类型, 成本再砍 50%+)
存储分层:热数据块存储 → 温数据 NAS → 冷数据对象归档——按访问频率摊薄成本。
七、实操建议
1. 对象存储安全三原则:
- bucket 默认私有, 公开要单独授权
- 临时访问用签名 URL, 别长期放公开链接
- 敏感数据开服务端加密
2. 数据生命周期规则:
- logs/ 前缀 30 天后转低频, 90 天删除
- backup/ 前缀保留 4 份版本
3. 云硬盘记得做快照策略(每日增量 + 保留 7 天)
小结
| 存储 | 记忆点 |
|---|---|
| 块 | 云上"本地盘",快,给数据库 |
| 文件 | 云上"共享文件夹",多机挂载 |
| 对象 | 云上"无限网盘",便宜,配 CDN,只能整体读写 |
| 分层 | 热→块、温→文件、冷→对象 |
本文是「云计算」系列第 3 篇。