青训Day16:RDBMS|青训营笔记

53 阅读3分钟

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

01. 经典案例

1.2 RDBMS事务ACID

ACID:

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

02. 发展历史

文件系统

2.3.2 DBMS数据模型

  • 网状模型
  • 层次模型
  • 关系模型

2.5 SQL语言

03. 关键技术

3.1 一条SQL的一生

image.png

3.2 SQL引擎 - Parser

解析器(Parser)一般分为词法分析(Lexical analysis)、语法分析(Syntax analysis)、语义分析(Semantic analyzer)等步骤。

3.2 SQL引擎 - Optimizer

为什么需要一个优化器(Optimizer)?
基于规则的优化(RBO Rule Base Optimizer)

  • Scan优化 唯一索引
    普通索引
    全表扫描
    数据库索引:是数据库管理系统中的辅助数据结构,以协助快速查询,更新数据库表中数据。目前数据库中最常用的索引是通过B+树实现的。
    基于代价的优化(CBO Cost Base Optimizer)

SQL引擎 - Executor

3.4 事务引擎 Atomicity与Undo Log

Undo Log是逻辑日志,记录的是数据的增量变化。利用Undo Log可以进行事务回滚,从而保证事务的原子性,同时也实现了多版本并发控制(MVCC),解决读写冲突和一致性读的问题。

Isolation与锁

Isolation与MVCC

Durability与Redo Log

如何保证事务结束后,对数据的修改永久地保存?
方案一:事务提交前页面写盘
方案二:WAL(Write-ahead logging)
redo log是物理日志,记录地是页面的变化,它的作用是保证事务持久化。如果写入磁盘前发生故障,重启MySQL后会根据redo log重做。

04. 企业实践

挑战:流量大、流量突增、稳定性

4.2 大流量 - Sharding

问题背景

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

解决方案

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

实施效果

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

4.3 流量突增 - 扩容

问题背景

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

解决方案

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

实施效果

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

4.4 流量突增 - 代理连接池

问题背景

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

解决方案

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

实施效果

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

4.5 稳定性&可靠性 - 3AZ高可用

  • 三机房部署
  • proxy
  • 监控报警

HA管理

问题背景

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

解决方案

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