对象存储 | 青训营

195 阅读4分钟

这是我在青训营的第8篇笔记。
TOS,意为顶级的对象存储(Top Object Storage),是字节跳动自主研发的一款云原生对象存储系统

对象存储存在的意义

下面以抖音为例,阐述对象存储的必要性

  • 抖音作为现象级的短视频软件,每一分每一秒都在产生大量数据,对数据存储容量大小是以PB乃至EB为计的
  • 传统的分布式文件系统对视频,图片等资源支持较差
  • 传统分布式文件系统开发,维护较繁杂

TOS简介

TOS简单介绍

  • 存储桶
    存储桶(bucket)是用户存储对象(Object)的容器,区别于文件系统多层级树形目录结构,存储桶采用扁平化存储方式,桶内所有对象都处于统一逻辑层级。
  • 对象
    对象(Object)是TOS存储数据的基本单元,本帮助文档中对象、文件、Object均具有相同含义。对象由键(Key),数据(Data)和元数据(Metadata)三部分组成。
    • key:对象名,类似MAP的key
    • Data:对象内容,是存储主题
    • MetaData:对象的一些元数据,如对象大小、类型,也可自定义

申请bucket

通过厂商提供的云平台,填写申请即可

使用Restful风格API操作bucket

通过http请求即可操作bucket

  • PUT:修改

    • 参数:bucket,key,对象内容
    • 返回:成功、失败
  • GET:获取

    • 参数:bucket,key
    • 返回:对象内容
  • HEAD

    • 参数:bucket,key
    • 返回:对象元信息
  • DELETE

    • 参数:bucket,key
    • 返回:成功、失败

操作优化

  • MultiUpload接口:可以将大文件分解为小文件上传,在网络不稳定情况下优势大
    • InitUpload
      • 参数:bucket,key
      • 返回:uploadId
    • UploadPart
      • 参数:uploadId,partId,part内容
      • 返回:成功、失败
    • CompleteUpload
      • 参数:uploadId,partId Array
      • 返回:成功、失败
  • ListPrefix接口:提供分页功能
    • ListPrefix参数:
      • prefix: key前缀
      • delimiter:分隔符,默认为/
      • max-keys :本次分页数量
      • start-after: 分页起始对象
    • KeyListPrefix返回:
      • common-prefix:共同前缀
      • objects: 对象key列表
      • isTruncated:是否已经列举完

TOS实现中的挑战以及解决方案

分布式

作为一个云原生存储系统,每日都会有大量数据涌入,这便要求TOS有海量数据的存储能力 解决方案:分布式,实现分布式集群,在各个节点均匀存储数据,并且做到能够动态扩容

持久性与吞吐量

存储介质在长期存储中难免遇到突发情况,导致其不可用,包括但不限于设备老化、机房断电、光缆挖断等 并且在用户请求量大的情况下,需要保持服务的强吞吐能力 解决方案:复制(Replication),为一份文件作多机房多地域副本,可以在一处发生意外时仍能提供服务;并且多服务器让服务的吞吐量得到翻倍提升

冗余编码

3.2中的复制策略虽然提高了容灾能力,但同时也提升了存储成本

解决方案:冗余编码(Erasure Coding),通过特定的编码方式,即使在文件部分损坏的情况下仍然能恢复完全文件,但是这种方式也会带来计算成本

温冷转换

互联网上的数据在不同时期有着不同的访问量,当下热点的数据在一个月后可能无人问津

解决方案:温冷转换,将高访问的数据存储在高速度的存储介质中,将低访问的数据存储在高存储的存储介质中

集群拆分

如果所以系统共用一个集群,那么集群发送故障时,所有功能都会瘫痪

解决方案:集群拆分,将一个集群拆分为多个,在一个集群瘫痪时仍有其它的集群可以提供服务,降低了爆炸半径

镜像灾备

bucket自身也可能会出现问题

解决方案:镜像灾备,复制一个和原bucket一模一样的备份,同时向外提供服务,当主bucket出现问题时切换备份bucket,待主bucket问题修复时再复原