relay fetch解决mysql replication主从延迟

页面导航:首页 > 数据库 > Mysql > relay fetch解决mysql replication主从延迟

relay fetch解决mysql replication主从延迟

来源: 作者: 时间:2016-02-20 09:26 【

relay fetch解决mysql replication主从延迟 Mysql复制单线程的本质意味着从服务器效率的降低,即使从服务器有很多磁盘、cpu、和内存,也很容易落后于主服务器,因为从服务器的单线程只能有
relay fetch解决mysql replication主从延迟
 
   Mysql复制单线程的本质意味着从服务器效率的降低,即使从服务器有很多磁盘、cpu、和内存,也很容易落后于主服务器,因为从服务器的单线程只能有效的使用一个cpu和磁盘。
 
  从服务器上的锁定也是一个问题,运行在从服务器上的另外的查询也会加锁并阻塞复制线程。复制是单线程,复制线程(sql_thread)除了等待也不能做别的事情。
 
  为了解决这个问题,业界开发了一些补丁解决这类问题,一个思路是由复制单线程改进为多线程。另外一种是在从服务器上通过并行IO把数据预先提取到内存中。
 
  这个主意的想法是通过程序,让他比从服务器的sql线程稍微提前一点在中继日志中读取到查询语句,并将其作为select语句来执行,这导致服务器把一些数据从磁盘读取到内存,因此当从服务器的sql线程从中继日志中执行命令的时候,它就不需要等待从磁盘读取数据。Select并行处理从服务器必须串行处理的I/O。
 
   程序应该在sql线程前多久执行这个是要确定的问题。提前太多,提取到缓存到的数据会被清空。可以尝试几秒钟,或者中继日志中相同的字节数
 
   Io密集型从服务器利用这个方案将取得明显效果。
 
   广泛分布的单行update命令和delete命令操作,数据预热效果明显,大批量的insert命令可能不会有太大明显提高。
基本思路原理 
 
在备库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的时候需要根据安装环境修改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
 
测试效果
 
Tags:

文章评论

最 近 更 新
热 点 排 行
Js与CSS工具
代码转换工具

<