使用pt-heartbeat检测主从复制延迟

不要用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

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

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

相关文章

麦肯锡报告摘译:未来成功城市的14个特征

来源:TOP产业办公研究院【前言】:本文摘译自麦肯锡发布的一份研究报告。报告来源:McKinsey&Company Report: Thriving amid turbulence: Imagining the cities of the future. Authored by Jonathan Woetzel , Vineet Rajadhyaksha , Joe…

编程关键词介绍...

编程关键词介绍: gcc是GUN compiler Collection (GUN编译器套件),也可以简单理解为编译器,他可以编译多种语言。 GNU是基于Unix开发设计,并且是与Unix兼容的操作系统,该项目由Richard Stallman在1983年创建&#xff…

MATLAB编辑GUI界面

在命令窗口输入:guide 即可进入编辑 若要在GUI界面的一个面板上显示程序中随意给定的字符: 首先创建一个“可编辑文本”(位于左侧工具栏): 双击该面板,弹出该面板的工具栏,设置“string”&am…

单个神经元不可靠!这项新研究推翻以往认知,感知的最大限制在于解码过程...

来源:凹非寺“单个神经元不可靠!”一项关于神经元的研究,让众人看嗨了。这项研究通过在小鼠身上做实验,先展示了神经元“不靠谱”的一面:单个神经元两次对相同视觉刺激的反应,竟然是不一样的。对于神经元的…

(转)MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在

问题描述:在用vs生成MVC时若使用Internet应用程序为模版,项目建好后重新编译下无法通过,弹出错误: 解决方案:问题出来后,询问了身边很多人都是一头雾水,于是乎各种谷歌和百度,还好功…

QT学习笔记(四):Qt5+MSVC编译 中文字符显示乱码问题解决

QT学习笔记(四):Qt5MSVC编译 中文字符显示乱码问题解决问题:1、解决方法一:2、解决方法二:3、解决方法三:4、解决方法四:结果显示:Qt5MSVC编译 中文字符显示乱码。 现在为…

github单独下载某个文件或文件夹

首先下载tortoiseSVN,安装好之后打开github项目的地址,例如https://github.com/rbgirshick/fast-rcnn 单独下载某个文件夹: 如果只需要下载tools这个文件夹, 点进这个文件夹,复制该页面的网址得到https://github.com/…

技术架构大迁徙时代来临,10个关键点读懂数字化转型

来源:THINKTANK新智囊2月,在旧金山举办的IBM Think 2019大会上,IBM CEO、总裁及董事长Ginni Rometty提出当前正在进入数字化重塑2.0阶段(Digital Reinvention, Chapter II):数字化重塑的第二篇章&#xff0…

QT学习笔记(五):Qt5的8种标准对话框示例

QT学习笔记(五):Qt5的8种标准对话框示例前言实例展示1.颜色对话框2.文件对话框3.字体对话框4.输入对话框5.消息对框6.进度对话框7.错误信息对话框8.向导对话框.前言 QT 提供了常用的对话框类型,他们全部继承自QDialog类&#xff…

桌面SVN检出这一选项消失

进入‪C:\Users\“你的计算机名”\Desktop桌面 这个文件夹,找到隐藏文件夹“.svn”,删除这个隐藏文件夹就OK了

在连续发布版本的情况下 如何做好测试?

在连续发布版本的情况下 如何做好测试?1、跟项目经理协商,确定每一个版本的测试重点。比如,只进行基本功能验证,或者是冒烟测试,挑选重要的功能的测试用例,每次只执行这些。比如,只进行主要流程…

张亚勤、刘慈欣、周鸿祎、王飞跃新书推荐,《崛起的超级智能:互联网大脑如何影响科技未来》...

《崛起的超级智能:互联网大脑如何影响科技未来》2019年7月由中信出版社出版,前沿科技趋势研究专家,计算机博士刘锋著。张亚勤、刘慈欣、周鸿祎、王飞跃、约翰翰兹推荐!吕乃基、石勇、吕本富做序。《崛起的超级智能:互联…

QT学习笔记(六):Qt5主窗口框架示例

QT学习笔记&#xff08;五&#xff09;&#xff1a;Qt5主窗口框架代码示例 一、添加编辑菜单&#xff1a;并在下拉菜单和工具栏中添加“打开文件”动作菜单 #include <QToolButton> #include <QSpinBox> #include <QTextEdit> #include <QMdiSubWindow&…

Pytorch 为什么每一轮batch需要设置optimizer.zero_grad

根据pytorch中的backward()函数的计算&#xff0c;当网络参量进行反馈时&#xff0c;梯度是被积累的而不是被替换掉&#xff1b;但是在每一个batch时毫无疑问并不需要将两个batch的梯度混合起来累积&#xff0c;因此这里就需要每个batch设置一遍zero_grad 了。 其实这里还可以…

ARM与RISC-V之争,后起之秀的优势在哪儿?

来源&#xff1a;朗锐智科从2010年夏天开始&#xff0c;伯克利研究团队大约花了四年的时间&#xff0c;设计和开发了一套完整的新的指令集。这个新的指令集叫做RISC-V&#xff0c;指令集从2014年正式发布之初就受到多方质疑&#xff0c;到2017年印度政府表示将大力资助基于RISC…

QT学习笔记(六):QString::arg()函数用法小结

QT学习笔记&#xff08;五&#xff09;&#xff1a;Qt5的QString的arg用法 在QT的QString中&#xff0c;arg方法类似于C中的printf中使用的格式输出符&#xff08;只是有点类似&#xff09;。 在QT5的帮助文档中&#xff0c;可以看出以下几点&#xff1a; 使用arg(str1, str2,…

RuntimeError: DataLoader worker (pid(s) 13512, 280, 21040) exited unexpectedly

pytorch出现这个错误&#xff0c;是因为正在运行的主程序缺少 if __name__ __main__: 在运行的主程序代码之前加上这一句

第三周总结

在第三周的学习中&#xff0c;我们主要学习了循环语句&#xff08;while&#xff0c;do/while,for循环&#xff09;&#xff0c;数组&#xff0c;方法。而重点就在for循环和方法。而对于for循环我要做的就是多练&#xff0c;深入了。但对于方法这一块&#xff0c;我连有时候该怎…

道阻且长,Libra 项目负责人长文回应一切质疑

来源&#xff1a;星球日报当地时间 7 月 3 日&#xff0c;Facebook Libra 项目负责人 David Marcus 于个人 Facebook 发布长文《Libra, 2 weeks in》&#xff0c;就过去两周 Libra 所遇到的一些质疑及误解进行解释。以下为全文内容&#xff1a;自 Libra 正式公开已经两周了&…