这是我参与「第五届青训营」伴学笔记创作活动的第 15 天
事务:是由一组SQL语句组成的一个程序组成的一个程序执行单元(Unit)它需要满足ACID特性
高并发
高可靠
前DBNS时代
人工管理:
在现代计算机发明出来以前,通过人工的方式进行数据记录和管理
结绳计事、账本、打孔机(效率低)
文件系统
记事本通过文本文件进行记录,就是从纸到文件
DBMS时代
DBMS:按照某种数据模型来组织、存储和管理数据的仓库,分为网状数据库、层状数据库和关系数据库
网状数据库所基于的网状数据模型建立的数据之间的联系,能反映现实世界中信息的关联,是许多空间对象的自然表达形式。
层次模型,即使用树形结构来描述实体及其之间关系的数据模型
关系模型
对比
SQL(Structred Query Language)结构化查询语言
语法风格接近自然语言;高度非过程化;面向集合的操作方式;语言简洁,易学易用。
关键技术:
一条SQL的一生
SQL引擎
Parser语法解析器:一般分为词法分析、语法分析、语义分析等步骤
optimizer优化器
基于规则的优化(ROB)
数据库索引:是数据库管理系统中辅助数据结构,以协助快速查询、更新数据库表中数据。目前数据库中最常用的索引是通过B+树实现的。
基于代价的优化(CBO)
一个查询由多种执行方案,CBO会选择其中代价最低的方案去真正的执行
excutor执行器
火山模型:
每个Operator调用next操作,访问下层Operator返回的一行数据,经过计算之后,将这行数据返回给上层
优点:每个算子独立抽象实现,相互之间没有耦合,逻辑结构简单
缺点:每计算一条数据有多次函数调用开销,导致CPU效率不高
向量化
每个Operator每次操作计算的不再是一行数据,而是一批数据(Batch N行数据),计算完成后向上层算子返回一个Batch。
优点:
①函数调用次数降低为1/N ;
②CPU cache命中率更高 ;
③可以利用CPU提供的SIMD(Single Instruction Multi Data)机制。
编译执行:
把所有的代码集合到一个大的SQL里面,没有函数的调用
存储引擎
InnoDB
Buffer Pool
数据库中基本都是使用LRU算法来管理内存空间
Page
B+ Tree
页面内:页目录中使用二分法快速定位到对应的槽,然后再遍历该槽对应分组中的记录即可快速找到指定的记录。
从根到叶:中间节点存储
事务引擎
原子性和Undo Log
Isolation(隔离性)与锁
MVCC的意义:
读写互不阻塞;降低死锁概率;实现一致性读。
一致性
事务结束之后,对数据的修改永久的保存
方案一:事务提交前页面写盘
问题:随机IO(随机访问磁盘),写放大(整个页面都写进去)
方案二: WAL(Write-ahead logging)
redo log是物理日志,记录的是页面的变化,它的作用是保证事务持久化。如果数据写入磁盘前发生故障,重启MySQL后会根据redo log重做。
企业实践
红包雨挑战:
大流量-Sharding
问题背景:
单节点写容易成为瓶颈 单机数量容量上限
解决方案:
业务数据进行水平拆分 代理层进行分片路由
实施效果:
数据库写入性能线性拓展 数据库容量线性拓展
流量突增-扩容
活动背景:
活动流量上涨 集群性能不满足要求
解决方案:
扩容DB物理节点数量 利用影子表进行压测
实施效果:
数据库集群提供更高的吞吐 保证集群可以承担预期流量
代理连接池
问题背景:
突增流量导致大量建联
大量建联导致负载变大,延时上升
解决方案:
业务侧预热连接池
代理侧预热连接池
代理侧支持连接队列
实施效果:
避免 DB 被突增流量打死
避免代理和 DB 被大量建联打死
稳定性&可靠性-3AZ高可用
三个城市建立独立的机房,不同机房之间通过日志同步,代理也会把请
求分配到三个机房之间。
问题背景:
db所在机器异常宕机 db节点异常宕机
解决方案:
ha服务监管、切换宕机节点
代理支持配置热加载
代理自动屏蔽宕机读节点