RDBMS(关系型数据库) | 青训营笔记

269 阅读5分钟

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

RDBMS(关系型数据库)

RDBMS事务

事务:由一组SQL语句组成的一个程序执行单元,需要满足ACID特性

原子性:操作同时发生,不多展开

一致性:每一个操作都是合法的,比如转账,我只有1元,但是我要给你转2元,此时我的账户金额变成负一元,这是不合法的,这种操作违背了一致性(注重业务逻辑的合法性)

隔离性:两个操作在对一个账户并发操作时,应该是互不影响的,表现得像似串行操作

持久性:操作的结果应该永久保留,不会因为其他原因丢失

前DBMS时代

人工管理(低效)->文件系统(存储介质变化)

DBMS时代

DBMS:按照某种数据类型来组织、存储和管理数据的仓库

网状数据库(第一个数据库): 父子节点的关系,且父子节点之间是多对多的关系 m:n

层次模型:树形结构,父子节点的关系,每个父节点可以有多个子结点,但是每个子结点只有一个父节点,1:n

关系模型:用关系描述数据特征,所有的数据都是一张二维表,每一行代表一个数据实体,每一列代表一条属性

模型对比

网状模型层次模型关系模型
优势直接描述现实世界、存取效率高结构简单、查询效率高、提供较好的完整性支持实体与实体间的联系都是通过二位表结构表示、可以方便的表示M:N关系、数据访问路径对用户透明
劣势结构复杂、用户使用困难、访问程序设计复杂无法表示M:N关系、插入删除限制多、遍历子节点必须经过父节点、访问程序设计复杂关系查询效率不够高、关系必须规范化

SQL语言(结构化查询语言)

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

c++等是详细的过程化语言,与SQL不同

一条SQL的一生

客户端发送一条请求(request)到router(路由),路由转发SQL语句到数据库,数据库解析SQL语句,如下

Parser(语法解析器)把SQL语言转化为AST(语法树)传到Optimizer(优化器),Optimizer根据AST生成Plan(树状结构)交给Executor(执行器),Executor根据Plan读写Data File(数据文件)并写入 Log File(日志文件),然后将执行结果返回到数据库然后一级一级返回到客户端

其中,Parser、Optimizer、Executor都是SQL引擎、Data File、 Log File都是存储引擎

SQL引擎

Parser一般分为词法分析(提取词组)、语法分析(形成结构)、语义分析(合法性校验)三个步骤

Optimizer,基于规则优化(RBO)、基于代价的优化(CBO),代价一般指时间,此外还有IO、CRU、NET、MEM等

Executor,火山模型使用最多(投影->过滤->扫描->存储引擎)优点(每个算子独立抽象实现,相互之间没有耦合,逻辑结构简单),缺点(每计算一次有多次函数调用开销,导致CPU效率不高)、向量化模型、编译执行模型

存储引擎

内存态:数据缓存(访问内存的代价和访问磁盘的代价差距很大,所以要做数据缓存)

数据态:存储数据元信息、存储用户真实数据、存储事务日志

事务引擎

Undo Log:逻辑日志,记录数据的增量变化,可以进行事务的回滚,保证事务的一致性原则,同时支持MVCC(多版本并发控制),解决读写冲突和一致性读的问题

存在读写并发问题时,因为读使用共享锁,写使用排他锁,并发执行会导致阻塞

MVCC:读写互不阻塞、降低死锁概率、实现一致性读,其原理是,让写用于新版本数据,读用于老版本数据

大流量问题

Sharding

解决方案:业务数据进行水平拆分、代理层进行分片路由

实施效果:数据库写入性能线性增长、数据库容量线性扩展

流量突增问题

扩容

解决方案:扩容DB物理节点数量、利用影子表进行压测

实施效果:数据库集群提供更高的吞吐、保证集群可以承担预期流量

代理连接池

解决方案:业务侧预热连接池、代理测预热连接池、代理测支持连接池

实施效果:避免DB被突增流量打死、避免代理和DB被大量建联打死

稳定性和可靠性

3AZ高可用

三机房部署:机房级别容灾、机房级别流量调度

proxy:读写分离、分库分表、限流、流量调度

监控报警:实时监控集群运行状态、提前上报集群风险

HA管理

解决宕机问题

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