pt-heartbeat 监控 MySQL主从延迟

mysql 在进行主从同步时,从库需要拉取主库的 binlog 进行 sql 回放,因此理论上只要主库存在数据更新,就一定存在主从延迟。mysql 提供了Seconds_Behind_Master 参数来计算主从延迟。但是Seconds_Behind_Master参数是精确到秒的。如果存在毫秒级延迟该参数并不能准确获取到。如果期望更精确的获取到主从延迟,Percona Toolkit工具箱提供了 pt-heartbeat 工具可以用来监控主从延迟。

 

背景:

在某次生产环境中,MySQL采用了读写分离。业务反馈一个事务在主库写入数据后,随后读取数据读不到,但是手动登录到从库查看数据已经存在了。因此怀疑主从延迟造成了从库读不到数据。查看了报错时间点的 zabbix 监控,对MySQL 主从延迟的采集周期是30秒一次。且监控显示主从延迟均为0, zabbix 正是获取的Seconds_Behind_Master参数。因 zabbxi 采集周期较长,且Seconds_Behind_Master参数监测主从延迟并不准确。故无法判断事发时刻主从延迟为多少。所以想到了使用 pt-hearttbeat 来检测主从延迟。

 

原理:

pt工具在主库上面创建一张测试表heartbeat

mysql从库延时_mysql

以一秒的频率去更新这个的记录并把当前时间写入到heartbeat表中,因为主从的关系,从库也会有这个表,从库也会不停的更新字段,通过从库的ts字段减去主库的ts字段,就得出了主从延迟的实时时间。

 

安装与使用:

从官方下载安装包,建议下载源码自己编译。percona-toolkit官方下载

perl Makefile.PL  PREFIX=/home/mysql/pt    # 如果不写路径,默认安装到/usr/local/bin
make
make test
make install

如何使用:

1)、在主库创建 heartbeat 表每秒更新这个时间戳

./pt-heartbeat --user=root --password=123456  --host=127.0.0.1 --port=3006 --create-table -D heartbeat --interval=1 --update --replace --daemonize

--daemonize:意思是后台运行,可以先不用这个变量,看一下这个命令执行是否正确

--user=root --password=123456 --host=127.0.0.1 -D test 主库的mysql连接信息和heartbeat表存放的数据库

--update 更新主的heartbeat表,这个参数是后台进程必须的参数也可以用--replace替代

--replace 使用replace替换--UPDATE操作

2)、监控与从库的延迟

./pt-heartbeat -D heartbeat --table=heartbeat --master-server-id=1 --monitor -h127.0.0.1 -uroot -p123456 -P3006 --interval=1

--master-server-id=129 是主库的server-id,不写这个参数也是可以的

-h 192.168.88.130 -uroot -p123456 从机的信息

--monitor 监控从服务器的参数选项

监控结果如下图所示:

第一列是实时延迟,第二列是1分钟延迟,第三列是5分钟延迟,第四列是15分钟延迟 。因为笔者测试的环境没有搭建主从,测单机 mysql 到他自身的延迟,所以都是0

mysql从库延时_mysql从库延时_02

其他参数:

Usage: pt-heartbeat [OPTIONS] [DSN] --update|--monitor|--check|--stop
其中--update, --moniter,--check,--stop都是单独使用的,并且--update, --monitor, and --check are mutually exclusive
--daemonize and --check are mutually exclusive.他们之间还是存在互斥。
Options:
  --ask-pass                  使用密码进行mysql连接时给予提示
  --charset=s             -A  默认的字符选项
  --check                     执行一次从库的监控就结束
  --check-read-only           如果是只读的服务器那么使用该选项会保持插入
  --config=A                  使用逗号分隔,如果指定了,那么该参数作为命令行的第一个选项
  --create-table              如果表不存在创建表heartbeat
  --daemonize                 创建后台的更新shell
  --database=s            -D  指定连接的数据库
  --dbi-driver=s              Specify a driver for the connection; mysql and Pg
                              are supported (default mysql)
  --defaults-file=s       -F  通过提供的文件进行mysql连接
  --file=s                    输出最新的  --monitor监控信息到指定的文件
  --frames=s                  设置时间周期(default 1m,5m,15m)
  --help                      显示帮助信息
  --host=s                -h  指定连接的host
  --[no]insert-heartbeat-row  在使用--tables的时候默认是插入一条记录到表heartbeat前提是表中不存在该记录行 
  --interval=f                指定更新和监控heartbeat表的频率默认是1S
  --log=s                     当使用daemonized进行后台更新操作时输出所有的信息到指定的该文件
  --master-server-id=s        指定主的server-id
  --monitor                   监控从服务器的参数选项
  --password=s            -p  指定密码
  --pid=s                     创建pid文件
  --port=i                -P  指定连接时使用的端口
  --print-master-server-id    打印输出master-server-id
  --recurse=i                 Check slaves recursively to this depth in --check
                              mode
  --recursion-method=a        Preferred recursion method used to find slaves (
                              default processlist,hosts)
  --replace                   使用replace替换--UPDATE操作
  --run-time=m                指定监控的时长,单位有: s=seconds, m=minutes, h=hours, d=days; 如果比指定默认是以秒为单位一直监控下去
  --sentinel=s                Exit if this file exists (default /tmp/pt-
                              heartbeat-sentinel)
  --set-vars=A                Set the MySQL variables in this comma-separated
                              list of variable=value pairs
  --skew=f                    指定执行从库检查的延时时长默认是0.5
  --socket=s              -S  指定连接时使用的socket文件
  --stop                      停止后台更新进程并生成--sentinel指定的文件                              
  --table=s                   指定更新的表(默认是heartbeat)
  --update                    更新主的heartbeat表,这个参数是后台进程必须的参数也可以用--replace替代
  --user=s                -u  指定用户名
  --utc                       忽略系统时间仅使用UTC
  --version                   显示版本信息
  --[no]version-check         Check for the latest version of Percona Toolkit,
                              MySQL, and other programs (default yes)