使用Ti-dumpling + Ticdc 同步 TiDB 数据到 KunlunBase(原KunlunBase)
使用Ti-dumpling + Ticdc 同步 TiDB 数据到 KunlunBase(原KunlunBase)
本文介绍如何从一个运行中的TiDB集群 同步全量数据到Klustron 集群然后持续地流式同步数据更新到这个Klustron集群。本文示例中使用的是Klustron数据库为1.1版本,因此需要用到ddl2kunlun组件来执行TiDB导出的MySQL语法的DDL语句。自Klustron-1.2版本开始,Klustron已经支持常用的MySQL的DDL语法,因此无需使用ddl2kunlun, 直接会用mysql客户端程序或者应用软件连接到Klustron然后发送DDL语句给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 
- - - -pdTiDB 的 pd 服务,有多个时可以用,隔开;
- --sink-uri下游数据库连接地址,可以支持 mysql,kafaka,tidb。Klustron 则使用 mysql 协议的计算节点端口号; ■ 可以登录到Klustron计算节点的pg端口里,通过show mysql_port;获得mysql端口号;
- --changefeed-idTicdc任务名;
- --sort-engine指定 changefeed 使用的排序引擎,该项支持 unified(默认)/memory/file ;
- --start-tsTicdc任务开启的位置,该选项的值为 dumpling 导出的 metadata 文件里的 Pos 值。
设置 gc_lift_time 参数
- 进入到 TiDB - mysql -h 172.0.0.132 -uroot -proot -P40002
 
- 将gc_lift_time参数值设置回默认的10分钟,即10分钟清理一次过期的数据 - set global tidb_gc_life_time = '10m'
 

