1.Debezium-Embedded 简介
Debezium连接器的操作通常是将它们部署到Kafka Connect服务,并配置一个或多个连接器来监控上游数据库,并为它们在上游数据库中看到的所有更改生成数据更改事件。这些数据更改事件被写入Kafka,在那里它们可以被许多不同的应用程序独立使用。Kafka Connect提供了出色的容错性和可扩展性,因为它作为分布式服务运行,并确保所有注册和配置的连接器始终在运行。例如,即使集群中的一个Kafka Connect端点出现故障,其余的Kafka连接端点也会重新启动以前在现已终止的端点上运行的任何连接器,从而最大限度地减少停机时间并消除管理活动。
并不是每个应用程序都需要这种级别的容错和可靠性,他们可能不想依赖外部的Kafka代理和Kafka Connect服务集群。相反,一些应用程序更喜欢将Debezium连接器直接嵌入到应用程序空间中。他们仍然想要相同的数据更改事件,但更喜欢让连接器将它们直接发送到应用程序,而不是将它们保存在Kafka中。
这个Debezium-Embedded模块定义了一个小型库,允许应用程序轻松配置和运行debezium连接器。
2.MySQL端配置
2.1 开启日志
MySQL开启日志配置可参考MySQL 主从配置-CSDN博客实现。
show variables like 'log_%';
2.2 创建监控账号并授权
#创建账号
create user debezium@'%' identified with mysql_native_password by 'wsx-123';
#给账号授权
GRANT SELECT, RELOAD, SHOW DATABASES, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'debezium'@'%';
#刷新权限
FLUSH PRIVILEGES;
3.应用端开发
3.1 maven 引用debezium-embedded
<dependency> <groupId>io.debezium</groupId> <artifactId>debezium-embedded</artifactId> <version>${debezium-embedded.version}</version> </dependency> <dependency> <groupId>io.debezium</groupId> <artifactId>debezium-connector-mysql</artifactId> <version>${debezium-embedded.version}</version> </dependency>
3.2 代码开发
java
package com.dayesmart.dataplusjava.util;
import io.debezium.config.Configuration;
import io.debezium.embedded.EmbeddedEngine;
import io.debezium.engine.DebeziumEngine;
import lombok.extern.slf4j.Slf4j;
import org.apache.kafka.connect.source.SourceRecord;
import java.util.List;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
@Slf4j
public class DebeziumTest {
public static void main(String[] args) {
Executor executor = Executors.newSingleThreadExecutor();
Configuration config = Configuration.create()
/* begin engine properties */
.with("connector.class",
"io.debezium.connector.mysql.MySqlConnector")
.with("offset.storage",
"org.apache.kafka.connect.storage.FileOffsetBackingStore")
.with("offset.storage.file.filename",
"E:/tmp/debezium/offset.dat")
.with("offset.flush.interval.ms", 60000)
/* begin connector properties */
.with("name", "my-sql-connector")
.with("database.hostname", "127.0.0.1")
.with("database.port", 3307)
.with("database.user", "debezium")
.with("database.password", "wsx-123")
.with("database.connectionTimeZone", "Asia/Shanghai")
.with("database.server.id", 85744)
.with("database.include.list","test")
.with("snapshot.mode","initial")
.with("database.server.name","weisx")
.with("database.history",
"io.debezium.relational.history.FileDatabaseHistory")
.with("database.history.file.filename",
"E:/tmp/debezium/schemahistory.dat")
.build();
// Create the engine with this configuration ...
EmbeddedEngine engine = EmbeddedEngine.create()
.using(config)
.notifying(new EmbeddedEngine.ChangeConsumer(){
@Override
public void handleBatch(List<SourceRecord> list, DebeziumEngine.RecordCommitter<SourceRecord> recordCommitter) throws InterruptedException {
log.info("{}",list);
}
})
.using((success,message,error) ->{
log.info("success:{},message:{},error:{}",success,message,error);
})
.build();
// Run the engine asynchronously ...
executor.execute(engine);
}
}