MySQL主从复制读写分离是互联网常见的数据库架构,该架构最令人诟病的地方就是,在数据量较大并发量较大的场景下,主从延时会比较严重。

为什么主从延时这么大?

:MySQL使用单线程重放RelayLog。

应该怎么优化,缩短重放时间?

:多线程并行重放RelayLog可以缩短时间。

多线程并行重放RelayLog有什么问题?

:需要考虑如何分割RelayLog,才能够让多个数据库实例多个线程并行重放RelayLog,不会出现不一致。

为什么会出现不一致?

:如果RelayLog随机的分配给不同的重放线程,假设RelayLog中有这样三条串行的修改记录:

update account set money=100 where uid=58;

update account set money=150 where uid=58;

update account set money=200 where uid=58;

如果单线程串行重放:能保证所有从库与主库的执行序列一致。

画外音:最后money都将为200。

如果多线程随机分配重放:多重放线程并发执行这3个语句,谁最后执行是不确定的,最终从库数据可能与主库不同。

画外音:多个从库可能money为100,150,200不确定。

如何分配,多个从库多线程重放,也能得到一致的数据呢?

:相同库上的写操作,用相同的线程来重放RelayLog;不同库上的写操作,可以并发用多个线程并发来重放RelayLog。

如何做到呢?

:设计一个哈希算法,hash(db-name) % thread-num,库名hash之后再模上线程数,就能很轻易做到,同一个库上的写操作,被同一个重放线程串行执行。

画外音:不同库上的重放,是并行的,就起到了加速做用。

这个方案有什么不足?

:很多公司对MySQL的使用是“单库多表”,如果是这样的话,仍然只有一个库,还是不能提高RelayLog的重放速度。

启示:将“单库多表”的DB架构模式升级为“多库多表”的DB架构模式。

画外音:数据量大并发量大的互联网业务场景,“多库”模式还具备着其他很多优势,例如:

(1)非常方便的实例扩展:DBA很容易将不同的库扩展到不同的实例上;

(2)按照业务进行库隔离:业务解耦,进行业务隔离,减少耦合与相互影响;

(3)非常方便微服务拆分:每个服务拥有自己的实例就方便了;

“单库多表”的场景,多线程并行重放RelayLog还能怎么优化?

:即使只有一个库,事务在主库上也是并发执行的,既然在主库上可以并行执行,在从库上也应该能够并行执行呀?

新思路:将主库上同时并行执行的事务,分为一组,编一个号,这些事务在从库上的回放可以并行执行(事务在主库上的执行都进入到prepare阶段,说明事务之间没有冲突,否则就不可能提交),没错,MySQL正是这么做的。

解法:基于GTID的并行复制。

从MySQL5.7开始,将组提交的信息存放在GTID中,使用mysqlbinlog工具,可以看到组提交内部的信息:

20181014 23:52 server_id 58 XXX GTID last_committed=0 sequence_numer=1

20181014 23:52 server_id 58 XXX GTID last_committed=0 sequence_numer=2

20181014 23:52 server_id 58 XXX GTID last_committed=0 sequence_numer=3

20181014 23:52 server_id 58 XXX GTID last_committed=0 sequence_numer=4

和原来的日志相比,多了last_committed和sequence_number。

什么是last_committed?

答:它是事务提交时,上次事务提交的编号,如果具备相同的last_committed,说明它们在一个组内,可以并发回放执行。

总结

MySQL并行复制,缩短主从同步时延的方法,体现着这样的一些架构思想:

  • 多线程是一种常见的缩短执行时间的方法;

画外音:例如,很多crontab可以用多线程,切分数据,并行执行。

  • 多线程并发分派任务时,必须保证幂等性:MySQL提供了“按照库幂等”,“按照commit_id幂等”两种方式,很值得借鉴;

画外音:例如,群消息,可以按照group_id幂等;用户消息,可以按照user_id幂等。

具体到MySQL主从同步延时:

    • mysql5.5:不支持并行复制,大伙快升级MySQL版本;

    • mysql5.6:按照库并行复制,建议使用“多库”架构;

    • mysql5.7:按照GTID并行复制;

MySQL主从延时这么长,要怎么优化?的更多相关文章

  1. mysql主从延时处理方法

    mysql主从延时处理方法 1.今天做数据迁移,4个库总共60G数据左右吧,迁移成功后,发现从库延时在不断的上升,查看从库库表,部分表还没有同步过去 2.网上查询了一些文章,增加一下配置可以解决: # ...

  2. 有关RDS上只读实例延时分析-同适用于自建MySQL主从延时分析判断

    个人不是很喜欢在技术上跟人互喷,尤其是不在同一个岗位上的人.一方面本人的性格如此,另一方面,我自身的口水也确实是不行,人生经历了第一次的双11洗礼,在大促的环境下,总算知道了有些东西是否应该规避,这次 ...

  3. Mysql 主从延时监控

    200 ? "200px" : this.width)!important;} --> 介绍 主从延时在主从环境中是一个非常值得关注的问题,有时候我们可以通过show sla ...

  4. mysql主从延时临时解决办法

    主从延时临时解决办法: 主从延迟严重的原因很多,其中有以下原因: 一.由于无主键大表的delete 和update导致. mysql  主从复制时.如果表上没有主键.会导致update和delete操 ...

  5. 如何实现 MySQL 的读写分离?MySQL 主从复制原理的是啥?如何解决 MySQL 主从同步的延时问题?

    如何实现 MySQL 的读写分离? 其实很简单,就是基于主从复制架构,简单来说,就搞一个主库,挂多个从库,然后我们就单单只是写主库,然后主库会自动把数据给同步到从库上去. MySQL 主从复制原理的是 ...

  6. MYSQL的读写分离主从延时问题

    如何实现 MySQL 的读写分离? 其实很简单,就是基于主从复制架构,简单来说,就搞一个主库,挂多个从库,然后我们就单单只是写主库,然后主库会自动把数据给同步到从库上去. MySQL 主从复制原理的是 ...

  7. MySQL主从问题

    Mysql数据库主从心得整理      管理mysql主从有2年多了,管理过200多组mysql主从,几乎涉及到各个版本的主从,本博文属于总结性的,有一部分是摘自网络,大部分是根据自己管理的心得和经验 ...

  8. 高性能Mysql主从架构的复制原理及配置详解

    温习<高性能MySQL>的复制篇. 1 复制概述 Mysql内建的复制功能是构建大型,高性能应用程序的基础.将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台 ...

  9. LVS+Keepalived+Squid+Nginx+MySQL主从高性能集群架构部署方案

    方案一,在tomcat的workers.properties里面配置相关条件 worker.tomcat.lbfactor= worker.tomcat.cachesize= worker.tomca ...

随机推荐

  1. python3笔记十六:python匿名函数和高阶函数

    一:学习内容 lambda函数 map函数与reduce函数 filter函数 sorted函数 二:匿名函数-lambda 1.概念:不使用def这样的语句去定义函数,使用lambda来创建匿名函数 ...

  2. Oracle12C SGA PGA UGA

    SGA和PGA简介 1 sga组成: 2b4p1s(记忆) database buffer cache:包括 default pool,keep pool,recycle pool: redo log ...

  3. 最少步数&P1443 马的遍历

      1330:[例8.3]最少步数 s数组:记录(1,1)到达每一点需要的最少步数 s[1][1]自然为 0,其余初始化为 -1 que数组:que[#][1] 表示(1,1)可到达点的 x 坐标 q ...

  4. Centos 安装freesurfer fsl matlab 等软件---转自网络

    freesurfer: freesurfer好安装,只需要下载官网源码包,如freesurfer5.3.tar.gz 下载至本地,解压: tar zxvf freesurfer5.3.tar.gz - ...

  5. Linux - 搭建Web项目(Django + nginx + uwsgi)

    工作中碰到需要使用Django + nginx + uwsgi 搭建项目环境 1. 搭建基本环境 需要有python环境,不多做说明 需要安装nginx,不多做说明 需要安装uwsgi: yum in ...

  6. Centos7.4 yum 安装MariaDB

    #系统及版本选择:https://downloads.mariadb.org/mariadb/repositories/#mirror=tunavim /etc/yum.repos.d/MariaDB ...

  7. 八十六:redis之RDB和AOF两种数据持久化机制

    详见:http://redisdoc.com/persistence/index.html redis.conf RDB机制 改为5秒内1次 文件已生成 关闭RDB,注释掉3个save,重启redis ...

  8. 在xcode找不到发布证书

    解决方法 1.访问XCode的Preferences>Accounts,在Apple IDs里面找到你的帐号,选中后,在右侧,在Name下面会有一行描述.双击.在弹出窗口里面,有个刷新按钮,点击 ...

  9. vs在微软官方tfs创建私有项目过程

    谁也不是成天创建新项目,每次一创建就跟没干过这活似的,这次把它记下,再用的时候来翻,也希望能给别人点帮助. 上https://dev.azure.com/,tfs原来的网址会往这里跳,现在都在往dev ...

  10. MR1和MR2的工作原理

    MapReduce1 分为6个步骤: 1.作业的提交 1).客户端向jobtracker请求一个新的作业ID(通过JobTracker的getNewJobId()方法获取,见第2步 2).计算作业的输 ...