=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 线程的延迟。
参考链接:
- 如何识别和解决MySQL从库延迟的问题
- MySQL从库延迟的一些原因
- 如何应对MySQL从库延迟
- MySQL复制中slave延迟监控
- 应对MySQL从库延迟的7个方法
- http://dba.stackexchange.com/questions/4311/is-mysql-replication-affected-by-a-high-latency-interconnect
- http://serverfault.com/questions/30605/how-fast-is-mysql-replication
=END=
《 “MySQL复制产生延迟的原因及定位方法” 》 有 6 条评论
MySQL主从复制搭建,基于日志(binlog)
http://raye.wang/2017/04/14/mysqlzhu-cong-fu-zhi-da-jian-ji-yu-ri-zhi-binlog/
彻底终结MySQL同步延迟问题
https://www.jianshu.com/p/ed19bb0e748a
MySQL实时监控工具(黑盒测试辅助工具)
https://github.com/TheKingOfDuck/MySQLMonitor
异地多活场景下的数据同步之道
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。
`
自建Binlog订阅服务 —— Maxwell
http://seanlook.com/2018/01/13/maxwell-binlog/
基于MySQL binlog增量数据同步方案(maxwell+rabbimt+pydbsync)
http://seanlook.com/2018/01/14/rabbitmq-maxwell-consumer/
详解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