TiCDC是一款通过拉取 TiKV 变更日志实现的 TiDB 增量数据同步工具,具有将数据还原到与上游任意 TSO 一致状态的能力,同时提供开放数据协议 (TiCDC Open Protocol),支持其他系统订阅数据变更。
TiCDC 的系统架构如下图所示:

TiCDC可以支持将增量数据同步至下游的TiDB实例,但是需要先对要同步的数据进行初始化,针对需要初始化的数据量级采取不同的方式进行数据同步操作;具体实现如下:
备份工具的特点:
1、dumpling:可以把存储在TiDB或者mySQL数据导出为SQL格式,用于逻辑全量备份;导出后数据可以恢复到TiDB数据库,适用于
2、br:通过对大数据量的 TiDB 集群进行数据备份和恢复,实现数据迁移;适用大量新数据需要迅速导入到tidb中,每小时400GB~500GB
一、轻量级数据同步
实现方式:dumpling+lightning+ticdc
优点: 不需要额外存储资源,操作方便
1、如果tikv_gc_life_time值设置较小,先调整该值,此次操作将其调整为8h
set global tidb_gc_life_time=8h
2、执行dumpling对源端tidb实例需要同步的表进行初始数据导出,具体命令如下:
./dumpling -udumpling -p’xxx’ -h10.xx.xx.xx -P4000 --filetype sql --threads 16 -s 1000000 --tidb-mem-quota-query 10485760 -o /data/opdir/ > /data/opdir/dumpling.log 2>&1
3、执行lightning进行数据导入,配置文件和操作命令如下:
nohup ./tidb-lightning -config tidb-lightning.toml > nohup.out &
编辑配置文件(遵照官方文档),vi tidb-lightning.toml
[lightning]
# 日志
level = “info”
file = “tidb-lightning.log”
index-concurrency = 2
table-concurrency = 6
io-concurrency = 5
[tikv-importer]
# 选择使用的 local 后端
backend = “local”
# 设置排序的键值对的临时存放地址,目标路径需要是一个空目录
sorted-kv-dir = “/data/tidb-transfer/sorted-kv-dir”
addr = “xxxx:port”
[checkpoint]
# 是否启用断点续传。
# 导入数据时,TiDB Lightning 会记录当前表导入的进度。
# 所以即使 TiDB Lightning 或其他组件异常退出,在重启时也可以避免重复再导入已完成的数据。
enable = true
# 存储断点的数据库名称。
schema = “tidb_lightning_checkpoint”
driver = “file”
dsn = “/tmp/tidb_lightning_checkpoint.pb”
# 存储断点的方式。
# - file:存放在本地文件系统。
# - mysql:存放在兼容 MySQL 的数据库服务器。
[mydumper]
# 源数据目录。
data-source-dir = “/data/tidb-transfer/my_datasource”
# 配置通配符���则,默认规则会过滤 mysql、sys、INFORMATION_SCHEMA、PERFORMANCE_SCHEMA、METRICS_SCHEMA、INSPECTION_SCHEMA 系统数据库下的所有表
# 若不配置该项,导入系统表时会出现“找不到 schema”的异常
filter = [’*.*’, ‘!mysql.*’, ‘!sys.*’, ‘!INFORMATION_SCHEMA.*’, ‘!PERFORMANCE_SCHEMA.*’, ‘!METRICS_SCHEMA.*’, ‘!INSPECTION_SCHEMA.*’,’!test.*’]
batch-import-ratio = 0.75
no-schema = false
character-set = “auto”
data-character-set = “binary”
data-invalid-char-replace = “\uFFFD”
strict-format = false
[tidb]
# 目标集群的信息
host = “10.xx.xx.xx”
port = 4000
user = “lightning”
password = “xxxxxx”
# 表架构信息在从 TiDB 的“状态端口”获取。
status-port = 10080
# 集群 pd 的地址
pd-addr = “10.xxxx.xxx.xx:2379”
log-level = “error”
build-stats-concurrency = 20
distsql-scan-concurrency = 100
index-serial-scan-concurrency = 20
checksum-table-concurrency = 16
sql-mode = “ONLY_FULL_GROUP_BY,NO_ENGINE_SUBSTITUTION”
max-allowed-packet = 67_108_864
4、查看dumpling时对应的ts信息

5、创建ticdc的任务,指定导出数据时候的ts
./cdc cli changefeed create --pd=http://10.xx.xx.xxx:2379 --sink-uri=“tidb://dbadmin:abcd1234@10.xxx.xxx.xxx:4000/?max-txn-row=500” --changefeed-id=“simple-replication-task” --sort-engine=“unified” --start-ts=“477517256” --config=changefeed_tidb.toml
6、查看任务状态是否正常,命令如下
cdc cli changefeed query -s --pd=http://10.xx.xx.xxx:2379 --changefeed-id=simple-replication-task
二、重量级数据同步
实现方式:br+ticdc
方案优点: 数据量大时初始数据较快,操作简单
1、如果tikv_gc_life_time值设置较小,先调整该值,此次操作将其调整为8h
set global tidb_gc_life_time=8h
2、执行br对源端tidb实例对应的数据库进行备份
br backup full --pd “10.xx.xx.xxx:2379” --storage “local:///tidb/br-data” --ratelimit 120 --log-file backuptable.log
3、还原备份数据,在目标端实例进行还原
./br restore full -s local:///data/br_data/ --pd 10.xx.xx.xx:2379 --ratelimit 40 --log-file restore-nfs0715nc.log
以上数据可以备份至NFS或者本地,如果需要恢复到另外一个tidb集群非NFS盘,需将全量数据拷贝至所有tikv节点。
4、查看br时对应的ts信息,存在br的backuptable.log日志里
[2022/06/27 17:36:30.704 +08:00] [INFO] [collector.go:68] [“Full backup success summary”] [total-ranges=78783] [ranges-succeed=78783] [ranges-failed=0] [backup-checksum=24m46.588281238s] [backup-fast-checksum=1.174067513s] [backup-total-ranges=14167] [total-take=3h23m39.613602886s] [total-kv=30047407854] [total-kv-size=3.373TB] [average-speed=276.1MB/s] [backup-data-size(after-compressed)=763GB][Size=763001558291] [BackupTS=434191825915346959]
5、 创建ticdc的任务,指定导出数据时候的ts
cdc cli changefeed create --pd=http://10.xx.xx.xxx:2379 --sink-uri=“tidb://dbadmin:abcd1234@10.xx.xx.xx:4000/?worker-count=16&max-txn-row=5000” --start-ts=434191825915346959 --changefeed-id=“simple-replication-task” --sort-engine=“unified”
6、数据同步验证,在源端插入一条数据
三、数据恢复实践
1、本次使用场景:建立tidb集群异地机房容灾,选取ticdc作为id1的tidb集群和id2的tidb集群之间数据同步;数据量1T以上,选择br。
2、恢复的时候,报错 could not read local://…:download sst failed
在恢复的时候,每个节点都必须能够访问到所有的备份文件 (SST files)。默认情况下,假如使用 local storage,备份文件会分散在各个节点中,此时是无法直接恢复的,必须将每个 TiKV 节点的备份文件拷贝到其它所有 TiKV 节点才能恢复。
3、因为机器性能问题,导致tikv连接拒绝
恢复区间加上限速参数–ratelimit,防止因为机器硬件影响恢复任务




