Tos对象存储实战 | 青训营笔记

312 阅读6分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第3篇笔记

Tos对象存储实战

cdn:离用户更近的缓存。带宽和传输时延

镜像灾备时,主从会不会存在脑裂问题呢?如果有,是怎么解决的?

业务主动把访问从a切到b,而不是内部自己识别切换

引言

  • 介绍一款短视频应用的整体架构

  • 揭示短视频应用背后的视频/图片等静态内容的海量存储需求

    • 计算单天/单月/单年的存储容量
  • 分析视频/图片等静态内容存储需求的特点

    • Immutable Data: 视频/图片是静态不可更改的数据

分布式存储选型对比: 对象存储的优势

回顾存储体系

之前课程介绍过如下存储体系分类:

  • 单机存储
  • 分布式存储
  • 单机/分布式数据库

这里会重温下各类存储适用的场景和范围,并重点介绍分布式存储的分类:

  • 分布式文件系统:当前业界开源代表是HDFS
  • 对象存储: 本次课程介绍的TOS就是其中代表

HDFS vs 对象存储

image-20220605154154153

  • 是否Cloud Native Storage:

    • 云原生存储开箱即用,极大解除了运维运营负担,生态体系依托云构建,丰富健全
    • 对象存储是当前各大云厂商王牌存储产品
  • 接入难易程度对比:

    • Data Model差异:

      • HDFS:伪Posix File System Interface, Directory/File的数据组织形式
      • image-20220528102040030
      • 对象存储:扁平的逻辑命名空间, Bucket/Key的数据组织形式
      • image-20220528102233537
      • Bucket/Key数据组织形式优势:容易理解,使用心智负担小,贴合业务需求
    • 使用接口差异:

      • HDFS:Mkdirs/Create/Append/Delete/Get等文件接口
      • 对象存储: GET/PUT/HEAD/DELETE等Restful HTTP接口
      • HTTP接口的优势:开发简单,分享方便,可无缝接入CDN
  • 其他对比:

    • 可扩展性:对象存储可扩展性更强,支持无限容量
    • 成本:对象存储成本更低

对象存储的用法

image-20220528102622882

基本接口

image-20220605154322992

  • Restful风格简介:简单介绍Restful风格的形式和优点
  • GET:获取对象内容
  • PUT:下载对象内容
  • DELETE:删除对象内容
  • HEAD:获取对象元信息
  • MultiPartUpload接口:针对大对象弱网环境上传的优化
  • image-20220605154356256

这里会对基本的接口做一个简短的演示,让大家直观的了解对象存储的基本用法

Listprefix接口

image-20220605154408530

  • 接口功能:将扁平的逻辑命名空间,转化为人类易于理解的结构化逻辑命名空间
  • CommonPrefix概念:将扁平的逻辑空间,通过分隔符,分割成类似目录的层次化命名空间
  • 分页实现:通过页首和每页对象数量参数,实现分页

这里也会演示ListPrefix接口的基本用法

对象存储面临的工程挑战和解法

限速,安全,租户隔离

key,内容,metadata

image-20220605154608118

工程挑战

image-20220605154637290

首先会梳理经典的一些业务场景:

  • 海量容量场景: 业务持续产生大量数据,数据规模>>PB级别,存储容量和成本压力极大
  • 海量QPS场景: 业务场景有高QPS读写请求,量级>>100K/s,并且时延要求极高,对底层存储IOPS压力极大
  • 高可用性场景:业务对于SLA要求非常高,要求避免全局性不可用事件发生,但对于一致性要求比较低

其中带来的工程挑战有:

  • 可扩展性:架构在存储容量/带宽吞吐/QPS等关键指标上,线性可扩展,能够承担业务在这些指标上的持续增长需求
  • 持久度:数据存储成功后,需要能够抵抗单机/单机架/单机房等各种类型的故障而不丢失
  • 可用性:系统不可用的时间在整体运行时间的占比需要尽可能小,系统不可用后需要具备快速恢复能力
  • 性价比:在海量存储容量的情况下,需要尽力降低单位存储成本,以降低业务的成本支出

解法

Partition 分治提升可扩展性

image-20220605154700909

思路:

  • 将数据通过一定的Partition方法,散步到分布式系统中的不同的机器节点来计算/存储
  • image-20220605154814973

Partition一般做法:

  • Hash Partition:通过hash函数来做Partition的选取
  • Range Partition: 通过range方式切分逻辑地址空间

带来的好处:

  • 可扩展性好
  • 爆炸半径低

Replication 多副本提升持久度

image-20220605154825502

思路:

  • 将数据拷贝多份来存储

Replication一般做法:

  • 多副本:将数据拷贝成多个镜像的副本存储
  • image-20220605154856127
  • EC:使用Erasure Coding方法来构建冗余副本
  • image-20220605154911916

带来的好处:

  • 持久度高
  • 吞吐能力也有提升

image-20220605154931905

高可用解法:单元化最小化爆炸半径

image-20220605155125148

思路:

  • 将系统切分成多个垂直独立的单元,单元之间互相无影响

单元化一般做法:

  • 去除系统单点依赖:系统中没有强依赖的单点
  • 构建流量调度能力:流量可在单元之间灵活调度

带来的好处:

  • 可用性高
  • 运维更友好

镜像灾备应对极端情况

image-20220528112442010

思路:

  • 构建镜像的主备集群应对极端情况

单元化一般做法:

  • 同构灾备:使用同构系统来做数据的镜像备份
  • 异构灾备:使用异构系统来做数据的镜像备份

带来的好处:

  • 极高的可用性
  • 极高的可靠性

image-20220605155143255

开源节流提升性价比

思路:

  • 开源:

    • 冷热分离,使用更低成本存储介质
  • 节流:

    • 通过更高比例EC降低单位存储逻辑冗余
    • 提升垃圾回收效率,提高磁盘空间利用率

带来的好处:

  • 更高的性价比

TOS 当前架构和展望

image-20220605154956909

根据上面工程挑战和解法分析,简单总结并介绍TOS当前的架构,并展望后续TOS的发展方向。