innodb 体系架构

innodb存储引擎的体系架构,可简单划分成三层:

  1. 数据文件 :磁盘上的数据文件
  2. 内存池:缓存磁盘上的数据,方便读取,同时在对磁盘文件数据修改之前在这里缓存,然后按一定规刷新到磁盘
  3. 后台线程:主要负责刷新内存池中的数据,保证内存池中都是最近数据。同时将内存中修改的数据刷新到磁盘

磁盘中数据文件如何存放,存放规则等,我们稍后讲解。本章主要说明内存池的模型和后台线程功能

首先,我们梳理一下innodb内存池。内存池包括三部分

  • 缓冲池:将磁盘数据刷新到缓冲池子(内存),来弥补磁盘速度与cpu数度差距(主要存放数据页,索引页还包括锁信息,数据字典等信息等)
  • 重做日志缓冲:首先将重做日志信息放入到缓冲区,然后按一定频率刷新到重做日志文件
  • 额外内存池

InnoDB存储引擎内存池(多线程模型)后台线程主要负责刷新内存池中的数据,保证内存缓存最近数据。

缓存池中页(大小16K)数据管理算法: LRU(最近最少使用算法)维护一个列表,innodb稍作修改,添加midpoint,新数据添加到列表5/8处,而不是列表头部,可通过配置文件修改midpoint。通过该算法将磁盘中的数据缓存到内存中,方便读取。

脏页:我们知道,当我们通过sql修改数据,并不是直接修改磁盘中数据库文件,而是修改内存中的数据。这种就造成磁盘数据和内存数据不一致,我们称这种数据所在的页为脏页。

为了使内存中的数据和磁盘数据一致,必须有一种同步机制。innodb刷新缓存池页到磁盘中,使用checkpoint机制刷新 。

checkpoint机制可简单分为两种:

  • sharp checkpoint(数据库关闭时,所有脏页刷新到磁盘)
  • fuzzy checkpoint(刷新一部分脏页数据) 

那么刷新一部分脏页数据到磁盘又是如何进行的呢,这就要说明下innodb的后台线程了,每个线程都有固定规则对脏页进行刷新。

innode后台线程:

  • master thread (脏页的刷新、innsert buffer、undo页回收等)
  • io thread AIO io请求回调
  • purge thread (innodb version<=1.1 由master thread处理,>=1.1由purge thread 处理 undo页回收)
  • page cleaner (innodb version thread >=1.2脏页的数据刷新操作,减轻master thread 的工作及对于用户查询线程的阻塞)

在此,就以master thread线程为例。在该线程中,主循环代码功能:

每1/s操作:

    • 重做日志缓存刷到磁盘(一定)
    • 合并插入缓冲。根据io次数判断,决定是否合并插入缓冲
    • 刷新100个脏页到此盘,根据数据库配置,脏页比例75%是否达标进行刷新

10/s操作:

    • io次数决定是否空闲,空闲刷新脏页(>=70%脏页刷新100个到磁盘, <70%,刷新10%脏页),
    • 删除无用的undo页

在早期由于机械硬盘,脏页比例都是在代码中硬编码的,现今ssd,Io速度快,所以innodb优化以后,可通过配置文件修改脏页比例,具体可搜innodb_io_capacity参数说明

总结fuzzy checkpoint(刷新一部分脏页数据) 主要有以下几种:

  • master thread checkpoint(1s或者10s异步刷新脏页)
  • flush_lru_list checkpoint(保证1024个页可供使用,当LRU尾端页移除,有脏页时需要刷新到磁盘) page cleaner线程处理
  • Async/Sync Flush Checkpoint重做日志不可用,刷新脏页,page cleaner线程处理 >=5.6
  • Dirty Page too much checkpoint 缓冲池中脏页数据>75%,刷新一部分脏页到磁盘

猜你喜欢

转载自www.cnblogs.com/xuzeng/p/9698251.html