我非常高兴地宣布 Debezium 0.10.0.CR2 的发布!

在 CR1 版本之后,我们决定进行另一次候选版本发布,因为不仅收到了大量错误修复,而且社区还提供了一些非常有用的功能实现,我们不想延迟它们。因此,我们稍微调整了原计划,现在目标是在下周发布 Debezium 0.10 Final 版本,除非出现任何意外的回归。

像往常一样,让我们仔细看看一些新功能和已解决的错误。

可定制的消息键

能够配置表中的哪些列应该成为相应 Kafka 消息键,这是一个长期存在的特性请求(DBZ-1015)。回顾一下,默认情况下,Debezium 的数据更改事件的消息键将包含代表表的.*主键列。这是一个合理的默认设置,但有时需要更灵活的方式。

  • 某些表没有主键,尤其是在旧数据模型中。

  • 选择一个不同于主键的消息键可能有助于处理操作多个更改数据主题的流处理应用程序。

当构建 Kafka Streams 应用程序以联接多个 CDC 主题时,第二种情况尤其令人关注:通常,只有当消息键在联接的两侧相同时,才能进行主题联接。

例如,假设我们有两个表 `Customer` 和 `CustomerDetails`,它们具有不同的主键,并且 `CustomerDetails` 到 `Customer` 之间存在外键关系。通过将该外键列选作客户详细信息更改事件的消息键,可以在无需重新键控客户详细信息主题的情况下联接这两个表流。为此,可以使用新的 `message.key.columns` 选项,如下所示:

message.key.columns=dbserver1.inventory.customerdetails:CustomerId

所有关系型 Debezium 连接器都支持可定制的消息键。

Cassandra 的可插拔序列化器

您可能还记得,Debezium 的 Cassandra 连接器与其他连接器略有不同,因为它不基于 Kafka Connect 框架。因此,直到现在,它还不支持可配置的消息序列化器的概念;Avro 是唯一支持的消息格式。

作为使 Cassandra 连接器与其他连接器更接近的持续努力的一部分,它现在允许配置不同的序列化器,因此您也可以使用 JSON、ProtoBuf 和其他格式(DBZ-1405)。此处复用了 Kafka Connect 的序列化器框架,因此您可以利用所有现有的序列化器,并以与配置其他任何连接器相同的方式配置它们。

改进了 Postgres TOAST 列的处理

TOAST 列是 Postgres 中用于处理超出页面大小限制(通常为 8 KB)的列值的一种机制。虽然在直接与数据库交互时 TOAST 的使用是透明的,但在通过逻辑解码获取更改事件时情况并非如此。由于 TOASTed 值本身不存储在物理数据行中,因此逻辑解码不会公开**未更改**的 TOAST 列的值(除非该列是表副本标识的一部分)。

Debezium 支持的逻辑解码插件(`pgoutput`、`decoderbufs` 和 `wal2json`)以前使用不同的方法来处理这种情况,其中一种方法是“带外”检索这些列。

不幸的是,在考虑对这些记录进行并发写入时,没有安全执行此操作的方法。因此,我们重新设计了 TOAST 列的处理方式:如果 TOAST 列的值未更改,并且该列不是表副本标识的一部分,则其值将不会包含在 `UPDATE` 或 `DELETE` 事件中。相反,在这种情况下,将导出一个可配置的标记值(默认为 `__debezium_unavailable_value`)。

这避免了之前可能出现的竞态条件,但当然也引出了消费者如何处理此标记值的问题。有几种可能的答案:

  • 可以简单地忽略该值;例如,将更改事件写入数据库的消费者可以在其发出的 `UPDATE` 语句中省略该列。

  • 当不处理动态更新时,可以在接收方数据库中安装一个触发器,该触发器会忽略任何将列值设置为标记值的更新,从而保留先前的值。

  • 当确实需要在 Kafka 更改数据主题本身中实际包含完整的更改事件(包括任何 TOAST 列)时,可以构建一个有状态的 Kafka Streams 应用程序,该应用程序根据状态存储中持久化的先前列值,为传入的更改事件注入标记值。

仔细想想,最后一种方法可能是一个未来博文的有趣话题 :-)

Bug 修复和其他更改

除了这些特性的实现之外,此版本还包含许多 bug 修复。

  • 使用 Postgres 的 `pgoutput` 逻辑解码插件时,支持自定义发布名称(DBZ-1436)。

  • Postgres 连接器将尝试在可配置的时间段内重试获取复制槽,这在重新平衡集群中的现有连接器时非常有用(DBZ-1426)。

  • 当使用 Avro 作为消息格式时,可以替换列名称中的保留字符(DBZ-1044)。

  • 现在支持 MySQL `DATETIME` 列没有时间部分的默认值(DBZ-1501)。

  • MySQL 具有默认字符集的 `CREATE DATABASE` 和 `CREATE TABLE` 语句得到支持(DBZ-1470)。

MongoDB 的测试已扩展到涵盖 4.2 版本(DBZ-1389),并且 Postgres 驱动程序已更新到最新的 42.2.7 版本(DBZ-1462)。我们也很高兴地宣布,从现在开始,Debezium 容器镜像也将在 quay.io 容器注册表中提供(DBZ-1178)。

总而言之,0.10 CR2 版本总共修复了 30 个问题。有关已解决问题的完整列表和升级过程,请参阅 发行说明

此次发布离不开 Debezium 社区中做出贡献的杰出人士:Bingqin ZhouChing TsaiGuillaume RosauroJavier HolgueraJaromir HamalaJosh ArenbergTaylor Rolison

非常感谢大家!

Gunnar Morling

Gunnar 是一位软件工程师,内心是一个开源爱好者,目前在 Confluent 担任技术专家。此前,他曾帮助构建一个基于 Apache Flink 的实时流处理平台,并领导了 Debezium 项目,这是一个用于变更数据捕获的分布式平台。他是 Java Champion,并创立了多个开源项目,如 JfrUnit、kcctl 和 MapStruct。Gunnar 是一位热情的博主 (morling.dev),并曾在 QCon、Java One 和 Devoxx 等各种会议上发表演讲。他居住在德国汉堡。

   


关于 Debezium

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

参与进来

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

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