两个TiDB集群之间数据同步,数据一致性检测

【 TiDB 使用环境】生产\测试环境\ POC
【 TiDB 版本】v5.4.2
【遇到的问题】1套集群使用备份恢复初始化数据,通过binlog的方式同步增量数据,现在不知道两个集群数据同步的状态,是否增量数据同步完成了
【复现路径】
1、在旧集群上备份数据;
2、在新集群上恢复数据;
3、旧集群上部署drainer同步增量数据到新集群
【问题现象及影响】如何知道增量数据同步完成
【附件】
以下是新集群tidb_binlog.checkpoint的数据
mysql> select * from checkpoint;
±--------------------±---------------------------------------------------------------------------------------------------------------------------------------------+
| clusterID | checkPoint |
±--------------------±---------------------------------------------------------------------------------------------------------------------------------------------+
| 7141199591139448285 | {“consistent”:true,“commitTS”:435955253777793025,“ts-map”:{“master-ts”:435899089729617923,“slave-ts”:435899515558690818},“schema-version”:0} |
±--------------------±---------------------------------------------------------------------------------------------------------------------------------------------+

  • 相关日志、配置文件、Grafana 监控(https://metricstool.pingcap.com/)
  • TiUP Cluster Display 信息
  • TiUP CLuster Edit config 信息
  • TiDB-Overview 监控
  • 对应模块的 Grafana 监控(如有 BR、TiDB-binlog、TiCDC 等)
  • 对应模块日志(包含问题前后 1 小时日志)

若提问为性能优化、故障排查类问题,请下载脚本运行。终端输出的打印结果,请务必全选并复制粘贴上传。

用tidb_parse_tso参数对时间戳进行转换

2 个赞

select timediff(now(),tidb_parse_tso(substr(checkpoint,32,18))) from tidb_binlog.checkpoint
可以查看上下游集群同步时间的时间差

2 个赞

sync-diff-inspector

tidb 5.0 不建议使用binlog 同步了,可以使cdc同步

https://docs.pingcap.com/zh/tidb/v5.4/tidb-binlog-overview#注意事项

感谢,这是个查询主从同步时间差的一个很好的方法,但是这个方法有问题,只能说时间是一致的,而且是到秒,哪怕时间是一致的也不能直接说明两个集群的数据是一致的。
如果是master-ts=slave-ts这种方式就好,有一个地方显示从库已经同步到主库的哪个TSO,但是明显两个集群的TSO差得很远

修正一下您这个SQL:select timediff(now(),tidb_parse_tso(substr(checkpoint,31,18))) from tidb_binlog.checkpoint;

1 个赞

是准备用CDC,我这个是从4.0升上来的

感谢,目前用的这个工具

那接下来用sync-diff-inspector进行一下数据校验

1 个赞

啊,看到了,没事了:+1:

1 个赞

觉得可以这样,
1、用select timediff(now(),tidb_parse_tso(substr(checkpoint,31,18))) from tidb_binlog.checkpoint;确认从库的增量数据已经同步的差不多了(数据库较大的话,主库做备份,从库恢复可能需要较长一段时间);
2、停主库的写入;
3、用sync-diff-inspector进行数据一致性校验。

可以直接按照checkpoint的值进行比对,只要这部分数据一致,一段时间以后在比一次就好,不需要停主库的写入吧

1 个赞

不停就会持续写入,永远达不到一致的

哦,忘了说声,我这个是想确认数据一致后进行数据库切换

嗯 ,问一下:
这个上游和下游分别是干嘛的 上游是目前有业务的?
下游是正在进行同步没业务的?
想把上游的业务切换到下游?

1 个赞

双机房,上游是有业务的,下游新建集群,要做备份恢复和增量同步

那数据校验是有一定时间的,能接受时间范围的停止业务写入吗,是不是该先校验,在停写入、切换

1 个赞

校验是需要先停止业务的,保证两边不写入

可以指定snapshot进行吧,这样取一个范围做数据校验,检验完毕之后我们在停业务然后切换数据库,这样是不是停业务的时间会特别短呢,当然,这样的话在校验数据开始之后的数据写入是不知道他是不是一致的。

1 个赞