这是我参与「第三届青训营 -后端场」笔记创作活动的的第4篇笔记
为什么需要对象存储
现代互联网应用存在普遍的视频/图片等静态内容的海量存储需求
对象存储以其极佳海量存储能力,低廉成本,易用性,成为这类场景的不二之选
存储对比
| 存储备选 | 海量支持 | 适合数据类型 | 是否入选 |
|---|---|---|---|
| 单机存储 | No | 单机文件/KV | No |
| 单机数据库 | No | 少量(半)结构化数据 | No |
| 分布式数据库 | Yes | 大量(半)结构化数据 | No |
| 分布式存储 | Yes | 大数据计算中间结果/视频/图片等 | Yes |
分布式存储选型
| 海量 | 易用 | 便宜 | |
|---|---|---|---|
| 分布式文件系统HDFS | 支持PB->EB海量存储 文件数量受Name Node限制 | 伪Posix文件接口,开发略复杂 非云原生,搭建维护麻烦 视频/图片相关生态接入略复杂 | 使用普通x86服务器,成本低 |
| 对象存储Tos | 支持EB海量存储 对象数量无限制 | Restful HTTP接口,开发极简单 云原生,按需申请使用 视频/图片相关生态丰富 | 使用普通x86服务器 具备冷热数据分级存储能力,成本更低 |
对象存储怎么用
申请Bucket
Restful接口
对象存储对外提供的一般都是Restful风格的接口
PUT:
- 参数:Bucket, key,对象内容
- 返回:成功/失败
GET:
- 参数:Bucket, Key
- 返回:对象内容
HEAD: Lite版GET
- 参数:Bucket,Key
- 返回:对象元信息,如大小/Content-Type等
DELETE:
- 参数:Bucket, Key
- 返回:成功/失败
MultiUpload接口
解决大文件传输问题
lnitUpload:
- 参数:Bucket , Key
- 返回:uploadld
UploadPart:
- 参数:uploadld, Partld , Part内容
- 返回:成功/失败
CompleteUpload:
- 参数:uploadld, Partld Array
- 返回:成功/失败
Listprefix接口
查看桶里面有哪些对象
ListPrefix参数:
- prefix: key前缀
- delimiter: 分隔符,默认为/
- max-keys: 本次分页数量
- start-after: 分页起始对象key
- ListPrefix返回:
- common-prefix: 共同前缀
- objects: 对象key列表
- isTruncated: 是否已经列举完
Tos字节内部实践
开发一个对象存储
接入层:接入解析并处理接口请求
元信息层:存储对象元信息
存储引擎层:存储对象内容
经典业务场景
| 容量型 | QPS型 | |
|---|---|---|
| 代表业务 | 片源:用户上传源视频 转码:源文件转码后的视频 | 抽帧:源视频审核用抽帧 |
| 特点 | 容量:海量,>EB 吞吐:海量,>>100GB/s 高持久度:用户视频不能丢 | QPS:极高,>>100K/s |
| 挑战 | 可扩展性:容量/吞吐需可线性扩展 成本:单位存储成本需要足够低 持久度:如何在保证成本的情况下,确保高持久度 | 可扩展性:QPS需可线性扩展 |
可扩展性解法之Partition
分布式存储=分布式+单机存储
分布式:
- 存储均匀分布
- 计算均匀分布
- 压力均匀分布
分布式系统相当于一个蜂群,每个节点都负责一小部分数据存储和计算,达到1+1 >=2的效果
Partition(分而治之)
- 分而治之:不同数据映射至不同Partition分区
- Partition Logic: Hash/Range
- 可扩展性如何达成
- 数据量增加:扩容机器新建Partition
- Parition Logic:新增数据写入映射导向新Partition
持久度解法之Replication
持久度的敌人:不可靠的一切
- 不可靠的硬件
- 不可靠的软件
- 自然灾害
- 甚至是太阳黑子!
数据单节点存储,一定有较大概率丢失无法找回
复制(Replication)
-
数据复制多份,即多个副本
-
副本放置策略:
- 多机架:可抵抗机架级别故障
- 多机房:可抵抗机房级别故障
- 多Region:可抵抗Region级别故障
带来
- 高持久度:不丢数据
- 强吞吐能力:多个副本可以提供服务
成本解法之EC
Replication虽然可以解决持久度问题,但是单纯多副本拷贝成本也非常高
EC (Erasure Coding)
- 冗余编码:可达到和多副本一样的持久度
特点
- 低冗余度:成本较单纯多副本低
- 额外计算:增加了额外的编码计算步骤
成本解法之温冷转换
数据都是有温度的,将冷数据转移到性能更差但更廉价的存储介质就可以省下来成本
架构细化
API:接入层
- Bucket Meta: Bucket元信息服务
- Object Meta:对象元信息服务
- Distributed Kv: Range Partition的分布式KV、用于持久化对象元数据
- Storage Engine:对象内容存取服务
- Distributed storage Pool:分布式存储池.三副本 or Ec存储
- GC:垃圾回收后合服务
- Lifecycle:温冷转换后合服务
存储需求量细化
SLA
RPO
RTO
高可用解法之拆分降低爆炸半径
一个集群拆分成多个集群,有效降低爆炸半径
高可用之镜像灾备
无论何种情况,都保证服务可用
完全镜像的主备Bucket,出现问题随时切换,真正100%的可用性