点击上方"java全栈技术"关注,每天学习一个java知识点

原创: 58沈剑

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主从复制,读写分离是互联网常见的数据库架构,该架构最令人诟病的地方就是,在数据量较大并发量较大的场 ...

  2. MySQL主从延时这么长,要怎么优化?

    MySQL主从复制,读写分离是互联网常见的数据库架构,该架构最令人诟病的地方就是,在数据量较大并发量较大的场景下,主从延时会比较严重. 为什么主从延时这么大? 答:MySQL使用单线程重放RelayL ...

  3. mysql主从延时这么长_MySQL主从延迟问题解决

    今天我们就来看看为什么会产生主从延迟以及主从延迟如何处理等相关问题. 坐好了,准备发车! 主从常见架构 随着日益增长的访问量,单台数据库的应接能力已经捉襟见肘.因此采用主库写数据,从库读数据这种将读写 ...

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

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

  5. Mysql 主从延时监控(pt-heartbeat)详解

    主从延时在主从环境中是一个非常值得关注的问题,有时候我们可以通过show slave status命令查看Seconds_Behind_Master值来分析主从的延时情况:但是由于该值是来自binlo ...

  6. Mysql主从延时解决办法

    1.忍受大法 第一种解决办法,很简单,无他,不管他,没有读到也没事.这时业务不需要任何改造,你好,我好,她也好~ 如果业务对于数据一致性要求不高,我们就可以采用这种方案. 2.数据同步写方案 主从数据 ...

  7. Mysql主从延时-Multi-threaded slave statistics for channel

    今天Mysql从库日志抛以下note信息,起初是主库上这几天有很大的并发事务,导致从库延时非常大,但是从库并没有什么压力,我们来分析下这个问题. 2021-01-10T16:08:39.947611+ ...

  8. MySQL 主从同步延迟的原因及解决办法

    首页 博客 专栏·视频 下载 论坛 问答 代码 直播 能力认证 高校 会员中心 收藏 动态 消息 创作中心 MySQL 主从同步延迟的原因及解决办法 hao_yunfeng 2018-09-04 23 ...

  9. mysql主从复制延时性问题_MySQL主从同步延迟原因及解决办法

    MySQL主从延迟原因以及解决方案:谈到MySQL数据库主从同步延迟原理,得从mysql的数据库主从复制原理说起,mysql的主从复制都是单线程的操作(mysql5.6版本之前),主库对所有DDL和D ...

最新文章

  1. linux跨版本升级,深度Deepin系统支持跨版本升级
  2. cdp备份适合oracle吗,备份系统建设中的四个认识误区,你有吗?
  3. 用数据说话,基金经理一年到底能挣多少钱?
  4. 2020年日历可编辑内容模板_2020鼠年新春海报模板合集
  5. 论文理解(一)树形lstm
  6. feign 多个参数放对象_feign架构 原理解析
  7. paip.提升用户体验--radio图片选择器 easyui 实现..
  8. Android聊天室(源码)
  9. php token过期时间,token过期是什么意思
  10. 自监督学习论文、代码汇总
  11. 基于matlab锁相环电路,锁相环PLL的电路原理以及基本构成
  12. 电脑开机启动时打开某个Excel表格
  13. play框架2.5.6教程——使用play控制台
  14. ZHO共享纸巾机为何能够引领潮流、深受大众欢迎?
  15. 宇宙存在三级量子--超越爱因斯坦
  16. The generalization-stability tradeoff in neural network pruning
  17. Blender2.8安装Armory3D插件
  18. 服务器snb芯片组,技嘉发布三款SNB Xeon单路服务器主板
  19. 64位mysql 和32位区别,ps的64位和32位的区别是什么
  20. 神雕侠侣手游服务器维修到多久,神雕侠侣手游常见问题_神雕侠侣手游问答_疑难解答_九游手机游戏...

热门文章

  1. 用Debug函数实现API函数的跟踪
  2. the fair-sounding
  3. Oracle 优化器_访问数据的方法_单表
  4. JS字符串类型转日期然后进行日期比较
  5. 'ModelOptions' object has no attribute 'get_field_names
  6. javascript去除首尾空白字符
  7. linq replace with single call to FirstOrDefault 解决使用resharper产生的警告
  8. url指定服务器,Linux服务器设置定时任务来访问指定url
  9. oracle创建过程带有编译错误,警告:创建的函数带有编译错误
  10. layui table 字体大小_layui table设置某一行的字体颜色方法