新年伊始,新开发周期也随之而来,我很高兴地宣布 Debezium 3.1 的第一个预发布版本,即 3.1.0.Alpha1。此版本包含各种新功能,包括 PostgreSQL 和 MySQL 在 JDBC sink 中的向量数据类型支持、新的自适应时间精度模式、MariaDB SSL 支持等。废话不多说,让我们直接深入了解这些新功能和改进。

重大变更

任何软件的新主要版本通常都会包含一些破坏性变更。Debezium 3.1.0.Alpha1 版本也不例外,因此我们来讨论一下您需要了解的主要变更。

事件 source 块现已版本化

Debezium 的变更事件包含一个 source 信息块,用于描述变更事件来源的属性。source 信息块是 Kafka Struct 数据类型,可以进行版本化;然而,在旧版本的 Debezium 中,version 属性是留空的。

在 Debezium 3.1 及更高版本中,source 信息块现已版本化,并将设置为版本 1 (DBZ-8499)。随着未来实现的变更,版本将相应地递增。

对于使用 schema registry 的用户来说,此更改可能会引入 schema 兼容性问题。

稀疏向量逻辑类型重命名

PostgreSQL 扩展 vector(即 pgvector)提供了多种向量数据类型的实现,其中包括一种名为 sparsevec 的类型。稀疏向量是一种仅存储向量中已填充键/值条目的向量,排除未设置的条目,以最小化表示数据集的空间。

Debezium 3.0 引入了名为 io.debezium.data.SparseVectorSparseVector 逻辑类型。在我们开始评估其他关系数据库的实现时,我们发现当开始实现其他稀疏向量类型时,逻辑名称不够充分 (DBZ-8585)。

在 Debezium 3.1 中,我们将 PostgreSQL 连接器中的 io.debezium.data.SparseVector 类重新打包到 Debezium 的核心包中,还将该类重命名为 SparseDoubleVector,并将逻辑名称更改为 io.debezium.data.SparseDoubleVector,以与类名更改保持一致。

对于那些可能曾经使用过 SparseVector 逻辑类型的用户,您可能需要调整您的代码以识别新的逻辑类型名称。

新功能和改进

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

JDBC sink 支持 MySQL/PostgreSQL 向量数据类型

我们在 Debezium 3.0(2024 年底)中引入了多种向量数据类型,包括 MySQL/PostgreSQL 的 vector 和 PostgreSQL 的 halfvec/sparsevec。在 Debezium 3.1 中,我们将这些数据类型对 JDBC sink 连接器的支持进行了扩展 (DBZ-8571)。

这个新的映射包含几条规则:

  • MySQL 到 MySQL 或 MySQL 到 PostgreSQL,vector 数据类型会自动映射。

  • PostgreSQL vector 到 PostgreSQL 或 MySQL,vector 数据类型会自动映射。

  • 如果目标是 PostgreSQL,则 halfvecsparsevec 的复制会自动映射。

对于没有向量数据类型原生映射或不支持此类类型的目标数据库,该字段无法原生写入目标系统。对于此类用例,您可以使用 io.debezium.transforms.VectorToJsonConverter 转换器在数据传输过程中将其更改为 JSON 表示形式,大多数数据库都普遍支持 JSON。数据库中的目标列类型将是 jsonclob 或文本类型的列,具体取决于数据库供应商。

随着越来越多的源数据库向量类型得到支持,我们将继续在未来扩展这一点。

新的自适应时间精度模式类型

Debezium 一直支持多种 time.precision.mode 类型,如 adaptiveconnect。在 Debezium 3.1 中,增加了三种新模式,为基于时间的列提供了更多的定制和选择 (DBZ-6387)。

模式 描述

isostring

配置连接器将时间值映射为 UTC 中的 ISO-8601 格式字符串。

microseconds

配置连接器以微秒精度映射时间值(如果可用)。

nanoseconds

配置连接器以纳秒精度映射时间值(如果可用)。

使用 microsecondsnanoseconds 基于精度模式时,连接器将根据字段是 DATE、TIME 还是 TIMESTAMP 类型来选择使用不同的语义类型。请参阅您特定的连接器文档,了解连接器如何解释此信息。

MariaDB SSL 支持

Debezium 3.1 引入了多项新的 MariaDB 特有模式,旨在允许 MariaDB 连接器使用 SSL 进行连接,这些模式与 MariaDB 驱动程序兼容 (DBZ-8482)。下表描述了这些模式以及 MySQL 中的等效模式,如果您从旧的 MySQL 连接器部署迁移到新的独立 MariaDB 连接器。

模式 描述

disable

禁用 SSL/TLS 连接。所有连接都不安全。这等同于 MySQL 的 disabled 模式。

trust

使用 SSL/TLS 进行加密,但不执行证书或主机名验证。这等同于 MySQL 的 required 模式。

verify-ca

使用 SSL/TLS 进行加密并执行证书验证,但不执行主机验证。这等同于 MySQL 的 verify_ca 模式。

verify-full

使用 SSL/TLS 进行加密并执行证书和主机验证。这等同于 MySQL 的 verify_identity 模式。

对于 MariaDB,这些属性作为 database.ssl.mode 属性的一部分传递。

SQL Server 流式内存改进

Microsoft SQL Server 驱动程序无法在同一连接上执行多个 select。在某些情况下可能会发生这种情况,这通常会导致所有数据缓冲到内存中,这可能效率很低或导致内存问题。

为了解决此驱动程序限制,Debezium 3.1 引入了一个新的配置选项 streaming.fetch.size (DBZ-8557)。此配置选项允许指定在流式传输过程中从每个表读取的最大行数。默认情况下,此设置为 0,因此行为保持不变,但将其设置为正值会导致多次与数据库进行数据往返,以配置大小的批次获取数据。

Debezium 基于 WASM 的内容路由/过滤

Debezium 脚本模块现在支持使用 Chicory 运行脚本,Chicory 是 WebAssembly (WASM) 的原生 JVM 运行时 (DBZ-8658)。

例如,给定以下 Go 程序

package main

import (
    "github.com/debezium/debezium-smt-go-pdk"
)

func process(proxyPtr uint32) uint32 {
    var topicNamePtr = debezium.Get(proxyPtr, "topic")
    var topicName = debezium.GetString(topicNamePtr)
    return debezium.SetBool(topicName == "theTopic")
}

func main() {}

此 Go 程序可以编译为 WebAssembly .wasm 文件,然后由 ContentBasedRouterFilter 转换器使用。以下示例展示了如何将其与 Filter 转换器一起使用

{
  "transforms": "route",
  "transforms.route.type": "io.debezium.transforms.Filter",
  "transforms.route.condition": "<path-to-compiled-wasm-file>",
  "transforms.route.language": "wasm.chicory"
}

在此示例中,如果事件的主题与 theTopic 匹配,则该事件将被传递,否则该事件将被丢弃。

有关更多信息,您可以查阅 Filter SMTContent-based Router SMT 的文档。

显式使用 S3 存储的路径样式寻址

S3 SDK 在 2.18+ 中引入了一个小的行为更改,即 URL 使用虚拟主机样式而不是路径样式构建,如 上游 S3 SDK 社区中所讨论的。虽然 S3 存储桶支持这两种 URL 样式,但在某些情况下,包括测试用例,虚拟主机样式可能尚未得到支持。

在 Debezium 3.1 中,添加了一个新的配置选项 schema.history.internal.s3.forcePathStyle,默认为 false (DBZ-8569)。在您可能需要路径样式 URL 而不是虚拟主机样式 URL 的情况下,将其设置为 true 将恢复旧的 URL 行为。

Debezium Server Pulsar 基于键的批处理支持

Debezium 3.1 引入了一种新的、经过改进的吞吐量选项,用于 Apache Pulsar 的 KeyShared 订阅。添加了一个新的配置选项 debezium.sink.pulsar.producer.batchBuilder,可以将其设置为 KEY_BASED,但默认为 DEFAULT (DBZ-8563)。

当设置为使用 KEY_BASED 时,此订阅模型会将具有相同键的消息按顺序仅传递给一个消费者。有关 Key_Shared 订阅模型的更多信息,请参阅 Apache Pulsar 文档

其他更改

  • 提交偏移量时发生的异常不会触发重试逻辑。DBZ-2386

  • 修复了在启用有序事务元数据时启动时的无效 gtid 错误。DBZ-8541

  • Debezium operator 生成错误的 offset 和 schema history 属性。DBZ-8543

  • 最近的日志切换在日志收集过程中可能被视为一致。DBZ-8546

  • 基于内容的路由表达式变量标头在代码中是单数形式。DBZ-8550

  • 将 MongoDB 驱动程序升级到 5.2。DBZ-8554

  • 在 Vitess v20 中使用 enum set strings 标志来解码 enums/sets。DBZ-8561

  • MongoDataConverter 不识别嵌套的空数组。DBZ-8572

  • 修复了 Transformation UI 部分中的问题。DBZ-8575

  • 当 log.mining.restart.connection 启用且连接默认为 PDB 而不是 CDB$ROOT 时,日志切换时会发生 ORA-65040。DBZ-8577

  • 将 Outbox Extension 移至 Quarkus 3.17.7。DBZ-8583

总共有 26 个问题在 Debezium 3.1.0.Alpha1 中得到解决。变更列表也可以在我们的 发行说明中找到。

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