学习技术需要掌握
作用、原理、安装步骤、工具使用、模拟演示、注意细节、优点缺点
一、作用
pt-heartbeat监听主从延迟不一致,因为如果根据seconds_behind_master变量来判断主从是否一致是不准的,因为 seconds_behind_master 统计的是 从机的IO线程写入event时间戳 和 Sql线程回放event当前时间戳对比,理论上是指的从机的延迟。所以我们需要使用 pt-heartbeat 监控主从延迟,更加准确。
二、原理
pt工具在主库上面创建一张测试表,
(root@localhost) [test]> select * from heartbeat;
+----------------------------+-----------+------------------+-----------+-----------------------+---------------------+
| ts | server_id | file | position | relay_master_log_file | exec_master_log_pos |
+----------------------------+-----------+------------------+-----------+-----------------------+---------------------+
| 2022-05-14T17:23:28.000840 | 129 | mysql-bin.000003 | 429368973 | NULL | NULL |
+----------------------------+-----------+------------------+-----------+-----------------------+---------------------+
以一秒的频率去更新这个的记录并把当前时间写入到heartbeat表中,因为主从的关系,从库也会有这个表,从库也会不停的更新字段,通过从库的ts字段减去主库的ts字段,就得出了主从延迟的实时时间。
三、安装步骤
PT安装不讲哈
四、 如何使用
① 在主库 创建heartbeat表并每1s去更新这个表的时间戳
pt-heartbeat --user=root --password=123456 --host=127.0.0.1 --create-table -D test --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操作
这步执行完以后,查看主库的heartbeat表和从库的heartbeat表有没有变化
② 监控与那个从机的延迟信息
pt-heartbeat -D test --table=heartbeat --master-server-id=129 --monitor -h 192.168.88.130 -uroot -p123456 --interval=1
--master-server-id=129 是主库的server-id,不写这个参数也是可以的
-h 192.168.88.130 -uroot -p123456 从机的信息
--monitor 监控从服务器的参数选项
下面就是返回的结果,第一列是实时延迟,第二列是1分钟延迟,第三列是5分钟延迟,第四列是15分钟延迟
[root@master-129 mysql_data]# pt-heartbeat -D test --table=heartbeat --master-server-id=129 --monitor -h 192.168.88.130 -uroot -p123456 --interval=1
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 ]
0.00s [ 0.00s, 0.00s, 0.00s ]
0.00s [ 0.00s, 0.00s, 0.00s ]
因为我们目前没有跑数据,所以延迟都是0,
五、模拟演示
我们现在需要模拟往主机插入数据。
我们这里不用sysbench工具,而是直接用mysqlslap工具,我们都是在主库进行操作,因为这样才能从机同步哈,我们才可以监听主从的延迟哈,
① 在2.sql中写入
insert into x value(null, 1, 'aaa');
② 执行mysqlslap命令
mysqlslap --query=2.sql -c 4 --number-of-queries=10000000 --create-schema=test
-c 4是4个线程并发执行
③ pt-heartbeat的结果
26.00s [ 20.28s, 4.59s, 1.53s ]
26.00s [ 20.53s, 4.68s, 1.56s ]
26.00s [ 20.78s, 4.77s, 1.59s ]
26.00s [ 21.02s, 4.85s, 1.62s ]
26.00s [ 21.25s, 4.94s, 1.65s ]
26.00s [ 21.48s, 5.03s, 1.68s ]
27.00s [ 21.72s, 5.12s, 1.71s ]
上面的结果可以看出延迟在26S,每秒的延迟在不断的增加,因为我这里主从同步采用的是异步复制。第一列是实时延迟,第二列是1分钟延迟,第三列是5分钟延迟,第四列是15分钟延迟
六、其他的命令参数
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)