「轻阅读」基于 Flink SQL CDC的实时数据同步方案( 二 )


选择 Flink 作为 ETL 工具 当选择 Flink 作为 ETL 工具时 , 在数据同步场景 , 如下图同步结构:
「轻阅读」基于 Flink SQL CDC的实时数据同步方案文章插图
通过 Debezium 订阅业务库 MySQL 的 Binlog 传输至 Kafka, Flink 通过创建 Kafka 表指定 format 格式为 debezium-json, 然后通过 Flink 进行计算后或者直接插入到其他外部数据存储系统 , 例如图中的 Elasticsearch 和 PostgreSQL 。
「轻阅读」基于 Flink SQL CDC的实时数据同步方案文章插图
但是这个架构有个缺点 , 我们可以看到采集端组件过多导致维护繁杂 , 这时候就会想是否可以用 Flink SQL 直接对接 MySQL 的 binlog 数据呢 , 有没可以替代的方案呢?
答案是有的!经过改进后结构如下图:
「轻阅读」基于 Flink SQL CDC的实时数据同步方案文章插图
社区开发了 flink-cdc-connectors 组件 , 这是一个可以直接从 MySQL、PostgreSQL 等数据库直接读取全量数据和增量变更数据的 source 组件 。 目前也已开源 , 开源地址:
flink-cdc-connectors 可以用来替换 Debezium+Kafka 的数据采集模块 , 从而实现 Flink SQL 采集+计算+传输(ETL)一体化 , 这样做的优点有以下:

  • 开箱即用 , 简单易上手
  • 减少维护的组件 , 简化实时链路 , 减轻部署成本
  • 减小端到端延迟
  • Flink 自身支持 Exactly Once 的读取和计算
  • 数据不落地 , 减少存储成本
  • 支持全量和增量流式读取
  • binlog 采集位点可回溯*
基于 Flink SQL CDC 的
数据同步方案实践
下面给大家带来 3 个关于 Flink SQL + CDC 在实际场景中使用较多的案例 。 在完成实验时候 , 你需要 Docker、MySQL、Elasticsearch 等组件 , 具体请参考每个案例参考文档 。 案例 1 : Flink SQL CDC + JDBC Connector这个案例通过订阅我们订单表(事实表)数据 , 通过 Debezium 将 MySQL Binlog 发送至 Kafka , 通过维表 Join 和 ETL 操作把结果输出至下游的 PG 数据库 。 具体可以参考 Flink 公众号文章:《Flink JDBC Connector:Flink 与数据库集成最佳实践》案例进行实践操作 。

「轻阅读」基于 Flink SQL CDC的实时数据同步方案文章插图
案例 2 : CDC Streaming ETL模拟电商公司的订单表和物流表 , 需要对订单数据进行统计分析 , 对于不同的信息需要进行关联后续形成订单的大宽表后 , 交给下游的业务方使用 ES 做数据分析 , 这个案例演示了如何只依赖 Flink 不依赖其他组件 , 借助 Flink 强大的计算能力实时把 Binlog 的数据流关联一次并同步至 ES。
「轻阅读」基于 Flink SQL CDC的实时数据同步方案文章插图
例如如下的这段 Flink SQL 代码就能完成实时同步 MySQL 中 orders 表的全量+增量数据的目的 。
CREATE TABLE orders (order_id INT,order_date TIMESTAMP(0),customer_name STRING,price DECIMAL(10, 5),product_id INT,order_status BOOLEAN) WITH ('connector' = 'mysql-cdc','hostname' = 'localhost','port' = '3306','username' = 'root','password' = '123456','database-name' = 'mydb','table-name' = 'orders');SELECT * FROM orders为了让读者更好地上手和理解 , 我们还提供了 docker-compose 的测试环境 , 更详细的案例教程请参考下文的视频链接和文档链接 。
视频链接:
文档教程:
/wiki/中文教程
案例 3 : Streaming Changes to Kafka下面案例就是对 GMV 进行天级别的全站统计 。 包含插入/更新/删除 , 只有付款的订单才能计算进入 GMV, 观察 GMV 值的变化 。
「轻阅读」基于 Flink SQL CDC的实时数据同步方案文章插图
视频链接:
文档教程:
/wiki/中文教程
Flink SQL CDC 的更多应用场景
Flink SQL CDC 不仅可以灵活地应用于实时数据同步场景中 , 还可以打通更多的场景提供给用户选择 。
Flink 在数据同步场景中的灵活定位
  • 如果你已经有 Debezium/Canal + Kafka 的采集层 (E) , 可以使用 Flink 作为计算层 (T) 和传输层 (L)
  • 也可以用 Flink 替代 Debezium/Canal, 由 Flink 直接同步变更数据到 Kafka , Flink 统一 ETL 流程
  • 如果不需要 Kafka 数据缓存 , 可以由 Flink 直接同步变更数据到目的地 , Flink 统一 ETL 流程
Flink SQL CDC : 打通更多场景