mysql replication 中主从延迟是一个比较常见的问题,请看前期一篇博文: 怎样解决MySQL数据库主从复制延迟的问题 。根据目前有些公司使用的方案,最近测试了两个,其中之一是阿里的relay fetch ,业绩说法数据预热,当然也有其他开源类似开源工具,目前诸如 mk-slave-prefetch 及 replication-prefetch 等,感兴趣可以去看看。整理的文档主要是参考了官方的 《relay fetch 读取本地binlog 进行备库预热》 ,有些图片直接引用,还有文字,与官方不同的是安装过程中出现的问题及解决方式,归纳如下:
基本思路原理
在 备库sql线程执行更新之前,预先将相应的数据加载到内存中,并不能提高sql_thread线程执行sql的能力,也不能加快io_thread线程读取日志的速度。
限制
1 目前仅支持主库binlog ROW模式
2 表需要有主键或唯一索引
3 忽略test和mysql数据库
4 如果数据库中存在类似tbname_1、tbname_2这样命名的多个表,但其表模式却不相同时,请加上-t选项,例如:tb_1 tb_2 tb_3这样命名的三个表,默认情况下,被认为是同样模式的表,这个特点是淘宝为了适应他们自己的数据库环境
5 默认最多支持10000个用户表,如果学员支持更多表,可以通过修改宏MAX_TABLE_NUM来进行调整。
获取源码
安装svn客户端从下列地址获取源码:
svn checkout http://relay-fetch.googlecode.com/svn/trunk/
安装编译:
make
make的时候需要根据mysql安装环境修改Makefile配置文件,relay-fetch依赖mysql的lib库文件等,gcc编译的时候指定,如下红色标示部分:
#locate your libmysqlclient_r.so
all:
gcc -g -O0 -Wall-o relayfetch relayfetch.c -I/usr/local/mysql/include/ -L/usr/local/mysql/lib -lmysqlclient_r -lpthread
clean:
rm -rf *.orelayfetch
32位系统安装有warning ,如下
relayfetch.c: In function ‘daemon_rf’:
relayfetch.c:2599: warning: format ‘%lu’ expects type ‘longunsigned int’, but argument 4 has type ‘long long unsigned int’
relayfetch.c:2599: warning: format ‘%lu’ expects type ‘longunsigned int’, but argument 4 has type ‘long long unsigned int’
不是错误error,没有太多影响
安装完毕,在安装目录下运行./relayfetch –h,了解一下relayfetch 常用参数,如果报如下错误error while loading shared libraries: libmysqlclient.so.16/18:cannot open shared object file
应该是mysql的lib库文件引用问题,建立如下类似软链接
32位
ln -s /usr/local/mysql/lib/libmysqlclient.so.18 /usr/lib/
64位
ln -s /usr/local/mysql/lib/libmysqlclient.so.18 /usr/lib64/
使用
运行: ./relayfetch -h来获取选项
主要选项包括:
-d debug
-D 后台运行
-p 密码
-u 用户名,请以root用户运行
-P mysqld端口号
-s 整数,单位为M,当read线程超过sql线程position这么多字节数时,会等待sql线程,默认为1M
-S mysql sock文件路径
-n worker线程数目。默认为5
-a 当seconds_behind_master大于这个值时,会唤醒relayfetch,默认为1s
-t 当使用该选项时,表明不使用分表规则(例如,表name_1 和表name_2会被视为同一类表)
我们可以通过端口号来运行
./relayfetch-uroot -t -P3306
或者通过sock来运行
./relayfetch-S /u01/mysql/run/mysql.sock -uroot
测试效果
这个效果不明显,可能机器原因(本人测试256内存虚拟机)。请参考官方测试吧