不要用SECONDS_BEHIND_MASTER来衡量MYSQL主备的延迟时间,原因如下:

A:备库Seconds_behand_master值是通过将服务器当前的时间戳与二进制日志中的事件的时间戳对比得到的,所以只有在执行事件时才能报告延迟

B:如果备库复制线程没有运行,就会报延迟为null

C:一些错误,如主备的max_allowed_packet不匹配或者网络不稳定时,可能中断复制或者停止复制线程,但Seconds_behand_master将显示为0而不是显示错误

D:即使备库线程正在运行,备库有时候可能无法计算延迟时,如果发生这种情况,备库会报0或者null

E:一个较大的事务可能导致延迟波动,如:有一个事务更新数据长达一个小时,最后提交,这条更新将比它实际发生时间要晚一个小时才记录到二进制日志中,当备库执行这条语句时,会临时地报告备库延迟一个小时,然后很快又变回0

F:如果分发主库落后了,并且其本身也有已经追赶上它的备库,备库的延迟将显示为0,而事实上备库和源主库之间此时是有延迟的。

解决这些问题的办法是忽略这个值,并使用一些可以直接观察和衡量的方式来监控备库延迟,最好的解决办法是使用heartbeat record,这是一个在主库上每秒更新一次的时间戳,为了计算延迟,可以直接用备库当前的时间戳减去心跳记录的值,这个方法能够解决刚刚提到的所有问题,另外一个额外的好处是我们还可以通过时间戳知道备库当前的复制状况,包含在percona toolkit里的pt-heartbeat脚本是复制心跳的最流行的一种实现。

心跳还有其他好处,记录在二进制日志中的心跳记录拥有许多用途,如:在一些很难解决的场景下可以用于灾难恢复。

pt-heartbeat介绍:

工作原理:

1,在主上创建一张heartbeat表,按照一定的时间频率更新该表的字段(把时间更新进去)。

2,从主库连接到从上检查复制的时间记录,和从库的当前系统时间进行比较,得出时间的差异。

 

使用方法:

shell > pt-heartbeat [OPTIONS] [DSN] --update|--monitor|--check|--stop

在主库上创建一个测试库,测试库里创建好heartbeat表,然后开启守护进程来更新xiaoboluo.heartbeat表:

mysql > create database xiaoboluo;

mysql > CREATE TABLE heartbeat (

  ts                    varchar(26) NOT NULL,server_id             int unsigned NOT NULL PRIMARY KEY,file                  varchar(255) DEFAULT NULL,    -- SHOW MASTER STATUSposition              bigint unsigned DEFAULT NULL, -- SHOW MASTER STATUSrelay_master_log_file varchar(255) DEFAULT NULL,    -- SHOW SLAVE STATUSexec_master_log_pos   bigint unsigned DEFAULT NULL  -- SHOW SLAVE STATUS
);
 

shell > pt-heartbeat -D xiaoboluo --update -h localhost --user=username --password=password --daemonize

在主库上监控从的延迟情况:

shell > pt-heartbeat -D xiaoboluo --monitor -h slave-server #一直执行,不退出pt-heartbeat -D xiaoboluo --check h=slave-server       #执行一次就退出

 

常用参数:

注意:需要指定的参数至少有 --stop,--update,--monitor,--check。其中--update,--monitor和--check是互斥的,--daemonize和--check也是互斥。

--ask-pass
隐式输入MySQL密码--charset
字符集设置--check
检查从的延迟,检查一次就退出,除非指定了--recurse会递归的检查所有的从服务器。--check-read-only 如果从服务器开启了只读模式,该工具会跳过任何插入。 --create-table 在主上创建心跳监控的表,如果该表不存在。可以自己建立,建议存储引擎改成memory。通过更新该表知道主从延迟的差距。 CREATE TABLE heartbeat ( ts varchar(26) NOT NULL, server_id int unsigned NOT NULL PRIMARY KEY, file varchar(255) DEFAULT NULL, -- SHOW MASTER STATUS position bigint unsigned DEFAULT NULL, -- SHOW MASTER STATUS relay_master_log_file varchar(255) DEFAULT NULL, -- SHOW SLAVE STATUS exec_master_log_pos bigint unsigned DEFAULT NULL -- SHOW SLAVE STATUS 

);
heratbeat表一直在更改ts和position,而ts是我们检查复制延迟的关键。--daemonize
执行时,放入到后台执行--user
-u,连接数据库的帐号--database
-D,连接数据库的名称--host
-h,连接的数据库地址--password
-p,连接数据库的密码--port
-P,连接数据库的端口--socket
-S,连接数据库的套接字文件--file 【--file=output.txt】
打印--monitor最新的记录到指定的文件,很好的防止满屏幕都是数据的烦恼。--frames 【--frames=1m,2m,3m】
在--monitor里输出的[]里的记录段,默认是1m,5m,15m。可以指定1个,如:--frames=1s,多个用逗号隔开。可用单位有秒(s)、分钟(m)、小时(h)、天(d)。--interval
检查、更新的间隔时间。默认是见是1s。最小的单位是0.01s,最大精度为小数点后两位,因此0.015将调整至0.02。--log
开启daemonized模式的所有日志将会被打印到制定的文件中。--monitor
持续监控从的延迟情况。通过--interval指定的间隔时间,打印出从的延迟信息,通过--file则可以把这些信息打印到指定的文件。--master-server-id
指定主的server_id,若没有指定则该工具会连到主上查找其server_id。--print-master-server-id
在--monitor和--check 模式下,指定该参数则打印出主的server_id。--recurse
多级复制的检查深度。模式M-S-S...不是最后的一个从都需要开启log_slave_updates,这样才能检查到。--recursion-method
指定复制检查的方式,默认为processlist,hosts。--update
更新主上的心跳表。--replace
使用--replace代替--update模式更新心跳表里的时间字段,这样的好处是不用管表里是否有行。--stop
停止运行该工具(--daemonize),在/tmp/目录下创建一个“pt-heartbeat-sentinel” 文件。后面想重新开启则需要把该临时文件删除,才能开启(--daemonize)。--table
指定心跳表名,默认heartbeat。

测试环境:

Master  192.168.0.68:3306

Slave   192.168.0.38:3306

1,在主上运行:--daemonize表示守护进程,后台运行。

[root@xiaoboluo_192.168.0.68 ~]# pt-heartbeat --user=root --ask-pass --host=127.0.0.1 --create-table -D xiaoboluo --interval=1 --update --replace --daemonize

Enter password:

[root@xiaoboluo_192.168.0.68 ~]#

[root@xiaoboluo_192.168.0.68 ~]# pgrep -fl pt-heartbeat4156perl /usr/bin/pt-heartbeat -D xiaoboluo --table=heartbeat --create-table --update -h 127.0.0.1 -uroot --ask-pass --daemonize

[root@xiaoboluo_192.168.0.68 ~]#

3.在主上运行监测复制延迟

[root@xiaoboluo_192.168.0.68 ~]# pt-heartbeat -D xiaoboluo --table=heartbeat --monitor -h 192.168.0.68

0.00s [  0.00s,  0.00s,  0.00s ]
0.00s [  0.00s,  0.00s,  0.00s ]
0.00s [  0.00s,  0.00s,  0.00s ]
0.00s [  0.00s,  0.00s,  0.00s ]
0.00s [  0.00s,  0.00s,  0.00s ]

0表示从没有延迟。 [ 0.00s, 0.00s, 0.00s ] 表示1m,5m,15m的平均值。可以通过--frames去设置。

我们这里看见复制没有延迟,那么我们可以使用压力工具测试一下(这里因为是虚拟机做测试,性能比较差,所以直接使用存储过程循环插入数据做测试了)。在主库创建测试数据库sbtest,随便创建一个测试表:sbtest;

mysql>create database sbtest;

Query OK, 1 row affected (0.00 sec)

mysql>create table sbtest(id int unsigned not null auto_increment primary key,test varchar(20));

创建存储过程:

mysql > delimiter $$

mysql > create procedure test_sbtest(in test_times int)
-> begin
-> set @x = 0;
-> ins: loop
-> set @x = @x + 1;
-> if @x = test_times then
-> leave ins;
-> end if;
-> insert into sbtest(test) values('test_sbtest');
-> end loop ins;
-> end $$
Query OK, 0 rows affected (0.01 sec)
mysql > delimiter ;
mysql > call test_sbtest(100000);  #这里调用存储过程循环写入10W次,会有一段时间
Query OK, 0 rows affected (5 min 22.40 sec)

再次检测复制延时:

[root@xiaoboluo_192.168.0.68 ~]# pt-heartbeat -D xiaoboluo --table=heartbeat --monitor -h 192.168.0.38

0.00s [  0.00s,  0.00s,  0.00s ]
0.00s [  0.00s,  0.00s,  0.00s ]
0.00s [  0.00s,  0.00s,  0.00s ]
0.00s [  0.00s,  0.00s,  0.00s ]
0.00s [  0.00s,  0.00s,  0.00s ]
0.00s [  0.00s,  0.00s,  0.00s ]
0.00s [  0.00s,  0.00s,  0.00s ]
0.00s [  0.00s,  0.00s,  0.00s ]
0.00s [  0.00s,  0.00s,  0.00s ]
0.00s [  0.00s,  0.00s,  0.00s ]
0.00s [  0.00s,  0.00s,  0.00s ]
5.34s [  0.09s,  0.02s,  0.01s ]
0.00s [  0.09s,  0.02s,  0.01s ]
0.00s [  0.09s,  0.02s,  0.01s ]
0.00s [  0.09s,  0.02s,  0.01s ]
0.00s [  0.09s,  0.02s,  0.01s ]
0.00s [  0.09s,  0.02s,  0.01s ]
0.00s [  0.09s,  0.02s,  0.01s ]
0.00s [  0.09s,  0.02s,  0.01s ]
0.00s [  0.09s,  0.02s,  0.01s ]

1.07s [  0.11s,  0.02s,  0.01s ]

在上面的输出结果中红色字体部分可以看到延迟输出了

我们还可以使用--check监测一次就退出:

[root@xiaoboluo_192.168.0.68 ~]# pt-heartbeat -D xiaoboluo --table=heartbeat --check -h 192.168.0.38

0.00

[root@xiaoboluo_192.168.0.68 ~]#

注意:如果想把这个输出结果加入自动化监控,那么可以使用如下命令使监控输出写到文件,然后使用脚本定期过滤文件中的最大值作为预警即可:

pt-heartbeat -D xiaoboluo --monitor -h 192.168.0.38  --log=/tmp/b.txt  --daemonize  #注意--log选项必须在有--daemonize参数的时候才会打印到文件中,且这个文件的路径最好在/tmp下,否则可能因为权限问题无法创建
 
#下面是定期过滤--log文件中最大值的脚本,加入监控调用即可:
#!/bin/bash
cat /tmp/b.txt > /tmp/b_tmp.txt
echo > /tmp/b.txt
max_time=`cat /tmp/b_tmp.txt |grep -v '^$' |awk '{print $1}' |sort -k1nr |head -1`

echo "$max_time"

2,如何关闭主上面执行的后台进程。可以用参数--stop 去关闭:

[root@xiaoboluo_192.168.0.68 ~]# pt-heartbeat --stop #注意,这个命令会把所有的pt-heartbeat进程都停掉

Successfully created file /tmp/pt-heartbeat-sentinel

[root@xiaoboluo_192.168.0.68 ~]#

这样就把在主上开启的进程杀掉了,后续要继续开启后台进行的话,需要把/tmp/pt-heartbeat-sentinel 文件删除,否则启动不了

更多详细资料请参考:

http://www.percona.com/doc/percona-toolkit/2.1/pt-heartbeat.html

转载于:https://www.cnblogs.com/xiaoboluo768/p/5147425.html

使用pt-heartbeat检测主从复制延迟相关推荐

  1. oneproxy检测主从复制同步延迟

    Q:为什么要实现读写分离延迟检测? A:就好比你在ATM机存钱,你老婆收到短信后乐呵呵的拿网银APP查看,结果钱没过来.其实钱已经到账了,只是查询的ATM机节点钱还没过来.所以我们dba要监控数据,一 ...

  2. MySQL的主从复制延迟问题

    主从复制延迟产生的原因 当主库的TPS并发较高时,产生的DDL数量超过slave一个sql线程所能承受的范围,那么延时就产生了,当然还有就是可能与slave的大型query语句产生了锁等待. 解决方法 ...

  3. mysql的innodb如何定位锁问题,mysql如何减少主从复制延迟?

    mysql的innodb如何定位锁问题: 在使用 show engine innodb status检查引擎状态时,发现了死锁问题 在5.5中,information_schema 库中增加了三个关于 ...

  4. mysql的innodb如何定位锁问题_mysql的innodb如何定位锁问题,mysql如何减少主从复制延迟?...

    mysql的innodb如何定位锁问题: 在使用 show engine innodb status检查引擎状态时,发现了死锁问题 在5.5中,information_schema 库中增加了三个关于 ...

  5. 怎样解决MySQL数据库主从复制延迟的问题?

    1.网络超时 2.慢查询 3.流量 问题一:主库的从库太多,导致复制延迟 从库数据以3-5个为宜,要复制的从节点数量过多,会导致复制延迟 问题二:从库硬件比主库差,导致复制延迟 查看Master和Sl ...

  6. MySQL 5.7主从复制从零开始设置及全面详解——实现多线程并行同步,解决主从复制延迟问题!

    MySQL 5.7主从复制从零开始设置及全面详解--实现多线程并行同步,解决主从复制延迟问题! 参考文章: (1)MySQL 5.7主从复制从零开始设置及全面详解--实现多线程并行同步,解决主从复制延 ...

  7. MySQL主从复制延迟原因及处理思路

    简单概述一下复制逻辑: 1.主库将对数据库实例的变更记录到binlog中. 2.主库会有binlog dump线程实时监测binlog的变更并将这些新的events推给从库(Master has se ...

  8. mysql如何减少主从复制延迟?

    mysql如何减少主从复制延迟: 如果延迟比较大,就先确认以下几个因素: 从库硬件比主库差,导致复制延迟 主从复制单线程,如果主库写并发太大,来不及传送到从库 就会导致延迟.更高版本的mysql可以支 ...

  9. 【踩坑记录】记一次MySQL主从复制延迟的坑

    最近开发中遇到的一个MySQL主从延迟的坑,记录并总结,避免再次犯同样的错误. 情景 一个活动信息需要审批,审批之后才能生效.因为之后活动要编辑,编辑后也可能触发审批,审批中展示的是编辑前的活动内容, ...

最新文章

  1. opencv3异常 库找不到 no such file
  2. 黑马lavarel教程---13、分页
  3. 散列(hash)练习题
  4. 认认真真推荐几个机器学习和Python类的公众号
  5. 计算机网络恶搞图片,网络恶搞图片遭-搜狐新闻
  6. mysql自动生成日期序列号_mysql – 在一天内为实体生成唯一的序列号
  7. 基于python的文件加密传输系统 毕业论文_20183411 李丞灏 2020-2021 《python程序设计》 实验三 加密传输文件 实验报告...
  8. daily scrum 11.27
  9. python的内置函数是什么_python_内置函数
  10. 习题4-8 高空坠球(20 分)
  11. (5)数据结构-栈顺序存储
  12. RegisterWaitForSingleObject的使用
  13. ASP 中用Ctrl+Enter提交表单
  14. 两款实用免费的文档免积分下载工具,支持百度文库、豆丁网等
  15. JavaScript弹窗
  16. CKEditor5安装LaTeX数学公式插件
  17. 诗经 - 小雅 -采薇
  18. 基于腾讯地图定位组件实现周边POI远近排序分布图
  19. win10删除*某些设置由你的组织来管理
  20. Android 10 新增物理按键

热门文章

  1. 【完美解决方案】module ‘cv2.cv2‘ has no attribute ‘xfeatures2d‘
  2. 智慧交通day02-车流量检测实现09:SORT/deepSORT
  3. windows 访问linux中的mongodb,MongoDB的linux系统下的安装与连接
  4. 十五、MySQL变量(系统变量、自定义变量)相关知识总结
  5. LeetCode MySQL 1270. 向公司CEO汇报工作的所有人
  6. LeetCode 1368. 使网格图至少有一条有效路径的最小代价(BFS最短路径,难)
  7. LeetCode 76. 最小覆盖子串(滑动窗口)
  8. python scipy库函数solve用法_如何在中使用事件scipy.integrate.solve_ivp
  9. 为什么百度统计里面的广告那么多_里面东西一模一样的桶装方便面为什么比袋装贵那么多?...
  10. 服务器select与gevent