MySQL的从库Seconds_Behind_Master延迟总结

目录
  • MySQL从库Seconds_Behind_Master延迟总结
    • 一、延迟分类
      • 1、第一类(成服务器有较高的负载)
      • 2、第二类(不会造成服务器有较高的负载)
    • 二、相关测试
      • 1、Innodb层的行锁造成的延迟
      • 2、MySQL层的MDL LOCK造成的延迟
    • 三、总结

MySQL从库Seconds_Behind_Master延迟总结

一、延迟分类

延迟我们可将其分为两类:

1、第一类(成服务器有较高的负载)

这一类延迟情况可能造成服务器有较高的负载,可能是CPU/IO的负载。因为从库在实际执行Event,如果我们服务器的负载比较高应该考虑这几种情况,关于如何查看线程的负载可以参考29节。

大事务造成的延迟,其延迟不会从0开始增加,而是直接从主库执行了多久开始。比如主库执行这个事务花费的20秒,那么延迟就会从20开始,可以自己细心观察一下很容易看到。这是因为Query Event中没有准确的执行时间,这个在上一节的计算公式中详细描述过了 ,可以参考第8节和第27节。

大表DDL造成的延迟,其延迟会从0开始增加,因为Query Event记录了准确的执行时间。这个在上一节的计算公式中也详细描述过了,可以参考第8节和第27节。

表没有合理的使用主键或者唯一键造成的延迟。这种情况不要以为设置slave_rows_search_algorithms参数为 INDEX_SCAN,HASH_SCAN就可以完全解决问题,原因我们在第24节进行了描述。

由于参数sync_relay_log,sync_master_info,sync_relay_log_info不合理导致,特别是sync_relay_log会极大的影响从库的性能。原因我们在第26节进行过描述,因为sync_relay_log设置为1会导致大量relay log刷盘操作。

是否从库开启了记录binary log功能即log_slave_updates参数开启,如果不是必要可以关闭掉。这种情况我遇到很多次了。

2、第二类(不会造成服务器有较高的负载)

这一类延迟情况往往不会造成服务器有较高的负载。它们要么没有实际的执行Event,要么就是做了特殊的操作造成的。

  • 长期未提交的事务可能造成延迟瞬间增加,因为GTID_EVENT和XID_EVENT是提交时间其他Event是命令发起的时间。这个我们在第27节中举例描述过了。
  • Innodb层的行锁造成的延迟,这种是在从库有修改操作并且和SQL线程修改的数据有冲突的情况下造成的,因为我们前面23节说过SQL线程执行Event也会开启事务和获取行锁,下面我们进行测试。
  • MySQL层的MDL LOCK造成的延迟,这种情况可能是由于SQL线程执行某些DDL操作但是从库上做了锁表操作造成,原因我们已经在23节描述过了,下面我们进行测试。
  • MTS中不合理的设置参数slave_checkpoint_period参数导致,这个在第27节已经测试过了。
  • 在从库运行期间手动改大了从库服务器时间,这个也在第27节已经测试过了。

二、相关测试

因为上面的延迟情形很多我们都已经测试和讲述过了。下面我们测试锁造成的延迟情形。

1、Innodb层的行锁造成的延迟

这个很容测试,我只要先在从库做一个事务和SQL线程修改的数据相同即可以出现,大概测试如下:

从库:

mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> delete from tmpk;
Query OK, 4 rows affected (0.00 sec)
不要提交

主库执行同样的语句
mysql> delete from tmpk;
Query OK, 4 rows affected (0.30 sec)

这个时候你会观察到延迟如下:

如果查看sys.innodb_lock_waits能看到如下的结果:

当然如果查看INNODB_TRX也可以观察到事务的存在,这里就不截图了,大家可以自己试试。

2、MySQL层的MDL LOCK造成的延迟

这种情况也非常容易测试,我们只需要开启一个事务做一个select,然后主库对同样的表做DDL就可以出现如下:

从库:
mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql>
mysql>
mysql> select * from tkkk limit 1;
+------+------+------+
| a    | b    | c    |
+------+------+------+
|    3 |    3 |  100 |
+------+------+------+
1 row in set (0.00 sec)

不要提交,表上MDL LOCK就不会释放

主库执行语句:

mysql> alter table tmpk add testc int ;
Query OK, 0 rows affected (1.14 sec)
Records: 0  Duplicates: 0  Warnings: 0

这个时候你将会看到如下的信息:

我们可以通过state看到这是等待MDL lock获取而导致的延迟,关于MDL lock的详情可以参考文章:

https://www.jb51.net/article/221412.htm

三、总结

通过整个系列,我们应该清楚了Seconds_Behind_Master计算的方法,同时如果出现了延迟,我们首先查看从库是否有负载,根据是否有负载进行区别对待,注意这里的负载一定要使用top -H查看io/sql/worker线程的负载。我曾不止一次的遇到朋友问我延迟问题,当我问他负载如何的时候他告诉我负载不高啊整体负载也就不到2,这里我们应该注意的是对于一个线程只能使用到一个CPU核,虽然整体负载不到2但是可能io/sql/worker线程已经跑满了,实际上负载已经很高了,我们来看下面的这个截图就是sql线程负载高的截图如下:

这个截图我们发现虽然整体负载不高在1多一点,但是Lwp号20092的线程已经跑满了,这个线程就是我们的sql线程,这个时候出现延迟是很可能的,这个截图正是来自一个没有合理使用主键或者唯一键造成的延迟的案例,案例如下:

https://www.jb51.net/article/221396.htm

我们查看CPU负载应该使用top -H去查看,查看io负载可以使用iotop,iostat等工具。我需要强调一下看MySQL负载的时候我们必须用线程的眼光去看

以上就是MySQL从库Seconds_Behind_Master延迟总结的详细内容,更多关于从库Seconds_Behind_Master延迟总结的资料请关注我们其它相关文章!

(0)

相关推荐

  • MySQL数据库Shell import_table数据导入

    目录 MySQL Shell import_table数据导入 1. import_table介绍 2. Load Data 与 import table功能示例 2.1 用Load Data方式导入数据 2.2 用import_table方式导入数据 3. import_table特定功能 3.1 多文件导入(模糊匹配) 3.2 并发导入 3.3 导入速率控制 3.4 自定义chunk大小 4. Load Data vs import_table性能对比 MySQL Shell import_

  • docker实现mysql主从复制的示例代码

    目录 一.概述 1.原理 2.实现 三.创建Slave实例 四.主从配置 总结: 五.参考 一.概述 1.原理 master服务器将数据的改变记录二进制binlog日志,当master上的数据发生改变时,则将其改变写入二进制日志中: slave服务器会在一定时间间隔内对master二进制日志进行探测其是否发生改变,如果发生改变,则开始一个I/OThread请求master二进制事件 同时主节点为每个I/O线程启动一个dump线程,用于向其发送二进制事件,并保存至从节点本地的中继日志中,从节点将启

  • MySQL 发生同步延迟时Seconds_Behind_Master还为0的原因

    目录 问题描述 原理简析 问题分析 拓展一下 总结一下 问题描述 用户在主库上执行了一个 alter 操作,持续约一小时.操作完成之后,从库发现存在同步延迟,但是监控图表中的 Seconds_Behind_Master 指标显示为 0,且 binlog 的延迟距离在不断上升. 原理简析 既然是分析延迟时间,那么自然先从延迟的计算方式开始入手.为了方便起见,此处引用官方版本 5.7.31 的源代码进行阅读.找到计算延迟时间的代码: ./sql/rpl_slave.cc bool show_slav

  • 详解MySQL的Seconds_Behind_Master

    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

  • MySQL命令无法输入中文问题的解决方式

    发现问题 近期通过 mysql 命令连接 mysql server 的时候, 出现了不能输入中文的现象, 如下所示: mysql> SELECT 'Chinese characters <> are stripped'; +------------------------------------+ | Chinese characters <> are stripped | +------------------------------------+ | Chinese ch

  • 当面试官问mysql中char与varchar的区别

    目录 char与varchar的区别 char与varchar的区别 以上就是当面试官问mysql中char与varchar的区别的详细内容,更多关于char与varchar的区别的资料请关注我们其它相关文章!

  • Mysql数据库的主从同步配置

    目录 Mysql主从同步配置 1.安装两个 mysql 2.编写mysql配置文件 3.初始化数据 4.其他mysql 相关命令 Mysql主从同步配置 配置准备: 需要两个数据库 mysql 可视化工具,当然使用用命令行也可以 我这里演示使用 docker 启动两个 mysql 容器, 你也可以安装两个 mysql 前提版本一致 1.安装两个 mysql 创建 msyql 挂载目录 [root@localhost /]# mkdir -p /opt/docker/mysql1/conf/ [r

  • Mysql实现简易版搜索引擎的示例代码

    目录 前言 简介 ngram 全文解析器 创建全文索引 检索方式 1.自然语言检索(NATURAL LANGUAGE MODE) 2.布尔检索(BOOLEAN MODE) 与 Like 对比 总结 前言 前段时间,因为项目需求,需要根据关键词搜索聊天记录,这不就是一个搜索引擎的功能吗? 于是我第一时间想到的就是 ElasticSearch 分布式搜索引擎,但是由于一些原因,公司的服务器资源比较紧张,没有额外的机器去部署一套 ElasticSearch 服务,而且上线时间也比较紧张,数据量也不大,

  • python3文件复制、延迟文件复制任务的实现方法

    使用python版本3.6.1 工作中测试客户端传输报文速率,写了以下两个脚本. 第一个,简单的复制文件并重命名. 第二个,在循环中增加延时的功能. 使用场景将文件复制并重命名(重命名方式在文件末尾加生成的随机数) #!/usr/bin/python3 #coding=GB2312 import os import os.path import random import shutil count = 0 #源文件夹 src="E:\\file\\CEB411Message__201711151

  • MySQL数据库 Load Data 多种用法

    目录 MySQL Load Data 的多种用法 一.LOAD 基本背景 二.LOAD 基础参数 三.LOAD 示例数据及示例表结构 四.LOAD 场景示例 五.LOAD 总结 MySQL Load Data 的多种用法 一.LOAD 基本背景 我们在数据库运维过程中难免会涉及到需要对文本数据进行处理,并导入到数据库中,本文整理了一些导入导出时常见的场景进行示例演示. 二.LOAD 基础参数 文章后续示例均使用以下命令导出的 csv 格式样例数据(以 , 逗号做分隔符,以 " 双引号作为界定符)

随机推荐