今天无意中看到了沃趣网络科技的一篇文章请不要用SECONDS_BEHIND_MASTER来衡量MYSQL主备的延迟时间感觉分析的相当不错,该文章中也提到了使用pt-heartbeat这个工具检测主从延迟时间。而且我转载的一篇博文也说明了Seconds_Behind_Master的真正含义,所以还是决定自己使用pt-heartbeat这个工具,顺便在此记录一下。

工作原理:

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

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

使用方法:

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

在主库上开启守护进程来更新yayun.heartbeat表:

pt-heartbeat -D yayun --update -h master-server --daemonize

监控从的延迟情况:

pt-heartbeat -D yayun --monitor -h slave-server   #一直执行,不退出
pt-heartbeat -D yayun--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.10:3306
Slave 192.168.0.20:

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

[root@yayun_192.168.0.10 ~]# pt-heartbeat --user=root --ask-pass --host=127.0.0.1 --create-table -D yayun --interval=1 --update --replace --daemonize
Enter password:
[root@yayun_192.168.0.10 ~]#
[root@yayun_192.168.0.10 ~]# pgrep -fl pt-heartbeat
4156 perl /usr/bin/pt-heartbeat -D yayun --table=heartbeat --create-table --update -h 127.0.0.1 -uroot --ask-pass --daemonize
[root@yayun_192.168.0.10 ~]#

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

[root@yayun_192.168.0.10 ~]# pt-heartbeat -D yayun --table=heartbeat --monitor -h 192.168.0.20
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;

mysql> create database sbtest;
Query OK, 1 row affected (0.00 sec) mysql>

开始生成100w记录的数据

[root@yayun_192.168.0.10 ~]#  sysbench --test=oltp --oltp-table-size=1000000 --oltp-read-only=off --init-rng=on --num-threads=16 --max-requests=0 --oltp-dist-type=uniform --max-time=1800 --mysql-user=root --mysql-socket=/tmp/mysqld.sock --mysql-password=123456 --db-driver=mysql --mysql-table-engine=innodb --oltp-test-mode=complex prepare
sysbench 0.4.10: multi-threaded system evaluation benchmark Creating table 'sbtest'...
Creating 1000000 records in table 'sbtest'...

再次检测复制延时:

[root@yayun_192.168.0.10 ~]# pt-heartbeat -D yayun --table=heartbeat --monitor -h 192.168.0.20
28.21s [ 0.47s, 0.09s, 0.03s ]
28.72s [ 0.95s, 0.19s, 0.06s ]
29.38s [ 1.44s, 0.29s, 0.10s ]
29.13s [ 1.92s, 0.38s, 0.13s ]
30.85s [ 2.44s, 0.49s, 0.16s ]
31.04s [ 2.96s, 0.59s, 0.20s ]
29.84s [ 3.45s, 0.69s, 0.23s ]
31.24s [ 3.97s, 0.79s, 0.26s ]
32.20s [ 4.51s, 0.90s, 0.30s ]
32.96s [ 5.06s, 1.01s, 0.34s ]
33.82s [ 5.62s, 1.12s, 0.37s ]
34.15s [ 6.19s, 1.24s, 0.41s ]

立马发现效果了哦^_^

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

[root@yayun_192.168.0.10 ~]# pt-heartbeat -D yayun --table=heartbeat --check -h 192.168.0.20
0.00
[root@yayun_192.168.0.10 ~]#

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

[root@yayun_192.168.0.10 ~]# pt-heartbeat --stop
Successfully created file /tmp/pt-heartbeat-sentinel
[root@yayun_192.168.0.10 ~]#

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

总结:

通过pt-heartbeart工具可以很好的弥补默认主从延迟的问题,但需要搞清楚该工具的原理。而默认的Seconds_Behind_Master值是通过将服务器当前的时间戳与二进制日志中的事件时间戳相对比得到的,所以只有在执行事件时才能报告延时。备库复制线程没有运行,也会报延迟null。还有一种情况:大事务,一个事务更新数据长达一个小时,最后提交。这条更新将比它实际发生时间要晚一个小时才记录到二进制日志中。当备库执行这条语句时,会临时地报告备库延迟为一个小时,执行完后又很快变成0。

------------------

对于MySQL数据库主从复制延迟的监控,我们可以借助percona的有力武器pt-heartbeat来实现。pt-heartbeat通过使用时间戳方式在主库上更新特定表,然后在从库上读取被更新的时间戳然后与本地系统时间对比来得出其延迟。本文主要是通过脚本来定期检查从库与主库复制的延迟度并发送邮件,供大家参考。

有关pt-heartbeat工具的安装可以参考:percona-toolkit的安装及简介

1、脚本概述

2、脚本内容

[mysql@SZDB run]$ more ck_slave_lag.sh
#!/bin/bash
#set -x
if [ $# -ne 3 ];then
echo "usage:"
echo "ck_slave_lag.sh <Servier-id> <MaxLag> <LogDir>"
exit 0;
fi # Author : Leshami
# Blog : http://blog.csdn.net/leshami ServerID=$1
MaxLag=$2
LogDir=$3
Timestamp=`date +%Y%m%d_%H%M%S`
Rentition=7
LogFile=$LogDir/slave_lag_$Timestamp.log
LagDetail=$LogDir/slave_lag_Detail_$Timestamp.log
mailadd=leshami@12306.cn echo $ServerID
echo $MaxLag
echo $LogDir
echo $LogFile
echo $LagDetail
echo $mailadd if [ ! -d $LogDir ];then
mkdir -p $LogDir
fi Lag=`/usr/bin/pt-heartbeat --user=monitor --password=xxx -S /tmp/mysql.sock -D test --master-server-id=$ServerID --check`
Lag=`echo ${Lag%.*}`
#Lag=3
echo $Lag
ptStatus=`ps -ef|grep pt-heart|grep daemonize`
echo $ptStatus if [ $Lag -gt $MaxLag ]; then
echo "The current date is `date` at `hostname`." >>$LogFile
echo "The current lag log file is $LogFile." >>$LogFile
echo "The current replication lag is $Lag." >>$LogFile
echo "The replication lag is larger than max lag $MaxLag." >>$LogFile if [ -z "$ptStatus" ] ; then
echo "Start a monitor daemon with below command: " >>$LogFile
echo "pt-heartbeat --user=monitor --password=xxx -S /tmp/mysql.sock -D test " >>$LogFile
echo " --master-server-id=11 --monitor --print-master-server-id --daemonize --log=$LagDetail" >>$LogFile
/usr/bin/pt-heartbeat --user=monitor --password=xxx -S /tmp/mysql.sock -D test \
--master-server-id=$ServerID --monitor --print-master-server-id --daemonize --log=$LagDetail
echo "More detail please check lag log from $LagDetail." >>$LogFile
cat $LogFile | mutt -s "Found slave lag on `hostname`." $mailadd
fi
fi if [ -n "$ptStatus" ] ; then
STime=`ps -ef|grep pt-heart|grep daemonize |gawk '{print $5}'`
Pid=`ps -ef|grep pt-heart|grep daemonize |gawk '{print $2}'`
STime=`date '+%Y%m%d'`" "$STime
s_STime=`date -d "$STime" '+%s'`
s_ETime=`date +%s`
DiffSec=`expr $s_ETime - $s_STime` echo $STime
echo $s_STime
echo $s_ETime
echo $DiffSec if [ "$DiffSec" -gt 1800 ]; then
echo "kill -9 $Pid"
kill -9 $Pid
fi
fi # Remove history slave lag log.
find $LogDir -name "*slave_lag*" -ctime +$Rentition -delete
exit

3、部署参考

[mysql@SZDB run]$ crontab -l

#check slave lag
*/1 * * * * /run/ck_slave_lag.sh 11 3 /log/SlaveLag

pt-heartbeat使用实践的更多相关文章

  1. PT教程 - 应用系列 - ECO修复Timing(理论+实践+脚本分享)

    ​本文转自:自己的微信公众号<集成电路设计及EDA教程> <PT教程 - 应用系列 - ECO修复Timing(理论+实践+脚本分享)> 这篇推文讲一下数字IC设计中的post ...

  2. 深入解析SQL Server并行执行原理及实践(上)

    在成熟领先的企业级数据库系统中,并行查询可以说是一大利器,在某些场景下他可以显著的提升查询的相应时间,提升用户体验.如SQL Server, Oracle等, Mysql目前还未实现,而Postgre ...

  3. 深入解析SQL Server并行执行原理及实践(下)

    谈完并行执行的原理,咱们再来谈谈优化,到底并行执行能给我们带来哪些好处,我们又应该注意什么呢,下面展开. Amdahl’s  Law 再谈并行优化前我想有必要谈谈阿姆达尔定律,可惜老爷子去年已经驾鹤先 ...

  4. Ubuntu14.04+RabbitMQ3.6.3+Golang的最佳实践

    目录 [TOC] 1.RabbitMQ介绍 1.1.什么是RabbitMQ?   RabbitMQ 是由 LShift 提供的一个 Advanced Message Queuing Protocol ...

  5. iOS应用开发最佳实践系列一:编写高质量的Objective-C代码

          本文由海水的味道编译整理,转载请注明译者和出处,请勿用于商业用途! 点标记语法 属性和幂等方法(多次调用和一次调用返回的结果相同)使用点标记语法访问,其他的情况使用方括号标记语法. 良好的 ...

  6. (转)CSS字体大小: em与px、pt、百分比之间的对比

    CSS样式最混乱的一个方面是应用程序中文本扩展的font-size属性.在CSS中,你可以用四个不同的单位度量来显示在web浏览器中的文本 大小.这四个单位哪一种最适合Web? 这个问题引起了广泛的争 ...

  7. 基于开源软件在Azure平台建立大规模系统的最佳实践

    作者 王枫 发布于2014年5月28日 前言 Microsoft Azure 是微软公有云的唯一解决方案.借助这一平台,用户可以以多种方式部署和发布自己的应用. 这是一个开放的平台,除了对于Windo ...

  8. Zookeeper+Kafka+Storm+HDFS实践

    Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据. Hadoop一般用在离线的分析计算中,而storm区别于hadoop,用在实时的流式计算中,被广泛用来 ...

  9. RDS最佳实践(一)—如何选择你的RDS

    在去年双11之前,为了帮助商家准备天猫双11的大促,让用户更好的使用RDS,把RDS的性能发挥到最佳,保障双11当天面对爆发性增加的压力,不会由于RDS的瓶颈导致系统出现问题,编写了 RDS的最佳实践 ...

  10. keepalived+双主实践HA

    工作不怎么忙,搞点儿开发吧差点儿事,就想着弄点儿架构的事儿.正好前段时间看过关于keepalived+双主实现高可用的文章,也恰好身边的朋友所在的公司也部分用这个架构.没什么事儿就搞搞吧,正好对比下M ...

随机推荐

  1. 斜率dp cdq 分治

    f[i] = min { f[j] + sqr(a[i] - a[j]) } f[i]= min { -2 * a[i] * a[j] + a[j] * a[j] + f[j] } + a[i] * ...

  2. 根据终端分配不同的url地址

    <!DOCTYPE HTML> <html lang="zh-CN"> <head> <meta charset="UTF-8& ...

  3. 【转】使用Xcode 6将你的项目本地化

    原文转自:http://www.cocoachina.com/ios/20141004/9827.html iOS和OSX支持40种语言的本地化,Xcode无疑为这一过程提供了强有力的支持.苹果将这一 ...

  4. 图像和滚动 、 编程规范和Xcode(一)

    1 在界面上以各种模式显示图片 1.1 问题 在ios开发中经常需要展示图片以满足需求和美化界面,本案例将学习如何以代码的方式使用UIImageView视图控件来展示图片,如图-1所示: 图-1 1. ...

  5. RegexKitLite 正则表达式

    http://blog.csdn.net/zzfsuiye/article/details/6631466(转--讲得不错) 最 近做一个项目遇到从NSString中获取当中的IP地址使用 Regex ...

  6. nginx的启动,停止命令

    停止操作停止操作是通过向nginx进程发送信号(什么是信号请参阅linux文 章)来进行的步骤1:查询nginx主进程号ps -ef | grep nginx在进程列表里 面找master进程,它的编 ...

  7. Context启动startActivity注意

    intent.setFlags()方法中参数的用例: 很多人使用startActivity时候,会碰到如下的异常:Caused by: android.util.AndroidRuntimeExcep ...

  8. Map-API及详解

    常用API 类别 方法 增加 put.putAll 删除 remove.removeAll.clear 查询 get 取值 entrySet.keySet.values 长度 size 判断 cont ...

  9. ZOJ 1048 Financial Management

    原题链接 题目大意:给出12个月的收入,求一个平均值. 解法:没什么好说的,就是一个除法. 参考代码: #include<stdio.h> int main(){ int i; float ...

  10. ZOJ 1107 FatMouse and Cheese

    原题链接 题目大意:FM在一个街道n*n街道的(0,0)点,在每个网格里放着cheese,他要尽可能多的吃这些cheese.有两个规则:1)他跑的总距离不能超过k步:2)下一个节点的cheese的块数 ...