文章目的:
本文中作者讲述了一种结合snapshot快照机制和Mysql内存表来同时提供高速访问和逻辑运算的实现方法。
前言:
后台服务中往往要根据不同的需要采用不同的数据获取方案。
为了保证系统的高性能,我们一般采取下面2种方案解决
1. Cache
大多数系统都是采用各种Cache 系统来进行数据缓存的,但目前的Cache系统普遍存在的问题是仅提供了简单的数据存储,但不能提供数据组织,计算等逻辑功能。
2. 内存表
多数系统后台DB使用的是Mysql,Mysql提供一种特殊的存储引擎(HEAP),这个即是Mysql的内存表方案。但Mysql内存表不提供数据的持久性能力,DB崩溃,重启后数据即消息,这对于部分业务来说是不可接受的。
下面以一个简单的例子来描述这种方法:
1. 建立内存表:
- CREATE TABLE `t_music_list` (
- `Fmusic_id` varchar(12) NOT NULL default '',
- `Fmusic_name` varchar(64) NOT NULL default '',
- `Fstatus` int(11) NOT NULL default '0',
- `Ftry_count` int(11) NOT NULL default '0',
- `Flisten_count` int(11) NOT NULL default '0',
- `Ffee` int(11) NOT NULL default '0',
- `Fdesc` varchar(255) NOT NULL default '',
- `Fsinger_name` varchar(32) NOT NULL default '',
- `Fsinger_gender` varchar(6) NOT NULL default '',
- `Fsinger_type` varchar(16) NOT NULL default '',
- `Fcopy_right` int(11) NOT NULL default '0',
- PRIMARY KEY (`Fmusic_id`),
- KEY `Fmusic_name` (`Fmusic_name`,`Flisten_count`)
- ) ENGINE=HEAP DEFAULT CHARSET=latin1;
---这是一个歌曲库的DB例子,由于需要频繁的查询,修改,以及业务需要进行较复杂的排名搜索等逻辑操作,因此采用了这种机制。
2. 生成快照脚本 --- snapshot_music_list.sh
- src_port=3306
- user='xxx'
- pass='xxx'
- FOLD='/data/t_music_list.log'
- dstfile='/data/t_music_list.dat'
- if [ -f "$dstfile" ] ;
- then
- mv $dstfile ${dstfile}_bak
- fi
- $MYSQL >> ${FOLD} -u${user} -h${src_host} -P${src_port} -p${pass} -f -N <<!
- select * from myDB.t_music_list into outfile '${dstfile}';
- !
- filezize=`du -b $dstfile| awk '{print $1}'`
- if [ $filezize -lt 2048 ] ;
- then
- echo "Dest file too slow, recover it by backedfile."
- mv ${dstfile}_bak $dstfile
- fi
---用crontab 定时执行
- */5 * * * * /usr/local/app/tools/ snapshot_music_list.sh >/dev/null 2>
3. mysql启动时进行数据恢复 启动时执行恢复脚本,恢复脚本负责将快照数据重新导入DB
数据恢复脚本 ---initdb.sql
- load data infile '/data/t_music_list.dat' into table myDB.t_music_list;
mysql启动配置 --- my.cnf
[mysqld]
init-file = /usr/local/app/tools/initdb.sql
通过上面的配置,我们即可实现既保证数据获取速度,也能保证逻辑运算简化的机制。实际使用中这种方式由于实现简单,且有效,等到了较广的应用,希望对大家有所帮助。