1. 对象存储的背景
1.1 短视频架构
短视频架构中需要有客户端系统、账号系统和评论系统三个公共系统,从核心角度来看,短视频平台是用户生产内容的平台,最重要的是内容生产到推荐这一链路,这一条链路上,会有片源,也就是承接用户上传的内容,然后审核服务对这些内容进行合规的审核,最后这些内容会根据机器学习打上标签,通过各位同学历史观看兴趣通过推荐服务推荐到各位用户的手机端。
1.2短视频背后的存储需求
短视频生产的消费链路可以分为如下几个服务,首先第一步是片源服务,将用户上传的视频存起来,用户上传的视频称为源视频,然后会有转码服务,将原视频转为不同码率的视频。为什么需要转码?是因为不同客户端的型号能接受的分辨率是不一样的,因此需要转码来适配,转码后的视频也需要存储起来,以供客户端拉取,在转码服务的同时还需要进行抽帧,将视频抽成不一样的帧用于审核服务,此阶段也需要把抽针的图片储存起来,最后推荐服务将对应视频推荐出去,用户利用客户端就可以拉取视频观看。
因此短视频平台所需要的存储需求主要来源于存储源视频、存储不同码率视频、存储抽帧后的图片等部分。
1.3 短视频的存储特点
- 海量:存储系统一定要能够存储如此大的海量数据
- 易用:好的存储能够解放业务,让业务专注于业务逻辑开发
- 便宜:由于存储量巨大,越便宜就越能省下宝贵的经费
2. 对象存储的需求
2.1 存储系统的分类与对比
2.1.1 存储系统分类
- 单机存储:指将数据存储在一台单独的计算机上,这台计算机既充当数据处理的服务器,也充当数据存储的设备。单机存储的特点是简单易用,但在数据量和访问性能方面存在瓶颈。
- 单机数据库:指将数据存储在一台单独的计算机上,并使用关系型数据库管理系统进行管理和查询。单机数据库的特点是简单易用,但在数据量和访问性能方面存在瓶颈。
- 分布式数据库:指将数据分布在多台计算机上,每台计算机都存储部分数据,并使用分布式数据库管理系统进行管理和查询。分布式数据库的特点是可以横向扩展,提高数据量和访问性能,但相对于单机数据库来说,部署和维护成本较高。
- 分布式存储:指将数据分布在多台计算机上,每台计算机都存储部分数据,并使用分布式存储系统进行管理和访问。分布式存储的特点是可以横向扩展,提高数据量和访问性能,同时具备高可用、高可靠和高扩展性等优点,但相对于单机存储来说,部署和维护成本较高。
2.2.2 存储系统对比
- 由于数据量过大,首先排除单机存储。
- 由于分布式数据库只适合存储结构化或半结构化数据,而结构化数据,数据和数据之间有一定关系,比如说用户信息,一个用户会关联电话号码,性别等各种维度的信息。这种信息一般是不超过KB级别的,超过MB级别就不适合使用,
- 数据库处理的唯一的选择就是分布式存储。分布式存储是针对海量存储场景特别涉及的存储,能够存储海量大数据。
2.2 分布式文件系统与对象存储的对比
2.2.1 优势角度
- 海量角度:对象存储文件数量不受限制,而分布式文件系统存储文件数量受Name Node限制
- 易用角度:对象存储使用Restful HTTP接口,而分布式文件系统使用伪Posix接口,对象存储开发更简单
- 便宜角度:对象存储和布式文件系统均可使用普通X86服务器,成本较低,而对象存储具备冷热数据分级存储能力,可以进一步降低成本
2.2.2 接口开发对比
分布式文件系统HDFS接口:
HDFS提供了一个简单的文件接口,可以将文件上传到HDFS存储节点上,也可以从HDFS存储节点上下载文件。HDFS接口适用于处理大规模数据,支持多个节点并行读写,但对于小规模数据和实时读写需求,HDFS接口可能不太适合。
对象存储TOS接口:
TOS提供了一个RESTful API接口,可以将对象上传到TOS存储节点上,也可以从TOS存储节点上下载对象。TOS接口适用于存储和处理海量数据,支持实时读写和高可用性,同时提供了多种数据服务,如数据加密、数据备份和数据同步等。
总之,HDFS接口和TOS接口都是针对不同的数据处理场景设计的,选择哪个接口取决于实际业务需求。如果需要处理大规模数据,HDFS接口是一个不错的选择;如果需要处理海量数据并且需要实时读写和高可用性,TOS接口则更加适合。
3 对象存储使用
3.1 使用流程
使用OSS存储和处理对象的流程:
- 创建OSS存储桶:申请Bucket
- 业务逻辑开发:完成视频上传、视频下载、视频删除、视频查看等功能
- 上线测试:针对业务逻辑开发中的功能进行实际测试
3.2 Restful接口
Restful接口是OSS提供的一种基于HTTP协议的接口,可以实现对对象的上传、下载、删除、获取元数据等操作。Restful接口使用简单,支持多种语言开发,例如Java、Python、PHP等,同时支持多种认证方式,例如API密钥、OSS账号密码、OAuth等。
3.3 MultiUpload接口
MultiUpload接口是OSS提供的一种支持多文件上传的接口,可以一次性上传多个文件到同一个存储桶中。MultiUpload接口可以提高上传效率,同时支持多种文件格式和文件大小,例如JPG、PNG、MP4等。
针对大文件,可以通过分治思想将大文件分为多个小文件逐个上传至存储服务端。
-
lnitUpload:
-
- 参数: Bucket, Key
-
- 返回: Uploadld
-
UploadPart:
-
- 参数:uploadld,Partld , Part内容
-
- 返回:成功/失败
-
CompleteUpload:
-
- 参数: Uploadld, Partld Array
-
- 返回:成功/失败
3.4 Listprefix接口
Listprefix接口是OSS提供的一种支持列出存储桶中所有以指定前缀开头的对象的接口。Listprefix接口可以方便地查看存储桶中所有的对象信息,并可以根据需要对这些对象进行操作,例如删除、下载、获取元数据等。同时,Listprefix接口还支持多种过滤条件,例如按照创建时间、修改时间、对象大小等进行过滤,以便更好地管理存储桶中的对象。
ListPrefix接口可用于查看桶下面有哪些对象,作为分页接口,循环调用该接口可以遍历桶下面所有对象。 ListPrefix参数:
- prefix: key前缀
- delimiter:分隔符,默认为/
- max-keys:本次分页数量
- start-after:分页起始对象Key
ListPrefix返回:
- common-prefix:共同前缀
- objects: 对象key列表
- isTruncated:是否已经列举完
本文首先介绍了短视频架构及存储需求,引入分布式存储需求,简要分析了分布式存储中分布式文件系统与对象存储的优缺点,最后介绍了对象存储使用流程,详细介绍对象存储中Restful接口、MultiUpload接口和Listprefix接口使用方法。
本文为个人见解,如有错误欢迎指正!