这是我参与「第三届青训营 -后端场」笔记创作活动的的第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运行状态。宕机快速切换