MySQL复制产生延迟的原因及定位方法

本文最后更新于2016年9月25日,已超过 1 年没有更新,如果文章内容失效,还请反馈给我,谢谢!

=Start=

缘由:

之前记录了两篇MySQL复制相关的文章:「MySQL主从环境搭建」、「MySQL主从环境重建」,这里再记录一下MySQL复制产生延迟的原因和定位方法,方便以后有机会再深入研究一下。

参考解答:
如何识别MySQL复制存在延迟?

MySQL复制和Slave的两个线程有关:IO_THREAD 和 SQL_THREAD。IO_THREAD 连接到 Master 上读取 binlog 内容的变化并将其复制到Slave上一个称之为 relaylog 的本地文件中。另一方面,SQL_THREAD 线程读取存储在Slave本地的 relaylog 并将它们中的操作尽可能的快在Slave上执行。所以当出现复制延迟时,重要的判断问题到底出在Slave的 IO_THREAD 还是 SQL_THREAD 线程上。

正常情况下,IO_THREAD 线程不会导致一个巨大的复制延迟,因为它只是从 Master 上读取 binlog。然而,它取决于网络连通性、网络延迟……服务器之间的速度有多快,当带宽占用比较高时,IO_THREAD 线程的延迟就会比较大。通常,当 IO_THREAD 线程可以快速的将Master上的binlog复制到Slave上的relaylog时,Slave上的IO_THREAD线程就不是导致复制延迟的罪魁祸首。

从另外一个角度来看,Slave上的SQL_THREAD 线程是导致复制延迟的主要原因,可能由下面一些因素导致:

  • 硬件故障(Hardware Faults)
  • 配置的变化(Configuration Changes)
  • MySQL重启(MySQL Restart)
  • 从库角色的变化(Changing Slave Role)
  • 复制流量的变化(Replication Traffic Changes)
  • 从库读流量的变化(Slave Read Traffic Changes)
  • IO子系统负载的变化(Side load on IO subsystem)
  • 数据大小的变化(Data Size Changes)
  • MySQL或OS版本的变化(MySQL or OS version changes)

当「show slave status\G」命令的输出结果中, Master_Log_File 和 Relay_Master_Log_File 参数值的内容相同时,你可以通过公式「Read_Master_Log_Pos – Exec_Master_Log_Pos」大体上计算出 SQL_THREAD 线程的延迟。

参考链接:

=END=

声明: 除非注明,ixyzero.com文章均为原创,转载请以链接形式标明本文地址,谢谢!
https://ixyzero.com/blog/archives/2846.html

《MySQL复制产生延迟的原因及定位方法》上有6条评论

  1. 异地多活场景下的数据同步之道
    https://mp.weixin.qq.com/s/TajDs9RubSVFx5IsU-kBTQ

    本文将先从概念上介绍单元化、异地多活、就近访问等基本概念。之后,将以数据库为例,讲解在数据同步的情况下,如何解决数据回环、数据冲突、数据重复等典型问题。

    1 什么是单元化

    2 如何实现数据同步
    2.1 基础知识
    2.2 如何获取全量+增量数据?
    2.2 如何解决重复插入
    2.3 如何解决唯一索引冲突
    2.4 对于DDL语句如何处理
    2.5 如何解决数据回环问题
    2.6 数据同步架构设计

    3 数据据回环问题解决方案
    3.1 同步操作不生成binlog
    3.2 控制binlog同步方向
    3.2.1 ROW模式下的SQL
    3.2.2 通过附加表
    3.2.3 通过GTID

    4 开源组件介绍canal/otter
    前面深入讲解了单元化场景下数据同步的基础知识。读者可能比较感兴趣的是,哪些开源组件在这些方面做的比较好。笔者建议的首选,是canal/otter组合。

    canal的作用就是类似于前面所述的binlog syncer,拉取解析binlog。otter是canal的客户端,专门用于进行数据同步,类似于前文所讲解的sql writer。并且,canal的最新版本已经实现了GTID。

  2. 详解MySQL—DDL语句、DML语句与DCL语句
    https://www.cnblogs.com/zhangmingcheng/p/5295684.html

    DDL(Data Definition Languages)语句:数据定义语言,这些语句定义了不同的数据段、数据库、表、列、索引等数据库对象的定义。常用的语句关键字主要包括 create、drop、alter等。

    DML(Data Manipulation Language)语句:数据操纵语句,用于添加、删除、更新和查询数据库记录,并检查数据完整性,常用的语句关键字主要包括 insert、delete、udpate 和select 等。(增添改查)

    DCL(Data Control Language)语句:数据控制语句,用于控制不同数据段直接的许可和访问级别的语句。这些语句定义了数据库、表、字段、用户的访问权限和安全级别。主要的语句关键字包括 grant、revoke 等。

    DDL 是数据定义语言的缩写,简单来说,就是对数据库内部的对象进行创建、删除、修改的操作语言。它和 DML 语言的最大区别是 DML 只是对表内部数据的操作,而不涉及到表的定义、结构的修改,更不会涉及到其他对象。DDL 语句更多的被数据库管理员(DBA)所使用,一般的开发人员很少使用。

    数据库中DQL、DML、DDL、DCL的概念与区别
    https://blog.csdn.net/sinat_25059791/article/details/69666318

    浅谈 DDL 技术解密
    https://mp.weixin.qq.com/s?__biz=MzI3MDU5OTU0MA==&mid=2247484298&idx=1&sn=6537eb34c62944042f20810e8e8442ef
    https://dev.mysql.com/doc/refman/5.6/en/innodb-online-ddl.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注