flink-cdc入门使用

flink-cdc 入门

介绍

#如下内容暂时不理解也没事。
Flink CDC Connectors 是 Apache Flink 的一组源端(Source)连接器,通过捕获变更数据(Change Data Capture)从不同数据库中采集数据。项目早期通过集成 Debezium 引擎来采集数据,支持 全量 + 增量 的模式,保证所有数据的一致性。但因为集成了 Debezium Engine,用户在使用过程中出现了一些痛点:一致性通过加锁保证。
Debezium 在保证数据一致性时,需要对读取的库或表加锁,全局锁可能导致数据库 hang 住,表级锁会锁住表的读
不支持水平扩展Flink CDC 目前只支持单并发,在全量阶段读取阶段,如果表非常大(亿级别),读取时间在小时级别
全量读取阶段不支持 checkpoint
CDC 读取分为两个阶段,全量读取和增量读取,全量读取阶段不支持 checkpoint,fail 后需要重新读取
Flink CDC 2.0 为了解决如上痛点而设计,借鉴 Netflix DBLog 的无锁算法,并基于 FLIP-27 实现,以达成如下目标:无锁,水平扩展,支持全量阶段 checkpoint。

CDC 是变更数据捕获(Change Data Capture)技术的缩写,它可以将源数据库(Source)的增量变动记录,同步到一个或多个数据目的(Sink)。在同步过程中,还可以对数据进行一定的处理,例如分组(GROUP BY)、多表的关联(JOIN)等。例如对于电商平台,用户的订单会实时写入到某个源数据库;A 部门需要将每分钟的实时数据简单聚合处理后保存到 Redis 中以供查询,B 部门需要将当天的数据暂存到 Elasticsearch 一份来做报表展示,C 部门也需要一份数据到 ClickHouse 做实时数仓。随着时间的推移,后续 D 部门、E 部门也会有数据分析的需求,这种场景下,传统的拷贝分发多个副本方法很不灵活,而 CDC 可以实现一份变动记录,实时处理并投递到多个目的地。下图是一个示例,通过腾讯云 Oceanus 提供的 Flink CDC 引擎,可以将某个 MySQL 的数据库表的变动记录,实时同步到下游的 Redis、Elasticsearch、ClickHouse 等多个接收端。这样大家可以各自分析自己的数据集,互不影响,同时又和上游数据保持实时的同步。

通常来讲,CDC 分为主动查询和事件接收两种技术实现模式。对于主动查询而言,用户通常会在数据源表的某个字段中,保存上次更新的时间戳或版本号等信息,然后下游通过不断的查询和与上次的记录做对比,来确定数据是否有变动,是否需要同步。这种方式优点是不涉及数据库底层特性,实现比较通用;缺点是要对业务表做改造,且实时性不高,不能确保跟踪到所有的变更记录,且持续的频繁查询对数据库的压力较大。事件接收模式可以通过触发器(Trigger)或者日志(例如 Transaction log、Binary log、Write-ahead log 等)来实现。当数据源表发生变动时,会通过附加在表上的触发器或者 binlog 等途径,将操作记录下来。下游可以通过数据库底层的协议,订阅并消费这些事件,然后对数据库变动记录做重放,从而实现同步。这种方式的优点是实时性高,可以精确捕捉上游的各种变动

简单入门

#flink-cdc入门相对简单,步骤如下
	step1:配置mysql的binlog
	step2:引入flink-cdc依赖(flink-connector-mysql-cdc),开发flink-cdc代码
	step3:测试mysql数据库新增数据

准备:

在mysql创建一个数据库inventory,再在里面创建一个表tab1

step1:配置mysql的binlog

#在my.cnf中添加binlog配置

    server-id = 123
    log_bin = mysql-bin
    binlog_format = row
    binlog_row_image = full
    expire_logs_days = 10
    gtid_mode = on
    enforce_gtid_consistency = on
   
#重启mysql服务。

step2:引入flink-cdc依赖(flink-connector-mysql-cdc),开发flink-cdc代码

#引入依赖(我实验用的是2.0.0)

<dependency>
    <groupId>com.ververica</groupId>
    <artifactId>flink-connector-mysql-cdc</artifactId>
    <version>2.1.1</version>
</dependency>
#flink-cdc代码

package org.lining.Test

import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment
import org.apache.flink.streaming.api.functions.source.SourceFunction
import com.ververica.cdc.debezium.StringDebeziumDeserializationSchema
import com.ververica.cdc.connectors.mysql.MySqlSource
import com.ververica.cdc.connectors.mysql.table.StartupOptions

object Test2 {
  def main(args: Array[String]): Unit = {
    val SourceFunction = MySqlSource.builder[String]()
        .hostname("139.196.237.231")
        .port(3306)
        .databaseList("inventory")           //监控库存数据库下的所有表
        .username("root")
        .password("123456")
        .deserializer(new StringDebeziumDeserializationSchema()) // converts SourceRecord
        .startupOptions(StartupOptions.latest())   //从flink cdc开始执行起,获取新增数据
        .build()
    val env = StreamExecutionEnvironment.getExecutionEnvironment
    env
      .addSource(SourceFunction)
      .print().setParallelism(1)
    env.execute("test1")
  }
}

step3:测试mysql数据库新增数据

启动开发的flink-cdc代码。
往数据库表tab1中插入数据,可以看到flink-cdc实时获取到新增数据。

至此,flink-cdc的基础入门应用讲完啦。大喊一声"优雅~"。

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值