这是我参与「第五届青训营 」伴学笔记创作活动的第17天
PPT: bytedance.feishu.cn/file/boxcnC…
讲师: 杨洋
课程回顾
存储系统
块存储, 文件存储, 对象存储, key-value存储
数据库系统
关系型数据库, 非关系型数据库
分布式架构
数据分布策略, 数据复制协议, 分布式事务算法
1 经典案例
1 红包雨
UPDATE account_table SET balance = balance - 金额 WHERE name = '抖音';
UPDATE account_table SET balance = balance + 金额 WHERE name = '用户';
2 事务 ACID
事务(Transaction)
BEGIN;
UPDATE account_table SET balance = balance - 金额 WHERE name = '抖音';
UPDATE account_table SET balance = balance + 金额 WHERE name = '用户';
COMMIT;
ACID: Atomicity, Consistency, Isolation, Durability
Consistency(一致性): 从一个有效状态变为另一个有效状态, 强调合法性
3 高并发, 高可靠
高并发 Concurrency
高可靠 High Reliability/Availability
2 发展历史
1 前DBMS时代 - 人工管理
结绳记事, 账本, 打孔机
2 前DBMS时代 - 文件系统
IBM 305 RAMAC
3 DBMS时代
DBMS: 数据库管理系统
1 网状数据库
在1970s流行
基于网状数据模型
世界上第一个数据库系统: 集成数据存储, 诞生于IDS(通用电气公司)
2 层次数据库
使用树形结构描述实体及其之间关系的数据模型
与网状数据库最大不同是, 每个节点只有一个父节点. 多对多变成一对多
世界上第一个层次数据库: 信息管理系统, 诞生于IBM公司, 也是世界上第一个大型商用的数据库系统
3 关系型数据库
IBM研究员E.F.Codd博士发表了一篇名为"A Relational Model of Data for Large Shared Data Banks"的论文, 提出了关系模型的概念
⭐有空去学习下这篇论文, 好奇有多厉害
1979年Oracle首次将关系型数据库商业化
基于关系模型
4 DBMS数据模型总结
网状模型
优势:
能直接描述现实世界
存取效率较高
劣势:
结构复杂
用户不易使用
访问程序设计复杂
层次模型
优势:
结构简单
查询效率高
可以提供较好的完整性支持
劣势:
无法表示M:N的关系
插入, 删除限制很多
遍历子节点必须经过父节点
访问程序设计复杂
关系模型
优势:
实体及实体间的联系都通过二维表结构表示
可以方便的表示M:N关系
数据访问路径对用户透明
劣势:
关联查询效率不够高
关系必须规范化
5 SQL语言
1974年IBM的Ray Boyce和Don Chamberlin将Codd关系数据库的12条准则的数学定义以简单的关键字语法表现出来, 里程碑式的提出了SQL语言
SQL: Structured Query Language
特点:
语法风格接近自然语言
高度非过程化
面向集合的操作方式
语言简洁, 简单易用
3 关键技术
1 一条SQL的一生
见PPT图
2 SQL引擎
1 Parser(解析器)
词法分析(Lexical analysis)
语法分析(Syntax analysis)
语义分析(Semantic analysis)
等步骤
2 Optimizer(优化器)
基于规则的优化(RBO: Rule Base Optimizer)
条件化简
表连接优化(总是小表先进行连接)
Scan优化(唯一索引 > 普通索引 > 全表扫描)
基于代价的优化(CBO: Cost Base Optimizer)
选择代价最低的方案执行
代价: 时间, IO, CPU, NET, MEM(内存)
3 Executor(执行器)
执行模型:
1 火山模型(见PPT图)
优点: 每个算子独立抽象实现, 相互之间没有耦合, 逻辑结构简单
缺点: 每计算一条数据有多次函数调用开销, 导致CPU效率不高
2 向量化
每次Operator操作计算的不再是一行数据, 而是一批数据(Batch), 计算完成后向上层算子返回一个Batch
优点:
函数调用次数降低为1/N
CPU cache命中率更高
可以利用CPU提供的SIMD(Single Instruction Multi Data)机制
3 编译执行
LLVM动态编译执行技术⭐
将所有的操作封装到一个函数里面, 函数调用的代价大幅度降低
3 存储引擎
1 InnoDB
架构见PPT图
In-Memory
Buffer Pool
Change Buffer
Adaptive Hash Index
Log Buffer
On-Disk
System Tablespaces
General Tablespaces
Undo Tablespaces
Temporary Tablespaces
Redo Log
2 Buffer Pool
LRU(Least Recently Used): 选择最近最久未使用的页面予以淘汰
3 Page
4 B+Tree
二分法快速定位到对应的槽, 然后再遍历对应分组中的记录即可快速找到指定的记录
4 事务引擎
1 Atomicity与Undo Log
Undo Log是逻辑日志, 记录的是数据的增量变化, 利用Undo Log可以进行事务回滚, 从而保证事务的原子性, 同时也实现了多版本并发控制(MVCC), 解决读写冲突和一致性读的问题
2 Isolation与锁
3 Isolation与MVCC
MVCC的意义:
读写互不阻塞
降低死锁概率
实现一致性读
Undo Log在MVCC的作用:
每个事务有一个单增的事务ID
数据页的行记录包含了DB_ROW_ID, DB_TRX_ID, DB_ROLL_PTR
DB_ROLL_PTR将数据行的所有快照记录都通过链表的结构串联了起来
脏读: 无效数据的读出
事务还没提交之前, 它对数据做的修改不应该被其他人看到.
4 Durability与Redo Log
Redo Log是物理日志, 记录的是页面(Page 16kb)的变化, 它的作用是保证事务持久化. 如果数据写入磁盘前发生故障, 重启MySQL会根据Redo Log重做
4 企业实践
1 大流量
问题背景:
单节点写容易成为瓶颈
单机数据容量上限
解决方案:
业务数据进行水平拆分
代理层进行分片路由
2 扩容
问题背景:
活动流量上涨
集群性能不满足要求
解决方案:
扩容DB物理节点数量
利用影子表进行压测
3 代理连接池
问题背景:
突增流量导致大量建联
大量建立导致负载变大, 延时上升
解决方案:
业务侧预热连接池
代理侧预热连接池
代理侧支持连接队列
4 高可用
三机房部署
机房级别容灾
机房级别流量调度
Proxy
读写分离, 分库分表
限流, 流量调度
监控报警
实时监控集群运行状态
提前上报集群风险
HA(High Availability)
实时监控DB运行状态
宕机快速切换