深入理解RDBMS|青训营笔记

73 阅读5分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第5篇笔记。 主要介绍RDBMS的相关知识,包括DBMS的基本组件,SQL的执行流程等。

一 重要概念

事务(transaction):由一组SQL语句组成的一个程序执行单元,它需要满足ACID特性

ACID特性
原子性:事务是一个不可再分割的工作单元,事务中的操作要么都发生,要么都不发生
一致性:数据库事务不能破坏数据的完整性以及业务逻辑上的一致性
隔离型:多个事务兵法访问时,事务之间是隔离的,一个事务不应该影响其它事务运行效果
持久性:在事务完成之后,该事务对数据库所作的更改便持久的保存在数据库之中,不会被回滚

二 发展历史

人工管理:结绳记事、钱庄账本
文件系统:计算机文件系统
DBMS:网状模型、层次模型、关系模型

三 关键技术

3.1 一个SQL的一生

设备 ->(Request)-> Router ->(SQL)-> RDBMS
RDBMS ->(Result)-> Router ->(Response)-> 设备

RDBMS
(SQL)-> Parser ->(AST)-> Optimizer ->(Plan)-> Executor ->(Result)
Executor Read Data File
Executor Write Data File/Log File

3.2 SQL引擎

  • 查询解析:
将文本解析成抽象语法树(AST),词法分析/语法分析/语义分析
  • 查询优化:
根据AST优化产生最优执行计划,根据不同的目标进行优化,代价最小原则
基于规则的优化
条件化简:a = 5 and b > a  ->  a = 5 and b > 5
表连接优化:如总是小表先进行连接
Scan优化:按唯一索引、普通索引、全表扫描顺序进行
  • 查询执行
根据查询计划,完成数据读取、处理、写入等操作
火山模型:每个Operator调用Next操作,访问下层Operator,
        获得下层Operator返回的一行数据,经过计算之后,将这行数据返回给上层。
优点:每个算子独立抽象实现,相互之间没有耦合,逻辑结构简单
缺点:每计算一条数据有多次函数调用开销,导致CPU效率不高
向量化:每个Operator每次操作计算的不再是一行数据,而是一批数据(Batch N行数据),
       计算完成后向上层算子返回一个Batch。
优点:函数调用次数降为1/N
     CPU cache命中率更高
     可以利用CPU提供的SIMD(Single Instruction Multi Data)机制
编译执行:将所有的操作封装到一个函数里面,函数调用的代价也能大幅度降低
LLVM动态编译执行技术

3.4 存储引擎

内存中的数据缓存区、数据文件、日志文件
InnoDB Buffer Pool
instance(1G) -> chunk(128M) -> block(16k) <-> page(16k)
page id % instance num = instance id
内存淘汰:LRU等算法,划分冷热数据,优先淘汰冷数据
page:B+Tree组织
页目录中使用二分法快速定位到对应的槽,然后再遍历该槽对应分组中的记录即可快速找到指定的记录。

3.3 事务引擎

处理事务一致性、并发、读写隔离等
  • 原子性
Undo Log:逻辑日志,记录数据增量变化,
          利用Undo Log可以进行事务回滚,从而保证事务的原子性。
          同时也实现了MVCC,解决读写冲突和一致性读问题。
  • 隔离型
锁机制
读读:共享锁
写写:排他锁
读写:共享锁/排他锁?MVCC
  • 持久性
Redo Log是物理日志,记录的是页面的变化,它的作用是保证事务持久化。
如果数据写入磁盘前发生故障,重启Mysql后会根据Redo Log重做。
优点:只记录增量变化,没有写放大
     Append only,没有随机IO

四 企业实践

4.1 春节抖音红包雨

流量大/突增流量/稳定性

流量-Sharding
问题背景:单节点写容易成为瓶颈,单机数据容量上限
解决方案:业务数据进行水平拆分,代理层进行分片路由
实施效果:数据库写入性能线性扩展,数据库容量线性扩展

流量突增-扩容
问题背景:活动流量上涨,集群性能不满足要求
解决方案:扩容DB物理节点数量,利用影子表进行压测
实施效果:数据库集群提供更高的吞吐,保证集群可以承担预期流量

流量突增-代理连接池
问题背景:突增流量导致大量建联,大量建联导致负载变大,延时上升
解决方案:业务侧预热连接池,代理侧预热连接池,代理侧支持连接队列
实施效果:避免DB被突增流量打死,避免代理和DB被大量建联打死

稳定性&可靠性-HA管理
问题背景:db所在机器异常宕机,db节点异常宕机
解决方案:HA服务监管、切换宕机节点。代理支持配置热加载。代理自动屏蔽宕机读节点。
实施效果:读节点宕机秒级恢复,写节点宕机30s内恢复服务


稳定性&可靠性-3AZ部署,HA管理
三机房部署:机房级别容灾。机房级别流量调度
proxy:读写分离,分库分表。限流,流量调度    
监控报警:实时监控集群运行状态。提前上报集群风险
High Avaliability:实时监控DB运行状态。宕机快速切换