抖音的运转过程与存储模式 | 青训营

140 阅读3分钟

抖音的存储模式

片源->审核->放送

视频上传过程:

  • 上传视频到片源服务,片源服务将视频存储。
  • 片源服务将视频发送抽帧服务和转码服务。
  • 抽帧服务将视频抽帧采样并存储。
  • 转码服务将原视频转换为不同清晰度、不同码率的视频并存储。
  • 抽帧后的图片被送往审核服务。
  • 机器或人工审核过后视频被传给推荐服务。
  • 用户可以获取推荐列表或下载推荐视频/图片。

对象存储的必要性

单机存储:文件系统,key-value存储。

单机数据库:关系型数据库,非关系型数据库。

分布式数据库:关系型数据库,非关系型数据库。

分布式存储:分布式文件系统,对象存储。

接口对比

HDFS客户端与服务端使用TCP私有协议连接。服务端HDFS使用树状文件目录,操作命令多,且与目录文件操作息息相关。

弱POSIX文件系统语义:

  • 目录/文件
  • Append写
  • 无法直接HTTP访问

Bucket/Object语义:

  • Bucket:存储对象的桶,可类比一个云上的Map
  • Object:对象,包含三部分,key(对象的名字)、Data(对象的内容,如视频、图片等)、MetaData(对象的一些元信息,比如对象大小、内容类型、也可以存储自定义元信息)

HTTP接口:任何时间、任何地点、任何互联网设备上传和下载数据。支持HTTP协议的各种客户端都可以访问。

适用场景

适用于:视频、图片、文本、安装包、备份、前端js文件等静态(Immutable)文件。

不适用于:关系型数据库(只存储,无法理解关系,难以存储结构化数据)、KV(性能不如redis)、随机写(只支持静态内容,不支持改写)、Append写、更新频繁。

对象存储使用方法

  1. 申请bucket
  2. 业务逻辑开发(视频上传、视频下载、视频删除、视频查看)
  3. 上线测试

申请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的可扩展性。

问题解决

可拓展性:分布式存储

持久度:备份,多机架/多机房/多地区