您的位置:首页 > 数据库 > MySQL

怎样解决MySQL数据库主从复制延迟的问题

2013-05-29 19:31 676 查看
mysql replication 中主从延迟是一个比较常见的问题,请看前期一篇博文:怎样解决MySQL数据库主从复制延迟的问题。根据目前有些公司使用的方案,最近测试了两个,其中之一是阿里的relay fetch ,业绩说法数据预热,当然也有其他开源类似开源工具,目前诸如mk-slave-prefetchreplication-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内存虚拟机)。请参考官方测试吧
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: