标签:style blog http io os 使用 ar strong for
主从数据的一致性校验是个头疼的问题,偶尔被业务投诉主从数据不一致,或者几个从库之间的数据不一致,这会令人沮丧。通常我们仅有一种办法,热备主库,然后替换掉所有的从库。这不仅代价非常大,而且类似治标不治本的方案,让人十分不安。因此我们需要合适的工具,至少帮我们回答下面三个问题:
回答清楚这几个问题,有助于我们决定是否修复,以及修复的方式,还可以帮我们找出不一致的数据,进而定位问题根源。而percona的pt-table-checksum正是我们想要的。
pt-table-checksum是著名的percona-toolkit工具集的工具之一。它通过在主库执行基于statement的sql语句来生成主库数据块的checksum,把相同的sql语句传递到从库,并在从库上计算相同数据块的checksum,最后,比较主从库上相同数据块的checksum值,由此判断主从数据是否一致。这种校验是分表进行的,在每个表内部又是分块进行的,而且pt工具本身提供了非常多的限流选项,因此对线上服务的冲击较小。
pt工具先检查表的结构,并获取每一列的数据类型,把所有数据类型都转化为字符串,然后用concat_ws()函数进行连接,由此计算出该行的checksum值。checksum默认采用crc32,你可以自己定义效率更高的udf。
如果一行一行的计算checksum再去和从库比较,那么效率会非常低下。pt工具选择智能分析表上的索引,然后把表的数据split成一个个chunk,计算的时候也是以chunk为单位。因此引入了聚合函数BIT_XOR()。它的功能可以理解为把这个chunk内的所有行的数据拼接起来,再计算crc32的值,就得到这个chunk的checksum值。sql语句如下:
这其中还有count(*),用来计算chunk包含的行数。每一次对chunk进行checksum后,pt工具都会对耗时进行统计分析,并智能调整下一个chunk的大小,避免chunk太大对线上造成影响,同时也要避免chunk太小而效率低下。
当pt工具在计算主库上某chunk的checksum时,主库可能还在更新,同时从库可能延迟使得relay-log中还有与这个chunk数据相关的更新,那该怎么保证主库与从库计算的是”同一份”数据?答案是加for update当前读锁,这保证了主库的某个chunk内部数据的一致性。否则,1000个人chekcusm同样的1000行数据,可能得到1000个不同的结果,你无法避开mvcc的干扰!获得for update锁后,pt工具开始计算chunk的checksum值,并把计算结果保存到pt工具自建的结果表中(采用replace into select的方式),然后释放锁。该语句最终会传递到从库并执行相同的计算逻辑。
有了上面关键的几点说明,我们再来看看pt工具的内部工作过程,如下图: 简单解释下工作过程:
select * from percona.checksums where master_cnt <> this_cnt OR master_crc <> this_crc OR ISNULL(master_crc) <> ISNULL(this_crc) \G
—check-replication-filters 是否检查复制过滤规则
—check-slave-tables 检查是否所有从库都有被检查的表和列
—chunk-size-limit 每个chunk最大不能超过这个大小,超过就忽略它
—check-interval 多久检查一次主从延迟、主库负载是否达到上限
—check-slave-lag 是否只检查这个从库的延迟
—max-lag 最大延迟,超过这个就等待
—max-load 最大负载,超过这个就等待
—databases 只检查某些库
—tables 只检查某些表
这些过滤选项在修复不一致数据后,检查修复效果很有用。
—resume 因某种原因中断,下次接着执行,不用从头开始
—chunk-time 每个chunk被计算的时间,一般默认为0.5秒
—replicate-check-only :只显示不同步的信息
—no-check-binlog-format :不检查binlog的格式
—create-replicate-table 第一次使用的时候需要创建表
用法举例
master:10.0.0.96
slave:10.0.0.30
主从数据校验命令(主库执行):
./pt-table-checksum --nocheck-replication-filters --databases=db1 --replicate=db1.checksums --create-replicate-table --host=10.0.0.96 --port=3306 -uroot -pqazwsx$%^456
./pt-table-checksum --nocheck-replication-filters --databases=common --replicate=common.checksums --create-replicate-table --host=10.0.0.96 --port=3306 -uroot -pqazwsx$%^456 --no-check-binlog-format
注意:最好新建一个专门用于校验主从数据的用户,用户需要具有的权限为:SELECT, PROCESS, SUPER, REPLICATION SLAVE(主库授权即可)
pt-table-checksum是校验主从数据不一致的最好工具。由于MySQL复制自身的缺陷,或主从切换不严谨,或备份软件bug等原因,都可能导致主从数据的不一致。不管你管不管,不一致都在那里,就看数据对你重不重要,重要的话,就定期做下检查并修复吧。
且看下回分解:用pt-table-sync修复不一致的数据
pt-table-checksum校验mysql主从数据一致性
标签:style blog http io os 使用 ar strong for
原文地址:http://www.cnblogs.com/huminxxl/p/3978559.html