0%

mysql【主从同步工具percona-toolkit安装使用】

percona-toolkit介绍

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

  1. 检查master和slave数据的一致性
  2. 有效地对记录进行归档
  3. 查找重复的索引
  4. 对服务器信息进行汇总
  5. 分析来自日志和tcpdump的查询
  6. 当系统出问题的时候收集重要的系统信息

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

  1. pt-table-checksum 负责监测mysql主从数据一致性
  2. pt-table-sync 负责当主从数据不一致时修复数据,让它们保存数据的一致性
  3. pt-heartbeat 负责监控mysql主从同步延迟

percona-toolkit安装

  1. 安装依赖
# 安装依赖
yum install perl-IO-Socket-SSL perl-DBD-MySQL perl-Time-HiRes perl perl-DBI -y
  1. 下载安装包
  • 百度云盘下载地址:https://pan.baidu.com/s/1bp1OOgf (提取密码:y462)
  • wget https://www.percona.com/downloads/percona-toolkit/2.2.7/RPM/percona-toolkit-2.2.7-1.noarch.rpm
  1. 安装
rpm -ivh percona-toolkit-2.2.7-1.noarch.rpm

percona-toolkit使用

pt-table-checksumPercona-Toolkit的组件之一,用于检测MySQL主、从库的数据是否一致。其原理是在主库执行基于statement的sql语句来生成主库数据块的checksum,把相同的sql语句传递到从库执行,并在从库上计算相同数据块的checksum,最后,比较主从库上相同数据块的checksum值,由此判断主从数据是否一致。

为了减少对数据库的干预,pt-table-checksum还会自动侦测并连接到从库,当然如果失败,可以指定–recursion-method选项来告诉从库在哪里。它的易用性还体现在,复制若有延迟,在从库 checksum 会暂停直到赶上主库的计算时间点。

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

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

创建授权帐号

-- 工具在主库上执行,IP写主库IP
mysql> GRANT SELECT, PROCESS, SUPER, REPLICATION SLAVE,CREATE,DELETE,INSERT,UPDATE ON *.* TO 'pt'@'192.168.41.141' identified by '123456';
mysql> flush privileges;

pt-table-checksum

在主(master)上通过执行校验的查询对复制的一致性进行检查,对比主从的校验值,从而产生结果。

注意:第一次运行的时候需要加上--create-replicate-table参数,生成checksums表!

常用参数解释:

--nocheck-replication-filters 不检查复制过滤器,建议启用。
--no-check-binlog-format 不检查复制的binlog模式,要是binlog模式是ROW,则会报错。
--replicate-check-only 只显示不同步的信息。
--replicate= 把checksum的信息写入到指定表中,建议直接写到被检查的数据库当中。
--databases= 指定需要被检查的数据库,多个则用逗号隔开。
--tables= 指定需要被检查的表,多个用逗号隔开
--recursion-method 指定复制检查的方式,默认为processlist,hosts
h= Master的地址
u= 用户名
p= 密码
P= 端口
-- 从库需要开启slave;
start slave;
show slave status\G

-- 主库processlist可以查到slave
mysql> show processlist;
+--------+-------------+---------------+------+------------------+--------+---------------------------------------------------------------+------------------+
| Id     | User        | Host          | db   | Command          | Time   | State                                                         | Info             |
+--------+-------------+---------------+------+------------------+--------+---------------------------------------------------------------+------------------+
|      2 | system user |               | NULL | Connect          | 589655 | Slave has read all relay log; waiting for more updates        | NULL             |
|   2049 | slave       | mysql02:37382 | NULL | Binlog Dump GTID | 587611 | Master has sent all binlog to slave; waiting for more updates | NULL             |
| 588590 | root        | localhost     | NULL | Query            |      0 | starting                                                      | show processlist |
+--------+-------------+---------------+------+------------------+--------+---------------------------------------------------------------+------------------+
3 rows in set (0.03 sec)
# 执行检查命令,注意第一次添加--create-replicate-table参数创建表
[root@mysql01 ~]# pt-table-checksum --nocheck-replication-filters --no-check-binlog-format --replicate=test2.checksums --create-replicate-table --databases=test h=192.168.41.141,u=pt,p=123456,P=3306
            TS ERRORS  DIFFS     ROWS  CHUNKS SKIPPED    TIME TABLE
08-05T17:35:54      0      1       13       1       0   0.091 test.t_department
08-05T17:35:54      0      0        8       1       0   0.202 test.testttt

# 结果字段说明
# TS :完成检查的时间。
# ERRORS :检查时候发生错误和警告的数量。
# DIFFS :0表示一致,1表示不一致。当指定--no-replicate-check时,会一直为0,当指定--replicate-check-only会显示不同的信息。
# ROWS :表的行数。
# CHUNKS :被划分到表中的块的数目。
# SKIPPED :由于错误或警告或过大,则跳过块的数目。
# TIME :执行的时间。
# TABLE :被检查的表名。

[root@mysql01 ~]# pt-table-checksum --nocheck-replication-filters --no-check-binlog-format --replicate=test2.checksums --no-replicate-check  --databases=test h=192.168.41.141,u=pt,p=123456,P=3306
            TS ERRORS  DIFFS     ROWS  CHUNKS SKIPPED    TIME TABLE
08-06T09:30:43      0      0       13       1       0   0.023 test.t_department
08-06T09:30:43      0      0        8       1       0   0.033 test.testttt
[root@mysql01 ~]# pt-table-checksum --nocheck-replication-filters --no-check-binlog-format --replicate=test2.checksums --replicate-check-only --databases=test h=192.168.41.141,u=pt,p=123456,P=3306
Differences on mysql02
TABLE CHUNK CNT_DIFF CRC_DIFF CHUNK_INDEX LOWER_BOUNDARY UPPER_BOUNDARY
test.t_department 1 0 1 

pt-table-sync

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

# 参数解释:
# --replicate= :   指定通过pt-table-checksum得到的表,这2个工具差不多都会一直用。
# --databases= :    指定执行同步的数据库。
# --tables= :      指定执行同步的表,多个用逗号隔开。
# --sync-to-master :指定一个DSN,即从的IP,他会通过show processlist或show slave status 去自动的找主。
# h= :             服务器地址,命令里有2个ip,第一次出现的是Master的地址,第2次是Slave的地址。
# u= :             帐号。
# p= :             密码。
# --print :        打印,但不执行命令。打印出来修复数据的sql语句,可以手动的在slave从库上执行,让他们数据保持一致性
# --execute :      执行命令。

[root@mysql01 ~]# pt-table-sync --replicate=test2.checksums h=192.168.41.141,u=pt,p=123456 h=192.168.41.142,u=pt,p=123456 --print
REPLACE INTO `test`.`t_department`(`department_id`, `department_name`, `parent_id`, `level`, `create_time`, `update_time`) VALUES ('7', '8', '0', '1', '2020-07-28 16:06:40', '2020-07-28 16:06:40') /*percona-toolkit src_db:test src_tbl:t_department src_dsn:h=192.168.41.141,p=...,u=pt dst_db:test dst_tbl:t_department dst_dsn:h=mysql02,p=...,u=pt lock:1 transaction:1 changing_src:test2.checksums replicate:test2.checksums bidirectional:0 pid:114329 user:root host:mysql01*/;


[root@mysql01 ~]# pt-table-sync --replicate=test2.checksums h=192.168.41.141,u=pt,p=123456 h=192.168.41.142,u=pt,p=123456 --print --execute
REPLACE INTO `test`.`t_department`(`department_id`, `department_name`, `parent_id`, `level`, `create_time`, `update_time`) VALUES ('7', '8', '0', '1', '2020-07-28 16:06:40', '2020-07-28 16:06:40') /*percona-toolkit src_db:test src_tbl:t_department src_dsn:h=192.168.41.141,p=...,u=pt dst_db:test dst_tbl:t_department dst_dsn:h=mysql02,p=...,u=pt lock:1 transaction:1 changing_src:test2.checksums replicate:test2.checksums bidirectional:0 pid:115260 user:root host:mysql01*/;

# 同步之后再次查看,主从数据已经同步
[root@mysql01 ~]# pt-table-checksum --nocheck-replication-filters --no-check-binlog-format --replicate=test2.checksums --databases=test h=192.168.41.141,u=pt,p=123456,P=3306
            TS ERRORS  DIFFS     ROWS  CHUNKS SKIPPED    TIME TABLE
08-06T09:36:23      0      0       13       1       0   0.293 test.t_department
08-06T09:36:23      0      0        8       1       0   0.018 test.testttt

可以编写脚本定时同步主备库数据

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

pt-heartbeat

对于MySQL数据库主从复制延迟的监控,可以借助pt-heartbeat来实现。

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

  1. 在主上创建一张heartbeat表,按照一定的时间频率更新该表的字段(把时间更新进去)。监控操作运行后,heartbeat表能促使主从同步!
  2. 连接到从库上检查复制的时间记录,和从库的当前系统时间进行比较,得出时间的差异。

参考链接