近年来诸多行业都开始进行数据库国产化替换的工作,如金融行业的银行、证券等。由于金融行业对数据一致性有严格的要求,在进行国产化替换时一般会选择较为有保障的主备库或多数据中心容灾方案,并且需要定期对上下游库进行数据一致性的比较。
TiDB作为国产化选型中一个十分常用的数据库,产品自带一款用于数据对比的工具sync-diff-inspector,它主要用来检验MySQL/TiDB中的数据一致性,并提供了修复数据的功能。下文具体介绍sync-diff-inspector数据对比工具的相关细节。
一. sync-diff-inspector有哪些能力
sync-diff-inspector是一款数据对比工具,它的主要能力包括:
- 支持表结构和数据对比
- 对比不一致时可生成用于数据修复的SQL,但如果表上没有主键或唯一索引时可能无法保证数据正确性
- 支持上下游不同库名或表名的数据校验
- 支持MySQL到TiDB的历史数据校验,如果是在线校验则需要配置校验某个数据范围
- 支持TiDB主从集群的在线数据校验
- 支持从TiDB DM拉取配置的数据校验
二. Sync-diff-inspector如何使用
要使用sync-diff-inspector进行数据一致性比较,前提是得有待校验的源库和目标库,如MySQL->TiDB或TiDB->TiDB,再者就是安装配置这个工具并运行对比命令。
安装sync-diff-inspector有两种方式,二进制文件或docker镜像,我们选择下载离线包的方式,在tidb的toolkit工具包中包含sync_diff_inspector可执行文件。
接着我们需要编辑一个配置文件config.toml,这是最重要的一个部分,根据具体要校验的内容,需要在配置文件中进行几部分的配置:
- 通用配置。如校验并发数、是否输出修复SQL、仅对比表结构还是同时对比数据、是否跳过检验不存在的表。
- 数据源配置。包括上下游的数据源实例。
- 路由规则。当上下游表名不同时或合库合表场景比对时需要配置一些映射规则。
- 配置要校验的表。指定哪些表需要校验。
- 对具体表的特殊配置。如指定对比范围、忽略哪些个对比字段等。
具体的配置示例可参考官网 sync-diff-inspector 用户文档 | PingCAP 文档中心
完成配置文件编辑后,便可以通过指定配置文件来运行sync_diff_inspector可执行文件进行数据对比了,具体的命令为 ./sync_diff_inspector --config=./config.toml
三. Sync-diff-inspector使用实践
1. Mysql->TiDB静态数据校验
首先构造一个MySQL->TiDB的数据对比测试,对比的表在源库和目标库中表结构一致,数据均有5条记录,其中有1条记录不一致。
对比配置文件内容如下,此配置表示对比MySQL和TiDB中表名为test.test1的表结构及数据是否一致、如果不一致输出修复SQL语句。
执行对比命令,输出内容显示有一张表进行了对比而且对比失败。详细输出内容保存在output/fix-on-tidb0/目录下,对比日志保存在/output/sync_diff.log。
查看output输出目录,checkpoint保存断点续传信息(本示例中为空),fix-on-target目录保存用于修复不一致的SQL文件,summary.txt保存校验统计结果。查看fix-on-target下的文件可以看出,针对不一致的行生成了一条replace into语句,表示在下游库执行这条SQL可以实现结果与上游库一致。summary.txt文件中输出了上下游数据库的连接信息以及对比统计结果,输出表明所对比的表结构一致,数据有1行不一致(DATA DIFF ROWS +1/-1)。
2. TiDB->TiDB动态数据校验
TiDB->TiDB的数据一致性校验相比MySQL->TiDB的校验最主要区别在于它支持在线数据一致性校验,即上游TiDB不断有数据写入情况下的校验。TiDB到TiDB的数据同步最常用的方式是使用TiCDC实时同步工具,我们在文章 初识TiDB的增量数据同步工具TiCDC 介绍了TiCDC的基本用法。在基于TiCDC的主从同步场景中,由于数据是实时变化的,如果要进行数据一致性的比对,需要在TiCDC开启一个特殊的syncpoint功能。应用syncpoint功能后,可以对上下游TiDB集群进行一致性快照读和数据一致性校验。
假设我们有两套TiDB集群,且上游集群也安装了TiCDC。首先我们编辑以下changefeed.toml配置文件,它代表打开TiCDC任务中的syncpoint功能。
其次,基于上述配置文件创建一个changefeed任务,并使用相关命令查看changefeed,从输出可以看出syncpoint功能已经生效。
实际上,在TiCDC启用syncpoint功能后,下游的TIDB集群会自动创建数据库tidb_cdc并在tidb_cdc库下创建syncpoint_v1表,表中的数据记录着上游快照TSO(primary_ts)及下游快照TSO(secondary_ts)。
基于上下游TSO,我们可以让sync-diff-inspector分别对上下游进行一致性快照读,如果数据校验正常,代表基于此快照的上下游数据是完全一致的。当然,需要在数据库配置中额外增加一项snapshot配置,如下图所示snapshot = "auto", 代表使用 TiCDC 在上下游的同步时间点。
执行数据校验后,通过查看output/summary.txt并对比tidb_cdc.syncpoint_v1发现,每次数据对比时均按照当前TiCDC所记录的最大的上下游TSO来进行快照一致性对比,tidb_cdc.syncpoint_v1表中的数据也在不断变化累加。
四. sync-diff-inspector使用小结
本文较完整的概述了TiDB之sync-diff-inspector数据对比工具,并通过实际案例演示如果使用这款工具进行MySQL->TiDB的静态数据比对以及TiDB->TiDB的动态数据比对,了解到要使用TiDB->TiDB的动态数据比对需要开启TiCDC中的syncpoint功能。由于本篇幅只是一个基础的知识了解,涉及到各种复杂的配置未作过多描述,读者可基于TiDB官方文档查看详细资料。