第一次在AWS控制台里同时看到S3、EBS、EFS这三种存储服务的时候,我盯着页面上的英文缩写和一堆性能参数发了好一会儿呆。它们看起来都是“存数据的地方”,名字也都带Storage或者File的味儿,但仔细一琢磨又不知道到底该选哪一个。后来我陆续做过几个真实项目,也踩过不少坑,才慢慢把它们之间的差异摸透。这篇东西我想把S3对象存储、EBS块存储、EFS文件存储这三者的核心差异、底层逻辑、选型思路和实操方法一次性讲清楚,尤其适合刚接触AWS、准备考SAA认证、或者在公司里做架构设计时拿不准存储选型的朋友。
一句话总结我的体会:这三种存储不是“谁替代谁”的关系,而是三种完全不同的“数据使用方式”。你只要搞明白数据是要“挂载成硬盘”“通过URL访问”还是“共享给多台机器读写”,选型就已经对了一半。剩下的就是性能、成本和可用性层面的权衡。
1. 先分清楚:对象、块、文件到底在说啥
1.1 用生活场景给三种存储画个像
我经常用三个生活类比来给团队里的小朋友讲清楚这三种存储,这比直接解释协议和术语要直观得多。
S3对象存储,你可以把它理解成一个云端的超大仓库。你往仓库里扔东西,仓库管理员会给你一个唯一的取货凭证(URL),以后你凭这个凭证就能取回东西。仓库内部怎么摆、怎么分区、有没有货架,你完全不用操心,也用不着进去翻箱倒柜。仓库容量几乎是无限的,你也不用预付租金,放多少货算多少钱。
EBS块存储,它更像电脑里的那块硬盘。它不能独立存在,必须“插”在某台EC2主机上才能用。你拿到一块EBS之后,要先分区、格式化,才能往里写文件。它的特点是延迟极低、性能稳定,数据库这类对IOPS和延迟敏感的应用就吃这一套。但它有一个硬限制:一块普通的EBS通常只能插在同一台服务器上,不能随手拔下来插到另一台机器上直接共享。
EFS文件存储,最接近公司的共享文件夹。它在云端搭了一个文件系统,你可以让很多台EC2同时挂载它,大家读写的是同一份文件,A机器写入的数据,B机器马上能看到。它保留了目录层级、文件名、权限这些传统文件系统的概念,所以很多传统应用不需要改代码就能直接使用。
这三种存储背后对应的是IT行业非常有名的三大存储范式:块存储、文件存储、对象存储。AWS只是把这三类范式做成了云服务,分别叫EBS、EFS和S3。所以搞懂了这三兄弟,你不仅搞懂了AWS,也搞懂了整个存储行业的三个基本方向。
1.2 为什么AWS要同时提供三种存储
有人可能会问,能不能只保留一种最便宜的,把另外两个砍掉?答案是不能,因为不同的应用程序对数据的读写方式完全不同。
举个例子,像MySQL这类数据库,它需要把数据精确地读写到磁盘的某个块上,要求极低的延迟和极高的IOPS,这种场景只有块存储能接得住。而像图片、视频、备份文件这种海量非结构化数据,动辄几百TB甚至PB级别,如果用块存储去存,成本会直接爆掉,而且根本没有那么多服务器可以挂载。这时候对象存储的无限容量和极低单价就成了最佳选择。到了多台服务器共享一份配置、共享一批待处理文件这类场景,文件存储的POSIX语义和共享能力又是块存储和对象存储无法替代的。
所以AWS把三种存储同时摆在那里,不是功能重复,而是因为它们各自有明确的适用区间。真实的云上架构里,三者通常是组合出现的,很少说一个应用只用一种存储就搞定一切。下一章我从原理层面把这三种存储切开看,你就能理解它们的差异为什么会存在。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 从原理层面拆开看:底层到底有什么不同
2.1 S3对象存储的内在逻辑
S3的完整叫法是Simple Storage Service,但这个名字容易让人误以为它很“简单”。它的数据模型其实是一个扁平的键值命名空间。
整个S3由三个层级组成:桶(Bucket)、对象(Object)、键(Key)。桶是存储容器,对象是存储单元,键是对象的唯一标识。你可能在网上看到类似s3://my-bucket/images/photo.jpg这样的路径,其实images/photo.jpg并不是真实的目录层级,它只是键名里带了一个斜杠字符。S3内部并不存在“目录”这个实体,所有对象都平铺存储在桶里,那个斜杠只是给人眼看的。
这个设计带来的最大好处是扩展性极强,因为键值结构天然适合海量数据,不存在单目录文件数上限,也不用维护复杂目录树。而坏处也很明显,就是S3没法像文件系统那样直接“追加写”或“修改一部分”,你想改一个对象,通常只能整体覆盖。
S3的持久性在云存储里是出名的强悍,标准存储的设计持久性高达99.999999999%,也就是常说的11个9。这个数字的背后是AWS会自动把你的对象在同一个区域内的多个可用区里存多份副本。即便某个可用区整体宕机,你的数据依然可以从其他副本恢复。
还有一个容易被忽略的点:S3在2020年12月之后已经支持强一致性。以前S3是最终一致性,写入后立刻读可能读到旧数据,现在读后写、列出现有对象、覆盖写后读取都是强一致的,这让很多依赖S3做数据主存储的应用变得更加可靠。
S3本身不是一个挂载型存储,它通过REST API提供访问。你可以用控制台、SDK、AWS CLI,也可
