//
pt-heartbeat检测MySQL同步延迟
//
公司今年准备进行某一个机房的业务迁移,需要对新机房的网络做一个测试,为了测试机房的同步延迟,使用了下pt-heartbeat的工具,针对这个工具,总结一下它的基本用法。
01
工具简介
pt-heartbeat是用来检测主从延迟情况的,它比Seconds_behind_master的值更具有参考性,它的整体思路是:
1、在主库上创建一张心跳表heartbeat
2、主库上插入一条带有时间的记录到心跳表中,使用MySQL中的now()函数,
3、然后该记录会复制到slave中,在slave中也声称一个时间
4、slave表根据当前的时间戳减去heartbeat表中的记录值来判断主从的延迟情况。
我们看看这个heartbeat表的表结构:
mysql> show create table heartbeat\G
*************************** 1. row ***************************
Table: heartbeat
Create Table: CREATE TABLE `heartbeat` (
`ts` varchar(26) NOT NULL,
`server_id` int(10) unsigned NOT NULL,
`file` varchar(255) DEFAULT NULL,
`position` bigint(20) unsigned DEFAULT NULL,
`relay_master_log_file` varchar(255) DEFAULT NULL,
`exec_master_log_pos` bigint(20) unsigned DEFAULT NULL,
PRIMARY KEY (`server_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
里面的数据大概如下:
+----------------------------+-----------+-----------------+-----------+-----------------------+---------------------+
| ts | server_id | file | position | relay_master_log_file | exec_master_log_pos |
+----------------------------+-----------+-----------------+-----------+-----------------------+---------------------+
| 2020-03-17T09:56:38.002450 | 192 | mysqlbin.000003 | 51827996 | mysqlbin.000430 | 207392068 |
| 2020-03-17T21:05:22.000830 | 121249 | mysqlbin.000430 | 225253739 | NULL | NULL |
+----------------------------+-----------+-----------------+-----------+-----------------------+---------------------+
ts就是我们的时间值。server_id是服务器的id,file和position是binlog的一些记录,这里我们不做过多关注。
02
具体用法
pt-heartbeat有很多参数,不同的参数有不同的功能,这里先说几个重要的参数:
--update:每秒更新一次heartbeat表的记录
-D,--database:heartbeat表所在的数据库
--create-table:第一次运行是,带上该参数可以在master上创建心跳表并且插入一条记录。
--daemonize:让脚本以后台进程的方式运行
--monitor:该参数是监测延迟并输出结果(持续输出)
--check:该参数监测延迟,但是只输出一次对比结果
Master端:
master端主要的做法是使用--create-table产生表,并且使用--update参数不停的更新表heartbeat中的时间。
/usr/bin/pt-heartbeat -D infra --update -u dba_dbmonitor -p xxxxxxx -P 4306 -h 127.0.0.1 --create-table --daemonize
Slave端:
slave端主要是使用--monitor参数或者--check参数监测对比结果,其中--monitor是监测结果持续输出,--check是只输出一次结果。
[root@ ~]# pt-heartbeat --database infra --monitor -u dba_dbmonitor -p xxxxxxx -P 4306 -h10.xxx.124.100
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 ]
其中,第一列是实施延迟,第二列是1分钟延迟,第三列是5分钟延迟,第四列是15分钟延迟
还需要注意几点:
1、--update, --monitor和--check三者是互斥的,
2、--daemonize只适用于--update场景
3、测试前需要开通主从防火墙
4、要分配主从账号,保证pt-heartbeat能够访问MySQL服务
03
其他参数
这里只写部分参数的个人理解,具体的可以使用pt-heartbeat --help的方式查看帮助文档。
--ask-pass:连接数据库时提示密码
--charset:默认的字符集
--check-read-only:检查server是否是只读的,如果是只读的,则会跳过插入操作
--config:设置配置文件,将参数写进配置文件中,而不是使用参数选项来加载
--create-table-engine:设置heartbeat表的参数引擎
--defaults-file指定参数文件的位置,必须为绝对路径
--file:将最新的--monitor信息输出到文件中
--frames:统计的时间间隔窗口自定义
--interval:插入心跳表的频率修改
--log:当脚本使用守护进程的时候,可以使用--log的方法将脚本的日志打印到一个文件
--master-server-id:指定master的server-id,最新版本的pt工具可以不写
--print-master-server-id:打印master的server-id
--recurse:该参数用来检测复制级联的延迟情况
--table:指定心跳表的名字
--skew:指定check相对于update的延迟时间,也就是在主库进行update之后,多久再在从库上进行对比操作。