使用 Ti-dumpling + Ti-binlog 同步 TiDB 数据到 Klustron(原KunlunBase)
使用 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官方教程
安装 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文档