暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

mysql-second_behind_master解读

古刹幽幽 2024-04-07
793

second_behind_master解读:
  second_behind_master=从库当前的系统时间-SQL线程当前重放的事务在主库的开始时间戳-主从之间的系统时间差(这个一般没有)。

=======
通过上述代码(省略),我们可以得出如下结论:
1.Seconds_Behind_Master为0 的条件是SQL线程已经重放完所有的relay log且slave_IO_Running为 Yes。
2.在以下两种情况中,Seconds Behind_Master会为NULL。
  Slave_SQL_Running为No。
  Slave_SQL_Running为Yes,在重放完所有的relay log时,Slave_I0_Running 不为 Yes。

但是上面的伪代码并没有说明seconds_Behind_Master 具体是如何计算的,所以接下来我们看看对应的源码(省略)。
但在具体计算时,针对 STATEMENT格式和 ROW格式的计算方法又不相同,来看下面这个测试(省略):
1.statement格式:
  当 seconds_Behind_Master达到最大值时,从库的系统时间是 09:53:43,且主从时间一致。09:53:43减去 9:53:25 等于 18秒,但为何此时 Seconds_Behind_Master 的值是9秒呢?
  由于减去了sql在主库的执行时间: 所以 对于statement格式  second_behind_master=从库当前的系统时间-SQL线程当前重放的事务在主库的开始时间戳-exec_time-主从之间的系统时间差(这个一般没有)。
2.row格式:
  从库的主机时间是10:07:42,事务开始执行的时间是10:07:18,由于主从时间同步,10:07:42减去10:07:18等于24秒,和Seconds_Behind_Master 的最大值 24秒吻合。

=========
Seconds Behind_Master的局限性:
通过上面的分析,我们对 Seconds_Behind_Master 已经有了比较深人的了解。接下来,我们说说它的局限性。
1.Seconds_Behind_Master 只能衡量 SQL线程的延迟情况,不能衡量 IO 线程的延迟情况。
  考虑以下3种场景:
   1.出于网络原因,主库的binlog不能及时发送到从库上。
   2.从库磁盘 IO达到瓶颈,导致主库的二进制日志事件无法及时写人relay log。
   3.参数 slave_net_timeout 设置得较大,在复制的过程中,如果主从网络断开,从库不会及时感知到。
  在上面3个场景中,因为从库的relay log已重放完,且io进程状态为yes,所以Seconds_Behind_Master 会显示为0。但实际上,从库已经延迟了。
2.对于STATEMENT格式和ROW格式的事务,Seconds_Behind_Master 的计算逻辑并不一样如果不熟悉这两者之间的区别,就很容易感到困惑。
3.不适用于级联复制场景。如果二级从库出现了延迟,对于其他级别的从库,Seconds_Behind_Master大概率会为0。


=====================================================================================================

如何监控主从延迟:
1.pt-heartbeat工具: -------极度依赖系统时间,要求两系统时间无差
  (1)首先针对主库执行,定期更新主库的心跳表。
    pt-heartbeat -h 192.168.244.10 -upt_user -p pt_pass --database percona --update -daemonize
   其中的参数解释如下。
   口--update:对于主库,必须指定--update,它会以每秒一次的频率更新 heartbeat 表。
   口--database:heartbeat表所属的数据库。在使用前,必须手动创建。
   口--daemonize:让脚本以后台进程的方式运行。
   注意,如果是第一次运行,还需指定--create-table,创建heartbeat表
 (2)其次针对从库执行,检查从库的主从延迟情况。
  此时,需指定--monitor或者--check,其中--monitor是持续检测,每秒输出一次。例如:
  pt-heartbeat -h 192.168,244,20 -u pt_user -p pt pass --database percona --monitor
       113.00s[1.88s,0.38s,0.13s3.785]
 输出一共有4列,第1列是当前的延迟时间,第2、第3、第4列分别是最近1分钟、5分钟和15分钟内的平均延迟情况。
 也可指定--check,只检测一次。例如:
  pt-heartbeat -h 192.168.244.20 -u pt_user -p pt_pass --database percona --check

2.mysql8.0 原生解决方案:
  MySQL 8.0原生的解决方案。它主要基于 performance_schema.replication_applier_status_by_worker 中的 APPLYING_TRANSACTION_ORIGINAL_COMMIT_TIMESTAMP,
  这个字段记录了当前正在重放的事务在主库的提交时间。

  所以,可通过以下SQL查看主从延迟情况:
  select case
          when min_commit_timestamp is null then 0
         else unix_timestamp(now(6))-unix_timestamp(min_commit_timestamp)
         end as seconds_behind_master
from(
   select min(applying_transaction_original_commit_timestamp) as min_commit_timestamp
  from performance_schema.replication_applier_status_by_worker
   where applying_transaction <>''
)t;

这条 SOL语句同样适用于多线程复制。

最后修改时间:2024-04-07 14:50:16
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论