跳至主要內容

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

Klustron大约 4 分钟

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

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

该方案适用于上游集群版本为 5.0 以下的 TiDB 该方案适用于上游集群版本为5.0以下的tidb

tidb-dumpling

  • 安装 dumpling
./bin/tiup install dumpling:v4.0.16
  • 使用 dumpling 把数据导出来
./components/dumpling/v4.0.16/dumpling -u root -proot -P 40002 -h 192.168.0.132 -o /nvme2/compare/tidb/dumpling_data/ -B tpcc
  • -B 选择指定数据库 dump
  • -o dump 后的文件将放指定位置上

ddl2kunlun-linux

  • 该程序是将 mysql 数据库的表定义转换成可以被用于 Klustron 的表定义 wget http://downloads.Klustron.com/kunlun-utils/1.1.1/ddl2kunlun-linux

  • 使用示例

./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 查看帮助文档

  • 再把生成的 a.sql 写到 Klustron 集群里

psql -h 192.168.0.132 -p 30001 -U abc -d postgres < a.sql
mysql -h 192.168.0.132 -P 30002 -uabc -pabc postgres < a.sql

  • 上面这两种都是可以的

  • tidb 的 database 映射到 Klustron 是 postgres 数据库下的 schema,所以我们命令行的数据库使用 postgres 就行

  • 然后还要在 KunlnBase 集群的 postgres 数据库下新建一个 schema_name 为 tpcc 的 schema,用来映射 tidb 名为 tpcc 的数据库

  • 产生的表定义里部分 sql 语句

[kunlun@kunlun-test8 .tiup]$ head -5 a.sql
CREATE TABLE tpcc.warehouse (
        w_id bigint not null,
        w_name varchar(10) ,
        w_street_1 varchar(20) ,
        w_street_2 varchar(20) ,
  • 使用 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
  • 这里用 postgres 这个数据库原因是因为 tidb ( mysql )的数据库映射到 Klustron 里是用 postgres 的 schema

修改 dumpling 产生的 sql

  • 在 dumpling 产生的 sql 里,insert 的表是没有 schema (对应 mysql 的数据库)的,所以我们要在文件里面加上 schema (对应 mysql 的数据库)

  • 不建议真的自己手动去文件里一个一个加,因为 dumpling 在面对数据量大的表会产生有很多的 INSERT INTO 语句

  • 注意 dumpling 产生的表定义文件我们就不去管他了,前面用 ddl2kunlun-linux 已经完成了表定义(也就是文件名结构为 db.table-schema.sql 的文件)

  • metadata 文件文件后面才用得到,这里也不管了

for i in `ls /nvme2/compare/tidb/dumpling_data | grep -v schema | grep sql`
do
    cd /nvme2/compare/tidb/dumpling_data/
    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
    cd ~/.tiup
done

把 dumpling 产生的 sql 文件写到 Klustron

  • 用 mysql 或者 pg 灌都可以,看自己的喜好
psql -h 192.168.0.132 -p 30001 -U abc -d tpcc < tpcc.customer.000000000.sql
mysql -h 192.168.0.132 -P 30002 -uabc -pabc tpcc < tpcc.customer.000000000.sql
  • 当前的测试量为 100 warehouses

  • 如果要进去 Klustron 查看数据,要切换 schema

  • set search_path to schema

启动 TiDB-drainer 同步数据流到 Klustron

  • 具体参考TiDB官方教程open in new window

  • 安装 pump 和 drainer 工具

  • cd ~/.tiup

  • ./bin/tiup install pump:v4.0.16

  • ./bin/tiup install drainer:v4.0.16

  • 修改pump.tomldrainer.toml这两个配置文件,可以参考官网的模版

  • 启动

cd ~/.tiup
./components/drainer/v4.0.16/drainer -config drainer.toml -initial-commit-ts {initial-commit-ts} &

TiDB-binlogctl

  • 在运行的过程中,可以使用 binlogctl 对 pump 和 drainer 进行监控

  • 下载方式: wget https://download.pingcap.org/tidb-community-server-v4.0.16-linux-amd64.tar.gz

  • 解压完后,cd 进入该离线包

  • binlogctl 在 ctl-v4.0.16-linux-amd64.tar.gz 下,需要解压

  • 查看 pump 状态的命令

./binlogctl -pd-urls=http://192.168.0.132:2379 -cmd drainers
[2022/10/21 17:11:42.513 +08:00] [INFO] [nodes.go:53] ["query node"] [type=drainer] [node="{NodeID: kunlun-test8:8321, Addr: 192.168.0.132:8321, 
State: paused, MaxCommitTS: 436819730621530117, UpdateTime: 2022-10-21 14:52:11 +0800 CST}"]
  • 查看 drainer 状态的命令
./binlogctl -pd-urls=http://192.168.0.132:2379 -cmd pumps
[2022/10/21 17:18:25.972 +08:00] [INFO] [nodes.go:53] ["query node"] [type=pump] [node="{NodeID: 192.168.0.132:8912, Addr: 192.168.0.132:8912, 
State: online, MaxCommitTS: 436822038851878913, UpdateTime: 2022-10-21 17:17:19 +0800 CST}"]
[2022/10/21 17:18:25.972 +08:00] [INFO] [nodes.go:53] ["query node"] [type=pump] [node="{NodeID: 192.168.0.134:8912, Addr: 192.168.0.134:8912, 
State: online, MaxCommitTS: 436822039271309320, UpdateTime: 2022-10-21 17:17:20 +0800 CST}"]
[2022/10/21 17:18:25.972 +08:00] [INFO] [nodes.go:53] ["query node"] [type=pump] [node="{NodeID: 192.168.0.136:8912, Addr: 192.168.0.136:8912, 
State: online, MaxCommitTS: 436822039205773313, UpdateTime: 2022-10-21 17:17:20 +0800 CST}"]

END