使用Ti-dumpling + Ticdc 同步 TiDB 数据到 KunlunBase(原KunlunBase)
使用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'