Chinaunix首页 | 论坛 | 博客
  • 博客访问: 69957
  • 博文数量: 7
  • 博客积分: 650
  • 博客等级: 上士
  • 技术积分: 200
  • 用 户 组: 普通用户
  • 注册时间: 2006-03-03 13:35
文章分类

全部博文(7)

文章存档

2013年(6)

2010年(1)

我的朋友

分类: Mysql/postgreSQL

2013-04-07 10:58:51

功能:用于检测mysql复制中主从数据同步一致性的perl工具。

原理:在master对同步表进行checksum,然后比对master 和slave的checksum 是否一致来从而判断数据同步一致性。

          1.chunk。检测过程中pt-table-checksum 以块为单位进行,一个表可以在一个块中,比较大的表也可以被分隔为多个块,对表的切分依赖于索引实现。

          2.slave host。pt-table-checksum 会自动去获取slave 信息,并创建从master到slave的连接,用于检测slave的复制状态,如果复制出现问题(IO/SQL thread 状态是stop 或者slave 延后master 一定时间(测试发现是10s)),

pt-table-checksum 将暂停检测一直等待同步正常。

          3.性能。这样的检测需要在主库执行,pt-table-checksum 以多种方式来避免对主库性能的影响。

               a.对与块大小的限制

               b.对innodb_lock_wait_timeout =1s 的设置。

               c.对load的监控,在load较大(默认25个并发查询)时暂停检测。参数--max-load 。

               d.对表检测超时直接跳转到下一个表。

使用:

     下载          wget

      官方地址    

      解压之后,percona-toolkit-2.1.7/bin 目录下是percona-toolkit所有的工具。

    1.创建账号。

  1. grant select,process,super,replication slave on *.* to 'check'@'10.10.10.10' identified by 'check';

      其中ip 为master的内网ip,这样从master本地登陆和登陆到各个slave都可以。

    2.创建表checksum。也可以授权的时候加上库级别的权限,这样检测中用到表可以自动创建。安全考虑,建议手动创建。

点击(此处)折叠或打开

  1. mysql> show create table checksumG
  2. *************************** 1. row ***************************
  3.        Table: checksum
  4. Create Table: CREATE TABLE `checksum` (
  5.   `db` char(64) NOT NULL,
  6.   `tbl` char(64) NOT NULL,
  7.   `chunk` int(11) NOT NULL,
  8.   `chunk_time` float DEFAULT NULL,
  9.   `chunk_index` varchar(200) DEFAULT NULL,
  10.   `lower_boundary` text,
  11.   `upper_boundary` text,
  12.   `this_crc` char(40) NOT NULL,
  13.   `this_cnt` int(11) NOT NULL,
  14.   `master_crc` char(40) DEFAULT NULL,
  15.   `master_cnt` int(11) DEFAULT NULL,
  16.   `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  17.   PRIMARY KEY (`db`,`tbl`,`chunk`),
  18.   KEY `ts_db_tbl` (`ts`,`db`,`tbl`)
  19. ) ENGINE=InnoDB DEFAULT CHARSET=utf8
  20. 1 row in set (0.00 sec)

     3.检测。几个比较重要的参数:        

          -h -u -p -P  -S -d 连接信息

          --no-check-replication-filters  检测中忽略mysql 配置参数binlog_ignore_db等。

          --chunk-size,--chunk-size-limit 用于指定检测块的大小。可控性更强

          --explain  打印checksum实际运行的sql语句

          --ignore-databases/tables/column  跳出指定元素的过滤

          --lock-wait-timeout   innodb 锁的超时设定,默认为1

          --max-load 设置最大并发连接数     

          --recursion-method   指定获取slave hosts的方式:

                    1.show processlist

                    2.show slave host

                    3.从配置表dsns表中读取,此表需单独创建

          --replicate  指定checksum 存储的db和表,如test.checksum

          --replicate-check-only 只输出数据不一致的信息。

          --help  有这个就行了,以及其他的详见文档。

    4.构建的测试环境:

     master:

  1. mysql> select * from t;
  2.             +----+
  3.             | id |
  4.             +----+
  5.             | 13 |
  6.             +----+
  7.         1 row in set (0.00 sec)

    slave: (模拟数据不一致)

  1. insert into t values(1,12);

    运行方式一:

  1. ./pt-table-checksum -urepl_check -pcheck_repl -h10.135.29.194

     简单的方式:

  1. xcliu@xcliu-VirtualBox:~/tools/percona-toolkit-2.1.7/bin$ ./pt-table-checksum --socket=/mysql/mysqld.sock u='root' -dpttest
  2.             TS ERRORS DIFFS ROWS CHUNKS SKIPPED TIME TABLE
  3. 03-09T10:51:25 0 0 1 1 0 0.052 pttest.t

     输出列解释:    

          TS  检测结束时间

          ERRORS 检测过程的错误或警告

          DIFFS   这个就是我们想要的,数据不一致的块数量

          ROWS   检测的行数,一般为表的数据量

          CHUNKS   块数

          SKIPPED  跳过检测的块数   

          TIME     检测消耗时间

          TABLE   db.table

    运行方式二:只输出数据不一致的块信息

  1. xcliu@xcliu-VirtualBox:~/tools/percona-toolkit-2.1.7/bin$ ./pt-table-checksum --socket=/mysql/mysqld.sock u='root' --replicate-check-only
  2.     Differences on xchliutekiMacBook-Air.local
  3.     TABLE CHUNK CNT_DIFF CRC_DIFF CHUNK_INDEX LOWER_BOUNDARY UPPER_BOUNDARY
  4.     pttest.t 1 3 1

   输出列解释:    

     TABLE  db.table

     CHUNCK 数据不一致的块数

     CNT_DIFF  slave与master 上的数据量差

     CRC_DIFF  slave和master该块的CRC相同则为1,否则为0

     CHUNK_INDEX 切分块使用的索引

     LOWER_BOUNDARY 块下限索引值

     UPPER_BOUNDARY  块上限索引值

阅读(4939) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~