在准备本季度的发布期间,Debezium 团队在这个季度非常忙碌,我们很高兴地宣布 Debezium 3.2.0.Final 现已可用。此版本包含大量新功能,包括与 OpenLineage 的集成、新的 Quarkus DevService/GraalVM 扩展、Qdrant 向量数据库 sink 支持、对 Debezium Platform 和 AI 的改进,以及更多内容!

在本篇博文中,我们将深入探讨 Debezium 3.2 中的所有变更,讨论新功能,并解释所有可能影响您升级过程的更改。一如既往,我们建议您阅读发行说明,了解已修复的所有 bug、更新流程等。

重大变更

任何新软件版本都会出现一些重大变更。此版本也不例外,因此在升级到 Debezium 3.2.0.Final 之前,让我们先讨论一下您应该了解的主要变更。

Debezium Core

Debezium AI

Debezium for MySQL

Debezium for Oracle

Debezium for IBMi

Debezium Core

Kafka 4.0 支持

Debezium 现在使用 Apache Kafka 4.0 构建和测试(DBZ-8875)。由于 Kafka 在 3.5 和 4.0 之间引入了多项 API 更改,我们强烈建议用户检查 Debezium 的 Kafka 兼容性支持矩阵。

Snapshot 部署已迁移

Debezium 已从 RHOSS Sonatype 基础架构迁移到 Maven Central(DBZ-9025)。为了确保您获取最新的 snapshot 构建,请使用我们夜间文档页面上的更新链接,该页面位于此处。请注意,由于当前的 API 限制,这些链接每天只更新一次,尽管我们全天向 Maven Central 推送多个 snapshot 构建。

已移除 ExtractNewRecordState 弃用的配置选项

Debezium 在 Debezium 2.5 中引入了 `delete.tombstone.handling.mode` 配置选项,作为 DBZ-6907 的一部分,并将 `drop.tombstones` 和 `delete.handling.mode` 标记为弃用。我们认为已经有足够的时间移除旧的配置选项,因此 Debezium 3.2 不再使用 `drop.tombstones` 或 `delete.handling.mode`。如果您的连接器配置继续使用这些弃用的选项,请将您的配置调整为使用 `delete.tombstone.handling.mode`(DBZ-6068)。

Schema history 不再存储某些 DDL 语句

某些 DDL 事件,如 `TRUNCATE` 和 `REPLACE`,曾存储在 Debezium 的内部 schema history topic 中。Debezium 不需要这些类型的语句来表示 schema 演进,并且在未来将不再捕获到内部 schema history topic 中(DBZ-9085)。

Debezium AI

FieldToEmbedding 转换的配置选项已更改

Debezium AI 模块中可用的新 `FieldToEmbedding` 转换使用了配置选项名称中的前缀字符串。此前缀是多余的,因此我们决定移除该前缀(DBZ-9056)。

Debezium for MySQL

改进了丢失日志位置验证

当 Debezium MySQL 连接器配置为除 `when_needed` 之外的任何 `snapshot.mode` 且二进制日志位置不可用时,连接器会记录一个警告,表明连接器将从日志中最后可用的位置恢复。然而,当连接器进入流式处理阶段时,它会立即失败,报告找不到二进制日志位置。我们改进了此行为,使其在验证阶段就抛出错误,从而与其他连接器的行为保持一致(DBZ-9118)。

Debezium for Oracle

使用 JKS 进行 TLS

Debezium for Oracle 连接器不仅支持与 Oracle Wallet 的 TLS 连接,您还可以使用 JKS。要使用 JKS,需要特殊的连接器配置,以便为 Oracle JDBC 驱动提供正确的信息。现在已为社区正确记录了这一点(DBZ-8075)。

Debezium for IBMi

默认不再使用 Avro schema 命名

Debezium IBMi 连接器曾明确编码使用 Avro schema 命名调整器(DBZ-9183)。现在不再是这样,该选项现在是可配置的,并且与其他连接器的行为相同。

日志文件数据丢失

在 Debezium for IBMi 的先前版本中,如果连接器所需的日志文件不可用,它将从下一个可用文件继续读取。这可能导致潜在的静默数据丢失。行为已更改,连接器将像其他连接器一样,在必需的日志文件不存在时报告错误(DBZ-8898)。

新功能和改进

以下描述了 Debezium 3.2.0.Final 中所有值得注意的新功能和改进。有关完整列表,请务必阅读发行说明以获取更多详细信息。

Debezium Core

Debezium for PostgreSQL

Debezium for Oracle

Debezium JDBC Sink

Debezium for Informix

Debezium for IBMi

Debezium for Vitess

Debezium Embedded

Debezium 服务器

Debezium 平台

Debezium AI

Debezium OpenLineage

Debezium Quarkus Extension

Debezium Core

Schema history 恢复的协调器线程已移至

在 Debezium 的先前版本中,schema history 恢复是在连接器的主要启动线程中执行的。当 schema history 非常大时,此恢复可能需要一段时间才能完成。

对于 Kafka Connect 等环境,这可能导致 Kafka Connect 错误地表示连接器的当前状态。例如,如果连接器先前失败并正在重新启动,Kafka Connect 将继续报告连接器处于 `FAILED` 状态,尽管连接器已启动并运行,但目前正在恢复 schema history topic。这个细微但重要的细节如果没有查看连接器日志将很难分离。

为了解决这个问题,Debezium 会将 schema history topic 的恢复延迟到 Debezium 协调器线程启动时。这使得 Kafka Connect 运行时能够更快地返回并更新运行时的连接器状态,以准确表示连接器的状态,而不会受到长时间 schema history 恢复的影响(DBZ-8562)。

Kafka schema history 恢复性能改进

一位社区成员在 Kafka schema history 实现中发现了一个性能优化机会。在恢复过程中,一些步骤被执行的频率高于必要,导致 CPU 利用率升高。为了优化这一点,其中一些步骤只在每次 schema history 恢复时调用一次。这减少了 CPU 利用率以及在 schema history 恢复过程中与 Kafka Broker 的网络通信(DBZ-9098)。

Snapshot skipped 指标

在之前的版本中,Debezium 会将 `SnapshotCompleted` 指标设置为表示快照已完成,即使在快照因配置或偏移量可用而被跳过的情况下。这对于一些用户来说具有误导性,因此引入了一个新的 `SnapshotSkipped` 指标,以澄清何时执行并完成快照,以及何时因不需要而跳过快照(DBZ-8610)。

ExtractNewRecordState 现在可以将删除转换为 Tombstone

如果配置得当,Debezium 会在删除后立即将 tombstone 事件注入变更事件流。然而,如果连接器重新启动,并且只有删除事件被写入 Kafka topic,连接器在重新启动时不会重新发出 tombstone,因为 tombstone 是合成的。

从 Kafka Broker 的角度来看,这不会产生任何功能影响。然而,对于依赖 tombstone 存在以实现特定行为的消费者来说,这可能会有问题。

由于消费者通常依赖扁平化的事件结构而不是 Debezium 的分层事件 payload,`ExtractNewRecordState` 转换包含了一个新的 `delete.tombstone.handling.mode` 配置属性选项,名为 `delete-to-tombstone`。此选项强制转换将删除事件转换为 tombstone。这允许您禁用 tombstone 并使用转换将删除转换为 tombstone,确保 topic 中有一个 tombstone 用于压缩,更重要的是,以便消费者可以执行其依赖 tombstone 的行为(DBZ-9022)。

日志记录性能回归

在 Debezium 3.1 中,我们引入了一项变更,用于集中记录敏感信息。不幸的是,此变更导致了性能回归,导致多种代码路径的性能下降。

此变更已被撤销,并替换为一项新的实现,该实现保留了集中式日志记录的意图,同时恢复了之前的性能(DBZ-8879)。

通过 JMX 重置某些流指标

在空闲活动期间,Debezium 连接器将继续报告 LagBehindSource JMX 指标作为最后计算的值,因为该值仅在新更改收到时更新。对于某些环境而言,如果不了解空闲或低活动窗口,这会不太理想或不直观。

Debezium 3.2 引入了一个可以通过 JConsole 或其他 JMX 集成触发的新选项,通过调用新的 `resetLagBehindSource` 函数来重置当前的 `LagBehindSource` 指标(DBZ-8885)。

JMX MBean 注册失败时记录日志

当 JMX 指标 MBean 注册失败时,大多数情况下是因为已经有一个 MBean 以该名称注册。这可能由于多种原因发生,包括先前的任务未能优雅停止,或两个共享相同 `topic.prefix` 的连接器之间的配置错误。

不幸的是,日志消息没有提供足够的信息来知道是哪个 MBean 和连接器出现了故障。为了解决这个问题,将在 MBean 注册失败时记录 JMX MBean 名称,以便更容易确定受影响的确切连接器部署(DBZ-8862)。

Debezium for PostgreSQL

通过配置控制分区表发布

对于 PostgreSQL 用户,在捕获分区表的更改时,更改是使用分区名称而不是基本表发布的。如果您想将跨分区的更改重新组合到一个主题中,这通常需要使用 `ByLogicalTableRouter` 将所有分区的事件路由到一个主题,或者在数据库层面手动调整发布。

Debezium 3.2 旨在通过新的 `publish.via.partition.root` 属性来简化这个问题。默认情况下,此选项为 `false`,表示除非手动调整发布,否则事件主题将使用分区名称而不是基本表。但是,您可以将此属性设置为 `true`,Debezium 将确保使用 `publish_via_partition_root` 功能创建发布,以便来自各个分区表的事件将使用单个基本表名发布(DBZ-9158)。

避免在只读模式下执行写入操作

在使用 Debezium for PostgreSQL 连接器并配置为只读模式时,发现了一个回归问题。不幸的是,连接器会尝试 CREATE 或 ALTER 连接器的发布,即使它被配置为只读模式,导致 SQL 异常。我们已经纠正了此行为,Debezium 在只读模式下运行时将不再尝试创建或修改发布(DBZ-8743)。

Debezium for Oracle

使用已提交数据的非缓冲 LogMiner 适配器

Debezium for Oracle 引入了一个新的适配器实现,该适配器使用数据库的内存缓冲区在关系数据库上缓冲事务,而不是依赖 JVM 堆或堆外缓存实现(DBZ-8924)。

要开始使用新适配器,需要调整连接器配置,如下所示:

{
  "database.connection.adapter": "logminer_unbuffered"
}

虽然此新适配器支持大部分 `log.mining.*` 连接器配置,但任何与缓冲区、缓存或事务管理相关的配置均不使用。

这个新的适配器实现基于 Oracle LogMiner 的 `COMMITTED_DATA_ONLY` 模式。此模式强制 Oracle LogMiner 使用数据库可用内存来缓冲事务,并且仅向 Debezium 提供已提交的更改。由于 Debezium 只接收已提交的更改,因此连接器可以在读取它们时立即分派更改,这避免了复杂的内存大小调整要求以及处理因保存点或约束违规而导致的局部回滚的需要。

由于 Oracle LogMiner 现在负责缓冲事务直到观察到提交,Oracle LogMiner 将依赖数据库的内存来处理此阶段性要求。这直接意味着此阶段性要求仅与 `PGA_AGGREGATE_LIMIT` 数据库管理员配置的 Oracle 数据库实例参数一样强大。当事务的内存需求超过此限制时,Oracle 将拒绝缓冲事务并抛出连接器错误。这可以通过提高配置的限制、完全删除限制或调整事务大小以使其符合此 Oracle 限制的边界来解决。

此功能目前处于孵化状态,即确切的语义、配置选项等可能在未来的修订版中发生变化,具体取决于我们收到的反馈。在使用此扩展时,如果您遇到任何问题,请告知我们。

通过客户端 ID 过滤 Oracle LogMiner 结果

Oracle LogMiner 适配器提供了多种方法来排除事务,通过显式将过滤器传递给数据库查询,以排除或仅包含特定数据库用户执行的事务。在此版本中,我们添加了一个基于 Oracle LogMiner 字段 `CLIENT_ID` 的额外有趣过滤器条件,您可以通过此字段的值选择包含或排除更改(DBZ-8904)。

可以使用以下配置属性

log.mining.clientid.include.list

指定一个逗号分隔的列表,用于与 `CLIENT_ID` 字段匹配以进行捕获。

log.mining.clientid.exclude.list

指定一个逗号分隔的列表,用于与 `CLIENT_ID` 字段匹配以排除捕获。

与其他包含/排除配置属性一样,这些属性是互斥的。

在特定场景下降低了 CPU 利用率

在 Debezium 3.1 中,我们根据DBZ-8665引入了一项变更,旨在恢复 Debezium 2.7.0.Final 处理约束冲突或回滚保存点操作时的性能。虽然此变更成功降低了 Debezium 3.0 至 3.0.7 处理此类事件引起的延迟,但我们发现即使是 Debezium 2.7 的性能也总体不尽如人意。

我们已实现对事务缓冲解决方案的全面重构,以更有效地处理约束冲突和回滚保存点(DBZ-8860)。

在使用基于堆的缓冲时,我们将处理此类事件所需的时间缩短了近 90%,同时将堆外缓冲的时间复杂度降低了 97-99%。除了降低时间复杂度外,我们在处理这些事件时还降低了整体 CPU 使用率,以符合预期。

提高了 online_catalog 挖掘策略的性能

在添加 hybrid 挖掘策略之前,Debezium Oracle LogMiner 实现包含一个特定条件,用于包含 LogMiner 无法解析表名的表的事件。这种情况发生在对象 ID 和重做条目中的版本与在线数据字典不匹配时,这在执行特定 DDL 操作后会发生。

包含这些更改,特别是当用户执行批量操作且 LogMiner 无法解析表名时,会增加延迟、连接器开销,仅用于连接器记录未知表。鉴于仅仅为了记录而导致的性能下降,我们选择在后续的数据获取中省略包含这些事件(DBZ-8926)。

提高了 hybrid 挖掘策略的性能

我们还发现了另一个性能瓶颈,这次是在使用 hybrid 挖掘策略处理批量事件时,LogMiner 在对象 ID/版本不匹配时无法解析表名。hybrid 策略旨在处理这种情况并回退到 Debezium 的关系模型来解析表名;然而,尽管使用了缓存,但对于批量操作的缓存查找的成本开销却非常高。

为了降低成本并提高未知表上批量操作的吞吐量性能,我们对查找进行了重构,从而显著提高了吞吐量,使得批量操作能够更高效地处理,并降低了整体 CPU 利用率(DBZ-8925)。

改进了在应用部分回滚时出错的日志消息

当使用 Debezium for Oracle LogMiner 缓冲适配器时,当观察到部分回滚时,日志条目不包含对调试有用的关键信息。Debezium 3.2 现在包含了与部分回滚重做条目关联的事务标识符和系统更改编号(DBZ-8944)。

用户名有时显示为未知

当一个事务在两个或多个日志挖掘步骤中被挖掘时,第一个步骤之后的任何事件都返回 `UNKNOWN` 用户名。这有可能导致配置的用户排除未正确应用,并且错误地发出了事件。

在 Debezium 3.2 中,我们改进了此工作方式,以便即使事务在多个步骤中被挖掘,也能正确收集用户名属性。此改进避免了将事务分派到您的 Kafka topic,但目前事务将继续被缓冲(DBZ-8884)。

Debezium JDBC Sink

列/表命名策略可用配置

Debezium JDBC sink 提供多种可配置的钩子,包括定义特定部署的 `TableNamingStrategy` 或 `ColumnNamingStrategy` 实现的选项。然而,这些实现无法获取连接器部署的完整配置,这使得这些钩子比预期的限制性要小。

在 Debezium 3.2 中,这些策略实现提供了一个新的 `configure` 方法(DBZ-7051),如下所示:

@Override
public void configure(Map<String, Object> config) {
}

为了向后兼容,此方法被定义为默认且无实现,因此在不需要此配置步骤的地方不需要进行代码更改。

避免缩减缓冲区执行强制刷新

Debezium JDBC sink 连接器可以使用以下两种缓冲算法之一。

默认情况下,源中的每次更改都会在目标系统中产生一个匹配的 SQL 更改。此算法依赖于为每个目标表维护两个存储桶,并根据该 topic 中观察到的事件序列定期刷新这些存储桶。

第二种算法称为缩减缓冲区,其中分析和缩减批次中的所有事件,以便连接器在整个批次中执行最少数量的 SQL 操作。例如,如果在一个批次中,对同一表有一个插入、一个更新和一个删除,缩减缓冲区算法会计算对于该事件的主键不需要任何写入。

根本问题在于,尽管缩减缓冲区应该只在批次结束时刷新,但刷新是按照连接器使用默认算法操作的方式进行的,这会导致性能不佳。使用前面的示例,回归导致缩减缓冲区执行 2 个 SQL 操作而不是 0 个 SQL 操作。

这已在 Debezium 3.2 中修复,缩减缓冲区现在的性能会显著提高(DBZ-8982)。

Debezium for Informix

心跳操作查询支持

`heartbeat.action.query` 配置选项是许多 Debezium 连接器中广泛使用的功能。当非捕获表上出现高活动场景时,通常会使用此选项,它保证在捕获表中有一个定期事件,以防止偏移量过时。从 Debezium 3.2 开始,Debezium for Informix 连接器现在支持此配置选项(DBZ-9081)。

Debezium for IBMi

添加对 BOOLEAN 数据类型的支持

IBM 为 IBM iSeries 数据库的 V7R5+ 和更高版本的 V7R4 版本提供对 `BOOLEAN` 数据类型的支持。在先前版本中,如果表包含布尔数据类型,这将导致 Debezium for IBMi 连接器硬失败。

在 Debezium 3.2 中,现在可以在不抛出异常的情况下捕获 `BOOLEAN` 数据类型(DBZ-7796)。

添加 decimal 处理模式支持

`decimal.handling.mode` 配置属性指定连接器如何处理连接器特定数据类型的浮点值。在 Debezium for IBMi 连接器的先前版本中,此配置属性未被遵循。

Debezium 3.2 引入了对 `decimal.handling.mode` 的支持,允许您指定浮点值是否被序列化(DBZ-8301)。此配置属性可以配置为以下三个值之一:

precise

使用 java.math.BigDecimal 值精确表示,这些值在更改事件中以二进制形式表示。

double

使用 double 值表示。使用 double 值更简单,但可能导致精度损失。

string

将值编码为格式化的字符串。使用 `string` 选项更易于消费,但会导致原始类型语义信息的丢失。

Debezium for Vitess

自定义负载均衡连接策略

新的配置属性 `vitess.grpc.default.load.balancing.policy` 使连接器能够控制其连接的负载均衡方式。例如,可以将该属性设置为 `pick_first`(默认值)或 `round_robin`(DBZ-9014)。

Debezium Embedded

添加了新的轮询开始/结束回调

`DebeziumEngine` 接口提供各种功能,包括知道连接器或任务何时启动或停止。然而,由于连接器是异步操作的,因此了解连接器何时进入轮询阶段以执行特定用户驱动的逻辑可能很有用。

为了解决这个问题,在 `ConnectorCallback` 合约中添加了两个新方法(DBZ-8948

/**
 * Called after all the tasks have been successfully started and engine has moved to polling phase, but before actual polling is started.
 */
default void pollingStarted() {
    // nothing by default
}

/**
 * Called after all the tasks have successfully exited from the polling loop, i.e. the callback is not called when any of the tasks has thrown
 * exception during polling or was interrupted abruptly.
 */
default void pollingStopped() {
    // nothing by default
}

现在,在设置 `DebeziumEngine` 实例时,`ConnectorCallback` 提供的实现可以根据需要包含在这些生命周期状态变化期间调用的逻辑。

Debezium 服务器

Milvus 允许 JSON 数据类型展开

Debezium 源连接器旨在将 JSON 数据类型值作为 `io.debezium.data.Json` 语义类型发出,该类型将 JSON 值编码为字符串。然而,当使用 Debezium Server 将更改 sink 到 Milvus 时,这可能不总是期望的结果。

已添加了一个新的配置属性 `debezium.sink.milvus.unwind.json`,它可以设置为 `true` 或 `false`(默认值)。当此属性设置为 `true` 时,JSON 字符串值将表示为 `JsonObject`(DBZ-8909)。

Redis 可跳过心跳消息

Debezium 源连接器通常配置有心跳事件,以便在低活动期间的任何时候,源的偏移量信息都不会过时。然而,对于像 Redis 这样的某些 sink,将这些心跳事件传递给 sink 目标是无用的。

已添加了一个新的配置属性 `debezium.sink.redis.skip.heartbeat.messages`,它可以设置为 `true` 或 `false`(默认值)。当此属性设置为 `true` 时,Redis sink 将跳过向 Redis 目标发送心跳事件;但是,心跳事件将继续影响陈旧偏移量的管理(DBZ-8911)。

新的 Qdrant sink 适配器

Qdrant 是一个开源的、高性能、低延迟的向量数据库,旨在高效地存储和搜索高维向量。它也与来自 OpenAI、Hugging Face 或 sentence-transformers 等模型的嵌入很好地配合。Qdrant 的一些用例包括但不限于聊天机器人、文档搜索、图像/视频相似度等。

在 Debezium 3.2 中,我们为 Debezium Server 引入了一个新的 sink 适配器,允许您消费更改并将其放入 Qdrant。要开始使用 Qdrant sink,请在应用程序属性中按如下方式配置 Qdrant:

debezium.sink.type=qdrant

您可能需要大量的可选配置。请参阅在线文档以获取更多详细信息。

Azure Event Hubs 的动态消息键

为了使用 Azure Event Hubs 进行压缩 topics,消息键对于保持 topic 大小合理并方便重新播放 topic 消息至关重要。Debezium 3.2 使 Azure Event Hubs sink 的行为与 Kinesis 等其他 sink 保持一致,后者基于记录的键选择分区(DBZ-9195)。

NATS Jetstream sink 支持 header

当变更事件在转换链中被修改时,转换可能会选择向事件添加 header。不幸的是,在 Debezium 的先前版本中,这些 header 没有被复制到 NATS Jetstream。

从 Debezium 3.2 开始,在转换链期间添加到事件的所有 header 现已复制到 NATS Jetstream。无需配置或更改,只需更新到 Debezium 3.2.0.Final 即可自动完成(DBZ-9171)。

PubSub sink 最大缓冲区大小减小

当 PubSub sink 消费大量更改时,PubSub sink 在发送批次数据时可能超出最大允许的 10MB 批次阈值,导致交付问题。为了解决这个问题并简化用户体验,`batch.request.byte.threshold` 已减小到 9.5mb。这与其他与 Google PubSub 交互的连接器保持一致,以保证批次交付而不超出最大阈值(DBZ-9144)。

为 Redis sink 启用主机名验证

使用 Redis sink 时,您可能希望 sink 在 SSL 连接过程中验证主机名。这可以通过在 sink 配置中提供 `ssl.hostnae.verification.enabled` 选项来实现,以便执行主机验证。当使用 Redis offset 和 schema history 实现时,此选项也可用(DBZ-9042)。

Redis sink 的自定义密钥库/信任库

Debezium 3.2 引入了几个新的配置选项,允许为 Redis sink 使用自定义密钥/信任库详细信息(DBZ-9082)。以下显示了这些新选项的示例:

debezium.sink.redis.ssl.truststore.path=/path/to/truststore.p12
debezium.sink.redis.ssl.truststore.password=secret
debezium.sink.redis.ssl.truststore.type=PKCS12
debezium.sink.redis.ssl.keystore.path=/path/to/keystore.p12
debezium.sink.redis.ssl.keystore.password=secret
debezium.sink.redis.ssl.keystore.type=PKCS12

Debezium 平台

改进了转换的导航和工作流

我们在 Debezium Management Platform 界面中为转换添加了多项新功能(DBZ-8328),包括:

  • 一个名为“Transforms”的新主导航菜单选项。

  • 改进了管道创建工作流,允许动态添加转换。

  • 支持修改和删除现有转换。

我们非常希望您对新的导航工作流和转换方面的改进提供反馈。

基本通知通道支持

Debezium 的通知子系统是允许 Debezium 通知感兴趣的消费者连接器状态更改的强大方式。Debezium 3.2 在将 Debezium Server 部署到 Kubernetes with Debezium Platform 时引入了对通知的基本支持。此基本支持侧重于提供日志通道,以便在 Debezium Server pod 日志中观察通知(DBZ-9046)。

Debezium AI

为 Ollama 嵌入模型引入超时

我们为使用 `FieldToEmbedding` 转换的 Debezium AI Ollama 模型集成添加了一个新的配置属性 `ollama.operation.timeout.ms`。此配置属性指定模型操作允许执行的毫秒数,之后请求将超时。默认情况下,转换等待 15 秒,但可以相应调整(DBZ-8908)。

Debezium OpenLineage 集成

OpenLineage 是一个开放标准,用于现代数据驱动系统的元数据和 lineage 收集。它不仅定义了一个规范,还定义了一套库,用于跟踪数据在变更数据捕获和转换管道、流处理和数据仓库等系统中的流动。

例如,让我们考虑一个相对常见的 CDC 和数据仓库场景:

  • Debezium 的 PostgreSQL 连接器捕获更改,这些更改被写入 Kafka。

  • Flink 读取 Kafka topic(s),执行流处理,并将结果写入 S3。

  • dbt 作业对 S3 数据进行建模,并将结果推送到 Snowflake 进行数据仓库。

通过使用 OpenLineage,可以实现以下目标:

  • Debezium 发出关于 CDC 系统的元数据。

  • Flink 可以报告从 Kafka 到 S3 的 lineage。

  • dbt 可以报告从 S3 到 Snowflake 的 lineage。

并且在 lineage UI 中,您可以看到从 PostgreSQL 到 Snowflake 的端到端流。这为审计、调试和合规性提供了可追溯性的基础,同时还可以识别诸如 CDC 管道中断时的影响等内容,等等。

有关此集成的更多信息、工作原理以及其重要性,请花些时间阅读我们同事关于我们为集成 OpenLineage 所做工作的最新博客文章DBZ-9020)。

Debezium Quarkus Extension

Debezium Quarkus Extension 是 Debezium 产品组合中最新的添加项之一,其目标不仅是在 Quarkus 生态系统中提供 Debezium 作为 DevService,而且还将 Debezium 与 GraalVM 一起使用。

这是目前一项积极开发的功能,在次要和微发布中不断添加新功能(DBZ-8902)。我们目前的重点是基于 PostgreSQL 连接器的 MVP,不久将添加更多连接器。在不久的将来,我们希望在此工作的基础上构建 Debezium Server,将 Debezium 和 GraalVM 的强大功能带到 Debezium Platform。

我们作为 Debezium 3.2 的一部分引入的几项新功能包括:

  • 使用 `@Capturing` 注解 bean 方法以用于变更事件处理程序(DBZ-8961)。

  • CDI 生命周期事件,即启动、轮询、停止等(DBZ-8959)。

  • 支持通知事件(DBZ-8964)。

有关此工作的更多信息,请阅读设计文档。随着我们在 Debezium 3.3 中的持续发展,预计将看到新的博客和功能添加。

其他修复

以下是一些 Debezium 3.2 中值得注意的附加更改和修复的子集:

  • 快照期间插入的事件被重复(DBZ-9006)。

  • Oracle 连接器在没有 SQL_REDO 的重做条目时因临时表而崩溃(DBZ-9199)。

  • 升级 PostgreSQL JDBC 驱动到 42.7.7(DBZ-9200)。

  • SQL Server 连接器无法正确处理 schema 名称中的特殊字符(DBZ-9117)。

  • Oracle 表名中存在 "_" 导致 cdc 失败(DBZ-9131)。

  • Postgres:记录复制 Keepalive 线程中的错误(DBZ-9161)。

  • 修复 history topic 中存在的 TRUNCATE 操作(如果它是跳过的操作)(DBZ-9162)。

  • MySQL 连接器无法正确处理数据库对象名称中的特殊字符(DBZ-9168)。

  • 将 post processor 的配置与 transforms、predicates 对齐(DBZ-9170)。

  • 验证连接器时出现特殊字符 $ 的错误(DBZ-8660)。

  • 转换表和列名称为大写时出错(DBZ-9017)。

  • UI 前端支持 signals(DBZ-8422)。

  • 将 Postgres txid_current() 替换为 pg_current_xact_id()(DBZ-9011)。

  • 当 JSON Feed 中出现空的 [] 或 {} 时,Mongodb 出现摄取问题(DBZ-5920)。

  • 进行中的增量快照通知不包含完整的复合主键(DBZ-8207)。

  • 连接器 errors.max.retries 被忽略(DBZ-8711)。

  • debezium/server mongodb org.apache.kafka.connect.errors.DataException: is not a valid field name(DBZ-8972)。

  • 将快照模式设置为 initial only 时,连接保持“idle in transaction”状态(DBZ-9003)。

  • 由于嵌套引号,默认值可能被误解为绑定参数(DBZ-9040)。

  • 阻塞快照在任务关闭时并不总是恢复流线程(DBZ-9055)。

  • Postgres Reselector 在序列主键上失败(DBZ-9086)。

  • 为 Hugging face 创建嵌入 SMT 扩展(DBZ-8992)。

  • 为 Voyage AI 模型创建嵌入 SMT 扩展(DBZ-8993)。

总共有 213 个问题在 Debezium 3.2 中得到解决。更改列表也可以在我们的发行说明中找到。

非常感谢社区中所有辛勤工作的贡献者为这个版本付出的努力

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