这是我参与「第三届青训营 -后端场」笔记创作活动的第5篇笔记
对象存储-海量小文件存储之道
存储体系
- 单机存储
- 分布式存储
- 单机/分布式数据库
数据库系统
- 关系型数据库:基于关系和关系代数构建的,一般支持事务和SQL访问,使用体验友好的存储产品
- 非关系型数据库:结构灵活,访问方式灵活,针对不同场景有不同的针对性产品
存储系统
- 块存储:存储软件栈里的底层系统,接口过于朴素
- 文件存储:日常使用最广泛的存储系统,接口十分友好,实现五花八门
- 对象存储:公有云上的王牌产品,immutable语义加持
- key-value存储:形式最灵活,存在大量的开源/黑盒产品
什么是对象存储?
对象存储,又叫基于对象的存储,用来描述处理和解决离散单元的方法。这些离散的单元就是“对象”。
对象存储和文件存储区别
文件系统就是树型,对象系统是key-value类型
除了文件,程序运行中的所有非结构化数据都可以扁平化的存储在对象存储服务中,我们不需要像文件系统中那样记住每个文件所在的文件夹,物理地址等信息,只要通过被分配的唯一标识访问即可。
"对象存储"以扁平化的方式构建对象,这种特性在海量数据存储时就比较有优势,它不存在文件系统中的目录深度问题,所以访问不管多久以前的数据,都能达到一个比较好的效率。
对象存储特点
- 扁平的逻辑命名空间, Bucket/Key的数据组织形式
- GET/PUT/HEAD/DELETE等Restful HTTP接口
- 可扩展性更强,支持无限容量
- 成本更低
对象存储的基本接口
- Restful风格简介:简单介绍Restful风格的形式和优点
- GET:获取对象内容
- PUT:下载对象内容
- DELETE:删除对象内容
- HEAD:获取对象元信息
- MultiPartUpload接口:针对大对象弱网环境上传的优化
经典的业务场景:
- 海量容量场景: 业务持续产生大量数据,数据规模>>PB级别,存储容量和成本压力极大
- 海量QPS场景: 业务场景有高QPS读写请求,量级>>100K/s,并且时延要求极高,对底层存储IOPS压力极大
- 高可用性场景:业务对于SLA要求非常高,要求避免全局性不可用事件发生,但对于一致性要求比较低
Partition 分治提升可扩展性
思路:
- 将数据通过一定的Partition方法,散步到分布式系统中的不同的机器节点来计算/存储
Partition一般做法:
- Hash Partition:通过hash函数来做Partition的选取
- Range Partition: 通过range方式切分逻辑地址空间
带来的好处:
- 可扩展性好
- 爆炸半径低
Replication 多副本提升持久度
思路:
- 将数据拷贝多份来存储
Replication一般做法:
- 多副本:将数据拷贝成多个镜像的副本存储
- EC:使用Erasure Coding方法来构建冗余副本
带来的好处:
- 持久度高
- 吞吐能力也有提升
单元化最小化爆炸半径
思路:
- 将系统切分成多个垂直独立的单元,单元之间互相无影响
单元化一般做法:
- 去除系统单点依赖:系统中没有强依赖的单点
- 构建流量调度能力:流量可在单元之间灵活调度
带来的好处:
- 可用性高
- 运维更友好
镜像灾备应对极端情况
思路:
- 构建镜像的主备集群应对极端情况
单元化一般做法:
- 同构灾备:使用同构系统来做数据的镜像备份
- 异构灾备:使用异构系统来做数据的镜像备份
带来的好处:
- 极高的可用性
- 极高的可靠性
开源节流提升性价比
思路:
-
开源:
- 冷热分离,使用更低成本存储介质
-
节流:
- 通过更高比例EC降低单位存储逻辑冗余
- 提升垃圾回收效率,提高磁盘空间利用率
带来的好处:
- 更高的性价比