十八、Percona Toolkit工具

目录

一、percona-toolkit介绍

一、 pt-table-checksum原理和作用

1、概述:

2、原理:

(1)检查每张表的数据类型是否一致

(2)计算数据是否一致

(3)一致性如何保证

3、工作过程

4、为了保证主数据库服务的安全,该工具实现了许多保护措施:

5、规划

 6、安装mysql,搭建主从

7、下载安装 pt 工具

8、数据校验

9、创建连接用户

10、测试

二、pt-table-sync用法梳理

三、pt-heartbeat监控mysql主从复制延迟梳理 


一、percona-toolkit介绍

        percona-toolkit是一组高级命令行工具的集合,用来执行各种通过手工执行非常复杂和麻烦的mysql和系统任务,这些任务包括:

   1)检查master和slave数据的一致性

   2)有效地对记录进行归档

   3)查找重复的索引

   4)对服务器信息进行汇总

   5)分析来自日志和tcpdump的查询

   6)当系统出问题的时候收集重要的系统信息

        percona-toolkit源自Maatkit和Aspersa工具,这两个工具是管理mysql的最有名的工具。不过,现在Maatkit工具已经不维护了,所以以后推荐还是使用percona-toolkit工具!

        这些工具主要包括开发、性能、配置、监控、复制、系统、实用六大类,作为一个优秀的DBA,里面有的工具非常有用,如果能掌握并加以灵活应用,将能极大的提高工作效率。

percona-toolkit工具中最主要的三个组件分别是:

 本篇主要讲解这三个组件的使用

   1)pt-table-checksum 负责监测mysql主从数据一致性

   2)pt-table-sync 负责当主从数据不一致时修复数据,让它们保存数据的一致性

   3)pt-heartbeat 负责监控mysql主从同步延迟

一、 pt-table-checksum原理和作用

1、概述:

        pt-table-checksum 是 Percona-Toolkit 的组件之一,用于检测 MySQL 主、从库的数据是否一致。

        其原理是:

        在主库执行基于 statement 的 SQL 语句来生成主库数据块的checksum,把相同的 SQL 语句传递到从库执行,并在从库上计算相同数据块的 checksum,最后,比较主从库上相同数据块的 checksum 值,由此判断主从数据是否一致。

        它能在非常大的表上工作的一个原因是,它把每个表分成行块,并检查每个块与单个替换。选择查询。它改变块的大小,使校验和查询在所需的时间内运行。分块表的目的是确保校验和不受干扰,并且不会在服务器上造成太多复制延迟或负载,而不是使用单个大查询处理每个表。这就是为什么默认情况下每个块的目标时间是 0.5 秒。

2、原理:

(1)检查每张表的数据类型是否一致

        pt工具先检查表的结构,并获取每一列的数据类型,把所有数据类型都转化为字符串,然后用concat_ws()函数进行连接,由此计算出该行的checksum值。checksum默认采用crc32,你可以自己定义效率更高的udf。

(2)计算数据是否一致

        如果一行一行的计算checksum再去和从库比较,那么效率会非常低下。pt工具选择智能分析表上的索引,然后把表的数据split成一个个chunk,计算的时候也是以chunk为单位。因此引入了聚合函数BIT_XOR()。它的功能可以理解为把这个chunk内的所有行的数据拼接起来,再计算crc32的值,就得到这个chunk的checksum值。这其中还有count(*),用来计算chunk包含的行数。每一次对chunk进行checksum后,pt工具都会对耗时进行统计分析,并智能调整下一个chunk的大小,避免chunk太大对线上造成影响,同时也要避免chunk太小而效率低下。

(3)一致性如何保证

        当pt工具在计算主库上某chunk的checksum时,主库可能还在更新,同时从库可能延迟使得relay-log中还有与这个chunk数据相关的更新,那该怎么保证主库与从库计算的是”同一份”数据?

        答案是加for update当前读锁,这保证了主库的某个chunk内部数据的一致性。否则,1000个人chekcusm同样的1000行数据,可能得到1000个不同的结果,你无法避开mvcc的干扰!获得for update锁后,pt工具开始计算chunk的checksum值,并把计算结果保存到pt工具自建的结果表中(采用replace into select的方式),然后释放锁。该语句最终会传递到从库并执行相同的计算逻辑。

3、工作过程

  1. 连接到主库:pt工具连接到主库,然后自动发现主库的所有从库。默认采用show full processlist来查找从库,但是这只有在主从实例端口相同的情况下才有效。
  2. 查找主库或者从库是否有复制过滤规则:这是为了安全而默认检查的选项。你可以关闭这个检查,但是这可能导致checksum的sql语句要么不会同步到从库,要么到了从库发现从库没有要被checksum的表,这都会导致从库同步卡库。
  3. 开始获取表,一个个的计算。
  4. 如果是表的第一个chunk,那么chunk-size一般为1000;如果不是表的第一个chunk,那么采用19步中分析出的结果。
  5. 检查表结构,进行数据类型转换等,生成checksum的sql语句。
  6. 根据表上的索引和数据的分布,选择最合适的split表的方法。
  7. 开始checksum表。
  8. 默认在chunk一个表之前,先删除上次这个表相关的计算结果。除非–resume。
  9. 根据explain的结果,判断chunk的size是否超过了你定义的chunk-size的上限。如果超过了,为了不影响线上性能,这个chunk将被忽略。
  10. 把要checksum的行加上for update锁,并计算。
  11. 把计算结果存储到master_crc master_count列中。
  12. 调整下一个chunk的大小。
  13. 等待从库追上主库。如果没有延迟备份的从库在运行,最好检查所有的从库,如果发现延迟最大的从库延迟超过max-lag秒,pt工具在这里将暂停。
  14. 如果发现主库的max-load超过某个阈值,pt工具在这里将暂停。
  15. 继续下一个chunk,直到这个table被chunk完毕。
  16. 等待从库执行完checksum,便于生成汇总的统计结果。每个表汇总并统计一次。
  17. 循环每个表,直到结束。

4、为了保证主数据库服务的安全,该工具实现了许多保护措施:

  1. 自动设置 innodb_lock_wait_timeout 为1s,避免引起
  2. 默认当数据库有25个以上的并发查询时,pt-table-checksum会暂停。可以设置 --max-load 选项来设置这个阀值
  3. 当用 Ctrl+C 停止任务后,工具会正常的完成当前 chunk 检测,下次使用 --resume 选项启动可以恢复继续下一个 chunk

5、规划

角色

IP

端口

版本

master

192.168.134.132

3306

8.0.16

slave

192.168.134.133

3306

8.0.16

slave

192.168.134.134

3306

8.0.16

 6、安装mysql,搭建主从

安装步骤请查看十、MySQL主从架构配置-CSDN博客

7、下载安装 pt 工具

1、下载PT
wget https://www.percona.com/downloads/percona-toolkit/3.1.0/binary/tarball/percona-toolkit-3.1.0_x86_64.tar.gz

2、下载依赖
yum -y install perl-devel perl-Digest-MD5 perl-DBI perl-DBD-MySQL perl-IO-Socket-SSL.noarch perl-Time-HiRes perl-CPAN

3、解压
[root@rabbitmq_1 pt]# tar -xvf percona-toolkit-3.1.0_x86_64.tar.gz
[root@rabbitmq_1 pt]# cd percona-toolkit-3.1.0/
[root@rabbitmq_1 percona-toolkit-3.1.0]# ll
total 136
drwxrwxr-x. 2 500 500  4096 Sep 16  2019 bin
-rw-rw-r--. 1 500 500 53417 Sep 16  2019 Changelog
-rw-rw-r--. 1 500 500  7142 Sep 16  2019 CONTRIBUTE.md
-rw-rw-r--. 1 500 500   224 Sep 16  2019 CONTRIBUTING.md
-rw-rw-r--. 1 500 500 18092 Sep 16  2019 COPYING
-rw-rw-r--. 1 500 500  8314 Sep 16  2019 docker-compose.yml
drwxrwxr-x. 2 500 500    33 Sep 16  2019 docs
-rw-rw-r--. 1 500 500 10133 Sep 16  2019 Gopkg.lock
-rw-rw-r--. 1 500 500  1350 Sep 16  2019 Gopkg.toml
-rw-rw-r--. 1 500 500  1527 Sep 16  2019 INSTALL
drwxrwxr-x. 2 500 500     6 Sep 16  2019 lib
-rw-rw-r--. 1 500 500   567 Sep 16  2019 Makefile.PL
-rw-rw-r--. 1 500 500   827 Sep 16  2019 MANIFEST
-rw-rw-r--. 1 500 500  1842 Sep 16  2019 README.md

4、
perl Makefile.PL

5、编译安装
make && make install

6、安装后,percona-toolkit工具的各个组件命令就有有了(输入pt,按TAB键就会显示)
[root@rabbitmq_1 ~]# pt
pt-align                  pt-fifo-split             pt-kill                   pt-pmp                    pt-slave-restart          pt-variable-advisor
pt-archiver               pt-find                   pt-mext                   pt-query-digest           pt-stalk                  pt-visual-explain
ptaskset                  pt-fingerprint            pt-mongodb-query-digest   pt-secure-collect         pt-summary                ptx
pt-config-diff            pt-fk-error-logger        pt-mongodb-summary        pt-show-grants            pt-table-checksum         
pt-deadlock-logger        pt-heartbeat              pt-mysql-summary          pt-sift                   pt-table-sync             
pt-diskstats              pt-index-usage            pt-online-schema-change   pt-slave-delay            pt-table-usage            
pt-duplicate-key-checker  pt-ioprofile              pt-pg-summary             pt-slave-find             pt-upgrade  

8、数据校验

9、创建连接用户

1、(root@localhost) [(none)]> CREATE USER 'pt' IDENTIFIED BY 'pt';
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
报错:因为mysql8.0默认启动了密码策略  

2、
(root@localhost) [(none)]> set global validate_password.policy=0;
Query OK, 0 rows affected (0.00 sec)

(root@localhost) [(none)]> set global validate_password.length=4;
Query OK, 0 rows affected (0.00 sec)

(root@localhost) [(none)]> flush privileges;
Query OK, 0 rows affected (0.00 sec)
(root@localhost) [(none)]> CREATE USER 'pt' IDENTIFIED BY '123456';
Query OK, 0 rows affected (0.00 sec)

3、授权
(root@localhost) [(none)]> grant all privileges on *.* to pt;
Query OK, 0 rows affected (0.01 sec)

4、修改pt用户的远程连接权限
(root@localhost) [mysql]> ALTER USER 'pt'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
(root@localhost) [mysql]> select user,host,plugin from user;
+------------------+-----------+-----------------------+
| user             | host      | plugin                |
+------------------+-----------+-----------------------+
| mha              | %         | mysql_native_password |
| pt               | %         | mysql_native_password |

10、测试

1、语法:
pt-table-checksum [OPTIONS] [DSN]

2、详解
pt-table-checksum:在主(master)上通过执行校验的查询对复制的一致性进行检查,对比主从的校验值,从而产生结果。
DSN指向的是主的地址,该工具的退出状态不为零,如果发现有任何差别,或者如果出现任何警告或错误。
注意:第一次运行的时候需要加上--create-replicate-table参数,生成checksums表
!!如果不加这个参数,那么就需要在对应库下手工添加这张表了,表结构SQL如下:
CREATE TABLE checksums (
   db             char(64)     NOT NULL,
   tbl            char(64)     NOT NULL,
   chunk          int          NOT NULL,
   chunk_time     float            NULL,
   chunk_index    varchar(200)     NULL,
   lower_boundary text             NULL,
   upper_boundary text             NULL,
   this_crc       char(40)     NOT NULL,
   this_cnt       int          NOT NULL,
   master_crc     char(40)         NULL,
   master_cnt     int              NULL,
   ts             timestamp    NOT NULL,
   PRIMARY KEY (db, tbl, chunk),
   INDEX ts_db_tbl (ts, db, tbl)
) ENGINE=InnoDB;

3、常用参数解释:
--nocheck-replication-filters :不检查复制过滤器,建议启用。后面可以用--databases来指定需要检查的数据库。
--no-check-binlog-format : 不检查复制的binlog模式,要是binlog模式是ROW,则会报错。
--replicate-check-only :只显示不同步的信息。

--databases:指定要校验的数据库名称,可以用逗号分隔多个数据库。
--tables:指定要校验的表名称,可以用逗号分隔多个表。
--ignore-databases:指定要忽略的数据库名称,可以用逗号分隔多个数据库。
--ignore-tables:指定要忽略的表名称,可以用逗号分隔多个表。
--recursion-method:指定如何发现从库,默认是通过主库的进程列表。如果这种方法失败,可以尝试其他方法,如 hosts、cluster 或 dsn。
--replicate:指定存储校验和结果的表名,默认是 percona.checksums。
--max-load:指定在服务器上执行校验和之前检查的最大负载值,默认是 Threads_running=25。如果负载过高,则 pt-table-checksum 会暂停。
--max-lag:指定允许从库落后主库的最大秒数,默认是 1 秒。如果落后过多,则 pt-table-checksum 会暂停。
h= :Master的地址
u= :用户名
p=:密码
P= :端口

4、!!最重要的一点就是:
要在主库上授权,能让主库ip访问。这一点不能忘记!(实验证明从库上可以不授权,但最好还是从库也授权)授权已在第9步操作不做演示

5、在主库上执行的一个检查主从数据一致性的命令
[root@rabbitmq_1 ~]# pt-table-checksum --nocheck-replication-filters --no-check-binlog-format --replicate=test.checksums --create-replicate-table --databases=test --tables=a h=192.168.134.132,u=pt,p=123456,P=3306
            TS ERRORS  DIFFS     ROWS  DIFF_ROWS  CHUNKS SKIPPED    TIME TABLE
10-07T14:48:19      0      0        1          0       1       0   0.016 test.a
解释:
TS :完成检查的时间。
ERRORS :检查时候发生错误和警告的数量。
DIFFS :0表示一致,1表示不一致。当指定--no-replicate-check时,会一直为0,当指定--replicate-check-only会显示不同的信息。
ROWS :表的行数。
CHUNKS :被划分到表中的块的数目。
SKIPPED :由于错误或警告或过大,则跳过块的数目。
TIME :执行的时间。
TABLE :被检查的表名。

[root@rabbitmq_1 mysql]# pt-table-checksum h=192.168.134.132,u=pt,p=xxxxxx,P=3306 --databases=test --recursion-method hosts
Checking if all tables can be checksummed ...
Starting checksum ...
Diffs cannot be detected because no slaves were found.  Please read the --recursion-method documentation for information.
            TS ERRORS  DIFFS     ROWS  DIFF_ROWS  CHUNKS SKIPPED    TIME TABLE
11-21T16:09:07      0      0        4          0       1       0   0.006 test.a
11-21T16:09:07      0      0        8          0       1       0   0.006 test.checksums
11-21T16:09:07      0      0        4          0       1       0   0.007 test.course
11-21T16:09:07      0      0        1          0       1       0   0.010 test.heartbeat
11-21T16:09:07      0      0        0          0       1       0   0.006 test.sales
11-21T16:09:07      0      0        5          0       1       0   0.006 test.t_stu
11-21T16:09:07      0      0        3          0       1       0   0.008 test.teacher
11-21T16:09:07      0      0        3          0       1       0   0.007 test.teacherCard
11-21T16:09:07      0      0        2          0       1       0   0.006 test.test

注意:这张表 checksums 一旦产生了,默认是删除不了的,并且这张表所在的库也默认删除不了,删除后过一会儿就又会出来。
要想删除的话,一定要先把pt-table-checksum检查前添加的权限收回!
(root@localhost) [mysql]> show grants for 'pt'@'%'\G  看下有哪些权限
(root@localhost) [mysql]> revoke  ..... ON *.* TO `pt`@`%`   使用revoke 关键字收回权限

二、pt-table-sync用法梳理

        如果通过pt-table-checksum 检查找到了不一致的数据表,那么如何同步数据呢?即如何修复MySQL主从不一致的数据,让他们保持一致性呢?这时候可以利用另外一个工具pt-table-sync。

使用方法:

        pt-table-sync: 高效的同步MySQL表之间的数据,他可以做单向和双向同步的表数据。他可以同步单个表,也可以同步整个库。它不同步表结构、索引、或任何其他模式对象。所以在修复一致性之前需要保证他们表存在。

假如上面检查数据时发现主从不一致
[root@rabbitmq_1 ~]# pt-table-checksum --nocheck-replication-filters --no-check-binlog-format --replicate=test.checksums --create-replicate-table --databases=test --tables=a h=192.168.134.132,u=pt,p=xxxxxx,P=3306

            TS ERRORS  DIFFS     ROWS  DIFF_ROWS  CHUNKS SKIPPED    TIME TABLE
10-07T15:07:47      0      1        1          1       1       0   0.015 test.a
现在需要DIFFS为1可知主从数据不一致,需要修复!修复命令如下:

参数说明:
--replicate= :指定通过pt-table-checksum得到的表,这2个工具差不多都会一直用。
--databases= : 指定执行同步的数据库。
--tables= :指定执行同步的表,多个用逗号隔开。
--ignore-databases:指定要忽略的数据库名称,可以用逗号分隔多个数据库。
--ignore-tables:指定要忽略的表名称,可以用逗号分隔多个表。
--sync-to-master :指定一个DSN,即从的IP,他会通过show processlist或show slave status 去自动的找主。
h= :服务器地址,命令里有2个ip,第一次出现的是Master的地址,第2次是Slave的地址。
u= :帐号。
p= :密码。
--print :打印,但不执行命令。
--execute :执行命令。
--charset= :指定默认字符集
通过(--print)打印出来了修复数据的sql语句,可以手动的在slave从库上执行,让他们数据保持一致性,这样比较麻烦!

           单主单从复制
方式1:
先master的ip,用户,密码,然后是slave的ip,用户,密码
[root@rabbitmq_1 ~]# pt-table-sync --replicate=test.checksums h=192.168.134.132,u=pt,p=xxxxxx h=192.168.134.133,u=pt,p=xxxxxx --print

DELETE FROM `test`.`a` WHERE `a`='2' LIMIT 1 /*percona-toolkit src_db:test src_tbl:a src_dsn:h=192.168.134.132,p=...,u=pt dst_db:test dst_tbl:a dst_dsn:h=rabbitmq_2,p=...,u=pt lock:1 transaction:1 changing_src:test.checksums replicate:test.checksums bidirectional:0 pid:6105 user:root host:rabbitmq_1*/;
返回了一个delete 语句和说明,意思就是在从库有一条主库不存在的数据,建议删除,如果主库有一条数据,从库没有的话 那就是inster数据了。

可以直接在master主库上执行修复操作,通过--execute参数,如下:
[root@rabbitmq_1 ~]# pt-table-sync --replicate=test.checksums --databases=test --tables=fp_kj h=192.168.153.128,u=pt,p=xxxxxx h=192.168.153.129,u=pt,p=xxxxxx --execute
这样数据就一致了。

[root@rabbitmq_1 ~]# pt-table-checksum --nocheck-replication-filters --no-check-binlog-format --replicate=test.checksums --create-replicate-table --databases=test h=192.168.134.132,u=pt,p=123456,P=3306

            TS ERRORS  DIFFS     ROWS  DIFF_ROWS  CHUNKS SKIPPED    TIME TABLE
10-07T15:12:58      0      0        1          0       1       0   0.013 test.a

!!建议:
修复数据的时候,最好还是用 --print 打印出来的好,这样就可以知道那些数据有问题,可以人为的干预下。不然直接执行了,出现问题之后更不好处理。总之还是在处理之前做好数据的备份工作。

方式2:
# 在从库上运行 pt-table-sync 将结果打印出来,不执行  加上 --execute  执行  
pt-table-sync --sync-to-master h=192.168.134.132,u=pt,p=pt --databases test --tables a --replicate percona.checksums
# pt-table-sync output
UPDATE `test`.`t1` SET `name`='Bob' WHERE `id`=2 LIMIT 1;
这个输出告诉我们,为了修复数据不一致的问题,我们需要在从库上执行一个 UPDATE 语句

        为了确保主从数据的一致性,可以编写监控脚本,定时检查。当检查到主从数据不一致时,强制修复数据。

#!/bin/bash
NUM=$(/usr/bin/pt-table-checksum --nocheck-replication-filters --no-check-binlog-format --replicate=test.checksums --create-replicate-table --databases=test h=192.168.134.132,u=pt,p=xxxxxx,P=3306|awk -F" " '{print $3}'|sed -n '4p')
if [ $NUM -eq 1 ];then
  /usr/bin/pt-table-sync --replicate=test.checksums h=192.168.134.132,u=root,p=xxxxxx h=192.168.134.133,u=root,p=xxxxxx --print
  /usr/bin/pt-table-sync --replicate=test.checksums, h=192.168.134.132,u=root,p=xxxxxx h=192.168.134.133,u=root,p=xxxxxx --execute
else
  echo "data is ok"
fi

总结:

        pt-table-checksum和pt-table-sync工具很给力,工作中常常在使用。注意使用该工具需要授权,一般SELECT, PROCESS, SUPER, REPLICATION SLAVE等权限就已经足够了。

三、pt-heartbeat监控mysql主从复制延迟梳理 

        pt-heartbeat的工作原理通过使用时间戳方式在主库上更新特定表,然后在从库上读取被更新的时间戳然后与本地系统时间对比来得出其延迟。具体流程:

   1)在主上创建一张heartbeat表,按照一定的时间频率更新该表的字段(把时间更新进去)。监控操作运行后,heartbeat表能促使主从同步!

   2)连接到从库上检查复制的时间记录,和从库的当前系统时间进行比较,得出时间的差异。

使用方法:

1、语法:
pt-heartbeat [OPTIONS] [DSN] --update|--monitor|--check|--stop
注意:需要指定的参数至少有 --stop,--update,--monitor,--check。
其中
--update,--monitor和--check是互斥的,--daemonize和--check也是互斥。
--ask-pass     隐式输入MySQL密码
--charset     字符集设置
--check      检查从的延迟,检查一次就退出,除非指定了--recurse会递归的检查所有的从服务器。
--check-read-only    如果从服务器开启了只读模式,该工具会跳过任何插入。
--create-table    在主上创建心跳监控的表,如果该表不存在,可以自己手动建立,建议存储引擎改成memory。通过更新该表知道主从延迟的差距。
    CREATE TABLE heartbeat (
      ts                    varchar(26) NOT NULL,
      server_id             int unsigned NOT NULL PRIMARY KEY,
      file                  varchar(255) DEFAULT NULL,
      position              bigint unsigned DEFAULT NULL,
      relay_master_log_file varchar(255) DEFAULT NULL,
      exec_master_log_pos   bigint unsigned DEFAULT NULL
    );
heratbeat   表一直在更改ts和position,而ts是我们检查复制延迟的关键。
--daemonize   执行时,放入到后台执行
--user=-u,   连接数据库的帐号
--database=-D,    连接数据库的名称
--host=-h,     连接的数据库地址
--password=-p,     连接数据库的密码
--port=-P,     连接数据库的端口
--socket=-S,    连接数据库的套接字文件
--file 【--file=output.txt】   打印--monitor最新的记录到指定的文件,很好的防止满屏幕都是数据的烦恼。
--frames 【--frames=1m,2m,3m】  在--monitor里输出的[]里的记录段,默认是1m,5m,15m。可以指定1个,如:--frames=1s,多个用逗号隔开。可用单位有秒(s)、分钟(m)、小时(h)、天(d)。
--interval   检查、更新的间隔时间。默认是见是1s。最小的单位是0.01s,最大精度为小数点后两位,因此0.015将调整至0.02。
--log    开启daemonized模式的所有日志将会被打印到制定的文件中。
--monitor    持续监控从的延迟情况。通过--interval指定的间隔时间,打印出从的延迟信息,通过--file则可以把这些信息打印到指定的文件。
--master-server-id    指定主的server_id,若没有指定则该工具会连到主上查找其server_id。
--print-master-server-id    在--monitor和--check 模式下,指定该参数则打印出主的server_id。
--recurse    多级复制的检查深度。模式M-S-S...不是最后的一个从都需要开启log_slave_updates,这样才能检查到。
--recursion-method     指定复制检查的方式,默认为processlist,hosts。
--update    更新主上的心跳表。
--replace     使用--replace代替--update模式更新心跳表里的时间字段,这样的好处是不用管表里是否有行。
--stop    停止运行该工具(--daemonize),在/tmp/目录下创建一个“pt-heartbeat-sentinel” 文件。后面想重新开启则需要把该临时文件删除,才能开启(--daemonize)。
--table   指定心跳表名,默认heartbeat。

 示例说明:

1、切换到test库下
(root@localhost) [mysql]> use test;

2、主库上的对应库下创建heartbeat表,一般创建后从库会同步这张表(不同步的话,就在从库那边手动也手动创建)
mysql> CREATE TABLE heartbeat (
    ts                    varchar(26) NOT NULL,
    server_id             int unsigned NOT NULL PRIMARY KEY,
    file                  varchar(255) DEFAULT NULL,
    position              bigint unsigned DEFAULT NULL,
    relay_master_log_file varchar(255) DEFAULT NULL,
    exec_master_log_pos   bigint unsigned DEFAULT NULL
    );

3、更新主库上的heartbeat,--interval=1表示1秒钟更新一次(注意这个启动操作要在主库服务器上执行)
[root@rabbitmq_1 ~]# pt-heartbeat --user=pt --ask-pass --host=192.168.134.132 --create-table -D test --interval=3 --update --replace --daemonize
执行时候会报错
[root@rabbitmq_1 ~]# pt-heartbeat --user=pt --ask-pass --host=192.168.134.132 --create-table -D test --interval=3 --update --replace --daemonize
Enter password: Cannot read response; is Term::ReadKey installed? Can't locate Term/ReadKey.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at /usr/local/bin/pt-heartbeat line 1777.
就是说无法找到Term/ReadKey.pm模块,而该模块是Term::ReadKey Perl模块的一部分
    [root@rabbitmq_1 ~]# yum install -y perl-CPAN
    安装完成后,进入CPAN终端:
    sudo cpan
    第一次运行时,需要进行初始化设置,请根据提示输入您的选择,可以一直按Enter键使用默认设置。
    初始化完成后,用以下命令安装Term::ReadKey模块:
    [root@rabbitmq_1 ~]# cpan Term::ReadKey
    安装完成后,退出CPAN终端:exit
    然后在执行命令

[root@rabbitmq_1 ~]# pt-heartbeat --user=pt --ask-pass --host=192.168.134.132 --create-table -D test --interval=3 --update --replace --daemonize
Enter password: 

4、查看是否启动
[root@rabbitmq_1 ~]# ps -ef|grep pt-heartbeat
root      15401      1  0 16:58 ?        00:00:00 perl /usr/local/bin/pt-heartbeat --user=pt --ask-pass --host=192.168.134.132 --create-table -D test --interval=3 --update --replace --daemonize
root      15405   2125  0 16:58 pts/0    00:00:00 grep --color=auto pt-heartbeat

5、在主库运行监测同步延迟:
[root@rabbitmq_1 ~]# pt-heartbeat -D test --table=heartbeat --monitor --host=192.168.134.132 --user=pt --password=xxxxxx --master-server-id=1
1.00s [  0.02s,  0.00s,  0.00s ]
2.00s [  0.05s,  0.01s,  0.00s ]
0.00s [  0.05s,  0.01s,  0.00s ]
1.00s [  0.07s,  0.01s,  0.00s ]
2.00s [  0.10s,  0.02s,  0.01s ]
0.00s [  0.10s,  0.02s,  0.01s ]
1.00s [  0.12s,  0.02s,  0.01s ]
2.00s [  0.15s,  0.03s,  0.01s ]
0.00s [  0.15s,  0.03s,  0.01s ]

解释:0表示从没有延迟。 [ 0.00s, 0.00s, 0.00s ] 表示1m,5m,15m的平均值。可以通过--frames去设置。
上面的监测命令会一直在运行状态中,可以使用--check监测一次就退出
[root@rabbitmq_1 ~]# pt-heartbeat -D test --table=heartbeat --check --host=192.168.134.132 --user=pt --password=123456 --master-server-id=1
1.00
如果想把这个输出结果加入自动化监控,那么可以使用如下命令使监控输出写到文件,然后使用脚本定期过滤文件中的最大值作为预警即可:
注意--log选项必须在有--daemonize参数的时候才会打印到文件中,且这个文件的路径最好在/tmp下,否则可能因为权限问题无法创建
[root@rabbitmq_1 ~]# pt-heartbeat -D test --table=heartbeat --check --host=192.168.134.132 --user=pt --password=123456 --master-server-id=1 --log=/opt/master-slave.txt

     关闭主从延迟检测

[root@rabbitmq_1 ~]# pt-heartbeat --stop
Successfully created file /tmp/pt-heartbeat-sentinel
或者直接kill掉也行
[root@rabbitmq_1 ~]# ps -ef|grep pt-heartbeat
root      16185   2125  0 17:13 pts/0    00:00:00 grep --color=auto pt-heartbeat

  • 8
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

繁华依在

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值