Debezium 作者版权所有。根据 Apache 许可证 2.0 版获得许可。
Debezium 是一个开源项目,为变更数据捕获 (CDC) 提供低延迟数据流平台。该连接器提供了一个接收器实现,用于将 Debezium 发出的更改流式传输到关系数据库中。
此连接器实现是 Debezium 源感知的。这意味着连接器可以使用本机 Debezium 更改事件,而无需使用ExtractNewRecordState
来展平事件结构。这减少了使用 JDBC 接收器连接器所需的配置。此外,这还意味着管道的接收器端可以利用 Debezium 元数据(例如列类型传播)来无缝支持管道的接收器连接器端的正确列类型解析。
JDBC 接收器连接器是传统的 Kafka Connect 接收器连接器(也称为消费者)。它的工作是从一个或多个 Kafka 主题读取记录,并生成在配置的目标数据库上执行的 SQL 语句。
SinkRecordDescriptor
是从每个SinkRecord
构造的对象。大多数采用SinkRecord
的方法都采用此描述符对象。该描述符实际上是SinkRecord
的预处理版本,它允许我们执行一次预处理,然后在连接器中使用此信息。添加新方法时,您通常需要使用SinkRecordDescriptor
。
每个接收器数据库通常都有自己的DatabaseDialect
实现,该实现应该扩展GeneralDatabaseDialect
。方言是 JDBC 接收器连接器使用的核心机制之一,用于解析连接器将向其写入消费事件的数据库的 SQL 语句和其他数据库特征。 JDBC 接收器连接器依赖 Hibernate 的方言解析来驱动连接器使用的方言包装器。
如果未检测到正在使用的接收器数据库的方言映射,则 JDBC 接收器连接器将默认使用GeneralDatabaseDialect
实现。这种通用实现并不支持连接器的每个方面,例如,选择此方言时不支持 UPSERT 插入模式,因为 UPSERT 语句通常对于所使用的数据库是唯一的。如果新的接收器数据库要与 JDBC 接收器连接器的大量行为完全兼容,那么添加新的方言实现通常是个好主意。
Kafka 消息中的每个字段都与一个模式类型相关联,但此类型信息还可以携带其他元数据,例如源连接器提供的名称甚至参数。 JDBC 接收器连接器使用基于io.debezium.connector.jdbc.type.Type
协定的类型系统,以便处理值绑定、默认值解析和其他可能特定于类型的特征。
实际上存在三种不同类型的Type
实现:
io.debezium.connector.jdbc.type.connect
中找到。io.debezium.connector.jdbc.type.debezium
中找到。io.debezium.connector.jdbc.dialect
层次结构中找到。类型以分层模式注册,从 Kafka Connect 类型开始,然后是 Debezium 类型,最后是特定于方言的类型。这使得 Debezium 类型能够在需要时覆盖 Kafka Connect 类型,并最终使方言覆盖任何其他贡献的类型。
通过首先查看 Kafka 模式名称并将其映射到类型注册来解析类型。如果模式没有名称,则使用模式的类型解析为类型。如果没有检测到该字段的其他类型实现,这允许基本 Kafka Connect 类型对如何解释数据拥有最终决定权。
JDBC 接收器连接器使用两种命名策略:
TableNamingStrategy
ColumnNamingStrategy
JDBC 接收器连接器附带了两者的默认实现,可在io.debezium.connector.jdbc.naming
包中找到。这两种策略的默认行为如下:
.
与_
并使用配置的table.name.format
值来解析表的最终名称。因此,假设事件的主题名称为server.schema.table
且默认为table.name.format=dbo.${topic}
,则目标表将创建为dbo.server_schema_table
。可以通过在连接器配置中指定完全限定的类名引用来覆盖这两种策略。示例配置:
table.naming.strategy=io.debezium.connector.jdbc.naming.DefaultTableNamingStrategy
column.naming.strategy=io.debezium.connector.jdbc.naming.DefaultColumnNamingStrategy
JDBC 接收器连接器维护内存中关系模型,类似于 Debezium 源连接器。这些关系模型类可以在io.debezium.connector.jdbc.relational
包中找到。
为了使用 Debezium JDBC 接收器连接器代码库并在本地构建它,需要以下内容:
.mvnw
调用 Maven 命令的包装器)该测试套件很大程度上基于 TestContainer 的使用,并自动启动各种源数据库和接收器数据库。如果没有 Docker 兼容的环境,集成测试将无法运行。如果您没有 Docker 环境,可以使用-DskipITs
命令行参数跳过集成测试,如下所示:
$ ./mvnw clean verify -DskipITs
测试套件中共有三种类型:
默认情况下,所有单元测试都作为构建的一部分执行。默认情况下,仅对 MySQL、PostgreSQL 和 SQL Server 执行基于接收器的集成测试,而不会执行任何基于端到端矩阵的测试。
为了对 Oracle 和 DB2 执行基于接收器的集成测试,必须提供-Dtest.tags
参数以将这些测试包含在构建中。为此,请添加所有要执行的集成测试,如下所示,针对所有数据库:
$ ./mvnw clean install -Dtest.tags=it-mysql,it-postgresql,it-sqlserver,it-oracle,it-db2
为了对所有数据库运行所有基于接收器的集成测试,提供了一个快捷标签:
$ ./mvnw clean install -Dtest.tags=it
同样,为了启用特定的端到端测试,还可以为-Dtest.tags
参数提供每个接收器数据库类型所需的标签:
$ ./mvnw clean install -Dtest.tags=e2e-mysql,e2e-postgresql,e2e-sqlserver,e2e-oracle,e2e-db2
为了运行所有端到端集成测试,还提供了一个快捷标签:
$ ./mvnw clean install -Dtest.tags=e2e
为了对所有源/接收器组合运行所有测试:
$ ./mvnw clean install -Dtest.tags=all
Debezium 社区欢迎任何想要以任何方式提供帮助的人,无论是报告问题、帮助编写文档,还是贡献代码更改以修复错误、添加测试或实现新功能。有关详细信息,请参阅此文档。
非常感谢所有 Debezium JDBC 接收器贡献者!
该项目根据 Apache 许可证版本 2 获得许可。