关于使用pt-heartbeat监测MySQL主从复制延迟的方法

pt-heartbeat的工作原理通过使用时间戳方式在主库上更新特定表,然后在从库上读取被更新特定表里的时间戳,再与本地系统时间对比来得出其延迟 。
具体流程:
1)在主库上创建一张heartbeat表,按照一定的时间频率更新该表的字段(把时间更新); 监控操作运行后,heartbeat表能促使主从同步 。
2)连接到从库上检查复制的时间记录,和从库的当前系统时间进行比较,得出时间的差异 。
 
一、使用方法(主从和从库上都可以执行监控操作):
pt-heartbeat [OPTIONS] [DSN] —update | —monitor | —check | —stop
注意:需要指定的参数至少有 --stop 、--update、--monitor、--check其中--update,--monitor和--check是互斥的;--daemonize和--check也是互斥 。--ask-pass 隐式输入MySQL密码--charset 字符集设置--check 检查从的延迟,检查一次就退出,除非指定了--recurse会递归的检查所有的从服务器 。--check-read-only 如果从服务器开启了只读模式,该工具会跳过任何插入 。--create-table 在主上创建心跳监控的表,如果该表不存在,可以自己手动建立,建议存储引擎改成memory;通过更新该表知道主从延迟的差距 。CREATE TABLE heartbeat (tsvarchar(26) NOT NULL,server_idint unsigned NOT NULL PRIMARY KEY,filevarchar(255) DEFAULT NULL,positionbigint unsigned DEFAULT NULL,relay_master_log_file varchar(255) DEFAULT NULL,exec_master_log_posbigint unsigned DEFAULT NULL);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,5m,15m] 在--monitor里输出的[]里的记录段,默认是1m,5m,15m 。可以指定1个;如:--frames=1s,多个用逗号隔开 。可用单位有秒(s)、分钟(m)、小时(h)、天(d) 。--interval 检查、更新的间隔时间 。默认是见是1s 。最小的单位是0.01s,最大精度为小数点后两位,因此0.016将自动调整至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 。 
二、演示使用pt-heartbeat
# --master-server-id参数(主库my.cnf里配置的server-id值)a、首先添加表# pt-heartbeat --user=root --password=pwd -S /tmp/mysql.sock -D test --master-server-id=1 --create-table --updateMASTER> select * from heartbeat;+----------------------------+-----------+------------------+-----------+-----------------------+---------------------+| ts | server_id | file| position| relay_master_log_file | exec_master_log_pos |+----------------------------+-----------+------------------+-----------+-----------------------+---------------------+| 2022-09-22T09:48:14.003020 | 1 | mysql-bin.000391| 677136957 | mysql-bin.000180|120 |+----------------------------+-----------+------------------+-----------+-----------------------+---------------------+b、更新主库上的heartbeat(后台运行)# pt-heartbeat --user=root --password=pwd -S /tmp/mysql.sock -D test --master-server-id=1 --update &[1] 31249c、从库上监控延迟# pt-heartbeat --user=root --password=pwd -S /tmp/mysql.sock -D test --master-server-id=1 --monitor --print-master-server-id1.00s [ 0.02s,0.00s,0.00s ] 1#实时延迟: 1分钟延迟,5分钟延迟,15分钟延迟1.00s [ 0.03s,0.01s,0.00s ] 11.00s [ 0.05s,0.01s,0.00s ] 11.00s [ 0.07s,0.01s,0.00s ] 11.00s [ 0.08s,0.02s,0.01s ] 11.00s [ 0.10s,0.02s,0.01s ] 11.00s [ 0.12s,0.02s,0.01s ] 11.00s [ 0.13s,0.03s,0.01s ] 1d、其他操作示例#将主库上的update使用守护进程方式调度# pt-heartbeat --user=root --password=pwd -S /tmp/mysql.sock -D test --master-server-id=1 --update --daemonize#修改主库上的更新间隔为2s# pt-heartbeat --user=root --password=pwd -S /tmp/mysql.sock -D test --master-server-id=1 --update --daemonize --interval=2#停止主库上的pt-heartbeat守护进程# pt-heartbeat --stopSuccessfully created file /tmp/pt-heartbeat-sentinel# rm -rf /tmp/pt-heartbeat-sentinel#单次查看从库上的延迟情况# pt-heartbeat --user=root --password=pwd -S /tmp/mysql.sock -D test --master-server-id=1 --check1.00#使用守护进程监控从库并输出日志# pt-heartbeat --user=root --password=pwd -S /tmp/mysql.sock -D test --master-server-id=1 --monitor --print-master-server-id --daemonize --log=/tmp/slave-heart.log


推荐阅读