当前位置: 首页 > news >正文

Debezium日常分享系列之:Debezium 3.3.0.Final发布

Debezium日常分享系列之:Debezium 3.3.0.Final发布

  • Debezium 核心功能
    • 废弃的 snapshot 模式已被移除
    • Debezium Engine 类加载器变更
  • Debezium JDBC Sink(JDBC 接收器)
    • 数据类型精度变更说明
  • Debezium 核心功能
    • Exactly-Once 语义支持
    • 禁用上下文头信息
    • 心跳信号不再持续发送
    • 连接器启动失败并显示晦涩错误
    • 临时阻塞式快照失败可能导致数据丢失的问题已修复
  • Debezium for MongoDB
    • 从指定位置启动
    • MongoEventRouter 支持自定义追踪值
  • Debezium for MariaDB
    • 支持 MariaDB 11.7+ 向量数据类型
    • 模式历史记录改进
  • Debezium for MySQL
    • 模式历史记录改进
  • Debezium for PostgreSQL
    • 支持文本搜索向量类型
    • JDBC Sink 连接器支持 TSVECTOR 数据类型
    • 发布DDL操作超时设置
    • PostgreSQL的TOAST列性能优化
    • 按需修改发布
  • Debezium for Oracle
    • 遗留的十进制处理模式行为
    • LogMiner实验性CTE查询支持
    • 最后批次处理吞吐量指标优化
    • 更智能的归档目标管理
    • XStream事件中提供的提交SCN
    • XStream不再刷新无效低水位标记
  • Debezium for SQL Server
    • 心跳机制改进
  • Debezium JDBC Sink
    • 针对数据库错误的自我修复能力

Debezium 核心功能

废弃的 snapshot 模式已被移除

在 Debezium 2.6 版本中,我们调整了 snapshot 模式的命名以更准确地反映其功能,具体包括:

  • 废弃了 schema_only_recovery 模式,替换为 recovery 模式。
  • 废弃了 schema_only 模式,替换为 no_data 模式。

从 Debezium 3.3 版本开始,schema_only_recovery 和 schema_only 模式已被完全移除。如果您的连接器配置仍然依赖这些废弃的模式,升级后会导致配置错误。因此,请务必相应地调整您的连接器配置。

Debezium Engine 类加载器变更

Debezium Engine 之前没有设置线程上下文类加载器,这可能会与 SpringBoot 等项目的集成带来问题。现在,线程上下文类加载器已被设置,并且 Debezium Engine 会使用提供的类加载器来加载所有类,而不仅仅是连接器相关的类。

Debezium JDBC Sink(JDBC 接收器)

数据类型精度变更说明

升级至 Hibernate 7.1.0.Final 版本后,对数据类型(尤其是时间类型和浮点类型)的处理精度进行了优化:

  • 时间类型(Temporal Types)
    • time 和 timestamp 类型列现在默认采用更高精度。例如:
      Oracle 的 time 和 timestamp 列将使用 9 位小数精度(此前默认为 6 位)。
  • 浮点类型(Floating-point Types)
    • Debezium 明确优先使用 float、real 和 double precision 表示浮点值。
      如果需要使用 Oracle 原生的 binary float 或 binary double 类型,需在连接器配置中设置:
      hibernate.dialect.oracle.use_binary_floats = true

Debezium 核心功能

Exactly-Once 语义支持

社区对 Debezium 支持 Exactly-Once(精确一次)语义 的呼声一直很高。通俗来说,Exactly-Once 语义意味着事件只会被投递并写入 Kafka 主题一次,从而避免重复数据的可能性。

我们很高兴地宣布,Debezium 3.3 版本已为所有核心连接器(包括 MariaDB、MongoDB、MySQL、Oracle、PostgreSQL 和 SQL Server)引入了 Exactly-Once 语义支持。

禁用上下文头信息

在 Debezium 3.2 中,我们引入了多个新的头信息,用于为 OpenLineage 提供上下文,这些头信息会自动添加到每个发出的事件中。一些用户反馈称,这些头信息无法禁用,这引发了他们的担忧,因为在某些环境中需要尽量精简事件负载。

基于社区反馈,我们引入了一个新的配置选项 extended.headers.enabled,可以将其设置为 false,从而禁用这些上下文事件头信息的添加。

心跳信号不再持续发送

在 Debezium 3.3.0.Alpha1 版本中,用户反馈在使用 heartbeat.action.query 时,Debezium 会无视配置的时间间隔,持续发送心跳事件。此问题已修复,heartbeat.action.query 现在会重新遵循 heartbeat.interval.ms 的配置间隔。

连接器启动失败并显示晦涩错误

我们已修复了一个问题:此前连接器会因误导性错误消息而启动失败,现已恢复平稳启动,同时保留了改进的偏移量验证功能。

问题背景

用户在某些极端情况下启动连接器时,会遇到如下令人困惑的异常:
org.apache.kafka.connect.errors.DataException: Invalid value: null used for required field: “schema”, schema type: STRING
该错误消息晦涩难懂,未提供实际问题的有效信息,导致排查几乎无法进行。

根本原因

此问题是我们近期对偏移量验证功能改进的意外副作用。我们优化了逻辑,以便在源数据库中偏移量位置不可用时提供更清晰的错误消息(这一功能有助于诊断常见运维问题)。
然而,新的验证逻辑假设某些偏移量属性在连接器启动时已可用。实际上,这些属性需在连接器生命周期后期才会被填充,导致验证过早失败并抛出无用的错误消息。

解决方案

我们更新了异常处理逻辑,具体改进包括:

  • 避免假设:不再假设启动时偏移量属性已可用
  • 保留验证:对真正无效的偏移量仍保持增强的验证
  • 明确报错:当偏移量位置确实有问题时,提供有意义的错误消息
  • 正常启动:避免误报,确保正常启动流程不受干扰

此修复确保您既能享受增强的错误报告功能,又不会因误判导致启动中断。

临时阻塞式快照失败可能导致数据丢失的问题已修复

我们解决了一个关键问题:当临时阻塞式快照(ad-hoc blocking snapshots)执行失败时可能导致数据丢失。现在即使快照失败,也能确保流式数据完整无缺。

问题描述

在运行临时阻塞式快照时,若表中存在无效数据会导致快照失败。此失败曾引发严重副作用:快照期间发生的流式事件会永久丢失。

这意味着,如果快照运行数小时后才遇到错误数据,连接器恢复正常流式操作时,会完全跳过这数小时内发生的所有实时变更。

解决方案

改进后的阻塞式快照通过以下方式优雅处理故障:

  • 保留快照前的流式位置:记录快照开始前的精确位置
  • 自动恢复正确位置:快照失败时从保存的位置继续处理
  • 确保零数据丢失:无论快照何时或为何失败,数据完整性均不受影响
  • 此改进显著提升了阻塞式快照在生产环境中的可靠性。

Debezium for MongoDB

从指定位置启动

Debezium 用户现在可以通过在连接器配置中指定新参数 capture.start.op.time,从 MongoDB oplog 的特定位置启动 MongoDB 源连接器。该参数需为表示 Bson 时间戳的 long 类型值。

若保留此配置参数,连接器重启时将尝试从指定位置恢复。

使用建议:当连接器开始流式传输变更后,应移除该参数,以确保后续重启遵循连接器偏移量中记录的恢复位置,而非固定时间戳。

MongoEventRouter 支持自定义追踪值

MongoEventRouter 现在支持将自定义的追踪配置值传递到路由器中,以便在事件负载中提供这些值。以下是可以提供的配置选项:

属性描述
tracing.span.context.field包含序列化跨度上下文(span context)的 java.util.Properties 表示的字段名称,默认为 tracingspancontext。
tracing.operation.name表示 Debezium 处理跨度的运算名称,默认为 debezium-read。
tracing.with.context.field.only当仅需追踪具有序列化上下文字段的事件时,设置为 true,默认为 false。

Debezium for MariaDB

支持 MariaDB 11.7+ 向量数据类型

MariaDB 11.7 引入了 VECTOR(n) 数据类型,使关系型数据库能够像向量数据库一样存储向量值。通过这一新类型,AI 模型生成的向量数据可直接存储于 MariaDB 中并支持检索。

Debezium 3.3 在以下场景中新增了对 MariaDB 向量数据类型的支持:

  • 源连接器:捕获 MariaDB 中的向量数据变更
  • JDBC Sink 连接器:向 MariaDB 目标数据库写入向量数据

模式历史记录改进

MariaDB 连接器使用模式历史记录主题(schema history topic)存储从二进制日志捕获的各种 DDL 操作,从而基于表结构变更的时间顺序构建关系模型。

在 Debezium 3.3 中,模式历史记录主题的过滤器已更新,不再存储与 Debezium 功能无关的语句,例如:

  • 存储过程(procedure)
  • 函数(function)
  • 视图(view)
  • 触发器(trigger)
  • 权限操作(grant/revoke)

生效范围:

  • 新连接器:直接应用改进后的过滤器,不存储上述无关语句。
  • 现有连接器:仅过滤新增的、符合改进条件的 DDL 语句,已存储的历史事件不受影响。

Debezium for MySQL

模式历史记录改进

MySQL 连接器使用模式历史记录主题(schema history topic)存储从二进制日志捕获的各种 DDL 操作,从而基于表结构变更的时间顺序构建关系模型。

在 Debezium 3.3 中,模式历史记录主题的过滤器已更新,不再存储与 Debezium 功能无关的语句,例如:

  • 存储过程(procedure)
  • 函数(function)
  • 视图(view)
  • 触发器(trigger)
  • 权限操作(grant/revoke)

生效范围:

  • 新连接器:直接应用改进后的过滤器,不存储上述无关语句。
  • 现有连接器:仅过滤新增的、符合改进条件的 DDL 语句,已存储的历史事件不受影响。

Debezium for PostgreSQL

支持文本搜索向量类型

PostgreSQL 13+ 引入了全文搜索数据类型。其中,tsvector 数据类型以优化文本搜索的形式表示文档,提供已排序的独立词元列表。

在 Debezium 3.3 中,现可捕获 tsvector 类型列的变更。这些列类型通过逻辑类型 io.debezium.data.Tsvector 输出,并在事件中以字符串类型表示。

JDBC Sink 连接器支持 TSVECTOR 数据类型

在 Debezium 3.3.0.Alpha1 中,我们为 PostgreSQL 源连接器引入了基于文本搜索的向量数据类型 TSVECTOR 支持。

本次更新进一步扩展了 JDBC Sink 连接器 对该类型的支持,使得 TSVECTOR 值可直接写入 PostgreSQL 目标数据库。

若目标为非 PostgreSQL 数据库,该值将被写入字符型列中。

发布DDL操作超时设置

虽然我们通常不会记录内部配置属性,但此前我们已为PostgreSQL连接器新增了一个内部配置参数internal.create.slot.command.timeout,用于在创建复制槽时设置默认的90秒超时。这一改进旨在解决因阻塞性事务导致复制槽无法创建的问题(活跃事务会阻止复制槽的创建)。

在Debezium 3.3中,我们将此超时机制扩展至PostgreSQL连接器的发布(publication)相关DDL操作。若您在创建/更新发布或复制槽时遇到超时问题,可以:

  • 调高该参数值(默认90秒)
  • 设为0以完全禁用超时功能
    (注:超时设置的单位为秒,适用于发布和复制槽的创建与修改操作。)

PostgreSQL的TOAST列性能优化

Debezium的PostgreSQL pgoutput解码器采用特定模式来判断TOAST列的值是否与预定义的标记对象匹配(这些标记对象表示该值在变更事件中不存在)。然而,当事件负载包含大量文本或二进制数据时,由于需要先计算哈希值,这种模式效率较低。

为了提升性能,新实现改用直接相等性检查,避免对大型TOAST列负载进行昂贵的哈希计算。这一优化显著降低了处理包含大文本或二进制数据事件时的开销。

按需修改发布

当Debezium PostgreSQL连接器配置为publication.autocreate.mode=filtered时,连接器会在每次重启时执行ALTER PUBLICATION语句,以确保发布内容与连接器配置保持一致。

在某些情况下,若底层表正在执行VACUUM操作或涉及长时间运行的DDL操作,连接器将被迫等待这些任务完成才能执行修改。为了优化流程并仅在必要时阻塞,连接器在filtered模式下会检查配置的表列表与当前发布的差异。仅当表列表存在差异时才会执行修改命令,否则跳过以避免潜在的阻塞调用。

Debezium for Oracle

遗留的十进制处理模式行为

在 Debezium 2.7 中,我们引入了一个错误修复,使 Oracle 连接器在使用 double 或 string 模式时的 decimal.handling.mode 行为与其他关系型数据库连接器保持一致。这一修复导致事件模式发生变化,给未预料到此类变更的升级用户带来了诸多问题。

我们考虑了多种方案(例如通过 CustomConverter 或 Transformation 提供旧版支持),但最终决定将兼容逻辑直接集成到连接器中,以提供更彻底的解决方案。

Debezium 3.3 的改进

新增配置项 legacy.decimal.handling.strategy,允许用户恢复旧版行为:
当数值的小数位数为零(即整数)且长度不超过 18 位时,不再自动转换为 double 或 string 类型,而是直接作为整数值输出。

升级建议

从 Debezium 2.7 之前版本升级:建议初始阶段启用此功能,以降低升级到 3.3 或更高版本的复杂度。

已升级至 Debezium 2.7-3.2:不建议启用旧版行为,否则会再次引入类似(但方向相反)的结构变更问题。

LogMiner实验性CTE查询支持

我们为Oracle LogMiner引入了一项新的内部实验性功能,该功能利用了称为CTE查询(Common Table Expression,公共表表达式)的概念。CTE查询是一种SQL构造,允许在另一个SQL操作的执行过程中定义临时的命名结果集,这种机制可基于多种原因提供便利。

在Debezium Oracle连接器中,新配置项internal.log.mining.use.cte.query会触发一个特殊的预处理步骤:

预过滤机制:检查所有事务,并仅对实际包含被捕获表DML操作的事务发送START、COMMIT和ROLLBACK事件。

性能优化:例如,若100个事务中仅有1个修改了目标表,则系统不仅会跳过其余99个事务的DML事件,还会省略这些事务的标记事件,从而显著减少冗余处理。
这项改进通过精准过滤无关事务,提升了日志挖掘效率。

最后批次处理吞吐量指标优化

我们提升了 Oracle LogMiner 适配器中 LastBatchProcessingThroughput JMX 指标的准确性,帮助您更清晰地监控连接器的性能表现。

旧版问题

此前,该指标基于每批次实际处理的表事件数量计算吞吐量。虽然看似合理,但在以下常见场景中会导致误导性结果:

  • 数据库级过滤:即使连接器仍需读取和评估被过滤的记录,事件计数仍会减少;
  • 事务标记干扰:事件流中的事务控制记录可能大幅拉低数值,低估实际处理负载;
  • 配置影响:某些设置会扭曲指标,无法真实反映性能。

新版改进

现在,该指标基于从 LogMiner 数据集读取的 物理 JDBC 行数 计算吞吐量,无论这些行是否:

  • 被 JVM 中的配置过滤;
  • 属于事务控制记录;
  • 与表或模式过滤器不匹配。

效果

您将获得更精确的原始处理能力视图,真实反映 Debezium 连接器在每批次处理窗口中的性能。

更智能的归档目标管理

针对特定Oracle连接器环境,现可采用基于优先级的归档目标策略。此前,用户需指定单一目标(如LOG_ARCHIVE_DEST_2),当主库切换后新主库使用不同目标名称时,需手动调整配置。

改进内容

多目标优先级配置:用户现可通过逗号分隔列表按优先级配置多个目标(DBZ-9041),例如:LOG_ARCHIVE_DEST_1,LOG_ARCHIVE_DEST_2。

自动适配故障转移:连接器会智能选择首个本地且有效的目标,无需人工干预配置变更。
示例场景

若主库使用LOG_ARCHIVE_DEST_1而备库使用LOG_ARCHIVE_DEST_2,启用此功能后,连接器将在主备切换时自动从LOG_ARCHIVE_DEST_1无缝切换至LOG_ARCHIVE_DEST_2。

XStream事件中提供的提交SCN

所有Debezium变更事件默认包含一个源信息块。对于Oracle,该信息块包含commit_scn字段,表示事务提交事件的系统变更号(SCN)。
此前,commit_scn仅在使用Oracle LogMiner时被填充。此版本中,我们将其支持扩展至Oracle XStream。

XStream不再刷新无效低水位标记

Debezium Oracle XStream实现需定期向Oracle Outbound Server刷新LCR位置。此刷新作为提示,告知Oracle该位置之前的所有变更已处理(类似于PostgreSQL向复制槽确认LSN的方式)。

此前由于偏移量刷新处理方式的问题,Oracle Outbound Server可能在尝试刷新低水位标记时误报失败,将有效位置视为无效。此问题现已修复,Outbound Server不再错误报告无效低水位位置。

Debezium for SQL Server

心跳机制改进

SQL Server 的心跳行为现在会在 CDC 表的捕获实例中没有变化的期间发出心跳事件(DBZ-9364)。这一改进有助于确保在数据库中由于非捕获表的变更导致 LSN(日志序列号)持续前进时,偏移量(offsets)仍能保持同步。

Debezium JDBC Sink

针对数据库错误的自我修复能力

JDBC Sink连接器现在能自动重试变更处理过程中发生的SQL异常,为自我修复场景提供关键缓冲,从而提升连接器的容错能力。

这一改进在多任务并发环境中尤为重要——当对同一表的并发写入导致锁冲突时,连接器不再完全失败或依赖运行时重启,而是能自行从这类临时性问题中恢复,显著提升了整体可靠性。

http://www.dtcms.com/a/466713.html

相关文章:

  • 网站的换肤功能怎么做哪个网站可以做验证码兼职
  • wordpress建站要钱吗中小型网站建设价格
  • gitee中的一些开源项目整理20251010
  • [JS]面试八股文
  • Linux中的进程监控,top界面解析
  • 构建一个属于组件的组件库
  • 【Linux笔记】网络部分——socket 编程 TCP实现多台虚拟机使用指令访问云服务器
  • 4.5 IP多播 (答案见原书 P208)
  • 照片素材库网站免费免费客户管理软件排行
  • 网站建站建设怀化最新消息今天
  • 社区类网站开发实践辽宁城乡建设厅网站
  • 花生壳建设网站线上运营的5个步骤
  • C语言 ——— 文件操作的核心概念与函数使用
  • 做网站维护的人叫啥电商网站维护费用
  • 高频面试题解析:算法到数据库全攻略
  • c# 使用yolov5模型
  • 表白网站制作代码公司邮箱如何申请
  • 厦门最早做网站的公司二字顺口名字公司
  • 【GIT】错误集锦及解决方案
  • C语言⽂件操作讲解(1~2)
  • 前端代码CR小知识点汇总
  • 企业建站免费模板wordpress访问统计
  • 乐清建站公司做网站哪里最便宜
  • 什么是 Spring AI?Spring AI 入门教程
  • 在线课程网站开发的研究意义客户管理系统免费版
  • 台州宇洋台州网站建设手机在线视频
  • uniapp开发 APP嵌入另一个APP打包的wgt文件,实现点击携带参数跳转到wgtAPP的某一个页面
  • VS2010做网站登录页面步骤可以免费浏览的网站
  • DeepSeek Sparse Attention(DSA)快速洞察(DeepSeek-V3.2)
  • 山西建设银行官方网站wordpress 文章投票插件