pt-heartbeat的功能是监控MySQL复制延迟。
用法如下:
pt-heartbeat [OPTIONS] [DSN] --update|--monitor|--check|--stop
pt-heartbeat测算MySQL或者PostgreSQL服务器上的复制延迟。你可以使用它来更新master或者监控replica。如若可能,pt-heartbeat从你的.my.cnf配置文件读取MySQL连接参数。
①启动守护进程来更新master上的`test`.`heartbeat`库表:
pt-heartbeat -D test --update -h master-server --daemonize
②监控slave上的复制延迟(--dbi-driver Pg表示PostgreSQL):
pt-heartbeat -D test --monitor -h slave-server pt-heartbeat -D test --monitor -h slave-server --dbi-driver Pg
③检查slave延迟一次然后退出(使用表示MySQL连接访问的DSN选项来指定slave服务器):
pt-heartbeat -D test --check h=slave-server
pt-heartbeat是一个由两部分组成的MySQL和PostgreSQL复制延迟监控系统,通过察看具体的被复制的数据来测算延迟,这避免了对不可信的复制机制本身的依赖,例如MySQL的“ SHOW SLAVE STATUS ”。
pt-heartbeat的第一个部分是“ --update ”实例,每“ --interval ”秒连接到master然后更新一个时间戳(“ 心跳记录 ”)。由于heartbeat表可能包含来自多个master的记录,使用服务器ID(@@server_id)来唯一标识记录。
pt-heartbeat的第二个部分是“ --monitor ”或者“ --check ”实例,连接到slave检测从其直接的或者“ --master-server-id ”指定的master复制而来的heartbeat记录,然后计算与当前系统时间的差异。如果介于该master和slave之间的复制存在延迟或者故障,计算而来的差值将会大于零,如果指定“ --monitor ”选项,差值还会潜在增大。
使用pt-heartbeat之前必须在master上要么手动要么使用“ --create-table ”选项创建heartbeat表。对于MySQL而言,推荐使用MEMORY存储引擎,当然这并不是必须的。heartbeat表必须包含一条心跳记录。如若没有默认情况下会插入一条。该特性可以通过“ --[no]insert-heartbeat-row ”选项禁用,以防数据库用户没有INSERT操作权限。heartbeat表的结构具体如下。
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 );
pt-heartbeat仅仅依赖于将被复制到slave的心跳记录,因此不管是什么复制机制(内置复制、例如Continuent Tungsten的复制系统等等),它都能工作。它作用于复制层次的任何深度。例如,它可以可信地报告一个slave同它的master的master的master延迟有多久。而且即便复制被停止,它也会继续工作和(准确地)汇报slave越来越落后于master。
pt-heartbeat最大可以精确到0.01秒。master和slave上的时钟必须通过NTP完全同步。默认情况下,“ --update ”检查发生于每一秒的开始(e.g 00:01)而“ --monitor ”检查发生于秒与秒的中间(e.g 00:01.5)。只要服务器间的时钟完全同步并且复制事件在半秒以内传送,pt-heartbeat就会给出零秒的延迟结果。
如果连接报错,pt-heartbeat会尝试重新连接。但如果首次启动时无法获取连接,则不会重试。
“ --dbi-driver ”选项允许你也可以使用pt-heartbeat来监控PostgreSQL。据说对于Slony-1复制工作良好。
以下为个人本地环境的测试数据。
首先是master启动“ --update ”实例来写入和更新心跳。
root@ubuntu:~# pt-heartbeat -h192.168.112.129 -P3306 -uroot -p123456 -Dplayer --interval=11 --create-table --update --daemonize root@ubuntu:~# mysql Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 7 Server version: 5.7.18-log Source distribution Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> SELECT * FROM `player`.`heartbeat`\G *************************** 1. row *************************** ts: 2018-04-02T23:33:05.002410 server_id: 1024 file: master-bin.000010 position: 8301 relay_master_log_file: NULL exec_master_log_pos: NULL 1 row in set (0.00 sec) mysql>
slave启动“ --monitor ”监控复制延迟,这里定义每11秒检查输出一次计算结果。测试中是存在3秒的延迟,但这其实是“ 假 ”的。因为我在master的“ --update ”和slave的“ --monitor ”都指定了“ --interval=11 ”。每一行具体延迟时间后面的中括号中给出了三个时间段的延迟均值,默认是1分钟、5分钟和15分钟,通过参数选项“ --frames ”控制。
root@ubuntu:~# pt-heartbeat -h192.168.112.128 -P3306 -uroot -p123456 -Dplayer --interval=11 --monitor # A software update is available: 3.00s [ 0.05s, 0.01s, 0.00s ] 3.00s [ 0.10s, 0.02s, 0.01s ] 3.00s [ 0.15s, 0.03s, 0.01s ]
检查slave延迟1次然后退出。这里通过“ CHANGE MASTER TO MASTER_DELAY = N ”来设置了一下复制延迟(https://dev.mysql.com/doc/refman/5.7/en/replication-delayed.html),然后会发现延迟滞后了很多。但是就不会再额外输出区间段的延迟均值了。
root@ubuntu:~# mysql -h192.168.112.128 -P3306 -uroot -p123456 mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 12 Server version: 5.7.18 Source distribution Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> STOP SLAVE; Query OK, 0 rows affected (0.01 sec) mysql> CHANGE MASTER TO MASTER_DELAY = 36; Query OK, 0 rows affected (0.01 sec) mysql> START SLAVE; Query OK, 0 rows affected (0.01 sec) mysql> \q Bye root@ubuntu:~# pt-heartbeat -h192.168.112.128 -P3306 -uroot -p123456 -Dplayer --check 44.00 root@ubuntu:~#
“ --stop ”master上的“ --update ”守护进程取消监控。
root@ubuntu:~# ps aux | grep heartbeat root 5198 0.0 1.0 97060 21576 ? Ss 00:06 0:00 perl /usr/bin/pt-heartbeat -h192.168.112.129 -P3306 -uroot -p123456 -Dplayer --interval=11 --create-table --update --daemonize root 5208 0.0 0.0 15984 972 pts/8 S+ 00:06 0:00 grep --color=auto heartbeat root@ubuntu:~# ls /tmp/ | grep ^pt root@ubuntu:~# pt-heartbeat -h192.168.112.129 -P3306 -uroot -p123456 -Dplayer --sentinel=/tmp/pt-heartbeat-sentinel --stop Successfully created file /tmp/pt-heartbeat-sentinel root@ubuntu:~# ps aux | grep heartbeat root 5215 0.0 0.0 15984 1016 pts/8 S+ 00:07 0:00 grep --color=auto heartbeat root@ubuntu:~# ls /tmp/ | grep ^pt pt-heartbeat-sentinel root@ubuntu:~#
参考:
https://www.percona.com/doc/percona-toolkit/LATEST/pt-heartbeat.html