【老叶茶馆】MySQL复制中slave延迟监控
[MySQL FAQ]系列 — MySQL复制中slave延迟监控
在MySQL复制环境中,我们通常只根据 Seconds_Behind_Master 的值来判断SLAVE的延迟。这么做大部分情况下尚可接受,但并不够准确,而应该考虑更多因素。
首先,我们先看下SLAVE的状态:
yejr@imysql.com [(none)]> show slave status\G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event *** Master_Log_File: mysql-bin.000327 Read_Master_Log_Pos: 668711237 Relay_Log_File: mysql-relay-bin.002999 Relay_Log_Pos: 214736858 Relay_Master_Log_File: mysql-bin.000327 Slave_IO_Running: Yes Slave_SQL_Running: Yes *** Skip_Counter: 0 Exec_Master_Log_Pos: 654409041 Relay_Log_Space: 229039311 *** Seconds_Behind_Master: 3296 ***
可以看到 Seconds_Behind_Master 的值是 3296,也就是SLAVE至少延迟了 3296 秒。
我们再来看下SLAVE上的2个REPLICATION进程状态:
yejr@imysql.com [(none)]> show full processlist\G *************************** 1. row *************************** Id: 6 User: system user Host: db: NULL Command: Connect Time: 22005006 State: Waiting for master to send event Info: NULL *************************** 2. row *************************** Id: 7 User: system user Host: db: NULL Command: Connect Time: 3293 State: Updating Info: UPDATE ** SET ** WHERE **
可以看到SQL线程一直在执行UPDATE操作,注意到 Time 的值是 3293,看起来像是这个UPDATE操作执行了3293秒,一个普通的SQL而已,肯定不至于需要这么久。
实际上,在REPLICATION进程中,Time 这列的值可能有几种情况:
1、SQL线程当前执行的binlog(实际上是relay log)中的timestamp和IO线程最新的timestamp的差值,这就是通常大家认为的 Seconds_Behind_Master 值,并不是某个SQL的实际执行耗时;
2、SQL线程当前如果没有活跃SQL在执行的话,Time值就是SQL线程的idle time;
而IO线程的Time值则是该线程自从启动以来的总时长(多少秒),如果系统时间在IO线程启动后发生修改的话,可能会导致该Time值异常,比如变成负数,或者非常大。
来看下面几个状态:
#设置pager,只查看关注的几个status值 yejr@imysql.com [(none)]> pager cat | egrep -i 'system user|Exec_Master_Log_Pos|Seconds_Behind_Master|Read_Master_Log_Pos'#这是没有活跃SQL的情况,Time值是idle time,并且 Seconds_Behind_Master 为 0 yejr@imysql.com [(none)]> show processlist; show slave status\G | 6 | system user | | NULL | Connect | 22004245 | Waiting for master to send event | NULL | | 7 | system user | | NULL | Connect | 13 | Has read all relay log;** Read_Master_Log_Pos: 445167889 Exec_Master_Log_Pos: 445167889 Seconds_Behind_Master: 0 #和上面一样 yejr@imysql.com [(none)]> show processlist; show slave status\G | 6 | system user | | NULL | Connect | 22004248 | Waiting for master to send event | NULL | | 7 | system user | | NULL | Connect | 16 | Has read all relay log;** Read_Master_Log_Pos: 445167889 Exec_Master_Log_Pos: 445167889 Seconds_Behind_Master: 0 #这时有活跃SQL了,Time值是和 Seconds_Behind_Master 一样,即SQL线程比IO线程“慢”了1秒 yejr@imysql.com [(none)]> show processlist; show slave status\G | 6 | system user | | NULL | Connect | 22004252 | Waiting for master to send event | NULL | | 7 | system user | | floweradmin | Connect | 1 | Updating | update ** Read_Master_Log_Pos: 445182239 Exec_Master_Log_Pos: 445175263 Seconds_Behind_Master: 1 #和上面一样 yejr@imysql.com [(none)]> show processlist; show slave status\G | 6 | system user | | NULL | Connect | 22004254 | Waiting for master to send event | NULL | | 7 | system user | | floweradmin | Connect | 1 | Updating | update ** Read_Master_Log_Pos: 445207174 Exec_Master_Log_Pos: 445196837 Seconds_Behind_Master: 1
好了,最后我们说下如何正确判断SLAVE的延迟情况:
1、首先看 Relay_Master_Log_File 和 Master_Log_File 是否有差异;
2、如果Relay_Master_Log_File 和 Master_Log_File 是一样的话,再来看Exec_Master_Log_Pos 和 Read_Master_Log_Pos 的差异,对比SQL线程比IO线程慢了多少个binlog事件;
3、如果Relay_Master_Log_File 和 Master_Log_File 不一样,那说明延迟可能较大,需要从MASTER上取得binlog status,判断当前的binlog和MASTER上的差距;
因此,相对更加严谨的做法是:
在第三方监控节点上,对MASTER和SLAVE同时发起SHOW BINARY LOGS和SHOW SLAVE STATUS\G的请求,最后判断二者binlog的差异,以及 Exec_Master_Log_Pos 和 Read_Master_Log_Pos 的差异。
例如:
在MASTER上执行SHOW BINARY LOGS 的结果是:
+------------------+--------------+ | Log_name | File_size | +------------------+--------------+ | mysql-bin.000009 | 1073742063 | | mysql-bin.000010 | 107374193 | +------------------+--------------+
而在SLAVE上执行SHOW SLAVE STATUS\G 的结果是:
Master_Log_File: mysql-bin.000009 Read_Master_Log_Pos: 668711237 Relay_Master_Log_File: mysql-bin.000009 Slave_IO_Running: Yes Slave_SQL_Running: Yes *** Exec_Master_Log_Pos: 654409041*** Seconds_Behind_Master: 3296 ***
这时候,SLAVE实际的延迟应该是:
mysql-bin.000009 这个binlog中的binlog position 1073742063 和 SLAVE上读取到的binlog position之间的差异延迟,即:
1073742063 - 654409041 = 419333022 个binlog event
并且还要加上 mysql-bin.000010这个binlog已经产生的107374193个binlog event,共
107374193 + 419333022 = 526707215 个binlog event
总结:
1、可以在MASTER上维护一个监控表,它只有一个字段,存储这最新最新时间戳(高版本可以采用event_scheduler来更新,低版本可以用cron结合自动循环脚本来更新),在SLAVE上读取该字段的时间,只要MASTER和SLAVE的系统时间一致,即可快速知道SLAVE和MASTER延迟差了多少。不过,在高并发的系统下,这个时间戳可以细化到毫秒,否则哪怕时间一致,也是有可能会延迟数千个binlog event的。
【老叶茶馆】MySQL复制中slave延迟监控相关推荐
- MySQL复制中slave延迟监控
通常是根据 Seconds_Behind_Master 的值来判断slave的延迟.这么做大部分情况下尚可接受,但并不够准确,而应该考虑更多因素. 查看slave的状态 mysql> show ...
- 『老叶茶馆』2021年度热文推荐
下面是『老叶茶馆』微信公众号2021年度热文列表,按时间先后顺序列出.有几篇文章值得多次回味,请各位读者们查收. MySQL SQL优化的正确姿势 MySQL数据库CPU问题一则 count 浅析 云 ...
- mysql老叶博客_MySQL binlog后面的编号最大是多大?【老叶茶馆公众号】
MySQL binlog后面的编号最大是多大? 具体文章请关注微信公众号:izhishuedu [知数堂] 知数堂版权所有. 这里我就不啰嗦了,直接上贴代码: 版本:5.7.18 mysql-5.7. ...
- MySQL binlog后面的编号最大是多大?【老叶茶馆公众号】
MySQL binlog后面的编号最大是多大? 原文地址:http://mp.weixin.qq.com/s/gDpWhlBawRal_pQK2huTMA 具体文章请关注微信公众号:izhishued ...
- mysql 存储过程 compile_存储过程 | iMySQL | 老叶茶馆
A.4. MySQL 5.0 FAQ - 存储过程 Questions 26.4.1: MySQL 5.0是否支持存储过程? Does MySQL 5.0 support stored procedu ...
- php调用mysql存储过程报错,php | iMySQL | 老叶茶馆
用PHP控制您的浏览器cache Output Control 函数可以让你自由控制脚本中数据的输出.它非常地有用,特别是对于:当你想在数据已经输出后,再输出文件头的情况.输出控制函数不对使用 hea ...
- Mysql主从同步-Slave延迟状态监控
监控主从同步延迟,同步延迟的检查工作主要从下面两方面着手: 1.一般的做法就是根据Seconds_Behind_Master的值来判断slave的延迟状态. 可以通过监控show slave stat ...
- 老叶倡议:MySQL压力测试基准值
通常,我们会出于以下几个目的对MySQL进行压力测试: 1.确认新的MySQL版本性能相比之前差异多大,比如从5.6变成5.7,或者从官方版本改成Percona分支版本: 2.确认新的服务器性能是否更 ...
- [转发] 老叶观点:MySQL开发规范之我见
原文: http://imysql.com/2015/07/23/something-important-about-mysql-design-reference.shtml 老叶观点:MySQL开发 ...
最新文章
- 实体类自动化生成 vs插件
- Git中.gitignore文件的使用
- CentOS6.4卸载自带的OpenJDK并安装jdk1.6.21
- linux 根据ip查机器名
- 通过反射获得引用程序集信息
- system.argumentnullexception值不能为null_MySQL NULL 值如何处理?
- php mysql 连接不上_php连接不上MySQL问题解决办法_PHP教程
- tomcat端口修改后在Eclipse中启动无效问题解决
- Android 再爆新漏洞,9.0 以下所有手机全部中招!
- 计算机主板设置中的英语,技嘉主板bios设置(进BIOS按什么键+中英文对照设置教程)...
- 科普:智能电话机器人语音识别技术
- linux系统实现TTS(文字转语音)功能
- Windows10应用磁贴如何显示
- 十月美剧精听总结 - 权力的游戏「Game of Throne」 黑袍纠察队「The boys」 老无所依「No Country for the old men」
- ToneChip反馈降噪抑制器的UI设计
- 必须要了解的编程基础--哈希与字符串
- 懂车帝上配置高的国产车为什么那么便宜?
- Oracle 储存生僻字
- 新建gitlab分支
- 在CAS Server上增加OAuth2.0协议