TOS 对象存储 | 青训营

146 阅读4分钟

TOS 对象存储

介绍

对象存储定义

对象存储(Object Storage Service,OSS),也叫基于对象的存储,是一种解决和处理离散单元的方法,可提供基于分布式系统之上的对象形式的数据存储服务。

它提供RESTful API数据读写接口及丰富的SDK接口,并且常以网络服务的形式提供数据的访问。

特点

  • 海量:支持>EB的海量存储
  • 易用:Restful HTTP 接口,开发简单;云原生,按需申请使用;视频/图片相关生态丰富
  • 便宜:使用普通 X86 服务器;冷热数据分级储存,成本更低

使用范围

适用于存储大量的非结构化数据,例如视频、图片等静态不可变数据

结构

Bucket/Object

  • Bucket: 存储对象的桶 , 可类比一个云上的 Map

  • Object: 对象 , 包含如下三个部分

    • Key:对象的名字,可类比 Map 的 Key

      是该对象的全局唯一标识符,用于检索对象,而不需要知道数据的物理地址

    • Data:对象的内容,例如视频 / 图片内容

    • Meta Data:对象的一些元信息,如对象大小,对象 Content-Type, 也可以存储自定义元信息

      与传统的文件存储不同,这类信息并不和文件一同存储,而是独立出来,这样可以加快对象的排序、分类和查找

2023-08-16-10-55-04-image.png

通过 HTTP 接口快速访问

使用方法

  1. 申请 Bucket
  2. 对应逻辑开发(crud)
  3. 上线测试

Restful 接口

使用 HTTP 自身的能力去表示一些参数

2023-08-16-22-27-05-image.png

直接通过 HTTP 的方法就可以快速地对对象进行增删改查

MultiUpload 接口

弱网情况下大对象上传优化

2023-08-16-22-27-47-image.png

  • InitUpload

    类似初始化一个会话

    • 参数:Bucket, Key
    • 返回:UpIoadld
  • UploadPart

    将每个切片和对应的“会话”联系起来,便于最后的组装

    • 参数:UpIoadId, Partld, Part 内容
    • 返回:成功/失败
  • CompIeteUpIoad

    依据InitUpload返回的UploadId将切片连接起来,组成原对象

    • 参数: UpIoadId, PartId Array
    • 返回:成功/失败

思想就是分而治之,将大对象切分成小对象,然后逐片上传,最后使用 CompleteUpload 将切片连接起来

Listprefix 接口

用于查看桶里面有哪些内容

2023-08-16-23-26-28-image.png

  • ListPrefix 参数

    • prefix:key 前缀
    • delimiter:分隔符,默认为 /
    • max-keys:本次分页数量
    • start-after:分页起始对象 Key
  • LIstPrefix 返回

    • common-prefix:共同前缀
    • objects:对象 key 列表
    • isTruncated:是否已经列举完

工程挑战

在真实的工程环境下,常常需要面对很多极端的业务场景,例如海量容量场景、海量QPS场景以及高可用性场景

海量容量场景: 业务持续产生大量数据,数据规模>>PB级别,存储容量和成本压力极大

海量QPS场景: 业务场景有高QPS读写请求,量级>>100K/s,并且时延要求极高,对底层存储IOPS压力极大

高可用性场景:业务对于SLA要求非常高,要求避免全局性不可用事件发生,但对于一致性要求比较低

这意味着对对象存储系统的可扩展性、持久度、可用性和性价比都有很高的要求

提升可扩展性

利用分片思想分而治之,将数据分片后再散布到分布式系统的不同节点中去存储 / 计算

Partition一般做法:

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

这样做除了可用增加可扩展性,并且可以有效减少爆炸半径

爆炸半径即故障影响业务的范围

提升持久度

Replication 保持多份副本,将数据拷贝多份来存储

Replication一般做法:

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

Erasure Code(纠错码)是一种编码技术,它可以将n份原始数据,增加m份数据,并能通过n+m份中的任意n份数据,还原为原始数据。即如果有任意小于等于m份的数据失效,仍然能通过剩下的数据还原出来。

同时也能提升吞吐能力

提高可用性

  1. 单元化最小化爆炸半径

    通过将系统切分为多个垂直独立的单元,使得各单元之间无影响,降低了系统的耦合性

单元化一般做法:

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

提高了可维护性

  1. 灾备处理,利用同构或异构系统制作数据的镜像备份

提高性价比

  • 开源:

    使用冷热分离的存储技术,使用配置较低的设备存储冷数据,降低存储成本

  • 节流

    • 使用更高比例的 EC 减少存储逻辑冗余
    • 提高垃圾回收效率,提高硬盘利用率