4. 云存储基础:对象存储(S3协议)、块存储(EBS)、文件存储(NFS/EFS),三者的选型对比
聊到云存储,很多新手第一反应就是「不就是硬盘吗?」。嗯,这话对了一半。云上的存储,其实分成了三个完全不同的流派:对象存储、块存储、文件存储。我刚开始接触时也懵过,觉得都是存数据,搞这么复杂干嘛?直到自己在项目里踩了坑,才明白——选错存储,就像拿菜刀拧螺丝,不是不能用,是真难受。
今天咱们就把这三兄弟掰开揉碎,讲清楚它们各自是什么、怎么用、什么时候选谁。
4.1 对象存储(S3协议)—— 海量数据的「大仓库」
对象存储,说白了就是把数据当成一个「对象」来存。每个对象包含三样东西:数据本身、元数据(描述数据的数据)、以及一个全局唯一的ID。你不需要关心它存在哪个硬盘上,也不需要知道目录结构,只要拿着这个ID就能取回来。
我个人习惯把对象存储想象成一个巨大的停车场。每辆车(数据)都有一个车牌号(ID),你不需要记住车停在哪个车位,只要报车牌号,管理员就能帮你找到。这就是对象存储的核心思想——扁平化、无层级。
S3协议是亚马逊最早提出的对象存储标准,现在几乎成了业界通用语言。阿里云的OSS、腾讯云的COS、华为云的OBS,都兼容S3协议。这意味着你学会了S3的API,就能操作几乎所有云厂商的对象存储。
核心特点:
- 无限扩展:理论上可以存任意数量的对象,从几字节到几TB都行
- 通过HTTP访问:RESTful API,用URL就能读写数据
- 高持久性:数据自动多副本冗余,一般承诺99.999999999%(11个9)
- 适合静态数据:图片、视频、备份、日志、大数据分析
举个例子,你在云上存一张图片:
# 使用AWS CLI上传文件到S3
aws s3 cp myphoto.jpg s3://my-bucket/photos/myphoto.jpg
# 获取文件的访问URL
aws s3 presign s3://my-bucket/photos/myphoto.jpg --expires-in 3600
你看,就这么简单。不需要挂载、不需要格式化,直接上传就能用。我在项目中遇到过一家视频网站,每天产生几十TB的日志,全扔到对象存储里,成本低、查询也方便。
避坑指南:我曾经犯过一个错误——把数据库文件直接存到对象存储里。结果发现每次读写都要走HTTP,延迟高得离谱。对象存储不适合频繁修改的小文件,它天生是为「写一次、读多次」设计的。
4.2 块存储(EBS)—— 云服务器的「本地硬盘」
块存储,你可以把它理解成一块「虚拟硬盘」。它不关心你存的是什么文件,只关心数据块的位置。操作系统看到它,就像看到一块物理硬盘一样,可以格式化、分区、装文件系统。
为什么叫「块」?因为数据被分成固定大小的块(比如4KB),每个块有独立的地址。你读写数据时,直接告诉硬盘「我要第1000个块的内容」,它就能精准定位。这跟对象存储的「给我这个ID的对象」完全不同。
EBS(Elastic Block Store)是AWS的块存储服务,其他云厂商也有类似产品,比如阿里云的云盘、腾讯云的CBS。
核心特点:
- 低延迟:毫秒级响应,适合数据库、操作系统等需要高性能随机读写的场景
- 可挂载:只能挂载到同一可用区的云服务器上
- 持久化:数据不会因为服务器重启而丢失
- 快照备份:支持增量快照,方便数据恢复
你想想看,你的云服务器要跑MySQL数据库,数据必须存在块存储上。因为数据库需要频繁地随机读写,对象存储那几百毫秒的延迟根本扛不住。
# 在Linux上挂载EBS卷
# 1. 查看新挂载的磁盘
lsblk
# 2. 格式化(第一次使用)
sudo mkfs -t ext4 /dev/xvdf
# 3. 挂载到目录
sudo mount /dev/xvdf /mnt/data
# 4. 设置开机自动挂载
echo '/dev/xvdf /mnt/data ext4 defaults 0 0' | sudo tee -a /etc/fstab
注意:块存储不能跨服务器共享。如果你想让多台服务器同时读写同一块数据,块存储就无能为力了。这时候需要文件存储出马。
4.3 文件存储(NFS/EFS)—— 共享的「网络文件夹」
文件存储,说白了就是网络上的共享文件夹。它保留了传统的目录树结构(/home/user/file.txt),支持POSIX文件系统权限,多台服务器可以同时挂载并读写。
NFS(Network File System)是传统的网络文件系统协议,很多自建机房都在用。EFS(Elastic File System)是AWS的托管文件存储服务,底层基于NFS协议,但帮你解决了高可用、扩容、备份等运维问题。
我记得有一次帮客户搭建一个内容管理系统,多台Web服务器需要共享上传的图片和附件。如果用块存储,每台服务器都得单独挂一块盘,数据不同步。用对象存储呢?程序改造成本太高。最后选了EFS,所有服务器挂载同一个文件系统,问题迎刃而解。
核心特点:
- 多机共享:成百上千台服务器可以同时挂载
- 兼容POSIX:支持标准的文件操作(读、写、删除、重命名、权限控制)
- 自动扩容:不需要预分配容量,用多少算多少
- 适合场景:Web服务器共享目录、大数据分析、媒体处理、容器存储
# 在Linux上挂载EFS(使用NFS协议)
# 1. 安装nfs客户端
sudo yum install -y nfs-utils
# 2. 创建挂载点
sudo mkdir /mnt/efs
# 3. 挂载EFS文件系统
sudo mount -t nfs4 -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport fs-12345678.efs.us-east-1.amazonaws.com:/ /mnt/efs
避坑指南:我曾经帮一个团队排查性能问题,发现他们的EFS挂载参数没优化,导致大量小文件读写时延迟飙升。后来加了rsize和wsize参数,性能提升了好几倍。文件存储虽然方便,但参数调优不能省。
4.4 三者的选型对比
好了,三个存储讲完了。你可能会问:那我到底该用哪个?别急,我整理了一张对比表,一目了然。
| 维度 | 对象存储(S3) | 块存储(EBS) | 文件存储(NFS/EFS) |
|---|---|---|---|
| 访问方式 | HTTP API(RESTful) | 块设备接口(SCSI) | 网络文件系统(NFS/SMB) |
| 延迟 | 较高(几十到几百毫秒) | 极低(毫秒级) | 中等(几毫秒到几十毫秒) |
| 扩展性 | 无限扩展 | 单盘容量有限(最大16TB) | 自动扩展(PB级) |
| 共享能力 | 全局共享(通过URL) | 不支持共享 | 多机共享 |
| 适用场景 | 静态文件、备份、大数据 | 数据库、操作系统、高性能应用 | 共享目录、Web服务、容器 |
| 成本 | 存储成本低,请求费用高 | 存储成本高,IOPS费用高 | 存储成本中等,吞吐费用高 |
| 修改方式 | 只能整体覆盖 | 支持随机读写 | 支持随机读写 |
选型其实就三个问题:
- 需不需要共享? 需要共享 → 文件存储或对象存储;不需要 → 块存储
- 延迟敏感吗? 敏感(数据库)→ 块存储;不敏感(图片、日志)→ 对象存储
- 需要目录结构吗? 需要 → 文件存储;不需要 → 对象存储
我个人的经验是:能用对象存储的,优先用对象存储。因为它便宜、扩展性好、运维简单。但如果你要跑数据库,别犹豫,直接上块存储。至于文件存储,它是个「中间派」,适合那些既需要共享、又需要目录结构的场景。
一句话总结:
- 对象存储 = 海量静态数据的「大仓库」
- 块存储 = 高性能的「本地硬盘」
- 文件存储 = 多机共享的「网络文件夹」
嗯,到这里云存储的基础就讲完了。下一章咱们聊聊网络架构,看看VPC、子网、路由表这些东西是怎么把云上的资源串起来的。