【解决方案】Flink CDC 数据同步 (实时同步)

1,722 阅读5分钟

Flink CDC 介绍

源码地址:github.com/apache/flin… Flink CDC是一个基于Apache Flink的实时数据集成框架,它利用数据库日志的变更数据捕获(CDC)技术来实现数据的实时同步。以下是对Flink CDC的具体介绍:

  1. 基本概念

    • 定义:Flink CDC是用于捕获和处理数据库中数据变化的技术,它可以实时地从各种数据库中捕获数据变更,并将其转换为流式数据。
    • 核心思想:通过监测并捕获数据库的变动,将这些变更按发生的顺序记录下来,写入到消息中间件中以供其他服务进行订阅及消费。
  2. 主要特点

    • 实时数据捕获:能够实时捕获数据库中的数据变更,并将其转换为流式数据。
    • 高性能:基于Flink引擎,具有高性能的数据处理能力。
    • 低延迟:可以在毫秒级的延迟下处理大量的数据变更。
    • 易集成:与Flink生态系统紧密集成,可以方便地与其他Flink应用程序一起使用。
    • 高可用性:支持实时备份和恢复,确保数据的高可用性。
  3. 实现原理

    • 基于查询的CDC:通过定期查询数据库来检测数据变化,适用于数据量小且可以接受一定延迟的场景。
    • 基于日志的CDC:通过解析数据库的二进制日志来捕获数据变化,适用于数据量大且需要实时性的场景。
  4. 应用场景

    • 数据同步:将数据从一个数据库实时同步到另一个数据库。
    • 数据管道:构建实时数据处理管道,处理和分析数据库中的数据。
    • 数据分析:实时分析数据库中的数据,提供实时的业务洞察。
    • 实时应用:将数据库中的数据实时应用于实时应用程序,如实时报表、实时推荐等。
    • 实时监控:实时监控数据库中的数据,检测异常和错误。

Flink CDC 支持同步到的数据源

  • MySQL
  • PostgreSQL
  • Oracle
  • MongoDB
  • Flink CDC 1.13 (jdk1.8 )版本支持StarRocks
    • Flink作为当前流行的流式计算框架,在对接StarRocks时,若直接使用JDBC的方式“流式”写入数据,对StarRocks是不友好的。为此,StarRocks单独开发了flink-connector-starrocks,其内部实现仍是通过对数据缓存攒批后执行Stream Load导入。
    • Flink-connector-starrocks除了支持向StarRocks中写入数据(Sink),也支持了从StarRocks中读取数据(Source)的功能。
  • Flink CDC 1.13(JDK1.8)版本支持Doris
    • Flink CDC 1.13版本提供了与Doris集成的连接器,允许用户直接从Flink作业中读取Doris的数据,或将数据写入Doris。用户可以在Flink作业中定义数据源和接收器,通过简单的配置即可实现数据的实时同步。

Flink 安装

Apache Flink是一个开源的流处理框架,用于实时数据流和批处理。它支持多种部署模式和集群配置,以满足不同规模和需求的数据处理任务。以下是Flink的一些主要安装和部署模式:

  1. 本地模式

    • 这是最简单的部署模式,适用于开发和测试。在本地模式下,Flink运行在单个JVM进程中,不需要额外的集群管理工具。
  2. 独立集群模式

    • 在独立集群模式下,Flink可以作为一个独立的集群运行,不依赖于其他资源管理器。用户需要手动设置和配置集群中的所有节点。
  3. Standalone Session Cluster

    • 这是一种特殊的独立集群模式,其中集群资源可以被多个作业共享。用户提交作业到集群时,Flink会为每个作业分配资源。
  4. YARN(Yet Another Resource Negotiator)

    • 在这种模式下,Flink与Apache Hadoop YARN集成,利用YARN进行资源管理和作业调度。
  5. Mesos

    • Flink可以部署在Apache Mesos集群上,利用Mesos进行资源管理和作业调度。
  6. Kubernetes

    • Flink支持在Kubernetes上运行,使用Kubernetes进行资源管理和作业调度。
  7. Docker

    • Flink可以部署在Docker容器中,这使得它能够在隔离的环境中运行,便于部署和扩展。
  8. Cloud-native部署

    • Flink也可以部署在云服务上,如AWS、Azure、Google Cloud等,利用云服务提供商的资源管理和作业调度。

Flink本地模式搭建

前期准备

Flink版本:flink-1.13.2-bin-scala_2.11.tgz (jdk-1.8)
Flink版本: flink-1.20.0-bin-scala_2.12.tgz (jdk17) 下载地址:flink.apache.org/zh/download… wget repo.huaweicloud.com/apache/flin…

Flink 驱动

wget -P ./lib/ https://repo1.maven.org/maven2/org/apache/flink/flink-sql-connector-elasticsearch7_2.11/1.13.3/flink-sql-connector-elasticsearch7_2.11-1.13.3.jar | \
wget -P ./lib/ https://repo1.maven.org/maven2/org/apache/flink/flink-connector-jdbc_2.11/1.13.3/flink-connector-jdbc_2.11-1.13.3.jar | \
wget -P ./lib/ https://repo1.maven.org/maven2/com/ververica/flink-sql-connector-mysql-cdc/2.1.1/flink-sql-connector-mysql-cdc-2.1.1.jar | \
wget -P ./lib/ https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.22/mysql-connector-java-8.0.22.jar

解压,修改配置

目录: conf/flink-conf.yaml

image.png

image.png

启动 、关闭 、验证

 ./bin/start-cluster.sh
 ./stop-cluster.sh

jps
1864 TaskManagerRunner                  -- 启动成功
1581 StandaloneSessionClusterEntrypoint -- 启动成功

flink+flinkcdc+同步MYSQL到MYSQL 示例

编写同步脚本 flinkSql_007.sql

SET execution.checkpointing.interval = 60s;

drop table if exists  products;
CREATE TABLE products (
  id INT NOT NULL,
  `name`  STRING,
  description STRING,
  create_time TIMESTAMP,
  PRIMARY KEY (`id`) NOT ENFORCED
 ) WITH (
    'connector' = 'mysql-cdc',
    'hostname' = '',
    'port' = '3306',
    'username' = '',
    'password' = '',
    'database-name' = 'apitest',
    'server-time-zone' = 'Asia/Shanghai',
    'table-name' = 'products'
 );
drop table if exists  storage_info;
CREATE TABLE storage_info (
  id INT NOT NULL,
  product_id INT,
  `num` INT,
  PRIMARY KEY (`id`) NOT ENFORCED
 ) WITH (
    'connector' = 'mysql-cdc',
    'hostname' = '',
    'port' = '3306',
    'username' = '',
    'password' = '',
    'database-name' = 'apitest',
    'server-time-zone' = 'Asia/Shanghai',
    'table-name' = 'storage_info'
 );
 
drop table if exists  product_storage;
CREATE TABLE product_storage (
  product_id INT,
  product_name STRING,
  remain_count INT,
  create_time TIMESTAMP,
  PRIMARY KEY (`product_id`) NOT ENFORCED
 ) WITH (
    'connector' = 'jdbc',
    'url' = 'jdbc:mysql://IP:3306/alipay?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC',
    'username' = '',
    'password' = '',
    'table-name' = 'product_storage',
    'driver' = 'com.mysql.cj.jdbc.Driver',
    'scan.fetch-size' = '200'
 );

INSERT INTO product_storage
SELECT a.id AS product_id,a.name AS product_name,b.num AS remain_count,a.create_time 
FROM products as a 
join storage_info as b on a.id=b.product_id;

检查网络 telnet IP 3306

  ./bin/sql-client.sh -f ./bin/flink_sql/flinkSql_007.sql

启动任务

./bin/sql-client.sh -f ./bin/flink_sql/flinkSql_007.sql

关闭任务

进入 flink web 端

image.png

image.png

image.png