尽管夏天已经如火如荼地进行,Debezium的贡献者们依然辛勤工作。我很高兴地宣布Debezium 2.4系列的新预览版本,2.4.0.Alpha2

这个预览版本包含了一系列改进、错误修复和新功能,供Debezium社区进行测试和提供反馈。这个版本的一些亮点包括即时阻塞快照、源到目标列名传播、对其他MySQL驱动程序的支持,以及Debezium Server中的所有Cassandra连接器。让我们花点时间深入了解这些以及其他内容。

重大变更

Debezium Server 和 Cassandra 连接器

对于那些可能已经使用Debezium Server或想要使用Debezium Server的Cassandra连接器用户来说,我们之前只在Debezium Server发行版中包含了Cassandra 4。在Debezium 2.4中,我们将所有三个Cassandra连接器变体都包含在发行版中,这意味着Cassandra 3和DSE现在可以直接使用。

但是,为了实现这一点,引入了一个新的环境变量EXTRA_CONNECTOR,用于指定Debezium Server应该使用哪种Cassandra连接器变体。这意味着,如果您之前在Debezium Server中使用Cassandra 4,在升级时必须包含此环境变量,以便继续获得与先前版本相同的配置。

根据您打算在Debezium Server源连接器中使用的Cassandra版本,此新环境变量应设置为dsecassandra-3cassandra-4

MySQL BIGINT 精度更改

当使用bigint.unsigned.handling.mode设置为precise来配置连接器时,Debezium for MySQL连接器未能正确设置BIGINT数据类型的精度。不幸的是,这导致在模式(schema)中这类字段的模式没有包含正确的精度值。

Debezium 2.4 包含 DBZ-6714,它提供了修复来解决这类字段的错误精度问题。这可能导致在使用模式注册表(schema registry)时出现模式不兼容,因此您可能需要调整兼容性设置或采取其他措施来使用严格的兼容性规则。

Oracle 快照和查询抓取大小增加

Debezium 2.4 引入了 Oracle 连接器配置属性 snapshot.fetch.sizequery.fetch.size 的默认值更改。之前,这些属性的默认值为 2000;然而,由于社区贡献者的工作,已发现这些值可能对于生产环境来说太低了。

在此版本中,Oracle 连接器现在将为这两个属性使用默认值 10000,这应该会对大多数未显式设置这些值的用户产生积极的吞吐量改进。如果您之前在连接器配置中使用了自定义值,那么您现有的行为将不会改变。只有之前未显式设置这些值的用户才会注意到使用了新的默认值。

这些配置属性旨在作为调优参数,因为一个JDBC环境的特定配置可能在另一个环境中效果不佳。虽然我们相信这一更改不会产生负面影响,但如果您确实注意到性能下降,可以将这些属性添加到您的连接器配置中,并将其设置为以前的默认值 2000

Vitess 错误地映射了 _bin

对于以 _bin 后缀结尾的排序规则(collations),Vitess 会将其映射到 VARBINARY 数据类型。因此,Vitess 连接器推断这些列应该被当作二进制数据发出;然而,对于使用了这种排序规则的基于字符的列来说,这是不正确的。

Debezium 2.4 现在将正确地将使用 _bin 后缀排序的基于字符的列作为字符串数据发出,而不是二进制数据。这意味着,如果您正在使用模式注册表,您可能会遇到一些模式不兼容的情况,并且可能需要调整您的兼容性设置或采取其他措施来缓解这一更改。

新功能

即时阻塞快照

增量快照(Incremental snapshots)早在近两年前在Debezium 1.6中就已引入,并且在社区中一直非常受欢迎,用于处理各种重新快照的用例。然而,在某些用例中,读取事件与创建、更新和删除事件的交织可能不是理想的,甚至不被某些消费者应用程序支持。对于这些用例,Debezium 2.4引入了即时阻塞快照。

即时阻塞快照的工作方式与即时增量快照类似;然而,有一个主要区别。快照仍然通过发送信号给Debezium来触发;然而,当连接器处理信号时,关键区别在于流式传输会被暂停,直到快照过程完成。这意味着您不会收到一系列与创建、更新或删除事件交织的读取事件。这也意味着我们将以类似于传统快照的方式处理快照,因此吞吐量通常会比增量快照更高。

请注意,即时阻塞快照会在执行快照期间暂停读取事务日志。这意味着,当使用这种即时快照模式时,与传统快照对事务日志可用性的要求相同。当流式传输恢复时,如果所需的事务日志已被删除,连接器将引发错误并停止。

触发即时阻塞快照的信号与其即时增量快照的对应信号非常相似。下面的信号显示了带有条件的快照特定表的有效负载,但这使用的是新的阻塞快照而不是增量快照。

{
  "type": "execute-snapshot",
  "data": {
    "data-collections": ["public.my_table"],
    "type": "BLOCKING", (1)
    "additional-condition": "last_update_date >= '2023-01-01'"
  }
}
1 使用 BLOCKING 而不是 INCREMENTAL 来区分这两种即时快照模式。

源到目标列名传播

通常情况下,当被JDBC连接器等目标连接器消费时,列名直接映射到字段名,反之亦然。然而,在某些情况下,序列化技术(如Avro)对字段命名约定有非常具体的规则。当数据库表中的列名与序列化规则的命名约定冲突时,Debezium 会重命名事件中的字段,使其符合序列化的规则。这通常意味着字段前面会添加下划线,或者无效字符会被下划线替换。

这可能会给某些类型的目标连接器(如JDBC目标连接器)带来问题,因为目标连接器无法轻松推断目标表中的原始列名,也无法充分地在事件的字段名和列名之间进行映射(如果它们不同)。这通常意味着用户必须在目标端使用转换链来重构事件的字段,使其命名代表源。

Debezium 2.4 引入了一种方法,通过将原始列名作为字段模式参数传播来最小化甚至避免这种情况,这与我们处理数据类型、精度、标度和长度的方式非常相似。模式参数 __debezium.source.column.name 现在在启用了列或数据类型传播时包含原始列名。

Debezium JDBC 目标连接器已经支持列和数据类型传播,允许目标连接器更准确地推断列类型、长度、精度和标度。

通过这个新功能,JDBC 目标连接器将自动使用此参数中提供的列名,以确保目标表以与源相同的列名创建,即使在使用Avro或类似技术时也是如此。这意味着在使用Debezium JDBC 目标连接器时无需进行任何转换。

其他 MySQL JDBC 驱动程序

为了在AWS上使用IAM身份验证,需要一个特殊的MySQL驱动程序来提供这种功能。在Debezium 2.4中,您现在可以提供此特定驱动程序的引用,连接器将使用该驱动程序而不是连接器自带的默认驱动程序。

例如,要使用IAM身份验证在AWS上连接,需要以下配置:

database.jdbc.driver=software.aws.rds.jdbc.mysql.Driver
database.jdbc.protocol=jdbc:mysql:aws

database.jdbc.driver 指定了连接器应该加载并用于与MySQL数据库通信的驱动程序。database.jdbc.protocol 是一个补充配置属性,在某些情况下可能不需要。它默认为 jdbc:mysql,但由于AWS需要 jdbc:mysql:aws,这允许您在配置中指定此派生。

我们很乐意听到您的反馈,以及类似的功能是否对其他场景有用。

其他修复

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

  • 将跟踪切换到 OpenTelemetry DBZ-2862

  • 连接器下拉列表导致滚动条出现 DBZ-5421

  • 为显示连接器详细信息的抽屉组件提供轮廓 DBZ-5831

  • 修改运行连接器组件的滚动条 DBZ-5832

  • 连接器重启回归 DBZ-6213

  • 突出显示有关如何配置 schema history topic 以仅存储所需表数据的说明 DBZ-6219

  • 记录最优 MongoDB Oplog 配置以提高弹性 DBZ-6455

  • JDBC Schema History:当表名以 dbName.tableName 的形式传递时,连接器无法启动 DBZ-6484

  • 根据演示中从团队收到的反馈更新编辑连接器 UI DBZ-6514

  • 支持阻塞即时快照 DBZ-6566

  • 向 RabbitMQ 消费者添加新参数 DBZ-6581

  • 记录 2.4 版本中读取偏好(read preference)的变化 DBZ-6591

  • Oracle DDL 解析器在注释混淆分号时无法正确检测语句结束 DBZ-6599

  • 收到一条意外的消息类型,该消息类型没有 'after' Debezium 块 DBZ-6637

  • 当 Debezium Mongodb 连接器遇到身份验证或权限不足错误时,debezium 和 mongodb 之间的连接将持续有效。DBZ-6643

  • 当 JDBC 连接器收到 SchemaChange 记录时记录适当的错误 DBZ-6655

  • 分区查询完成后发送墓碑事件 DBZ-6658

  • 当存在 signal.data.collection 但没有 table.include.list 时,快照将无法捕获数据 DBZ-6669

  • 可重试操作会无限重试,因为错误处理程序未被重用 DBZ-6670

  • Oracle DDL 解析器不支持 ALTER TABLE 上的列可见性 DBZ-6677

  • 传播源列名并允许目标连接器使用它 DBZ-6684

  • 单 leader 任务在重新平衡后出现分区重复 DBZ-6685

  • JDBC 目标连接器在从 Kafka 加载包含结构体类型字段的扁平数据时失败 DBZ-6686

  • 使用 Debezium JDBC 目标连接器时出现 SQLSyntaxErrorException DBZ-6687

  • MBean 命名应使用 topic.prefix 而不是 connector.server.name DBZ-6690

  • CDC - Debezium x RabbitMQ - Debezium Server 在源数据库(PostgreSQL)上发生 UPDATE/DELETE 时崩溃 DBZ-6691

  • 针对 Atlas 执行 ping 命令时缺少 operationTime 字段 DBZ-6700

  • Debezium Server 中 MongoDB SRV 协议不起作用 DBZ-6701

  • 在 fork 的个人仓库中禁用 jdk-outreach-workflow.yml DBZ-6702

  • 自定义属性步骤在验证用户添加的属性时未能正常工作 DBZ-6711

  • 在 UI 安装 Dockerfile 中添加 tzdata-java DBZ-6713

  • 重构 EmbeddedEngine::run 方法 DBZ-6715

  • Oracle 在处理 DROP USER 时失败 DBZ-6716

  • 在 MySQL 连接器中支持其他 JDBC 驱动程序 DBZ-6727

  • 当上边界不在距离内时,Oracle LogMiner 挖掘距离计算应被跳过 DBZ-6733

  • 为测试库添加 STOPPED 和 RESTARTING 连接器状态 DBZ-6734

  • MariaDB:不可解析的 DDL 语句 (ALTER TABLE IF EXISTS) DBZ-6736

  • 更新 Quarkus 到 3.2.3.Final DBZ-6740

  • 解耦 Debezium Server 和 Extension Quarkus 版本 DBZ-6744

  • SingleProcessor 移除冗余的过滤逻辑 DBZ-6745

  • MySQL 方言由于拼写错误,无法正确识别非默认值 longblob 类型 DBZ-6753

  • 在使用 Redis 存储时添加一个用于选择 db 索引的新参数 DBZ-6759

  • Postgres tests for toasted byte array and toasted date array with decoderbufs plugin 失败 DBZ-6767

  • 表模式应为每个分片单独更新 DBZ-6775

  • 使用 JMX 通道时,MBean 实例之间的通知和信号会泄漏 DBZ-6777

  • 在流式传输期间添加 XMLTYPE 列时,Oracle XML 列类型未正确解析 DBZ-6782

  • 将 MySQL binlog 客户端版本升级到 0.28.1,其中包括显著的 GTID 事件性能改进 DBZ-6783

  • 向文档添加新的 Redis Sink 连接器参数描述 DBZ-6784

  • 升级 Kafka 到 3.5.1 DBZ-6785

下一步是什么?

Debezium 2.4 系列已经包含了大量新功能,而这仅仅是冰山一角。我们还有更多内容,包括下周将推出的新的Oracle OpenLogReplicator 适配器,这将包含在Debezium 2.4 Alpha3中。之后,我们将开始逐步减少开发工作,并将重点转移到Beta和Release Candidate阶段,目标是在九月底发布Debezium 2.4的最终版本。

不要忘记Debezium社区活动,我已经在 邮件列表 上与大家分享了。如果您有任何想法或建议,我非常希望得到您的反馈。我们将在未来两周内发布关于日期/时间和议程的公告。

此外,如果您今年要去圣何塞参加Current 2023大会,我很乐意与您见面并讨论您在Debezium方面的经验。我将在那里做一个关于事件驱动设计与Debezium和Apicurio的演讲,与我的好朋友Hans-Peter Grahsl和Carles Arnal一起。如果您对此感兴趣,请随时在聊天、邮件列表或直接通过电子邮件与我联系。

一如既往,如果您有任何想法或建议,您也可以通过 邮件列表 或我们的 聊天 与我们取得联系。下次再见,保持联系,保持冷静!

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