架构篇-3

# 文章主题 #

1.理解内存数据落盘过程
2.掌握CheckPoint和Doublewrite机制
3.深度剖析事务ACID及隔离级别
4.掌握MVCC实现原理 


脏页落盘

什么是脏页?


        对数据的修改操作,首先修改内存结构中缓冲区中的页,缓冲区中的页与磁盘中的页数据不一致,所以称缓冲区中的页为脏页。

脏页如何进入到磁盘?


        脏页从缓冲区刷新到磁盘,不是每次页更新之后触发,而是通过checkPoint机制刷新磁盘

InnoDB数据落盘流程

如何提升性能?


        内存中写,操作过程记录日志,日志批量写入磁盘
        分散写变顺序写


如何持久化数据?


        通过CheckPoint机制进行脏页落盘日志先行,所有操作前先写Redo日志

数据安全性怎么保证?

        Force Log at commit

        Write Ahead Log(WAL)

        CheckPoint机制

        Double Write机制

为什么不是每次更新直接写入磁盘呢?

        1. 随着写入操作增加性如果每次页发生变化就落盘,一个页落盘必然伴随4次10操作,性能开销很大,而且能开销是指数级增长
        2. 当然,数据也不能在内存中保存太长时间,时间越久安全性风险越高

        3. InnoDB采用Write Ahead Log策略和Force Log at commit机制实现事务的持久性
                Write Ahead Log:日志先行,数据变更写入磁盘前,必须将内存中的日志写到磁盘

                Force Log  at commit:当事务提交时,所有事务产生的日志都必须刷到磁盘

怎么确保日志安全进入磁盘?

        1. 为了确保日志写入到磁盘,将redo日志写入Log Buffer后调用fsync函数,将缓冲日志文件从0SCache中写入磁盘
        2. 日志进入磁盘不仅要考虑安全性,还需兼顾性能!

Redo日志落盘

        Redo日志默认落盘策略,事务提交立即落盘。Log Buffer写入磁盘的时机由参数
innodb_flush_log_at_trx_commit 控制,此参数控制每次事务提交时InnoDB的行为。
 

三个落盘策略配置:


为0时:每秒写入,与事务无关

最多丢失1秒的事务操作

写入效率最高,安全性最低

为1时:事务提交,写入磁盘


不会丢失数据
写入效率最低,安全性最高

为2时:事务提交,写入OS Buffer

数据安全性依赖于系统,最多丢1秒事务操作

写入效率居中,安全性居中

CheckPoint机制

        什么是CheckPoint机制?

                 它是将缓冲池中的脏页数据刷到磁盘上的机制,决定脏页落盘的时机、条件和脏页的选择等

                CheckPoint的类型不止一种

        解决什么问题?

                

        CheckPoint分类

                sharp checkpoint:关闭数据库时将脏页全部刷新到磁盘中
                fuzzy checkpoint:默认方式,在运行时选择不同时机将脏页刷盘,只刷新部分脏页

                      1. Master Thread checkpoint:固定频率刷新部分脏页到磁盘,异步操作不会阻塞用户线程

                       2. FLUSH_LRU_LIST checkpoint:缓冲池淘汰非热点Page,如果该Page是脏页会执行CheckPoint

                       3. Async/Sync Flush Checkpoint:redo日志不可用时,强制脏页落盘,有了前两个这种一般不会发生

                       4. Dirty Page too much checkpoint:脏页占比太多强制进行刷盘,阈值75%

Double Write机制

        写失效问题

         数据库准备刷新脏页时,将16KB的刷入磁盘,但当写入了8KB时,就宕机了这种只写了部分没完成的情况被称为写失效Partial Page Write

        Double Write机制

        Double Write其实就是写两次,在修改记录redo日志前,先做个副本留个“备胎

        注意:Redo日志不能解决写失效问题,因为redo日志记录的是对页的修改记录而不是数据本身

Double Write 崩溃恢复过程

首先找到系统表空间中Double Write区域对应的页副本数据

然后将其复制到独立表空间

最后应用redo日志

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值