【MySQL源码】Seconds_Behind_Master是如何计算的

作为MySQL DBA,相信大家对参数  `Seconds_Behind_Master` 并不陌生,该字段的值可以通过 show  slave status\G的输出,表示主从延迟的时间,单位为秒。监控主从延迟一般取这个值就足够了。0 表示无延迟,理想状态该值不要超过1。如果业务场景中有写后读,而且读的是从库,那么就会对主从延迟要求非常高。

理解了该字段的含义,大家有没有探究过该值是如何计算的?相信大家都可以说出来 是从库的时间 减去 SQL_thread应用到的主库binlog event的时间戳。

今天从官方文档 和 MySQL源码 探寻正确的计算方法 

MySQL官方文档如何解释

原文

翻译

Seconds_Behind_Master

该字段表示复制实例相对于主实例的“延迟”:

  • 当复制实例正在处理更新时,该字段显复制实例上当前时间戳正在处理的事件在主实例上原始时间戳之间的差异。

  • 当复制实例上没有正在处理的事件时,该值为0。

基本上,该字段测量复制实例的SQL线程复制实例的I/O线程之间的秒数差异。如果主实例和复制实例之间的网络连接很快,复制实例的I/O线程非常接近主实例,因此该字段是复制实例的SQL线程相对于主实例的延迟的良好近似值。如果网络速度较慢,这就不是一个良好的近似值;复制实例的SQL线程可能经常追赶读取速度较慢的复制实例的I/O线程,因此Seconds_Behind_Master经常显示为0,即使I/O线程相对于主实例是延迟的。换句话说,该列仅在快速网络中才有用。

即使主实例和复制实例的时钟时间不同,只要在复制实例的I/O线程启动时计算的差异保持不变,此时间差异计算就有效。任何更改,包括NTP更新,都可能导致时钟偏差,使Seconds_Behind_Master的计算变得不太可靠。

在MySQL 5.7中,如果复制实例的SQL线程未运行,或者SQL线程已经消耗完中继日志并且复制实例的I/O线程未运行,该字段为NULL(未定义或未知)。 (在MySQL的早期版本中,如果复制实例的SQL线程或复制实例的I/O线程未运行或未连接到主实例,则该字段为NULL。)如果I/O线程正在运行但中继日志用尽,Seconds_Behind_Master设置为0。

Seconds_Behind_Master的值基于存储在事件中的时间戳,这些事件通过复制进行保留。这意味着如果主实例M1本身是主实例M0的复制实例,M1二进制日志中源自M0二进制日志的任何事件都具有M0该事件的时间戳。这使得MySQL能够成功地复制时间戳。然而,对于Seconds_Behind_Master而言,问题在于如果M1还直接从客户端接收更新,那么Seconds_Behind_Master的值会随机波动,因为M1的最后一个事件有时源自M0,有时是M1上的直接更新的结果。

在使用多线程复制时,您应该记住该值基于Exec_Master_Log_Pos,因此可能不反映最近提交的事务的位置。

官方文档的翻译也有两种计算方法 :

方法一:该字段显复制实例上当前时间戳正在处理的事件在主实例上原始时间戳之间的差异

方法二:该字段测量复制实例的SQL线程复制实例的I/O线程之间的秒数差异,前提主实例和复制实例之间的网络连接很快,复制实例的I/O线程非常接近主实例

源码中如何计算

在源码中全局搜索 Seconds_Behind_Master 关键字 ,排除测试文件,出现Seconds_Behind_Master关键字的文件也就几个。找到关于计算Seconds_Behind_Master 源码。

注释中也给出了 计算Seconds_Behind_Master 的伪代码 

  /*The pseudo code to compute Seconds_Behind_Master:if (SQL thread is running){if (SQL thread processed all the available relay log){if (IO thread is running)print 0;elseprint NULL;}elsecompute Seconds_Behind_Master;}elseprint NULL;*/

// 伪代码:计算 Seconds_Behind_Masterif (SQL 线程正在运行) {if (SQL 线程已处理所有可用的中继日志) {if (IO 线程正在运行) {输出 0;  // I/O 线程正在运行,但中继日志已用尽,因此 Seconds_Behind_Master 设置为 0。} else {输出 NULL;  // I/O 线程不在运行,因此 Seconds_Behind_Master 为 NULL。}} else {计算 Seconds_Behind_Master;  // 计算复制实例相对于主实例的延迟。}
} else {输出 NULL;  // SQL 线程不在运行,因此 Seconds_Behind_Master 为 NULL。
}

真实代码 

  if (mi->rli->slave_running){/*Check if SQL thread is at the end of relay logChecking should be done using two conditionscondition1: compare the log positions andcondition2: compare the file names (to handle rotation case)*/if ((mi->get_master_log_pos() == mi->rli->get_group_master_log_pos()) &&(!strcmp(mi->get_master_log_name(), mi->rli->get_group_master_log_name()))){if (mi->slave_running == MYSQL_SLAVE_RUN_CONNECT)protocol->store(0LL);elseprotocol->store_null();}else{long time_diff= ((long)(time(0) - mi->rli->last_master_timestamp)- mi->clock_diff_with_master);/*Apparently on some systems time_diff can be <0. Here are possiblereasons related to MySQL:- the master is itself a slave of another master whose time is ahead.- somebody used an explicit SET TIMESTAMP on the master.Possible reason related to granularity-to-second of time functions(nothing to do with MySQL), which can explain a value of -1:assume the master's and slave's time are perfectly synchronized, andthat at slave's connection time, when the master's timestamp is read,it is at the very end of second 1, and (a very short time later) whenthe slave's timestamp is read it is at the very beginning of second2. Then the recorded value for master is 1 and the recorded value forslave is 2. At SHOW SLAVE STATUS time, assume that the differencebetween timestamp of slave and rli->last_master_timestamp is 0(i.e. they are in the same second), then we get 0-(2-1)=-1 as a result.This confuses users, so we don't go below 0: hence the max().last_master_timestamp == 0 (an "impossible" timestamp 1970) is aspecial marker to say "consider we have caught up".*/protocol->store((longlong)(mi->rli->last_master_timestamp ?max(0L, time_diff) : 0));}}else{protocol->store_null();}

具体计算方式 

      long time_diff= ((long)(time(0) - mi->rli->last_master_timestamp)- mi->clock_diff_with_master);

这行代码计算了一个名为 time_diff 的长整型变量,其值是当前时间(通过 time(0) 获取)与主实例上最后一个事件的时间戳mi->rli->last_master_timestamp)之间的差异减去主从实例之间的时钟差异mi->clock_diff_with_master)。这个 time_diff 的值表示当前时间与主实例最后一个事件的时间戳之间的秒数差异,减去主从实例之间的时钟差异。

   clock_of_slave - last_timestamp_executed_by_SQL_thread - clock_diff_with_master
 

  /*The difference in seconds between the clock of the master and the clock ofthe slave (second - first). It must be signed as it may be <0 or >0.clock_diff_with_master is computed when the I/O thread starts; for this theI/O thread does a SELECT UNIX_TIMESTAMP() on the master."how late the slave is compared to the master" is computed like this:clock_of_slave - last_timestamp_executed_by_SQL_thread - clock_diff_with_master*//*主时钟和从属时钟之间的差异(second - first)。它必须是有符号的,因为它可能 <0 或 >0。clock_diff_with_master 是在 I/O 线程启动时计算的;为此,I/O 线程在主实例上执行 SELECT UNIX_TIMESTAMP()。“从属相对于主实例的延迟”是这样计算的:clock_of_slave - last_timestamp_executed_by_SQL_thread - clock_diff_with_master
*/

参考 

官方文档 Seconds_Behind_Master 解释

MySQL :: MySQL 5.7 Reference Manual :: 13.7.5.34 SHOW SLAVE STATUS Statement

MySQL 复制延迟 Seconds_Behind_Master 究竟是如何计算的 - 知乎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/644214.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

iou的cpu和gpu源码实现

本专栏主要是深度学习/自动驾驶相关的源码实现,获取全套代码请参考 简介 IoU&#xff08;Intersection over Union&#xff09;是一种测量在特定数据集中检测相应物体准确度的一个标准&#xff0c;通常用于目标检测中预测框&#xff08;bounding box&#xff09;之间准确度的…

C语言|算术操作符相关题目

下面代码的结果是&#xff1a;( ) #include <stdio.h> int main() {int a, b, c;a 5;c a;b c, c, a, a;b a c;printf("a %d b %d c %d\n:", a, b, c);return 0; }A.a 8 b 23 c 8 B.a 9 b 23 c 8 C.a 9 b 25 c 8 D.a 9 b 24 c 8 解析&…

SSM项目集成Spring Security 4.X版本(使用spring-security.xml 配置文件方式)

目录 前言 实战开发&#xff1a; 一、Spring Security整合到SSM项目 1. pom文件引入包 2. web.xml 配置 3. 添加 spring-security.xml 文件 二、Spring Security实战应用 1. 项目结构 2. pom文件引入 3. web.xml 配置 4. Spring 配置 applicationContext.xml 5. sp…

Gartner:浪潮信息居全球服务器份额第二,中国第一

近日&#xff0c;国际权威研究机构高德纳&#xff08;Gartner&#xff09;公布《2023年第3季度全球服务器市场追踪报告》&#xff0c;2023Q3全球服务器出货量为280.6万台&#xff0c;同比下降17.0%&#xff0c;销售额为329.3亿美元&#xff0c;同比增长9.6%。浪潮信息服务器蝉联…

2-SAT问题相关理论和算法

前言 SAT 问题简介 SAT是可满足性、适定性(Satisfiability)问题的简称。一般形式为k-适定性问题或k-可满足性问题&#xff0c;简称 k-SAT。 何为布尔可满足性问题&#xff1f;给定一条真值表达式&#xff0c;包含逻辑变量、逻辑与、逻辑或以及非运算符&#xff0c;如&#x…

BioTech - 量子化学与分子力场

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/135787607 量子化学是应用量子力学的规律和方法来研究化学问题的一门学科&#xff0c;主要关注分子的结构、性质和反应过程。 量子化学的理论方法…

Redis解决方案:NOAUTH Authentication required(连接jedis绑定密码或修改redis密码)

Redis解决方案&#xff1a;NOAUTH Authentication required&#xff08;连接jedis绑定密码或修改redis密码&#xff09; Java使用jedis连接redis时出现错误NOAUTH Authentication required 一、问题报错和原因 本地设置了redis的密码&#xff0c;但在远程连接时并没有输入密…

定向减免!函数计算让 ETL 数据加工更简单

业内较为常见的高频短时 ETL 数据加工场景&#xff0c;即频率高时延短&#xff0c;一般费用大头均在函数调用次数上&#xff0c;推荐方案一般为攒批处理&#xff0c;高额的计算成本往往令用户感到头疼&#xff0c;函数计算推出定向减免方案&#xff0c;让 ETL数据加工更简单、更…

浅谈手机APP测试(流程)

前言 APP测试是一个广泛的概念&#xff0c;根据每个app的应用场景不一样&#xff0c;测试的方向也略微的不同&#xff0c;在测试过程中需要灵活应用自身所知的测试手段。 今天就跟大家简单聊聊手机APP测试的一些相关内容。 APP开发流程 &#xff08;1&#xff09; 拿到需求分…

2024年,IT行业下一个就业风口在哪?

搜狐&#xff1a;我宣布与华为达成鸿蒙全面合作&#xff01; 美团&#xff1a;我宣布与华为达成鸿蒙全面合作&#xff01; 360 &#xff1a;我宣布与华为达成鸿蒙全面合作&#xff01; 高德&#xff1a;我宣布与华为达成鸿蒙全面合作&#xff01; 新浪&#xff1a;我宣布与华为…

一站式解决钉钉开票与金蝶云星辰对接问题,让企业管理更轻松!

客户介绍 某企业服务有限公司专注于为企业提供全方位、高质量的企业服务&#xff0c;致力于于企业管理咨询、企业形象策划、市场营销策划、财务管理咨询等方面。该公司拥有一支经验丰富、专业化的团队&#xff0c;他们深入了解企业需求&#xff0c;为客户提供个性化的解决方案…

MoEs学习

和多任务学习的mmoe很像哦&#xff08;有空再学习一下&#xff09;moe layer的起源&#xff1a;Switch Transformers paper MoE moe由两个结构组成&#xff1a; Moe Layer &#xff1a;这些层代替了传统 Transformer 模型中的前馈网络 (FFN) 层。MoE 层包含若干“专家”(例如…

如何使用阿里云CDN服务?

如何使用阿里云CDN服务 一、开通阿里云CDN服务 注册自己阿里云账号&#xff0c;找到CDN服务&#xff0c;进行加速即可 二、配置域名信息 1、各配置参数的含义 添加加速域名&#xff1a; 如果需要使用CDN加速指定网站上的业务&#xff0c;则需要将该网站作为源站&#xff0…

“豚门”、“吗喽”,为啥品牌宣传瞄上网红动物?

近期&#xff0c;新茶饮品牌喜茶联名红山动物园&#xff0c;凭借可爱周边拿捏无数消费者&#xff0c;再往前一段时间&#xff0c;还有奈雪联名“吗喽”表情包&#xff0c;为什么品牌宣传会瞄上网红动物&#xff0c;今天媒介盒子就来和大家聊聊。 一、 萌元素引起用户情绪共鸣 …

蓝桥杯---三羊献瑞

观察下面的加法算式: 其中,相同的汉字代表相同的数字,不同的汉字代表不同的数字。 请你填写“三羊献瑞”所代表的4位数字(答案唯一),不要填写任何多余内容。 答案 代码 public class _03三羊献瑞 {public static void main(String[] args) {//c 生 b 瑞 g 献 d 辉…

如何系统学习机器学习?

要系统学习机器学习&#xff0c;首先需要掌握一些基础编程技能&#xff0c;如Python。其次&#xff0c;学习基础的数学概念&#xff0c;如线性代数、概率论和统计学。然后&#xff0c;选择一些优质的在线课程和教材进行深入学习。最后&#xff0c;通过实践项目来巩固所学知识。…

html火焰文字特效

下面是代码&#xff1a; <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>HTML5火焰文字特效DEMO演示</title><link rel"stylesheet" href"css/style.css" media"screen" type&quo…

2024.1.23 GNSS 零散知识 学习笔记

1.天线种类 2.接收机 2.四大导航系统的介绍 3.卫星高度与轨道卫星种类 4.GNSS有哪些应用 5.在空间保持静⽌或匀速直线运动(⽆加速度)的坐标系称为惯性坐标系。 6.地⼼惯性坐标系实际上并没有满⾜能成为惯性坐标系的条件&#xff1a; ⾸先&#xff0c;地球及其质⼼都在围绕太阳…

[计算机提升] 切换(域)用户

4.14 切换(域)用户 4.14.1 为什么要切换用户 在Windows系统中&#xff0c;切换用户的主要目的是为了实现多用户共享同一台计算机的便利和安全。当多个人需要使用同一台计算机时&#xff0c;每个人可以登录自己的用户账户&#xff0c;这样可以避免互相干扰和混淆数据。 以下是…

《深入解析Java虚拟机:从JVM体系结构到垃圾回收算法》

文章目录 JVM体系结构JVM的组成 类加载器Class Loader类加载器的作用双亲委派机制JVM自带三个类加载器Bootstrap ClassLoader-根加载器ExtClassLoader-扩展加载器AppClassLoader-应用类加载器 Java历史-沙箱安全机制沙箱概念沙箱的作用本地代码和远程代码沙箱安全机制模型JDK1 …