我很高兴地宣布 Debezium 3 版本流的第二个维护版本,即 3.0.2.Final。此维护版本引入了许多功能,让我们花点时间深入了解亮点。
新功能和改进
Debezium 3.0.2.Final 引入了一些改进和新功能,让我们逐一了解。
核心
在 never snapshot 模式下执行阻塞快照
Debezium 的阻塞快照进程旨在根据提供的信号执行*初始*快照,选择性地发出一个或多个表的数据。当与*never* snapshot mode 结合使用时,这会导致意外行为。
在此版本中,我们修改了连接器偏移量以跟踪配置的 snapshot.mode,从而允许阻塞快照成功并在收到信号时执行*初始*快照,即使 snapshot.mode 配置为*never* 执行快照。这使用户能够安全地将此功能与此配置一起使用(DBZ-7903)。
| 由于连接器偏移量存储的更改,一旦连接器升级到 3.0.2.Final 或更高版本,连接器将无法降级到 3.0.1.Final 或更早版本。 |
MongoDB
RowsChanged JMX 指标类型更改
在之前的 MongoDB 连接器版本中,RowsChanged JMX 指标被暴露为 java.util.Map,这与关系连接器上暴露的相同 JMX 指标 TabularData 相矛盾。这在 3.0.2.Final 中已修复,JMX 指标在所有连接器实现中都使用 TabularData 以保持一致性(DBZ-8359)。
| 如果您之前曾捕获 |
Oracle
时间戳精度更高
Debezium for Oracle 传统上会以毫秒精度发出列时间戳值,该精度由挖掘会话连接上设置的 NLS 会话属性控制。精度得到改进,提供基于纳秒(即FF9)的值(DBZ-8379)。
| 发出的字段类型基于列的数据类型,因此发出的字段数据类型保持不变。发生变化的是,当列具有微秒或纳秒级别的值时,这些值以前为零,现在将具有非零值。 |
警告或跳过 DML 异常
event.processing.failure.handling.mode 可以配置为*fail*、*warn*或*skip*特定的连接器错误条件,以提高连接器对各种数据问题的可靠性。此配置历史上用于控制 Oracle 连接器在观察到 DDL 失败时的行为。
在此版本中,event.processing.failure.handling.mode 也用于控制 DML 事件的失败。如果 Oracle 连接器在解析您的*insert*、*update*或*delete*操作时出现问题,您可以根据需要安全地将连接器配置为*fail*、*warn*或*skip* DML 事件(DBZ-8208)。
| 默认行为是当连接器未能安全处理事件时始终*fail*。通过将其调整为*warn*或*skip*,虽然连接器将安全地跳过失败的事件,但您会引入数据丢失,需要手动解决。 |
Vitess
性能改进
在早期版本的 Debezium for Vitess 连接器中,连接器使用基于正则表达式的过滤系统,该系统根据具有不同后缀的前缀匹配所有表,然后根据配置应用排除。这有可能浪费 CPU 并创建热点,因为为稍后会被过滤和垃圾回收的事件创建了中间对象。
在此版本中,我们通过在事件处理链的早期应用过滤来改进 Vitess 连接器处理此用例的方式。这应该会减少创建的中间对象的数量,并提高连接器的整体性能。对于具有相同前缀和不同后缀的键空间,与旧版本相比,这应该能提供更好的整体性能(DBZ-8354)。
Sink 连接器
Debezium 0.x 引入了一个通用的源连接器框架,该框架已成为项目提供的源连接器的基础,包括我们社区驱动的连接器,如 Spanner、Vitess 等。随着最近引入 MongoDB sink 连接器,我们的长期目标是以类似的方式处理 sink 连接器,提供一个通用的 sink 连接器框架,以简化 Debezium sink 连接器的创建。
在 Debezium 3.x 的生命周期中,您将看到为简化 JDBC 和 MongoDB sink 连接器之间的源而采取的增量步骤。我们将尽量减少对维护版本的影响,正如您所期望的那样,但预计未来的主要和次要版本将引入弃用和更改以支持此项工作。
在这一轮更改中,我们引入了一个新的 Debezium 模块:debezium-sink。该模块充当所有 sink 连接器的基础,并包含各种常用类,包括 SinkConnectorConfig 类、命名策略实现以及 sink 记录的通用表示 DebeziumSinkRecord。
随着我们继续简化 MongoDB 和 JDBC sink 连接器,将添加额外的通用行为。
JDBC sink 连接器更改
由于 sink 模块使用*collection*而不是*table*的命名约定,因此已弃用并替换了几个配置属性。旧属性在 Debezium 3.0.x 版本中将继续有效;但将在 Debezium 3.1 中删除。
-
table.name.format属性被collection.name.format替换。 -
table.naming.strategy属性被collection.naming.strategy替换。
此外,table.naming.strategy 属性指定的 io.debezium.connector.jdbc.naming.TableNamingStrategy 的约定已弃用。已引入新的 io.debezium.sink.naming.CollectionNamingStrategy,其签名略有不同。
/**
* Resolves the logical table name from the sink record.
*
* @param config sink connector configuration, should not be {@code null}
* @param record Kafka sink record, should not be {@code null}
* @return the resolved logical table name; if {@code null} the record should not be processed
*/
String resolveTableName(JdbcSinkConnectorConfig config, SinkRecord record); /**
* Resolves the logical collection name from the Debezium sink record.
*
* @param record Debezium sink record, should not be {@code null}
* @param collectionNameFormat the format string for the collection name (mapped from the topic name)
* @return the resolved logical collection name; if {@code null} the record should not be processed
*/
String resolveCollectionName(DebeziumSinkRecord record, String collectionNameFormat); 主要区别包括新的 DebeziumSinkRecord,它取代了 SinkRecord,并显式传递 collection 命名格式,而不是配置类。
| 如果您在 Debezium JDBC sink 连接器的部署中实现了自定义 |
Debezium 操作员
启用 Debezium Server REST 端点
现在可以通过 Debezium Operator 在 Kubernetes 上使用 Debezium Server 部署自动启用 Debezium Server API RESTful 端点。在部署描述符的 spec 部分,您可以包含 runtime.api.enabled 属性来切换 API 端点(DBZ-8234),如下所示。
apiVersion: debezium.io/v1alpha1
kind: DebeziumServer
metadata:
name: my-debezium
spec:
image: quay.io/debezium/server:3.0.2.Final
quarkus:
config:
log.console.json: false
kubernetes-config.enabled: true
kubernetes-config.secrets: postgresql-credentials
runtime:
api:
enabled: true
sink:
type: kafka
config:
producer.bootstrap.servers: dbz-kafka-kafka-bootstrap:9092
producer.key.serializer: org.apache.kafka.common.serialization.StringSerializer
producer.value.serializer: org.apache.kafka.common.serialization.StringSerializer
source:
class: io.debezium.connector.postgresql.PostgresConnector
offset:
memory: { }
schemaHistory:
memory: { }
config:
database.hostname: postgresql
database.port: 5432
database.user: ${POSTGRES_USER}
database.password: ${POSTGRES_PASSWORD}
database.dbname: ${POSTGRES_DB}
topic.prefix: inventory
schema.include.list: inventory 默认情况下,Debezium Server API 端点是禁用的,但可以通过将 spec.runtime.api.enabled 设置为 true 来启用,如上所示。
其他修复
以下是一些值得注意的更改
-
明确信号数据收集每个连接器应唯一 DBZ-6837
-
stop-snapshot 信号中的竞态条件 DBZ-8303
-
Debezium 尽管有 RabbitMQ 超时和未确认消息,仍移动 binlog 偏移量 DBZ-8307
-
在 Debezium sink 连接器内部使用 DebeziumSinkRecord 而不是 Kafka Connect 的 SinkRecord DBZ-8346
-
在 DS 中实现新的 config map 偏移量存储 DBZ-8351
-
Debezium 服务器使用 eventhubs sink 类型和 eventhubs emulator 连接字符串时失败 DBZ-8357
-
使用信号进行快照的过滤器似乎不起作用 DBZ-8358
-
JDBC 存储模块不使用 quay.io 镜像 DBZ-8362
-
偏移量存储调用 configure/start 失败被记录为 DEBUG 级别 DBZ-8364
-
S3 schema history 字段列表中缺少对象名称 DBZ-8366
-
错误的“无法加载强制配置”错误消息 DBZ-8367
-
升级 protobuf 依赖项以避免潜在漏洞 DBZ-8371
-
将转换页面添加到提供一个地方列出已配置的转换以及添加新转换的 UI DBZ-8374
-
升级 Kafka 到 3.8.1 DBZ-8385
-
IncrementalSnapshotIT 中的测试可能随机失败 DBZ-8386
-
添加转换编辑和删除支持。 DBZ-8388
-
如果最近发生了一个检查点,Log SCN 存在性检查可能会抛出 ORA-01291 DBZ-8389
-
ExtractNewRecordState 转换:处理非信封记录时出现 NPE DBZ-8393
-
Oracle LogMiner 指标 OldestScnAgeInMilliseconds 可能为负值 DBZ-8395
-
SqlServerConnectorIT.restartInTheMiddleOfTxAfterCompletedTx 随机失败 DBZ-8396
-
ExtractNewDocumentStateTestIT 随机失败 DBZ-8397
-
BlockingSnapshotIT 在 Oracle 上失败 DBZ-8398
-
Oracle OBJECT_ID 查询和混合挖掘模式下的高 CPU 和延迟 DBZ-8399
-
升级 Kafka 到 3.9.0 DBZ-8400
-
Protobuf 插件在 Debian 上无法为 PostgreSQL 17 编译 DBZ-8403
-
将 Quarkus Outbox Extension 升级到 Quarkus 3.16.3 DBZ-8409
非常感谢社区所有为此次发布辛勤付出的贡献者:Anisha Mohanty, dario, Chris Cranford, Enzo Cappa, Jakub Cechacek, Jiri Pechanec, Kavya Ramaiah, Lars M. Johansson, Mario Fiore Vitale, Martin Vlk, P. Aum, René Kerner, Stanislav Deviatov, Stefan Miklosovic, Thomas Thornton, Vojtech Juranek,以及 Yevhenii Lopatenko!
关于 Debezium
Debezium 是一个开源的分布式平台,可以将现有数据库转变为事件流,使应用程序能够几乎即时地看到并响应数据库中已提交的每个行级更改。Debezium 构建在 Kafka 之上,并提供了 Kafka Connect 兼容的连接器,用于监控特定的数据库管理系统。Debezium 将数据更改的历史记录在 Kafka 日志中,这样您的应用程序可以随时停止和重新启动,并可以轻松地消费在未运行时错过的所有事件,确保所有事件都被正确且完整地处理。Debezium 在 Apache 许可证 2.0 下是 开源 的。