这是我参与「第五届青训营 」笔记创作活动的第16天
重点内容
- 经点案例
- 发展历史
- 关键技术
- 企业实践
知识点介绍
经典案例
RDBMS事务ACID
- 事务(Transaction):是由一组SQL语句组成的一个远程执行单元(Unit),它需要满足ACID特性
-
ACID
- 原子性(Atomicity):事务是一个不可在分割的工作单元,事务中的操作要么都发生,要么都不发生
- 一致性(Consistency):数据库事务不能破坏关系数据之间的完整性以及业务逻辑上的一致性
- 隔离性(Isolation):多个事务并发访问时,事物之间是隔离的,一个事务不应该影响其他食物运行效果
- 持久性(Durability):在事务完成以后,该事务所对数据库所做的更改便持久的保存在数据库之中,并不会被回滚
发展历史
前DBMS时代
人工管理
- 结绳记事
- 账本
- 打孔机
效率太低
文件系统
1956年IBM发布了第一个磁盘驱动器,从此数据存储进入磁盘时代。这个阶段数据管理直接通过文件系统实现。
DBMS时代
1960s,传统的文件系统已经不能满足人们的需要,数据库管理系统(DBMS)应运而生
DBMS:按照某种数据模型来组织、存储和管理数据的仓库
所以通常按照数据模型的特点将传统数据库系统分成网状数据库、层次数据库和关系数据库三类
DBMS数据模型
网状模型
网状数据库所基于的网状数据模型建立的数据之间的联系,能反映现实世界中信息的关联,是许多空间对象的自然表达形式。1964年,世界上第一个数据库系统一集成数据存储( lntegrated Data Storage ,IDS)诞生于通用电气公司。IDS是世界上第-个网状数据库,奠定了数据库发展的基础,在当时得到了广泛的应用。在1970s网状数据库系统十分流行,在数据库系统产品中占据主导地位。
层级模型
1968年,世界上第一个层次数据库--信息管理系统( lnformation Management System ,MS )诞生于IBM公司,这也是世界上第一个大型商用的数据库系统。层次数据模型,即使用树形结构来描述实体及其之间关系的数据模型
关系模型
1970年,IBM的研究员E.FCodd博士发表了-篇名为A RelationalModelof Data for Laroe Shared Data Banks"的论文,提出了关系模型的概念,奠定了关系模型的理论基础。1979年Oracle首次将关系型数据库商业化,后续DB2, SAP Sysbase ASE, and informix等知名数据库产品也纷纷面世
SQL语言
1974年IBM的Ray Boyce和Don Chamberlin将Codd关系数据库的12条准则的数学定义以简单的关键字语法表现出来,里程碑式地提出了SQL(Structured Query Language)语言。
- 语法风格接近自然语言
- 高度非过程化
- 面向集合的操作方式
- 语言简洁,易学易用
关键技术
一条SQL的一生
- Parser 生成语法树
- Optimizer 优化器
- Executor 执行器
- 返回
SQL引擎
Paser
解析器(Parser)一般分为词法分析( Lexical analysis )、语法分析( Syntax analysis )、语义分析( Semantic analyzer ) 等步骤
Optimizer
基于规则的优化(RBo Rule Base Optimizer)
-
条件简化
-
表连接优化
-
Scan优化
- 唯一索引
- 普通索引
-
全表扫描
Executor
火山模型
每个Operator调用Next操作,访问下层Operator,获得下层Operator返回的一行数据,经过计算之后,将这行数据返回给上层。
- 优点: 每个算子独立抽象实现,相互之间没有耦合,逻辑结构简单
- 缺点:每计算一条数据有多次函数调用开销,导致CPU效率不高
向量化
每个Operator每次操作计算的不再是一行数据,而是一批数据(Batch N行数据),计算完成后向上层算子返回一个Batch。
-
优点:
- 函数调用次数降低为1/N
- CPU cache命中率更高
- 可以利用CPU提供的SIMD(Single Instruction Multi Data)机制
-
缺点:
编译执行
将所有的操作封装到一个函数里面,函数调用的代价也能大幅度降低
存储引擎
InnoDB
In-Memory
- Buffer Pool
- Change Buffer
- Adaptive Hash Index
- Log Buffer
On-Disk:
- System Tablespace(ibdata1)
- General Tablespaces(xxx.ibd)
- Undo Tablespaces(xxx.ibu)
- Temporary Tablespaces(xxx.ibt)
- Redo Log(ib_logfileN)
事务引擎
如何实现状态回退
使用Undo Log
Undo Log是逻辑日志,记录的是数据的增量变化。利用Undo Log可以进行事务回滚,从而保证事务的原子性。同时也实现了多版本并发控制( MVCC )解决读写冲突和一致性读的问题
Isolation 与 MVCC
- 读写互不阻塞
- 降低死锁概率
- 实现一致性读
企业实践
春节红包雨挑战
- 流量大
- 流量突增
- 稳定性
大流量
问题背景
- 单节点写容易成为瓶颈
- 单机数据容量上限
解决方案
- 业务数据水平拆分
- 代理层进行分片路由
实施效果
- 数据库写入性能线性扩展
- 数据库容量线性扩展
流量突增
问题背景
- 活动流量上涨
- 集群性能不满足要求
解决方案
- 扩容DB物理节点数量
- 利用影子表进行压测
实施效果
- 数据库集群提供更高的吞吐
- 保证集群可以承担预期流量