美文网首页
MySql技术内幕-InnoDB存储引擎(二)

MySql技术内幕-InnoDB存储引擎(二)

作者: Jerry_dong | 来源:发表于2017-12-21 14:44 被阅读0次

    InnoDB体系架构

    InnoDB的存储引擎体系结构如下图所示,从图中可知,InnoDB存储引擎有多个内存块,可以认为这些内存块组成了一个大的内存池,负责如下工作:
    1.维护所有进程/线程需要访问的多个内存数据结构
    2.缓存磁盘上的数据,方便快速地读取,同时在对磁盘文件的数据修改之前在这里缓存
    3.重做日志(redo log)缓冲
    。。。


    InnoDB体系架构.png

    后台线程

    InnoDB存储引擎是多线程的模型,因此后台有多个不同的后台线程,负责处理不同的任务。
    1.Master Thread
    Master Thread主要负责将缓冲池中的数据异步刷新到磁盘,保证数据的一致性,包括脏页的刷新,合并插入缓冲(INSERT BUFFER),UNDO页的回收。

    2.IO Thread
    在InnoDB存储引擎中大量使用了AIO(Async IO)来处理写IO请求,这样可以极大提高数据库的性能。IO Thread主要负责这些IO请求的回调处理。从InnoDB 1.0.X版本开始,一共有10个线程,4个read thread和4个write thread和insert buffer 和log IO thread。
    可以通过show variables like 'innodb_version'查看innodb引擎版本号。
    可以通过show variables like 'innodb_%_threads'查看线程数量。
    可以通过show engine innodb status来观察InnoDB中的IO Thread。

    3.Purge Thread
    事务被提交后,其所使用的undolog可能不在需要,因此需要Purge Thread来回收已经使用并分批的undo页。从InnoDB 1.2开始,支持多个Purge Thread,这样做可以进一步加快undo页的回收。
    可以在MySQL数据库的配置文件中添加如下命令来启用独立的Purge Thread:
    [mysqld]
    innodb_purge_threads=1

    4.Page Cleaner Thread
    Page Cleaner Thread的作用是将之前版本中的脏页的刷新操作都放入到单独的线程中完成。其目的是对于用户查询线程的阻塞,进一步提高存储引擎新能。

    内存

    !内存数据对象.png

    1.缓冲池
    InnoDB存储引擎是基于磁盘存储的。基于磁盘的数据库通常使用缓冲池技术老提供数据库的新能。缓冲池简单的来说就是一块内存区域,通过内存的速度来弥补磁盘速度较慢对数据库性能的影响。
    在数据库中进行读取页的操作时,首先将磁盘读到的页存放在缓冲池中,下一次在读心相同页时,首先判断该页是否在缓冲池中,若在,则称该页在缓冲池中被命中,直接读取该页。否则从磁盘上读取。在数据库中进行修改页操作时,首先修改缓冲池中的页,再以一定频率刷到磁盘上。页从缓冲池刷新回磁盘的操作并不是每次更新时触发,而是通过Checkpoint的机制刷新回磁盘。
    综上所述,缓冲池的大小直接影响数据库的性能。由于32位系统的限制,强烈建议数据库服务器采用64位操作系统。可以通过innodb_buffer_pool_size来设置缓冲池大小,也可以通过innodb_buffer_pool_instances来配置多个缓冲池实例。

    2.LRU List,Free List,Flush List
    LRU List--数据库缓冲池通过LRU(Last Recent Used,最近最少使用)算法进行管理,缓冲池中的页的大小默认16KB。InnoDB对传统的LRU算法进行了优化,加入了midpoint。传统的LRU算法当访问到的页不在缓冲区是直接将磁盘页数据调到缓冲区队列;而InnoDB并不是直接插入到缓冲区队列的队头,而是插入LRU列表的midpoint位置。这个算法称之为midpoint insertion stategy。默认配置在列表长度的5/8处。midpoint由参数innodb_old_blocks_pct控制。midpoint之前的列表称之为new列表,之后的列表称之为old列表。可以简单的将new列表中的页理解为最为活跃的热点数据。

    Free List--数据库刚启动时,LRU 列表为空。这时页都存在Free列表中,当需要从缓冲池中分页时,首先从Free列表中查找可用的空闲页,若有则将Free列表中的页删除,放入LRU列表中。否则根据LRU算法,淘汰LRU列表末尾页,将改内存空间分配给新的页。

    Flush List--当LRU列表中的页被修改后,称该页为脏页(dirty page),即缓冲池中的页和磁盘上的页数据产生了不一致。这时候数据库会通过checkpoint机制将脏页刷新回磁盘,而Flush 列表中的页即为脏页列表。注意脏页即存在于LRU列表中,也存在Flush列表中。

    3.重做日志缓冲
    InnoDB存储引擎先将重做日志信息放入重做日志缓冲区,然后按一定频率将其刷新到重做日志文件。该值可以通过innodb_log_buffer_size控制,默认8MB。一般情况下足以满足绝大部分的应用。

    4.额外的内存池
    InnoDB存储引擎中,对内存的管理是通过内存堆的方式进行的。在对一些数据结构本身的内存进行分配时,需要从二娃的内存池中申请,当该区域内存不够时,会从缓冲池中申请。

    Checkpoint技术

    Checkpoint技术的目的是解决如下几个问题:
    1.缩短数据库的恢复时间
    2.缓冲池不够用时,将脏页刷新到磁盘
    3.重做日志不可用时,刷新脏页

    InnoDB存储引擎中,有两种Checkpoint:
    1.Sharp Checkpoint--发生在数据库关闭时将所有的脏页都刷新会磁盘,默认的工作方式,即参数innodb_fast_shutdown=1
    2.Fuzzy Checkpoint--数据库运行时,刷新一部分脏页回磁盘,而不是刷新所有脏页回磁盘

    Fuzzy Checkpoint又有如下几种情况:
    1.Master Thread Checkpoint --差不多以每秒或每十秒的速度从缓冲池的脏页列表刷新一定比例的页回磁盘,异步。
    2.FLUSH_LRU_LIST Checkpoint --保证LRU列表中需要差不多100个空闲页可以试用,5.6版本后可以通过innodb_lru_scan_depth控制LRU列表中可用页的数量,5.6版本开始异步。
    3.Async/Sync Flush Checkpoint --重做日志文件不可用的情况,需要强制将一些页刷新回磁盘,此时脏页从脏页列表中选取,5.6版本开始异步。
    4.Dirty Page too much --脏页太多,引擎强制进行checkpoint。目的是保证缓冲池有足够可用的页,可由参赛innodb_max_dirty_pages_pct控制,默认75。

    Master Thread工作方式

    伪代码和理解详见书本,或以后单独一章节记录

    相关文章

      网友评论

          本文标题:MySql技术内幕-InnoDB存储引擎(二)

          本文链接:https://www.haomeiwen.com/subject/uecnixtx.html