RDBMS | 青训营笔记

49 阅读4分钟

这是我参与【第五届青训营】伴学笔记创作活动的第14天

经典案例

image-20220604105054656.png

RDBMS 事务 ACID

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

  • 原子性Atomicity:事务是一个不可再分割的工作单元,事务中的操作要么都发生,要么都不发生
  • 一致性Consisitency:数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性
  • 隔离型Isolation:可以隔离多个并发事务,避免影响
  • 持久性Durability:事务一旦提交成功,数据保持持久性,不会被回滚

红包雨与ACID

case1:抖音的账户上扣了一个亿之后,假设服务器挂了,还没来得及给用户账户加上一个亿

两个事务要么同时成功。要么同时失败,不存在中间状态

case2:假设抖音的账户上只有0.5个亿,但是减扣一个亿的操作成功了

每个操作都必须是合法的,账户信息应该从一个有效的状态变成另一个有效的状态

case3:用户从抖音抢了一个亿红包,又从头条抢了一个亿,两个转账同时进行,假设他们都以为是从零开始更新用户的账户余额,用户最后得到了一个亿

两个操作在对同一个账户并发进行操作时,应该是相互不影响,表现得像是串行操作

case4:抖音得账户上扣了一个亿,然后用户账户上加了一个亿,但还没有写到磁盘上,这个时候服务器挂了

操作更新成功之后,更新得结果应该永久性的保留下来,不会因为宕机等问题而丢失

高并发

全国14亿人,假设有10亿人同时开抢红包,每秒处理一个请求,那需要31年才能完成

高可靠

除夕晚上大家都在抖音上抢红包,这个时候服务挂掉了,程序员花费了一个多小时,终于修好了服务,“抖音宕机”上热搜

关键技术

一条SQL的一生

  • SQL 引擎
  • 存储引擎
  • 事务引擎

image-20220604151734949.png

SQL引擎

Parser

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

image-20220604152454241.png

Optimizer

为什么需要优化器(Optimizer)?

image-20220604152636972.png

基于规则的优化(RBO Rule Base Optimizer)

  • 条件化简

image-20220604152939540.png

  • 表连接优化
 SELECT * FROM A,B,C WHERE A.a1 = B.b1 and A.a1 = C.b1;
  • Scan优化

    • 唯一索引
    • 普通索引
    • 全表扫描

数据库索引:是数据库管理系统中辅助数据结构,以协助快速查询、更新数据库表中数据。目前数据库中最常用的索引是通过B+树实现的

基于代价的优化(CBO Cost Base Optimizer)

一个查询有多种执行方案,CBO会选择其中代价最低的方案去真正的执行

企业实践

红包雨挑战

共计发放红包20亿元——活动钱包: 400w/s

总计发放卡券24亿张——发红包: 300w/s

拜年红包补贴12.9亿——发奖券: 400w/s

  • 流量大
  • 流量突增
  • 稳定性

大流量 — Sharding

问题背景

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

解决方案

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

实施效果

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

流量突增 — 扩容

问题背景

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

解决方案

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

实施效果

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

流量突增 — 代理连接池

问题背景

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

解决方案

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

实施效果

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

稳定性&可靠性

3AZ高可用

image-20220604184240765.png

HA管理

image-20220604184330213.png