一、下载percona-toolkit工具包
percona-toolkit是一组高级命令行工具的集合,可以查看当前服务的摘要信息,磁盘检测,分析慢查询日志,查找重复索引,实现表同步等等。
[root@push-5-221 src]# cd /usr/local/src/ [root@push-5-221 src]# wget https://www.percona.com/downloads/percona-toolkit/3.0.12/binary/redhat/7/x86_64/percona-toolkit-3.0.12-1.el7.x86_64.rpm
二、安装rpm包
root@push-5-221 src]# rpm -ivh percona-toolkit-3.0.12-1.el7.x86_64.rpm 警告:percona-toolkit-3.0.12-1.el7.x86_64.rpm: 头V4 DSA/SHA1 Signature, 密钥 ID cd2efd2a: NOKEY 错误:依赖检测失败: perl(DBI) >= 1.13 被 percona-toolkit-3.0.12-1.el7.x86_64 需要 perl(DBD::mysql) >= 1.0 被 percona-toolkit-3.0.12-1.el7.x86_64 需要 perl(IO::Socket::SSL) 被 percona-toolkit-3.0.12-1.el7.x86_64 需要 perl(Digest::MD5) 被 percona-toolkit-3.0.12-1.el7.x86_64 需要 perl(Term::ReadK
显示需要一些依赖包,安装相应依赖包
[root@push-5-221 src]# yum install -y perl-DBI perl-DBD-MySQL perl-Digest-MD5 perl-IO-Socket-SSL perl-TermReadKey
再次安装
[root@push-5-221 src]# rpm -ivh percona-toolkit-3.0.12-1.el7.x86_64.rpm 警告:percona-toolkit-3.0.12-1.el7.x86_64.rpm: 头V4 DSA/SHA1 Signature, 密钥 ID cd2efd2a: NOKEY 准备中... ################################# [100%] 正在升级/安装... 1:percona-toolkit-3.0.12-1.el7 ################################# [100%] [root@push-5-221 src]#
安装成功,验证
[root@push-5-221 src]# pt-online-schema-change --version pt-online-schema-change 3.0.12
三、工具命令的使用
1、pt-heartbeat
#用于监控mysql复制架构的延迟。
#主要是通过在主库上的--update线程持续更新指定表上的一个时间戳,从库上--monitor线程或者--check线程检查主库更新的时间戳并与当前系统时间对比,得到延迟值。
2、pt-query-digest
#用于分析mysql服务器的慢查询日志,并格式化输出以便于查看和分析。
3、pt-diskstats
#类似于iostat,打印磁盘io统计信息,但是这个工具是交互式并且比iostat更详细。可以分析从远程机器收集的数据。
4、pt-slave-find
#连接mysql主服务器并查找其所有的从,然后打印出所有从服务器的层级关系。
[root@push-5-221 src]# pt-slave-find --host=127.0.0.1 --user=root --password=xxxxxxx 127.0.0.1 Version 5.7.26-log Server ID 2213306 Uptime 21+19:54:53 (started 2019-06-12T13:16:24) Replication Is not a slave, has 1 slaves connected, is not read_only Filters Binary logging ROW Slave status Slave mode STRICT Auto-increment increment 1, offset 1 InnoDB version 5.7.26 +- 172.28.5.222 Version 5.7.26-log Server ID 2223306 Uptime 21+19:07:10 (started 2019-06-12T14:04:07) Replication Is not a slave, has 1 slaves connected, is not read_only Filters Binary logging ROW Slave status Slave mode STRICT Auto-increment increment 1, offset 1 InnoDB version 5.7.26 +- 172.28.5.223 Version 5.7.26-log Server ID 2233306 Uptime 21+19:02:48 (started 2019-06-12T14:08:29) Replication Is not a slave, has 1 slaves connected, is not read_only Filters Binary logging ROW Slave status Slave mode STRICT Auto-increment increment 1, offset 1 InnoDB version 5.7.26 [root@push-5-221 src]#
5、pt-stalk
#用于收集mysql数据库故障时的相关信息便于后续诊断处理。
6、pt-kill
#Kill掉符合指定条件mysql语句
7、pt-upgrade
#该命令主要用于对比不同mysql版本下SQL执行的差异,通常用于升级前进行对比。
#会生成SQL文件或单独的SQL语句在每个服务器上执行的结果、错误和警告信息等。
8、pt-online-schema-change
#功能为支持在线变更表构,且不锁定原表,不阻塞原表的DML操作。
#该特性与Oracle的dbms_redefinition在线重定义表原理基本类似。
9、pt-mysql-summary
#对连接的mysql服务器生成一份详细的配置情况以及sataus信息
#在尾部也提供当前实例的的配置文件的信息
四、pt-heartbeat 监控主从同步原理
1、主库上存在一个用于检查延迟的表heartbeat,可手动或自动创建, pt-heartbeat使用--update参数连接到主库上并持续(根据设定的--interval参数)使用一个时间戳更新到表heartbeat
2、pt-heartbeat使用--monitor 或--check连接到从库,检查从主库同步过来的时间戳,并与当前系统时间戳进行比对产生一个差值,该值则用于判断延迟。(注,前提条件是主库与从库应保持时间同步)
五、实际操作pt-heartbeat 监控主从同步
1、主库上手工创建一个heartbeat数据库
mysql> create database heartbeat default CHARACTER set utf8; Query OK, 1 row affected (0.16 sec)
2、利用pt-heartbeat的--create-table 参数在主库上添加heartbeat表
[root@push-5-221 ~]# pt-heartbeat -S /var/lib/mysql/3306/mysql.sock -uroot -pxxxxxxxx -D heartbeat --create-table --update ******************************************************************* Using the default of SSL_verify_mode of SSL_VERIFY_NONE for client is deprecated! Please set SSL_verify_mode to SSL_VERIFY_PEER possibly with SSL_ca_file|SSL_ca_path for verification. If you really don't want to verify the certificate and keep the connection open to Man-In-The-Middle attacks please set SSL_verify_mode explicitly to SSL_VERIFY_NONE in your application. ******************************************************************* at /usr/bin/pt-heartbeat line 4515. ******************************************************************* Using the default of SSL_verify_mode of SSL_VERIFY_NONE for client is deprecated! Please set SSL_verify_mode to SSL_VERIFY_PEER possibly with SSL_ca_file|SSL_ca_path for verification. If you really don't want to verify the certificate and keep the connection open to Man-In-The-Middle attacks please set SSL_verify_mode explicitly to SSL_VERIFY_NONE in your application. ******************************************************************* at /usr/bin/pt-heartbeat line 4515. # A software update is available:
ctrl+c 退出,进入mysql查看heartbeat表
[root@push-5-221 ~]# mysql -S /var/lib/mysql/3306/mysql.sock -uroot -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 1447890 Server version: 5.7.26-log MySQL Community Server (GPL) Copyright (c) 2000, 2019, 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> use heartbeat; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> select * from heartbeat; +----------------------------+-----------+-------------------+-----------+-----------------------+---------------------+ | ts | server_id | file | position | relay_master_log_file | exec_master_log_pos | +----------------------------+-----------+-------------------+-----------+-----------------------+---------------------+ | 2019-07-04T11:12:07.006920 | 2213306 | master-221.000022 | 643873543 | NULL | NULL | +----------------------------+-----------+-------------------+-----------+-----------------------+---------------------+ 1 row in set (0.00 sec) mysql>
3、启动pt-heartbeat守护进程,定时更新heartbeat表,定期update(默认1S)最新的timestamp信息到ts字段中
[root@push-5-221 ~]# pt-heartbeat -S /var/lib/mysql/3306/mysql.sock -uroot -pxxxxxxxxxxx -D heartbeat --update --daemonize [root@push-5-221 ~]#
4、查看heartbeat表,不停查询,此时发现ts时间戳每秒会更新一次
mysql> select * from heartbeat; +----------------------------+-----------+-------------------+-----------+-----------------------+---------------------+ | ts | server_id | file | position | relay_master_log_file | exec_master_log_pos | +----------------------------+-----------+-------------------+-----------+-----------------------+---------------------+ | 2019-07-04T11:20:06.001140 | 2213306 | master-221.000022 | 659484111 | NULL | NULL | +----------------------------+-----------+-------------------+-----------+-----------------------+---------------------+ 1 row in set (0.00 sec) mysql> select * from heartbeat; +----------------------------+-----------+-------------------+-----------+-----------------------+---------------------+ | ts | server_id | file | position | relay_master_log_file | exec_master_log_pos | +----------------------------+-----------+-------------------+-----------+-----------------------+---------------------+ | 2019-07-04T11:20:08.064020 | 2213306 | master-221.000022 | 659558141 | NULL | NULL | +----------------------------+-----------+-------------------+-----------+-----------------------+---------------------+ 1 row in set (0.00 sec) mysql> select * from heartbeat; +----------------------------+-----------+-------------------+-----------+-----------------------+---------------------+ | ts | server_id | file | position | relay_master_log_file | exec_master_log_pos | +----------------------------+-----------+-------------------+-----------+-----------------------+---------------------+ | 2019-07-04T11:20:10.097910 | 2213306 | master-221.000022 | 659633844 | NULL | NULL | +----------------------------+-----------+-------------------+-----------+-----------------------+---------------------+ 1 row in set (0.00 sec)
5、运行pt-hearbeat守护进程连接从库执行监控命令
[root@push-5-221 ~]# pt-heartbeat -uroot -pxxxxxxxxx -h172.28.5.222 --port=3307 -D heartbeat --monitor ******************************************************************* Using the default of SSL_verify_mode of SSL_VERIFY_NONE for client is deprecated! Please set SSL_verify_mode to SSL_VERIFY_PEER possibly with SSL_ca_file|SSL_ca_path for verification. If you really don't want to verify the certificate and keep the connection open to Man-In-The-Middle attacks please set SSL_verify_mode explicitly to SSL_VERIFY_NONE in your application. ******************************************************************* at /usr/bin/pt-heartbeat line 4515. ******************************************************************* Using the default of SSL_verify_mode of SSL_VERIFY_NONE for client is deprecated! Please set SSL_verify_mode to SSL_VERIFY_PEER possibly with SSL_ca_file|SSL_ca_path for verification. If you really don't want to verify the certificate and keep the connection open to Man-In-The-Middle attacks please set SSL_verify_mode explicitly to SSL_VERIFY_NONE in your application. ******************************************************************* at /usr/bin/pt-heartbeat line 4515. # A software update is available: 0.00s [ 0.00s, 0.00s, 0.00s ] 0.00s [ 0.00s, 0.00s, 0.00s ] 0.00s [ 0.00s, 0.00s, 0.00s ] 0.00s [ 0.00s, 0.00s, 0.00s ] 0.00s [ 0.00s, 0.00s, 0.00s ] 0.00s [ 0.00s, 0.00s, 0.00s ] 0.00s [ 0.00s, 0.00s, 0.00s ] 0.00s [ 0.00s, 0.00s, 0.00s ] 0.00s [ 0.00s, 0.00s, 0.00s ] 0.00s [ 0.00s, 0.00s, 0.00s ] 0.00s [ 0.00s, 0.00s, 0.00s ] 0.00s [ 0.00s, 0.00s, 0.00s ] 0.00s [ 0.00s, 0.00s, 0.00s ] 0.00s [ 0.00s, 0.00s, 0.00s ] 0.00s [ 0.00s, 0.00s, 0.00s ] 0.00s [ 0.00s, 0.00s, 0.00s ] 0.00s [ 0.00s, 0.00s, 0.00s ] 0.00s [ 0.00s, 0.00s, 0.00s ] 0.00s [ 0.00s, 0.00s, 0.00s ] 0.00s [ 0.00s, 0.00s, 0.00s ] 0.00s [ 0.00s, 0.00s, 0.00s ] 0.00s [ 0.00s, 0.00s, 0.00s ] 0.00s [ 0.00s, 0.00s, 0.00s ] 0.00s [ 0.00s, 0.00s, 0.00s ] 0.00s [ 0.00s, 0.00s, 0.00s ] ^C
监控数据会每秒刷新一次,可以看到目前主从同步良好,没有延迟。
6、重启主库更新进程
[root@push-5-221 ~]# pt-heartbeat --stop Successfully created file /tmp/pt-heartbeat-sentinel [root@push-5-221 ~]# rm -rf /tmp/pt-heartbeat-sentinel [root@push-5-221 ~]# pt-heartbeat -S /var/lib/mysql/3306/mysql.sock -uroot -pxxxxxxxxxxx -D heartbeat --update --interval=1 --daemonize [root@push-5-221 ~]#
7、使用守护进程监控从库,并输出到日志文件
[root@push-5-221 ~]# pt-heartbeat -uroot -pxxxxxxxxxxx -h172.28.5.222 --port=3307 -D heartbeat --monitor --daemonize --log=/tmp/mysql-slave-sync.log [root@push-5-221 ~]#
8、实时查看日志
[root@push-5-221 ~]# tail -f /tmp/mysql-slave-sync.log 0.00s [ 0.00s, 0.00s, 0.00s ] 0.00s [ 0.00s, 0.00s, 0.00s ] 0.00s [ 0.00s, 0.00s, 0.00s ] 0.00s [ 0.00s, 0.00s, 0.00s ] 0.00s [ 0.00s, 0.00s, 0.00s ] 0.00s [ 0.00s, 0.00s, 0.00s ] 0.00s [ 0.00s, 0.00s, 0.00s ] 0.00s [ 0.00s, 0.00s, 0.00s ] 0.00s [ 0.00s, 0.00s, 0.00s ] 0.00s [ 0.00s, 0.00s, 0.00s ] 0.00s [ 0.00s, 0.00s, 0.00s ] 0.00s [ 0.00s, 0.00s, 0.00s ] 0.00s [ 0.00s, 0.00s, 0.00s ]
9、测试验证
1、登录从库,停掉slave
[root@push-5-222 ~]# mysql -uroot -p -S /var/lib/mysql/3307/mysql.sock Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 207570 Server version: 5.7.26 MySQL Community Server (GPL) Copyright (c) 2000, 2019, 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.07 sec)
2、查看日志
[root@push-5-221 ~]# tail -f /tmp/mysql-slave-sync.log 25.00s [ 5.42s, 1.08s, 0.36s ] 26.00s [ 5.85s, 1.17s, 0.39s ] 27.00s [ 6.30s, 1.26s, 0.42s ] 28.00s [ 6.77s, 1.35s, 0.45s ] 29.00s [ 7.25s, 1.45s, 0.48s ] 30.00s [ 7.75s, 1.55s, 0.52s ] 31.00s [ 8.27s, 1.65s, 0.55s ] 32.00s [ 8.80s, 1.76s, 0.59s ] 33.00s [ 9.35s, 1.87s, 0.62s ] 34.00s [ 9.92s, 1.98s, 0.66s ] 35.00s [ 10.50s, 2.10s, 0.70s ] 36.00s [ 11.10s, 2.22s, 0.74s ] 37.00s [ 11.72s, 2.34s, 0.78s ]
此时已经出现了延迟
3、再次启动从库,同步数据
mysql> start slave; Query OK, 0 rows affected (0.01 sec) mysql>
此时监控同步延迟马上减小到0,表示同步成功,没有延迟。
504.00s [ 474.50s, 354.50s, 141.40s ] 505.00s [ 475.50s, 355.50s, 141.96s ] 506.00s [ 476.50s, 356.50s, 142.52s ] 507.00s [ 477.50s, 357.50s, 143.09s ] 508.00s [ 478.50s, 358.50s, 143.65s ] 509.00s [ 479.50s, 359.50s, 144.22s ] 510.00s [ 480.50s, 360.50s, 144.78s ] 511.00s [ 481.50s, 361.50s, 145.35s ] 512.00s [ 482.50s, 362.50s, 145.92s ] 513.00s [ 483.50s, 363.50s, 146.49s ] 514.00s [ 484.50s, 364.50s, 147.06s ] 515.00s [ 485.50s, 365.50s, 147.63s ] 516.00s [ 486.50s, 366.50s, 148.21s ] 517.00s [ 487.50s, 367.50s, 148.78s ] 518.00s [ 488.50s, 368.50s, 149.36s ] 519.00s [ 489.50s, 369.50s, 149.93s ] 520.00s [ 490.50s, 370.50s, 150.51s ] 521.00s [ 491.50s, 371.50s, 151.09s ] 522.00s [ 492.50s, 372.50s, 151.67s ] 523.00s [ 493.50s, 373.50s, 152.25s ] 524.00s [ 494.50s, 374.50s, 152.83s ] 443.00s [ 494.13s, 375.23s, 153.33s ] 327.02s [ 491.82s, 375.56s, 153.69s ] 0.00s [ 484.03s, 374.81s, 153.69s ] 0.00s [ 476.23s, 374.05s, 153.69s ] 0.00s [ 468.42s, 373.28s, 153.69s ] 0.00s [ 460.58s, 372.52s, 153.69s ] 0.00s [ 452.73s, 371.75s, 153.69s ] 0.00s [ 444.87s, 370.97s, 153.69s ] 0.00s [ 436.98s, 370.20s, 153.69s ] 0.00s [ 429.08s, 369.42s, 153.69s ] 0.00s [ 421.17s, 368.63s, 153.69s ] 0.00s [ 413.23s, 367.85s, 153.69s ] 0.00s [ 405.28s, 367.06s, 153.69s ] 0.00s [ 397.32s, 366.26s, 153.69s ] 0.00s [ 389.33s, 365.47s, 153.69s ]
六、利用Zabbix监控Mysql主从同步
1、使用pt-heartbeat 的--check选项参数,可以返回当前从库的同步延迟数据
[root@push-5-221 zabbix]# pt-heartbeat -uroot -pxxxxxxxxx -h172.28.5.222 --port=3307 -D heartbeat --check 0.00 [root@push-5-221 zabbix]#
2、利用这个返回的延迟数,可以自定义一个zabbix监控项
[root@push-5-221 ~]# vim /usr/local/zabbix/conf/zabbix_agentd.conf
在zabbix_agentd.conf配置文件中添加一个监控项
UserParameter=hlsms.check_mysql_slave_status, pt-heartbeat -uroot -pxxxxxxxxxx -h172.28.5.222 --port=3307 -D heartbeat --check 2>/dev/null
3、启动zabbix_agent服务,使新加监控项生效
[root@push-5-221 ~]# killall zabbix_agentd [root@push-5-221 ~]# zabbix_agentd -c /usr/local/zabbix/conf/zabbix_agentd.conf [root@push-5-221 ~]#
4、在zabbix服务器端利用zabbix_get命令检验监控项
[root@zabbix_server mysh]# zabbix_get -s 172.28.5.221 -p 10050 -k "hlsms.check_mysql_slave_status" 0.00
成功返回最新同步延迟数据
5、在zabbix管控台在主库的主机下新建一个监控项hlsms.check_mysql_slave_status,每10秒监控一次
6、在主库主机上打开最新数据,查看是否有hlsms.check_mysql_slave_status返回的数据
可以看到已经有数据获取到了,正常情况下同步成功没有延迟返回时0.00,有延迟会返回x.00,x表示延迟了多少秒。
7、创建触发器,当同步延迟达到60秒,发送告警,当同步延迟为0时,恢复。
8、测试zabbix监控项
停掉从库
mysql> stop slave; Query OK, 0 rows affected (0.06 sec) mysql>
此时刷新主库主机最新数据hlsms.check_mysql_slave_status监控项
可以看到已经获取到了最新延迟,等到了60后,产生告警
告警成功,再次连接从库,启动同步线程
mysql> start slave; Query OK, 0 rows affected (0.02 sec) mysql>
当完全同步后,返回延迟数据为0,
告警随之恢复
至此,zabbix监控Mysql主从状态配置成功。