这是我在青训营的第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
- 返回:成功、失败
- InitUpload
- ListPrefix接口:提供分页功能
- ListPrefix参数:
- prefix: key前缀
- delimiter:分隔符,默认为/
- max-keys :本次分页数量
- start-after: 分页起始对象
- KeyListPrefix返回:
- common-prefix:共同前缀
- objects: 对象key列表
- isTruncated:是否已经列举完
- ListPrefix参数:
TOS实现中的挑战以及解决方案
分布式
作为一个云原生存储系统,每日都会有大量数据涌入,这便要求TOS有海量数据的存储能力 解决方案:分布式,实现分布式集群,在各个节点均匀存储数据,并且做到能够动态扩容
持久性与吞吐量
存储介质在长期存储中难免遇到突发情况,导致其不可用,包括但不限于设备老化、机房断电、光缆挖断等 并且在用户请求量大的情况下,需要保持服务的强吞吐能力 解决方案:复制(Replication),为一份文件作多机房多地域副本,可以在一处发生意外时仍能提供服务;并且多服务器让服务的吞吐量得到翻倍提升
冗余编码
3.2中的复制策略虽然提高了容灾能力,但同时也提升了存储成本
解决方案:冗余编码(Erasure Coding),通过特定的编码方式,即使在文件部分损坏的情况下仍然能恢复完全文件,但是这种方式也会带来计算成本
温冷转换
互联网上的数据在不同时期有着不同的访问量,当下热点的数据在一个月后可能无人问津
解决方案:温冷转换,将高访问的数据存储在高速度的存储介质中,将低访问的数据存储在高存储的存储介质中
集群拆分
如果所以系统共用一个集群,那么集群发送故障时,所有功能都会瘫痪
解决方案:集群拆分,将一个集群拆分为多个,在一个集群瘫痪时仍有其它的集群可以提供服务,降低了爆炸半径
镜像灾备
bucket自身也可能会出现问题
解决方案:镜像灾备,复制一个和原bucket一模一样的备份,同时向外提供服务,当主bucket出现问题时切换备份bucket,待主bucket问题修复时再复原