forked from bluethinking/InnoSQL
-
Notifications
You must be signed in to change notification settings - Fork 54
Share Memory for InnoDB
bluethinking edited this page Oct 18, 2012
·
2 revisions
- 简介
该补丁主要用于数据库启动时,实现对数据的预热工作
数据预热
在日常运营中,数据库可能因为某些特殊的原因需要停机维护,这时候需要关闭数据库,而在下一次启动时,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排序),减少读取时间。 - 实现
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 - 配置
在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