做技术选型时,"数据放哪里"几乎是每个项目都要回答的问题。以前答案很单一:买块硬盘或者挂个云盘,格式化、挂载、读写,天经地义。现在多了另一个选项——对象存储。用过的团队常有一种"回不去"的感觉:容量想扩多少扩多少,不用管磁盘、不用管分区、不用管备份,一个接口就能存几十 TB。但也有人兴冲冲把数据库数据往对象存储上一放,结果性能惨不忍睹,或者月底账单远超预期。
这两种技术解决的是根本不同的问题。传统服务器硬盘(块存储)提供的是一块"可以随意读写的裸空间",你在上面建文件系统、跑数据库、装应用;对象存储提供的是"一个通过 HTTP 接口存取的海量桶",你把一个个完整对象(文件)放进去、取出来、删掉,仅此而已。理解这个本质差异,才能判断什么数据该放哪。
这篇文章会讲清楚:对象存储和块存储的模型差异、各自的能力边界、容量扩展方式的不同、成本构成的区别(这点最容易算错)、性能特点、以及在真实业务里怎么组合使用。最后给出几个典型场景的选型建议。涉及云厂商的部分只作原理性描述,不引用具体报价。
先给一句最精炼的概括:块存储像一块硬盘,你可以随意读写的"空间";对象存储像一个无限大的网盘,你只能整存整取"文件"。 前者面向文件系统和数据库,后者面向海量非结构化数据和分享分发。
一、两种存储模型到底差在哪
块存储(传统服务器硬盘/云盘):暴露给操作系统的是一块块设备(/dev/vdb 之类)。你可以在上面创建分区、格式化文件系统、挂载目录,然后像操作本地文件一样读写。它支持随机读写、支持原地修改(改文件中间几个字节)、支持 fsync 落盘语义。数据库、虚拟机磁盘、应用的运行目录,都要靠它。
对象存储:暴露的是 HTTP API(主流是 S3 兼容接口)。数据单位是"对象",每个对象由"桶(bucket)+ 键(key)+ 数据 + 元数据"组成。它没有目录树(虽然可以用 / 模拟前缀),没有文件系统,不能原地修改对象——要改一个字节,得整个对象重新上传。它也不提供 fsync 这类落盘语义,访问靠 HTTP,天然是"最终一致或强一致"的服务端语义。
| 对比维度 | 传统服务器硬盘 / 块存储 | 对象存储 |
|---|---|---|
| 访问方式 | 块设备 + 文件系统(POSIX) | HTTP API(S3 兼容),SDK/CLI |
| 数据单位 | 字节/文件,可随机读写 | 对象,整体读写 |
| 能否原地修改 | 能(改中间几个字节也行) | 不能,需整体重传 |
| 目录结构 | 真实目录树 | 扁平命名空间 + 前缀模拟 |
| 容量扩展 | 换盘/加盘/扩云盘,有上限和步骤 | 近乎无限,按需增长,无需操作 |
| 单对象大小 | 不受限制(受文件系统限制) | 通常单对象上限 5 TB(分片上传) |
| 延迟 | 毫秒级甚至微秒级(本地盘) | 通常几十毫秒起(网络往返) |
| 吞吐 | 高,可达 GB/s(本地 NVMe) | 受网络带宽限制,单流较有限 |
| 一致性 | 由文件系统保证 | 现代对象存储多为强一致读后写 |
| 并发访问 | 多机共享需额外方案 | 原生支持多客户端并发访问 |
| 计费模型 | 按容量(含 IOPS/带宽套餐) | 按存储量 + 请求次数 + 流量 |
| 与文件系统兼容 | 完全兼容 | 需 s3fs/挂载工具,兼容性有限 |
| 典型用途 | 数据库、虚拟机、应用目录 | 静态资源、备份归档、大数据、媒体 |
二、容量扩展:一个是"扩容",一个是"不用扩"
这是两者体验差别最大的地方。
块存储扩展是有操作成本的。 云盘扩容要经历"控制台调大容量 → 分区扩容 → 文件系统扩容",本地硬盘扩容要经历"加盘 → 分区 → 格式化 → 挂载 → 迁移数据",RAID 还要重建。虽然现代方案(LVM、云盘在线扩容)已经比较方便,但每次扩容都是一次需要小心操作的变更,还会受单盘容量、单机槽位、卷组上限的限制。你要提前规划"够不够用"。
对象存储在容量上几乎是"无感"的。 你不需要预先申请容量,写入多少就占多少,理论容量接近无限(远超单机硬盘能承载的规模)。这对"数据量不可预测"的业务极友好——短视频、日志、用户上传,从零涨到几百 TB,对象存储不需要你做任何扩容动作。
但要注意,"无限容量"不等于"无限性能"。对象存储的带宽和请求速率是有配额和成本的:并发上传/下载受网络带宽限制,请求次数会计费,某些场景(比如海量小文件)还会因为请求开销而表现得昂贵且慢。
三、成本:别只算存储单价
对象存储的计费通常由三部分构成,只盯着"每 GB 存储多少钱"是最常见的误区:
- 存储费用:按实际占用容量和存储类型(标准/低频/归档)计费。
- 请求费用:按 API 请求次数(GET、PUT 等)计费,海量小文件时这一项可能很可观。
- 流量费用:数据流出(公网出方向)通常单独计费,而入方向一般免费或便宜。
| 成本项 | 块存储(云盘/服务器硬盘) | 对象存储 |
|---|---|---|
| 存储 | 按容量,通常包在实例里或按盘计费 | 按容量 + 存储类型分层 |
| 请求 | 无单独请求费 | 按 API 调用次数计费 |
| 流量 | 内网免费、公网另计 | 出方向单独计费,需重点关注 |
| 扩容成本 | 需要停机/操作,可能有变更成本 | 无操作成本,随用随涨 |
| 运维成本 | 需管理磁盘、RAID、备份 | 服务端托管,运维成本低 |
| 小文件效率 | 高(本地读写) | 低(每文件都是一次请求) |
经验判断:数据量大、访问频率低、以整文件读写为主的场景(归档、备份、静态资源),对象存储通常更划算;高并发小文件、需要低延迟随机读写、要跑数据库的场景,块存储更合适,哪怕单价看起来贵。特别是小文件 + 高请求量,对象存储的请求费可能让你大吃一惊,务必先估算请求数量。
四、性能:延迟与吞吐的真实差异
- 延迟:本地 NVMe 的读写延迟是微秒到百微秒级;对象存储走网络 HTTP,单次请求延迟通常在几十毫秒量级(经验值,随地域和网络质量变化)。这个差距意味着对象存储不适合做数据库、缓存、需要频繁小读写的场景。
- 吞吐:对象存储的吞吐取决于网络带宽和客户端并发能力。单流上传下载可能只有几十 MB/s,但通过多线程/分片并发,可以逼近你的出口带宽上限。相比之下,本地 NVMe 单盘可以轻松达到 GB/s 级。
- 一致性:现代对象存储基本都提供强一致(写入后立即读到最新值),早年的"最终一致"问题已少见。但它依然不提供文件系统的原子重命名、文件锁等语义,依赖这些特性的程序放上去会出问题。
五、怎么用:对象存储的常见接入方式
对象存储一般通过 SDK 或命令行工具访问,也可以在 Linux 上"挂载成目录"(有代价,见下文)。
# 以 AWS CLI 为例(S3 兼容接口通用,其他厂商有各自 CLI)
# 安装
sudo yum install -y awscli # RHEL/CentOS/Rocky(部分源)
sudo apt install -y awscli # Debian/Ubuntu
# 或使用 pip 安装最新版
pip3 install awscli
# 配置凭据(推荐用配置文件,避免把密钥写进命令历史)
aws configure
# AWS Access Key ID / Secret Access Key / Region / Output format
# 列出桶
aws s3 ls
# 上传/下载/同步
aws s3 cp /data/app.tar.gz s3://my-bucket/backup/
aws s3 sync /data/logs/ s3://my-bucket/logs/ --delete
aws s3 ls s3://my-bucket/ --recursive --human-readable --summarize
社区常用的轻量工具 s3cmd 也很流行:
sudo yum install -y s3cmd # RHEL/CentOS/Rocky
sudo apt install -y s3cmd # Debian/Ubuntu
s3cmd --configure # 交互式配置
s3cmd ls s3://my-bucket/
s3cmd put /data/file.tar.gz s3://my-bucket/
s3cmd sync /data/logs/ s3://my-bucket/logs/
关于 s3fs 挂载成目录:它可以把对象存储挂载成本地路径,让普通程序像访问文件一样访问对象存储。但这层兼容有代价:小文件性能差、不支持完整的 POSIX 语义(文件锁、fsync、随机写都可能不工作),不能用来跑数据库或需要随机写的应用,只适合"偶尔读写的文件共享"这类轻量场景。
# s3fs 示例(仅作演示,生产慎用)
sudo apt install -y s3fs
echo "ACCESS_KEY:SECRET_KEY" > ~/.passwd-s3fs
chmod 600 ~/.passwd-s3fs
s3fs my-bucket /mnt/s3 -o passwd_file=~/.passwd-s3fs -o url=https://endpoint.example.com -o use_path_request_style
风险提示:把访问密钥写入脚本、命令历史或明文文件里,是凭据泄露的高发原因。密钥一旦泄露,攻击者可以读取甚至删除你桶里的全部数据。应使用最小权限的专用账号、定期轮换密钥、优先使用实例角色(IAM Role)而非硬编码密钥。回滚方式:发现泄露立即在控制台禁用/轮换密钥,并检查桶的访问日志。
六、典型场景该选哪个
优先用对象存储:
- 静态资源托管:图片、视频、JS/CSS、下载包,配合 CDN 分发效果最好。
- 备份与归档:数据库备份、日志归档、历史数据冷存,配合生命周期策略自动降冷。
- 用户上传内容:头像、附件、文档,天然适合海量、不可预测增长。
- 大数据与 AI 数据集:训练数据、中间结果,多机并发读取。
- 跨地域分发与共享:对象存储天然多副本、可跨区复制。
优先用块存储(服务器硬盘):
- 所有数据库:MySQL、PostgreSQL、MongoDB、Redis 持久化,需要低延迟随机读写和
fsync。 - 应用运行目录、代码目录、临时文件。
- 虚拟化宿主机上的虚拟机磁盘。
- 需要文件锁、随机写、原子操作的程序。
- 高并发小文件读写(如邮件队列、缓存目录)。
实际生产里,两者几乎总是组合使用:热数据放本地 NVMe,温数据放云盘或大盘,冷数据和备份放对象存储,用生命周期策略自动流转。这就是下一节要讲的"分层存储"思路,也是成本优化的关键。
七、迁移与生命周期
从服务器硬盘迁到对象存储,常用工具是 rclone 或厂商迁移服务:
# rclone 是跨云、跨协议同步的瑞士军刀
sudo yum install -y rclone # 或 apt install rclone
rclone config # 交互配置远程(支持 S3 兼容、各家对象存储)
rclone copy /data/archive/ myremote:bucket/archive/ --progress --transfers 16
rclone sync /data/logs/ myremote:bucket/logs/ --progress
生命周期策略则是在服务端配置规则,让对象自动从标准存储降级到低频、归档存储,甚至到期删除。比如"创建 30 天后转低频,180 天后转归档,365 天后删除"。这类策略能显著降低长期存储成本,是对象存储相比自建硬盘最实用的能力之一。
常见问题
Q1:能把数据库放在对象存储上吗?
不建议。对象存储不能原地修改、延迟高、没有 fsync 语义,数据库的随机写会非常低效甚至出错。数据库应放在块存储上,把备份导出到对象存储。
Q2:对象存储比硬盘便宜吗?
不一定。如果只看每 GB 存储单价,冷数据放对象存储通常更便宜;但算上请求费和流量费,小文件多、访问频繁的场景可能反而更贵。要按"存储 + 请求 + 流量"三项综合估算。
Q3:s3fs 挂载后能当普通磁盘用吗?
不能。它只做了有限的 POSIX 兼容,性能差、不支持文件锁和随机写,只适合轻量共享场景。生产环境不要用它承载应用数据。
Q4:对象存储会不会丢数据?
主流对象存储服务端都有多副本或纠删码,并支持版本控制和跨区复制,可靠性远高于单块硬盘。但"对象被误删"依然会发生,应开启版本控制和删除保护。
Q5:内网访问对象存储也要花钱吗?
存储费和请求费通常照收,但同地域内网流量一般不计费或单独计价。跨地域和公网出方向的流量通常是成本大头,架构设计时要尽量让计算和存储同地域。
总结
- 块存储是"可随意读写的空间",对象存储是"整存整取的网盘",面向的是不同问题。
- 对象存储容量近乎无限、免运维,适合静态资源、备份归档、用户上传等非结构化海量数据。
- 数据库、虚拟机、需要低延迟随机读写和
fsync的场景,必须用块存储。 - 成本要按"存储 + 请求 + 流量"三项一起算,海量小文件是对象存储的成本陷阱。
- 生产架构通常是分层组合:热数据本地盘、温数据云盘、冷数据对象存储,用生命周期自动流转。
- 对象存储的密钥必须最小权限 + 定期轮换,泄露的后果是数据被读走或被删光。
企业QQ咨询




