抖音的存储模式
片源->审核->放送
视频上传过程:
- 上传视频到片源服务,片源服务将视频存储。
- 片源服务将视频发送抽帧服务和转码服务。
- 抽帧服务将视频抽帧采样并存储。
- 转码服务将原视频转换为不同清晰度、不同码率的视频并存储。
- 抽帧后的图片被送往审核服务。
- 机器或人工审核过后视频被传给推荐服务。
- 用户可以获取推荐列表或下载推荐视频/图片。
对象存储的必要性
单机存储:文件系统,key-value存储。
单机数据库:关系型数据库,非关系型数据库。
分布式数据库:关系型数据库,非关系型数据库。
分布式存储:分布式文件系统,对象存储。
接口对比
HDFS客户端与服务端使用TCP私有协议连接。服务端HDFS使用树状文件目录,操作命令多,且与目录文件操作息息相关。
弱POSIX文件系统语义:
- 目录/文件
- Append写
- 无法直接HTTP访问
Bucket/Object语义:
- Bucket:存储对象的桶,可类比一个云上的Map
- Object:对象,包含三部分,key(对象的名字)、Data(对象的内容,如视频、图片等)、MetaData(对象的一些元信息,比如对象大小、内容类型、也可以存储自定义元信息)
HTTP接口:任何时间、任何地点、任何互联网设备上传和下载数据。支持HTTP协议的各种客户端都可以访问。
适用场景
适用于:视频、图片、文本、安装包、备份、前端js文件等静态(Immutable)文件。
不适用于:关系型数据库(只存储,无法理解关系,难以存储结构化数据)、KV(性能不如redis)、随机写(只支持静态内容,不支持改写)、Append写、更新频繁。
对象存储使用方法
- 申请bucket
- 业务逻辑开发(视频上传、视频下载、视频删除、视频查看)
- 上线测试
申请bucket
对象存储很多云厂商都支持,此处介绍字节的TOS。
构建bucket名称。数据描述(数据类别、数据访问级别、保密级别等。用于系统审计)。填写吞吐需求。提交。
restful接口
使用HTTP协议的PUT、GET、HEAD、DELETE方法。
MultiUpload接口
防止大对象上传失败:将大对象分为小对象,标上uploadID,然后分开上传。
Listprefix接口(分页查询)
参数:
- prefix:key前缀
- delimiter:分隔符,默认为/
- max-keys:本次分页数量
- start-after:分页起始对象key
TOS设计中的问题
三层架构
元信息层<<(写入/读取对象元信息)<<接入层>>(写入/读取对象内容)>>存储引擎层
- 接入层:接入解析并处理接口请求,解析HTTP、安全校验等。
- 元信息层:存储对象元信息。
- 存储引擎层:存储对象内容。
总结业务场景
经典业务场景分为容量型和QPS型。
容量型代表业务包括片源存储、转码视频存储。特点为大容量、大吞吐、高耐久度。挑战包括可拓展性(容量、吞吐扩展)、成本(要存很多数据,因此需要单价低)、持久度。
QPS型代表业务包括审核抽帧存储。特点为QPS极高。挑战为QPS的可扩展性。
问题解决
可拓展性:分布式存储
持久度:备份,多机架/多机房/多地区