我们很高兴地宣布 Debezium 2.6.0.Beta1 发布。本次发布标志着我们进入了冲刺阶段,包含了许多改进、增强、错误修复,以及一个全新的 Db2 for iSeries 连接器。本次发布内容繁多,让我们立即开始吧!

重大变更

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

Oracle

在早期版本的 Debezium 中,用户需要手动安装 ojdbc8.jar JDBC 驱动程序。在 2.6 版本中,连接器现在将 Oracle JDBC 驱动程序与连接器捆绑在一起,因此不再需要手动安装(DBZ-7364)。

我们还将驱动程序更新到 21.11.0.0 版本,请在升级到 Debezium 2.6 后验证您是否没有多个版本(DBZ-7365)。

容器镜像

connect-base 容器镜像(debezium/connect 的基础)中对 MAVEN_DEP_DESTINATION 环境变量的处理方式已发生改变。它不再用于下载所有依赖项(包括连接器),而仅用于通用的 Maven Central 依赖项(DBZ-7551)。如果您使用了依赖于此环境变量的自定义镜像,则可能需要修改您的镜像构建步骤。

改进和更改

Db2 for iSeries 连接器

Debezium 2.6 推出了一款全新的连接器,供 IBM 用户通过 IBM iJournal 系统流式传输 Db2 iSeries/AS400 的更改。这项协作是社区多年努力的成果,我们很高兴社区允许其在 Debezium 框架下分发。

您可以使用以下坐标或 直接下载 从 Maven Central 获取新的连接器。

<dependency>
    <groupId>io.debezium</groupId>
    <artifactId>debezium-connector-ibmi</artifactId>
    <version>2.6.0.Beta1</version>
</dependency>

此新连接器的文档仍在完善中。如果您有任何疑问,请随时通过 Zulip 或邮件列表与团队联系。

PostgreSQL 的增量快照行值构造器

PostgreSQL 驱动程序支持一种称为行值构造器的 SQL 语法,使用 ROW() 函数。这允许查询在处理具有合适索引的多列主键时,以更有效的方式表达谓词条件。增量快照过程是使用 ROW() 函数的理想候选者,该过程涉及发出​​一系列 select SQL 语句来分块获取数据。每个语句(即块查询)应尽可能高效,以最小化这些查询的成本开销,从而最大限度地提高 WAL 更改到您主题的吞吐量。

无需进行任何特定更改,但已调整 PostgreSQL 增量快照发出的查询以利用此新语法,因此使用增量快照的用户应该会看到性能提升。

对于简单表,旧查询的示例可能如下所示:

SELECT *
  FROM users
 WHERE (a = 10 AND (b > 2 OR b IS NULL)) OR (a > 10) OR (a IS NULL)
 ORDER BY a, b LIMIT 1024

新实现使用 ROW() 函数构建此查询,如下所示:

SELECT *
  FROM users
 WHERE row(a,b) > row(10,2)
ORDER BY a, b LIMIT 1024

我们很想听听您对此次更改的反馈,以及观察到的性能改进。

信号表水印元数据

增量快照过程需要一个信号表来写入开启/关闭标记,以协调更改边界与事务日志中记录的数据(除非您使用的是 MySQL 的只读模式)。在某些情况下,用户希望能够跟踪时间窗口,知道窗口何时打开和关闭。

从 Debezium 2.6 开始,信号表中的 data 列将填充时间窗口详细信息,使用户能够获取窗口何时打开和关闭。以下显示了两个信号标记各自的 data 列详细信息:

窗口开启标记
{"openWindowTimestamp": "<window-open-time>"}
窗口关闭标记
{"openWindowTimestamp": "<window-open-time>", "closeWindowTimestamp": "<window-close-time>"}

Oracle LogMiner 每个事件的 REDO SQL

我们改进了 Oracle 连接器的插入、更新和删除事件结构,使其可以选择性地包含 LogMiner 在 source 信息块中重建的 SQL。此功能是可选的,您必须启用它,因为这很容易使现有事件载荷的大小增加一倍以上。

要启用将 REDO SQL 作为更改事件的一部分,请添加以下连接器配置:

"log.mining.include.redo.sql": "true"

启用此选项后,source 信息块将包含一个名为 redo_sql 的新字段,如下所示:

"source": {
  ...
  "redo_sql": "INSERT INTO \"DEBEZIUM\".\"TEST\" (\"ID\",\"DATA\") values ('1', 'Test');"
}

由于 LogMiner 重建与 CLOB、BLOB 和 XML 数据类型相关的 SQL 的方式,此功能无法与 lob.enabled 设置为 true 一起使用。如果添加了上述配置并且 lob.enabled 设置为 true,连接器将以关于此配置错误的错误开始。

Oracle LogMiner 事务缓冲区改进

在使用 LogMiner 时,已为事务注册添加了一种新的延迟策略。此策略有效地将事务记录在缓冲区中的创建推迟到我们观察到该事务的第一个捕获更改为止。

对于使用 Infinispan 缓存或启用了 lob.enabled 的用户,由于这两种连接器模式下特定操作的处理方式,无法使用这种延迟策略。

延迟事务注册有许多好处,包括:

  • 减少对事务缓存的开销,尤其是在高并发事务场景下。

  • 避免捕获了更改的长期运行事务。

  • 在特定场景下,应有助于更有效地推进偏移量中的低水位 SCN。

我们正在研究如何在未来的构建中为基于 Infinispan 的用户探索此更改;但是,由于 lob.enabled 与 LogMiner 的工作方式,此功能对于该用例将不可行。

改进事件时间戳精度

Debezium 2.6 推出了一项社区请求的新功能,以提高更改事件中时间戳的精度。用户现在会注意到增加了 4 个新字段,两个在信封级别,两个在 source 信息块中,如下所示:

{
  "source": {
    ...,
    "ts_us": "1559033904863123",
    "ts_ns": "1559033904863123000"
  },
  "ts_us": "1580390884335451",
  "ts_ns": "1580390884335451325",
}

信封值将始终提供微秒 (ts_us) 和纳秒 (ts_ns) 值,而 source 信息块可能会同时提供微秒和纳秒精度值,如果源数据库未提供该级别的精度,则会截断到较低精度。

Informix 将 LSN 追加到事务标识符

Informix 数据库仅在存在并发事务时才增加事务标识符,否则对于顺序事务,该值保持不变。这可能会给希望在后处理步骤中利用事务元数据来排序更改事件的用户带来困难。

Debezium 2.6 for Informix 现在会将日志序列号 (LSN) 追加到事务标识符,以便用户可以轻松地按事务元数据对更改事件进行排序。事务标识符字段现在使用格式 <id>:<lsn>。此更改会影响事务元数据事件和更改事件的 source 信息块,如下所示:

事务开始事件
{
  "status": "BEGIN",
  "id": "571:53195829",
  ...
}
事务结束事件
{
  "status": "END",
  "id": "571:53195832",
  ...
}
更改事件
{
  ...
  "source": {
    "id": "571:53195832"
    ...
  }
}

新的基于任意格式的载荷格式

虽然用户通常会利用基于 Json、Avro、Protobufs 或 CloudEvents 的序列化,但可能也有使用更简单格式的理由。感谢社区的贡献,作为 DBZ-7512 的一部分,Debezium 可以配置为使用两种新格式,称为 simplestringbinary

simplestringbinary 格式在 Debezium 服务器中使用 debezium.format 配置进行设置。对于 simplestring,载荷将作为单个 STRING 数据类型序列化到主题中。对于 binary,载荷将使用 byte[](字节数组)序列化为 BYTES

Oracle LogMiner 混合挖掘策略

Debezium 2.6 还引入了一种新的 Oracle LogMiner 挖掘策略,称为“hybrid”,可以通过将配置属性 log.mining.strategy 设置为 hybrid 来启用。此新策略旨在支持默认挖掘策略的所有模式演进功能,同时利用在线目录策略的所有性能优化。

online_catalog 策略的主要问题是,如果挖掘步骤在同一挖掘步骤中观察到模式更改和数据更改,LogMiner 就无法正确重建 SQL,这将导致表名显示为 OBJ# xxxxxx,或者列显示为 COL1COL2 等。为了避免这种情况,在使用在线目录策略时,建议用户以锁定步骤模式执行模式更改,以避免挖掘步骤同时观察到模式更改和数据更改;然而,这并不总是可行的。

新的混合策略通过在数据库级别跟踪表的对象 ID,然后使用此 ID 从 Debezium 的关系表模型中查找与表关联的模式。简而言之,这允许 Debezium 处理 Oracle LogMiner 在这些特定边缘情况下无法处理的问题。表名将取自关系模型的表名,列将按列位置进行映射。

不幸的是,Oracle 不提供重建 CLOB、BLOB 和 XML 数据类型失败的 SQL 操作的方法。这意味着新的混合策略无法与 lob.enabled 设置为 true 的配置一起使用。如果使用混合策略启动连接器并且 lob.enabled 设置为 true,则连接器将无法启动并报告配置失败。

其他更改

总共有 86 个问题 在本次发布中得到修复

  • MySQL 配置值验证两次 DBZ-2015

  • PostgreSQL 连接器在数据库不可达时无法正确重启 DBZ-6236

  • MongoDB 连接器中的 NullPointerException DBZ-6434

  • RHEL 系统测试套件中的测试在没有 ocp 集群的情况下抛出错误 DBZ-7002

  • 将 MongoDB ReplicaSet 的超时配置移至 Builder 类 DBZ-7054

  • 几个 Oracle 测试在测试农场基础设施上经常失败 DBZ-7072

  • 从 TF 中移除过时的 MySQL 版本 DBZ-7173

  • 在 CI 测试矩阵中添加 Oracle 23 DBZ-7195

  • 重构分片 MongoDB OCP 测试 DBZ-7221

  • 实现快照器 SPI Oracle DBZ-7302

  • 对 SQLServer 的快照模式进行统一和调整 DBZ-7303

  • 更新快照模式文档 DBZ-7309

  • Cassandra-4:Debezium 连接器在模式更改后停止生成事件 DBZ-7363

  • 将 ojdbc8 升级到 21.11.0.0 DBZ-7365

  • 记录 outbox 列类型与序列化器之间的关系 DBZ-7368

  • 下游用户指南中的 Callout 注释被多次渲染 DBZ-7418

  • testEmptyChangesProducesHeartbeat 测试倾向于随机失败 DBZ-7453

  • 对 PostgreSQL、MySQL、Oracle 的快照模式进行统一和调整 DBZ-7461

  • Oracle ReselectColumnsProcessor 中存在 PreparedStatement 泄露 DBZ-7479

  • 允许在信号表名称中使用特殊字符 DBZ-7480

  • 记录 MariaDB 模式切换 DBZ-7487

  • 使用新的 reselect SMT 进行快照时性能较差 DBZ-7488

  • Debezium Oracle 连接器在 XMLTYPE 与 lob.enabled=true 时出现 ParsingException DBZ-7489

  • 将 Informix 添加到主存储库 CI 工作流程 DBZ-7490

  • Db2ReselectColumnsProcessorIT 在测试失败后未进行清理 DBZ-7491

  • 在 GitHub 上禁用 Oracle 集成测试 DBZ-7494

  • 统一和调整线程超时 DBZ-7495

  • 完成回调在连接器停止之前被调用 DBZ-7496

  • 为 Oracle 23 添加“IF [NOT] EXISTS” DDL 支持 DBZ-7498

  • 部署示例显示属性名称而非其值 DBZ-7499

  • 修复 MySQL 8 事件时间戳解析逻辑错误,该错误导致非 GTID 事件错误地回退到秒 DBZ-7500

  • 从 Debezium 文档中移除“incubating”字样 DBZ-7501

  • 添加将 Map<String, Object> 解析为 ConfigProperties 的能力 DBZ-7503

  • LogMinerHelperIT testShouldAddCorrectLogFiles 随机失败 DBZ-7504

  • 支持 Oracle 23 SELECT(无 FROM) DBZ-7505

  • 为 CREATE/ALTER TABLE 语句添加 Oracle 23 注解支持 DBZ-7506

  • TestContainers MongoDbReplicaSetAuthTest 随机失败 DBZ-7507

  • MySQl ReadOnlyIncrementalSnapshotIT testStopSnapshotKafkaSignal 随机失败 DBZ-7508

  • 将 Informix 添加到 Java Outreach DBZ-7510

  • 禁用针对 Apicurio 的 DBZ 服务器测试中的并行记录处理 DBZ-7515

  • 在 Reselect Columns PostProcessor 测试中添加 Start CDC 钩子 DBZ-7516

  • 在 EmbeddedEngine.java 的 createSourceTask 方法中删除未使用的 'connector' 参数 DBZ-7517

  • 将 commons-compress 更新至 1.26.0 DBZ-7520

  • 将 JDBC sink 从 Incubation 升级 DBZ-7521

  • 允许也从 Docker Hub 下载容器 DBZ-7524

  • 更新 rocketmq 版本 DBZ-7525

  • signalLogWithEscapedCharacter 使用 pgoutput-decoder 时失败 DBZ-7526

  • 将 RocketMQ 依赖项移至 Debezium 服务器 DBZ-7527

  • 重新设计 shouldGenerateSnapshotAndContinueStreaming 断言以处理并行化 DBZ-7530

  • 多线程快照可能导致更改乱序入队 DBZ-7534

  • AsyncEmbeddedEngineTest#testTasksAreStoppedIfSomeFailsToStart 随机失败 DBZ-7535

  • MongoDbReplicaSetAuthTest 随机失败 DBZ-7537

  • SQLServer 测试因数据库状态不佳而耗时过长 DBZ-7541

  • 显式导入被 glassfish 过滤器排除的 jakarta 依赖项 DBZ-7545

  • ReadOnlyIncrementalSnapshotIT#testStopSnapshotKafkaSignal 随机失败 DBZ-7553

  • 将 RocketMQ 和 Redis 容器输出包含到测试日志中 DBZ-7557

  • 允许重试 XStream 错误 ORA-23656 DBZ-7559

  • 数值默认值小数点精度不匹配 DBZ-7562

  • 等待 Redis 服务器启动 DBZ-7564

  • 文档冲突 DBZ-7565

  • 修复 MySqlStreamingChangeEventSource::setEventTimestamp 中 FORMAT_DESCRIPTION 和 PREVIOUS_GTIDS 事件可能产生的 null 事件时间戳 DBZ-7567

  • AsyncEmbeddedEngineTest.testExecuteSmt 随机失败 DBZ-7568

  • Debezium 使用 JDK 21 编译失败 DBZ-7569

  • 将 PostgreSQL 驱动程序升级到 42.6.1 DBZ-7571

  • 升级 Kafka 到 3.7.0 DBZ-7574

  • Redis 测试因 JedisConnectionException: Unexpected end of stream 随机失败 DBZ-7576

  • RedisOffsetIT.testRedisConnectionRetry 随机失败 DBZ-7578

  • Oracle 连接器始终引入 OLR 依赖项 DBZ-7579

  • 正确处理 JDBC 连接器依赖项 DBZ-7580

  • 在 PostgreSQL 故障情况下改进日志记录 DBZ-7581

  • 不可用的 Toasted HSTORE Json Storage Mode 列导致序列化失败 DBZ-7582

  • 减少测试中的调试日志 DBZ-7588

  • Server SQS sink 不支持 quick profile DBZ-7590

  • Oracle Connector REST Extension Tests Fail DBZ-7597

  • 使用 Infinispan Buffer 序列化带有 NULL 值的 XML 列失败 DBZ-7598

展望与下一步?

未来几周将主要专注于稳定性和错误修复。我们预计将在不到三周内发布 Debezium 2.6.0.Final,因此我们鼓励您下载并测试最新的 Beta 版本,并提供您的反馈。

如果您有任何疑问,或对 Debezium 2.6 以及今年秋季推出的 Debezium 3.0 的路线图感兴趣,我们鼓励您查看我们的 路线图。如果您有任何建议或想法,请随时通过我们的 邮件列表Zulip 聊天 与我们联系。

最后,我们的 Mario Vitale 将在 Open Source Day 2024 发表演讲,他将主题为 数据一致性处理 - 一种使用 CDC 进行双写的方法。请务必在第一天 Beta 环节的上午 10:45 观看他的演讲!

下次再见……

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