iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >详解MySQL的Seconds_Behind_Master
  • 960
分享到

详解MySQL的Seconds_Behind_Master

mysqlseconds_behind_master 2022-05-26 11:05:25 960人浏览 安东尼
摘要

目录Seconds_Behind_Master原始实现last_master_timestampclock_diff_with_master其他exec_time时间函数总结Seconds_Behind_Master

目录
  • Seconds_Behind_Master
  • 原始实现
  • last_master_timestamp
  • clock_diff_with_master
  • 其他
    • exec_time
    • 时间函数
  • 总结

    Seconds_Behind_Master

    对于Mysql主备实例,seconds_behind_master是衡量master与slave之间延时的一个重要参数。通过在slave上执行"show slave status;"可以获取seconds_behind_master的值。

    原始实现

    Definition:The number of seconds that the slave sql thread is behind processing the master binary log.

    Type:time_t(long)

    计算方式如下:

    
    rpl_slave.cc::show_slave_status_send_data()
    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);
         else
           protocol->store_null();
       } else {
         long time_diff = ((long)(time(0) - mi->rli->last_master_timestamp) -
                           mi->clock_diff_with_master);
         protocol->store(
             (longlong)(mi->rli->last_master_timestamp ? max(0L, time_diff) : 0));
       }

    主要分为以下两种情况:

    • SQL线程等待IO线程获取主机binlog,此时seconds_behind_master为0,表示备机与主机之间无延时;
    • SQL线程处理relay log,此时seconds_behind_master通过(long)(time(0) ? mi->rli->last_master_timestamp) ? mi->clock_diff_with_master计算得到;

    last_master_timestamp

    定义:

    主库binlog中事件的时间。

    type: time_t (long)

    计算方式:

    last_master_timestamp根据备机是否并行复制有不同的计算方式。

    非并行复制:

    
    rpl_slave.cc:exec_relay_log_event()
    if ((!rli->is_parallel_exec() || rli->last_master_timestamp == 0) &&
        !(ev->is_artificial_event() || ev->is_relay_log_event() ||
         (ev->common_header->when.tv_sec == 0) ||
         ev->get_type_code() == binary_log::FORMAT_DESCRIPTION_EVENT ||
         ev->server_id == 0))
    {
     rli->last_master_timestamp= ev->common_header->when.tv_sec +
                                 (time_t) ev->exec_time;
     DBUG_ASSERT(rli->last_master_timestamp >= 0);
    }

    在该模式下,last_master_timestamp表示为每一个event的结束时间,其中when.tv_sec表示event的开始时间,exec_time表示事务的执行时间。该值的计算在apply_event之前,所以event还未执行时,last_master_timestamp已经被更新。由于exec_time仅在Query_log_event中存在,所以last_master_timestamp在应用一个事务的不同event阶段变化。以一个包含两条insert语句的事务为例,在该代码段的调用时,打印出event的类型、时间戳和执行时间

    
    create table t1(a int PRIMARY KEY AUTO_INCREMENT ,b longblob) engine=innodb;
    begin;
    insert into t1(b) select repeat('a',104857600);
    insert into t1(b) select repeat('a',104857600);
    commit;

    10T06:41:32.628554Z 11 [Note] [MY-000000] [Repl] event_type: 33 GTID_LOG_EVENT

    2020-02-10T06:41:32.628601Z 11 [Note] [MY-000000] [Repl] event_time: 1581316890

    2020-02-10T06:41:32.628614Z 11 [Note] [MY-000000] [Repl] event_exec_time: 0

    2020-02-10T06:41:32.628692Z 11 [Note] [MY-000000] [Repl] event_type: 2   QUERY_EVENT

    2020-02-10T06:41:32.628704Z 11 [Note] [MY-000000] [Repl] event_time: 1581316823

    2020-02-10T06:41:32.628713Z 11 [Note] [MY-000000] [Repl] event_exec_time: 35

    2020-02-10T06:41:32.629037Z 11 [Note] [MY-000000] [Repl] event_type: 19   TABLE_MAP_EVENT

    2020-02-10T06:41:32.629057Z 11 [Note] [MY-000000] [Repl] event_time: 1581316823

    2020-02-10T06:41:32.629063Z 11 [Note] [MY-000000] [Repl] event_exec_time: 0

    2020-02-10T06:41:33.644111Z 11 [Note] [MY-000000] [Repl] event_type: 30    WRITE_ROWS_EVENT

    2020-02-10T06:41:33.644149Z 11 [Note] [MY-000000] [Repl] event_time: 1581316823

    2020-02-10T06:41:33.644156Z 11 [Note] [MY-000000] [Repl] event_exec_time: 0

    2020-02-10T06:41:43.520272Z 0 [Note] [MY-011953] [InnoDB] Page cleaner took 9185ms to flush 3 and evict 0 pages

    2020-02-10T06:42:05.982458Z 11 [Note] [MY-000000] [Repl] event_type: 19   TABLE_MAP_EVENT

    2020-02-10T06:42:05.982488Z 11 [Note] [MY-000000] [Repl] event_time: 1581316858

    2020-02-10T06:42:05.982495Z 11 [Note] [MY-000000] [Repl] event_exec_time: 0

    2020-02-10T06:42:06.569345Z 11 [Note] [MY-000000] [Repl] event_type: 30    WRITE_ROWS_EVENT

    2020-02-10T06:42:06.569376Z 11 [Note] [MY-000000] [Repl] event_time: 1581316858

    2020-02-10T06:42:06.569384Z 11 [Note] [MY-000000] [Repl] event_exec_time: 0

    2020-02-10T06:42:16.506176Z 0 [Note] [MY-011953] [InnoDB] Page cleaner took 9352ms to flush 8 and evict 0 pages

    2020-02-10T06:42:37.202507Z 11 [Note] [MY-000000] [Repl] event_type: 16    XID_EVENT

    2020-02-10T06:42:37.202539Z 11 [Note] [MY-000000] [Repl] event_time: 1581316890

    2020-02-10T06:42:37.202546Z 11 [Note] [MY-000000] [Repl] event_exec_time: 0

    并行复制:

    
    rpl_slave.cc   mts_checkpoint_routine
    ts = rli->gaq->empty()
              ? 0
              : reinterpret_cast<Slave_job_group *>(rli->gaq->head_queue())->ts;
     rli->reset_notified_checkpoint(cnt, ts, true);
     

    在该模式下备机上存在一个分发队列gaq,如果gaq为空,则设置last_commit_timestamp为0;如果gaq不为空,则此时维护一个checkpoint点lwm,lwm之前的事务全部在备机上执行完成,此时last_commit_timestamp被更新为lwm所在事务执行完成后的时间。该时间类型为time_t类型。

    
    ptr_group->ts = common_header->when.tv_sec +
                       (time_t)exec_time;  // Seconds_behind_master related
    rli->rli_checkpoint_seqno++;
    
    if (update_timestamp) {
     mysql_mutex_lock(&data_lock);
     last_master_timestamp = new_ts;
     mysql_mutex_unlock(&data_lock);
    }

    在并行复制下,event执行完成之后才会更新last_master_timestamp,所以非并行复制和并行复制下的seconds_behind_master会存在差异。

    clock_diff_with_master

    定义:

    • The difference in seconds between the clock of the master and the clock of the 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 the I/O thread does a SELECT UNIX_TIMESTAMP() on the master.
    • type: long
    
    rpl_slave.cc::get_master_version_and_clock()
    if (!mysql_real_query(mysql, STRING_WITH_LEN("SELECT UNIX_TIMESTAMP()")) &&
         (master_res= mysql_store_result(mysql)) &&
         (master_row= mysql_fetch_row(master_res)))
     {
       mysql_mutex_lock(&mi->data_lock);
       mi->clock_diff_with_master=
         (long) (time((time_t*) 0) - strtoul(master_row[0], 0, 10));
       DBUG_EXECUTE_IF("dbug.mts.force_clock_diff_eq_0",
         mi->clock_diff_with_master= 0;);
       mysql_mutex_unlock(&mi->data_lock);
     }

    该差值仅被计算一次,在master与slave建立联系时处理。

    其他

    exec_time

    定义:

    • the difference from the statement's original start timestamp and the time at which it completed executing.
    • type: unsigned long
    
    struct timeval end_time;
    ulonglong micro_end_time = my_micro_time();
    my_micro_time_to_timeval(micro_end_time, &end_time);
    exec_time = end_time.tv_sec - thd_arg->query_start_in_secs();

    时间函数

    (1)time_t time(time_t timer) time_t为long类型,返回的数值仅精确到秒;

    (2)int gettimeofday (struct timeval *tv, struct timezone *tz) 可以获得微秒级的当前时间;

    (3)timeval结构

    
    #include <time.h>
    stuct timeval {
       time_t tv_sec; 
       suseconds_t tv_usec; 
    }

    总结

    使用seconds_behind_master衡量主备延时只能精确到秒级别,且在某些场景下,seconds_behind_master并不能准确反映主备之间的延时。主备异常时,可以结合seconds_behind_master源码进行具体分析。

    以上就是详解MySQL的Seconds_Behind_Master的详细内容,更多关于MySQL Seconds_Behind_Master的资料请关注自学编程网其它相关文章!

    您可能感兴趣的文档:

    --结束END--

    本文标题: 详解MySQL的Seconds_Behind_Master

    本文链接: https://www.lsjlt.com/news/10330.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • 详解MySQL的Seconds_Behind_Master
      目录Seconds_Behind_Master原始实现last_master_timestampclock_diff_with_master其他exec_time时间函数总结Seconds_Behind_Master...
      99+
      2022-05-26
      mysql seconds_behind_master
    • [MySQL管理] Seconds_Behind_Master 解析
      通过show slave status查看到的Seconds_Behind_Master,从字面上来看,他是slave落后master的秒数,一般情况下,也确实这样,我们可以通过Seconds_Behind...
      99+
      2022-10-18
    • MySQL的Seconds_Behind_Master是什么
      这篇文章给大家分享的是有关MySQL的Seconds_Behind_Master是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Seconds_Behind_Master对于mysql主备实例,seconds...
      99+
      2023-06-15
    • MySQL的从库Seconds_Behind_Master延迟总结
      目录MySQL从库Seconds_Behind_Master延迟总结 一、延迟分类1、第一类(成服务器有较高的负载)2、第二类(不会造成服务器有较高的负载)二、相关测试1、Innod...
      99+
      2022-11-12
    • MySQL中备库Seconds_Behind_Master计算的示例分析
      这篇文章主要为大家展示了“MySQL中备库Seconds_Behind_Master计算的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“MySQL中备库...
      99+
      2022-10-18
    • mysql之 误用SECONDS_BEHIND_MASTER衡量MYSQL主备的延迟时间
      链接:http://www.woqutech.com/p=1116 MySQL 本身通过 show slave status 提供了 Seconds_Behind_Mas...
      99+
      2023-06-06
    • MySQL 发生同步延迟时Seconds_Behind_Master还为0的原因
      目录问题描述原理简析问题分析拓展一下总结一下问题描述 用户在主库上执行了一个 alter 操作,持续约一小时。操作完成之后,从库发现存在同步延迟,但是监控图表中的 Seconds_Behind_Master 指标显...
      99+
      2022-05-16
      MySQL 同步延迟 MySQL Seconds_Behind_Master
    • mysql的auto_increment详解
      转载http://blog.csdn.net/fwkjdaghappy1/article/details/7663331 ...
      99+
      2022-10-18
    • Mysql - 详解
      👀导读 Mysql - 数据存储结构Mysql - 存储引擎Mysql - 关系型数据库和非关系型数据库Mysql - 基础知识Mysql - 函数Mysql - 正则表达式Mysq...
      99+
      2023-10-22
      mysql 数据库
    • MySQL详解
      MySQL 1、初识MySQL javaEE:企业级java开发 Web 前端(页面:展示,数据!) 后台(连接点:连接数据库JDBC,连接前端(控制视图跳转和给前端传递数据)) 数据库(存取数据,主要是存数据) 只会写代码,只是一个基...
      99+
      2023-08-18
      经验分享 mysql 数据库
    • MySQL的事务详解
      ✨博客主页: 荣 ✨系列专栏: MySQL ✨一句短话: 难在坚持,贵在坚持,成在坚持! 文章目录 一. 事务的业务场景二. 事务的使用三. 事务的特性(ACID)1. 原子性(Atomicity)2. 一致性(Consistenc...
      99+
      2023-08-17
      mysql 数据库
    • MySQL的索引详解
      一. 索引基础 1.1 简介 在MySQL中,索引(index)也叫做“键(key)”,它是存储引擎用于快速找到记录的一种数据结构。 索引对于良好的性能非常关键,尤其是当表中的数据量越来越大时,索引对性能的...
      99+
      2022-10-18
    • 【MySQL】MySQL索引详解
      Mysql索引 0.写在前面1.为什么要使用索引2.常见的索引模型3.索引维护4.回表?举例子。 0.写在前面 文章中包含了: 1.什么是索引 2.索引的数据结构,以及各自的使用场景 3.为什么要设置主键自增? 4.基于主键...
      99+
      2023-08-16
      mysql 数据库 面试
    • MySQL-Explain详解
      Explain介绍         在select语句之前增加explain关键字,执行后MySQL就会返回执行计划的信息,而不是执行sql。但如果from中包含子查询,MySQL仍会执行该子查询,并把子查询的结果放入临时表中。 ...
      99+
      2023-08-31
      mysql 数据库
    • Mysql Explain详解
      下面是使用 explain 的例子:  在 select 语句之前增加 explain 关键字,MySQL 会在查询上设置一个标记,执行查询时,会返回执行计划的信息,而不是执行这条SQL(如果 from 中包含子查询,仍会执行该...
      99+
      2018-07-28
      Mysql Explain详解
    • mysql -e详解
      可以用shell脚本操作mysql数据库,使用mysql的-e参数可以执行各种sql的(创建,删除,增,删,改、查)等各种操作 。 mysql  -hhostname -Pp...
      99+
      2022-10-18
    • MySQL JDBC详解
      MySQL JDBC是Java连接MySQL数据库的一种方式,JDBC全称为Java Database Connectivity,即...
      99+
      2023-09-11
      MySQL
    • 详解MySQL的半同步
      前言 年后在进行腾讯二面的时候,写完算法的后问的第一个问题就是,MySQL的半同步是什么?我当时直接懵了,我以为是问的MySQL的两阶段提交的问题呢?结果确认了一下后不是两阶段提交,然后面试官看我连问的是啥都不知道...
      99+
      2022-05-14
      MySQL 半同步
    • MySQL sql_mode的使用详解
      前言 相信看过上一篇文章《MySQL案例:一个数据丢失惨案》的童鞋,都应该意识到,sql_mode是一个非常关键的配置,接下来就带来该配置项的详细解析。 sql_mode详解 sql_mode,会直接影响SQL语...
      99+
      2022-05-19
      MySQL sql_mode MySQL sql_mode的使用
    • mysql的锁机制详解
      这段时间一直在学习mysql数据库。项目组一直用的是oracle,所以对mysql的了解也不深。本文主要是对mysql锁的总结。 Mysql的锁主要分为3大类:    表级锁:存储引擎为Myisam。锁住整个表,特点是开销小,加锁快,锁定力...
      99+
      2021-08-13
      mysql的锁机制详解
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作