使用 Ti-dumpling + Ti-binlog 同步 TiDB 数据到 Klustron(原KunlunBase)
使用 Ti-dumpling + Ti-binlog 同步 TiDB 数据到 Klustron(原KunlunBase)
本文介绍如何从一个运行中的 TiDB 集群 同步全量数据到 Klustron 集群然后持续地流式同步数据更新到这个Klustron集群。本文示例中使用的是Klustron数据库为1.1版本,因此需要用到ddl2kunlun组件来执行TiDB导出的MySQL语法的DDL语句。自Klustron-1.2版本开始,Klustron已经支持常用的MySQL的DDL语法,因此无需使用ddl2kunlun, 直接会用mysql客户端程序或者应用软件连接到Klustron然后发送DDL 语句给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官方教程 
- 安装 pump 和 drainer 工具 
- cd ~/.tiup
- ./bin/tiup install pump:v4.0.16
- ./bin/tiup install drainer:v4.0.16
- 修改 - pump.toml和- drainer.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}"]
- 其它 binlogctl 命令可以看binlogctl文档
