这是我参与「第三届青训营 -后端场」笔记创作活动的的第6篇笔记
一 为什么需要对象存储
1 系统的分类
2 系统的对比
- 单机存储首先排除,数据量太大,单机存不下,单机数据库也同理。
- 现代的分布式数据库在容量和弹性上面都有很大的进展,但只适合存储结构化或者半结构化的数据(即数据和数据之间有一定的关系,这些信息一般都不超过KB级别)
- 所以唯一的选择是针对海量存储场景特别设计的存储,能够存储海量的大数据。
3 存储选型
3.1 易用性对比
3.2 适用场景
二 对象存储的使用
对象存储里面只有两个跟资源相关的名词:Bucket,Object。Bucket 中文直译为”桶“,Object 显而易见就是”对象“。所有 Object 都必须属于某个 Bucket,无一例外。 Bucket 通常也是计费、权限控制、生命周期等高级功能的管理实体。 一般来讲,Bucket 作为一个抽象的容器概念,空间是无限的,也就是说,用户存放的 Object 的数量和大小总量没有限制,空间大小只依赖于实际的物理资源
1 申请Bucket
2 Restful接口
申请完Bucket后,要开启开发,对象存储对外提供的一般都是Restful风格的接口。
3 Restful接口演示
- PUT/GET/HEAD/DELETE
4 MultiUpload接口
- 在文件较大(1GB)时,一次性完全传输容易因网络问题失败。因此将文件分为为多个块,传输。
5 Listprefix接口
- 分页列举查看桶(Bucket)中对象列表
三 TOS字节内部实践
1 三层架构
-
接入层:接收请求
-
元信息层:存储对象元信息(大小,类型等)
-
存储引擎层:存储对象内容
2 业务需求
- 容量型:如用户上传的视频。需求容量大,吞吐强,持久度高。
- QPS型:如审核抽帧。需求QBS极高 拓展性:可以线性拓展
每秒查询率QPS是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准
3 拓展性的解决方案
Partition:将数据映射至不同分区。映射的算法通常有Hash和Range
hash与range方式的优劣?
Hash:可以快速定位数据所在分区,但无法顺序获得数据 Range:数据保持原来的顺序,但可能出现数据扎堆的情况。
各partition之间如何负载均衡?
hash:采用一致性hash并数据迁移
range:根据数据的聚集性,分裂或合并数据range。
4 持久度的解决方法
- replication:数据复制多个副本,在服务崩溃时调用副本抵抗故障
replication拷贝方式:联想数据库的主从同步
replication如何解决一致性问题:Raft一致性算法
EC(erasure coding) 冗余编码:可达到和多副本一样的持久度。
特点:成本较单纯多副本低,但是增加了额外的编码计算步骤
5 成本的解决方法———温冷转换
大致思路是将热点数据存储到一些性能好但昂贵的介质中,待到数据热度下降(访问量趋于平稳)再转移到存储量大,价格便宜的介质中。
6 高可用的解决方法————拆分降低爆炸半径
- 镜像灾备