一种MySQL主从同步加速方案-改进

上一篇提出了一种改进主从延迟的方案。虽然能够实现主从无延迟同步,但在维护上比较复杂,还存在网络消耗问题,这里是一个改进的版本。

一、之前方案简述及问题分析

方案如图。其中用多个MySQL充当transfer的角色。每个transfer负责同步master的一部分表。在我的试验中有8个transfer,也就是有8个MySQL实例。

问题: 1、维护复杂。在从库及其上需要增加8个实例,增加维护成本,而且不利于加表操作。

2、增加网络开销。虽然在transfer的IO线程作了过滤,减少每个transfer的写盘量和SQL线程的空转,但master还是向每个tranfer发了所有的数据。网络传输的日志量是原来的n倍。

二、改进方案

基于上述的两个问题考虑,考虑将transfer的多进程改成多线程

如图:

1、用一个MySQL充当transfer。 transfer设置为master的主库。IO线程负责接收Master传过来的日志。但不是写到一套relay-log文件,而是SLAVE_THREAD套。每个表的日志固定分配到一套relay-log中

2、相应地起SLAVE_THEAD个SQL线程,负责读取对应目录下的relaylog,发送给slave。

三、方案对比

从上面描述中看出,master发给transfer的日志总量只有一份。只需要增加SLAVE_THREAD 和 slave信息的配置,维护简单。

两个方案的相同点是使用文件队列(多套relaylog),保证在transfer出现异常时不丢数据。

效果对比,原生版本

上个方案

改进方案

说明:改进方案也能保证无延迟同步,性能都是原生版本的7倍左右。由于线程更少,从库的QPS表现很稳定,cpu idle也比上个方案高。

四、两个为什么

1、为什么不直接把transfer当slave用?

实际上是可以的,作了简单实验发现与“改进方案”的从库QPS相同,好处是减少了一层transfer的逻辑。一般来说这种工具也不会放到和slave一个机器,直接用作slave就少了一个机器。

不过直接改slave的代码还是推广比较麻烦。而且不得不承认的是,这个方案存在一个硬伤:跨表更新的语句顺序无法严格保证。――这也是这两个方案的应用前提:没有跨表语句或者对这种出现的情况要求不严格。

2、为什么不直接写一个工具而用MySQL?

其实作transfer的MySQL并不像想象的那么庞大。不需要的引擎可以都不编译进去,其实只需要框架层的逻辑和一个myisam引擎即可。而它提供了很多管理命令,比如一个现成的客户端,能够方便的stop slave、change master,能够用show slave status看同步状态。这些作为这个工具的基本功能,自己一个个实现重复轮子太多了。

时间: 2025-01-21 01:20:34

一种MySQL主从同步加速方案-改进的相关文章

一种MySQL主从同步加速方案

一.问题起源 MySQL的主从同步一直有从库延迟的问题,背景资料网上很多,原因简单描述如下: 1. MySQL从库上有一个IO线程负责从主库取binlog到写到本地.另外有一个SQL线程负责执行这些本地日志,实现命令重放: 2. 正常网络状况下IO线程没有性能问题(这个待会会用到),问题是SQL线程只有一个,更新速度跟不上.所以经常会看到从库的CPU idle很高,但同步性能就是上不去. 二.方案雏形 单线程的SQL线程是造成这个问题的主要原因.比较直接的想法是把它改成多线程版本,这个据说官方版

MySQL主从同步加速 Transfer-- FAQ

  Q: Transfer是什么 A: 是一个解决MySQL原生主从同步延迟的方案. Transfer本身是一个在MySQL源码上打的patch,可以用于当Slave,也可以用于当第三方工具,将Master的数据同步发给Slave. 利用多线程实现主从无延迟.   Q: Transfer目前的发布形式? A: 目前的发布形式是可执行的mysqld文件. 最后更新日期 2013-12-01 Transfer.2.3 下载地址    Q: Transfer模式下,主库执行grant 语句会导致同步停

mysql主从同步

MySQL编译安装 shell> groupadd mysql shell> useradd -g mysql mysql shell> gunzip < mysql-VERSION.tar.gz | tar -xvf - shell> cd mysql-VERSION shell> ./configure --prefix=/usr/local/mysql shell> make shell> make install shell> cp suppo

怎样重配 重置mysql主从同步

重置mysql主从同步(MySQL Reset Master-Slave Replication) 在mysql主从同步的过程中,可能会因为各种原因出现主库与从库不同步的情况,网上虽然有一些解决办法,但是有时很难彻底解决,重置主从服务器也许不是最快的办法,但却是最安全有效的. 下面将自己重置主从同步的步骤总结一下,以备不时之需. master与slave均使用:centos6.0+mysql 5.1.61 ,假设有db1,db2两个数据库需要热备. 文中shell与mysql均使用root账号,

mysql 主从同步

mysql cmake install 过程我在这边就不说了,如果要看的朋友,点击我以前的博客 ,mysql version : 5.6.13 http://blog.csdn.net/wanglei_storage/article/details/48262141 下一篇是mysql 主从同步 + atlas读写分离,也就是目前比较热门的技术了 http://blog.csdn.net/wanglei_storage/article/details/48808777 好,下面进入正题.通过两台

centos 6.5设置mysql主从同步过程记录

在centos 6.5上设置了mysql主从功能,记录一下. 服务器1(主) IP:192.168.1.201 系统版本:centos 6.5 mysql版本:mysql 5.5 服务器2(从) IP:192.168.1.202 系统版本:centos 6.5 mysql版本:mysql 5.5 这里两台服务器的系统版本和mysql版本均一致,这也是官方推荐的做法.在开始设定之前,最好能确保主库和从库一致. 1.主库和从库创建同步用户 mysql> grant replication slave

Linux下MySQL主从同步监控shell脚本

说明: 操作系统:CentOS 目的:定时监控MySQL主从数据库是否同步,如果不同步,记录故障时间,并执行命令使主从恢复同步状态 1.创建脚本文件 vi /home/crontab/check_mysql_slave.sh   #编辑,添加下面代码 #!/bin/sh # check_mysql_slave status # author www.111cn.net ip=eth0  #网卡名称 mysql_binfile=/usr/local/mysql/bin/mysql mysql_us

MySQL主从同步原理介绍

  概述 Mysql的Replication(复制)是一个异步的复制过程,从一个 Mysql instance(我们称之为 Master)复制到另一个Mysql instance(我们称之 Slave).在 Master 与 Slave之间的实现整个复制过程主要由三个线程来完成,其中两个线程(Sql线程和IO线程)在 Slave 端,另外一个线程(IO线程)在Master端. 主从同步需求 要实现 MySQL 的 Replication ,首先必须打开 Master 端的BinaryLog(my

使用MySQL Proxy解决MySQL主从同步延迟

  MySQL的主从同步机制非常方便的解决了高并发读的应用需求,给Web方 面开发带来了极大的便利.但这种方式有个比较大的缺陷在于MySQL的同步机制是依赖Slave主动向Master发请求来获取数据的,而且由于服务器负 载.网络拥堵等方面的原因,Master与Slave之间的数据同步延迟是完全没有保证的.短在1秒内,长则几秒.几十秒甚至更长都有可能. 由于数据延迟问题的存在,当应用程序在Master上进行数据更新,然后又立刻需要从数据库中读取数据时,这时候如果应用程序从Slave上取数据(这也