这是我参与「第五届青训营 」伴学笔记创作活动的第 15 天
经典案例
RDBMS 事务 ACID
事务(Transaction): 是由一组SQL语句组成的一个程序执行单元(Unit),它需要满足ACID特性
ACID
原子性(Atomicity): 事务是一个不可再分割的工作单元,事务中的操作要么都发生,要么都不发生。
致性(Consistency): 数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性。
隔离性(lsolation): 多个事务并发访问时,事务之间是隔离的,,一个事务不应该影响其它事务运行效果
持久性(Durability): 在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚.
原子性
两个操作要么同时成功,要么同时失败,不存在中间状态
一致性
每个操作都必须是合法的,账户信息应该从一个有效的状态变为另一个有效的状态。
隔离性
两个操作在对同一个账户并发进行操作时,应该是相互不影响,表现的像是串行操作。
持久性
操作更新成功之后,更新的结果应该永久性的保留下来,不会因为岩机等问题而丢失
高并发
高可靠
发展历史
前DBMS时代 一 人工管理
前DBMS时代 - 文件系统
DBMS时代
网状模型
层次模型
关系模型
DBMS数据模型
SQL语言
历史回顾
关键技术
一条SQL的一生
SQL引擎
Parser
Optimizer
Executor
存储引擎
InnoDB
Buffer Pool
Page
B+ Tree
事务引擎
Atomicity 与 UndoLog
原子性:一个事务 tansacton)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被恢复(Rolbak)到事务开始前的状态,就像这个事务从来没有执行过一样。
需要记录数据修改前的状态,一边在事务失败时进行回滚。
undo log是逻辑日志,记录的是数据的增量变化,它的作用是保证事务的原子性和事务并发控制。可以用于事务回滚,以及提供多版本机制MVCC),解决读写冲突和一致性
的问题。
lsolation 与 锁
solation(隔离性):数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。如果多个并发事务访问同一行记录,就需要锁机制来保证了。
读写是否冲突? 读写互不阻塞,MVCC机制。
lsolation 与 MVCC
脏读: 事务还没提交之前,它对数据做的修改,不应该被其他人看到。
Durability 与 Redo Log
持久化: 事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失WAL:修改井不直接写入到数据库文件中,而是写入到另外一个称为 WAL 的文件中;如果事务失败,WAL 中的记录会被忽略,撒销修改;如果事务成功,它将在随后的某个时间被写回到数据库文件中,提交修改。
优点:只记录增量变化,没有写放大
Append only,没有随机IO
企业实践
大流量-Sharding
流量突增
扩容
代理连接池
稳定性&可靠性
为什么要高可用:
恶意事故: 程序员删库跑路? 哪个程序员不想执行一把rm -rf*?
偶然事故: 如果一个机房断电? 断网?
某施工队,施工的时候挖掘机把某游戏公司的光纤挖断了,一下午的时间,保守估计损失一个亿
3AZ高可用
Binlog: binlog是mys用来记录数据库表结构变更以及表数据修改的的二进制日志,它只会记录表的变更操作,但不会记录select和show这种查询操作。
数据恢复: 误删数据之后可以通过mysglbinlog工具恢复数据
主从复制: 主库将binlog传给从库,从库接收到之后读取内容写入从库,实现主库和从库数据一致性
审计: 可以通过二进制日志中的信息进行审计,判断是否对数据库进行注入攻击