一文了解 TiDB 的数据对比工具 sync-diff-inspector
作者: 数据源的 TiDB 学习之路原文来源:https://tidb.net/blog/23f49fc7
近年来诸多行业都开始进行数据库国产化替换的工作,如金融行业的银行、证券等。由于金融行业对数据一致性有严格的要求,在进行国产化替换时一般会选择较为有保障的主备库或多数据中心容灾方案,并且需要定期对上下游库进行数据一致性的比较。
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 官方文档查看详细资料。
版权声明: 本文为 InfoQ 作者【TiDB 社区干货传送门】的原创文章。
原文链接:【http://xie.infoq.cn/article/9f7b817f85ae58b27ac3a6cbd】。文章转载请联系作者。
评论