• MySQL-checkpoint技术


    几个知识点:
    缓冲池:缓存磁盘数据,通过内存速度弥补CPU速度和磁盘速度的鸿沟。
    脏页:LRU列表中被修改的页,和磁盘上的数据不一致
    刷新频率:每次有脏页就刷新,开销很大。需要一种刷新机制
    数据丢失:有脏页,未刷新到磁盘,发生宕机,可能会丢失--->引入Write Ahead Log策略(先写重做日志,再修改页)
    数据恢复:通过重做日志恢复数据,体现事务ACID中的持久性(D)
    checkpoint:将缓冲池中的脏页刷新回到磁盘。
     
    checkpoint解决的问题:
    • 缩短数据库的恢复时间
    • 缓冲池不够用,将脏页刷新回磁盘
    • 重做日志不可用(不可被重用,不可被覆盖),刷新脏页
         1.缩短数据库恢复时间重做日志中记录了的checkpoint的位置,这个点之前的页已经刷新回磁盘,只需要对checkpoint之后的重做日志进行恢复。这样就大大缩短了恢复时间。
         2.缓冲池不够用时,根据LRU算法,溢出最近最少使用的页,如果页为脏页,强制执行checkpoint,将页刷新回磁盘。
         3.重做日志不可用,是指,重做日志的这部分不可以被覆盖,为什么?因为:这部分对应的数据还未刷新到磁盘上。重做日志的设计是循环使用的。数据库恢复时,如果不需要,即可被覆盖;如果需要,必须强制执行checkpoint,将缓冲池中的页至少刷新到当前重做日志的位置。
     
     InnoDB存储引擎,通过LSN来标记版本,LSN是8字节的数字。每个页有LSN,重做日志有LSN,checkpoint有LSN。
     
    ----checkpoint的刷新原理------------------------------------
     
    checkpoint:将缓冲池中的脏页刷回到磁盘。
    考虑的问题:每次刷新多少页到磁盘?每次从哪里取脏页?什么时间触发checkpoint?
    InnoDB存储引擎内部,两种checkpoint,分别为:
    • Sharp Checkpoint
    • Fuzzy Checkpoint
    Sharp Checkpoint发生在数据库关闭时,将所有的脏页都刷新回磁盘,这是默认的工作方式,即参数:innodb_fast_shutdown=1。
    不适用于数据库运行时的刷新。
     
    在数据库运行时,InnoDB存储引擎内部采用Fuzzy Checkpoint,只刷新一部分脏页。
    几种发生Fuzzy Checkpoint的情况:
         1.MasterThread Checkpoint
         异步刷新,每秒或每10秒从缓冲池脏页列表刷新一定比例的页回磁盘。异步刷新,即此时InnoDB存储引擎可以进行其他操作,用户查询线程不会受阻。-->参考master Thread的介绍
         2.FLUSH_LRU_LIST Checkpoint
         InnoDB存储引擎需要保证LRU列表中差不多有100个空闲页可供使用。在InnoDB 1.1.x版本之前,用户查询线程会检查LRU列表是否有足够的空间操作。如果没有,根据LRU算法,溢出LRU列表尾端的页,如果这些页有脏页,需要进行checkpoint。因此叫:flush_lru_list checkpoint.
         mysql5.6之后,也就是Innodb1.2.x开始,这个检查放在了单独的进程(Page Cleaner)中进行。好处:1.减少master Thread的压力 2.减轻用户线程阻塞。-->参考page cleaner线程。
             设置参数:innodb_lru_scan_dept:控制LRU列表中可用页的数量,该值默认1024 
         3.Async/Sync Flush Checkpoint
         指重做日志不可用的情况,需要强制刷新页回磁盘,此时的页时脏页列表选取的。
        这种情况是保证重做日志的可用性,说白了就是,重做日志中可以循环覆盖的部分空间太少了,换种说法,就是极短时间内产生了大量的redo log。
         写入日志的LSN:redo_lsn
         刷新回磁盘的最新页LSN:checkpoint_lsn
         定义:
              checkpoint_age = redo_lsn - checkpoint_lsn
              async_water_mark = 75% * total_redo_file_size
              sync_water_mark = 90% * total_redo_file_size
         图解如下:
     
    关于用户阻塞的问题:
         在InnoDB1.2.x版本之前,Async Flush Checkpoint 会阻塞发现问题的用户查询线程;Sync Flush Checkpoint会阻塞所有用户查询线程。
         在InnoDB1.2.x版本开始,也就是MySQL5.6,这部分的刷新操作放在了单独的线程中:Page Cleaner Thread中,故不会阻塞用户查询线程。
         通过show engine innodb statusG 可以查看Async Flush,Sync Flush
         
         4.Dirty Page too much Checkpoint
         即脏页太多,强制checkpoint.保证缓冲池有足够可用的页。
         参数设置:innodb_max_dirty_pages_pct = 75 表示:当缓冲池中脏页的数量占75%时,强制checkpoint。1.0.x之后默认75
     
    --OK
  • 相关阅读:
    Servlet学习小结
    HTTP学习小结
    SpringMVC第二天
    使用Servlet 编写过滤器
    项目使用框架
    java-web
    SSM框架集成.下(供自己练习查阅用)
    SSM框架集成.中(供自己练习查阅用)
    SSM框架集成.上(供自己练习查阅用)
    debug
  • 原文地址:https://www.cnblogs.com/cuisi/p/6590281.html
Copyright © 2020-2023  润新知