使用pt工具检测MySQL主从延迟(r12笔记第7天)

时间:2022-05-05
本文章向大家介绍使用pt工具检测MySQL主从延迟(r12笔记第7天),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

今天翻看了下《高性能MySQL》,真是让人拍手称绝,里面的很多实战思路非常不错,各种问题分析如数家珍,如果是有一定基础的同学,看起来会非常不错。

当然里面提到的一个地方,感觉很有意思,那就是主从延迟的一个测算思路。书中他们是通过建立一张表,插入时间相关的数据,值得一提的是这个表的存储引擎是Federated,主要就是为了完成类似Oracle DB link一样的特殊需求,在备库端来对比这个时间差来得到一个相对精准的延迟值。

当然有的同学可能会说,我们有show slave status里面的Seconds_behind_master的选项嘛,那个可不能当做严格意义上的主从延迟标准,尽管看上去这个值都很小,接近于0.

书中也提到了一个工具,那就是pt-heartbeat。这个工具算是一个比较主流的测试工具,使用起来也非常便捷,安装好pt工具集之后,这只是其中的一个。

工具的安装部署可以参考

Percona-toolkit的安装和配置(r8笔记第86天) MySQL主从不一致的修复过程

我们创建一个用户pt_checksum,方便以后做数据修复等,权限都一并给到。

GRANT SELECT, PROCESS, SUPER, REPLICATION SLAVE ON *.* TO 'pt_checksum'@'10.127.%.%' IDENTIFIED BY 'pt_checksum';

然后我们给予这个用户访问test数据库的权限。

grant all privileges on test.* to pt_checksum@'10.127.%.%';

工具具体的参数可以参考pt-heartbeat --help来看到,我给出要点即可。

我们来创建测试表,在后台启动这个心跳守护进程,其中的create-table就是创建测试表,interval是间隔1秒钟,最小可以到0.01秒,update是更新test库上的这个测试表,而replace则是更新替换表里的时间,无须考虑表里是否有数据,daemonize是后台运行的标注。

pt-heartbeat h='10.127.128.99',u='pt_checksum',p='pt_checksum',P=3306 -D test --create-table --interval=1 --update --replace --daemonize

使用ps命令可以看到如下的heartbeat进程,或者换个口味,用pgrep -fl pt-heartbeat也可以查看。

# ps -ef|grep heartbeat root 19920 1 0 22:35 ? 00:00:00 perl /usr/local/bin/pt-heartbeat h=10.127.128.99,u=pt_checksum,p=pt_checksum,P=3306 -D test --create-table --interval=1 --update --replace --daemonize

接下来的就是重点工作了,我们可以开启monitor选项来监控主从延迟的情况,有一点需要提一下,就是需要设置server-id

# pt-heartbeat h='10.127.xx.xx',u='pt_checksum',p='pt_checksum',P=3306 -D test --table=heartbeat --monitor The --master-server-id option must be specified because the heartbeat table `test`.`heartbeat` uses the server_id column for --update or --check but the server's master could not be automatically determined. Please read the DESCRIPTION section of the pt-heartbeat POD.

主库上快速查看。

> show slave hosts; +-----------+------+------+-----------+--------------------------------------+ | Server_id | Host | Port | Master_id | Slave_UUID | +-----------+------+------+-----------+--------------------------------------+ | 13058 | | 3306 | 20 | c6d66211-a645-11e6-a2b6-782bcb472f63 | +-----------+------+------+-----------+--------------------------------------+ 1 row in set (0.01 sec)

结果和show variables like 'server%'结果是一致的,更快速高效。 我们查看延迟的情况。

# pt-heartbeat h='10.127.xx.xx',u='pt_checksum',p='pt_checksum',P=3306 -D test --table=heartbeat --monitor --master-server-id=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.00s [ 0.00s, 0.00s, 0.00s ]

可以看到目前的环境中是诶呦任何延迟的,方括号里面的指标是什么意思,可以使用frames来定制,比如默认是1m,5m,15m,我们可以定制,比如显示为1m,2m,3m,4m这样。

# pt-heartbeat h='10.127.xx.xx',u='pt_checksum',p='pt_checksum',P=3306 -D test --table=heartbeat --monitor --master-server-id=20 --frames=1m,2m,3m,4m 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,如果用sysbench压一下,立马或有延迟的明显差异。我们在后面整体对比测试一下。

如果想即查即看,就看一次,可以使用check选项,当然这个值就没有frame的时间范围了。

# pt-heartbeat h='10.127.128.99',u='pt_checksum',p='pt_checksum',P=3306 -D test --table=heartbeat --master-server-id=20 --check 0.00

当然有进有出,我们开启了后台守护进程,本质上是个perl脚本,如果要停止,也规范一些,使用stop选项来做,会生辰改一个临时文件,下次需要重新启动的话,需要清理掉这个文件。

# pt-heartbeat h='10.127.xx.xx',u='pt_checksum',p='pt_checksum',P=3306 -D test --stop Successfully created file /tmp/pt-heartbeat-sentinel