首页 运维干货《MySQL运维内参》节选 | InnoDB日志管理机制(二)

《MySQL运维内参》节选 | InnoDB日志管理机制(二)

运维派隶属马哥教育旗下专业运维社区,是国内成立最早的IT运维技术社区,欢迎关注公众号:yunweipai
领取学习更多免费Linux云计算、Python、Docker、K8s教程关注公众号:马哥linux运维

本文上接 InnoDB日志管理机制(一),继续分析buffer pool:

buffer pool

一个BufferPool实例中的所有控制头信息连续存储在一起,所以控制信息存储完成之后才是真正的缓冲页面,下图表示的是一个BufferPool实例的内存分布情况。

BufferPool

对于BufferPool中的所有页面,都有一个控制头信息与它对应,从上图可以看出,每一个ctl都表示了一个属于自己的page使用情况。初始化实例时当然还需要对每一个控制头信息进行初始化,也就是每一个buf_block_t结构。初始化一个页面控制信息是通过buf_block_init函数实现的,buf_block_t结构中包含了很多信息,主要包括如下4部分。

  1. 其对应的页面地址frame。
  2. 页信息结构buf_page_t,这个结构用来描述一个页面的信息,包括所属表空间的ID号、页面号、被修改时产生的LSN(newest_modification及oldest_modification)、使用状态(现在共有9种状态)等(上面已经介绍过与buf_block_t的关系)。
  3. 用来保护这个页面的互斥量mutex。
  4. 访问页面时对这个页面上的锁lock(read/write)等。

在初始化完每一个页面之后,需要将每一个页面加入到上面提到的空闲页链表中,因为这些页面现在的状态都是未使用(BUF_BLOCK_NOT_USED)。

到现在为止,缓冲池的一个实例就算初始化完成了,在访问数据库的时候会通过这些内存页面来缓存文件数据。

相对于整个Buffer Pool而言,多个Buffer Pool实例之间的关系,需要在这里再讲述一下。上面所说的单个实例的初始化,是完全独立的,多个实例之间没有任何关系,单独申请、单独管理、单独刷盘,可以从其实现的代码中看到这一点,代码如下。

《MySQL运维内参》节选 | InnoDB日志管理机制(二)插图(2)

代码

从代码中可以看出,每一个Buffer Pool实例在整个Buffer Pool中确实是完全独立的,而在具体使用时,针对不同页面,通过一个HASH算法,来映射到一个具体的实例中,对应的代码如下。

代码

通过Buffer Pool多实例的管理机制,可以减少系统运行过程中不同页面之间一些操作的相互影响,从而很好地解决了由于页面之间的资源争抢导致的性能低下的问题,所以在实际的运维过程中,建议要分多实例的管理方式,把MySQL及InnoDB用好,让业务少一些烦恼。

本文先到这里,下次开始讲REDO LOG,那是一大块…….

文章来自微信公众号:DBAce

本文链接:http://www.yunweipai.com/15539.html

网友评论comments

发表评论

邮箱地址不会被公开。

暂无评论

Copyright © 2012-2021 YUNWEIPAI.COM - 运维派 京ICP备16064699号-6
扫二维码
扫二维码
返回顶部