我们很高兴地宣布 Debezium 3.1 的候选版本,即 3.1.0.CR1

此新版本包括对 JDBC sink 和 MySQL 连接器的多项改进,对 Vitess 的 ISO 字符串时间值和 Keyspace 心跳的支持,对 RabbitMQ 的基于密钥的路由,以及更多。让我们深入了解这些新功能和改进。

重大变更

任何新软件的发布,通常都会伴随一些破坏性更改。Debezium 3.1.0.CR1 版本也不例外,因此我们来讨论一下您应该了解的主要更改。

Oracle LogMiner 查询现在应用查询超时

当 Oracle 连接器执行其初始查询以从 LogMiner 获取数据时,database.query.timeout.ms 连接器配置属性将控制查询的持续时间,之后查询将被取消 (DBZ-8830)。升级时,请检查连接器指标 MaxDurationOfFetchQueryInMilliseconds 以确定此新属性是否可能需要调整。默认超时时间为 10 分钟,但设置为 0 时可禁用。

新功能和改进

升级到 Debezium 3.1.0.CR1 在多个组件中引入了几项新功能和改进

核心:集中记录敏感数据

我们深知数据库包含各种信息,其中一些列可能包含敏感信息。我们很自豪能够确保信息安全可靠。因此,我们通常倾向于避免在 INFO、WARN 或 ERROR 级别记录敏感信息。

然而,在某些潜在的极端情况下,敏感列的值可能会在 DEBUG 或 TRACE 级别被记录。我们在几年前添加了 io.debezium.util.Loggings 类来集中处理此事,但并非所有实例都使用了该 Loggings 类 (DBZ-8525)。

默认情况下,用户会注意到 Loggings 类将敏感信息记录在日志中,而不是包含在原始日志条目中的记录器中。如果您希望省略敏感信息,可以使用日志配置为 io.debezium.util.Loggings 设置一个特定的日志级别。

例如,如果您需要向他人提供日志,但又想省略敏感信息,则以下配置可以实现该目标。

log4j.logger.io.debezium=TRACE,stdout
log4j.logger.io.debezium.util.Loggings=ERROR,stdout

此配置将省略所有敏感信息,同时在 TRACE 级别记录所有非敏感信息。

JDBC:性能改进

我们收到了社区的一些报告,称在高峰期,一些数据库出现了异常高的 CPU 利用率。经过调查,我们发现一些 SQL 查询执行过于频繁,导致 CPU 占用过高,并降低了连接器的写入吞吐量 (DBZ-8570)。现在,用户应该会发现 JDBC sink 的写入吞吐量更高,CPU 利用率也比之前更合理。

JDBC:连接错误时自动重试

对于 Kafka Connect producer,如果连接器抛出 RetriableException,并且 Kafka Connect 配置为支持错误重试,那么运行时将自动停止并重启连接器。这提供了一种处理资源销毁和重新创建(如数据库连接)的有用方法。

但对于 Kafka Connect consumer (sink),连接器的生命周期工作方式不同。当连接器抛出错误时,生命周期不会停止和重启连接器,而是再次调用 put 方法。在某些连接错误的情况下,这可能会出现问题,因为某些资源不会自动重新创建。

从 Debezium 3.1 开始,新的 JDBC sink 连接器属性 connection.restart.on.errors 将允许 JDBC sink 重试连接失败 (DBZ-8727)。

JDBC:处理 BYTES 作为 VARBINARY(针对 SQL Server 目标)

新增了一个 JDBC sink 映射,用于将 Kafka BYTES 字段转换为 VARBINARY 列数据类型 (DBZ-8790)。这允许源连接器将未知或其他二进制数据序列化为 Kafka BYTES 字段,并正确映射到具有 VARBINARY 列数据类型的 SQL Server 目标。

MySQL:对重复的服务器 ID/UUID 改进了错误处理

对于大多数连接器,Debezium 遵循对所有 SQLExceptionIOException 相关失败进行重试的理念。这种策略非常有用,允许用户根据需要利用运行时重试机制。

然而,对于 MySQL,这会产生一个独特的极端情况,即在配置的服务器 ID/UUID 出现冲突时。MySQL 使用服务器 ID/UUID 在集群拓扑中唯一标识一个实例。如果多个服务器使用相同的 ID/UUID,该实例将抛出 SQLException 并在启动时进入重试/回退循环。

在 Debezium 3.1 中,对于这个特定的独特情况,错误处理倾向于采用快速失败的策略 (DBZ-8786)。如果您是 MySQL 用户,并且发现您的连接器更频繁地进入 FAILED 状态,我们建议您检查是否适用此用例。如果适用,您应该确保您的配置始终使用唯一的服务器 ID/UUID 值。

Vitess:Keyspace 心跳支持

从 Vitess v21 开始,为 VStream 引入了一种新的 binlog 水印策略。这项新功能会发送一个“心跳”类事件,表示 VStream 客户端已收到截至提供时间戳的 shard binlog 事件。

可以通过将新的配置选项 vitess.stream.keyspace.heartbeats 设置为 true 来包含写入 keyspace 心跳表的这些心跳事件 (DBZ-8775)。table.include.list 也应该包含心跳表,格式为 <keyspace>.heartbeat

Vitess:支持 ISO 字符串模式的时间精度模式

我们在 DBZ-6387 中引入了新的时间精度模式 IOSTRING,它允许将时间值序列化为 ISO8601 格式的字符串。我们很高兴地报告 Vitess 连接器支持这种新模式 (DBZ-8826)。

Debezium Server:RabbitMQ 的键路由支持

在 Debezium 3.1 中,我们改变了通过配置路由事件的方式。这种新方法采用了基于策略的设计,保留了旧的行为并引入了新的基于键的路由机制 (DBZ-8752)。

首先,rabbitmq.routingKeyFromTopicName 已弃用,将在未来版本中删除。此功能已合并到新的 rabbitmq.routingKey.source 配置属性中,可以设置为以下值之一

static

当使用静态路由源时,RabbitMQ Sink 将使用您在 Sink 配置中指定的 rabbitmq.routingKey 静态值。由于此值在配置中设置,并且仅在 Sink 启动期间读取,因此该值是静态的,在 Sink 运行时不会改变。

topic

当使用主题路由源时,RabbitMQ Sink 将根据目标主题名称源化路由键。此模式取代了旧的 rabbitmq.routingKeyFromTopicName 配置属性行为,该属性现已弃用。

key

当使用新的路由源时,RabbitMQ Sink 将根据事件的记录键源化路由键。这提供了灵活性,可以通过使用自定义转换在将事件发送到 RabbitMQ 之前更改事件键,来控制 RabbitMQ 的路由机制,使用原始 Debezium 更改事件的键。

示例:为 GraalVM 优化的 Debezium

Change Data Capture (CDC) 在各种场景中得到广泛应用,例如微服务通信、遗留系统现代化和缓存失效。此模式的核心思想是检测和跟踪数据源(例如数据库)中的更改,并近乎实时地将它们传播到其他系统。Debezium 是一个 CDC 平台,为大多数数据源提供了广泛的连接器。除了捕获更改外,它还通过直观的 UI 提供转换功能,用于定义 Debezium 实例。

查看我们最近的博客 Superfast Debezium,其中介绍了使用 Debezium 和 GraalVM 的最新示例!

其他更改

以下是 3.1.0.CR1 中一些值得注意的更改

  • 使用 debezium 引擎捕获 oracle 数据时,第一个 cdc 消息总是丢失 DBZ-8141

  • 将 format-maven-plugin 更新到 2.26.0 DBZ-8695

  • 集中 helm chart 仓库 DBZ-8707

  • OTEL 库未加载到 Docker 镜像 DBZ-8767

  • 将最低 Java 版本要求从 11 更改为 21 DBZ-8771

  • 将 delete.tombstone.handling.mode 添加到 config 方法返回的 ConfigDef 中,并更改其显示名称 DBZ-8776

  • Signal Channel Kafka 重新启动后,多个快照在连接器重新启动后丢失 DBZ-8780

  • 在 values.yaml 中更新 Debezium 平台镜像 DBZ-8781

  • 允许 Debezium 服务器使用 Kafka Connect 格式的记录 DBZ-8782

  • Debezium 平台 helm chart 中的 Sources 和 home 指向旧仓库 DBZ-8784

  • 为 debezium-chart 仓库编写 README DBZ-8785

  • 从 Debezium operator manifest README 中移除 Helm DBZ-8791

  • 撰写关于 charts.debezium.io 最近变化的博客文章 DBZ-8792

  • DebeziumServerPostgresIT 随机失败 DBZ-8821

  • 测试快照期间的 keyspace 心跳 DBZ-8824

  • 使向记录添加字段的方法可重用 DBZ-8825

  • 启用 Debezium 平台镜像的构建 DBZ-8829

  • 配置弃用别名的 Field Configuration 意外出现 null 值 DBZ-8832

总共有 30 个问题 在 Debezium 3.1.0.CR1 中得到解决。更改列表也可以在我们的 发布说明 中找到。

Chris Cranford

Chris 是 IBM 的一名软件工程师,之前在 Red Hat 工作,他致力于 Debezium 项目,并每天都在深入研究 Oracle 和 Change Data Capture 的各个方面。他此前曾从事 Hibernate(领先的开源 JPA 持久化框架)方面的工作,并且继续为 Quarkus 做贡献。Chris 居住在美国北卡罗来纳州。

   


关于 Debezium

Debezium 是一个开源的分布式平台,可以将现有数据库转变为事件流,使应用程序能够几乎即时地看到并响应数据库中已提交的每个行级更改。Debezium 构建在 Kafka 之上,并提供了 Kafka Connect 兼容的连接器,用于监控特定的数据库管理系统。Debezium 将数据更改的历史记录在 Kafka 日志中,这样您的应用程序可以随时停止和重新启动,并可以轻松地消费在未运行时错过的所有事件,确保所有事件都被正确且完整地处理。Debezium 在 Apache 许可证 2.0 下是 开源 的。

参与进来

我们希望您觉得 Debezium 有趣且有用,并希望尝试一下。在 Twitter @debezium 上关注我们,在 Zulip 上与我们聊天,或加入我们的 邮件列表 与社区交流。所有代码都在 GitHub 上开源,因此请在本地构建代码,帮助我们改进现有连接器并添加更多连接器。如果您发现问题或有改进 Debezium 的想法,请告诉我们或 记录一个问题

版权所有 © Debezium 及其作者。保留所有权利。有关我们的商标详情,请访问我们的 商标政策商标列表。第三方商标属于其各自所有者,在此提及并不表示任何认可或关联。
×