这是我参与「第三届青训营 -后端场」笔记创作活动的的第19篇笔记
- RDBMS事务ACID
- 事务transaction
- 是由一组SQL语句组成的一个程序执行单元,需要满足ACID特性
- ACID
- 原子性Atomicity
- 事务是一个不可再分割的工作单元,事务中的操作要么都发生,要么都不发生
- 一致性Consistency
- 数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性
- 隔离性Isolation
- 多个事务并发访问时,事务之间是隔离的,一个事务不应该影响其他事务运行效果
- 持久性Durability
- 在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚
- 原子性Atomicity
- 事务transaction
- 历史回顾
- DBMS数据模型
- 网状模型
- 层次模型
- 通过树状结构描述实体及其之间的关系
- 关系模型
- SQL语言
- 语法风格接近自然语言
- 高度非过程化
- 面向集合的操作方式
- 语言简洁,易学易用
- DBMS数据模型
- 关键技术
- SQL引擎
- Parser
- 词法分析
- 语法分析
- 语义分析
- Optimizer
- 基于规则的优化
- 条件化简
- 表连接优化
- 总是小表先进行连接
- Scan优化
- 唯一索引
- 普通索引
- 全表扫描
- 基于代价的优化
- 一个查询有多种执行方案,基于代价的优化会选择其中代价最低的方案去执行
- 代价
- 时间
- 资源使用
- 基于规则的优化
- Executor
- 火山模型
- 每个operator调用Next操作,访问下层operator,获得下层operator返回的一行数据,经过计算之后,将这行数据返回给上层
- 优点
- 每个算子独立抽象实现,相互之间没有耦合,逻辑结构简单
- 缺点
- 每计算一条数据有多次函数调用开销,导致CPU效率不高
- 向量化
- 每个operator每次操作计算的不再是一行数据,而是一批数据,计算完成后向上层算子返回一个Batch
- 优点
- 函数调用次数降低为1/N
- CPU cache命中率更高
- 可以利用CPU的SIMD(Single Instruction Multi Data)机制
- 编译执行
- 将所有的操作封装到一个函数里,函数调用的代价也能大幅度降低
- LLVM动态编译执行技术
- 火山模型
- Parser
- 存储引擎
- InnoDB
- In-Memory
- Buffer Pool
- Change Buffer
- Adaptive Hash Index
- Log Buffer
- On-Disk
- System Tablespace
- General Tablespace
- Undo Tablespace
- Temporary Tablespace
- Redo Log
- Page
- B+ Tree
- 页面内,页目录中使用二分法快速定位到对应的槽,然后再遍历该槽对应分组中的记录即可快速找到指定记录
- 从根到叶
- 中间节点存储
- In-Memory
- InnoDB
- 事务引擎
- Atomicity与Undo Log
- Undo Log
- 逻辑日志,记录的是数据的增量变化,利用Undo Log可以进行事务回滚,从而保证事务的原子性。同时也实现了多版本并发控制(MVCC),解决读写冲突和一致性读的问题
- Undo Log
- Isolation与锁
- MVCC的意义
- 读写互不阻塞
- 降低死锁概率
- 实现一致性读
- Undo Log在MVCC的作用
- 每个事务有一个单增的事务ID
- 数据页的行记录中包含了DB_ROW_ID、DB_TRX_ID、DB_ROLL_PTR
- DB_ROLL_PTR将数据行的所有快照记录都通过链表结构串联
- MVCC的意义
- Durability与Redo Log
- 如何保证事务结束后,对数据的修改永久保存
- 方案一:事务提交前页面写盘
- 随机IO、写放大
- 方案二:WAL(Write-ahead logging)
- redo log是物理日志,记录的是页面的变化,它的作用是保证事务持久化,如果数据写入磁盘前发生故障,重启MYSQL会根据redo log重做
- 方案一:事务提交前页面写盘
- 如何保证事务结束后,对数据的修改永久保存
- Atomicity与Undo Log
- SQL引擎
- 企业实践
- 大流量-Sharding
- 问题背景
- 单节点写容易成为瓶颈
- 单机数据容量上限
- 解决方案
- 业务数据进行水平拆分
- 代理层进行分片路由
- 实施效果
- 数据库写入性能线性扩展
- 数据库容量线性扩展
- 问题背景
- 流量突增-扩容
- 问题背景
- 活动流量上涨
- 集群性能不满足要求
- 解决方案
- 扩容DB物理节点数量
- 利用影子表进行压测
- 实施效果
- 数据库集群提供更高吞吐
- 保证集群可以承担预期流量
- 问题背景
- 流量突增-代理连接池
- 问题背景
- 突增流量导致大量建联
- 大量建联导致负载变大,延时上升
- 解决方案
- 业务侧预热连接池
- 代理侧预热连接池
- 代理侧支持连接队列
- 实施效果
- 避免DB被突增流量打死
- 避免代理和DB被大量建联打死
- 问题背景
- 稳定性&可靠性
- 3AZ高可用
- 三机房部署
- 机房级别容灾
- 机房级别流量调度
- proxy
- 读写分离,分库分表
- 限流,流量调度
- 监控报警
- 实时监控集群运行状态
- 提前上报集群风险
- HA
- High Avaliability
- 实时监控DB运行状态
- 宕机快速切换
- 三机房部署
- HA管理
- 问题背景
- db所在机器异常宕机
- db节点异常宕机
- 解决办法
- ha服务监管,切换宕机节点
- 代理支持配置热加载
- 代理自动屏蔽宕机读节点
- 问题背景
- 3AZ高可用
- 大流量-Sharding