InnoDB-CheckPoint机制

430 阅读4分钟

本文正在参加「技术专题19期 漫谈数据库技术」活动

InnoDB存储引擎是基于磁盘的数据库系统,因为它基于磁盘存储的,并将记录按照页的方式管理,我们都知道cpu的运算速度高于磁盘的运算速度,如果单纯的使用磁盘存储,那么Innodb的性能必然下降很多,实际上innodb采用了其他基于磁盘的数据库的一种提高性能的策略,就是缓存池。所谓的缓存池就是创建一块内存区域,通过内存来弥补磁盘速度导致的性能下降。

CheckPoint机制

上面聊了InnoDB采用缓冲池来协调CPU和磁盘速度差导致的性能问题,所以,对页(上面说了,InnoDB按照页的方式管理数据)的操作首先是在缓存池当中进行的,而当页里面的数据发生修改或者删除,那么这个页就变成了脏页,这个时候缓冲池的页的版本要比磁盘上的页的版本要新,为了保持数据一致,InnoDB需要把缓冲池当中的页同步到磁盘上。

那么这个时候就牵扯到了一个问题,同步的时机问题,如果每次发生修改,就进行同步,这个成本有点高,并且引擎的性能会受到很大的影响,并且如果在同步的时候,磁盘发生问题,比如宕机,数据可能会发生损耗,无法恢复,为了保证这种情况下的数据安全,InnoDB实际上会用一种重做日志的策略,就是当事务提交的时候,先写入重做日志,然后基于日志写入到磁盘,这样就算中间有问题也可以通过日志恢复过来。但是这里只是解决了数据安全的问题,其实就是事务的持久性要求,实际上效率方面并没有提升,因为:

1、缓存池不可能缓存数据库所有的数据,在数据库创建之初是有可能的,但是随着业务的进行,数据越来越大,后续不可能完全放到内存当中。

2、重写日志也不可能是无限大的,毕竟日志文件存放在磁盘上,当然可以为磁盘设置弹性扩容,但是这个并不合理。

3、就算重写日志可以无限大,那么假如,一个稳定的业务已经运行了三年(嘿嘿嘿),这个时候出现问题,使用重做日志进行恢复时间和恢复成本绝对会很大。

因此就有了CheckPoint技术,CheckPoint翻译过来就是检查点,有点像设置的存储节点,就是在已经完成刷新操作的地方设置CheckPoint,那么下次执行刷新的话就不会从头开始,而是从最近的CheckPoint检查点开始。

image-20221116065210026.png

checkpoint技术实际上解决了如下问题:

1、缩短数据库恢复时间。

2、缓冲池满了的情况下,将脏页刷新到磁盘。

3、重做日志不可用的时候,刷新脏页。

如何解决这三个问题呢:

1、当磁盘发送宕机,这个时候不需要从重写日志的开头开始刷新磁盘,而是从CheckPoint位置开始,这样当然会缩短数据库恢复的时机。

2、当缓存池满了的情况下,采用LRU算法,溢出最少使用的页,检测这个页是不是脏页(就是被使用过),如果使用过,就刷新的磁盘当中,这样因为刷新的是使用率不高的页,所以降低了刷新的频率。

3、上面说的重做日志无限大的可能性是不存在的,实际上重做日志是循环使用的,所以上面的图可以重画为(使用ppt画图真的是....):

image-20221116070035949.png

那么循环使用就涉及到一个问题,哪些日志是可以被循环使用的,这个时候可以采用checkpoint强制标出需要使用的部分,将缓存页刷新到这个位置上来。

InnoDB的CheckPoint

innodb的CheckPoint分为两种:

Sharp Checkpoint

发生在数据库关闭时将所有的脏页都刷新回磁盘,这是默认的工作方式,参数innodb_fast_shutdown=1,但是注意,使用这种类型的checkpoint,数据库性能会受到影响。所以引擎内部使用下一种CheckPoint。

Fuzzy Checkpoint

InnoDB存储引擎内部使用这种模式,只刷新一部分脏页,而不是刷新所有的脏页回磁盘

结尾

好了,关于innoDB的CheckPoint理解就分享到这里,之后还会分享innoDB的其他知识点,还请各位大佬多多指点。

本文正在参加「技术专题19期 漫谈数据库技术」活动