下载
获取安装包
下载链接:http://www.percona.com/software/percona-toolkit
编译安装
tar zxvf percona-toolkit-3.0.12_x86_64.tar.gz
cd percona-toolkit-3.0.12
perl Makefile.PL (安装到非缺省目录 perl Makefile.PL PREFIX=${HOME})
make
make test
make install
Seconds_Behind_Master
主从信息相关参数:
Slave_IO_Running: I/O线程是否被启动并成功地连接到主服务器上。
Slave_SQL_Running: SQL线程是否被启动。
Seconds_Behind_Master:其值可能为NULL、0、大于0
该参数值是 通过比较 sql_thread执行的event的timestamp 和 io_thread复制好的 event的timestamp(简写为ts) 进行比较,而得到的这么一个 差值
- 当从库sql线程上没有事件被执行时,
Seconds_Behind_Master
的值为0,表示主从复制良好,可以认为延迟不存在。 Seconds_Behind_Master
有可能为NULL值,当SQL线程或IO线程没有在执行,或者IO线程在执行但连不上主库时。
缺点
如果主库的网络延迟较大并且I/O阻塞严重。从库的 IO线程 拉取主库的二进制出现 阻力(没有中断,也在复制。sql线程 也能 同步上 IO线程。但是,实际上此时的 从库数据进度 已经落后 主库的数据进度。因此,该参数 并不能 完全衡量 MySQL主从延迟状况。
pt-heartbeat
pt-heartbeat 为 percona-toolkit工具包中的一个,安装完 percona-toolkit 之后可以使用
原理
- 主库上存在一个用于检查延迟的表heartbeat,可手动或自动创建。
- pt-heartbeat使用--update参数连接到主库上并持续(根据设定的--interval参数)使用一个时间戳更新到表heartbeat。
- pt-heartbeat使用--monitor 或--check连接到从库,检查从主库同步过来的时间戳,并与当前系统时间戳进行比对产生一个差值, 该值则用于判断延迟。
验证
添加 heartbeat 表
root@LAPTOP-FPIQJ438:/mysql-master/data# pt-heartbeat --user=root --password=123456 -S /tmp/mysql.sock -D test --master-server-id=1 --create-table --update &
[2] 3231
root@LAPTOP-FPIQJ438:/mysql-master/data#
查看验证
mysql> select * from heartbeat;
+----------------------------+-----------+---------------+----------+-----------------------+---------------------+
| ts | server_id | file | position | relay_master_log_file | exec_master_log_pos |
+----------------------------+-----------+---------------+----------+-----------------------+---------------------+
| 2024-01-29T16:36:45.002280 | 1 | binlog.000001 | 598828 | NULL | NULL |
+----------------------------+-----------+---------------+----------+-----------------------+---------------------+
1 row in set (0.00 sec)
更新主库上的 heartbeat
root@LAPTOP-FPIQJ438:/mysql-master/data# pt-heartbeat --user=root --password=123456 -S /tmp/mysql.sock -D test --master-server-id=1 --update &
[3] 3233
root@LAPTOP-FPIQJ438:/mysql-master/data#
从库上监控延迟
pt-heartbeat --user=root --password=123456 -S /tmp/mysql-slave.sock -D test --master-server-id=1 --monitor --print-master-server-id
注意: --master-server-id 为主库的ID。
主从同步正常
停止
root@LAPTOP-FPIQJ438:/mysql-slave# pt-heartbeat --stop
Successfully created file /tmp/pt-heartbeat-sentinel
root@LAPTOP-FPIQJ438:/mysql-slave#
[2]- Done pt-heartbeat --user=root --password=123456 -S /tmp/mysql.sock -D test --master-server-id=1 --create-table --update
[3]+ Done pt-heartbeat --user=root --password=123456 -S /tmp/mysql.sock -D test --master-server-id=1 --update
root@LAPTOP-FPIQJ438:/mysql-slave#
停掉主库上的 pt-heartbeat 进程
再次观察
root@LAPTOP-FPIQJ438:/mysql-slave# rm -rf /tmp/pt-heartbeat-sentinel
root@LAPTOP-FPIQJ438:/mysql-slave#
root@LAPTOP-FPIQJ438:/mysql-slave#
root@LAPTOP-FPIQJ438:/mysql-slave# pt-heartbeat --user=root --password=123456 -S /tmp/mysql-slave.sock -D test --master-server-id=1 --monitor --print-master-server-id
43.00s [ 0.72s, 0.14s, 0.05s ] 1
44.00s [ 1.45s, 0.29s, 0.10s ] 1
45.00s [ 2.20s, 0.44s, 0.15s ] 1
46.00s [ 2.97s, 0.59s, 0.20s ] 1
47.00s [ 3.75s, 0.75s, 0.25s ] 1
48.00s [ 4.55s, 0.91s, 0.30s ] 1
49.00s [ 5.37s, 1.07s, 0.36s ] 1
50.00s [ 6.20s, 1.24s, 0.41s ] 1
51.00s [ 7.05s, 1.41s, 0.47s ] 1
52.00s [ 7.92s, 1.58s, 0.53s ] 1
由于主库上的心跳表已经不更新了,从库认为与主库的延迟越来越大。
注意:停止了后台更新进程会在 /tmp目录 下面产生一个 pt-heartbeat-sentinel 文件,下次 再启动 该后台进程 之前 必须 先删除该文件,否则无法启动。