背景

随着云计算技术的成熟,越来越多的中小型企业(特别是暂无自建:小文件存储体系的公司)采用多云(Multi-Cloud)或混合云(Hybrid-Cloud)战略,以避免被某个供应商锁定,与此同时,也能利用不同云厂商的优势技术。而图片
or 视频数据作为企业核心资产之一,常常分散存储在AWS
S3、Google Cloud Storage、Azure Blob Storage、阿里云OSS、华为云OBS、火山云tos等多个对象存储服务中。在这种背景下,跨云、跨账号的数据流动和管理变得日益频繁和复杂。

愿景

本文旨在打造一个统一、高效、安全的跨云存储管理平台。

1、提供统一前端管理界面,让用户无需关心底层云厂商的API差异,即可通过一个统一的api、界面、播放器、下载器,直观地在不同云存储桶之间浏览、管理和传输文件,实现数据的自由流动,大幅提升数据运维效率。

2、公司若决策从A云迁移到B云时,让上层业务,尽可能的少感知:底层小文件存储的迁移变化,基于此系统,只需简单几步,即可方便地:按照bucket维度实现:数据同步(增量 +
存量)、数据回源、数据验证、数据切换上线,数据割接。

3、需设计一套:权限认证体系,确保:不分发:ak/sk等永久权限配置信息,只分发:临时token。

模块分类

模块 功能说明 备注
上传 将对象上传到指定的桶
上传回调
预计算
对象meta信息查询
转存 从A桶转移到B桶
云端同步处理
云端异步处理
下载 form表单下载 or 分片下载
播放 多码率播放、多cdn选择、边下载边播放

概要设计

1、基于安全考虑,永久ak/sk,只存放在:服务端STS中,其他所有业务系统都只有临时ak/sk,并且不能配置到配置文件中。

2、通过:accessCode + type,屏蔽掉:多云 +bucket的概念,业务方无需关心:多云的概念。

上传

1、客户端按照:accessCode + type,向服务端(STS)申请:上传token等信息。
2、客户端获取上传token等信息后,调用上传sdk将对象上传到小文件存储系统中。

大体过程,如下图所示:

界面设计:todo

阿里云 OSS 的 STS 临时授权机制 与 AWS 几乎完全一致:

项目 阿里云 OSS AWS S3
服务名称 STS(Security Token Service) STS(Security Token Service)
Token 组成 AccessKeyId, AccessKeySecret, SecurityToken, Expiration AccessKeyId, SecretAccessKey, SessionToken, Expiration
调用方式 AssumeRole AssumeRole
颁发者 RAM 角色授权 IAM 角色授权
典型用法 客户端直传、跨账号授权、短期访问 同上
兼容性 与 S3 STS 语义一致 原生实现
SDK 支持 OSS SDK 内置支持 S3 SDK 内置支持
对比项 AWS S3 阿里云 OSS 说明
临时凭证命名 SessionToken SecurityToken 字段名不同
授权角色体系 IAM Role RAM Role 概念等价
签名算法 AWS4-HMAC-SHA256 HMAC-SHA1/HMAC-SHA256 都为标准加密签名
失效时间 默认15min,可配最长36h 默认15min,可配最长1h 有限期一致
SDK 支持 S3 SDK 原生 OSS SDK 原生 均无缝支持
兼容性 标准 S3 协议 兼容 S3 语义,但非完全 API 兼容 字段差异小
使用场景 客户端直传、跨云迁移 同上 完全一致

上传回调

上传回调分为:客户端回调+小文件存储系统回调。之所以如此设计,是因为各个小文件存储系统对上传回调的支持情况不一致,具体如下:

存储系统 上传回调(Callback) 事件通知(Event Notification) 典型触发目标 适用场景
阿里云 OSS ✅ 支持(x-oss-callback ✅ 支持(事件到 MNS/Kafka/函数计算) HTTP/HTTPS 回调地址 / 消息队列 / 函数 上传后写库、触发转码、预处理
腾讯云 COS/TOS ✅ 支持(SDK/API 配置 Callback) ✅ 支持(COS 事件 → CMQ/SCF/Kafka) 应用回调 / 消息队列 / 云函数 上传完成后业务通知、异步计算
AWS S3 ❌ 不支持直接回调 ✅ 支持(Event Notifications) SQS / SNS / Lambda 触发无服务器函数、事件驱动架构
Google Cloud Storage (GCS) ❌ 不支持直接回调 ✅ 支持(Pub/Sub 通知) Pub/Sub → 消费者服务 上传后触发大规模分布式处理
MinIO / Ceph RGW ❌ 不支持直接回调 ✅ 支持(S3 Event → Kafka/NATS/AMQP) 消息队列 / 流处理系统 本地化或私有云事件流处理

备注:
1、后台服务,根据配置可以选择:由客户端回调,还是:小文件存储系统回调。

对象meta信息查询

获取对象的meta信息,主要包括以下信息:

1、获取:视频的宽、高、大小、文件类型、时长、显示宽、显示高等
2、获取:图片的宽、高、大小、图片类型、色域等信息

以上动作是:常态化、频繁的查询动作,

预计算

正如上一章节所说,获取对象的meta信息,是常态化、频繁的查询动作,而计算对象meta信息的平均耗时:300ms左右(视图片、视频大小而又有变化),对于在线业务而言,确实有点慢。因此,为了减轻业务方的耗时瓶颈,最好触发预计算,也就是说:
当上传sdk将对象上传到:小文件存储系统后,根据配置,会触发相对应的计算,例如:计算对象的meta信息 + 社区上传视频相关时,全量触发:x264转码等。

转存

在纷繁复杂的实际业务场景中,考虑到:
1、成本隔离
2、不同的业务场景,文件生命周期不一致
3、国内与海外情况不一致,
转存,在很多场景下,是必须的,其大体过程,如下图所示:

下载

播放