4 分钟
大规模分布式储存系统阅读笔记
《大规模分布式储存系统:原理解析与架构实战》阅读笔记
一、概述
1、分布式存储的概念
- 定义:大量普通PC通过Internet互联,对外作为一个整体提供存储服务
- 特性:
- 可扩展性
- 低成本
- 高性能
- 易用
- 挑战:
- 数据状态持久化
- 自动迁移
- 自动容错
- 并发读写的一致性
- 主要技术来源:分布式系统和数据库
- 数据分布
- 一致性
- 容错
- 负载均衡
- 事务与并发控制
- 易用性
- 压缩/解压缩
2、分布式存储分类
数据分类
- 非结构化数据:二进制数据如办公文档、图片、音频、视频
- 结构化数据:二维表(数据库存储的内容)
- 半结构化数据:(结构化文档)xml文档、JSON文档等
分布式存储系统的分类
- 分布式文件系统
- 存储非结构化数据称之为Blob(二进制大对象)
- Facebook Haystack、taobao file system、GFS、EBS
- 分布式键值系统
- 存储半结构化数据
- Amazon Dynamo、Taobao Tair
- 分布式表格系统
- 存储关系复杂的半结构化数据,不仅支持通过key查询、也支持通过value过滤
- Google bigtable
- 分布式数据库
- 存储结构化数据提供SQL支持
- MySql分片集群、Google Spanner、OceanBase、TiDB
二、单机存储系统
1、硬件基础
(1)CPU架构
- SMP(对称多处理器结构)(典型的单机PC架构)
- 运算单元独占L1Cache,共享L2Cache、L3Cache,共享前端总线(内存)
- 扩展能力有限
- NUMA(非一致存储访问)
- 由多个节点组成,每个节点为一个SMP
- 多个节点通过互联通信模块连接
(2)IO总线
以Intel为例
- 北桥接口(高速设备)
- 内存、高速SSD
- 南桥接口(低速设备)
- 磁盘、网卡
- DMI:南北桥相连 1GB/s
(3)网络拓扑
思科三层结构
- 树形结构
- 分为:核心层、汇聚层、接入层
相对来说网络设备较少
扁平化结构性能更好,设备要求高
同一数据中心网路延时约0.5ms 跨数据中心网络延迟约50ms
(4)性能参数
- L1 Cache 0.5ns
- 分支预测失败 5ns
- L2 Cache 7ns
- Mutex 加锁、解锁 100ns
- 内存访问 100ns
- 从内存顺序读1MB数据 0.25ms
- SSD访问延迟 0.1~0.2ms
- SATA磁盘寻道 10ms
- 从SATA磁盘读1M数据 20ms
- 机房网络来回 0.5ms
- 千兆网络发送1M数据 10ms
- 异地机房 30~100ms
(5)存储层次架构
数据中心结构:
- 数据中心数据中心之间通过光纤相连
- 数据中心由机房组成
- 机房与机房之间通过核心层设备相连
- 机房由机架组成
- 机架与机架之间通过汇聚层设备相连
- 机架由服务器组成
- 服务器与服务器通过接入层交换机相连
不同层次间设备访问带宽和延迟
- 单机设备内部访问瓶颈在于设备本身特性
- 跨设备内通信的带宽瓶颈在于网络
2、单机存储引擎
(1)哈希存储引擎
Bitcask为例
- 内存中存在一个Hash表,key为数据主键,value为数据存放在磁盘中的位置(哪个文件、文件偏移量)、长度、时间戳
- 磁盘中存放的是记录的顺序文件、每个记录包含crc校验值、时间戳、主键长度、值长度、主键、值
- 数据修改或删除后仅仅将磁盘中旧数据做个标记,再创建一个新的数据;定期扫描文件,进行碎片整理
- 快速恢复:对每个文件建立一个hash索引文件和内存中的结构一致用于快速启动
(2)B树存储引擎
常规数据库的存储结构(Innodb为例)
- 磁盘
- 按照页面组织数据(16k),每个页面对应B+树的一个节点
- 叶子节点存放每行完整数据
- 一个提交日志文件
- 内存
- 保存着B+树的根节点
- 一个缓存、存放着B+树的节点
- 淘汰算法:LRU、LIRS
操作
- 查:从根节点搜索B+树,先查找缓存再查找磁盘
- 增删改:记录到提交日志文件,从根节点搜索B+树,修改相关缓存,当修改数目达到一定数目(或者某页面被淘汰),再写回磁盘
(3)LSM树存储引擎
数据修改增量的保存到内存中(不修改只新增),达到指定限制后批量写入
详见p15~16
3、数据模型
- 文件类型(目录模型、树状结构)
- 关系模型(二维表、数据库模型)
- 键值模型(kv)
SQL 与 NOSQL
NoSQL:弱化数据库设计范式、弱化数据库一致性、追求高并发和海量数据 SQL存在的问题
- 事务:分布式系统中的实现性能第
- 联表:为了减少联表,常常需要一些反范式化的设计
- 性能:关系型数据库B树的实现性能较弱
NoSQL存在的问题
- 缺乏统一标准
- 实现众多,难以运维
4、事务与并发控制
(1)事务
ACID
(2)并发控制
- 数据库锁
- 写时复制
- 多版本并发控制(MVCC)Innodb为例
- 每一行两个隐藏列:被修改事务ID、被删除的事务ID
- 事务执行之前分配一个事务ID
- SELECT时,返回的行满足一下条件
- 行的修改事务ID小于等于当前事务ID
- 行的删除事务ID要么没定义,要么大于事务的版本号
- INSERT
- 新插入的行的修改事务ID设为当前事务ID
- DELETE
- 行的删除事务ID设置为当前事务ID
- UPDATE
- 将原来的行复制一份,并将修改事务ID设置为当前的事务ID