如何使用 Debezium 实现 MySQL 同步到数仓?

简述

Debezium 是一个开源的数据订阅工具,它可以捕获数据库的 CDC 变更数据发送到 Kafka。

为了实现将数据发送到其他数据库的目的,我们可以将 Kafka 中的数据,通过多种 Sink Connector 同步到 MySQL、Oracle、PostgreSQL、Starrocks 等。

本文以 MySQL -> Kafka -> Starrocks 为例,来演示 Debezium 同步数据到数仓的能力,并探讨如何构建一条稳定、高效的数据同步链路。

Debezium 整体数据同步使用下来还是比较流畅的,社区也支持比较多的插件,生态丰富;但是其官方缺少消息到对端的能力(Sink 到其他数据库),这让一部分用户感觉束手无策。

我个人感觉比较适合开发来使用,并在 Debezium 的生态基础上接入到内部的业务系统中,但是对 DBA、运维不友好,且有一些问题不得不面对:

  • 数据同步状态的把控(同步延迟、告警、监控)
  • 数据同步的高可用(容灾恢复)
  • 数据同步可视化(运维)
  • 数据一致性对比及修复(数据准确)

能处理好以上这些问题,整个数据同步才能有一个比较好的保障,不然生产上线出了问题依靠社区也不能及时解决。最近我在调研有没有满足以上条件的数据同步产品,也是在 Starrocks 官方文档上找到了一个数据同步工具。

这个工具是使用上真的很 "傻瓜" ,用鼠标点击几下就可以创建一个数据同步任务,而且数据同步结束后可以直接校验两边的数据是否一致,不一致可立即修复。我部署到了本机 Mac 上作了测试,可以通过这个工具来消费 Kafka 的消息并同步到 Starrocks。

Debezium 环境准备

  • 相关资源一键部署(Docker) 📎debezium-sync-my2sr.tar.gz

    • Kafka 集群 + Kafka UI(中间件)

    • Debezium(同步工具)

    • MySQL(源端)

    • Starrocks(目标端)

      tar -xzvf debezium-test.tar.gz
      sh install.sh

创建 MySQL Source Connector

  • 源端是 MySQL,通过下面的表进行创建。
sql 复制代码
CREATE DATABASE `inventory`;

CREATE TABLE `inventory`.`customer` (
  `c_int` int NOT NULL,
  `c_bigint` bigint NOT NULL, 
  `c_decimal` decimal(10,3) NOT NULL,
  `c_date` date NOT NULL,
  `c_datetime` datetime NOT NULL,
  `c_timestamp` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `c_year` int NOT NULL,
  `c_varchar` varchar(10) NOT NULL,
  `c_text` text NOT NULL,
  PRIMARY KEY (`c_int`)
);
  • 通过 Debezium 的 Api 接口创建 Connector 订阅 MySQL 的变更事件。
json 复制代码
curl -i -X POST http://127.0.0.1:7750/connectors \
  -H 'Content-Type: application/json' \
  -d '{
    "name": "connector-test-mx",
    "config": {
      "connector.class": "io.debezium.connector.mysql.MySqlConnector",
      "database.hostname": "112.124.38.87",
      "database.port": "25000",
      "database.user": "root",
      "database.password": "123456",
      "database.server.id": "1",
      "database.server.name": "mx",
      "database.include.list": "inventory",
      "decimal.handling.mode": "string",
      "binary.handling.mode": "hex",
      "topic.prefix": "mx",
      "table.include.list": "inventory.customer",
      "snapshot.mode": "never",
      "database.history.kafka.bootstrap.servers": "112.124.38.87:19092,112.124.38.87:29092,112.124.38.87:39092",
      "schema.history.internal.kafka.bootstrap.servers": "112.124.38.87:19092,112.124.38.87:29092,112.124.38.87:39092",
      "schema.history.internal.kafka.topic": "mx.schemahistory.customer",
      "database.history.kafka.topic": "mx.mx_history_schema",
      "include.schema.changes": "false",
      "converters": "mysqltime",
      "mysqltime.type": "io.debezium.converter.MySQLTimeConverter",
      "mysqltime.format.date": "yyyy-MM-dd",
      "mysqltime.format.time": "HH:mm:ss",
      "mysqltime.format.datetime": "yyyy-MM-dd HH:mm:ss",
      "mysqltime.format.timestamp": "yyyy-MM-dd HH:mm:ss",
      "mysqltime.format.timestamp.zone": "UTC+8"
    }
  }'
  • 创建后,查看 Connetor 的状态。
ruby 复制代码
curl -s http://127.0.0.1:7750/connectors/connector-test-mx/status

订阅 Kafka 的数据变更

添加数据源

  • 数据源管理 -> 添加数据源, 添加 Kafka、Starrocks、MySQL

创建同步任务

  • 任务管理 -> 新建任务
  • Kafka 选择 Debezium Envelope Json Format 格式
  • Kafka 消息中如果有 Schema ,需要在 任务详细 -> 参数修改 -> 源数据源配置 中修改 envelopSchemaIncludetrue

测试同步

  • 源端数据库做数据变更,Debezium 将数据写入 Kafka 后,CloudCanal 会写入到 Starrocks 中。
  • 数据同步结束后校验 MySQL 和 Starrocks 的数据,40 万左右的数据是一致的。

总结

将两个数据同步产品进行打通也是比较有意思的事情,两者在数据同步领域各有特色,但后者更能满足我对数据同步的要求:

  • 免费(喜欢白嫖)
  • 可视化(低代码)
  • 监控(同步指标、系统资源)
  • 告警(短信、邮件、飞书、钉钉 等)
  • 容灾(自动调度、组件隔离、数据修复)
  • 社区支持(活跃)

我使用的仅仅是这个产品的冰山一角,更多的功能还需要再继续研究研究。

相关推荐
Java 第一深情5 分钟前
零基础入门Flink,掌握基本使用方法
大数据·flink·实时计算
MXsoft61813 分钟前
华为服务器(iBMC)硬件监控指标解读
大数据·运维·数据库
TheITSea24 分钟前
云服务器宝塔安装静态网页 WordPress、VuePress流程记录
java·服务器·数据库
PersistJiao1 小时前
Spark 分布式计算中网络传输和序列化的关系(二)
大数据·网络·spark·序列化·分布式计算
九河云1 小时前
如何对AWS进行节省
大数据·云计算·aws
王ASC1 小时前
ORA-01461: 仅能绑定要插入 LONG 列的 LONG 值。ojdbc8版本23.2.0.0驱动BUG【已解决】
数据库·sql·oracle
Dlwyz1 小时前
问题: redis-高并发场景下如何保证缓存数据与数据库的最终一致性
数据库·redis·缓存
FreeIPCC2 小时前
谈一下开源生态对 AI人工智能大模型的促进作用
大数据·人工智能·机器人·开源
梦幻通灵2 小时前
ES分词环境实战
大数据·elasticsearch·搜索引擎
Elastic 中国社区官方博客2 小时前
Elasticsearch 中的热点以及如何使用 AutoOps 解决它们
大数据·运维·elasticsearch·搜索引擎·全文检索