一、对象存储概述:先搞懂我们要跟什么打交道

做加密上传下载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 轻量部署、离线可用、纠删码保护
核心要点:不管用哪家云厂商,对象存储的核心接口都是围绕 bucket(桶) + object(对象) + key(键) 这三大要素展开的。理解了这三者之间的关系,后面讲加密和SDK设计就能少走很多弯路。

一张图看懂本章知识体系

下面这张图可以帮助你直观理解对象存储在整个存储生态中的位置,以及它与块存储、文件存储的关系。

对象存储知识体系 · 三种存储形态对比 存储分层 块存储 SAN · 裸盘 · 云硬盘 文件存储 NFS · CIFS · NAS 对象存储 S3 · OSS · COS · OBS 核心特征 块级别读写 低延迟 · 随机IO 核心特征 目录树结构 以文件为单位操作 核心特征 扁平地址空间 唯一ID · RESTful API 数据库 · 虚拟机磁盘 办公共享 · 日志目录 图片 · 视频 · 备份 本课程聚焦:对象存储 —— 加密上传下载 SDK 的设计与实现

我的经验总结

我不止一次遇到新同学搞混块存储和对象存储。最典型的场景就是:有人想用对象存储做数据库存储盘,还抱怨“为什么不能直接mount上去”?

其实很简单——你把对象存储想象成一个巨大的快递仓库,每个包裹(对象)都有唯一运单号(key)。你只管寄包裹和取包裹(API),不需要关心仓库里面的货架编号(底层物理布局)。而块存储更像你电脑里的内存条,CPU可以直接按地址读写每一个字节。

曾经踩过的坑:我在开发一个文件增量同步工具时,试图用对象存储的ListObjects来模拟文件系统的目录树遍历。结果发现当bucket里有几十万个对象时,ListObjects的响应极其缓慢,而且每次最多返回1000个对象。后来才意识到,对象存储根本不适合做实时目录浏览——它更适合“我知道我要什么key,直接GET”的场景。如果你需要频繁遍历大量对象,建议搭配一级索引表或在对象key设计上做好前缀分区。

好了,关于对象存储是什么、和其他存储类型的区别、以及主流的云平台服务,我们就先聊这么多。这些基础概念会贯穿整门课程,特别是当你开始设计加密上传下载流程时,你会反复用到这些认知。