• MySQL--InnoDB 体系架构


    InnoDB 体系架构

    后台线程

    Master Thread

      Master Thread 是一个非常核心的后台线程,主要负责将缓冲池中的数据异步刷新到磁盘,保证数据的一致性,包括脏页的刷新、合并插入缓冲、UNDO 页的回收等。

    IO Thread

      在 InnoDB 存储引擎中大量使用了 AIO(Async IO)来处理写 IO 请求,这样可以极大提高数据库的性能。而 IO Thread 的主要工作是负责这些 IO 请求的回调处理。

      

       innodb_read_io_threads 、 innodb_write_io_threads :分别控制 read thread 和 write thread 数量。

    Purge Thread

      事务被提交后,其所使用的 undolog 可能不再需要,因此需要 PurgeThread 来回收已经被使用并分配的 undo 页。

      用户可以在 MySQL 数据库的配置文件中添加如下命令来启用独立的 Purge Thread(默认是 Master Thread 来完成回收工作):

           innodb_purge_threads=n //innodb 支持多个 Purge Thread

    Page Cleaner Thread

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

    内存

    缓冲池

      在数据库中进行读取页的操作,首先将磁盘读到的页存放在缓冲池中,这个过程称为将页 FIX 在缓冲池中。下一次再读相同的页时,首先判断该页是否在缓冲池中。若在缓冲池中,称该页在缓冲池中被命中,直接读取该页。否则,读取磁盘上的页。

      对于数据库中页的修改操作,则首先修改在缓冲池中命中的页,然后再以一定的频率刷新到磁盘上。页从缓冲池刷新回磁盘的操作并不是在每次页发生更新时触发,而是通过 Checkpoint 的机制刷新回磁盘。同样,这也是为了提高数据库的整体性能。

       innodb_buffer_pool_size 设置缓冲池大小

      缓冲池中缓存的数据页类型有:索引页、数据页、undo 页、插入缓冲、自适应哈希索引、InnoDB 存储的锁信息、数据字典信息等。

      

      从 InnoDB 1.0.x 版本开始,允许有多个缓冲池实例。这样做的好处是减少数据库内部的资源竞争,增加数据库的并发处理能力。可通过下面的参数进行配置:

           innodb_buffer_pool_instances=n //该值默认为 1

      从 MySQL 5.6 版本开始,可以通过 information_schema 架构下的表 INNODB_BUFFER_POOL_STATS 来观察缓冲的状态。

    LRU List、Free List 和 Flush List

      数据库的缓冲池是通过 LRU(Latest Recent Used,最近最少使用) 算法来进行管理的。即最频繁使用的页在 LRU 列表的前端,而最少使用的页在 LRU 列表的尾端。当缓冲池不能存放新读取到的页时,将首先释放 LRU 列表中尾端的页。

      在 InnoDB 存储引擎中,缓冲池中的页默认为 16KB。InnoDB 使用的并非是朴素的 LRU 算法。

       innodb_old_blocks_pct //控制新读取的页插入到 LRU 列表尾端的位置

       innodb_old_blocks_time //控制页读取到 mid 位置后需要等待多久才会被加入到 LRU 列表的热端

      

        当页从 LRU 列表的 old 部分加入到 new 部分时,称此时发生的操作为 page made young,而因为 innodb_old_blocks_time 的设置而导致页没有从 old 部分移动到 new 部分的操作称为 page not made young。

        Free buffers 表示当前 Free 列表中也的数量

        Database pages 表示 LRU 列表中页的数量

        可能的情况是 Free buffers 与 Database pages 的数量之和不等于 Buffer pool size。因为缓冲池中的页还可能会被分配给自适应哈希索引、Lock 信息、Insert Buffer 等页,而这部分页不需要 LRU 算法进行维护,因此不存在于 LRU 列表中。

        youngs/s、non-youngs/s 表示每秒这两类操作的次数。

        Buffer pool hit rate 表示缓冲池命中率,通常该值不应该小于 95%。若发生小于 95% 这种情况,用户需要观察是否是由于全表扫描引起的 LRU 列表被污染的问题。

        Modified db pages 显示了脏页的数量。

      可以通过 INNODB_BUFFER_POOL_STATS 来观察缓冲池的运行状态。

      可以通过表 INNODB_BUFFER_PAGE_LRU 来观察每个 LRU 列表中每个页的具体信息。

    重做日志缓冲

      InnoDB 存储引擎首先将重做日志信息先放入到这个缓冲区,然后按一定频率将其刷新到重做日志文件。

      重做日志文件一般不需要设置的很大,因为一般情况下每秒会将重做日志缓冲刷新到日志文件,因此用户只需要保证每秒产生的事务量在这个缓冲大小之内即可。

           innodb_log_buffer_size //默认为 8MB

    额外的内存池

      在对一些数据结构本身的内存进行分配时,需要从额外的内存池中进行申请,当该区域的内存不够时,会从缓冲池中进行申请。

  • 相关阅读:
    js 跳转链接
    reg.test is not a function 报错
    html中button自动提交表单?
    mysql主从复制及双主复制
    nginx反向代理后端web服务器记录客户端ip地址
    mysql多实例-主从复制安装
    LVS+Keepalived高可用负载均衡集群架构实验-01
    debug调试
    常用网站总结
    项目部署
  • 原文地址:https://www.cnblogs.com/microcat/p/7404604.html
Copyright © 2020-2023  润新知