利用pt-heartbeat监控复制延迟

主从延迟介绍

一般mysql主从监控通过show slave status查看SECONDS_BEHIND_MASTER的值来判断主从是否有延迟。但是SECONDS_BEHIND_MASTER并不能准确的反映出数据库的延迟情况,而且此值是秒级。如果有业务系统需要更精确的主从延迟级别(如毫秒级),这样可以通过pt-heartbeat实现对mysql或PostgreSQL主从复制的监控。

工作原理

pt-heartbeat通过真实的主从数据复制来确认复制延迟,这样就避免了对复制机制本身的依赖,从而能得出准确的延迟时间。
1. 在主库上创建一张heartbeat表,--update线程在指定的时间间隔(--interval)更新一个时间戳(心跳记录),心跳表可能包含多个主的心跳记录,通过server_id来区分。
按照一定的时间频率更新该表的字段(把时间更新进去)。
2. 连接到从上检查复制的时间记录,和从库的当前系统时间进行比较,得出时间的差异。通过pt-heartbeat的--monitor线程或者--check线程连接到从库,检查复制来自主库的心跳记录(即前面更新的时间戳),并和当前系统时间进行比较,得出时间差值,该值则用于判断延迟。(需要主库与从库保持时间同步)

pt-heartbeat使用说明

pt-heartbeat默认一秒更新一次心跳记录,默认检查精度为0.01秒。

常用操作如下:

启用后台进程定时更新主库心跳记录
pt-heartbeat -D test --table=heartbeat --create-table -h master-host --daemonize --update


检查一次主从延迟后退出
pt-heartbeat -D test --table=heartbeat -h slave-host --check


持续监控主从延迟情况并将结果输出到/tmp/slave_delay.txt文件中
pt-heartbeat -D test --table=heartbeat -h slave-host --monitor --file /tmp/slave_delay.txt


默认--create-table会创建如下表,建议该表存储引擎改成memory。该表会一直更新ts和file、position,通过更新该表可以知道主从延迟的差距。
CREATE TABLE heartbeat (
  ts                    varchar(26) NOT NULL,
  server_id             int unsigned NOT NULL PRIMARY KEY,
  file                  varchar(255) DEFAULT NULL,    -- SHOW MASTER STATUS
  position              bigint unsigned DEFAULT NULL, -- SHOW MASTER STATUS
  relay_master_log_file varchar(255) DEFAULT NULL,    -- SHOW SLAVE STATUS
  exec_master_log_pos   bigint unsigned DEFAULT NULL  -- SHOW SLAVE STATUS
);

常用参数:
- --daemonize :后台执行
- --interval=f:指定更新心跳表的频率(默认为1.0秒)
- --master-server-id=s:监控与此主库的延迟情况,适用于级联复制等情况,默认为直接主库。
- --check :检查一次主从延迟后退出
- --monitor :持续监控主从延迟情况
- --update :定时更新主库心跳记录
- --check-read-only:如果从服务器开启了只读模式,该工具会跳过任何插入。
- --create-table:如果指定的表不存在,则会自动创建
- --file=s:将monitor检测结果输出到指定文件
- --run-time=m:指定运行时长,默认单位为秒
- --skew=f:指定延迟检查的频率,默认为0.5秒
- --frames=s:统计一段时间内的平均延迟时长,默认显示1m,5m,15m的平均延迟时长
- --stop:关闭后台运行的进程。

pt-heartbeat测试

对主库的心跳表定时写入
shell> pt-heartbeat -D test --table=heartbeat --create-table -h 10.141.8.92 -uroot -p --log=/tmp/log.log --daemonize --update


mysql> select * from heartbeat;
+----------------------------+-----------+------------------+-----------+-----------------------+---------------------+
| ts                         | server_id | file             | position  | relay_master_log_file | exec_master_log_pos |
+----------------------------+-----------+------------------+-----------+-----------------------+---------------------+
| 2016-12-01T04:44:58.000920 |        92 | mysql-bin.000131 | 164361120 | NULL                  |                NULL |
+----------------------------+-----------+------------------+-----------+-----------------------+---------------------+
1 row in set (0.00 sec)


通过监控可以得知,延迟目前在58秒。
shell> pt-heartbeat -D test --table=heartbeat -h 10.141.8.101 -uroot -p --check
58.327


持续监控延迟状况
shell> pt-heartbeat -D test --table=heartbeat -h 10.141.8.101 -uroot -p --monitor
43.002s [ 0.717s, 0.143s, 0.048s ]
44.002s [ 1.450s, 0.290s, 0.097s ]
44.005s [ 2.184s, 0.437s, 0.146s ]
44.001s [ 2.917s, 0.583s, 0.194s ]
44.007s [ 3.650s, 0.730s, 0.243s ]
45.004s [ 4.400s, 0.880s, 0.293s ]
45.002s [ 5.150s, 1.030s, 0.343s ]
45.015s [ 5.901s, 1.180s, 0.393s ]
46.008s [ 6.667s, 1.333s, 0.444s ]
46.007s [ 7.434s, 1.487s, 0.496s ]
47.001s [ 8.218s, 1.644s, 0.548s ]




停止pt-heartbeat守护进程
shell> pt-heartbeat --stop
Successfully created file /tmp/pt-heartbeat-sentinel


此时服务器创建了一个/tmp/pt-heartbeat-sentinel文件,再次daemonize启动时,需要删除掉该文件,如果此文件存在,不能正常启动。

小结

Seconds_Behind_Master值是通过将服务器当前的系统时间戳与二进制日志中的事件时间相对比得到的,而pt-heartbeat测试的是真实的数据复制过程中消耗的时间。一般来说Seconds_Behind_Master获取更为简单,基本上可以满足大多数主从延迟监控的需要,而pt-heartbeat更准确,推荐读写分离时对延迟精确度要求高的时候使用。

你可能感兴趣的:(MySQL相关工具)