架构
主:172.17.100.80
从:172.17.100.104
sysbench:172.17.100.100
MySQL版本:5.7.24
首先完成主从的搭建
参考文档:基于GTID的主从搭建
sysbench创建数据到主库
参考文档:sysbench安装及使用
Percona组件的部署
yum install -y perl-DBI perl-DBD-MySQL perl-Time-HiRes perl-IO-Socket-SSL
yum install -y http://www.percona.com/downloads/percona-release/redhat/0.1-4/percona-release-0.1-4.noarch.rpm
yum install -y percona-toolkit
验证Percona组件部署是否正常
pt-query-digest --help
pt-heartbeat测试复制延迟
#搭建配置
主库创建数据库pt(自动同步到从库,从库无需创建)
create database pt;
在搭建pt组件的机器上执行
pt-heartbeat -D pt --update -uroot -p密码 -P主库端口 -h主库IP --create-table --daemonize
创建完成后,在pt库里会有一张heartbeat表
#查看复制延迟的执行
pt-heartbeat -D pt --monitor -uroot -p密码 -P从库端口 -h从库IP
如果把monitor改成check,会只刷新一次
(监控复制延迟效果如下,这是一个sysbench导入时的复制延迟监控)
以下图第一行为例,意思是
延迟时间:当前364秒【334.5秒(1分内平均),214.5秒(5分内平均),73.83秒(15分内平均)】
pt-table-checksum
主库:172.17.100.80
从库:172.17.100.104
Percona组件部署IP:172.17.100.104
到主库执行
GRANT SELECT, DELETE,INSERT,UPDATE, CREATE, DROP, PROCESS, INDEX, SUPER, EXECUTE, REPLICATION SLAVE ON *.* TO ptsum@'%' identified by 'ptsum';
GRANT SELECT, DELETE,INSERT,UPDATE, CREATE, DROP, PROCESS, INDEX, SUPER, EXECUTE, REPLICATION SLAVE ON *.* TO ptsum@localhost identified by 'ptsum';
反正开启了主从同步,这玩意也会自己同步到从库的
老版本的checksum需要自己去建表,新版本则不需要手动建表了,我这里是新版本,不存在手动建表的操作
#到部署有Percona组件的机器上执行
pt-table-checksum --nocheck-replication-filters --replicate=test.checksums --databases=需要检测一致性的库 --no-check-binlog-format h=主库IP,u=ptsum,p=主库密码,P=主库端口
说明一下上面这条语句
--replicate=test.checksums test.checksums表就是我们前面说的新版本自动创建的表,确保别建在业务库下就行,test库要存在;这张表会用来存放每次校对之后的结果,有参数可以选择在校对之前清空这张表,具体的不在这里讨论
--databases=需要检测一致性的库 比如我要比对主从的sbtest库是否一致,则--databases=sbtest
--no-check-binlog-format 该参数必须写上,默认是statement,但生产库通常是row格式
前面的语句执行结果如下(红框处为0,表示数据一致)
关于DSN
如果主库端口和从库端口不同;或者一个主库有非常多的从库;这种时候很可能出现checksum在连入到主库之后根本无法找到从库的情况,这时候就需要添加一条路由来指引从库了,这也就是DSN
登录主库,仍然使用test库,创建一张dsn表
use test;
CREATE TABLE `dsns` ( `id` int(11) NOT NULL AUTO_INCREMENT,`parent_id` int(11) DEFAULT NULL,`dsn` varchar(255) NOT NULL,PRIMARY KEY (`id`));
insert into dsns values(1,1,'h=slave的IP,u=ptsum,p=ptsum,P=从库端口');
#到部署有Percona组件的机器上执行
pt-table-checksum --nocheck-replication-filters --replicate=test.checksums --databases=sbtest --no-check-binlog-format h=主库IP,u=ptsum,p=ptsum,P=主库端口 --recursion-method dsn=t=test.dsns,h=从库IP,u=ptsum,p=ptsum,P=从库端口
上面那条语句的意思就是用pt登录到主库上,通过读取主库dsn里面的路由关系去找到从库,然后进行一致性校验
如果pt在主库上有部署,那么加粗斜体部分的主库ip等内容是可以不写的,但u和p要写出来,否则会以root方式去登陆mysql
--recursion-method这个参数就表示会以dsn去寻找从库了,后面需要跟上dsn的相关参数
执行效果如下
pt-table-sync
从库上执行操作
delete from sbtest1 limit 10;
此时主库和从库的sbtest1表相差10行数据
通过checksum查看
#根据检查生成的test.checksums进行数据的快速恢复
pt-table-sync --execute h=主库IP,u=root,p=主库密码 --replicate test.checksums 主库hostname
(本来想着主库的test.checksums也会同步到从库上,上面的语句试了下h=从库IP,执行倒是不报错,但数据没有恢复成功)
执行完成后,删掉的10条数据被补全
#如果没有经过checksum,直接同步2个库中某个表,则采用下列语句
pt-table-sync --execute h=主库IP,D=sbtest,t=sbtest1,u=root,p=主库密码 h=从库IP,u=root,p=从库密码 --no-check-slave
pt-osc
待续...