深入理解RDBMS|青训营笔记

75 阅读5分钟

这是我参与「第五届青训营」伴学笔记创作活动的第17天。

一、经典案例

事务(Transaction):是由一组SQL语句组成的一个程序执行单元(Unit),它需要满足ACID特性。
ACID:

  • 原子性(Atomicity):事务是一个不可再分割的工作单元,事务中的操作要么都发生,要么都不发生。
  • 一致性(Consistency):数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性。
  • 隔离性(Isolation):多个事务并发访问时,事务之间是隔离的,一个事务不应该影响其它事务运行效果。
  • 持久性(Durability):在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。

二、发展历史

前DBMS时代

人工管理

在现代计算机发明出来以前,通过人工的方式进行数据记录和管理。

文件系统

1950s,现代计算机的雏形基本出现。1956年IBM发布了第一个的磁盘驱动器--Model 305 RAMAC,从此数据存储进入磁盘时代。在这个阶段,数据管理直接通过文件系统来实现。

DBMS时代

1960s,传统的文件系统已经不能满足人们的需要,数据库管理系统(DBMS)应运而生。
DBMS:按照某种数据模型来组织、存储和管理数据的仓库。
所以通常按照数据模型的特点将传统数据库系统分成网状数据库、层次数据库和关系数据库三类。

DBMS数据模型

网状模型

网状数据库所基于的网状数据模型建立的数据之间的联系,能反映现实世界中信息的关联,是许多空间对象的自然表达形式。
1964年,世界上第一个数据库系统﹣集成数据存储(Integrated Data Storage,IDS)诞生于通用电气公司。
IDS是世界上第一个网状数据库,奠定了数据库发展的基础,在当时得到了广泛的应用。在1970s网状数据库系统十分流行,在数据库系统产品中占据主导地位。

层次模型

1968年,世界上第一个层次数据库﹣信息管理系统(Information Management System,IMS)诞生于IBM公司,这也是世界上第一个大型商用的数据库系统。层次数据模型,即使用树形结构来描述实体及其之间关系的数据模型。

关系模型

1970年,IBM的研究员E.F.Codd 博士发表了一篇名为"A Relational Model of Data for large Shared Data Banes"的论文,提出了关系模型的概念,奠定了关系模型的理论基础。1979年Oracle首次将关系型数据库商业化,后续DB2,SAP Sysbase ASE,and informx等知名数据库产品也纷纷面世。

模型对比

优势
网状模型

  • 能直接描述现实世界
  • 存取效率较高

层次模型

  • 结构简单
  • 查询效率高
  • 可以提供较好的完整性支持

关系模型

  • 实体及实体间的的联系都通过二维表结构表示
  • 可以方便的表示M:N关系
  • 数据访问路径对用户透明

劣势
网状模型

  • 结构复杂
  • 用户不易使用
  • 访问程序设计复杂

层次模型

  • 无法表示M:N的关系
  • 插入、删除限制多
  • 遍历子节点必须经过父节点
  • 访问程序设计复杂

关系模型

  • 关联查询效率不够高
  • 关系必须规范化劣势

SQL语言

1974年IBM的Ray Boyce和Don Chamberlin将Codd关系数据库的12条准则的数学定义以简单的关键字语法表现出来,里程碑式地提出了SQL(Structured Query Language)语言。

  • 语法风格接近自然语言
  • 高度非过程化
  • 面向集合的操作方式
  • 语言简洁,易学易用

三、关键技术

SQL引擎

Parser

解析器(Parser)一般分为词法分析、语法分析、语义分析等步骤。

Optimizer

基于代价的优化(CBO Cost Base Optimizer)
一个查询有多种执行方案,CBO会选择其中代价最低的方案去真正的执行。

Executor

火山模型:
每个Operator调用Next操作,访问下层Operator,获得下层Operator返回的一行数据,经过计算之后,将这行数据返回给上层。
优点:每个算子独立抽象实现,相互之间没有耦合,逻辑结构简单。
缺点:每计算一条数据有多次函数调用开销,导致CPU效率不高。

向量化:
每个Operator每次操作计算的不再是一行数据,而是一批数据(Batch N行数据),计算完成后向上层算子返回一个Batch。
优点:函数调用次数降低为1/N;CPU cache命中率更高;可以利用CPU提供的SIMD( Single Instruction Multi Data)机制。

编译执行:
将所有的操作封装到一个函数里面,函数调用的代价也能大幅度降低。

四、企业实践

大流量

Sharding
问题背景:

  • 单节点写容易成为瓶颈
  • 单机数据容量上限

解决方案:

  • 业务数据进行水平拆分
  • 代理层进行分片路由

实施效果:

  • 数据库写入性能线性扩展
  • 数据库容量线性扩展

流量突增

扩容
问题背景:

  • 活动流量上涨
  • 集群性能不满足要求

解决方案:

  • 扩容 DB 物理节点数量
  • 利用影子表进行压测

实施效果:

  • 数据库集群提供更高的吞吐
  • 保证集群可以承担预期流量

代理连接池
问题背景:

  • 突增流量导致大量建联
  • 大量建联导致负载变大,延时上升

解决方案:

  • 业务侧预热连接池
  • 代理侧预热连接池
  • 代理侧支持连接队列

实施效果:

  • 避免DB被突增流量打死
  • 避免代理和DB被大量建联打死

高可用&高可靠

HA管理
问题背景:

  • db所在机器异常宕机
  • db节点异常宕机

解决方案:

  • ha服务监管、切换宕机节点
  • 代理支持配置热加载
  • 代理自动屏蔽宕机读节点