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

一、缘起

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

为什么mysql主从延时这么大?


回答:从库使用【单线程】重放relaylog。

优化思路是什么?

回答:使用单线程重放relaylog使得同步时间会比较久,导致主从延时很长,优化思路不难想到,可以【多线程并行】重放relaylog来缩短同步时间。

mysql如何“多线程并行”来重放relaylog,是本文要分享的主要内容。

二、如何多线程并行重放relaylog


通过多个线程来并行重放relaylog是一个很好缩短同步时间的思路,但实施之前要解决这样一个问题:

如何来分割relaylog,才能够让多个work-thread并行操作数据data时,使得data保证一致性?

首先,【随机的分配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个工作线程并发执行这3个语句,谁最后执行成功是不确定的,故得到的数据可能与主库不同

好,对于这个问题,可以用什么样的思路来解决呢(大伙怎么想,mysql团队其实也就是这么想的)

【方法一:相同库上的写操作,用相同的work-thread来重放relaylog;不同库上的写操作,可以用多个work-thread并发来重放relaylog】


如何做到呢?

回答:不难,hash(db-name) % thread-num,库名hash之后再模上线程数,就能够做到。

存在的不足?

很多公司对mysql的使用是“单库多表”,如果是这样的话,仍然是同一个work-thread在串行执行,还是不能提高relaylog的重放速度。

优化方案:将“单库多表”的模式升级为“多库多表”的模式。

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

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

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

(3)…

对于架构师进行架构设计的启示是:使用多库的方式设计db架构,能够降低主从同步的延时。

新的想法:“单库多表”的场景,还有并行执行优化余地么?

仔细回顾和思考,即使只有一个库,数据的修改和事务的执行在主库上也是并行操作的,既然在主库上可以并行操作,在从库上为啥就不能并行操作,而要按照库来串行执行呢(表示不服)?

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

【方法二:基于GTID的并行复制】

新版的mysql,将组提交的信息存放在GTID中,使用mysqlbinlog工具,可以看到组提交内部的信息:

20160607 23:22 server_id 58 XXX GTID last_committed=0 sequence_numer=1

20160607 23:22 server_id 58 XXX GTID last_committed=0 sequence_numer=2

20160607 23:22 server_id 58 XXX GTID last_committed=0 sequence_numer=3

20160607 23:22 server_id 58 XXX GTID last_committed=0 sequence_numer=4


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

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

三、结尾

从mysql并行复制缩短主从同步时延的思想可以看到,架构的思路是相同的:

(1)多线程是一种常见的缩短执行时间的方法

(2)多线程并发分派任务时必须保证幂等性:mysql的演进思路,提供了“按照库幂等”,“按照commit_id幂等”两种方式,思路大伙可以借鉴

另,mysql在并行复制上的逐步优化演进:

mysql5.5 -> 不支持并行复制,对大伙的启示:升级mysql吧

mysql5.6 -> 按照库并行复制,对大伙的启示:使用“多库”架构吧

mysql5.7 -> 按照GTID并行复制

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

  1. MySQL 主从同步延时问题

    以前线上确实处理过因为主从同步延时问题而导致的线上的 bug,属于小型的生产事故. 是这个么场景. 案例: 先插入一条数据,再把它查出来,然后更新这条数据.在生产环境高峰期,写并发达到 了 2000/ ...

  2. InnoSQL/MySQL并行复制的实现与配置

    InnoSQL/MySQL并行复制的实现与配置 http://www.innomysql.net/article/6276.html 并行复制之前的解决方案 InnoSQL在5.5.30-v4版本中支 ...

  3. 【mysql进阶】MTS主从同步原理及实操指南(七)

    0.引言 随着业务场景的深入和请求量的剧增,单库实现读写越来越趋近瓶颈,于是我们想到搭建主从库,主库负责写,从库负责读,从而实现读写分离,提高查询效率. 但是主从库之间的数据如何同步呢?很明显我们写入 ...

  4. MySQL数据库备份之主从同步配置

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:用好Java中的枚举,真的没有那么简单!个人原创+1博客:点击前往,查看更多 出处:https://www.cn ...

  5. mysql 并行复制搭建_基于GTID的主从实践系列之④并行复制搭建及测试

    并行复制最早在5.6就搞出来了,是一个库级别的并行复制(slave_parallel_type可以有两个值:DATABASE 默认值,基于库的并行复制方式:LOGICAL_CLOCK:基于组提交的并行 ...

  6. Linux下MySQL 5.7 主从复制(主从同步)

    首先要准备两台服务器,一台主服务器(Master),另一台从服务器(Slave),然后要保证Master与Slave的版本要相同且Master不能高于Slave的版本,一般稳健的做法都是使其版本相同, ...

  7. mysql 8.0配置主从同步_MySQL8.0.19开启GTID主从同步CentOS8

    前言本次搭建目标为1主2从MySQL主从同步结构.采用CentOS8作为操作系统,IP为[10.0.0.211,10.0.0.212,10.0.0.213].MySQL版本为8.0.19,端口均采用3 ...

  8. mysql半复制_mysql半同步复制

    从MySQL5.5开始,MySQL以插件的形式支持半同步复制.如何理解半同步呢?首先我们来看看异步,全同步的概念 异步复制(Asynchronous replication) MySQL默认的复制即是 ...

  9. mysql relaylog 慢_MySQL 主从同步延迟的原因及解决办法

    mysql 用主从同步的方法进行读写分离,减轻主服务器的压力的做法现在在业内做的非常普遍. 主从同步基本上能做到实时同步.我从别的网站借用了主从同步的原理图. 在配置好了, 主从同步以后, 主服务器会 ...

最新文章

  1. json web token 实践登录以及校验码验证
  2. 参考: 40个轻量级 JavaScript 库
  3. linux安装apache mysql tomcat
  4. 从头写个http client(java)
  5. 解决IE6、IE7、Firefox兼容最简单的CSS Hack
  6. 贪吃蛇博弈算法python_算法应用实践:如何用Python写一个贪吃蛇AI
  7. amf组网_【5G核心网】5G核心网SA组网方案及4G/5G互操作探讨
  8. 桥牌笔记L4D17:小心阻塞
  9. angularjs html编码,怎样使用AngularJS实现base64编码与解码
  10. 采集过程中遇到的利器
  11. 深度linux磁盘编辑,磁盘管理(分区,格式化,维护,写入,配额)- 磁盘管理 - Deepin深度系统用户手册...
  12. 国际科学数据服务平台nbsp;-nbsp;csdb
  13. 软件测试人员工作计划怎么写,软件测试个人工作计划.docx
  14. android gps转换度分秒,GPS坐标单位(度分秒)的换算方法
  15. 详细图解,一眼就能看懂!卷帘快门(Rolling Shutter)与全局快门(Global Shutter)的区别
  16. C语言二维数组传参问题
  17. Blow Up 3macOS图片放大锐利的详细使用教程与安装方法
  18. 100流明相当于多少w_GE的50W卤素灯光通量标明1500流明实际有这么高吗换几W的LED灯较合适...
  19. 宁畅g40系列服务器发布,酷冷至尊MWE Gold V2 1050 让你的神机干劲十足
  20. 【历史上的今天】8 月 20 日:两位传奇程序员的诞生日!

热门文章

  1. gridsearchcv参数_Python机器学习库Sklearn系列教程(21)-参数优化
  2. python科学计算库-数值计算库与科学计算库
  3. TCP 滑动窗口(已经发出等待对方确认的队列)协议
  4. Modbus调试软件--ModbusPoll、ModbusSlave使用详解
  5. QT5开发及实例学习之八基本对话框(一)
  6. android camera 动画,Android 使用Camera创建3D动画
  7. gitd mysql_MySQL GTID (一)
  8. Java面试之锁-读写锁
  9. 未经处理的异常:System.Net.Sockets.SocketException: 以一种访问权限不允许的方式做了一个访问套接字的尝试...
  10. Java+Selenium自动化对非输入框的日历或日期控件的处理