在MySQL复制环境中,我们通常只根据 Seconds_Behind_Master 的值来判断SLAVE的延迟。这么做大部分情况下尚可接受,但并不够准确,而应该考虑更多因素。

首先,我们先看下SLAVE的状态:

  1. yejr@imysql.com [(none)]> show slave status\G
  2. *************************** . row ***************************
  3. Slave_IO_State: Waiting for master to send event
  4. ***
  5. Master_Log_File: mysql-bin.
  6. Read_Master_Log_Pos:
  7. Relay_Log_File: mysql-relay-bin.
  8. Relay_Log_Pos:
  9. Relay_Master_Log_File: mysql-bin.
  10. Slave_IO_Running: Yes
  11. Slave_SQL_Running: Yes
  12. ***
  13. Skip_Counter:
  14. Exec_Master_Log_Pos:
  15. Relay_Log_Space:
  16. ***
  17. Seconds_Behind_Master: 3296
  18. ***

可以看到 Seconds_Behind_Master 的值是 3296,也就是SLAVE至少延迟了 3296 秒。

我们再来看下SLAVE上的2个REPLICATION进程状态:

  1. yejr@imysql.com [(none)]> show full processlist\G
  2. *************************** . row ***************************
  3. Id:
  4. User: system user
  5. Host:
  6. db: NULL
  7. Command: Connect
  8. Time:
  9. State: Waiting for master to send event
  10. Info: NULL
  11. *************************** . row ***************************
  12. Id:
  13. User: system user
  14. Host:
  15. db: NULL
  16. Command: Connect
  17. Time:
  18. State: Updating
  19. 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值异常,比如变成负数,或者非常大。

来看下面几个状态:

  1. #设置pager,只查看关注的几个status值
  1. 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

  1. yejr@imysql.com [(none)]> show processlist; show slave status\G
  2. | | system user | | NULL | Connect | | Waiting for master to send event | NULL |
  3. | | system user | | NULL | Connect | | Has read all relay log;**
  4. Read_Master_Log_Pos:
  5. Exec_Master_Log_Pos:
  6. Seconds_Behind_Master: 0

#和上面一样

  1. yejr@imysql.com [(none)]> show processlist; show slave status\G
  2. | | system user | | NULL | Connect | | Waiting for master to send event | NULL |
  3. | | system user | | NULL | Connect | | Has read all relay log;**
  4. Read_Master_Log_Pos:
  5. Exec_Master_Log_Pos:
  6. Seconds_Behind_Master: 0

#这时有活跃SQL了,Time值是和 Seconds_Behind_Master 一样,即SQL线程比IO线程“慢”了1秒

  1. yejr@imysql.com [(none)]> show processlist; show slave status\G
  2. | | system user | | NULL | Connect | | Waiting for master to send event | NULL |
  3. | | system user | | floweradmin | Connect | | Updating | update **
  4. Read_Master_Log_Pos:
  5. Exec_Master_Log_Pos:
  6. Seconds_Behind_Master:

#和上面一样

  1. yejr@imysql.com [(none)]> show processlist; show slave status\G
  2. | | system user | | NULL | Connect | | Waiting for master to send event | NULL |
  3. | | system user | | floweradmin | Connect | | Updating | update **
  4. Read_Master_Log_Pos:
  5. Exec_Master_Log_Pos:
  6. Seconds_Behind_Master: 1

好了,最后我们说下如何正确判断SLAVE的延迟情况:

1、首先看 Relay_Master_Log_FileMaster_Log_File 是否有差异;

2、如果Relay_Master_Log_FileMaster_Log_File 是一样的话,再来看Exec_Master_Log_PosRead_Master_Log_Pos 的差异,对比SQL线程比IO线程慢了多少个binlog事件;

3、如果Relay_Master_Log_FileMaster_Log_File 不一样,那说明延迟可能较大,需要从MASTER上取得binlog status,判断当前的binlog和MASTER上的差距;

因此,相对更加严谨的做法是: 在第三方监控节点上,对MASTER和SLAVE同时发起SHOW BINARY LOGSSHOW SLAVE STATUS\G的请求,最后判断二者binlog的差异,以及 Exec_Master_Log_PosRead_Master_Log_Pos 的差异。

例如: 在MASTER上执行SHOW BINARY LOGS 的结果是:

  1. +------------------+--------------+
  2. | Log_name | File_size |
  3. +------------------+--------------+
  4. | mysql-bin.000009 | 1073742063 |
  5. | mysql-bin.000010 | 107374193 |
  6. +------------------+--------------+

而在SLAVE上执行SHOW SLAVE STATUS\G 的结果是:

  1. Master_Log_File: mysql-bin.000009
  2. Read_Master_Log_Pos: 668711237
  3. Relay_Master_Log_File: mysql-bin.000009
  4. Slave_IO_Running: Yes
  5. Slave_SQL_Running: Yes
  6. ***
  7. Exec_Master_Log_Pos: 654409041
  8.  
  9. ***
  10. Seconds_Behind_Master: 3296
  11. ***
  1.  

这时候,SLAVE实际的延迟应该是: mysql-bin.000009 这个binlog中的binlog position 1073742063 和 SLAVE上读取到的binlog position之间的差异延迟,即:

  1. 1073742063 - 654409041 = 419333022 binlog event

并且还要加上 mysql-bin.000010这个binlog已经产生的107374193个binlog event,共

  1. 107374193 + 419333022 = 526707215 binlog event

后记更新:

1、可以在MASTER上维护一个监控表,它只有一个字段,存储这最新最新时间戳(高版本可以采用event_scheduler来更新,低版本可以用cron结合自动循环脚本来更新),在SLAVE上读取该字段的时间,只要MASTER和SLAVE的系统时间一致,即可快速知道SLAVE和MASTER延迟差了多少。不过,在高并发的系统下,这个时间戳可以细化到毫秒,否则哪怕时间一致,也是有可能会延迟数千个binlog event的。

2、网友(李大玉,QQ:407361231)细心支出上面的计算延迟有误,应该是mysql-bin.000009的最大事件数减去已经被执行完的事件数,即1073742063 – 654409041= 419333022个binlog event,再加上mysql-bin.000010这个binlog已经产生的107374193个binlog event,共526707215 个binlog event。

出自imysql中文网http://imysql.com/2014/08/30/mysql-faq-howto-monitor-slave-lag.shtml

MySQL复制中slave延迟监控的更多相关文章

  1. MySQL至TiDB复制延迟监控

    因生产环境mysql中有较多复杂sql且运行效率低,因此采用tidb作为生产环境的从库进行部分慢sql及报表的读写分离.其中MySQL至TIDB采用Syncer工具同步.关于TIDB的安装及Synce ...

  2. MySQL 5.7--复制延迟监控

    ========================================== SHOW PROCESSLIST方式 为保证二进制日志在从库的执行时间和顺序的正确性,二进制日志中的每个语句都设置 ...

  3. 监控Mysql主从环境下Slave延迟状态的操作记录

    在MySQL主从环境下,通常会根据Seconds_Behind_Master的值来判断slave的延迟状态,这么做在大部分情况下尚可接受,但其实是并不够准确的.对于Slave延迟状态的监控,应该考虑多 ...

  4. mysql主从同步(4)-Slave延迟状态监控

    mysql主从同步(4)-Slave延迟状态监控  转自:http://www.cnblogs.com/kevingrace/p/5685511.html 之前部署了mysql主从同步环境(Mysql ...

  5. mysql主从同步(3)-percona-toolkit工具(数据一致性监测、延迟监控)使用梳理

    转自:http://www.cnblogs.com/kevingrace/p/6261091.html 在mysql工作中接触最多的就是mysql replication mysql在复制方面还是会有 ...

  6. mysql复制延迟监控脚本

    #!/bin/sh #ocpyang@126.com #repdelay.sh #查看复制延迟详细多少event #####1.juede the rep slave status export bl ...

  7. zabbix监控mysql主从同步和延迟

    https://blog.csdn.net/natmazz/article/details/90581490 https://www.cnblogs.com/01-single/p/10602610. ...

  8. MySQL主从复制中replicate-ignore-db replicate-wild-ignore-table的应用

    MySQL主从复制中replicate-ignore-db replicate-wild-ignore-table的应用 replicate-ignore-dbreplicate-wild-ignor ...

  9. MySQL 主从同步延迟监控

    MySQL5.7和8.0支持通过 replication_applier_status 表获同步延迟时间,当从库出现延迟后,该表中的字段 REMAINING_DELAY 记录延迟秒数,当没有延迟时,该 ...

随机推荐

  1. How to get Financial Dimension Value from Worker Position[AX2012]

    To get financial dimension value from worker position, add a new method in hcmWorker Table with scri ...

  2. C#高级功能(三)Action、Func,Tuple

    Action和Func泛型委托实际上就是一个.NET Framework预定义的委托,3.5引入的特性.基本涵盖了所有常用的委托,所以一般不用用户重新声明. Action系列泛型委托,是没有返回参数的 ...

  3. UART,USART,SPI,I2C等总线的介绍与区别20160526

    首先来说一下UART和USART的区别: 1.字面意义: UART:universal asynchronous receiver and transmitter通用异步收发器: USART:univ ...

  4. linux下的声卡驱动架构

    1.linux下的声卡驱动架构主要分为OSS架构和ALSA架构. 2.OSS架构 OSS全称是Open Sound System,叫做开放式音频系统,这种早期的音频系统这种基于文件系统的访问方式,这意 ...

  5. 一些关于python的小感想

    python是一门优秀的语言,但随之而来的是大量的知识,各种模块,相信一个人的大脑是很难记住如此多的内容.这时后的我们就应该想办法避免去记忆这么多的内容. 1.查看官方文档(英语很重要,啥也不说了) ...

  6. Bash美化

    首先声明下,这些美化方式都不是我自己想的,而是多个牛人的方法. 第一:简单点 这个方法来自于:http://www.vimer.cn/?p=1554 没有美化前是这样,鼠标光标在很右边: 在.bash ...

  7. [转]Oracle_ProC编程

    1.引言 由于PL/SQL不能用来开发面向普通用户的应用程序,必须借助其他语言或开发工具. 在Linux操作系统下应该用什么语言或开发工具来进行Oracle数据库应用的开发呢?本文将介绍2种方案:Pr ...

  8. C#串口操作类,包括串口读写操作

    串口进行操作的类,其中包括写和读操作,类可设置串口参数.设置接收函数.打开串口资源.关闭串口资源,操作完成后,一定要关闭串口.接收串口数据事件.接收数据出错事件.获取当前全部串口.把字节型转换成十六进 ...

  9. 九度oj 1348 数组中的逆序对

    原题链接:http://ac.jobdu.com/problem.php?pid=1348 归并排序求逆序对... #include<algorithm> #include<iost ...

  10. mac中添加环境变量

    sudo vi /etc/paths 来编辑 paths,将环境变量添加到 paths 中. vim 是一个编辑器,另外还有几个,如:Pico,Emacs.