zoukankan      html  css  js  c++  java
  • pt-table-checksum 主从复制一致性检查

    1. pt-table-checksum介绍

    http://www.percona.com/doc/percona-toolkit/2.2/pt-table-checksum.html

    pt-table-checksum是percona-toolkit工具集的工具之一。它通过在主库执行基于statement的sql语句来生成主库数据块的checksum,把相同的sql语句传递到从库,并在从库上计算相同数据块的checksum,最后,比较主从库上相同数据块的checksum值,由此判断主从数据是否一致。这种校验是分表进行的,在每个表内部又是分块进行的,而且pt工具本身提供了非常多的限流选项,因此对线上服务的冲击较小。

     

    2. checksum计算原理

    2.1 单行数据checksum值的计算

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

     

    2.2 数据块checksum值的计算

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

     

    2.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. pt-table-checksum的使用

    3.1 安装

    安装依赖包 

    perl-DBI  perl-DBD-MySQL

    安装percona-toolkit

    wget http://www.percona.com/downloads/percona-toolkit/LATEST/percona-toolkit-2.2.7.tar.gz
    
    tar xzvf percona-toolkit-2.2.7.tar.gz
    
    cd percona-toolkit-2.2.7
    
    perl Makefile.PL
    
    make
    
    make install

    3.2  数据库结构

    主从结构,binlog_format=row

    主库:rac3(10.250.7.50)

    从库:rac4(10.250.7.60) 

     

    3.3 登陆主库,配置账号

    需要一个既能登录主库,也能登录从库,而且还能同步数据库的账号

    create user wentao@'%' identified by '123456';

    grant all privileges on *.* to wentao@'%' identified by '123456';

     

    3.4 在表t1中构造不一致的数据

    3.5. 主从一致性检查

    在主库上执行检测:

    pt-table-checksum --nocheck-replication-filters --replicate=yuyue.checksums --databases=yuyue --no-check-binlog-format h=127.0.0.1,u=wentao,p=123456,P=3306

    执行结果参数意义: 

    TS            :完成检查的时间

    ERRORS     :检查时候发生错误和警告的数量

    DIFFS        :0表示一致,1表示不一致。当指定--no-replicate-check时,会一直为0,当指定--replicate-check-only会显示不同的信息

    ROWS       :表的行数

    CHUNKS    :被划分到表中的块的数目

    SKIPPED    :由于错误或警告或过大,则跳过块的数目

    TIME         :执行的时间

    TABLE       :被检查的表名

     

    pt-table-checksum 参数说明:

    --nocheck-replication-filters:不检查复制过滤器(即参数文件里设置的repliacte-do-waild-table等规则)  

    --replicate=yuyue.checksums:把checksums的信息写入指定库,建议直接写到被检查的库里 

    --no-check-binlog-format :不检查复制的binlog格式(这个参数在,binlog_format=row时,一定要加,不然报错)  

    --create-replicate-table:这个参数在第一次运行时添加,用于建立checksums表(但是我测试没加,表能正常建立)  

    --databases=yuyue:指定需要检查的数据库,多个用逗号隔开

    --tables:指定需要被检查的表,多个用逗号隔开

    h=127.0.0.1:Master的地址

    u=wentao:用户名

    p=123456:密码

    P=3306:端口

     

    通过DIFFS=1可以看出主从的表数据不一致。通过查看从库(rac4)上的yuyue.checksums表可以看到主从库的检验信息。

    通过对比this_crc和master_crc,可以看出主备的表是否一致。

    root@rac4 mysql > select * from checksumsG;
    *************************** 1. row ***************************
                db: yuyue
               tbl: t1
             chunk: 1
        chunk_time: 0.000546
       chunk_index: NULL
    lower_boundary: NULL
    upper_boundary: NULL
          this_crc: 246be59    #从库的校验值
          this_cnt: 4      #从库的行数(rac4)
        master_crc: 40deaf21  #主库的校验值
        master_cnt: 3      #主库的行数(rac3)
                ts: 2014-05-11 09:55:14
    *************************** 2. row ***************************
                db: yuyue
               tbl: t2
             chunk: 1
        chunk_time: 0.000397
       chunk_index: NULL
    lower_boundary: NULL
    upper_boundary: NULL
          this_crc: 40deaf21
          this_cnt: 3
        master_crc: 40deaf21
        master_cnt: 3
                ts: 2014-05-11 09:55:14
    *************************** 3. row ***************************
                db: yuyue
               tbl: t3
             chunk: 1
        chunk_time: 0.00042
       chunk_index: NULL
    lower_boundary: NULL
    upper_boundary: NULL
          this_crc: 40deaf21
          this_cnt: 3
        master_crc: 40deaf21
        master_cnt: 3
                ts: 2014-05-11 09:55:14
    3 rows in set (0.00 sec)

    参考文章:

    用pt-table-checksum校验数据一致性

     
     
  • 相关阅读:
    软件工程导论P53,习题2.4
    视图和数据表的区别
    无法从“object”转换为“string”
    Oracle 密码重置
    Struts2 上传下载
    Spring 事务管理
    JSP 指令和动作
    JS 禁用回车、后退事件、form 表单不可编辑
    关于 in 和 exist 的理解
    Oracle clob 操作函数
  • 原文地址:https://www.cnblogs.com/yuyue2014/p/3721436.html
Copyright © 2011-2022 走看看