zoukankan      html  css  js  c++  java
  • MySQL主从延时这么长,怎么优化?

    点击▲关注 “数据和云”   给公众号标星置顶

    更多精彩 第一时间直达

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

     

    为什么主从延时这么大?

    640?
    :MySQL使用单线程重放RelayLog。

     

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

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

     

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

    640?
    :需要考虑如何分割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。

    640?

    如何做到呢?

    :设计一个哈希算法,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

    640?
    和原来的日志相比,多了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并行复制;

     

    思路比结论重要,希望大家有收获。




    资源下载

    关注公众号:数据和云(OraNews)回复关键字获取

    2018DTCC , 数据库大会PPT

    2018DTC,2018 DTC 大会 PPT

    DBALIFE ,“DBA 的一天”海报

    DBA04 ,DBA 手记4 电子书

    122ARCH ,Oracle 12.2体系结构图

    2018OOW ,Oracle OpenWorld 资料

    产品推荐

    云和恩墨Bethune Pro企业版,集监控,巡检,安全于一身,你的专属数据库实时监控和智能巡检平台,漂亮的不像实力派,你值得拥有!


    640?wx_fmt=jpeg


    云和恩墨zData一体机现已发布超融合版本和精简版,支持各种简化场景部署,零数据丢失备份一体机ZDBM也已发布,欢迎关注。


    640?wx_fmt=jpeg


    640?wx_fmt=jpeg

  • 相关阅读:
    【数据结构(C语言版)系列三】 队列
    【数据结构(C语言版)系列二】 栈
    【数据结构(C语言版)系列一】 线性表
    [转]Boosting
    吴恩达机器学习笔记
    C语言之图像旋转
    DP【洛谷P4290】 [HAOI2008]玩具取名
    背包 DP【洛谷P4158】 [SCOI2009]粉刷匠
    最短路+状压DP【洛谷P3489】 [POI2009]WIE-Hexer
    模板 Trie树
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13312145.html
Copyright © 2011-2022 走看看