随着夏日气温的持续升高,我很高兴地宣布 Debezium 有一些非常棒的消息,Debezium 2.7.0.Alpha1 现已可供测试。此版本在 MongoDB、MariaDB、MySQL、Oracle、Vitess 以及 Kubernetes Operator 等各种连接器中包含了一系列新的变更和改进,以及对整个 Debezium 产品组合进行了大量的细微修复和改进。让我们花点时间深入了解其中的一些亮点……

重大变更

团队致力于避免次要版本之间出现任何潜在的破坏性更改;但是,此类更改有时是不可避免的。

核心
  • 发现某些 JDBC 查询在特定通信故障的情况下可能无限期阻塞。为了解决这个问题,现在提供了一个新的可配置超时选项 query.timeout.ms,用于设置 JDBC 查询执行的最大时间,超过此时间将被终止(DBZ-7616)。

SQL Server
  • SQL Server 连接器之前会处理在一次数据库往返中捕获的所有事务。此行为是可配置的,并且基于 max.iterations.transactions,该选项默认为处理所有事务(值为 0)。如果数据库事务量很高,这可能导致意外的内存不足情况。

    为了解决这些用例中的问题,max.iterations.transactions 的默认值已更改为 500,以在开箱即用的情况下提高对这些部署用例的弹性。如果您想恢复到以前的行为,只需将此配置选项添加到您的连接器中,并将其值设置为 0DBZ-7750)。

新功能和改进

Debezium 2.7.0.Alpha1 还引入了许多改进和功能,让我们逐一了解。

使用 Helm Chart 安装 Debezium Operator

为了改进 Debezium Operator 的部署,可以使用 Helm Chart 进行安装,网址为 https://charts.debezium.io。这避免了将 Operator 安装到单独命名空间中过于复杂的部署模型,从而最大限度地降低了在 Kubernetes 上管理多个 Debezium Server 部署的复杂性。

支持 MongoDB 增量快照的谓词条件

增量快照过程是各种恢复情况下的重要组成部分,用于从源表或集合中收集全部或部分数据集。关系型连接器长期以来都支持在增量快照信号上提供 additional-conditions 值来限制数据集,从而能够针对性地重新同步特定行数据。

我们很高兴地宣布现在 MongoDB 也支持此功能(DBZ-7138)。与关系型数据库不同,additional-conditions 应以 JSON 格式提供。它将应用于指定的集合,使用 find 操作来获取需要增量快照的文档子集列表。

新的 MariaDB 独立连接器

Debezium 2.5 引入了对 MariaDB 的官方支持,作为现有 MySQL 连接器的一部分。这一演进的下一步是,推出了一个新的独立的 MariaDB 连接器实现(DBZ-7693)。

这里有几点值得注意:

  • MariaDB 和 MySQL 都共同依赖于一个新的抽象连接器 debezium-connector-binlog,该连接器为两个基于 binlog 的连接器提供了通用框架。

  • 每个独立连接器现在都专门针对其目标数据库进行定制,因此 MySQL 用户应使用 MySQL,MariaDB 用户应使用 MariaDB。因此,connection.adapter 配置选项已被移除,并且 jdbc.protocol 配置选项现在仅限于某些 MySQL 用例,MariaDB 不使用它。

此连接器的文档仍在完善中,将在未来添加。目前,您的大部分 MariaDB 相关信息可以参考 MySQL 连接器的文档。

ExtractNewDocumentState 为 MongoDB 删除操作包含文档 ID

在之前版本的 MongoDB ExtractNewDocumentState 单消息转换器中,删除事件的 payload 中不包含标识符。这降低了删除事件的意义,因为消费者收到的数据不足以处理这些事件。此行为已得到改进,删除事件现在包含一个 _id 属性在 payload 中(DBZ-7695)。

事务元数据编码顺序

在某些管道中,顺序对于消费应用程序至关重要。某些场景可能会影响数据管道的这一方面,例如 Kafka 重分区发生时。这会导致事后试图重建顺序时出现容易出错的问题。

现在,当启用事务元数据时,这些元数据事件还将编码其事务顺序,因此,如果发生 Kafka 重分区或其他改变顺序语义的场景,消费者只需使用新的编码顺序字段即可实现事务的确定性排序(DBZ-7698)。

阻塞增量快照改进

在某些用例中,增量快照信号需要对完全限定的表名中的特定字符进行转义。这给阻塞快照带来了一些问题,因为用于解析要快照的表的机制略有不同。在 Debezium 2.7 中,我们统一了这种方法,现在您可以在适用情况下将转义后的表名用于阻塞快照(DBZ-7718)。

Cassandra 性能改进

Debezium 2.7 在 Cassandra 连接器方面也进行了一些更改,特别是性能优化。KafkaRecordEmitter 的实现依赖于一个线程同步块,该块降低了吞吐量。此外,该实现还执行了一些不必要的刷新,这也影响了性能。已重写此代码以提高吞吐量并减少不必要的刷新调用(DBZ-7722)。

新的 Oracle "RawToString" 自定义转换器

虽然 Oracle 建议用户避免使用基于 RAW 的列,但出于向后兼容性的原因,这些列在标准 Oracle 表中仍然被广泛使用。但也有业务用例,继续使用 RAW 列而不是其他数据类型是有意义的。

Debezium 2.7 引入了一个专为 Oracle 设计的新自定义转换器,名为 RawToStringConverterDBZ-7753)。此自定义转换器旨在允许您快速将 RAW 列的字节数组内容转换为基于字符串的字段,使用 STRING schema 类型。这对于您使用 RAW 列存储不需要 VARCHAR2 的排序开销的字符数据,但仍需要将该字段作为基于字符串的数据发送给消费者的情况很有用。

要开始使用此自定义转换器,请参阅 文档 以获取更多详细信息。

改进 Oracle 的 NLS 字符集支持

安装 Debezium 2.7 Oracle 连接器时,您可能会注意到一个新的依赖项 orai18n.jar。正在自动分发此依赖项以提供对某些方言的扩展字符集支持(DBZ-7761)。

改进 Vitess 中的时间类型支持

Debezium 关系型连接器依赖于一个名为 time.precision.mode 的配置选项,用于控制如何将时间类型值添加到变更事件中。在某些情况下,您可能希望使用与 Kafka 类型兼容的模式,例如使用 connect 模式。在其他情况下,您可能更愿意通过使用默认的 adaptive_milliseconds 模式来避免精度损失。

Debezium for Vitess 连接器传统上不遵循此模型,而是将时间类型值作为基于字符串的类型发出。虽然这有助于避免在使用 connect 模式时出现精度损失问题,但这增加了消费者解析和操作这些值的开销。

在 Debezium 2.7 中,Vitess 将此行为与其他关系型连接器保持一致,使用 time.precision.mode 来控制时间类型值的发送方式(DBZ-7773)。默认情况下,它将使用 adaptive_milliseconds 模式,但如果您愿意,可以将其自定义为使用 connect 模式。已移除基于字符串的时间类型值的发出。

其他更改

总共有 50 个问题在此版本中得到修复。以下是一些其他值得注意的变更列表:

  • 内置数据库名称过滤器在快照中错误地仅应用于集合而非数据库 DBZ-7485

  • 将 Debezium Quarkus Outbox 升级到 Quarkus 3.9.2 DBZ-7663

  • 在 Debezium 首次部署后,如果向 MSSQL 添加了新表,其 schema 会被捕获 DBZ-7697

  • 测试失败,因为使用了错误的 Topic DBZ-7715

  • 增量快照:当数据库有 1000 张表时读取重复数据 DBZ-7716

  • 处理 JDBC 连接器系统测试中的不稳定性 DBZ-7726

  • SQLServerConnectorIT.shouldNotStreamWhenUsingSnapshotModeInitialOnly 检查旧的日志消息 DBZ-7729

  • 修复 MongoDB unwrap SMT 测试 DBZ-7731

  • 快照因无效锁错误而失败 DBZ-7732

  • 在 Oracle 11 中,V$THREAD 上查询的 CON_ID 列不可用 DBZ-7737

  • Redis NOAUTH 身份验证错误,当指定 DB 索引时 DBZ-7740

  • 在 Infinispan 中获取 Oracle 缓冲区中最旧的事务可能导致 NoSuchElementException DBZ-7741

  • MySQL Debezium 连接器重置后未进行快照。 DBZ-7743

  • MongoDb 连接器无法与负载均衡集群一起工作 DBZ-7744

  • 对齐 unwrap 测试以遵守 AT LEAST ONCE 传递 DBZ-7746

  • 在系统测试套件中排除 Kafka 连接依赖项中的 reload4j DBZ-7748

  • Pod 安全上下文未从模板设置 DBZ-7749

  • 应用 MySQL binlog 客户端版本 0.29.1 - bugfix:反序列化 gtid 事务长度时读取长值 DBZ-7757

  • BufferedChangeStreamCursor 会吞噬流式异常 DBZ-7759

  • 仅为默认值使用线程限制 DBZ-7763

  • 将缓存线程池评估为异步嵌入式引擎的默认选项 DBZ-7764

  • Sql-Server 连接器在初始启动/处理记录后,在后续启动时失败 DBZ-7765

  • 有效的 resume token 被视为无效,这会导致某些快照模式下进行新快照 DBZ-7770

  • 提高使用 List#get() 的异步引擎处理器的处理速度 DBZ-7777

  • NO_DATA 快照模式验证在快照未完成时重试时抛出 DebeziumException DBZ-7780

  • DDL 语句无法解析 DBZ-7788

  • 记录查找完整更新类型中 after 字段中潜在的 null 值 DBZ-7789

  • ibmi-connector 服务中的旧类引用 DBZ-7795

  • Debezium Scripting 的文档提到了错误的属性 DBZ-7798

  • 修复无效的日期/时间戳检查和日志级别 DBZ-7811

下一步是什么?

Debezium 2.7 刚刚起步,我们计划了许多额外的变更,包括一个 MongoDB Sink 连接器,扩展 Oracle 23 支持,一个旨在帮助某些多租户 Schema 架构降低内存占用的新 SPI,等等。您可以在我们的 路线图上找到更多关于 Debezium 2.7 计划的内容。

团队也正在最终确定我们线下会议的议程。如果您有任何希望我们讨论的建议或想法,或者希望在 2.7 或未来的版本中看到计划的内容,请随时通过我们的 邮件列表或我们的 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 及其作者。保留所有权利。有关我们的商标详情,请访问我们的 商标政策商标列表。第三方商标属于其各自所有者,在此提及并不表示任何认可或关联。
×