我们很高兴地宣布 Debezium 3.1 的第一个 Beta 版本,即 3.1.0.Beta1

此版本包含大量新功能和改进,包括但不限于:首个官方发布的 Debezium Server UI、CloudEvent traceparent 支持、Debezium 的 PubSub 和 RabbitMQ sink 的新功能、WASM 转换中的 Schema 访问,以及更多内容。让我们深入了解所有这些新功能和改进。

新功能和改进

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

Debezium Platform 的首次发布

一年前,我们开始了这项激动人心的旅程,为 Debezium Server 创建了一个新的、现代化的用户界面,旨在简化 Debezium 在 Kubernetes 上的部署。我们很高兴地宣布,Debezium 3.1 将是这项多年努力的第一个官方发布版本。

新的 Debezium Platform 提供了一种基于管道的现代化方法,可以在几秒钟内设计源和目标配置、转换链等。您可以使用 helm 如下方式安装 Debezium Platform:

helm install debezium-platform --set domain.url=<your-domain> --version 3.1.0-beta1 oci://quay.io/debezium-charts/debezium-platform

有关如何使用 helm 进行部署的更多详细信息,请参阅 README.md

此外,此版本特别为用户界面添加了一些收尾工作,包括新的搜索/列表视图切换器、应用转换和编辑连接器管道的显示,以及在配置管道期间的面向经验丰富的用户的智能编辑器。

以下视频展示了如何使用这些新功能:

搜索和列表视图切换器
显示已应用的转换和编辑管道
使用智能编辑器进行有经验用户的配置

Percona 的最小化锁定

Debezium 为 MySQL Percona 用户添加了一个新的 snapshot.locking.mode,以减少快照期间发生的锁定量。新模式 minimal_percona_no_table_locks 提供了与 minimal_percona 相同的语义,但还省略了表级锁 (DBZ-8717)。这为在某些不允许表锁的环境中提供了一个替代方案。

Oracle 源信息 scn 和时间戳字段

Debezium 为 Oracle 更改事件的 source 信息块添加了几个新字段 (DBZ-8740),包括:

commit_ts_ms

这指定了事件事务提交的时间(以毫秒为单位)。

start_scn

这指定了事件事务中观察到的第一个事件的 SCN。

start_ts_ms

这指定了用户修改的事件事务中第一个事件的时间(以毫秒为单位)。

这些新字段是可选的,因此模式注册表用户会发现这些更改是向后兼容的。

Oracle SCN 值并非唯一,因此可能存在多个事件具有相同的 SCN 值和时间戳。在使用这些值进行任何类型的事件排序时应格外小心。

Vitess Epoch/Zero 日期列解析的更改

当 Vitess 值转换器发出设置为零日期值的日期列时,根据列的可选性,该字段可能显示为 null Unix epoch。这对消费者应用程序来说是一个问题,因为它们无法区分当提供 epoch 值时,它是真正的 epoch 值还是哨兵值,因为该列在源中是零日期

Debezium 3.1 为 Vitess 用户引入了一个新的配置属性 override.datetime.to.nullable

默认值 false 继续使用旧行为发出日期列,即如果列不为 null,则使用 Unix epoch 而不是 null。这意味着消费者将继续无法区分这两种用例。

当设置为 true 时,所有日期和 datetime 列都将设置为可选,这意味着它们可以与 null 一起序列化,而无论列在源数据库中的可选性如何设置。这意味着,如果源系统中设置了零日期,连接器将始终使用 null 来表示此用例,而不再使用基于 epoch 的值,除非该字段被填充了实际的非零日期值。

Vitess 二进制排序的 tiny、medium 和 long 文本列的更改

在 Debezium 3.1.0.Alpha2 中,我们进行了一项更改,将 Vitess 二进制排序的 textenumset 列类型作为字符类型字段发出到更改事件中 (DBZ-8679)。不幸的是,这只覆盖了一部分列类型,在此版本中,我们已将其扩展到包括 tinytextmediumtextlongtext 类型 (DBZ-8694)。

请注意,如果您使用模式注册表,texttinytextmediumtextlongtextenumset 列类型使用二进制排序进行序列化的方式的更改可能会引入模式向后兼容性问题。

CloudEvent traceparent 支持

Debezium 的 CloudEvents 支持已更新,增加了对 traceparent 属性的支持,该属性提供了与 OpenTelemetry 集成的能力,可以将跟踪详细信息作为事件的一部分进行传递 (DBZ-8669)。

通过将 opentelemetry.tracing.attributes.enabled 配置属性设置为 true,并包含 traceparent:header 作为 metadata.source 的一部分,这些信息将提供给 CloudEvents 转换器。

您可以通过更改默认值并指定适当标头中的字段值来定制转换器填充字段的方式。例如:

{
  "value.converter.metadata.source": "value,id:header,type:header,traceparent:header,dataSchemaName:header"
}

您可以在 Debezium 的 CloudEvents 文档中找到其他示例。

WASM 转换中的模式访问支持

现在,您可以使用 WASM 转换在 TinyGo 程序中访问一些模式详细信息 (DBZ-8737)。已添加两个新方法来支持时间:GetSchemaNameGetSchemaType

TinyGo 模式访问器示例
package main

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

//export process
func process(proxyPtr uint32) uint32 {
    var valueSchemaType = debezium.GetSchemaName(debezium.Get(proxyPtr, "valueSchema"))
    var opType = debezium.GetSchemType(debezium.Get(proxyPtr, "valueSchema.op"))
    // Filter where schema type or opType match
    return debezium.SetBool(valueSchemaType == "dummy.Envelope" || opType == "string")
}

func main() {}

我们欢迎您就如何改进 WASM 转换体验提供任何反馈。请通过我们的 Zulip 聊天联系我们,或在 Jira 上记录增强功能。

connect-base 镜像中条件性包含组件

Debezium 的 kafkaconnect 镜像均派生自一个名为 connect-base 的通用镜像。默认情况下,此基础镜像会安装 Apicurio、Jolkia 和 OpenTelemetry 依赖项。这对于测试非常有用,但如果您希望将 Debezium 的镜像用作自己的基础,则在不必要时可能希望省略这些依赖项。

connect-base 镜像现在可以条件性地省略这些依赖项中的任何一个 (DBZ-8709)。可以将 OTL_ENABLEDAPICURIO_ENABLEDJOLOKIA_ENABLED 环境变量设置为 no,以在构建镜像时省略这些依赖项,从而减小镜像的占地空间。

connect-base 镜像将继续默认安装这些依赖项,因此开箱即用的镜像行为没有变化。

PubSub sink 支持并发和压缩

为了提高 Google PubSub 的吞吐量和容量,我们引入了指定 PubSub 若干新配置属性以支持并发和压缩的能力 (DBZ-8715)。这些新的配置属性可用于任何现有的 PubSub 配置。

pubsub.concurrency.threads

这指定了用于向 Google PubSub 发布消息的线程数。这可用于扩展或限制 Google PubSub 客户端库创建的 PubSub 线程数。默认情况下,PubSink 使用客户端库的默认行为。

pubsub.compression.threshold.bytes

当设置为 0 或更大的值时,PubSub sink 会启用可选的压缩来将事件批次传输到 PubSub 端点。是否使用压缩由提供的阈值定义。如果批次的总字节数小于阈值,则不使用压缩。如果批次的总字节数等于或大于阈值,则使用压缩。

PubSub sink 支持区域端点

在使用 PubSub sink 时,对于可能需要与位置特定(即区域)端点交互的生产系统,pubsub.address 通常不足以满足需求。为解决此问题,Debezium 3.1 引入了一个新的配置属性 pubsub.region (DBZ-8735)。

新的 pubsub.region 属性允许指定要连接的 Google Cloud 区域,例如 us-central1asia-northeast1。指定后,Debezium 将使用 PubSub 的特定于位置的端点,格式为 <region>-pubsub.googleapis.com:443。这允许连接到特定于位置的端点而不是全局端点。

pubsub.regionpubsub.address 配置属性是互斥的。如果您在配置中提供了 pubsub.address,则 pubsub.region 将被忽略。

RabbitMQ sink 支持基于键的路由

在 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 更改事件的键。

其他更改

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

  • SQL Server 连接器无法升级到 2.0 DBZ-5845

  • JDBC sink 连接器不会从 postgres 数据库表中删除行 DBZ-8287

  • MariaDB 适配器在 ALTER USER 语句上失败 DBZ-8436

  • 表达式导致 Percona SEQUENCE_TABLE 函数的 SQL 解析器异常 DBZ-8559

  • 大量表导致 Debezium 启动缓慢 DBZ-8595

  • 当遇到 Pub/Sub 的消息传递超时时,Debezium 未正确关闭 DBZ-8672

  • 阻塞快照后流连接出现断管(Postgres) DBZ-8680

  • 在发布管道中支持 Debezium Platform DBZ-8682

  • 为打包 helm charts 创建管道并在 quay.io 上发布 DBZ-8706

  • source 中的 ts_ms 可能默认为 0 而不是 Instant.now() DBZ-8708

  • PDB 数据库名称默认为大写 DBZ-8710

  • 使用 DEFAULT ON NULL 子句时,Alter table modify column 失败 DBZ-8720

  • ExtractChangedRecordState SMT 现在可以处理带有默认值的字段 DBZ-8721

  • Oracle RAC 节点重启会导致 redo 线程无限期不一致 DBZ-8724

  • 指定非零值的 archive.log.hours 会生成错误的 SQL DBZ-8725

  • debezium/connect docker 镜像在 arm64 上不可用 DBZ-8728

  • 创建管道来运行发布 DBZ-8731

  • Debezium Server:Nats 消费者因二进制序列化而崩溃 DBZ-8734

  • 更新测试计算 MariaDB 驱动程序 3.5 的默认时区时间的方式 DBZ-8742

  • MariaDB 的 schema.history.internal.skip.unparseable.ddl 可能存在问题 DBZ-8745

  • Oracle 快照的 source.ts 未考虑数据库时区差异 DBZ-8749

  • 将 assertj-core 升级到 3.27.3 DBZ-8751

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

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