「读书笔记」《大规模分布式存储系统:原理解析与架构实战》:二

简介: 「读书笔记」《大规模分布式存储系统:原理解析与架构实战》:二

2 单机存储系统

ACID:

  1. 原子性 Atomicity
  2. 一致性 Consistency
  3. 隔离性 Isolation
  4. 持久性 Durability

存储引擎:

  1. 哈希存储引擎
  2. B 树存储引擎
  3. LSM 树(Log Structure Mereg Tree)存储引擎

2.1 硬件基础

CPU:对称多处理结构(SMP)。SMP 扩展能力有限。

为了提高可扩展性,现在的主流服务器架构一般为 NUMA(Non-Uniform Memory Access,非一致性存储访问)架构。它具有多个 NUMA 节点,每个 NUMA 节点是一个 SMP 结构,一般由多个 CPU(如 4 个)组成,并且具有独立的本地内存、io 槽口等。

NUMA 节点可以直接快速访问本地内存,也可以通过 NUMA 互联互通模块访问其他 NUMA 节点的内存,访问本地内存的速度要远远高于访问远程的速度。

2.1.2 IO 总线

Interl x48 主板为例,典型的南北桥架构。北桥芯片通过前端总线(Front Side Bus,FSB)与 CPU 相连,内存模块以及 PIC-E 设备(如高端 SSD 设备 Fusion-IO)挂接在北桥上。北桥与南桥之间通过 DMI 连接。

2.1.3 网络拓扑

三层拓扑。

接入层(Edge),汇聚层(Aggregation)、核心层(Core)。

问题:可能有很多接入层的交换机接到汇聚层,很多汇聚层交换机接到核心层。同一个接入层下的服务器之间的带宽比如为 1Gb,那么不同接入层交换机下的服务器之间的带宽小于 1Gb。由于同一个接入层的服务器往往部署在一个机架内,因此,设计系统的时候需要考虑服务器是否在一个机架内,减少跨机架拷贝大量数据。如:Hadoop HDFS 默认 3 副本,其中两副本放在同一个机架。

Google 在 2008 年将网络改造为扁平化拓扑结构,即三层 CLOS 网络,同一个集群内最多支持 20480 台服务器,且任何两台都有 如 1Gb 带宽。CLOS 网络需要额外投入更多的交换机。好处是:设计系统时不需要考虑底层网络拓扑,从而很方便地将整个集群做成一个资源池。

🤔 如何计算光纤延时?

如:北京杭州直线距离 1300 公里,光在光线中走折线,假设折线距离为直线距离的 1.5 倍,那么光传输一次网络来回延时的理论值为 1300*1.5*2/300 000 = 13ms, 实际测试值大约为 40ms。

2.1.4 性能参数

类别 消耗的时间
访问 L1 Cache 0.5 ns
分支预测失败 5 ns
访问 L2 Cache 7 ns
Mutex 加锁、解锁 100 ns
内存访问 100 ns
千兆网络发送 1 MB 数据 10 ms
从内存顺序读取 1 MB 数据 0.25 ms
机房内网络来回 0.5 ms
异地机房之间网络来回 30-100 ms
SATA 磁盘寻道 10 ms
从 SATA 磁盘顺序读取 1 MB 数据 20 ms
固态盘 SSD 访问延迟 0.1-0.2 ms

存储系统的性能瓶颈主要在于磁盘 随机读写

SSD 特点:随机读取延迟小。

类别 IOPS 每 GB 价格(元) 随机读取 随机写入
内存 千万级 150 友好 友好
SSD 盘 35000 20 友好 写入放大问题
SAS 磁盘 180 3 磁盘寻道 磁盘寻道
SATA 磁盘 90 0.5 磁盘寻道 磁盘寻道

存储系统性能主要:吞吐量以及访问延时,在保证访问延时的基础上,通过最低的成本实现尽可能高的吞吐量。磁盘适合大块顺序访问,ssd 适合随机访问较多或对延时较敏感的关键系统。二者常常结合,热数据存储在 ssd 上,冷数据存储在磁盘中。

2.2 单机存储引擎

  • 哈希:不支持顺序扫描
  • B 树:适合关系型数据库
  • LSM 树:通过批量转储技术规避磁盘随机写入问题。

2.3 数据模型

2.3.1 文件模型

POSIX(Portable Operating System Interface),要求读写并发时保证操作的原子性,即读操作要么读取到所有结果,要么什么都读不到;另外,要求读操作能够读到之前所有写操作的结果。适合单机文件系统。分布式文件系统不会严格遵守该标准。

NFS 允许客户端缓存文件数据,多个客户端并发修改同一文件时可能出现不一致的情况。

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

2.3.2 关系模型

每个关系是一个表格,由多个元祖(行)组成,每个元祖又包含多个属性(列)。

关系名、属性名、以及属性类型称作该关系的模式(Schema)。如:Movie 关系的模式为Movie(title, year, length), title year length 为属性,类型分别为字符串 整数 整数

1
2
3
4
5
6
SELECT  <属性表 >
FROM  < 关系表 >
WHERE < 条件 >
GROUP BY  < 属性表 >
HAVING  < 条件 >
ORDER BY  < 属性表>
SQL

SQL 特性:

  1. 允许在 WHRER FROM HAVING 字句中使用子查询,子查询又是一个完整的select-from-where 语句
  2. 索引(用于减少 SQL 执行时扫描的数据量,提高读取性能)
  3. 事务(保证多个操作并发执行时的 ACID 特性)

2.3.3 键值模型

键值模型:

  • Put
  • Get
  • Delete

表格模型:

Google Bigtable、HBase,除了支持简单的基于主键的操作,还支持 范围扫描 ,另外,也支持 基于列的操作。主要操作如下:

  • Insert
  • Delete
  • Update
  • Get
  • Scan:扫描一段范围的数据,根据主键确定扫描的范围,支持扫描部分列,支持按列过滤、排序、分组等。

不支持多表关联操作,一般不支持二级索引,事务操作支持比较弱,没有统一标准。另外,表格模型支持 无模式(schema-less——特性,不需要预先定义每行包括哪些列以及每个列的类型,多行之间允许包含不同列。

2.3.4 SQL 与 NoSQL

非关系型数据库(NoSQL,Not Only SQL),良好的可扩展性,弱化一致性要求,一定程度上解决了海量数据和高并发的问题。

关系型数据库在海量数据场景存在问题:

  1. 事务。在分布式系统中,如果多个操作属于不同的服务器,保证它们的原子性需要用到两阶段提交协议,该协议性能很低,且不能容忍服务器故障,很难应用在海量数据场景。
  2. 联表。在海量数据场景,为了避免数据库多表关联操作,往往会使用数据冗余等违反数据库范式的手段。但是收益高于成本。
  3. 性能。

NoSQL 的问题:

  1. 缺少统一标准
  2. 使用及运维复杂。

2.4 事务并发控制

为了性能考虑,会定义多个隔离级别,事务的并发控制往往通过锁机制来实现,锁可以有不同粒度,可以锁住行,可以锁住数据块甚至整个表。

互联网业务,读比写多,为提高性能,可以采用 写时复制 (Copy-On-Write, COW) 或 多版本并发控制(Multi-Version Concurrency Control, MVCC) 来避免写事务阻塞读事务.

2.4.1 事务

  • 原子性
  • 一致性
  • 隔离性
  • 持久性

原子性

事务对数据的修改, 要么全执行, 要么全不执行. 如: A 转账一笔钱 x 给到 B, 结果必须是 A 扣了 x, B 加了 x.

一致性

数据的正确性、完整性、一致性。如:数据类型必须正确,数据值必须在规定范围内。

隔离性

保证每一个事务在它的修改全部完成之前,对其他事务是不可见的。还是上边的例子,转账过程中,查询操作不能看到 A 账户已经扣款 x,B 账户却还没扣款 x 的状态。

持久性

事务完成后,对数据库的影响是永久的。

处于性能考虑,允许使用者选择牺牲隔离属性换取并发度。

4 种隔离级别:

  1. Read Uncommitted (RU): 读取未提交的数据, 最低隔离级别.
  2. Read Committed (RC): 读取已提交的数据
  3. Repeatable Read (RR): 可重复读取.
  4. Serializable(S): 可序列化. 最高隔离级别

隔离级别的降低可能导致脏数据和事务执行异常, 如:

  1. Lost Update (LU): 丢失更新
  2. Dirty Reads (DR): 脏读. 一个事务读取了另一个事务更新却没有提交的数据.
  3. Non-Repeatable Reads (NRR): 对同一数据的多次读取得到不同的结果.
  4. Second Lost Updates problem (SLU): 第二类丢失更新. 两个并发事务同时读取和修改同一数据, 则后面的修改可能使得前面的修改失效.
  5. Phantom Reads (PR): 事务执行过程中, 由于前面的查询和后面的查询的期间有另外一个事务插入数据, 后面的查询结果出现了前面查询结果中未出现的数据.
LU DR NRR SLU PR
RU N Y Y Y Y
RC N N Y Y Y
RR N N N N Y
S N N N N N

2.4.2 并发控制

数据库锁

读锁和写锁. 允许对同一行元素加多个读锁, 但只允许一个写锁. 这里的元素可以是一行, 一个数据块, 甚至一个表.

解决死锁的思路:

  1. 事务设置超时时间, 超时自动回滚.
  2. 死锁检测.

写时复制

读操作不加锁.

多版本并发控制

对每行数据维护多个版本.

InnoDB 对每一行维护两个隐含的列.

2.5 故障恢复

操作日志 (提交日志 Commit Log) 技术来实现故障恢复.

操作日志分为: 回滚日志 (UNDO Log), 重做日志(REDO Log) 以及 UNDO/REDO 日志.

记录事务修改前的状态, 则为回滚日志; 记录事务修改后的状态, 则为重做日志.

2.5.1 操作日志

通过操作日志顺序记录每个数据库操作并将在内存中执行这些操作, 内存中的数据定期刷新到磁盘, 实现将随机写请求转化为顺序写请求.

示例:

事务 T 对表格中的 X 执行加 10 操作, 初始 X = 5, 更新后 X = 15, 那么

UNDO 日志记为 <T, X, 5>, REDO 日志记为 <T, X, 15>

UNDO/REDO 日志记为 <T, X, 5, 15>

2.5.2 重做日志

2.5.3 优化手段

  1. 成组提交(Group Commit)
  2. 检查点(checkpoint): 定期将内存中的数据 Dump 到磁盘,

2.6 数据压缩

有损和无损压缩.

无损: LZ 系列压缩算法. 如: GZip

压缩算法核心: 找重复数据. 列式存储大大提高了数据的压缩比.

2.6.1 压缩算法

  1. Huffman 编码
  2. LZ 系列压缩算法: 就基于字典的压缩算法
  3. BMDiff 与 Zippy (相比于传统 LZ, 优势在于处理速度非常快)

2.6.2 列式存储

OLAP: 一个查询要访问几百万甚至几十亿数据行, 且查询往往只关心少数几个列. 如: 查询今年销量最高的前 20 个商品. 只关注 3 列: 时间, 商品和销量.

列组(column group): 多个经常一起访问的数据列的各个值存放在一起.

由于同一列数据重复度很高, 因此, 列式数据库压缩时有很大优势.

可以针对列式存储做专门索引优化.


相关文章
|
6月前
|
SQL 前端开发 关系型数据库
如何开发一套研发项目管理系统?(附架构图+流程图+代码参考)
研发项目管理系统助力企业实现需求、缺陷与变更的全流程管理,支持看板可视化、数据化决策与成本优化。系统以MVP模式快速上线,核心功能包括需求看板、缺陷闭环、自动日报及关键指标分析,助力中小企业提升交付效率与协作质量。
|
5月前
|
数据采集 机器学习/深度学习 运维
量化合约系统开发架构入门
量化合约系统核心在于数据、策略、风控与执行四大模块的协同,构建从数据到决策再到执行的闭环工作流。强调可追溯、可复现与可观测性,避免常见误区如重回测轻验证、忽视数据质量或滞后风控。初学者应以MVP为起点,结合回测框架与实时风控实践,逐步迭代。详见相关入门与实战资料。
|
6月前
|
JSON 文字识别 BI
如何开发车辆管理系统中的加油管理板块(附架构图+流程图+代码参考)
本文针对中小企业在车辆加油管理中常见的单据混乱、油卡管理困难、对账困难等问题,提出了一套完整的系统化解决方案。内容涵盖车辆管理系统(VMS)的核心功能、加油管理模块的设计要点、数据库模型、系统架构、关键业务流程、API设计与实现示例、前端展示参考(React + Antd)、开发技巧与工程化建议等。通过构建加油管理系统,企业可实现燃油费用的透明化、自动化对账、异常检测与数据分析,从而降低运营成本、提升管理效率。适合希望通过技术手段优化车辆管理的企业技术人员与管理者参考。
|
6月前
|
消息中间件 缓存 JavaScript
如何开发ERP(离散制造-MTO)系统中的生产管理板块(附架构图+流程图+代码参考)
本文详解离散制造MTO模式下的ERP生产管理模块,涵盖核心问题、系统架构、关键流程、开发技巧及数据库设计,助力企业打通计划与执行“最后一公里”,提升交付率、降低库存与浪费。
|
5月前
|
前端开发 JavaScript BI
如何开发车辆管理系统中的车务管理板块(附架构图+流程图+代码参考)
本文介绍了中小企业如何通过车务管理模块提升车辆管理效率。许多企业在管理车辆时仍依赖人工流程,导致违章处理延误、年检过期、维修费用虚高等问题频发。将这些流程数字化,可显著降低合规风险、提升维修追溯性、优化调度与资产利用率。文章详细介绍了车务管理模块的功能清单、数据模型、系统架构、API与前端设计、开发技巧与落地建议,以及实现效果与验收标准。同时提供了数据库建表SQL、后端Node.js/TypeScript代码示例与前端React表单设计参考,帮助企业快速搭建并上线系统,实现合规与成本控制的双重优化。
|
6月前
|
数据采集 运维 数据可视化
AR 运维系统与 MES、EMA、IoT 系统的融合架构与实践
AR运维系统融合IoT、EMA、MES数据,构建“感知-分析-决策-执行”闭环。通过AR终端实现设备数据可视化,实时呈现温度、工单等信息,提升运维效率与生产可靠性。(238字)
|
6月前
|
人工智能 监控 测试技术
告别只会写提示词:构建生产级LLM系统的完整架构图​
本文系统梳理了从提示词到生产级LLM产品的八大核心能力:提示词工程、上下文工程、微调、RAG、智能体开发、部署、优化与可观测性,助你构建可落地、可迭代的AI产品体系。
890 52
|
5月前
|
机器学习/深度学习 人工智能 缓存
面向边缘通用智能的多大语言模型系统:架构、信任与编排——论文阅读
本文提出面向边缘通用智能的多大语言模型(Multi-LLM)系统,通过协同架构、信任机制与动态编排,突破传统边缘AI的局限。融合合作、竞争与集成三种范式,结合模型压缩、分布式推理与上下文优化技术,实现高效、可靠、低延迟的边缘智能,推动复杂场景下的泛化与自主决策能力。
511 3
面向边缘通用智能的多大语言模型系统:架构、信任与编排——论文阅读
|
5月前
|
Cloud Native Serverless API
微服务架构实战指南:从单体应用到云原生的蜕变之路
🌟蒋星熠Jaxonic,代码为舟的星际旅人。深耕微服务架构,擅以DDD拆分服务、构建高可用通信与治理体系。分享从单体到云原生的实战经验,探索技术演进的无限可能。
微服务架构实战指南:从单体应用到云原生的蜕变之路
|
5月前
|
人工智能 自然语言处理 安全
AI助教系统:基于大模型与智能体架构的新一代教育技术引擎
AI助教系统融合大语言模型、教育知识图谱、多模态交互与智能体架构,实现精准学情诊断、个性化辅导与主动教学。支持图文语音输入,本地化部署保障隐私,重构“教、学、评、辅”全链路,推动因材施教落地,助力教育数字化转型。(238字)
1014 23

推荐镜像

更多
  • DNS