这是我参与「第五届青训营 」伴学笔记创作活动的第16天
前言
本文是在之前存储结构和数据库的基础上进行拓展的,进而让我们深刻理解RDBMS。本文主要进行概念讲解,具体实战希望大家可以自行查找资料进行学习。
1.案例
首先以红包雨为例,复习一下事务的ACID。
- 原子性:不可分割的单元,要么同时发生,要么同时失败,不存在中间状态
- 一致性:数据完整性和业务逻辑一致性,具有合法性
- 隔离性:互不影响
- 持久性:结果永久保持 ps:
- 高并发:高吞吐、应对突发情况
- 高可靠:不挂机
2.发展历史
1.前DBMS时代
人工管理
结绳记事、账本、打孔机
文件系统
磁盘驱动器
2.DBMS时代
- 数据库管理系统(DBMS):按照某种数据模型来组织、存储和管理数据的仓库
- 分类:网状数据库、层次数据库、关系数据库
网状数据库:多对多
层次数据库:一对多
关系数据库:二维表
-
对比
-
SQL语言
- 语法风格接近自然语言
- 高度非过程化
- 面向集合的操作方式
- 语言简洁,易学
-
历史发展
3.关键技术
1.整体流程
一条SQL的流经如下:
- 主要包含:SQL引擎、事务引擎、存储引擎
- 查询解析: 将文本解析成结构化数据,即抽象语法树(AST)
- 查询优化: 根据AST优化产生最优执行计划(Plan Tree)
- 查询执行:根据查询计划,完成数据读取、处理、写入等操作
- 事务引擎:处理事务一致性、并发、读写隔离等
- 存储引擎:内存中的数据缓存区、数据文件、日志文件
3.SQL引擎
- 解析器(Parser),词法分析、语法分析、语义分析
- 词法分析:将一条SQL语句对应的字符串分割为一个个token,这些token可以简单分类
- 语法分析:把词法分析的结果转为语法树
- 语义分析:对语法树中的信息进行合法性校验
整体步骤如下:
-
优化器(Optimizer):选择合适的组合
- 基于规则的优化(RBO):条件化简、表连接优化、Scan优化等
- 基于代价的优化(CBO):时间、cpu、内存等
-
执行器(Executor)
- 火山模型
- 流程如下:
- 优点:每个算子独立抽象实现,相互间没有耦合,逻辑结构简单
- 缺点:每计算一条数据有多次函数调用开销,进而导致CPU效率不高
- 流程如下:
- 向量化
- 特点:Row转为Batch
- 优点:函数调用次数降低为1/N;CPU cache命中率更高;可以利用CPU提供的SIMD机制。
- 编译执行
- 流程如下:
- 特点:将所有操作封装到一个函数里,函数调用代价降低
- 技术:LLVM动态编译执行技术(动态生成执行代码)
- 火山模型
4.存储引擎
-
InnoDB,整体结构如下:
-
Buffer Pool
- 结构如下:
- 每个block对应一个page,一个chunk下面有8192个block,可以避免内存碎片化。
- 分成多个instance,可以有效避免并发冲突。
- Buffer Pool连接了Table Scan和Storage Engine
- 当需要换存其他页面时,需要淘汰已有界面,采用LRU算法
- 结构如下:
-
Page
- 组成:Page Header、User Records、Free Space、Page Directory、FIL Trailer
- 组成:Page Header、User Records、Free Space、Page Directory、FIL Trailer
-
B+ Tree
- 整体结构如下:
- 特点:页面内,页目录中使用二分法快速定位到对应的槽,然后再遍历该槽对应分组中的记录即可快速找到指定的记录。从根到叶,中间节点存储
- 整体结构如下:
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将数据行的所有快照记录都通过链表的结构串联了起来。
4.企业实践
案例:春节红包雨
- 问题:流量大、流量徒增、稳定性
1.大流量
Sharding
- 背景:单节点写容易成为瓶颈;单机数据容量上限
- 方案:业务数据水平拆分;代理层分片路由
- 效果:数据库写入性能线性扩展;数据库容量线性扩展
2.流量突增
扩容
- 背景:活动流量上涨;集群性能不满足要求
- 方案:扩容DB物理节点数量;利用影子表进行压测
- 效果:高吞吐;能承担预期流量 代理连接池
- 背景:突增流量导致大量建联;大量建联导致负载变大,延时上升
- 方案:业务侧预热连接池;代理侧预热连接池;代理侧支持连接队列
- 效果:避免 DB 被突增流量打死;避免代理和 DB 被大量建联打死
3.稳定性
- 3AZ(三机房部署):机房级别容灾和流量调度
- Proxy:读写分离、分库分表、限流、流量调度
- 监控报警:实时监控集群运行状态、提前上报风险
- HA:实时监控DB运行状态、宕机快速切换
小结
本文主要介绍了RDBMS的基本概念,发展历史和相应的关键技术,之后并用春节红包雨的案例主要分析了大流量、流量突增、稳定性问题的解决办法。本文主要是一些理论,具体实践大家可以在网上找相应的案例读代码来理解消化,之后再进行自己项目的创作!
参考
- 字节跳动深入理解RDBMS教程