我非常高兴地宣布 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 修复。
MongoDB 的测试已扩展到涵盖 4.2 版本(DBZ-1389),并且 Postgres 驱动程序已更新到最新的 42.2.7 版本(DBZ-1462)。我们也很高兴地宣布,从现在开始,Debezium 容器镜像也将在 quay.io 容器注册表中提供(DBZ-1178)。
此次发布离不开 Debezium 社区中做出贡献的杰出人士:Bingqin Zhou、Ching Tsai、Guillaume Rosauro、Javier Holguera、Jaromir Hamala、Josh Arenberg 和 Taylor Rolison。
非常感谢大家!
关于 Debezium
Debezium 是一个开源的分布式平台,可以将现有数据库转变为事件流,使应用程序能够几乎即时地看到并响应数据库中已提交的每个行级更改。Debezium 构建在 Kafka 之上,并提供了 Kafka Connect 兼容的连接器,用于监控特定的数据库管理系统。Debezium 将数据更改的历史记录在 Kafka 日志中,这样您的应用程序可以随时停止和重新启动,并可以轻松地消费在未运行时错过的所有事件,确保所有事件都被正确且完整地处理。Debezium 在 Apache 许可证 2.0 下是 开源 的。