跳至主要內容

使用Ti-dumpling + Ticdc 同步 TiDB 数据到 KunlunBase(原KunlunBase)

Klustron大约 3 分钟

使用Ti-dumpling + Ticdc 同步 TiDB 数据到 KunlunBase(原KunlunBase)

本文介绍如何从一个运行中的TiDB集群 同步全量数据到Klustron 集群然后持续地流式同步数据更新到这个Klustron集群。

设置 gc_lift_time 参数

  • 进入到 TiDB
mysql -h 172.0.0.132 -uroot -proot -P40002
set global tidb_gc_life_time = '24h'
  • 如果未设置该参数,则默认为每 10 分钟清理一次过期数据且更新一次 gc safe point ,根据要全量导出的数据大小设置该参数值
  • 如果 dumpling 导出的 metadata 文件里 Pos 值小于 gc safe point ,由无法启动 ticdc 并有以下错误提示,GC 机制可以参考https://docs.pingcap.com/zh/tidb/stable/garbage-collection-overview
Error: [CDC:ErrMetaListDatabases]meta store list databases: [tikv:9006]GC life time is shorter than transaction duration, transaction starts at \2022-11-16 16:29:54.329 +0800 CST, GC safe point is 2022-11-16 16:45:36.778 +0800 CST

使用 ti-dumpling 全量导出数据

cd ~/.tiup
./bin/tiup install dumpling
./bin/tiup dumpling -u root -proot -P 40002 -h 172.0.0.132 \
-o /nvme2/compare/tidb/dumpling_data/ -B tpcc
  • -o 数据存储的位置
  • -B 数据库名
  • 具体使用方法可以参考https://docs.pingcap.com/zh/tidb/stable/dumpling-overview

使用 ddl2kunlun-linux 工具创建表

  • 下载该工具 wget http://downloads.Klustron.com/kunlun-utils/1.1.1/ddl2kunlun-linux

  • 该工具会将其它数据库的表定义转换成可以被 Klustron 使用的表定义

  • 使用示例

./ddl2kunlun-linux -host="172.0.0.132" -port="40002" -user="root" -password="root" \
-sourceType="mysql" -database="tpcc" -table="tablename" > a.sql
  • -host/-port/-user/-password 被导出的数据库的信息;

  • -sourceType 被导出的数据库的数据库类型,默认 mysql;

  • -database/-table 要导出的数据库及表名;

  • 可以通过 ./ddl2kunlun-linux --help 查看帮助文档;

  • 随后使用 psql 或者 mysql 将导出的表定义导入到Klustron里生成表。

psql -h 172.0.0.132 -p 35001 -U abc -d postgres < a.sql
  • 使用 for 循环脚本运行
  • 因为该工具只能一个表一个表地导出,所以会比较频繁
  • 可以参考以下脚本自动将转换的表定义导入到 Klustron
echo `show databases;` > test.sql
for i in `mysql -h 172.0.0.132 -uroot -proot -P40002 tpcc < test.sql | grep -v Tables_in_`
do 
    ./ddl2kunlun-linux -host="172.0.0.132" -port="40002" -user="root" -password="root" -sourceType="mysql" -database="tpcc" -table="$i" > a.sql
    echo create table $i
    psql -h 172.0.0.132 -p 35001 -U abc -d postgres < a.sql
done

处理 dumpling 后的数据

  • dumpling 后的数据不可以直接被 Klustron 使用,所以我们要处理一下数据

  • tidb 的 database 映射到 Klustron 是 postgres 数据库下的 schema ,所以我们要在导出的数据文件里 create table 后加上schema 名

  • Klustron 日期有最小值'1970-01-01'

# cd到dumpling导出数据的文件夹
cd /nvme2/compare/tidb/dumpling_data
for i in `ls . | grep -v schema | grep sql`
do
     table=`echo $i | awk -F. '{print $2}'`
     db=`echo $i | awk -F. '{print $1}'`
     sed -i "s/\`$table\`/${db}.$table/" $i
     sed -i 's/0000-00-00/1970-01-01/' $i
done

导入数据到 Klustron

  • 只导入不是表定义的 sql 文件。

  • 因为表定义已经导入过了,所以不用导入带有 schema 文件名的文件。

  • metadata 文件后面开启 ticdc 任务时会用上,这步也不用这个文件。

cd /nvme2/compare/tidb/dumpling_data
for i in `ls . | grep -v schema | grep sql`
do
         echo begin $i
         psql -h 172.0.0.132 -p 35001 -U abc -d postgres -f $i
         echo $i done
done

开启 Ticdc 任务

  • 建议 Tidb 集群版本最好和 Ticdc 版本一致

  • 使用示例

cd ~/.tiup
./bin/tiup cdc cli changefeed create --pd=http://172.0.0.132:2379 --sink-uri="mysql://abc:abc@172.0.0.132:47001/?time-zone=" --changefeed-id="simple-replication-task" --sort-engine="unified" --start-ts=437427747125198853
  • Ticdc 具体使用方法可以参考https://docs.pingcap.com/zh/tidb/stable/manage-ticdc

  • --pd TiDB 的 pd 服务,有多个时可以用,隔开;

  • --sink-uri下游数据库连接地址,可以支持 mysql,kafaka,tidb。Klustron 则使用 mysql 协议的计算节点端口号; ■ 可以登录到Klustron计算节点的pg端口里,通过show mysql_port;获得mysql端口号;

  • --changefeed-id Ticdc任务名;

  • --sort-engine 指定 changefeed 使用的排序引擎,该项支持 unified(默认)/memory/file ;

  • --start-ts Ticdc任务开启的位置,该选项的值为 dumpling 导出的 metadata 文件里的 Pos 值。

设置 gc_lift_time 参数

  • 进入到 TiDB

mysql -h 172.0.0.132 -uroot -proot -P40002

- 将gc_lift_time参数值设置回默认的10分钟,即10分钟清理一次过期的数据
 - ```json
set global tidb_gc_life_time = '10m'

END