首页 > 数据库 > MySQL > 正文

MySQL中slave监控的延迟情况分析

2024-07-24 13:07:11
字体:
来源:转载
供稿:网友
这篇文章主要介绍了MySQL中slave监控的延迟情况分析,主要针对MySQL的复制环境情况下,需要的朋友可以参考下
 

在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值异常,比如变成负数,或者非常大。

来看下面几个状态:
 

  1. #设置pager,只查看关注的几个status值 
  2. yejr@imysql.com [(none)]> pager cat | egrep -i 'system user|Exec_Master_Log_Pos|Seconds_Behind_Master|Read_Master_Log_Pos' 
  3.  
  4. #这是没有活跃SQL的情况,Time值是idle time,并且 Seconds_Behind_Master 为 0 
  5. yejr@imysql.com [(none)]> show processlist; show slave status/G 
  6. | 6 | system user | | NULL | Connect | 22004245 | Waiting for master to send event | NULL | 
  7. | 7 | system user | | NULL | Connect | 13 | Has read all relay log;** 
  8. Read_Master_Log_Pos: 445167889 
  9. Exec_Master_Log_Pos: 445167889 
  10. Seconds_Behind_Master: 0 
  11.  
  12. #和上面一样 
  13. yejr@imysql.com [(none)]> show processlist; show slave status/G 
  14. | 6 | system user | | NULL | Connect | 22004248 | Waiting for master to send event | NULL | 
  15. | 7 | system user | | NULL | Connect | 16 | Has read all relay log;** 
  16. Read_Master_Log_Pos: 445167889 
  17. Exec_Master_Log_Pos: 445167889 
  18. Seconds_Behind_Master: 0 
  19.  
  20. #这时有活跃SQL了,Time值是和 Seconds_Behind_Master 一样,即SQL线程比IO线程“慢”了1秒 
  21. yejr@imysql.com [(none)]> show processlist; show slave status/G 
  22. | 6 | system user | | NULL | Connect | 22004252 | Waiting for master to send event | NULL | 
  23. | 7 | system user | | floweradmin | Connect | 1 | Updating | update ** 
  24. Read_Master_Log_Pos: 445182239 
  25. Exec_Master_Log_Pos: 445175263 
  26. Seconds_Behind_Master: 1 
  27.  
  28. #和上面一样 
  29. yejr@imysql.com [(none)]> show processlist; show slave status/G 
  30. | 6 | system user | | NULL | Connect | 22004254 | Waiting for master to send event | NULL | 
  31. | 7 | system user | | floweradmin | Connect | 1 | Updating | update ** 
  32. Read_Master_Log_Pos: 445207174 
  33. Exec_Master_Log_Pos: 445196837 
  34. 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 的结果是:
 

  1. +------------------+--------------+ 
  2. | Log_name | File_size | 
  3. +------------------+--------------+ 
  4. | mysql-bin.000009 | 1073742063 | 
  5. | mysql-bin.000010 | 107374193 | 
  6. +------------------+--------------+ 
?
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表