MySQL:Fuzzy Checkpoint
一、 为什么需要“模糊Fuzzy”对比 Sharp CheckpointSharp Checkpoint全量检查点顾名思义要求将 Buffer Pool 中所有的脏页一次性全部刷新到磁盘。触发时机通常只在数据库正常关闭Clean Shutdown时发生。致命缺点如果在系统运行期间执行全量刷盘由于磁盘 I/O 吞吐量的物理限制会导致系统瞬间产生极大的 I/O 阻塞用户层面的 DML 操作会全部卡死Stop The World。Fuzzy Checkpoint模糊检查点每次只刷新一部分脏页到磁盘并且是异步执行的。核心优势将密集的 I/O 操作打散到系统运行的生命周期中对用户线程的影响降到最低保证了数据库持续的高吞吐量。二、 Fuzzy Checkpoint 的四大触发场景与底层逻辑InnoDB 根据不同的系统压力状态设计了四种触发 Fuzzy Checkpoint 的策略以应对 Buffer Pool 和 Redo Log 的空间管理。1. Master Thread Checkpoint定时任务触发这是系统在正常运行且压力平稳时最基础的脏页刷盘机制。在 MySQL 5.6 之后的版本这部分工作逐渐交由独立的Page Cleaner Thread完成但核心的时间驱动逻辑一致。1秒循环后台轮询InnoDB 会判断当前系统的 I/O 压力。如果过去一秒发生的 I/O 次数低于阈值说明磁盘比较空闲系统会主动将一定数量如innodb_io_capacity配置的百分比的脏页刷入磁盘。10秒循环强制执行无论系统 I/O 压力如何每隔 10 秒InnoDB 都会强制将一批脏页最多为innodb_io_capacity的值刷新到磁盘。2. FLUSH_LRU_LIST CheckpointBuffer Pool 空间不足触发Buffer Pool 是有限的内存空间。当用户发起新的查询需要将磁盘上的数据页加载到内存时如果 Buffer Pool 中没有足够的空闲页Free Page就需要淘汰Evict部分旧页。触发逻辑InnoDB 维护了一个 LRU最近最少使用链表。后台线程会监控 LRU 链表尾部以保证系统中始终有大约 100 个以上的空闲页。刷盘动作如果 LRU 链表尾部被淘汰的数据页恰好是脏页则必须先触发 Checkpoint 将其同步到磁盘然后才能将该内存页清空变为 Free Page。3. Async/Sync Flush CheckpointRedo Log 空间不足触发 - 最危险的情况Redo Log 是一个大小固定的环形Circular日志文件组。写入时指针不断向前推进如果写入速度过快“写指针”追上了“Checkpoint 指针”就会发生日志覆盖。为了防止未落盘的数据对应的 Redo Log 被覆盖InnoDB 设定了水位线Watermark定义checkpoint_age Redo Log 写入的最新 LSN - Checkpoint LSN。Async Watermark异步水位线通常为日志总容量的 75%当checkpoint_age达到此值时触发异步刷盘。此时后台线程开始疯狂地将脏页刷入磁盘试图推进 Checkpoint LSN但此时不会阻塞用户的 DML 线程。Sync Watermark同步水位线通常为日志总容量的 90%如果异步刷盘速度跟不上脏页产生速度checkpoint_age达到此值时触发同步刷盘。此时 InnoDB 会强行阻塞所有用户的写操作DML集中所有 I/O 资源进行脏页刷盘直到 Redo Log 腾出足够空间。这是生产环境中必须极力避免的性能抖动点。4. Dirty Page too much Checkpoint脏页比例过高触发为了防止系统在崩溃时积累过多的脏页导致恢复时间Crash Recovery Time过长InnoDB 设定了脏页比例的阈值。触发逻辑由参数innodb_max_dirty_pages_pct控制默认值为 75%早期版本为 90%。刷盘动作当 Buffer Pool 中的脏页占比超过这个百分比时InnoDB 会强制触发 Checkpoint以最快速度innodb_io_capacity指定的最高速率将脏页刷盘直到比例下降到阈值以下。三、 Fuzzy Checkpoint 是如何推进 LSN 的每次 Fuzzy Checkpoint 发生时InnoDB 到底把 Checkpoint LSN 推进到了哪个值Flush List刷盘链表InnoDB 内部维护了一个 Flush List所有脏页不仅存在于 LRU 链表中同时也存在于 Flush List 中。按 LSN 排序Flush List 中的脏页是严格按照该页第一次被修改时产生的 LSNoldest_modification从小到大排序的。提取最小值每次 Checkpoint 发生时后台线程会将一批脏页刷盘。刷盘完成后系统会去读取 Flush List 队首那个脏页的 LSN。更新标记因为队首的 LSN 是当前所有未刷盘脏页中最小的 LSN。这就意味着小于这个 LSN 的所有数据修改已经全部安全地落入磁盘。InnoDB 随即将这个最小的 LSN 写入 Redo Log Header这就是新的 Checkpoint LSN。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2558887.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!