《大规模分布式存储系统》

原理解析与架构实战

Posted by Zhang huirui on June 22, 2019

Kubernetes

大规模分布式存储系统

前言

1 分布式存储

分布式存储系统是大量普通PC服务器通过Internet互联,对外作为一个整体提供存储服务。

特性可扩展、低成本、高性能和易用。

挑战数据、状态信息的持久化,要求在自动迁移、自动容错、并发读写的过程中保证数据的一致性。

涉及技术

  • 数据分布:分布均匀,实现跨服务器读写。

  • 一致性:将多个副本复制到多台服务器,并保证副本之间的数据一致性。

  • 容错:检测服务器故障,数据和服务迁移。

  • 负载均衡:新增服务或正常运行时自动负载均衡,数据迁移时不影响已有服务。

  • 事务与并发控制:分布式事务,多版本并发控制。

  • 易用性:对外接口易用,监控易用。

  • 压缩/解压缩:设计合理的压缩/解压缩算法。

数据非结构化数据、结构化数据和半结构化数据。

一、基础

2 单机存储系统

硬件CPU、IO总线、网络拓扑、存储

存储引擎

哈希存储引擎

Bitcask

  • 数据结构:

数据(key,value,key_size、value_size、timestamp)

内存中的哈希表(key -> file id,value_file_position,value_size,timestamp)

磁盘(crc,timestamp,key_size,value_size,key,value)

  • 操作:只针对key做操作,只追加,不修改老数据。

  • 定期合并(Compaction):对同一个key的多个操作只保留最新的一个为原则。

  • 数据恢复:通过索引文件(hint file,简单来说就是把内存中的哈希索引表转存到磁盘上的文件)来提高重建哈希表的速度。

  • 典型:Riak,Beansdb

B树存储引擎

  • 数据结构:

按照页面(Page)来组织数据,每个页面对应B+树的一个节点。其中叶子节点保存每行的完整数据,非叶子节点保存索引信息。数据在节点中有序,从根通过二分查找直到找到叶子节点。所需的页面不在内存中则从磁盘中读取并缓存。修改需要先提交日志,接着修改B+树。页面修改超过一定比率则刷新到磁盘中持久化。

  • 操作:随机读写,范围扫描。

  • 缓存区管理:LRU(Least Recently Used,最近最少使用)淘汰最长时间没有读写的块、LIRS()

  • 典型:MySQL InnoDB

LSM(Log-Structured Merge Tree)树存储引擎

3 分布式存储系统

二、范型

4 分布式文件系统

数据类型非结构化数据对象,三种类型的数据:Blob(Binary Large Object,二进制大对象)、定长块和大文件。按照块组织数据,块包括多个Blob和块,大文件可分为多个块。

典型Facebook Haystack、Taobao File System(TFS)、GFS(Google File System,存储大文件)作为Google Bigtable的底层存储、EBS(Elastic Block Store,弹性块存储)作为Amazon RDS底层存储

5 分布式键值系统

数据类型半结构化数据,只提供和键相关的操作。

典型Amazon Dynamo、Tabbao Tair、Memcache

6 分布式表格系统

数据类型半结构化数据,以表格为单位组织数据。主要针对单张表操作。同一个表中多行数据也不要求包含相同类型的列。

典型Google Bigtable、Megastore、Microsoft Azure Table Storage、Amazon DynamoDB

7 分布式数据库

数据类型结构化数据,采用二维表组织数据。支持多表查询。

典型MySQL数据库分片集群(MySQL Sharding Cluster)、Amazon RDS、Microsoft SQL Azure、Google Spanner、Alibaba OceanBase。

三、实战

8 OceanBase架构初探

9 分布式存储引擎

10 数据库功能

11 质量保证、运维及实践

四、专题

12 云存储

13 大数据

《大规模分布式存储系统》

《分布式系统原理与范型》