Ape-DTS 是一款高效、轻量级且功能强盛的开源工具,专注于解决数据迁徙、同步、校验、订阅与加工的需求。无论是将自建的 MySQL/PostgreSQL 数据库迁徙到云端,还是在不同数据库间进行数据迁徙,Ape-DTS 都能为您提供便捷且可靠的解决方案。它特殊得当于将自建 MySQL 数据库迁徙到其他 MySQL 环境(如云端 MySQL、KubeBlocks MySQL),大概其他分析型数据库(例如 ClickHouse、StarRocks),以及消息队列(例如 Kafka)等场景。
https://github.com/apecloud/ape-dts
为什么选择 Ape-DTS
Ape-DTS 是一款旨在实现 any-to-any 的数据迁徙工具:
- 功能丰富: 支持多种数据库的 库表结构迁徙,数据全量迁徙、增量迁徙,数据校验、订正、复查,数据订阅、加工 等能力。
- 支持广泛: 目前已支持数据库包括 MySQL,Postgres,Redis,Mongo,StarRocks,ClickHouse,Kafka 等。
- 简单轻量: 不依靠第三方组件和额外存储,完整镜像解压后小于 100 MB。
- 性能突出,使用 Rust 开辟。
Ape-DTS 支持 MySQL,Postgres,Redis,Mongo,StarRocks,ClickHouse,Kafka 等数据库间的迁徙,具体如下:
MySQL -> MySQLPostgreSQL -> PostgreSQLMongoDB -> MongoDBRedis -> RedisMySQL -> KafkaPostgreSQL -> KafkaMySQL -> StarRocksMySQL -> ClickHouseMySQL -> TiDBPostgreSQL -> StarRocks全量迁徙✅✅✅✅✅✅✅✅✅✅增量同步✅✅✅✅✅✅✅✅✅✅数据校验/订正/复查✅✅✅✅库表结构迁徙✅✅✅✅✅✅ 功能亮点
- 支持多种数据库间的同构、异构数据迁徙和同步。
- 支持全量、增量任务的断点续传。
- 支持数据校验、订正。
- 支持库、表、列级别的过滤和路由。
- 针对不同源、目标、任务范例,实现不同的并发算法,提高性能。
- 可加载用户 Lua 脚本,加工正在迁徙/同步的数据。
- 支持将数据发送到 Kafka,供用户自主消耗。
- 支持以 HTTP Server 的方式启动 Ape-DTS 并拉取增量数据,用户可使用 HTTP Client 获取数据并自主消耗。
Ape-DTS 的性能表现
Ape-DTS 在多种场景下显现了良好的性能表现。本文使用 sysbench 生成全量和增量数据,分别使用 Ape-DTS 和 Debezium 实行迁徙任务,并对比结果。
以下是 MySQL -> MySQL 的测试,源端 MySQL和目标端 MySQL 均在 8C16G BCC(百度智能云云服务器)呆板上使用 Docker 部署。
可以看到,Ape-DTS 的全量/增减迁徙性能都显着优于 Debezium。在类似的节点规格(4C8G)下,Ape-DTS 的全量迁徙性能约为 Debezium 的 31 倍,Ape-DTS 的增量迁徙性能约为 Debezium 的 9 倍。
测试一:全量数据迁徙
同步方式节点规格RPS(Rows per Second)源 MySQL 负荷(CPU/内存)目标 MySQL 负荷(CPU/内存)Ape-DTS1C2G714288.2% / 5.2%211% / 5.1%Ape-DTS2C4G9940314.0% / 5.2%359% / 5.1%Ape-DTS4C8G12658213.8% / 5.2%552% / 5.1%Debezium4C8G405121.5% / 5.2%51.2% / 5.1% 测试二:增量数据迁徙
同步方式节点规格RPS(Rows per Second)源 MySQL 负荷(CPU/内存)目标 MySQL 负荷(CPU/内存)Ape-DTS1C2G1500218.8% / 5.2%467% / 6.5%Ape-DTS2C4G2469218.1% / 5.2%687% / 6.5%Ape-DTS4C8G2628718.2% / 5.2%685% / 6.5%Debezium4C8G295120.4% / 5.2%98% / 6.5% 镜像对比
工具镜像巨细Ape-DTS86.4 MBDebezium1.38 GB 如何使用 Ape-DTS 迁徙 MySQL?
以下是 Ape-DTS 在 自建 MySQL 数据库迁徙到 KubeBlocks MySQL 场景中的现实使用示例。
更多示例可参考: https://github.com/apecloud/ape-dts/tree/main/docs/en/tutorial。
设置文件差异总结
针对不同的任务,设置文件中的 extract_type, sink_type 等其他设置不同。
以下是一个简略的设置文件差异总结。更多具体设置,可参考官网上教程、模板及设置说明:https://github.com/apecloud/ape-dts。
任务范例extract_typesink_type特殊设置说明库表结构迁徙structstructdo_dbs指定须要迁徙的数据库全量迁徙snapshotwriteparallel_type=snapshot全量抓取数据快照增量同步cdcwriteserver_id, do_events基于 binlog 同步数据变更数据校验snapshotcheck日记输出比力源库与目标库数据划一性数据订正check_logwritecheck_log_dir指定校验结果日记的路径,用于订正任务数据复查check_logcheckcheck_log_dir指定校验结果日记的路径 1. 准备工作
1.1 环境准备
工具准备
该示例中使用的 DTS_IMAGE 版本如下:
- APE_DTS_IMAGE="docker.io/apecloud/ape-dts:2.0.12"
复制代码 源库
用当地 Docker 搭建 MySQL。
- docker run -d --name some-mysql-1 \
- --platform linux/x86_64 \
- -it \
- -p 3307:3306 -e MYSQL_ROOT_PASSWORD="123456" \
- "$MYSQL_IMAGE" --lower_case_table_names=1 --character-set-server=utf8 --collation-server=utf8_general_ci \
- --datadir=/var/lib/mysql \
- --user=mysql \
- --server_id=1 \
- --log_bin=/var/lib/mysql/mysql-bin.log \
- --max_binlog_size=100M \
- --gtid_mode=ON \
- --enforce_gtid_consistency=ON \
- --binlog_format=ROW \
- --default_time_zone=+08:00
复制代码
- 将主机的端口 3307 映射到容器的端口 3306。
- 设置 MySQL root 暗码为 123456。
- 使用由 $MYSQL_IMAGE 指定的镜像。
记录源端的 URL:
- url=mysql://root:123456@127.0.0.1:3307?ssl-mode=disabled
复制代码 目标库
我们在 ACK 上使用 KubeBlocks 搭建了 MySQL 集群,更多集群运维操纵可参考 KubeBlocks MySQL Examples。
- 创建集群。
- # 创建 MySQL 集群
- kbcli cluster create mycluster --cluster-definition mysql -n demo
复制代码 - 袒露服务。这里我们通过 LoadBalancer 袒露服务地点。
- # 将集群暴露至公网
- kbcli cluster expose mycluster --type internet --enable=true -ndemo
复制代码 查看到公网地点为: 47.xx.xx.xx,记录为你的 目标地点。
记录目标端地点:
- url=mysql://ape_test:Ape123456789@<目标地址>:3306?ssl-mode=disabled
复制代码 1.2 数据准备
登录当地 MySQL,创建测试用的数据库和表。
- mysql -h127.0.0.1 -uroot -p123456 -P3307
- CREATE DATABASE test_db;
- CREATE TABLE test_db.tb_1(id int, value int, primary key(id));
- CREATE TABLE test_db.tb_2(id int, value text, primary key(id));
- INSERT INTO test_db.tb_1 VALUES(1,1),(2,2),(3,3),(4,4);
- INSERT INTO test_db.tb_2 VALUES(5,'a'),(6,'b'),(7,'c'),(8,'d');
复制代码 2. 库表结构迁徙
创建任务设置
请将以下示例设置中的 extractor.url 和 sinker.url 更换为前面记录的源端 URL 和目标端 URL。
核心设置:
- extract_type=struct 和 sink_type=struct:表示迁徙的是库表结构。
- do_dbs:指定须要迁徙的数据库。
- cat <<EOL > /tmp/ape_dts/task_config.ini[extractor]extract_type=structdb_type=mysqlurl=mysql://root:123456@127.0.0.1:3307?ssl-mode=disabled
- [sinker]sink_type=structdb_type=mysqlurl=mysql://ape_test:Ape123456789@<目标地址>:3306?ssl-mode=disabled
- [filter]do_dbs=test_db[parallelizer]parallel_type=serial[pipeline]buffer_size=100checkpoint_interval_secs=1EOL
复制代码 启动任务
- docker run --rm --network host \
- -v "/tmp/ape_dts/task_config.ini:/task_config.ini" \
- "$APE_DTS_IMAGE" /task_config.ini
复制代码 检查目标库
- 登录目标库。
- mysql -h<目标地址> -uape_test -pApe123456789
复制代码 - 查看数据。
- mysql> SHOW CREATE TABLE test_db.tb_1;
- mysql> SHOW CREATE TABLE test_db.tb_2;
复制代码 3. 同步全量数据
创建任务设置
核心设置:
- extract_type=snapshot:表示全量迁徙,抓取源数据库的快照。
- sink_type=write:表示将数据写入目标数据库。
- parallel_type=snapshot 和 parallel_size:控制快照并发级别,提高全量迁徙效率。
- cat <<EOL > /tmp/ape_dts/task_config.ini[extractor]db_type=mysqlextract_type=snapshoturl=mysql://root:123456@127.0.0.1:3307?ssl-mode=disabled
- [sinker]db_type=mysqlsink_type=writeurl=mysql://ape_test:Ape123456789@<目标地址>:3306?ssl-mode=disabled
- [filter]do_dbs=test_dbdo_events=insert[parallelizer]parallel_type=snapshotparallel_size=8[pipeline]buffer_size=16000checkpoint_interval_secs=1EOL
复制代码 启动任务
- docker run --rm --network host \
- -v "/tmp/ape_dts/task_config.ini:/task_config.ini" \
- "$APE_DTS_IMAGE" /task_config.ini
复制代码 检查目标库
- 登录目标库。
- mysql -h<目标地址> -uape_test -pApe123456789
复制代码 - 检查数据。
- mysql> SELECT * FROM test_db.tb_1;
- +----+-------+
- | id | value |
- +----+-------+
- | 1 | 1 |
- | 2 | 2 |
- | 3 | 3 |
- | 4 | 4 |
- +----+-------+
- mysql> SELECT * FROM test_db.tb_2;
- +----+-------+
- | id | value |
- +----+-------+
- | 5 | a |
- | 6 | b |
- | 7 | c |
- | 8 | d |
- +----+-------+
复制代码 4. 增量任务
创建任务设置
核心设置:
- extract_type=cdc:表示增量同步,基于源库的 binlog 或 WAL 日记抓取数据变更。
- sink_type=write:表示将数据写入目标数据库。
- server_id:Ape-DTS 在该 MySQL 复制组中的标识,由用户指定,取值 [1-2^32 - 1],不得与该复制组中其他 server_id 类似。
- do_events:指定需同步的事件范例(如 insert, update, delete)。
- cat <<EOL > /tmp/ape_dts/task_config.ini[extractor]db_type=mysqlextract_type=cdcserver_id=2000url=mysql://root:123456@127.0.0.1:3307?ssl-mode=disabled
- [filter]do_dbs=test_dbdo_events=insert,update,delete[sinker]db_type=mysqlsink_type=writebatch_size=200url=mysql://ape_test:Ape123456789@<目标地址>:3306?ssl-mode=disabled
- [parallelizer]parallel_type=rdb_mergeparallel_size=8[pipeline]buffer_size=16000checkpoint_interval_secs=1EOL
复制代码 启动任务
- docker run --rm --network host \
- -v "/tmp/ape_dts/task_config.ini:/task_config.ini" \
- "$APE_DTS_IMAGE" /task_config.ini
复制代码 修改源库数据
- 登录当地 MySQL。
- mysql -h127.0.0.1 -uroot -p123456 -uroot -P3307
复制代码 - 修改数据。
- DELETE FROM test_db.tb_1 WHERE id=1;
- UPDATE test_db.tb_1 SET value=2000000 WHERE id=2;
- INSERT INTO test_db.tb_2 VALUES(9, 'f');
复制代码 检查目标库
- 登录目标 MySQL。
- mysql -h<目标地址> -uape_test -pApe123456789
复制代码 - 查看目标端数据。
- mysql> SELECT * FROM test_db.tb_1;
- +----+---------+
- | id | value |
- +----+---------+
- | 2 | 2000000 |
- | 3 | 3 |
- | 4 | 4 |
- +----+---------+
- mysql> SELECT * FROM test_db.tb_2;
- +----+-------+
- | id | value |
- +----+-------+
- | 5 | a |
- | 6 | b |
- | 7 | c |
- | 8 | d |
- | 9 | f |
- +----+-------+
复制代码 可以看到增量数据都已经同步了。
5. 数据校验
在目标端修改数据
- 登录目标 MySQL。
- mysql -h<目标地址> -uape_test -pApe123456789
复制代码 - 在目标端修改数据,构造和源库的差异。
- DELETE FROM test_db.tb_1 WHERE id=4; # 删除tb_1数据
- UPDATE test_db.tb_1 SET value=1 WHERE id=2; # 修改tb_1数据
- DELETE FROM test_db.tb_2 WHERE id=5; # 删除tb_2数据
复制代码 创建任务设置
核心设置:
- extract_type=snapshot:校验基于源库的全量数据快照。
- sink_type=check:表示校验目标库与源库数据是否划一。
- 输出日记:校验的差异会记录在日记文件中(如缺失数据和不划一的数据)。
- cat <<EOL > /tmp/ape_dts/task_config.ini[extractor]db_type=mysqlextract_type=snapshoturl=mysql://root:123456@127.0.0.1:3307?ssl-mode=disabled
- [sinker]db_type=mysqlsink_type=checkurl=mysql://ape_test:Ape123456789@<目标地址>:3306?ssl-mode=disabled
- [filter]do_dbs=test_dbdo_events=insert[parallelizer]parallel_type=rdb_checkparallel_size=8[pipeline]buffer_size=16000checkpoint_interval_secs=1EOL
复制代码 启动任务
- docker run --rm --network host \
- -v "/tmp/ape_dts/task_config.ini:/task_config.ini" \
- -v "/tmp/ape_dts/check_data_task_log/:/logs/" \
- "$APE_DTS_IMAGE" /task_config.ini
复制代码 查看校验结果
以源库为基准,检查目标库的数据缺失和不同,校验结果以日记文件输出。
- 检查数据缺失。
- cat /tmp/ape_dts/check_data_task_log/check/miss.log
复制代码 可以看到具体的缺失数据信息。
- {"log_type":"Miss","schema":"test_db","tb":"tb_1","id_col_values":{"id":"4"},"diff_col_values":{}}
- {"log_type":"Miss","schema":"test_db","tb":"tb_2","id_col_values":{"id":"5"},"diff_col_values":{}}
复制代码 - 检查数据差异。
- cat /tmp/ape_dts/check_data_task_log/check/diff.log
复制代码 可以看到输出如下,diff_col_values展示了差异的具体内容。
- {"log_type":"Diff","schema":"test_db","tb":"tb_1","id_col_values":{"id":"2"},"diff_col_values":{"value":{"src":"2000000","dst":"1"}}}
复制代码 6. 数据订正
创建任务设置
核心设置:
- extract_type=check_log:表示基于校验日记实行数据订正任务。
- sink_type=write:将订正后的数据写回目标库。
- check_log_dir:指定校验日记的路径,用于订正任务。
- cat <<EOL > /tmp/ape_dts/task_config.ini[extractor]db_type=mysqlextract_type=check_logurl=mysql://root:123456@127.0.0.1:3307?ssl-mode=disabled
- check_log_dir=./check_data_task_log[sinker]db_type=mysqlsink_type=writeurl=mysql://ape_test:Ape123456789@<目标地址>:3306?ssl-mode=disabled
- [filter]do_events=*[parallelizer]parallel_type=rdb_checkparallel_size=8[pipeline]buffer_size=16000checkpoint_interval_secs=1EOL
复制代码 启动任务
- docker run --rm --network host \
- -v "/tmp/ape_dts/task_config.ini:/task_config.ini" \
- -v "/tmp/ape_dts/check_data_task_log/check/:/check_data_task_log/" \
- "$APE_DTS_IMAGE" /task_config.ini
复制代码 查看订正后的结果
- 登录目标库。
- mysql -h<目标地址> -uape_test -pApe123456789
复制代码 - 查看数据。
- mysql> SELECT * FROM test_db.tb_1;
- +----+---------+
- | id | value |
- +----+---------+
- | 2 | 2000000 |
- | 3 | 3 |
- | 4 | 4 |
- +----+---------+
- mysql> SELECT * FROM test_db.tb_2;
- +----+-------+
- | id | value |
- +----+-------+
- | 5 | a |
- | 6 | b |
- | 7 | c |
- | 8 | d |
- | 9 | f |
- +----+-------+
复制代码 可以看到目标端被删除和更新的数据,都已经被订正了。
7. 数据复查
- 根据校验日记,反查源库,再次校验目标库
- 和全量校验的区别在于校验数据的范围:数据复查限定在校验出的 缺失/不同 的数据
修改目标库数据,构造和源库的差异
- 登录目标库。
- mysql -h<目标地址> -uape_test -pApe123456789
复制代码 - 修改数据。
- DELETE FROM test_db.tb_1 WHERE id=4; # 删除tb_1数据
复制代码 创建任务设置
核心设置:
- extract_type=check_log:基于校验日记。
- sink_type=check 用于复查目标库数据。
- check_log_dir:指定校验日记的路径。
- cat <<EOL > /tmp/ape_dts/task_config.ini[extractor]db_type=mysqlextract_type=check_logurl=mysql://root:123456@127.0.0.1:3307?ssl-mode=disabled
- check_log_dir=./check_data_task_log[sinker]db_type=mysqlsink_type=checkurl=mysql://ape_test:Ape123456789@<目标地址>:3306?ssl-mode=disabled
- [filter]do_events=*[parallelizer]parallel_type=rdb_checkparallel_size=8[pipeline]buffer_size=16000checkpoint_interval_secs=1EOL
复制代码 启动任务
- docker run --rm --network host \
- -v "/tmp/ape_dts/task_config.ini:/task_config.ini" \
- -v "/tmp/ape_dts/check_data_task_log/check/:/check_data_task_log/" \
- -v "/tmp/ape_dts/review_data_task_log/:/logs/" \
- "$APE_DTS_IMAGE" /task_config.ini
复制代码 查看复查结果
- 查看数据缺失。
- cat /tmp/ape_dts/review_data_task_log/check/miss.log
复制代码 可以看到输入日记显示 {“id”:“4”} 缺失。
- {"log_type":"Miss","schema":"test_db","tb":"tb_1","id_col_values":{"id":"4"},"diff_col_values":{}}
复制代码 - 查看数据差异。
- /tmp/ape_dts/review_data_task_log/check/diff.log 为空,符合预期。
更多教程
- 更多任务范例、教程、任务设置,请参考 Ape-DTS 主页。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |