zoukankan      html  css  js  c++  java
  • pt-table-checksum工具MySQL主从复制数据一致性

    所使用的工具是pt-table-checksum

    原理是:

    在主上执行检查语句去检查 mysql主从复制的一致性,生成 replace 语句,然后通过复制传递到从库,再通过update 更新 master_src 的值。最后通过检测从上 this_src 和master_src 的值从而判断复制是否一致。

    这个过程中,需要在主库上指定用户,因为主库使用此账户不仅登陆自己的MySQL,还使用它来登陆从库的节点。所以为了减少不必要的麻烦,干脆我们在主库和从库上都创建一个统一用户(用户名和密码和权限都一样)。至少有”SELECT“、”LOCK TABLES“、”PROCESS“,”SUPER“这四个权限。例如像下面创建的这个:

     GRANT SELECT,LOCK TABLES,PROCESS,SUPER on *.* to repl_user@'%';   #主机保证在同一子网。

    它的原理解释,例如:

    在主库上:

    mysql> select * from checksums;
    +------+------+-------+------------+-------------+----------------+----------------+----------+----------+------------+------------+---------------------+
    | db   | tbl  | chunk | chunk_time | chunk_index | lower_boundary | upper_boundary | this_crc | this_cnt | master_crc | master_cnt | ts                  |
    +------+------+-------+------------+-------------+----------------+----------------+----------+----------+------------+------------+---------------------+
    | haha | hehe |     1 |   0.004822 | NULL        | NULL           | NULL           | d9f72b   |        1 | d9f72b     |          1 | 2019-01-11 06:42:02 |
    +------+------+-------+------------+-------------+----------------+----------------+----------+----------+------------+------------+---------------------+
    1 row in set (0.00 sec)

    然后我们在从库查看这个表:

    MySQL [haha]> select * from checksums;
    +------+------+-------+------------+-------------+----------------+----------------+----------+----------+------------+------------+---------------------+
    | db   | tbl  | chunk | chunk_time | chunk_index | lower_boundary | upper_boundary | this_crc | this_cnt | master_crc | master_cnt | ts                  |
    +------+------+-------+------------+-------------+----------------+----------------+----------+----------+------------+------------+---------------------+
    | haha | hehe |     1 |   0.004822 | NULL        | NULL           | NULL           | d9f72b   |        1 | d9f72b     |          1 | 2019-01-11 14:42:02 |
    +------+------+-------+------------+-------------+----------------+----------------+----------+----------+------------+------------+---------------------+
    1 row in set (0.00 sec)

    可以看出主从数据是一致的。这个工具就是依赖在某个数据库下创建checksums表,从而依次检测主从库的信息是否一致来确保主从的数据一致性。

    上面只是讲解了一下原理而已,具体步骤如何操作呢?

    比如我们现在比较haha这个数据库的差异情况,现在在主库上执行:

    [root@: ~/tidb-bench/sysbench]#pt-table-checksum --no-check-binlog-format --nocheck-replication-filters --databases=haha --replicate=haha.checksums --host=127.0.0.1 -uroot -p123456 
                TS ERRORS  DIFFS     ROWS  CHUNKS SKIPPED    TIME TABLE
    01-11T06:45:30      0      0        1       1       0   0.016 haha.hehe

    这里的--host是主库的IP地址,这里需要先填写的信息都是主库的信息。

    从”DIFFS“这个状态值负责判断主从是否一致,从这里可以看出主从是一致的。

    --replicate-check:执行完 checksum 查询在percona.checksums表中,不一定马上查看结果呀 —— yes则马上比较chunk的crc32值并输出DIFFS列,否则不输出。默认yes,如果指定为--noreplicate-check,一般后续使用下面的--replicate-check-only去输出DIFF结果。
    
    --replicate-check-only:不在主从库做 checksum 查询,只在原有 percona.checksums 表中查询结果,并输出数据不一致的信息。周期性的检测一致性时可能用到。
    
    --nocheck-binlog-format:不检测日志格式。这个选项对于 ROW 模式的复制很重要,因为pt-table-checksum会在 Master和Slave 上设置binlog_format=STATEMENT(确保从库也会执行 checksum SQL),MySQL限制从库是无法设置的,所以假如行复制从库,再作为主库复制出新从库时(A->B->C),B的checksums数据将无法传输。(没验证)
    
    --replicate= 指定 checksum 计算结果存到哪个库表里,如果没有指定,默认是 percona.checksums 。
    但是我们检查使用的mysql用户一般是没有 create table 权限的,所以你可能需要先手动创建:

    我觉得这个博客写的相当好,我写的只是适用于自己的环境下,详细可以参考这个:https://segmentfault.com/a/1190000004309169

  • 相关阅读:
    PHP各种读取文件的函数效率对比
    一篇不错的session与cookie机制的文章
    Yahoo!团队实践分享:网站性能优化的34条黄金守则
    PHP魔术函数集锦
    MySQL索引类型一览 让MySQL高效运行起来
    Mysql的索引和查询优化
    MySQL简单查询性能分析
    kafka进阶一
    Event Loop
    如何提高 Webpack 的构建速度、优化前端性能?NPM 的模块构建优先选用ES6还是ES5?如何吃透复杂的插件体系,源码如何阅读?
  • 原文地址:https://www.cnblogs.com/FengGeBlog/p/10255289.html
Copyright © 2011-2022 走看看