使用 Flink CDC 从 MySQL 读取数据简介

Apache Flink 是一个强大的流处理框架,它在实时数据处理和分析方面表现出色。其中,Flink CDC(Change Data Capture)是一个令人兴奋的功能,允许开发者实时捕获数据库中的变化,并将这些变化流式传输到其他系统中。本文将以 MySQL 数据库为例,详细解释如何使用 Flink CDC 读取整个 MySQL 数据库中的数据。

什么是 Flink CDC?

Flink CDC 是一个开源项目,旨在方便开发者对关系型数据库的更改进行捕捉。它通过使用数据库的日志文件(如 MySQL 的二进制日志)来识别并捕捉数据的插入、更新和删除操作,从而实现实时数据流处理。

系统架构

在这个系统中,Flink 将充当中间层,负责读取 MySQL 数据库中的数据变化,并将这些数据变化发送到下游存储或处理系统。以下是系统的关系图:

erDiagram
    MYSQL ||--o{ FLINK_CDC : reads
    FLINK_CDC ||--o{ KAFKA : sends
    KAFKA ||--o{ CONSUMER : consumes
  1. MYSQL:源数据存储。
  2. FLINK_CDC:数据捕获组件,捕获来自 MySQL 的数据变化。
  3. KAFKA:数据流分类系统,接收来自 Flink 的数据。
  4. CONSUMER:下游消费系统,处理或存储数据流。

使用步骤

1. 配置 MySQL

首先,确保你的 MySQL 数据库支持二进制日志。可以在主配置文件中设置:

[mysqld]
server-id=1
log-bin=mysql-bin
binlog-format=row

重启 MySQL 实例,使更改生效。

2. 添加依赖

在你的 Flink 项目中,确保添加所需的依赖项。在 Maven 的 pom.xml 中添加:

<dependency>
    <groupId>com.ververica.cdc</groupId>
    <artifactId>debezium-connector-mysql_2.12</artifactId>
    <version>2.2.0</version>
</dependency>

3. 编写 Flink 程序

在你的 Flink 程序中创建一个数据流,并从 MySQL 获取实时变更数据。

以下是一个简单的 Flink 程序示例:

import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.connector.jdbc.JdbcInputFormat;
import org.apache.flink.streaming.api.functions.source.SourceFunction;
import io.debezium.config.Configuration;
import io.debezium.connector.mysql.MySqlConnector;
import io.debezium.embedded.EmbeddedEngine;

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

        // 配置 Debezium 连接器
        Configuration config = Configuration.create()
            .with("name", "mysql-connector")
            .with("connector.class", MySqlConnector.class.getName())
            .with("tasks.max", "1")
            .with("database.hostname", "localhost")
            .with("database.port", "3306")
            .with("database.user", "root")
            .with("database.password", "password")
            .with("database.server.id", "184054")
            .with("database.server.name", "dbserver1")
            .with("database.whitelist", "mydatabase")
            .with("table.whitelist", "mydatabase.mytable")
            .with("key.converter", "org.apache.kafka.connect.json.JsonConverter")
            .with("value.converter", "org.apache.kafka.connect.json.JsonConverter")
            .build();

        // 创建 Debezium 嵌入式引擎
        EmbeddedEngine engine = EmbeddedEngine.create().using(config).notifying(record -> {
            // 对捕获到的记录进行处理
            System.out.println(record);
        }).build();

        // 启动引擎
        new Thread(engine).start();
        
        // 开始执行 Flink 数据流
        try {
            env.execute("Flink CDC Example");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

4. 运行 Flink 程序

使用适当的命令启动你的 Flink 程序。确保环境配置正确,并且 MySQL 服务正在运行。

flink run -c your.package.FlinkCDCExample your-flink-application.jar

测试数据变更

当 Flink CDC 程序启动并运行后,可以通过向 MySQL 数据库插入、更新或删除记录来测试数据捕获。例如:

INSERT INTO mytable (id, name) VALUES (1, 'John');
UPDATE mytable SET name = 'Jane' WHERE id = 1;
DELETE FROM mytable WHERE id = 1;

每次操作后,你将在控制台输出中看到相应的记录变更。

结论

通过本教程,你了解了如何配置 MySQL 数据库、设置 Flink CDC 以及编写一个简单的 Flink 程序来捕获数据更改流。在实际应用中,你可以将这些数据流发送到 Kafka、数据库或其他处理接口,实现实时数据处理与分析。Flink CDC 项目使得对数据变化的捕捉变得简单且高效,帮助企业构建更为灵活的数据处理管道。