1. 概述

1.1 分布式存储概念

介绍了分布式存储涉及的特点和主要技术。诸如一致性、容错、负载均衡、可扩展这些基本都是分布式系统都包含的概念和技术点。对于存储而言,数据的压缩和解压也比较重要。

1.2 分布式存储分类

存储需求主要考虑:

  1. 非结构化数据
  2. 结构化数据
  3. 半结构化数据(HTML)

存储系统的分类主要是:

  1. 分布式文件系统:一般存储如下三种类型数据

  1. 分布式键值系统: 一致性哈希是其中常用的数据分布技术。redis等产品属于该范畴。
  2. 分布式表格系统: 针对单张表格的CRUD,约束没有数据库的表这么严格,不支持复杂连接
  3. 分布式数据库:例如alibaba的OceanBase就是了

2. 单机存储系统

2.1 硬件基础

2.1.1 CPU架构

这里作者介绍了CPU架构、IO总线等内容。CPU架构主要了解下SMP和NUMA的区别就可以了。

SMP是对称多处理器,优点是共享内存,缺点是总线竞争激烈。NUMA是后面出来的,现在一般服务器也都是这个CPU架构。主要是提出了NUMA节点的概念,每个NUMA节点是一个SMP。这样可以避免激烈的总线竞争,当然在内存共享方面性能会损失点。

2.1.2 网络拓扑

一般的网络拓扑分为三层:

  1. 接入层:接入层交换机包含48个1Gb端口以及4个10Gb上行端口
  2. 汇聚层和核心层:交换机包含128个10Gb的端口

PS: 同一个接入层的服务器往往部署在一个机架内,因此设计系统时需要考虑服务器是否在一个机架内,减少跨机架拷贝大量数据。

2.1.3 硬件性能参数

以下是常见硬件的性能参数

2.1.4 存储层次架构

存储层次设计主要考虑两个维度:

  1. 吞吐量
  2. 访问延迟

设计宗旨:能够在保证访问延迟的基础上,通过最低的成本实现尽可能高的吞吐量。

2.2 单机存储引擎

2.2.1 哈希存储引擎

这里举个例子,例如有个叫做Bitcask的基于哈希表结构的键值存储系统。其数据结构如下。哈希的索引信息可以全部在内存,具体的VALUE信息放到磁盘上。

PS:这个键值存储系统,删除数据只是通过将VALUE设定一个特定标识符来实现的。所以还要做定期合并,来去除垃圾数据。定期合并时候也会产生一个索引文件方便快速重建哈希表。

2.2.2 B树存储引擎

哈希存储支持随机读取,但是范围扫描不支持。B树支持范围扫描。这个也是数据库里面最常用的存储引擎了。例如MYSQL Innodb

2.2.3 缓冲区管理

缓冲区管理主要是个替换问题,这里主要就是两种算法:

  1. LRU
  2. LIRS(Low Inter-reference Recency Set):是LRU的改进算法,现在 oracle和MYSQL存储引擎里面都采用了这种替换算法(或者类似思想的实现)来达到一个分级LRU。我个人觉得可以称这种算法为分级LRU

LRU的问题主要是:

  1. 顺序扫描:顺序扫描,会淘汰那些即将被访问的项而导致CACHE污染
  2. 循环数据级访问:也是由于淘汰即将访问的项而导致大量未命中

LIRS核心思想就是将LRU列表分成新列表和老列表。新列表放热点数据。老列表必须驻留超过一定时间才能晋级到新列表。淘汰都是先在老列表上进行LRU。通过这种基于数据热度的分级LRU规避了cache污染。

2.2.4 LSM树存储引擎

LSM(Log Structed Merge Tree)核心思想就是将对数据的修改增量保持在内存中,达到指定的大小限制后将这些修改操作批量写入磁盘,读取时需要合并磁盘中的历史数据和内存中最近的修改操作。

优点:有效规避了磁盘随机写入问题,但随机读取可能需要访问较多的磁盘文件。

2.3 数据模型

2.3.1 文件模型

常见的OS的文件系统都采用文件模型来组织数据。

对象模型和文件模型有点类似,很多都弱化了目录树的概念。此外对象模型要求对象一次性写入到系统,只能删除整个对象,不允许修改其中某个部分。

2.3.2 关系模型

RDBMS使用的数据模型,也是最常用和最重要的数据模型。关系模型核心就是schema,关系表。

2.3.3 键值模型

很多NOSQL使用的数据模型。一般不支持多表关联操作。对二级索引、事务操作支持也比较弱。

2.4 并发控制

常见采用以下几种方式:

  1. 数据库锁
  2. 写时复制
  3. 多版本并发控制

其实还有2PC、TCC和异步确保等方式。可以参考我的文章事务模型与分布式事务总结思考

2.5 故障恢复

主要可以从以下几个方面来考虑恢复:

  1. 日志:包括操作日志、重做日志等
  2. 检查点

2.6 优化手段

  1. 组提交:意思就是腾出缓存空间,先写缓存
  2. 压缩算法:采用压缩来提升性能
  3. 列式存储:NOSQL的一个精髓,可以快速查找

3. 分布式系统

分布式系统的两个重要协议:

  1. Paxos选举协议:Paxos 协议用于多个节点之间达成一致,往往用于实现总控节点选举。关于Paxos可以参考我的另外文章从分布式数据复制一致性问题到paxos算法的理解(第一部分)从分布式数据复制一致性问题到paxos算法的理解(第二部分)
  2. 两阶段提交协议(2PC): 保证跨多个节点操作的原子性,这些操作要么全部成功,要么全部失败。

3.1 基本概念

3.1.1 异常

分布式系统的一个核心问题是自动容错,因为服务器节点、网络都是不可靠的。
分布式存储系统中的异常主要是:

  1. 服务器宕机:宕机即不可用。这时主要要考虑后续的恢复。从持久层恢复内存信息,恢复到宕机前的某个状态。
  2. 网络异常:消息丢失、乱序或者网络包数据丢失都可以导致网络异常。不同的网络分区也会导致无法通信(例如两个数据中心)。设计的时候要注意面向失败来设计。
  3. 磁盘故障:磁盘损坏可以考虑做数据冗余,磁盘数据错误可以考虑做校验和。
  4. 超时:分布式系统某个节点向另外个节点发起RPC调用,则RPC执行的结果只有三种状态,失败、成功、超时(服务端操作成功,但可能超时)。

3.1.2 一致性

强一致性和弱一致性和最终一致性。这里不废话了。

可以学习下其他角度的一致性:

  1. 单调读一致性:如果客户端A已经读取到了对象的某个值,那么后续操作将不会读取到更早的值。
  2. 单调写一致性:客户端A的操作按顺序完成,这就意味着,对于同一个客户端的操作,存储系统的多个副本需要按照与客户端相同的顺序完成。

存储系统的角度看一致性包括:

  1. 副本一致性:存储系统的多个副本之间的数据是否一致,不一致的时间窗口等
  2. 更新顺序一致性:存储系统的多个副本之间是否按照相同的顺序执行更新操作。

3.1.3 衡量指标

  1. 性能:主要是吞吐能力(TPS、QPS)和响应延迟。两者一般是矛盾的。根据需求来设计。
  2. 可用性
  3. 一致性
  4. 可扩展性

3.2 性能分析

这部分有点像面试题。。。自己看书P40吧

3.3 数据分布

  1. 哈希分布:重点是一致性哈希
  2. 顺序分布:分布式表格系统中常见,支持顺序扫描。
  3. 负载均衡:

3.4 复制

后面的比较简单。。作者写的比较宽泛,也没什么干货。懒得总结了。看下次的第二篇吧。