【Apache Doris】如何一键实现MySQL万表整库同步?

本文介绍了如何使用ApacheDoris与MySQL进行万表整库同步,包括环境配置、功能介绍、脚本模板以及常见问题解决方案。通过Flink和定制的FlinkDorisConnector实现高效、自动化的数据迁移过程。

一、 环境信息

1.1 硬件信息

  1. CPU :48C
  2. CPU型号:x86_64
  3. 内存 :185GB

1.2 软件信息

  1. 系统 :CentOS
  2. Apahce Doris版本 :2.0.2
  3. Mysql版本:5.7.36
  4. Flink版本:1.17.1
  5. Flink-Doris-Connector版本:1.5

二、 功能介绍

在这里插入图片描述

Mysql万表存量+增量同步至Doris/SelectDB,主要是通过Flink计算引擎、基于Mysql CDC Connector和Doris社区研发的Flink Doris Connector 实现的。

无需提前建表,当Flink任务启动后,Flink Doris Connector 会自动识别对应的Doris表是否存在,不存在则自动创建Doris表,如果存在则直接启动同步任务。

并且能够支持Mysql源表Schema增删列自动变更至Doris,不需要手动变更Doris表的Schema或重启Job,便利之极。

三、 前提概要

3.1 安装部署

Doris/Flink/Mysql的安装部署流程可以根据版本自行Google。

  1. Doris下载地址:Doris下载地址
  2. Flink下载地址:Flink下载地址
  3. MySQL包下载地址:MySQL包下载地址

3.2 JAR包准备

在这里插入图片描述

3.2.1 数据源

Flink源端读取MySQL数据的连接器,可通过该地址下载flink-sql-connector-mysql-cdc-2.4.1.jar:
mysql-cdc-2.4.1下载地址

3.2.2 目标源

Flink目标端写Doris的Flink Doris Connector ,可通过该地址获取:
flink-doris-connector下载地址

3.3 脚本模版

./bin/flink run \
    -Dexecution.checkpointing.interval=10s \
    -Dparallelism.default=1 \
    -c org.apache.doris.flink.tools.cdc.CdcTools \
    lib/flink-doris-connector-1.17-1.5.0-SNAPSHOT.jar \
    mysql-sync-database \
    --database doris_db \
    --mysql-conf hostname= 127.0.0.1 \
    --mysql-conf port= 3306 \
    --mysql-conf username= root \
    --mysql-conf password= root \
    --mysql-conf database-name= mysql_db \
    --mysql-conf scan.startup.mode=initial \
    --including-tables "test.*" \
    --sink-conf fenodes= 127.0.0.1:8030 \
    --sink-conf username=root \
    --sink-conf password=root \
    --sink-conf jdbc-url=jdbc:mysql://127.0.0.1:9030 \
    --sink-conf sink.label-prefix=label \
    --table-conf replication_num=1 \
  • –job-name Flink任务名称, 非必需。
  • -Dexecution.checkpointing.interval checkpoint时间间隔,实际task中是需要checkpoint后才执行数据写入
  • –database 同步到Doris的数据库名。
  • –mysql-conf MySQL CDCSource 配置,例如–mysql-conf hostname=127.0.0.1 ,可以在这里查看 所有配置MySQL-CDC,其中hostname/username/password/database-name 是必需的。
  • –including-tables 需要同步的MySQL表,可以使用"|" 分隔多个表,并支持正则表达式。 比如–including-tables “test.*” 就是同步所有以test开头的表。
  • –sink-conf Doris Sink 的所有配置,可以在这里查看完整的配置项
  • –table-conf Doris表的配置项,即properties中包含的内容。 例如 --table-conf replication_num=1

四、快速体验

4.1 单表同步

例如单表同步MySQL中Star Schema Benchmark的part零件信息表,共1600000条记录。

./bin/flink run \
    -Dexecution.checkpointing.interval=10s \
    -Dparallelism.default=1 \
    -c org.apache.doris.flink.tools.cdc.CdcTools \
    lib/flink-doris-connector-1.17-1.5.0-SNAPSHOT.jar \
    mysql-sync-database \
    --database ssb_test \
    --mysql-conf hostname=172.21.16.12 \
    --mysql-conf port=3306 \
    --mysql-conf username=root \
    --mysql-conf password=root \
    --mysql-conf database-name=ssb_test \
    --mysql-conf scan.startup.mode=initial \
    --mysql-conf scan.incremental.snapshot.chunk.key-column=ssb_test.part:p_partkey \
    --including-tables "part" \
    --sink-conf fenodes=127.0.0.0:8030 \
    --sink-conf username=root \
    --sink-conf password=root \
    --sink-conf jdbc-url=jdbc:mysql://127.0.0.0:9030 \
    --sink-conf sink.label-prefix=label \
    --table-conf replication_num=1 \

在FLINK_HOME执行上述命令后,WEB UI中会新增相应Job。

在这里插入图片描述

查看taskmanager日志可以发现,task会先对mysql主键做切分,然后再根据ckp的时间间隔按批写入commit(默认2pc提交)。

在这里插入图片描述

默认环境10秒ckp下,单并发写入只需3min左右即可同步完160W数据,且单副本数据压缩率高达90%!
在这里插入图片描述

4.2 整库同步

4.2.1 数据准备

基于【单表同步】的part零件信息表,新建一个db、然后copy几张相同表进行整库同步体验。

-- 创建测试库
create database ssb_test_part_all;

-- 创建测试表 part01~3
CREATE TABLE `part03` (
  `p_partkey` int(11) DEFAULT NULL,
  `p_name` varchar(23) DEFAULT NULL,
  `p_mfgr` varchar(7) DEFAULT NULL,
  `p_category` varchar(8) DEFAULT NULL,
  `p_brand` varchar(10) DEFAULT NULL,
  `p_color` varchar(12) DEFAULT NULL,
  `p_type` varchar(26) DEFAULT NULL,
  `p_size` int(11) DEFAULT NULL,
  `p_container` varchar(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8


-- 数据写入 part01~3
insert into ssb_test_part_all.part01
select * from ssb_test.part

数据准备完成,如下图所示。

在这里插入图片描述

4.2.2 整库体验

整库同步MySQL中ssb_test_part_all库中的所有表,共1600000*3条记录。

./bin/flink run \
    -Dexecution.checkpointing.interval=10s \
    -Dparallelism.default=1 \
    -c org.apache.doris.flink.tools.cdc.CdcTools \
    lib/flink-doris-connector-1.17-1.5.0-SNAPSHOT.jar \
    mysql-sync-database \
    --database ssb_test_part_all \
    --mysql-conf hostname=127.0.0.0.12 \
    --mysql-conf port=3306 \
    --mysql-conf username=root \
    --mysql-conf password=root \
    --mysql-conf database-name=ssb_test_part_all \
    --mysql-conf scan.startup.mode=initial \
    --mysql-conf scan.incremental.snapshot.chunk.key-column=ssb_test_part_all.part01:p_partkey,ssb_test_part_all.part02:p_partkey,ssb_test_part_all.part03:p_partkey \
    --including-tables ".*" \
    --sink-conf fenodes=127.0.0.0:8030 \
    --sink-conf username=root \
    --sink-conf password=root \
    --sink-conf jdbc-url=jdbc:mysql://127.0.0.0:9030 \
    --sink-conf sink.label-prefix=label \
    --table-conf replication_num=1 \

在FLINK_HOME执行上述命令后,WEB UI中会新增相应整库同步Job。
在这里插入图片描述

同步完成结果比对,不仅简易高效,且单副本数据压缩率高达90%+!

在这里插入图片描述

五、常见问题

5.1 Mysql通信异常

可能是因为mysql信息填写错误驱动包不兼容导致。

在这里插入图片描述

5.2 MySQL无Key同步异常

mysql源表没有设置主键,可以在脚本中指定–mysql-conf scan.incremental.snapshot.chunk.key-column=database.table:column,database.table1.column… 解决。

在这里插入图片描述

5.3 CKP ON HDFS连接异常

使用hadoop作为checkpoint时报如下异常:

Caused by: java.net.ConnectException: Call From hadoop1/ip to hadoop1:8020 failed on connection exception: java.net.ConnectException: Connection refused; For more details see:  http://wiki.apache.org/hadoop/ConnectionRefused

这类异常一般是由于网络原因端口配置错误导致,可以先进行telnet ip port看是否通,再进行调整处理。

在这里插入图片描述

5.4 CKP ON HDFS权限异常

使用默认root跑脚本时,如果出现如下异常:

Caused by: org.apache.hadoop.security.AccessControlException: Permission denied: user=root, access=WRITE, inode="/":hadoop:supergroup:drwxr-xr-x

这类异常一般切换至对应用户或者授权即可,这个case可以切换至hadoop用户起 或 将root用户加到hdfs用户组中即可。

在这里插入图片描述

5.5 官方【Flink Doris Connector】QA

其它问题可以参考 官方【Flink Doris Connector】QA 或 私 或 在开源社区群交流。
在这里插入图片描述

【Apache Doris】一键实现万表MySQL整库同步 | 快速体验 分享至此结束,体验过程中若遇到问题欢迎留言交流。最后,欢迎关注Flink Forward Asia 2023,Doris Committer 吴迪分享:《Flink 到 Doris 实时写入实践:基于 Flink CDC 构建更实时高效的数据集成链路》

实现 MySQL 5.7 数据实时同步Doris 1.24,通常可以通过以下几种方式实现: ### 1. 使用 Binlog 实现增量同步 MySQL 的二进制日志(Binary Log)记录了所有对数据库的更改操作,是实现数据同步的重要手段。可以通过解析 Binlog 获取增量数据,并将这些数据同步Doris 中。 实现方式如下: - 使用工具如 **Canal**、**Debezium** 或 **Maxwell** 等解析 MySQL 的 Binlog 日志。 - 将解析后的数据通过 Kafka、RocketMQ 等消息中间件传输。 - 编写消费端程序将数据写入 Doris。 例如,使用 Canal 的架构如下: ```plaintext MySQL --> Binlog --> Canal --> Kafka --> Doris Sink --> Doris ``` 这种方式可以实现低延迟的数据同步,并且具备良好的扩展性[^1]。 ### 2. 使用 ETL 工具进行同步 可以使用开源的 ETL 工具如 **DataX**、**Sqoop** 或商业工具如 **Informatica** 等进行数据库之间的数据迁移与同步。 - **DataX** 是阿里巴巴开源的异构数据源同步工具,支持 MySQLDoris同步。 - 配置 JSON 文件定义源和目标数据源,执行定时任务即可完成同步。 示例 DataX 配置片段: ```json { "job": { "content": [ { "reader": { "name": "mysqlreader", "parameter": { "connection": [ { "jdbcUrl": "jdbc:mysql://localhost:3306/db", "table": ["table"], "username": "root", "password": "123456" } ] } }, "writer": { "name": "doriswriter", "parameter": { "fe": "127.0.0.1:8030", "be": "127.0.0.1:9030", "database": "db", "table": "table", "username": "root", "password": "123456" } } } ] } } ``` ### 3. 使用 Doris 的 Broker Load 或 Routine Load Doris 提供了多种数据导入方式,其中: - **Broker Load** 支持从 HDFS、S3 等外部存储加载数据。 - **Routine Load** 可以基于 Kafka 实现持续的数据导入。 结合 Kafka 作为中间消息队列,使用 Binlog 工具将 MySQL 数据写入 Kafka,再通过 Doris 的 Routine Load 功能消费 Kafka 数据,可实现准实时同步。 配置示例如下: ```sql CREATE ROUTINE LOAD example_db.example_job ON example_table PROPERTIES( "desired_concurrent_number"="3", "max_batch_interval"="20" ) FROM KAFKA( "kafka_broker_list" = "broker1:9092", "kafka_topic" = "topic", "property.kafka_default_offsets" = "OFFSET_BEGINNING" ); ``` ### 4. 使用数据库复制工具 如 **SymmetricDS** 或 **GoldenDB** 等数据库复制工具也支持 MySQLDoris 的异构数据库同步。这些工具通常提供图形化界面,便于配置和管理同步任务。 ---
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大数据AI智能圈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值