Skip to content

Share Memory for InnoDB

bluethinking edited this page Oct 18, 2012 · 2 revisions
  1. 简介
    该补丁主要用于数据库启动时,实现对数据的预热工作
    数据预热
    在日常运营中,数据库可能因为某些特殊的原因需要停机维护,这时候需要关闭数据库,而在下一次启动时,InnoDB的buf_pool会被清空,
    导致前期的SQL执行速度偏慢,数据预热就是用来解决该问题,InnoSQL通过共享内存和LRU DUMP两种方式来实现数据预热功能。
    InnoSQL通过共享内存实现数据预热原理:通过共享内存保存上次数据库关闭时的buf_pool信息,在下次启动时,把共享内存直接attch到buf_pool上,对比与原版预热,
    减少了前期大量离散读。
    InnoSQL通过LRU DUMP实现数据预热原理:通过文件保存buf_pool中所有页的space,offset等信息,space,offset信息根据一定规则进行排序,在load时通过读取该文件
    中的space,offset信息后从数据文件中读入数据。对比与原版预热,把所有离散读转化成顺序读(space,offset排序),减少读取时间。
  2. 实现
    InnoSQL通过共享内存实现数据预热
    InnoSQL对原版MySQL在申请buf_pool内存上做了些修改,通过使用shmget来实现内存的申请,然后通过shmat把共享内存映射到进程内部地址。
    由于共享内存的特性,如果数据库进行重启,上次的buf_pool信息依然保存在共享内存中,我们只需要在InnoDB内部,格式化该块内存到相应的block即可。
    共享内存预热使用注意
    1.采用共享内存预热时,数据库每次启动时的buf_pool大小应该是固定的,如果我们修改了buf_pool的大小,启动时会自动判断原先的共享内存大小与当前的buf_pool大小是否一致,
    如果不一致,则共享内存会被重建,原来的数据将被丢失,这样就起不到预热的效果
    2.如果在配置了共享内存后,重启时又关闭了该配置,为了保持数据的一致性,在关闭共享内存配置后启动时,原来的共享内存会被删除。
    3.由于服务异常crash,在重启InnoSQL时,共享内存中的数据进行预热时,会去检查当前预热的数据块的lsn是否大于最大checkpoint的lsn,对于crash后重启,共享内存只预热lsn比
    最大checkpoint lsn小的部分数据,其他数据页需要通过MySQL自身的recovery进行恢复
    4.由于操作系统在共享内存上的限制,在操作系统重启后,共享内存会被销毁,同样起不动预热作用。
    InnoSQL通过LRU DUMP实现数据预热
    在InnoDB内部增加一个dump线程用于实现LRU的DUMP和数据的load,每次dump或者load时,都需要锁buf_pool,该线程内部是个死循环,一直检测是否达到innodb_buffer_pool_dump_interval间隔,
    或者进行了innodb_buffer_pool_dump_now操作,如果上述操作发生,则对buf_pool进行dump,如果innodb_buffer_pool_load_now操作发生,则重新load被dump的space,offset对应的页到buf_pool
  3. 配置
    在InnoSQL的配置文件my.cnf中增加一项用于控制是否使用共享内存作为buf_pool的配置,如下:
    [innodb]
    innodb_use_shm_preload=1
    innodb_use_shm_preload是个read only变量,如果缺省或配置为0,则不使用共享内存作为buf_pool,该配置目前只在linux下存在。
    注:由于操作系统本身对共享内存的限制,有时候在申请大内存时,需要修改一些系统文件,需要root权限,
    涉及到的相关配置如下:
    /proc/sys/kernel/shmmax 该文件中的值表示为共享内存段的大小,单位为Bytes
    /proc/sys/kernel/shmall 该文件中的值表示共享内存的总量,单位为4KBytes
    LRU DUMP相关配置
    innodb_buffer_pool_dump
    是否开启LRU DUMP配置,只有开启了该配置,才能进行LRU DUMP操作
    innodb_buffer_pool_dump_now
    触发LRU DUMP操作,设置了该参数,系统马上进行LRU DUMP操作,保存当前buf_pool中数据的space,offset到文件
    innodb_buffer_pool_dump_interval
    设置LRU DUMP的时间间隔,每隔该间隔触发一次LRU DUMP操作,每次新DUMP都会覆盖上一次DUMP的文件
    innodb_buffer_pool_load_now
    设置buf_pool Load数据到共享内存。
    innodb_buffer_pool_load_at_startup
    配置是否在数据库启动时,Load DUMP中对应space,offset的数据到buf_pool

Clone this wiki locally