mysql flink cdc 实时数据抓取

背景

通过监控mysql日志,获取表字段更新,用来做实时展示。

 使用技术:Flink CDC

Flink CDC 基于数据库日志的 Change Data Caputre 技术,实现了全量和增量的一体化读取能力,并借助 Flink 优秀的管道能力和丰富的上下游生态,支持捕获多种数据库的变更,并将这些变更实时同步到下游存储。

下面正式开始:

1.Mysql 打开 bin-log 功能

# 查看是否开启binlog
mysql> SHOW VARIABLES LIKE '%log_bin%';

 

log_bin :ON 为开启 。 我用的是MySQL5.7,默认开启。

2.pom 文件添加引用

  <properties>
        <flink.version>1.17.1</flink.version>
        <flink.cdc.version>2.4.0</flink.cdc.version>
  </properties>

        <dependency>
            <groupId>com.ververica</groupId>
            <artifactId>flink-connector-mysql-cdc</artifactId>
            <version>${flink.cdc.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-streaming-java</artifactId>
            <version>${flink.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-clients</artifactId>
            <version>${flink.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-connector-files</artifactId>
            <version>${flink.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-table-runtime</artifactId>
            <version>${flink.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-shaded-guava</artifactId>
            <version>30.1.1-jre-16.1</version>
        </dependency>

 3.flink cdc 部分代码

package org.wwj.cdc;

import com.ververica.cdc.connectors.mysql.source.MySqlSource;
import com.ververica.cdc.connectors.mysql.source.MySqlSourceBuilder;
import com.ververica.cdc.connectors.mysql.table.StartupOptions;
import com.ververica.cdc.debezium.JsonDebeziumDeserializationSchema;
import org.apache.flink.api.common.eventtime.WatermarkStrategy;
import org.apache.flink.configuration.Configuration;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;

import java.io.Serializable;
import java.util.Properties;

/**
 * 项目名称:wwj-mysql-flink-cdc
 * 类名称:MysqlCdc
 * 类描述:
 * 创建人:wuwenjin
 * 创建时间:2024/12/15
 * 修改人:
 * 修改时间:
 * 修改备注:
 *
 * @version 1.0
 */
@Component
public class MysqlCdc implements ApplicationRunner, Serializable {
    @Override
    public void run(ApplicationArguments arg0) throws Exception {

        Properties debeziumProperties = new Properties();
        debeziumProperties.put("decimal.handling.mode", "String");
        // 日期格式后到处理
        MySqlSourceBuilder<String> sourceBuilder = MySqlSource.<String>builder()
                .hostname("localhost")
                .port(3306)
                .databaseList("wwj")
                .tableList("wwj.studnet")
                .username("root")
                .password("111111")
                .scanNewlyAddedTableEnabled(true)
                .debeziumProperties(debeziumProperties)
                .deserializer(new JsonDebeziumDeserializationSchema());

        Configuration configuration = new Configuration();
        // 从最新位置开始获取日志
        sourceBuilder.startupOptions(StartupOptions.latest());
        // 避免flink集群akka超时
        configuration.setString("akka.ask.timeout", "120s");
        configuration.setString("web.timeout", "300000");
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(configuration);
        // 设置 checkpoint 保存频次 30S/次
        env.enableCheckpointing(30000);
        // 设置checkpoint路径
        env.getCheckpointConfig().setCheckpointStorage("file:///E:/ff-Log");
        // 配置数据源,设置并行度
        DataStreamSource<String> streamSource = env
                .fromSource(sourceBuilder.build(), WatermarkStrategy.noWatermarks(), "mysql-cdc-source")
                .setParallelism(1);
        streamSource.print();
        try {
            env.execute();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 上面代码是对wwj数据库中的 studnet表添加监控。

4.运行效果

将表中id=2的age由6改为7:

 

 程序中获取到的日志:

完成数据格式:

{
    "before": {
        "id": "2",
        "name": "wwj2",
        "age": "6"
    },
    "after": {
        "id": "2",
        "name": "wwj2",
        "age": "7"
    },
    "source": {
        "version": "1.9.7.Final",
        "connector": "mysql",
        "name": "mysql_binlog_source",
        "ts_ms": 1734417346000,
        "snapshot": "false",
        "db": "wwj",
        "sequence": null,
        "table": "studnet",
        "server_id": 1,
        "gtid": null,
        "file": "logbin.000028",
        "pos": 649462924,
        "row": 0,
        "thread": 1028,
        "query": null
    },
    "op": "u",
    "ts_ms": 1734417346869,
    "transaction": null
}

before:修改前的数据 。 after:修改后的数据。op:操作类型 ,u更新,c新增,d删除 r读取

这样拿到变更数据后,就可以进一步分析,获取变化的字段,进行预警或者其它操作。

项目demo: https://github.com/qianchenyimeng/wwj-mysql-flink-cdc

### 如何使用Flink CDCMySQL同步数据到Doris #### 配置环境准备 为了成功实施Flink CDCMySQL至Doris的数据同步,需先准备好必要的软件包和依赖项。这包括安装并配置好Apache Flink集群以及确保已部署了支持CDC功能的JDBC驱动程序版本[^1]。 #### 创建Flink作业 创建一个新的Flink流处理应用程序,在此应用中定义源表(Source Table),该表指向要监控变更记录的MySQL数据库中的特定表格。利用`Debezium`作为捕获工具,它能够识别并解析二进制日志(binlog)事件从而获取增量更新信息[^2]。 ```sql CREATE TABLE mysql_source ( id BIGINT, name STRING, description STRING, PRIMARY KEY (id) NOT ENFORCED ) WITH ( 'connector' = 'mysql-cdc', 'hostname' = 'localhost', 'port' = '3306', 'username' = 'root', 'password' = 'your_password', 'database-name' = 'test_db', 'table-name' = 'source_table' ); ``` 上述SQL语句展示了如何设置一个基于MySQL CDC连接器的源表,其中指定了目标主机名、端口、用户名和其他必要参数来建立与MySQL服务器之间的通信链接。 #### 定义Sink操作符 接着定义sink操作符用于指定目的位置——即存储最终结果的地方。这里的目标是将来自上游流程的数据写入到Doris数仓内相应的接收者(Receiver)表里去: ```sql CREATE TABLE doris_sink ( id BIGINT, name STRING, description STRING ) WITH ( 'connector' = 'doris', 'fenodes' = 'doris_fe_host:doris_fe_http_port', -- Doris FE节点地址 'table.identifier' = 'db_name.table_name', -- 目标表全限定名称 'username' = 'root', -- 密码(如果适用) ); ``` 这段代码片段说明了怎样构建通往Doris的目的地表结构,并设置了有关于Doris前端(FE)节点的信息以及其他认证细节以便顺利执行插入动作。 #### 启动数据流转过程 最后一步就是启动整个ETL管道,让其自动运行起来完成从源头读取变化后的行级数据并通过网络传输给目的地的过程。可以通过编写简单的查询逻辑把两个表关联起来形成完整的流水线: ```sql INSERT INTO doris_sink SELECT * FROM mysql_source; ``` 这条命令指示Flink引擎持续不断地抓取消息队列里的最新变动并将它们转发出去直至到达预设好的终点站[Doris][^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值