我很高兴地宣布 Debezium 3 版本流的第二个维护版本,即 3.0.2.Final。此维护版本引入了许多功能,让我们花点时间深入了解亮点。

新功能和改进

Debezium 3.0.2.Final 引入了一些改进和新功能,让我们逐一了解。

核心

在 never snapshot 模式下执行阻塞快照

Debezium 的阻塞快照进程旨在根据提供的信号执行*初始*快照,选择性地发出一个或多个表的数据。当与*never* snapshot mode 结合使用时,这会导致意外行为。

在此版本中,我们修改了连接器偏移量以跟踪配置的 snapshot.mode,从而允许阻塞快照成功并在收到信号时执行*初始*快照,即使 snapshot.mode 配置为*never* 执行快照。这使用户能够安全地将此功能与此配置一起使用(DBZ-7903)。

由于连接器偏移量存储的更改,一旦连接器升级到 3.0.2.Final 或更高版本,连接器将无法降级到 3.0.1.Final 或更早版本。

MongoDB

RowsChanged JMX 指标类型更改

在之前的 MongoDB 连接器版本中,RowsChanged JMX 指标被暴露为 java.util.Map,这与关系连接器上暴露的相同 JMX 指标 TabularData 相矛盾。这在 3.0.2.Final 中已修复,JMX 指标在所有连接器实现中都使用 TabularData 以保持一致性(DBZ-8359)。

如果您之前曾捕获 RowsChanged,则现有的 MongoDB JMX 流水线可能需要进行调整。

Oracle

时间戳精度更高

Debezium for Oracle 传统上会以毫秒精度发出列时间戳值,该精度由挖掘会话连接上设置的 NLS 会话属性控制。精度得到改进,提供基于纳秒(即FF9)的值(DBZ-8379)。

发出的字段类型基于列的数据类型,因此发出的字段数据类型保持不变。发生变化的是,当列具有微秒或纳秒级别的值时,这些值以前为零,现在将具有非零值。

警告或跳过 DML 异常

event.processing.failure.handling.mode 可以配置为*fail*、*warn*或*skip*特定的连接器错误条件,以提高连接器对各种数据问题的可靠性。此配置历史上用于控制 Oracle 连接器在观察到 DDL 失败时的行为。

在此版本中,event.processing.failure.handling.mode 也用于控制 DML 事件的失败。如果 Oracle 连接器在解析您的*insert*、*update*或*delete*操作时出现问题,您可以根据需要安全地将连接器配置为*fail*、*warn*或*skip* DML 事件(DBZ-8208)。

默认行为是当连接器未能安全处理事件时始终*fail*。通过将其调整为*warn*或*skip*,虽然连接器将安全地跳过失败的事件,但您会引入数据丢失,需要手动解决。

Vitess

性能改进

在早期版本的 Debezium for Vitess 连接器中,连接器使用基于正则表达式的过滤系统,该系统根据具有不同后缀的前缀匹配所有表,然后根据配置应用排除。这有可能浪费 CPU 并创建热点,因为为稍后会被过滤和垃圾回收的事件创建了中间对象。

在此版本中,我们通过在事件处理链的早期应用过滤来改进 Vitess 连接器处理此用例的方式。这应该会减少创建的中间对象的数量,并提高连接器的整体性能。对于具有相同前缀和不同后缀的键空间,与旧版本相比,这应该能提供更好的整体性能(DBZ-8354)。

Sink 连接器

Debezium 0.x 引入了一个通用的源连接器框架,该框架已成为项目提供的源连接器的基础,包括我们社区驱动的连接器,如 Spanner、Vitess 等。随着最近引入 MongoDB sink 连接器,我们的长期目标是以类似的方式处理 sink 连接器,提供一个通用的 sink 连接器框架,以简化 Debezium sink 连接器的创建。

在 Debezium 3.x 的生命周期中,您将看到为简化 JDBC 和 MongoDB sink 连接器之间的源而采取的增量步骤。我们将尽量减少对维护版本的影响,正如您所期望的那样,但预计未来的主要和次要版本将引入弃用和更改以支持此项工作。

在这一轮更改中,我们引入了一个新的 Debezium 模块:debezium-sink。该模块充当所有 sink 连接器的基础,并包含各种常用类,包括 SinkConnectorConfig 类、命名策略实现以及 sink 记录的通用表示 DebeziumSinkRecord

随着我们继续简化 MongoDB 和 JDBC sink 连接器,将添加额外的通用行为。

JDBC sink 连接器更改

由于 sink 模块使用*collection*而不是*table*的命名约定,因此已弃用并替换了几个配置属性。旧属性在 Debezium 3.0.x 版本中将继续有效;但将在 Debezium 3.1 中删除。

  • table.name.format 属性被 collection.name.format 替换。

  • table.naming.strategy 属性被 collection.naming.strategy 替换。

此外,table.naming.strategy 属性指定的 io.debezium.connector.jdbc.naming.TableNamingStrategy 的约定已弃用。已引入新的 io.debezium.sink.naming.CollectionNamingStrategy,其签名略有不同。

TableNamingStrategy 约定
    /**
     * Resolves the logical table name from the sink record.
     *
     * @param config sink connector configuration, should not be {@code null}
     * @param record Kafka sink record, should not be {@code null}
     * @return the resolved logical table name; if {@code null} the record should not be processed
     */
    String resolveTableName(JdbcSinkConnectorConfig config, SinkRecord record);
CollectionNamingStrategy 约定
    /**
     * Resolves the logical collection name from the Debezium sink record.
     *
     * @param record Debezium sink record, should not be {@code null}
     * @param collectionNameFormat the format string for the collection name (mapped from the topic name)
     * @return the resolved logical collection name; if {@code null} the record should not be processed
     */
    String resolveCollectionName(DebeziumSinkRecord record, String collectionNameFormat);

主要区别包括新的 DebeziumSinkRecord,它取代了 SinkRecord,并显式传递 collection 命名格式,而不是配置类。

如果您在 Debezium JDBC sink 连接器的部署中实现了自定义 TableNamingStrategy,请务必调整您的代码以使用新的 CollectionNamingStrategy,以便在更新到 Debezium 3.1+ 时您的流水线能够继续安全运行。

Debezium 操作员

启用 Debezium Server REST 端点

现在可以通过 Debezium Operator 在 Kubernetes 上使用 Debezium Server 部署自动启用 Debezium Server API RESTful 端点。在部署描述符的 spec 部分,您可以包含 runtime.api.enabled 属性来切换 API 端点(DBZ-8234),如下所示。

YAML 配置示例
apiVersion: debezium.io/v1alpha1
kind: DebeziumServer
metadata:
  name: my-debezium
spec:
  image: quay.io/debezium/server:3.0.2.Final
  quarkus:
    config:
      log.console.json: false
      kubernetes-config.enabled: true
      kubernetes-config.secrets: postgresql-credentials
  runtime:
    api:
      enabled: true
  sink:
    type: kafka
    config:
      producer.bootstrap.servers: dbz-kafka-kafka-bootstrap:9092
      producer.key.serializer: org.apache.kafka.common.serialization.StringSerializer
      producer.value.serializer: org.apache.kafka.common.serialization.StringSerializer
  source:
    class: io.debezium.connector.postgresql.PostgresConnector
    offset:
      memory: { }
    schemaHistory:
      memory: { }
    config:
      database.hostname: postgresql
      database.port: 5432
      database.user: ${POSTGRES_USER}
      database.password: ${POSTGRES_PASSWORD}
      database.dbname: ${POSTGRES_DB}
      topic.prefix: inventory
      schema.include.list: inventory

默认情况下,Debezium Server API 端点是禁用的,但可以通过将 spec.runtime.api.enabled 设置为 true 来启用,如上所示。

其他修复

总共有 46 个问题在 Debezium 3.0.2.Final 中得到解决。更改列表也可以在我们的 发布说明中找到。

以下是一些值得注意的更改

  • 明确信号数据收集每个连接器应唯一 DBZ-6837

  • stop-snapshot 信号中的竞态条件 DBZ-8303

  • Debezium 尽管有 RabbitMQ 超时和未确认消息,仍移动 binlog 偏移量 DBZ-8307

  • 在 Debezium sink 连接器内部使用 DebeziumSinkRecord 而不是 Kafka Connect 的 SinkRecord DBZ-8346

  • 在 DS 中实现新的 config map 偏移量存储 DBZ-8351

  • Debezium 服务器使用 eventhubs sink 类型和 eventhubs emulator 连接字符串时失败 DBZ-8357

  • 使用信号进行快照的过滤器似乎不起作用 DBZ-8358

  • JDBC 存储模块不使用 quay.io 镜像 DBZ-8362

  • 偏移量存储调用 configure/start 失败被记录为 DEBUG 级别 DBZ-8364

  • S3 schema history 字段列表中缺少对象名称 DBZ-8366

  • 错误的“无法加载强制配置”错误消息 DBZ-8367

  • 升级 protobuf 依赖项以避免潜在漏洞 DBZ-8371

  • 将转换页面添加到提供一个地方列出已配置的转换以及添加新转换的 UI DBZ-8374

  • 升级 Kafka 到 3.8.1 DBZ-8385

  • IncrementalSnapshotIT 中的测试可能随机失败 DBZ-8386

  • 添加转换编辑和删除支持。 DBZ-8388

  • 如果最近发生了一个检查点,Log SCN 存在性检查可能会抛出 ORA-01291 DBZ-8389

  • ExtractNewRecordState 转换:处理非信封记录时出现 NPE DBZ-8393

  • Oracle LogMiner 指标 OldestScnAgeInMilliseconds 可能为负值 DBZ-8395

  • SqlServerConnectorIT.restartInTheMiddleOfTxAfterCompletedTx 随机失败 DBZ-8396

  • ExtractNewDocumentStateTestIT 随机失败 DBZ-8397

  • BlockingSnapshotIT 在 Oracle 上失败 DBZ-8398

  • Oracle OBJECT_ID 查询和混合挖掘模式下的高 CPU 和延迟 DBZ-8399

  • 升级 Kafka 到 3.9.0 DBZ-8400

  • Protobuf 插件在 Debian 上无法为 PostgreSQL 17 编译 DBZ-8403

  • 将 Quarkus Outbox Extension 升级到 Quarkus 3.16.3 DBZ-8409

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