随着我们逐渐接近 Debezium 2.5 的最终发布阶段,我很高兴地宣布 Debezium 2.5.0.Beta1 现已发布。此版本包含多项改进,如对 MariaDB GTID 的支持、Debezium Server EventHub sink 的分区、原生的 RabbitMQ streams Debezium Server sink、从 PostgreSQL 16 备用数据库流式传输、MySQL 高精度源时间戳、JDBC sink 的字段包含/排除,以及一些初始快照的其他通知,以及 Debezium Operator CRDs 的服务帐户支持。此外,此版本包含各种错误修复和几项重大更改。

让我们更详细地了解 Debezium 2.5.0.Beta1 中包含的所有这些更改和改进;一如既往,您可以在 发行说明中找到此版本的完整更改列表。请记住,请特别注意任何可能影响您升级路径的重大更改。

重大变更

虽然我们努力避免破坏性更改,但有时为了朝着正确的方向发展,这些更改是不可避免的。此版本包含几项破坏性更改。

分片部署中的 MongoDB 快照

在 Debezium 的早期版本中,用户可以使用 MongoDB 连接器在 MongoDB 分片部署中对特定分片上的集合执行快照。不幸的是,虽然我们理解用户可能利用了这种行为,但这是非预期的且不受支持的。

Debezium 2.5 完全移除了此功能,这是我们弃用并完全删除 MongoDB 中副本集流模式(DBZ-7139)的进步。

已移除 ComputePartition SMT

ComputePartition 是一个 SMT,它使用户能够计算事件将被写入 Kafka 主题的期望分区。此单消息转换(SMT)已于一段时间前弃用,取而代之的是新的 PartitionRouting 单消息转换。

Debezium 2.5 移除了旧的、已弃用的 ComputePartition,并且可能仍依赖此 SMT 的用户需要迁移到新的 PartitionRouting SMT(如果尚未完成)(DBZ-7141)。

JDBC sink 值序列化更改

有一个报告的极端情况,其中 JDBC sink 连接器错误地将具有 null 值的字段写入目标数据库,使用的是默认值而不是 NULL 值。这已在 Debezium 2.5 中修复(DBZ-7191)。

新功能和改进

Debezium 2.5 还引入了更多改进和功能,让我们逐个查看。

初始快照的附加通知

Debezium 的通知子系统提供了一种简单的方法,可以将外部进程和应用程序与 Debezium 的特定任务(例如,执行快照)集成。在先前版本中,初始快照的通知非常基础,仅提供诸如快照何时开始、每个表何时开始和结束以及最终快照何时结束等详细信息。

DBZ-6878 的一项最新贡献扩展了此基本功能,以提供有关快照的增强详细信息。例如,IN_PROGRESS 通知将提供有关正在捕获的表以及当前正在处理的表的其他详细信息,如下所示:

{
   "id":"6d82a3ec-ba86-4b36-9168-7423b0dd5c1d",
   "aggregate_type":"Initial Snapshot",
   "type":"IN_PROGRESS",
   "additional_data":{
      "connector_name":"my-connector",
      "data_collections":"table1, table2",
      "current_collection_in_progress":"table1"
   },
   "timestamp": "1695817046353"
}

此外,另一个名为 TABLE_SCAN_COMPLETED 的初始快照通知也提供类似详细信息,如下所示:

{
   "id":"6d82a3ec-ba86-4b36-9168-7423b0dd5c1d",
   "aggregate_type":"Initial Snapshot",
   "type":"TABLE_SCAN_COMPLETED",
   "additional_data":{
      "connector_name":"my-connector",
      "data_collection":"table1, table2",
      "scanned_collection":"table1",
      "total_rows_scanned":"100",
      "status":"SUCCEEDED"
   },
   "timestamp": "1695817046353"
}
上面显示的几个字段,如 data_collection,目前不适用于 MongoDB 快照,仅适用于基于 SQL 的关系型连接器。

有关更多详细信息,请参阅通知文档

MySQL 高精度源时间戳

多个 MySQL 复制事件中包含了几个高精度时间戳字段。例如,在 MySQL 8.0.1 中,GTID 事件增加了两个微秒分辨率的时间戳,用于指定事务在直接主节点提交的时间以及在原始主节点提交的时间。

Debezium 2.5 现在利用了这些值,如果可用,将使用它们来设置 ts_ms 字段,如果它们不可用或您使用的是 8.0.1 之前的 MySQL 版本,则回退到基于秒的精度(DBZ-7183)。

MariaDB GTID 支持

MySQL 和 MariaDB 都支持全局事务标识符(GTID)。这些在复制中用于唯一地标识集群中的事务。MySQL 和 MariaDB 之间的实现细节差异很大,在 Debezium 的早期版本中,我们仅支持 MySQL 的 GTID。

通过 Debezium 2.5,我们向前迈进了一步,为 MariaDB 提供了 GTID 支持,作为 MySQL 连接器产品的一部分。为了利用此功能,您需要使用 MariaDB 驱动程序而不是 MySQL 驱动程序,使用 JDBC 连接前缀为 jdbc:mariadb 而不是 jdbc:mysql。通过这样做,您可以像使用 MySQL 一样,充分利用 MariaDB 和 GTID 进行工作(DBZ-1482)。

计划在 Debezium 2.6 中为 MariaDB 引入一个新的独立连接器。2.5 版本中的许多内容将延续到 2.6 版本的新连接器中,因此我们早期获得的任何反馈都将有利于 2024 年初的过渡!

从 PostgreSQL 16 备节点流式传输

在 PostgreSQL 16 中,您现在可以在备节点上定义复制槽。这提供了大量新选项,包括从副本而不是生产系统捕获更改数据的能力,以实现负载分担,特别是在非常活跃的数据库中。

Debezium 2.5 现在支持连接到 PostgreSQL 16 备节点并流式传输更改(DBZ-7181)。

JDBC sink 字段包含/排除

Debezium 2.5 引入了一个新的 JBDC sink 功能,用户现在可以指定要包含或排除在目标数据库写入操作中的事件负载中的哪些字段。此功能与其他 Debezium 框架中的包含/排除组合一样工作,其中这两个属性是互斥的。

例如,如果我们有一个简单的事件负载,其中包含主题 customers 中的以下字段:

{
  "id": 12345,
  "name": "Acme",
  "address": "123 Main Street"
}

如果我们想避免将 address 字段写入目标数据库,而只将 idname 字段写入目标表,我们可以使用此新功能来实现。这可以通过添加 field.include.listfield.exclude.list 属性来完成。

阻止将 address 字段写入目标的示例
{
  "field.exclude.list": "customers:address"
}

字段的包含/排除格式为 [<topic-name>:]<field-name>,其中 topic-name 是可选的,如果您想避免将 address 字段写入所有事件,则可以省略。有关更多详细信息,请参阅 JDBC sink 连接器配置文档。

Debezium Server - EventHubs 分区

在 Debezium Server 的先前版本中,用户可以指定一个固定的 partition-id 将所有更改流式传输到一个分区,或提供一个静态的 partition-key,该 key 将设置在所有批量操作上,最终将所有更改流式传输到同一目标分区。在某些情况下,这可能很有用,但它更多地导致了下游处理的性能问题。

Debezium 2.5 调整了此行为以提高性能。默认情况下,当未定义 partitionidpartitionkey 时,EventHub sink 将使用轮询技术将事件发送到所有可用分区。可以通过指定 partitionid 来强制事件进入一个单一的、固定的分区。或者,可以提供 partitionkey 来提供一个固定的分区键,该键将用于将所有事件路由到一个特定分区。

如果需要其他分区路由要求,您现在可以结合使用 PartitionRouting SMT 来完成这些任务。有关更多详细信息,请参阅Event Hubs 文档

Debezium Server - RabbitMQ Streams sink

RabbitMQ 在 3.9 版本中引入了Streams,它使用一种快速高效的协议,可以与 AMQP 0.9.1 结合使用,以支持大型扇出、重放和时间旅行,以及具有极高吞吐量的大型数据集。Debezium 2.5 通过引入新的本机 Streams 实现(DBZ-6703)来利用此新的 Streams 实现。为了开始使用此新实现,请按如下方式配置 Debezium Server sink:

debezium.sink.type=rabbitmqstream
debezium.sink.rabbitmqstream.connection.host=<hostname of RabbitMQ>
debezium.sink.rabbitmqstream.connection.port=<port of RabbitMQ>

此外,如果您需要将任何其他连接参数传递给 RabbitMQ 连接,您可以通过添加带有前缀 debezium.sink.rabbitmqstream.connection. 的配置来实现,以传递任何配置属性。

有关更多详细信息,请参阅Debezium Server RabbitMQ 文档

Debezium Operator - CRD 的 Service Account

在 Debezium 的先前版本中,无法使用与预定义账户名称不同的服务账户。这使得用户过程有些麻烦,因为虽然您可以单独向此预定义账户授予角色和授权,但这意味着您需要使用此预定义服务账户,而不是您可能已经希望使用的账户。

Debezium 2.5 简化了此过程,允许您现在使用自己的自定义服务账户(DBZ-7111)。

其他修复

此外,此版本还包含相当多的稳定性修复和 bug 修复。其中包括:

  • 为 Operator 模型生成 sundrio 声明式构建器 DBZ-6550

  • 将 Operator 源转换为多模块项目 DBZ-6551

  • 在特定于连接器的 Connect REST 扩展中实现“验证过滤器”端点 DBZ-6762

  • 测试 MongoDB 连接器和 ExtractNewDocumentState SMT 的 Avro 调整 DBZ-6809

  • 在主存储库中实现针对 Cloud Spanner 模拟器的 IT 测试。 DBZ-6906

  • DefaultDeleteHandlingStrategy 无法将重写后的“__deleted”字段添加到非结构值 DBZ-7066

  • 为 MariaDB 和 MySQL 的差异实现策略模式 DBZ-7083

  • Debezium server 对 offset.flush.interval.ms 没有默认值 DBZ-7099

  • 快照后,连接 MySQL 数据库时身份验证失败 DBZ-7132

  • 并行运行 MySQL CI 构建 DBZ-7135

  • Informix 12.10 上读取 CURRENT_TIMESTAMP 失败 DBZ-7137

  • Debezium-ddl-parser 在解析 MySQL DDL 语句(特定 UNION)时崩溃 DBZ-7140

  • 当 fields.additional.placement 值中存在空格时,outbox.EventRouter SMT 抛出 NullPointerException DBZ-7142

  • Debezium-ddl-parser 在解析 MySQL DDL 语句(特定 UPDATE)时崩溃 DBZ-7152

  • 为工作流添加矩阵策略 DBZ-7154

  • 在 Debezium Operator 存储库中为 ServiceAccountDependent 类添加单元测试 DBZ-7155

  • JsonSerialization 无法处理带复合分片键的分片集合的更改 DBZ-7157

  • 日志重放线程应独立对待每个重放线程 DBZ-7158

  • 如果在反序列化时值不是 CloudEvent,则快速失败 DBZ-7159

  • 正确计算最大 LSN DBZ-7175

  • 升级到 Infinispan 14.0.20 DBZ-7187

  • 将 Outbox Extension 升级到 Quarkus 3.5.3 DBZ-7188

  • 修复 DebeziumMySqlConnectorResource 未使用新的 MySQL 适配器结构来支持不同的 MySQL 风味 DBZ-7179

  • 解析 MySQL 索引的 JSON 字段时失败,当使用类型为 double 和 float 的强制转换时 DBZ-7189

  • 即使配置了 REPLICA IDENTITY FULL,未更改的 toasted 数组列仍被替换为 unavailable.value.placeholder。 DBZ-7193

  • 启用能力来流式传输 Oracle 23c 的 LogMiner 更改 DBZ-7194

  • 在解析 PL/SQL 的 modify_table_partition 规则中添加 modify range_partitions DBZ-7196

  • MongoDB 流式传输在只有在没有事件的情况下才会暂停,仅适用于 Blocking Snapshot DBZ-7206

  • 处理 PL/SQL 中的 Drop Tablespace DBZ-7208

  • 升级 logback 到 1.2.12 DBZ-7209

  • AbstractInfinispanLogMinerEventProcessor.logCacheStats 上的 NPE DBZ-7211

下一步是什么?

我们还有大约三周时间将在节假日期间休息,所以这将是 Debezium 2.5 的唯一 beta 版本。我们计划在下周中期发布候选版本,最终版本将在节假日休息前一周发布。

团队还在为 Debezium 2.4 准备一个维护版本,将于本周晚些时候发布。此 Debezium 2.4 更新将把 Debezium 2.5 中已有的许多 bug 修复和稳定性改进带到 2.4 版本流中。

团队还在确定我们 2024 年的路线图。本周晚些时候,我将在我们的网站上发布详细信息,并在 12 月 12 日星期二上午 10 点(ET)的 Debezium 社区活动中,详细介绍 Debezium 2.5 和我们的 2024 年路线图。欢迎大家参加,会议链接是Google Meet

一如既往,如果您有任何疑问或反馈,请随时通过邮件列表Zulip 聊天与我们联系。下次再见,保持温暖!

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