InnoDB(二):InnoDB体系架构

1. 体系架构

2. 后台线程

3. 内存

4. 文件


1. 体系架构

    InnoDB的体系架构如下图所示:

     从InnoDB的体系架构图可以看出,InnoDB主要由后台线程内存池磁盘文件三个部分组成。后台线程的主要作用是负责刷新内存池中的数据,保证缓冲池中的内存缓存是最近的数据,此外将已修改的数据文件刷新到磁盘文件,同时保证在数据库发生异常的情况下InnoDB能恢复到正常运行状态。

2. 后台线程

    InnoDB有不同的后台线程,用于处理不同的任务,主要有以下4类线程,分别是master thread、i/o thread、purge thread和page cleaner thread。

2.1 Master Thread

    master thread是一个非常核心的后台线程,主要负责将缓冲池中的数据异步刷新到磁盘,保证数据的一致性,包括脏页的刷新,合并插入缓冲,undo页的回收等。其内部由多个循环组成:

  • 主循环(loop)
  • 后台循环(backgroup loop)
  • 刷新循环(flush loop)
  • 暂停循环(suspend loop)

(1)主循环(loop)

    Loop被称为主循环,因为大多数的操作是在这个循环中,其中有两大部分的操作,分别是每秒钟的操作和没10s的操作。

   每1s一次的操作包括:

  • 重做日志缓冲刷新到重做日志文件,即使这个事务还没有提交(总是)
  • 合并插入缓冲(可能)
  • 至多刷新100个InnoDB的缓冲池的脏页到磁盘(可能)
  • 如果当前没有用户活动,则切换到后台循环(可能)

   每10s一次的操作包括:

  • 刷新100个脏页到磁盘(可能的情况下)
  • 合并至多5个插入缓冲(总是)
  • 将重做日志缓冲刷新到重做日志文件(总是)
  • 删除无用的Undo页(总是)
  • 刷新100个或者10个脏页到磁盘(总是)

(2)后台循环(backgroup loop)

    若当前没有用户活动或者数据库关闭,就会切换到这个循环,后台循环会执行以下操作:

  • 删除无用的Undo页(总是)
  • 合并20个插入缓冲(总是)
  • 跳回到主循环(总是)
  • 不断刷新100个页直到符合条件(可能,跳到flush loop中完成)

(3)刷新循环(flush loop)

    刷新循环主要是刷新100个脏页到磁盘中,如果flush循环也没什么事儿可以做,则会切换到suspend_loop。

(4)暂停循环(suspend loop)

    suspend loop会将master thread挂起,等待事件的发生。

2.2 IO Thread

    InnoDB存储引擎中大量使用了异步IO(AIO)来处理IO请求,这样可以极大提高数据库的性能,而IO Thread的工作主要是负责这些IO请求的回调处理。在InnoDB 1.0 前的版本中,总共有四个IO Thread,分别是write、read、insert buffer和log IO thread,从InnoDB 1.x开始,read thread和write thread分别增大到了4个,在linux平台下,IO Thread的数量不能进行调整,在windows平台下,可以使用innodb_read_io_threadsinnodb_write_io_threads这两个参数进行设置。

2.3 Purge Thread

    事务被提交后,其所使用的undolog可能不再需要,因此需要PurgeThread来回收已经使用分配的undo页。在InnoDB 1.1版本以前,purge操作仅仅在存储引擎的master thread中完成,从1.1 版本开始,purge操作可以独立到单独的线程中进行,以此来减轻master thread的工作。1.1版本InnoDB只支持1个Purge Thread,从1.2版本开始,开始支持多个Purge Thread,这样做的目的是加快undo页的回收。

2.4 Page Cleaner Thread

    Page Cleaner Thread是在InnoDB1.2.x中引入的,其作用是为了将之前版本中的脏页的刷新操作都放入到单独的线程中来完成,其目的是为了减轻Master Thread的工作及对于用户查询线程的阻塞,进一步提高InnoDB存储引擎的性能。

3. 内存

    整个InnoDB内存的情况如下图所示:

   InnoDB的内存主要由缓冲池、重做日志缓冲和额外内存池三大部分组成,下面分别进行介绍。 

3.1 缓冲池

    InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。由于CPU和磁盘间的速度差异,通常使用缓冲池技术来提高数据库的整体性能。在InnoDB存储引擎中,缓冲池中页的大小默认为16KB

  • 读取操作:首先将磁盘读到的页存放在缓冲池中,下一次读到相同的页时,首先判断是否在缓冲池中,如果在缓冲池中,直接读取该页,否则读取磁盘上的页。
  • 修改操作:首先修改在缓冲池中的页,然后再以一定的频率刷新到磁盘上。页每次从缓冲池刷新到磁盘的操作并不是每次页发生更新时触发,而是通过一种称为Checkpoint的机制刷新回磁盘。

    缓冲池中缓存的数据页类型有:索引页、数据页、undo页、插入缓冲、自适应哈希索引、锁信息、数据字典信息等。由于缓冲池的大小直接影响着数据库的整体性能,对于32位的系统而言,缓冲池的大小最多设置为3G,对于64位的系统则没有限制。对于InnoDB存储引擎而言,其缓冲池的参数可以通过innodb_buffer_pool_size来设置。

    从InnoDB 1.0.x开始,允许有多个缓冲池实例,每个页根据哈希平均分配到不同缓冲池实例中,这样可以减少数据库内部资源竞争,增加数据库并发处理能力,可以通过参数innodb_buffer_pool_instances来进行配置缓冲池的实例个数。

3.2 缓冲池的管理

    缓冲池是一个很大的内存,存放着各种类型的页,而InnoDB对缓冲池的管理主要是通过缓冲链表进行管理的,这里的缓冲链表包括LRU List、Free List、Flush List。

(1)Free List

    Free List用来管理空闲的页,当数据库刚启动时,LRU列表是空的,没有任何的页,此时所有的页都存放在Free列表中。当需要从缓冲池中分页时,首先从Free 列表中查找是否有可用的空闲页&#x

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值