`
丁林.tb
  • 浏览: 789699 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

一种MySQL主从同步加速方案

阅读更多

一、问题起源

MySQL的主从同步一直有从库延迟的问题,背景资料网上很多,原因简单描述如下:

    1、 MySQL从库上有一个IO线程负责从主库取binlog到写到本地。另外有一个SQL线程负责执行这些本地日志,实现命令重放;

   2、 正常网络状况下IO线程没有性能问题(这个待会会用到),问题是SQL线程只有一个,更新速度跟不上。所以经常会看到从库的CPU idle很高,但同步性能就是上不去。

原始性能 

 

二、方案雏形

单线程的SQL线程是造成这个问题的主要原因。比较直接的想法是把它改成多线程版本,这个据说官方版本开发中,其实我们也有一个这样的patch,但是直接写大片代码在线上提供服务的slave机器上这种事儿,都会因为担心稳定性而很难推动(写patch的和运维的同学,你们懂的)。

所以打算用一个“第三方”工具中转,来实现多线程同步。基本结构如下:

 

       说明:

1、这些transefermaster上各自同步一部分的数据,分别独立更新slave。多进程还是多线程均可。

2、Transfermaster之间异步更新日志,transferslve之间同步更新数据

3、从这可以看出这个方案的缺点之一:更新能够被独立分开。比较直观的想法是,按照表分。

 

三、关于transfer

作为这个关键的转发工具transfer,需要提供如下功能:

1、能够指定同步master中的哪部分数据,并且能够方便地修改这个配置以应对master的加表需求;

2、支持stop slavestart slave。支持快速切换到新主库的change master命令。

3、能够记录读取点,transfer自己重启或master重启后能够按照记录点继续读后面的binlog

4、能够记录分发点,transfer自己重启或slave重启后能够按照记录点继续同步给slave

用起来就会发现还有好多要求。。。

 

四、方案实现

Transfer的这么多功能,自己造轮子就累了。这里直接用MySQL来充当此角色。为了方便描述,下文还将之称为transferTransfer更新slave在功能上可以使用federated引擎,但由于其纠结的实现导致性能上达不到要求,因此在MySQL框架层中作了一点修改――读到同步日志后,直接发送给slave

方案简单描述如下:

    1、 Slave机器上搭另外的若干个MySQL(transfer),将其设为Master的从库,且设置replicate-do-table, 每个transfer承担一部分的表。

   2、 所有Transfer的更新目标都设置为slave,其更新方式是读到日志后直接mysql_real_query执行到slave上。

从这可以看出这个方案的缺点之二:只能支持statement格式的同步方式。其实row也能支持,后面再说。

 

五、仍然延迟?

transfer放弃federated引擎改用直接发送后,性能提升不少,从库同步性能增加一倍,但从本文第一个图的数据对比就知道,延迟还很大。

发现这个时候slave的机器cpu已经很忙了,idle 20%一下――这个算是好消息,总比idle很高但性能上不去好。

实际上是因为每个transfer,虽然设置只同步其中的部分表,但在实现上是IO线程把master上的所有命令都备份到本地,然后在SQL线程执行的时候再判断,若不符合replicate-do-table,再放弃。

这样存在的问题,是ntransfer,磁盘写了n倍,更严重的是导致SQL线程空转。

我们上文提到整个流程中IO线程是比较空闲的,因此修改IO线程逻辑,在写入磁盘前先判断,若不符合本transferreplicate-do-table设置,不写盘,直接放弃。

六、效果

方案效果

从库的QPS由于线程切换会有抖动,但总的执行时间与主库相同。从库的cpu idle下降,与主库几乎同时恢复到100

 

七、小结

描述完了,总结一下,方案的代价:

1、要求在slave机器上多配置ntransfer(是否在从库上均可)

2、目前只能支持statementbinlog格式,实际上row可以支持,方案定了,开发计划中。

3、跨表更新的语句,会按照其更新的第一个表,分发到唯一一个transfer,没有重复更新的问题,但有时序性问题。

 

方案的好处:

1、功能比较齐全。直接使用MySQL,原有的管理功能基本都能用,主库从库重启/换库的代价比较小。

2、开发量小,只在transfer上修改两处,不包括配置读取部分,300行以内

3、风险相对小。不直接修改masterslve上的代码,线上比较容易接收。

 

 

  • 大小: 39.5 KB
  • 大小: 27.8 KB
  • 大小: 39.9 KB
7
5
分享到:
评论
2 楼 丁林.tb 2011-09-26  
berserker_12 写道
通常mysql都会存在热表,实际环境中,热表的更新可能占80%,如果能提前分析binlog的sql语句,让同表的可以并行执行sql语句也能并行同步,效果可能会更好。

容灾的时候,主备切换的时候,是否可以保证transfer的数据能正确同步?


是的,但是同表并行就会导致失误顺序不能保证,会导致主从数据不一致。
trasfer的转向问题,只要transfer支持动态修改master和slave的信息就行了吧。修改master可以直接用change master命令,  修改slave的目前还没有实现,不过已经有方案了,会继续完善,感谢关注
1 楼 berserker_12 2011-09-25  
通常mysql都会存在热表,实际环境中,热表的更新可能占80%,如果能提前分析binlog的sql语句,让同表的可以并行执行sql语句也能并行同步,效果可能会更好。

容灾的时候,主备切换的时候,是否可以保证transfer的数据能正确同步?

相关推荐

    mysql并行复制降低主从同步延时的思路与启示

    从mysql并行复制缩短主从同步时延的思想可以看到,架构的思路是相同的: (1)多线程是一种常见的缩短执行时间的方法 (2)多线程并发分派任务时必须保证幂等性:mysql的演进思路,提供了“按照库幂等”,“按照...

    MySQL主从同步中的server-id示例详解

    而主从同步的方式也分很多种,一主多从、链式主从、多主多从,根据你的需要来进行设置。但只要你需要主从同步,就一定要注意server-id的配置,否则会出现主从复制异常。 在控制数据库数据复制和日志管理中,有两个...

    详解MySQL主从不一致情形与解决方法

    由于mysql主从复制是基于binlog的一种异步复制 通过网络传送binlog文件,理所当然网络延迟是主从不同步的绝大多数的原因,特别是跨机房的数据同步出现这种几率非常的大,所以做读写分离,注意从业务层进行前期设计...

    MySQL主从配置

    主从同步,(数据是怎么从主数据库里到从数据库里)版本可以不一样 支持两种方式 第一种,行的复制 比如说数据库里有一张表(空表),主数据库添加一条数据, 数据记录到主服务器的binlog里,当从服务器启动的时候就...

    2017最新老男孩MySQL高级专业DBA实战课程全套【清晰不加密】,看完教程月入40万没毛病

    19-MySQL主从同步一键安装脚本实战mp4 20-MySQL多主多从高可用集群自动切换实现mp4 21-有关MySQL高可用注意及常见故障讲解mp4 22-MySQL集群及高可用的更多思路方案引子mp4 23-常见MySQL集群高可用架构讲座01.mp4 24-...

    MYSQL的主从复制知识点整理

    当单台MYSQL服务器无法满足当前网站流量时的优化方案。需要搭建mysql集群技术。 一、功能: 当向主服务器插入|修改|删除数据时,数据会自动同步到从服务器。 注意:主从复制是单向的,只能主 -> 从 分为两种类型:...

    100道必会Mysql面试题八股文题目以及答案

    主从复制是一种MySQL的数据复制方式,可以将一个数据库服务器(主服务器)的数据同步到一个或多个从服务器上。要设置主从复制,需要在主服务器上配置binlog、server-id等参数,并在从服务器上配置replicaof、master-...

    部署 MySQL 单机 部署 MySQL 高可用.rar

    一主一备架构是双机部署中最简单的一种架构了,mysql数据库系统自带这个数据同步(主备)功能。 思路:将mysql数据库部署到两台机器,其中一台机器作为日常线上提供数据读写服务的机器,称为主机;另一台机器不提供...

    MySQL管理之道 性能调优、高可用与监控.part2.rar

    4.8 mysql5.5.19/20同步一个bug 124 4.9 恢复slave从机上的某几张表的简要方法 126 4.10 如何干净地清除slave同步信息 127 第5章 性能调优 129 5.1 表设计 129 5.2 字段类型的选取 133 5.2.1 数值类型 134 ...

    MySQLDBA运维笔记.pdf

    mysql 总结........................................................................................................................................6 1.1 数据库的种类.......................................

    线上MYSQL同步报错故障处理方法总结(必看篇)

    在发生故障切换后,经常遇到的问题就是同步报错,数据库很小的时候,dump完再导入很简单就处理好了,但线上的数据库都150G-200G,如果用单纯的这种方法,成本太高,故经过一段时间的摸索,总结了几种处理方法。...

    redis 下载安装

     实现数据持久化的两种方式:(1)使用截图的方式,将内存中的数据不断写入磁盘(性能高,但可能会引起一定程度的数据丢失) (2)使用类似mysql的方式,记录每次更新的日志4、Redis的主从同步:对提高读取性能...

    mysql数据库应付大流量网站的的3种架构扩展方式介绍

    数据库扩展大概分为以下几个步骤: 1、读写分离:当数据库访问量还不是很大的时候,我们可以适当增加服务器,...先查询一个表,在查询另一个,虽然说这个会消耗更过性能,但比起那种大量数据同步,负担还是减轻了不少;

    天涯社区开源的NoSQL数据库 Memlink.zip

    特点:内存数据引擎,性能极为高效List块链结构,精简内存,优化查找效率Node数据项可定义,支持多种过滤操作支持redo-log,数据持久化,非Cache模式分布式,主从同步 Memlink主要应用于天涯论坛类型产品(论坛、来...

    基于MYSQLBINLOG日志实现的单向网络数据同步

    MySQL5.6开始主从复制有两种方式:基于日志(binlog)、基于GTID(全局事务标示符)。 根据《High-LevelBinaryLogStructure andContents》所述,不同版本的Binlog格式不一定一样,所以也没有一个定性。在我写这篇...

    产品手册6.0应用数据与智能.pdf

    MySQL 是全球最受欢迎的开源数据库之一...云数据库MySQL 版采用阿里云的AliSQL 分支,目前兼容MySQL 5.5/5.6/5.7 版本,同时提供高性价比的单机基础版、一主一备的高可用版和一主多备主从强同步的金融版三种系列可选。

    mybatis-readwrite.zip

    Spring+mybatis实现读写分离代码实现,第一种通过拦截器实现,第二种基于spring注解和AOP实现

    使用Rotate Master实现MySQL 多主复制的实现方法

    本文主要介绍一种非实时的适用于各版本MySQL的multi-master方法。 内容简介: 最初的思路来源于一位国外DBA的blog : http://thenoyes.com/littlenoise/?p=117 基本原理就是通过SP记录当前 master-log的name和pos...

    2021互联网大厂Java架构师面试题突击视频教程

    上百节课详细讲解,需要的小伙伴自行百度网盘下载,链接见附件,永久有效。 课程介绍: 01_先来看一个互联网java工程师的招聘JD ...主从同步延时咋解决? 52_如何设计高可用系统架构?限流?熔断?降级?什么鬼!

Global site tag (gtag.js) - Google Analytics