这是我参与「第三届青训营 -后端场」笔记创作活动的第 6 篇笔记
引言
近几年,以短视频为代表的流媒体技术应用在移动互联网时代实现了快速发展。视频业务一般包含视频上传、存储、处理、播放等流程及相应的流程管理与审核。因此,如何安全可靠地存储PB级海量数据,并实现视频数据的快速存取成为构建一个短视频平台需要考虑和解决的技术难题。
面对短视频应用背后的视频/图片等静态内容的海量存储需求,针对视频/图片是静态不可更改的数据的特点,对象存储应运而生,具有读写速度快,易于共享,扩展性强的优点。
1、块存储、文件存储、对象存储
当前存储从逻辑上一般可分为三类,即块存储、文件存储和对象存储。
块存储强调以裸磁盘的形式直接给主机或服务器提供存储服务,一般指常见的卷或硬盘存储,以及相应的磁盘阵列、DAS、SAN等存储方式,块存储的操作对象是磁盘,使用逻辑块编号寻址,数据按字节方式访问,读写速度快。
文件存储相当于在物理磁盘之上,多了一层文件系统,通过文件系统的调度来对外提供存储资源,文件系统将数据以不同应用程序要求的结构方式组成不同类型的文件,可对文件进行创建、查找、修改、删除等操作,易于实现数据共享。块存储也需要文件系统,只不过块存储的文件系统在客户端,而文件存储的文件系统在存储端。
对象存储将文件以对象的方式进行存储,一个对象包括三个部分:Key、Data、Metadata,Key是该对象的全局唯一标识符(UID),Data就是数据本体,Metadata元数据有点类似数据的标签,它是对象的各种描述信息。对象存储将对象(Object)存储在一个桶里(bucket),然后采用restful api根据bucket/key来访问指定的对象。通常实现方式为多台分布式服务器,通过对象存储软件组建集群,对外提供读写访问功能。对象存储比较适用于存储现在爆炸式增长的视频、图片等静态资源,它存储的对象是Immutable的,数据是不能直接修改的,只能先下载、修改,再上传文件。对象存储的优点是速度快,易于共享,扩展性强。
以下笔记来自罗嗣彬老师讲的《TOS对象存储实战》:
2、存储系统分类
3、各类存储对比
对比各类存储,单机存储首先我们排除,数据量实在是太大了,单机肯定存不下,单机数据库同理。
那分布式数据库呢,现代的分布式数据库在容量和弹性上面都有很大进展,是否可以呢?答案也是No,因为分布式数据库只适合存储结构化or半结构化数据,什么是结构化数据呢。就是数据和数据之间有一定关系,如用户信息,一个用户会关联包括电话号码,性别等各种维度的信息,这些信息一般都是不超过KB级别的,超过MB级别就不适合使用数据库处理了;
唯一的选择就是分布式存储,分布式存储是针对海量存储场景特别设计的存储,能够存储海量的大数据;
4、分布式存储选型
分布式存储分为分布式文件存储和对象存储。
5、分布式文件系统存储HDFS vs 对象存储TOS
-
是否Cloud Native Storage:
- 云原生存储开箱即用,极大解除了运维运营负担,生态体系依托云构建,丰富健全
- 对象存储是当前各大云厂商王牌存储产品
-
接入难易程度对比:
-
Data Model差异:
- HDFS:伪Posix File System Interface, Directory/File的数据组织形式
- 对象存储:扁平的逻辑命名空间, Bucket/Key的数据组织形式
- Bucket/Key数据组织形式优势:容易理解,使用心智负担小,贴合业务需求
-
使用接口差异:
- HDFS:Mkdirs/Create/Append/Delete/Get等文件接口
- 对象存储: GET/PUT/HEAD/DELETE等Restful HTTP接口
- HTTP接口的优势:开发简单,分享方便,可无缝接入CDN
-
-
其他对比:
- 可扩展性:对象存储可扩展性更强,支持无限容量
- 成本:对象存储成本更低
6、对象存储的用法
基本接口
-
Restful风格简介:简单介绍Restful风格的形式和优点
-
GET:获取对象内容
-
PUT:上传对象内容
-
DELETE:删除对象内容
-
HEAD:获取对象元信息
-
MultiPartUpload接口:针对大对象弱网环境上传的优化
Listprefix接口
-
接口功能:将扁平的逻辑命名空间,转化为人类易于理解的结构化逻辑命名空间
-
CommonPrefix概念:将扁平的逻辑空间,通过分隔符,分割成类似目录的层次化命名空间
-
分页实现:通过页首和每页对象数量参数,实现分页
7、对象存储面临的工程挑战和解法
工程挑战
经典的一些业务场景:
-
海量容量场景: 业务持续产生大量数据,数据规模>>PB级别,存储容量和成本压力极大
-
海量QPS场景: 业务场景有高QPS读写请求,量级>>100K/s,并且时延要求极高,对底层存储IOPS压力极大
-
高可用性场景:业务对于SLA要求非常高,要求避免全局性不可用事件发生,但对于一致性要求比较低
其中带来的工程挑战有:
-
可扩展性:架构在存储容量/带宽吞吐/QPS等关键指标上,线性可扩展,能够承担业务在这些指标上的持续增长需求
-
持久度:数据存储成功后,需要能够抵抗单机/单机架/单机房等各种类型的故障而不丢失
-
可用性:系统不可用的时间在整体运行时间的占比需要尽可能小,系统不可用后需要具备快速恢复能力
-
性价比:在海量存储容量的情况下,需要尽力降低单位存储成本,以降低业务的成本支出
解法
Partition 分治提升可扩展性
思路:
- 将数据通过一定的Partition方法,散步到分布式系统中的不同的机器节点来计算/存储
Partition一般做法:
-
Hash Partition:通过hash函数来做Partition的选取
-
Range Partition: 通过range方式切分逻辑地址空间
带来的好处:
-
可扩展性好
-
爆炸半径低
Replication 多副本提升持久度
思路:
- 将数据拷贝多份来存储
Replication一般做法:
-
多副本:将数据拷贝成多个镜像的副本存储
-
EC:使用Erasure Coding方法来构建冗余副本
带来的好处:
-
持久度高
-
吞吐能力也有提升
单元化最小化爆炸半径
思路:
- 将系统切分成多个垂直独立的单元,单元之间互相无影响
单元化一般做法:
-
去除系统单点依赖:系统中没有强依赖的单点
-
构建流量调度能力:流量可在单元之间灵活调度
带来的好处:
-
可用性高
-
运维更友好
镜像灾备应对极端情况
思路:
- 构建镜像的主备集群应对极端情况
单元化一般做法:
-
同构灾备:使用同构系统来做数据的镜像备份
-
异构灾备:使用异构系统来做数据的镜像备份
带来的好处:
-
极高的可用性
-
极高的可靠性
开源节流提升性价比
思路:
-
开源:
- 冷热分离,使用更低成本存储介质
-
节流:
- 通过更高比例EC降低单位存储逻辑冗余
- 提升垃圾回收效率,提高磁盘空间利用率
带来的好处:
-
更高的性价比
8、思考题:
1.对象存储适用于网页前端 js 文件存储吗?为什么?
答:适用,对象存储适用于静态文件存储。
2.对象存储使用 CDN 作为缓存,能够缓存哪些基本接口的结果呢?缓存刷新会使用到 HTTP 协议的何种机制呢?
答:CDN全称:Content Distribute Network,即内容分发网络,是将源站内容分发至最接近用户的节点,使用户可就近取得所需内容,提高用户访问的响应速度和成功率。解决因分布、带宽、服务器性能带来的访问延迟问题,适用于站点加速、点播、直播等场景。
用户第一次访问网站后,网站的一些静态资源如图片等会被下载到本地,作为缓存,当用户第二次访问该网站的时候,浏览器就会从缓存中加载资源,不用向服务器请求资源,从而提高了网站的访问速度。若使用了CDN缓存,当浏览器本地缓存的资源过期后,浏览器不是直接向源站点请求资源,而是向CDN边缘请求资源。若CDN中的缓存过期,那就由CDN边缘节点向源站点发出回源请求来获取最新资源。
所以CDN 作为缓存,主要缓存GET、HEAD接口获取对象信息的结果。
CDN节点缓存机制在不同服务商中是不同的,但一般都遵循HTTP协议,通过http响应头中的Cache-Control:max-age的字段来设置CDN节点文件缓存时间。当客户端向CDN节点请求数据时,CDN会判断缓存数据是否过期,若没有过期,则直接将缓存数据返回给客户端,否则就向源站点发出请求,从源站点拉取最新数据,更新本地缓存,并将最新数据返回给客户端。CDN服务商一般会提供基于文件后缀、目录多个维度来指定CDN缓存时间,为用户提供更精细化的缓存管理。CDN缓存时间会对“回源率”产生直接的影响,若CDN缓存时间短,则数据经常失效,导致频繁回源,增加了源站的负载,同时也增大了访问延时;若缓存时间长,数据更新时间慢,因此需要针对不同的业务需求来选择特定的数据缓存管理。
3.对象存储 MultiPartUpload 接口,UploadID 如何保证全局唯一呢?
4.一个基于对象存储构建的网盘应用,应该如何用 Listprefix 接口实现个人文件的展示呢?
5.假设我们采取 Hash Partition 来完成对象存储元数据的存储,能够实现ListPrefix 接口么?如何实现呢?
6.Replication 的一个副本损坏了,对系统会带来什么影响?应该如何修复呢?
7.Erasure Coding 有哪些经典的算法?多机房之间的 EC 有何种解决方案呢?
8.镜像灾备如何保证主备集群之间的一致性呢?