Debezium实现MySQL数据监听
了解Debezium
官网:https://debezium.io/
Debezium是一组分布式服务,用于捕获数据库中的更改,以便应用程序可以看到这些更改并对其做出响应。Debezium在更改事件流中记录每个数据库表中的所有行级更改,应用程序只需读取这些流,以按更改事件发生的相同顺序查看更改事件。
简单来说,Debezium可以用来捕获变更数据,包括表结构or表数据的增删改,并将这些变更数据流式传递到下游,以便做进一步的操作。flink便是在此基础上实现的,但flink成本比较高昂。
本期主要内容
实现MySQL binlog数据监听功能:
- 支持无状态的全量、增量同步和有状态的全量、增量同步功能
- 通过自定义JdbcOffsetBackingStore将offset存储到数据库
实现步骤
这里使用Debezium 3.2.0.Final 版本进行测试。
1. 新建Maven工程
新建一个java项目,选择Maven构建,大家都是老司机,这里就不在赘述!
2.导入依赖
<!-- Debezium核心库 -->
<dependency>
<groupId>io.debezium</groupId>
<artifactId>debezium-embedded</artifactId>
<version>3.2.0.Final</version>
</dependency>
<!-- MySQL连接器 -->
<dependency>
<groupId>io.debezium</groupId>
<artifactId>debezium-connector-mysql</artifactId>
<version>3.2.0.Final</version>
</dependency>
<!-- 数据库驱动 (MySQL 8.0+) -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.2.0</version>
</dependency>
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
<version>2.0.52</version>
</dependency>
3.核心代码编写
import com.alibaba.fastjson2.JSONObject;
import io.debezium.engine.ChangeEvent;
import io.debezium.engine.DebeziumEngine;
import io.debezium.engine.format.Json;
import java.io.IOException;
import java.util.Objects;
import java.util.Properties;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* @author lzq
*/
public class DebeziumMysqlExample {
public static void main(String[] args) {
// 1. 配置Debezium连接器属性
Properties props = configureDebeziumProperties();
// 2. 创建Debezium引擎
DebeziumEngine<ChangeEvent<String, String>> engine = DebeziumEngine
.create(Json.class)
.using(props)
.notifying(DebeziumMysqlExample::processRecords)
.build();
// 3. 启动引擎
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.execute(engine);
// 4. 注册关闭钩子,优雅退出
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
try {
System.out.println("正在关闭Debezium引擎...");
engine.close();
executor.shutdown();
} catch (IOException e) {
throw new RuntimeException(e);
}
}));
}
/**
* 处理捕获到的变更事件
*/
private static void processRecords(ChangeEvent<String, String> record) {
String value = record.value();
System.out.println("捕获到变更事件 :" + value);
try {
if (value == null) {
return;
}
JSONObject from = JSONObject.parse(value);
JSONObject before = from.getJSONObject("before");
JSONObject after = from.getJSONObject("after");
String ddl = from.getString("ddl");
// 操作类型 op: r(读取) c(创建), u(更新), d(删除)
System.out.println("++++++++++++++++++++++++ MySQL Binlog Change Event ++++++++++++++++++++++++");
System.out.println("op: "


2029

被折叠的 条评论
为什么被折叠?



