1.6 使用 FlinkCDC 同步实时数据

欢迎来到我的博客,很高兴能够在这里和您见面!欢迎订阅相关专栏:
欢迎关注微信公众号:野老杂谈
⭐️ 全网最全IT互联网公司面试宝典:收集整理全网各大IT互联网公司技术、项目、HR面试真题.
⭐️ AIGC时代的创新与未来:详细讲解AIGC的概念、核心技术、应用领域等内容。
⭐️ 全流程数据技术实战指南:全面讲解从数据采集到数据可视化的整个过程,掌握构建现代化数据平台和数据仓库的核心技术和方法。

Flink CDC概述

Flink CDC(Change Data Capture)是基于 Apache Flink 和 Debezium 的实时数据采集和处理工具。它能够捕获数据库中的实时变化数据(如插入、更新、删除操作),并将这些变化数据实时传输到数据湖、数据仓库或其他下游系统。Flink CDC 可以处理 MySQL、PostgreSQL 等多种数据库的变更数据,适用于构建实时数据管道和流式处理应用。

Flink CDC架构

架构图
graph TD;
    A[Source Database] -->|Binlog/Write-Ahead Log| B[Debezium Connector]
    B -->|Change Data Events| C[Flink Source Connector]
    C -->|Flink DataStream API| D[Flink Processing Job]
    D -->|Processed Data| E[Sink Systems (e.g., Kafka, HDFS, Elasticsearch)]

在这里插入图片描述

基本工作流程

  1. 数据捕获:Flink CDC 使用 Debezium 连接器捕获源数据库的变更日志(如 MySQL binlog 或 PostgreSQL WAL)。
  2. 事件传输:Debezium 将捕获的变更日志解析为标准化的变更数据事件,并传输到 Flink 的 Source Connector。
  3. 数据处理:Flink 作业接收变更数据事件,通过 DataStream API 对数据进行实时处理、转换和分析。
  4. 数据输出:处理后的数据被传输到指定的下游系统,如 Kafka、HDFS 或 Elasticsearch。

使用场景

  1. 实时数据同步:在不同数据库之间实现数据的实时同步。
  2. 实时数据分析:对捕获的数据变化进行实时分析和监控。
  3. 数据湖/数据仓库更新:将实时变化的数据同步到数据湖或数据仓库,保持数据的一致性。
  4. 事件驱动架构:基于数据库变化事件驱动的微服务架构。

优缺点

优点

  • 实时捕获数据库变化,低延迟。
  • 兼容多种数据库,扩展性强。
  • 与 Apache Flink 无缝集成,提供强大的数据处理能力。
  • 支持复杂的流式处理逻辑。

缺点

  • 部署和维护相对复杂,需具备一定的技术基础。
  • 对源数据库的性能有一定影响,需进行合理配置。
  • 需要处理可能的数据丢失和延迟问题。

部署安装

前提条件
  • Java 8 或更高版本
  • Apache Flink 1.11+ 版本
  • Kafka(可选,用于消息队列)
  • MySQL 或 PostgreSQL 数据库
步骤
  1. 下载和配置 Apache Flink

    • 下载 Flink 并解压。
    • 配置 flink-conf.yaml,设置集群参数。
  2. 下载 Debezium 连接器

    • 下载 Debezium MySQL/PostgreSQL 连接器 jar 包。
    • 将 jar 包放置到 Flink 的 lib 目录下。
  3. 启动 Flink 集群

    • 启动 Flink 集群:bin/start-cluster.sh
  4. 编写和提交 Flink CDC 作业

    • 编写 Flink CDC 作业代码。
    • 编译打包后,通过 Flink Web UI 或 CLI 提交作业。

使用案例

场景:实时同步 MySQL 数据到 Kafka

代码示例

import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.datastream.DataStream;
import com.ververica.cdc.connectors.mysql.MySQLSource;
import com.ververica.cdc.connectors.mysql.table.StartupOptions;
import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
import org.apache.flink.streaming.api.functions.sink.SinkFunction;
import org.apache.flink.connector.kafka.sink.KafkaSink;
import org.apache.kafka.clients.producer.ProducerConfig;

public class FlinkCDCSample {

    public static void main(String[] args) throws Exception {
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

        DataStream<String> sourceStream = env.addSource(MySQLSource.<String>builder()
            .hostname("localhost")
            .port(3306)
            .databaseList("test_db")
            .tableList("test_db.test_table")
            .username("root")
            .password("password")
            .deserializer(new JsonDebeziumDeserializationSchema())
            .startupOptions(StartupOptions.initial())
            .build());

        KafkaSink<String> kafkaSink = KafkaSink.<String>builder()
            .setBootstrapServers("localhost:9092")
            .setKafkaProducerConfig(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer")
            .setKafkaProducerConfig(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer")
            .setDeliverGuarantee(DeliveryGuarantee.AT_LEAST_ONCE)
            .build();

        sourceStream.sinkTo(kafkaSink);

        env.execute("Flink CDC MySQL to Kafka");
    }
}
使用 Flink SQL 通过 Flink CDC 同步 MySQL 数据到 Kafka 案例
场景概述

我们将通过 Flink SQL 和 Flink CDC 实现将 MySQL 数据库中的变更数据实时同步到 Kafka。具体步骤包括创建 Flink SQL 环境,定义 MySQL 连接器表和 Kafka 连接器表,并编写 SQL 语句实现数据同步。

步骤
  1. 准备工作

    • 安装和配置 Apache Flink 集群。
    • 安装 MySQL 数据库并准备数据表。
    • 安装和配置 Kafka 集群。
  2. 配置 Flink SQL 环境

    • 下载和安装 Flink SQL CLI。
    • 将 Debezium MySQL 连接器和 Kafka 连接器 jar 包放置到 Flink 的 lib 目录下。
  3. 创建 MySQL 表

    CREATE DATABASE test_db;
    USE test_db;
    
    CREATE TABLE test_table (
        id INT PRIMARY KEY,
        name VARCHAR(255),
        age INT,
        update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
    );
    
    INSERT INTO test_table (id, name, age) VALUES
    (1, 'Alice', 30),
    (2, 'Bob', 25);
    
  4. 创建 Kafka 主题

    kafka-topics.sh --create --topic test_topic --bootstrap-server localhost:9092 --partitions 1 --replication-factor 1
    
  5. 编写 Flink SQL 脚本

    Flink SQL 脚本文件(sync_mysql_to_kafka.sql)

    -- 定义 MySQL 连接器表
    CREATE TABLE mysql_source (
        id INT,
        name STRING,
        age INT,
        update_time TIMESTAMP,
        PRIMARY KEY (id) NOT ENFORCED
    ) WITH (
        'connector' = 'mysql-cdc',
        'hostname' = 'localhost',
        'port' = '3306',
        'username' = 'root',
        'password' = 'password',
        'database-name' = 'test_db',
        'table-name' = 'test_table'
    );
    
    -- 定义 Kafka 连接器表
    CREATE TABLE kafka_sink (
        id INT,
        name STRING,
        age INT,
        update_time TIMESTAMP
    ) WITH (
        'connector' = 'kafka',
        'topic' = 'test_topic',
        'properties.bootstrap.servers' = 'localhost:9092',
        'format' = 'json'
    );
    
    -- 将 MySQL 数据同步到 Kafka
    INSERT INTO kafka_sink
    SELECT id, name, age, update_time
    FROM mysql_source;
    
  6. 执行 Flink SQL 脚本

    • 启动 Flink SQL CLI:
      ./bin/sql-client.sh embedded
      
    • 在 SQL CLI 中执行脚本:
      SET execution.runtime-mode = streaming;
      
      -- 执行同步脚本
      SOURCE /path/to/sync_mysql_to_kafka.sql;
      
代码示例详细解读
  1. MySQL Source Table 定义

    CREATE TABLE mysql_source (
        id INT,
        name STRING,
        age INT,
        update_time TIMESTAMP,
        PRIMARY KEY (id) NOT ENFORCED
    ) WITH (
        'connector' = 'mysql-cdc',
        'hostname' = 'localhost',
        'port' = '3306',
        'username' = 'root',
        'password' = 'password',
        'database-name' = 'test_db',
        'table-name' = 'test_table'
    );
    
    • 定义了一个 MySQL 源表 mysql_source,使用 mysql-cdc 连接器。
    • 指定了连接 MySQL 数据库的相关信息,包括 hostnameportusernamepassworddatabase-nametable-name
  2. Kafka Sink Table 定义

    CREATE TABLE kafka_sink (
        id INT,
        name STRING,
        age INT,
        update_time TIMESTAMP
    ) WITH (
        'connector' = 'kafka',
        'topic' = 'test_topic',
        'properties.bootstrap.servers' = 'localhost:9092',
        'format' = 'json'
    );
    
    • 定义了一个 Kafka 目标表 kafka_sink,使用 kafka 连接器。
    • 指定了 Kafka 相关信息,包括 topic 名称 test_topicbootstrap.servers 和数据格式 json
  3. 数据同步 SQL

    INSERT INTO kafka_sink
    SELECT id, name, age, update_time
    FROM mysql_source;
    
    • 使用 INSERT INTO ... SELECT ... 语句,将 mysql_source 表中的数据同步到 kafka_sink 表。

性能优化

  1. 合理配置资源:根据作业的复杂度和数据量,配置合适的 Flink 集群资源。
  2. 调优 Debezium 连接器:设置合适的批量大小和抓取频率,平衡捕获延迟和性能。
  3. 优化数据处理逻辑:简化处理逻辑,减少不必要的操作和数据转换。
  4. 使用并行度:增加 Flink 任务的并行度,提高数据处理能力。

总结

Flink CDC 是一种强大的实时数据采集和处理工具,能够捕获并处理多种数据库的变更数据。它通过与 Flink 和 Debezium 的集成,实现了低延迟、高吞吐量的数据处理,适用于实时数据同步、实时分析和事件驱动架构等场景。虽然部署和维护较为复杂,但其提供的强大功能和灵活性,使其成为构建实时数据管道的理想选择。


💗💗💗 如果觉得这篇文对您有帮助,请给个点赞、关注、收藏吧,谢谢!💗💗💗

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

野老杂谈

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

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

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

打赏作者

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

抵扣说明:

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

余额充值