数据一致性检查之工具 pt-table-checksum疑点介绍

达芬奇密码2018-07-16 16:31

  一个数据库系统,如果在高可用、高可靠和高性能之间让你按优先级排序,你会怎么选?这个问题当然因业务而异,但是对网易云数据库,即基于InnoSQL的RDS来说,高可靠必须是优先级最高的。高可靠要求数据不能有任何一点点丢失,即使数据库服务不可用,也不能丢失数据。

    其实这也很好理解,数据库服务短暂地不可用对于用户来说可能会有一定影响,但是RDS系统强烈要求用户客户端配置重连选项,所以一般情况下不会有什么灾难性结果。但是如果不能保证数据高可靠,对用户来说就是灾难性的的,打个比方,如果余额宝数据库莫名其妙少了几条数据,恰好这条数据就是你的余额记录,那天你正好请妹子吃饭,付款的时候你仗义地说我刷支付宝吧,然后你已迅雷不及掩耳之势打开支付宝,然后,然后,说了一句“我X,不应该啊”。。。当然,这如果是企业的数据后果就不堪设想了。所以RDS系统的最核心保证就是数据不丢失保证。
    顺便打个广告,InnoSQL系统以及RDS系统做了很多努力来保证数据不丢失,包括VSR机制、全1设置等等,很多人可能会说那岂不是牺牲了很多性能来换取高可靠,全1设置确实会使性能降低,但是InnoSQL的伙伴却用很多其他方式(包括Group Commit,并行复制等)补回来了这部分降低的性能,所以InnoSQL在保证数据不丢失的基础上性能也是杠杠的!!!
    接着上面说,对于HA系统来说,数据不丢失不仅仅包括主机数据不丢失,同时也包括主从数据一致。一旦主从数据不一致了,表示肯定有数据丢失。因此对于HA系统来说,最简单地判断数据是否发生了丢失就是主从一致性校验,一旦主从不一致了,肯定是主或从有数据丢失。介绍pt-table-checksum的文章网上很多,本文主要介绍这其中的一个疑点。
从上述引用博文可知,pt-table-checksum的原理粗略地可分为以下几步:
1. 就是先对主库分表分块进行checksum
2. 然后通过主从复制关系将checksum产生的STATEMENT格式的Binlog传给从库
3. 从库执行此Binlog就会对相应表中数据块进行checksum,用checksum生成的值替换掉test.checksums表中this_cnt字段。
4. 然后在从库上执行如下SQL语句就能得到数据是否一致:
select * from percona.checksums where master_cnt <> this_cnt OR master_crc <> this_crc OR ISNULL(master_crc) <> ISNULL(this_crc) \G
但是看完这篇博文之后,就有一个疑问:pt-table-checksum运行时只连接了主库(见下述命令),它是通过什么机制去从库上执行上面的SQL语句的?
pt-table-checksum h='10.165.124.33',u='myadmin',p='myadmin',P=3306 -d mysql --nocheck-replication-filters --no-check-binlog-format --replicate=test.checksums
其中10.165.124.33是主库,10.165.124.34是从库
首先,percona连上主库之后通过show processlist找到所有的从库(10.165.124.34),有一种可能就是如果知道从库的用户名密码就可以登录从库,这样就可以执行数据库一致性检查SQL了,那percona怎么知道从库的用户名密码呢?你已经告诉它了,对,主库的用户名密码就是从库的用户名密码,percona是不是这样做的呢?
为了验证这个猜想,最简单的方法就是将上述主库的用户名密码myadmin/myadmin从从库的mysql.user表中删掉,再执行pt-table-checksum命令,看看是什么结果。
rds-user@rdslibistest0003:~$ pt-table-checksum h='10.165.124.33',u='myadmin',p='myadmin',P=3306 -d libis --nocheck-replication-filters --no-check-binlog-format --replicate=test.checksums
Cannot connect to P=3306,h=10.165.124.34,p=...,u=myadmin
Diffs cannot be detected because no slaves were found.  Please read the --recursion-method documentation for information.
            TS ERRORS  DIFFS     ROWS  CHUNKS SKIPPED    TIME TABLE
12-13T14:35:29      0      0    10000       7       0   3.102 libis.sbtest
结果一下子就大白天下了!上面猜测是正确的,Percona就是通过主库的用户名密码登陆从库,然后从checksums表中获取数据一致性校验结果的。PS:percona的有用工具真多,有时间真得好好研究;

本文来自网易实践者社区,经作者范欣欣授权发布。