TiDB实例间数据同步之TiCDC实践

随着公司业务发展,业务数据与日俱增,数据库的存储容量以及可扩展性都面临挑战,TiDB产品的引入可以帮助业务解决海量数据存储以及横向扩容的问题,但是由于公司业务具备一定的复杂性,核心的业务系统需要为下游提供相应的业务数据,这便会增加核心业务系统的数据库请求压力,为了解决这一问题,需要将核心业务的TiDB实例数据同步至另外一个TiDB业务实例以供下游进行访问和部分报表数据的输出。

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

TiCDC 的系统架构如下图所示:


TiCDC可以支持将增量数据同步至下游的TiDB实例,但是需要先对要同步的数据进行初始化,针对需要初始化的数据量级采取不同的方式进行数据同步操作,具体实现如下:

  1. 轻量级数据同步

实现方式:dumpling+lightning+ticdc

方案优点: 不需要额外存储资源,操作方便

具体步骤如下:

  1. 如果tikv_gc_life_time值设置较小,先调整该值,此次操作将其调整为8h

  2. 执行dumpling对源端tidb实例需要同步的表进行初始数据导出,具体命令如下:

./dumpling -u dbadmin -p’abcd1234’ -P 4000 -h 10.xx.xx.xxx --filetype sql -t 8 -o /data/backup/test_20210708 -r 200000 -F 256MiB -T test.test01,test.test02

  1. 执行lightning进行数据导入,配置文件和操作命令如下:

编辑配置文件(遵照官方文档),vi tidb-lightning.toml

nohup ./tidb-lightning -config tidb-lightning.toml > nohup.out &

  1. 查看dumpling时对应的ts信息

  1. 创建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=“426171672655036419” --config=changefeed_tidb.toml

  1. 查看任务状态是否正常,命令如下:

/data/cdc-8300/bin/cdc cli changefeed query -s --pd=http://10.xx.xx.xxx:2379 --changefeed-id=simple-replication-task

image

  1. 重量级数据同步

实现方式:br+ticdc

方案优点: 数据量大时初始数据较快,操作简单

具体步骤如下:

1) 如果tikv_gc_life_time值设置较小,先调整该值,此次操作将其调整为8h

2) 先在源端创建测试表,并插入数据

3) 执行br公户对源端tidb实例对应的数据库进行备份(需要备份至NFS),具体命令如下:

br backup db --pd “10.xx.xx.xxx:2379” --db document --storage “local:///nas/br-test-backup” --ratelimit 120 --log-file backuptable.log

4) 以还原备份中表test01为例,在目标端tidb实例进行还原(从NFS上还原)

bin/br restore table --db document --table test01 -s local:///nas/br-test-backup --pd 10.xx.xxx.xxx:2379 --log-file restore-nfs.log

5) 查看br时对应的ts信息,存在br的backuptable.log日志里

6) 创建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=426420211581976577 --changefeed-id=“simple-replication-task” --sort-engine=“unified” --config changefeed.toml

7) 数据同步验证,在源端插入一条数据

8) 在目标的tidb实例中查询

:call_me_hand: