• pt-heartbeat 是 percona 公司下 percona-toolkit 中的一款主从状态监控工具
  • 由于 MySQL 的 show slave status 命令中的 Seconds_Behind_Master 实际上是 slave 节点 SQL thread 与 IO thread 之间的延迟,也就是本地 relaylog 中未被执行完的那部分的差值,所以基于 Seconds_Behind_Master 计算主从延迟是不准确的
  • pt-heartbeat 的实现方式是在 master 节点创建一个表,不断更新表内时间戳,然后再开启一个进程,获取 slave 节点同步过来的时间,将时间的差值打印出来或写入文件中中,通过定时查询文件,进行延迟报警

安装

参数

连接相关

  • –host/-h:主机地址
  • –port/-P:连接数据库的端口
  • –user/-u:连接数据库的用户名
  • –password/-p:连接数据库的密码
  • –ask-pass:交互输入密码
  • –socket/-S:连接数据库的套接字
  • –charset:指定编码
  • –master-server-id:指定 master id,如未指定,pt-heartbeat 会尝试连接到服务器的主服务器,并确定它的服务器 id
  • –slave-user:指定连接从服务器的用户
  • –slave-password:连接从服务器的密码

监控相关

  • –database:pt-heartbeat 连接的库,在库中指定表写入时间戳信息
  • –table:pt-heartbeat 连接的表,在表中写入时间戳(心跳)信息
  • –create-table:如果心跳表不存在,则创建
  • –dbi-driver:指定连接的驱动程序(mysql/Pg),默认为 mysql
  • –[no]insert-heartbeat-row:默认为 yes,指定表后,会在心跳表中写入一行记录时间戳信息,如果 –table 指定的表没有 INSERT 权限,可配置 –no-insert-heartbeat-row
  • –interval:更新心跳表的时间间隔(默认为1s)
  • –update:更新 master 的心跳表
  • –monitor:每秒检查从服务器延迟,并报告给 STDOUT,或者 –file
  • –recurse:递归发现从服务器的深度(检查从库的从库的延迟)
  • –recursion-method:查找从服务器的首选递归方法(如果服务使用非3306端口,则须使用hosts方法)
  • –skew: 允许的复制延迟大小,默认为 0.5s

运行状态相关

  • –fail-successive-errors:pt-heartbeat 将在给定的连接错误后失败
  • –pid:创建 pid 文件并指定路径
  • –run-time:运行时间,运行指定事件后退出
  • –sentinel:默认为( /tmp/pt-heartbeat-sentinel),此文件存在则程序停止
  • –stop:停止服务,如果 –sentinel 使用的非默认路径,需手动指定,否则无法关闭
  • –daemonize:fock至后台运行

输出相关

  • –frames:指定开启 –moniter 后,输出的平均值的时间区间(m,h,d),默认为 1m,5m,15m。此致值影响内存开销大小
  • –file:开启 –moniter 参数时,将输出打印到指定文件而不是 STDOUT
  • –log:后台运行时,将日志写入此文件中

实践

监控主从并将数据写入文件中

  • master 创建库存储心跳表并配置权限
1
2
3
CREATE DATABASE `pt_heartbeat_db` DEFAULT CHARACTER SET utf8mb4 ;
GRANT SELECT,UPDATE,INSERT,CREATE ON pt_heartbeat_db.* To 'pt_heartbeat_user'@'%' identified by 'ptPasswd';
GRANT SUPER,REPLICATION CLIENT ON *.* To 'pt_heartbeat_user'@'%' identified by 'ptPasswd';
  • master 开启 –update
1
2
3
$ pt-heartbeat --user=pt_heartbeat_user  --password=ptPasswd --host=192.168.213.40 \
-D pt_heartbeat_db --table=heartbeat --create-table --interval=1 \
--master-server-id=123123 --update --daemonize
  • slave 开启 –moniter
1
2
3
4
$ pt-heartbeat -D pt_heartbeat_db --master-server-id=123123 --table=heartbeat \
--interval=10 --frames=30s,1m,5m  --file="$PT_FILE_PATH" --log="$PT_LOG_PATH" \
-h 192.168.213.41 --user=pt_heartbeat_user --password=ptPasswd \
--monitor --daemonize
  • 停止 pt-heartbeat
    • 如果启动时配置 –sentinel,停止时也需指定
    • 如果使用 –stop 停止后,下次启动前要手动删除 sentinel 文件
1
$ pt-heartbeat --stop