
本文旨在解决使用debezium java嵌入式连接器捕获mysql数据变更时遇到的常见配置问题。重点阐述了`database.include.list`与`table.include.list`的正确用法,并指出`whitelist`属性的弃用。通过优化连接器配置,确保debezium能够准确监控并捕获数据库中的增删改事件,从而实现可靠的变更数据捕获。
Debezium是一个开源的分布式平台,用于捕获各种数据库的变更数据(Change Data Capture, CDC)。它通过读取数据库的事务日志(如MySQL的binlog)来实时地捕获数据行级别的变更,并将这些变更事件流式传输到Apache Kafka或其他消息队列。Debezium提供了一个Java嵌入式连接器(Embedded Engine),允许开发者在自己的Java应用程序中直接运行Debezium连接器,无需依赖完整的Kafka Connect集群。
在使用Debezium Java嵌入式连接器时,常见的挑战是正确配置连接器以确保它能够准确地监控并捕获所需数据库或表的数据变更。即使连接成功,如果配置不当,Debezium也可能无法触发相应的事件处理逻辑。
当Debezium连接到MySQL数据库并显示连接成功日志(例如Connected to localhost:3305 at binlog.000008/3443),但却未能捕获到数据变更事件时,问题通常出在连接器的配置上。以下是常见的配置误区:
database.include.list与table.include.list的混淆:
立即学习“Java免费学习笔记(深入)”;
database.whitelist和table.whitelist属性的弃用:
为了确保Debezium能够正确捕获MySQL的数据变更,我们需要根据其设计意图来配置database.include.list和table.include.list。
假设我们希望监控名为my_application_db数据库中的user表。
以下是DebeziumConfigLoader.load方法的优化版本,展示了如何正确配置Debezium MySQL连接器:
import io.debezium.config.Configuration;
import java.util.Properties;
public class DebeziumConfigLoader {
public static Configuration load(Connection connection) {
final MysqlConnection mysql = connection.getMysqlConnection();
// 获取要监控的数据库名称
String databaseToMonitor = mysql.getDbName();
// 获取要监控的表名称列表,例如 "my_application_db.user"
// 假设 mysql.getTables() 返回的是 "user"
String tablesToMonitor = databaseToMonitor + "." + String.join("," , mysql.getTables());
return Configuration.create()
.with("name", "customer-mysql-connector")
.with("connector.class", "io.debezium.connector.mysql.MySqlConnector")
.with("offset.storage", "org.apache.kafka.connect.storage.FileOffsetBackingStore")
.with("offset.flush.interval.ms", "60000")
.with("database.hostname", mysql.getHost())
.with("database.port", mysql.getPort())
.with("database.user", mysql.getUsername())
.with("database.password", mysql.getPassword())
// 正确配置:指定要监控的数据库名称
.with("database.include.list", databaseToMonitor)
// 正确配置:指定要监控的完全限定表名称
.with("table.include.list", tablesToMonitor)
.with("include.schema.changes", "false")
.with("database.server.id", "10181") // 确保此ID在所有Debezium连接器实例中唯一
.with("database.server.name", "customer-mysql-db-server")
.with("database.history", "io.debezium.relational.history.FileDatabaseHistory")
.with("database.history.file.filename", "/tmp/dbhistory.dat")
.with("offset.storage.file.filename", "/tmp/offsets.dat")
// 移除已弃用的 'database.whitelist' 和 'table.whitelist'
// .with("database.whitelist", "mysql.*") // 此行应被移除
// .with("table.whitelist", "mysql.*") // 此行应被移除
.build();
}
}关键修改点:
Debezium版本兼容性: 始终查阅您所使用的Debezium版本的官方文档,以了解最新的配置属性和任何弃用信息。属性名称和行为可能在不同版本之间发生变化。
MySQL用户权限: 确保Debezium连接的MySQL用户拥有足够的权限来读取binlog和访问被监控的数据库和表。通常需要REPLICATION SLAVE和SELECT权限。
MySQL Binlog配置:
database.server.id的唯一性: database.server.id用于Debezium标识自身在MySQL复制协议中的从属ID。如果运行多个Debezium连接器实例(即使是不同的应用程序),每个实例都必须配置一个唯一的database.server.id,以避免与MySQL复制协议中的其他从库或Debezium实例冲突。
偏移量存储 (offset.storage) 和数据库历史 (database.history):
Debezium Java嵌入式连接器为应用程序集成CDC功能提供了强大而灵活的方式。然而,其有效性高度依赖于准确的配置。通过理解database.include.list和table.include.list的正确用法,避免使用已弃用的属性,并关注MySQL的binlog配置和Debezium的持久化机制,开发者可以确保Debezium能够可靠地捕获数据库变更事件,从而构建出响应式和数据驱动的应用程序。在遇到事件未捕获问题时,仔细检查这些配置项是解决问题的关键。
以上就是Debezium Java嵌入式连接器:解决MySQL数据变更捕获配置问题的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号