一、对象存储概述:先搞懂我们要跟什么打交道
做加密上传下载SDK,你绕不开一个核心概念——对象存储。
我第一次接触对象存储是在2015年,当时给一个视频平台做转码和分发系统。公司内部还在用NFS共享目录保存视频文件,结果就碰到一个很尴尬的场景:一次生产事故导致文件系统元数据损坏,几百万个小文件差点全丢了。那时候我就在想,一定有更靠谱的存储方式。
讲白了,对象存储就是为了解决这种海量非结构化数据而生的。它跟我们平时用的U盘、硬盘、共享文件夹,完全是两回事。
什么是对象存储?
你可以把“对象”想成一个装东西的盒子。盒子里除了数据本身(比如一张图片、一段视频),还自带一个标签(元数据)和一个唯一编号(全局唯一的键)。
特点很直接:
- 扁平地址空间:没有文件夹层级,所有数据都在一个池子里靠唯一ID定位
- 无限扩展:理论上你可以存几百亿个对象,没有单个目录文件数的限制
- RESTful API:通过HTTP/HTTPS访问,不用挂载盘符或目录
- 不可变性:对象一旦写入就不能原地修改,只能覆盖或删除
我记得当时被问到最多的问题是:“对象存储和普通存储有什么区别?” 嗯,区别很大。我们直接拉个表格看。
块存储、文件存储、对象存储的区别
| 维度 | 块存储 | 文件存储 | 对象存储 |
|---|---|---|---|
| 典型代表 | SAN、云硬盘(EBS) | NFS、CIFS、共享文件夹 | S3、OSS、COS、OBS |
| 访问方式 | iSCSI / FC 协议 | 挂载成目录,用文件系统访问 | HTTP API(PUT / GET / DELETE) |
| 数据结构 | 底层数据块(Block) | 文件和目录树 | 对象 + 唯一ID + 元数据 |
| 核心操作 | 读写块(LBA) | 创建文件/目录、读写文件 | PutObject / GetObject |
| 元数据能力 | 弱(仅块标记) | 中等(文件属性、权限) | 强(自定义标签、描述信息) |
| 扩展性 | 受限于存储网络和控制器 | 受限于目录树深度和inode数量 | 近乎无限水平扩展 |
| 适用场景 | 数据库、虚拟机磁盘 | 办公文件共享、日志目录 | 图片、视频、备份、大数据 |
你想想看,为什么数据库一般用块存储而不是对象存储?因为数据库需要随机小块读写和低延迟,而对象存储的RESTful API最擅长的还是大文件的顺序读写。这就像——你不能拿卡车去送外卖,也不能用电动车去拉集装箱。
主流云厂商对象存储服务
现在几乎所有云厂商都提供对象存储服务,接口上虽然都兼容S3,但细节还是有点差异的。我简单梳理下几个用得最多的。
AWS S3(Simple Storage Service)
业界事实标准。几乎所有的对象存储SDK都是以S3 API为蓝本设计的。S3的签名算法(V2或V4)是所有加密认证方案的基础。我个人习惯把S3当作“参考实现”,如果搞不清楚某个参数怎么传,翻S3的文档通常能找到答案。
阿里云 OSS
国内用户量最大的对象存储服务之一。它的SDK做了很多本地化优化,比如断点续传、并行分片上传。有一点要注意:OSS的Endpoint格式和S3不太一样,它的存储区域(bucket region)通常直接写在Endpoint里。
腾讯云 COS
和OSS类似,功能很全。COS支持临时密钥(STS)上传,这在做前后端分离的加密上传场景时特别有用。我在一个云相册项目里就用过COS的临时密钥方案,避免了把永久密钥暴露在前端。
华为云 OBS
政企客户用得较多。OBS的SDK对国密算法(SM系列)支持比较好,如果项目有合规要求,不妨关注下它的加密组件。
其他:MinIO、Ceph RGW
MinIO是纯开源的对象存储服务,API完全兼容S3。很多企业上私有化部署时首选MinIO。我在一个边缘计算场景里用过MinIO做离线存储,它用docker跑起来只需要一行命令,特别适合开发环境调试。
为了方便你对比关键参数,我列了个表格:
| 服务 | 厂商 | Endpoint 风格 | SDK语言支持 | 特殊能力 |
|---|---|---|---|---|
| S3 | AWS | s3.amazonaws.com | Java/Python/Go/JS等30+ | 版本控制、对象锁定、跨区域复制 |
| OSS | 阿里云 | oss-cn-hangzhou.aliyuncs.com | Java/Python/PHP/Go/C++等 | 图片处理、追加上传、镜像回源 |
| COS | 腾讯云 | cos.ap-guangzhou.myqcloud.com | Java/Python/NET/React等 | 临时密钥、全球加速、内容审核 |
| OBS | 华为云 | obs.cn-north-1.myhuaweicloud.com | Java/Python/Go/Node.js | 国密加密、WORM存储、多AZ容灾 |
| MinIO | 开源 | 自定义 | 支持AWS S3 SDK | 轻量部署、离线可用、纠删码保护 |
一张图看懂本章知识体系
下面这张图可以帮助你直观理解对象存储在整个存储生态中的位置,以及它与块存储、文件存储的关系。
我的经验总结
我不止一次遇到新同学搞混块存储和对象存储。最典型的场景就是:有人想用对象存储做数据库存储盘,还抱怨“为什么不能直接mount上去”?
其实很简单——你把对象存储想象成一个巨大的快递仓库,每个包裹(对象)都有唯一运单号(key)。你只管寄包裹和取包裹(API),不需要关心仓库里面的货架编号(底层物理布局)。而块存储更像你电脑里的内存条,CPU可以直接按地址读写每一个字节。
好了,关于对象存储是什么、和其他存储类型的区别、以及主流的云平台服务,我们就先聊这么多。这些基础概念会贯穿整门课程,特别是当你开始设计加密上传下载流程时,你会反复用到这些认知。