深入理解RDBMS | 青训营笔记

44 阅读5分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第16天

前言

本文是在之前存储结构和数据库的基础上进行拓展的,进而让我们深刻理解RDBMS。本文主要进行概念讲解,具体实战希望大家可以自行查找资料进行学习。

1.案例

首先以红包雨为例,复习一下事务的ACID。

  • 原子性:不可分割的单元,要么同时发生,要么同时失败,不存在中间状态
  • 一致性:数据完整性和业务逻辑一致性,具有合法性
  • 隔离性:互不影响
  • 持久性:结果永久保持 ps:
  • 高并发:高吞吐、应对突发情况
  • 高可靠:不挂机

2.发展历史

1.前DBMS时代

人工管理

结绳记事、账本、打孔机

文件系统

磁盘驱动器

2.DBMS时代

  • 数据库管理系统(DBMS):按照某种数据模型来组织、存储和管理数据的仓库
  • 分类:网状数据库、层次数据库、关系数据库

网状数据库:多对多 image.png 层次数据库:一对多 image.png 关系数据库:二维表 image.png

  • 对比 image.png

  • SQL语言

    • 语法风格接近自然语言
    • 高度非过程化
    • 面向集合的操作方式
    • 语言简洁,易学
  • 历史发展 image.png

3.关键技术

1.整体流程

一条SQL的流经如下: image.png

  • 主要包含:SQL引擎、事务引擎、存储引擎
  • 查询解析: 将文本解析成结构化数据,即抽象语法树(AST)
  • 查询优化: 根据AST优化产生最优执行计划(Plan Tree)
  • 查询执行:根据查询计划,完成数据读取、处理、写入等操作
  • 事务引擎:处理事务一致性、并发、读写隔离
  • 存储引擎:内存中的数据缓存区、数据文件、日志文件

3.SQL引擎

  • 解析器(Parser),词法分析语法分析语义分析
    • 词法分析:将一条SQL语句对应的字符串分割为一个个token,这些token可以简单分类
    • 语法分析:把词法分析的结果转为语法树
    • 语义分析:对语法树中的信息进行合法性校验

整体步骤如下: image.png

  • 优化器(Optimizer):选择合适的组合

    • 基于规则的优化(RBO):条件化简、表连接优化、Scan优化等
    • 基于代价的优化(CBO):时间、cpu、内存等
  • 执行器(Executor)

    • 火山模型
      • 流程如下:image.png
      • 优点:每个算子独立抽象实现,相互间没有耦合,逻辑结构简单
      • 缺点:每计算一条数据有多次函数调用开销,进而导致CPU效率不高
    • 向量化
      • 特点:Row转为Batch
      • 优点:函数调用次数降低为1/N;CPU cache命中率更高;可以利用CPU提供的SIMD机制
    • 编译执行
      • 流程如下:
      • image.png
      • 特点:将所有操作封装到一个函数里,函数调用代价降低
      • 技术:LLVM动态编译执行技术(动态生成执行代码)

4.存储引擎

  • InnoDB,整体结构如下: image.png

  • Buffer Pool

    • 结构如下:image.png
    • 每个block对应一个page,一个chunk下面有8192个block,可以避免内存碎片化。
    • 分成多个instance,可以有效避免并发冲突。
    • Buffer Pool连接了Table Scan和Storage Engine
    • 当需要换存其他页面时,需要淘汰已有界面,采用LRU算法
  • Page

    • 组成:Page Header、User Records、Free Space、Page Directory、FIL Trailer image.png
  • B+ Tree

    • 整体结构如下:image.png
    • 特点:页面内,页目录中使用二分法快速定位到对应的槽,然后再遍历该槽对应分组中的记录即可快速找到指定的记录。从根到叶,中间节点存储

5.事务引擎

  • 逻辑日志(Undo Log),对应原子性,记录数据的增量变化。可以事务回滚,并实现多版本并发控制(MVCC),解决读写冲突和一致性读问题
  • 锁,对应隔离性,解决并行事务访问同一行记录的问题
  • Redo Log,对应持久性,物理日志,记录页面变化。数据修改永久保存的方法为事务提交前页面写盘和WAL

PS:

  • MVCC
    • 意义:读写互不阻塞;降低死锁概率;实现一致性读。
    • Undo Log在MVCC的作用:每个事务有一个单增的事务ID;数据页的行记录中包含了DB_ROW_ID,DB_TRX_ID, DB_ROLL_PTR;DB_ROLL_PTR将数据行的所有快照记录都通过链表的结构串联了起来。 image.png

4.企业实践

案例:春节红包雨

  • 问题:流量大、流量徒增、稳定性

1.大流量

Sharding

  • 背景:单节点写容易成为瓶颈;单机数据容量上限
  • 方案:业务数据水平拆分;代理层分片路由
  • 效果:数据库写入性能线性扩展;数据库容量线性扩展

2.流量突增

扩容

  • 背景:活动流量上涨;集群性能不满足要求
  • 方案:扩容DB物理节点数量;利用影子表进行压测
  • 效果:高吞吐;能承担预期流量 代理连接池
  • 背景:突增流量导致大量建联;大量建联导致负载变大,延时上升
  • 方案:业务侧预热连接池;代理侧预热连接池;代理侧支持连接队列
  • 效果:避免 DB 被突增流量打死;避免代理和 DB 被大量建联打死 image.png

3.稳定性

  • 3AZ(三机房部署):机房级别容灾流量调度 image.png
  • Proxy:读写分离、分库分表、限流、流量调度
  • 监控报警:实时监控集群运行状态、提前上报风险
  • HA:实时监控DB运行状态、宕机快速切换

小结

本文主要介绍了RDBMS的基本概念,发展历史和相应的关键技术,之后并用春节红包雨的案例主要分析了大流量、流量突增、稳定性问题的解决办法。本文主要是一些理论,具体实践大家可以在网上找相应的案例读代码来理解消化,之后再进行自己项目的创作!

参考

  • 字节跳动深入理解RDBMS教程