视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
MySQL主从延迟监控脚本(pt-heartbeat)
2020-11-09 09:11:41 责编:小采
文档


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

有关pt-heartbeat工具的安装可以参考:percona-toolkit的安装及简介
有关pt-heartbeat工具的介绍可以参考:使用pt-heartbeat监控主从复制延迟

1、脚本概述
a、脚本定期使用--check方式单次检查当前的延迟性(定期的方式可以使用cron job比如每1分钟或5分钟)
b、通过设定指定的延迟阀值来判断当时的延迟性是否在可控范围
c、一旦当前的延迟大于指定阀值,则马上使用--monitor方式不停的监控其延迟性并写入到日志文件
d、对于--monitor方式,其进程运行超过30分钟,自kill其进程,以避免无限期运行导致日志过大,空间不够用

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://www.gxlcms.com/

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

下载本文
显示全文
专题