将 TiDB 集群的增量数据实时同步到另一集群

本文档介绍如何配置一个 TiDB 集群以及该集群的 TiDB 或 MySQL 从集群,并将增量数据实时从主集群同步到从集群。

如果你需要配置一个运行中的 TiDB 集群和其从集群,以进行实时增量数据同步,可使用 Backup & Restore (BR)DumplingTiDB Binlog

实现原理

任何写入 TiDB 的事务均被指定了唯一的 commit TS(commit 时间戳),可以通过该 TS 获取一个 TiDB 集群全局一致的状态。

通过 BR 或者 Dumpling 将集群的数据从一个全局一致的时间点导出,然后再用 TiDB Binlog 衔接这个全局一致的时间点开启增量同步,即同步过程分为全量同步和增量同步两个阶段:

  1. 执行全量备份恢复,并且获取到备份数据的 commit TS。
  2. 执行增量同步,确保增量同步的起始点是备份数据的 commit TS。

注意:

导出备份数据时的 commit TS 是闭区间,使用 TiDB Binlog 开启同步的 initial-commit-ts 是开区间。

同步操作步骤

假设现有 A 集群正常运行,你需要先新建一个 B 集群作为 A 集群的从集群,并将 A 集群的数据实时增量进行同步到 B 集群,可以通过以下步骤来实现。

步骤一:开启 TiDB Binlog

确保 A 集群已经部署并且开启了 TiDB Binlog。

步骤二:全量导出集群数据

  1. 使用以下任一工具将集群 A 的数据全局一致地导出到指定路径下:

  2. 获取全局一致的时间戳 COMMIT_TS

    • 使用 BR validate 指令获取备份的时间戳,示例如下:

      1. COMMIT_TS=`br validate decode --field="end-version" -s local:///home/tidb/backupdata | tail -n1`
    • 或者查阅 Dumpling metadata 获取 Pos (COMMIT_TS)。

      1. cat metadata
      1. Started dump at: 2020-11-10 10:40:19
      2. SHOW MASTER STATUS:
      3. Log: tidb-binlog
      4. Pos: 420747102018863124
      5. Finished dump at: 2020-11-10 10:40:20
  3. 将集群 A 的数据导入 B 集群。

步骤三:同步增量数据

修改 TiDB Binlog 的 drainer.toml 配置文件,增加如下配置,从指定的位置 COMMIT_TS 开始将数据同步至 B 集群。

  1. initial-commit-ts = COMMIT_TS
  2. [syncer.to]
  3. host = {B 集群的 IP 地址}
  4. port = 3306