又一个发布周期完成,我们很高兴地宣布 Debezium 的下一个预览版本已发布,即 3.2.0.Alpha1。此版本基于 Kafka 4.0 构建,包含一些重大更改以及许多改进和错误修复。
让我们花点时间深入了解所有这些更改。
重大变更
任何新的主要软件版本通常都会带来一些不兼容的更改。Debezium 3.2.0.Alpha1 版本也不例外,所以让我们来讨论一下您应该注意的主要更改。
Debezium Core
基于 Kafka 4.0 构建
Debezium 3.2 是使用 Kafka 4.0 构建和测试的(DBZ-8875)。
Debezium for IBMi
缺少日志文件时抛出错误
在 Debezium for IBMi 的先前版本中,如果缺少日志文件,连接器会从第一个可用的日志文件中恢复。这会导致静默数据丢失。此行为已更改,如果必需的日志文件不再存在,连接器现在将抛出错误(DBZ-8898)。
Debezium for Oracle
使用 JKS 的安全 mTLS 连接
在使用 Debezium for Oracle 连接器使用 Java Keystores (JKS) 建立安全 mTLS 连接时,需要进行特殊配置。我们已将此信息添加到 Oracle 连接器文档 中(DBZ-8788)。
新功能和改进
以下描述了 Debezium 3.2.0.Alpha1 中所有值得注意的新功能和改进。有关完整列表,请务必阅读 发布说明 以获取更多详细信息。
Debezium Core
日志记录性能回归
在 Debezium 3.1 中,我们引入了一项变更,用于集中记录敏感信息。不幸的是,此变更导致了性能回归,导致多种代码路径的性能下降。
此变更已被撤销,并替换为一项新的实现,该实现保留了集中式日志记录的意图,同时恢复了之前的性能(DBZ-8879)。
通过 JMX 重置某些流指标
在空闲活动期间,Debezium 连接器将继续报告 LagBehindSource JMX 指标作为最后计算的值,因为该值仅在新更改收到时更新。对于某些环境而言,如果不了解空闲或低活动窗口,这会不太理想或不直观。
Debezium 3.1.1.Final 引入了一个新选项,可以通过 JConsole 或其他 JMX 集成触发,通过调用新的 resetLagBehindSource 函数来重置当前的 LagBehindSource 指标(DBZ-8885)。
注册失败时记录 JMX MBean 名称
当 JMX 指标 MBean 注册失败时,最常见的原因是已存在一个同名的 MBean。这可能由于多种原因发生,包括之前某个任务未能正常停止,或者两个共享相同 topic.prefix 的连接器之间配置错误。
不幸的是,记录的信息没有提供足够的信息来确定是哪个 MBean 和连接器导致了失败。为了解决这个问题,JMX MBean 名称将在注册失败时被记录下来,以便可以轻松确定受影响的确切连接器部署(DBZ-8862)。
Debezium for IBMi
添加对 BOOLEAN 数据类型的支持
IBM 为 IBM iSeries 数据库的 V7R5 及更高版本 V7R4 版本提供了对 BOOLEAN 数据类型的支持。在先前版本中,如果一个表包含布尔数据类型,将导致 Debezium for IBMi 连接器硬性失败。
使用 Debezium 3.2,BOOLEAN 数据类型现在可以被捕获而不会抛出异常(DBZ-7796)。
添加小数处理模式支持
decimal.handling.mode 配置属性指定了连接器应如何处理连接器特定数据类型的浮点值。在 Debezium for IBMi 连接器的先前版本中,此配置属性未被遵守。
Debezium 3.2 引入了对 decimal.handling.mode 的支持,允许您指定浮点值是否被序列化(DBZ-8301)。此配置属性可以配置为以下三个值之一
precise-
使用
java.math.BigDecimal值精确表示,这些值在更改事件中以二进制形式表示。 double-
使用
double值表示。使用double值更简单,但可能导致精度损失。 string-
将值编码为格式化的字符串。使用
string选项更容易消耗,但会导致有关实际类型的语义信息丢失。
Debezium for Oracle
仅使用已提交数据的非缓冲 LogMiner 适配器
Debezium for Oracle 引入了一个新的适配器实现,它使用数据库的内存缓冲区在关系数据库上缓冲事务,而不是依赖 JVM 堆或堆外缓存实现(DBZ-8924)。
要开始使用新适配器,需要像这样调整连接器配置
{
"database.connection.adapter": "logminer_unbuffered"
} | 虽然此新适配器遵守了大多数 |
这个新的适配器实现基于 Oracle LogMiner 的 COMMITTED_DATA_ONLY 模式。该模式强制 Oracle LogMiner 使用数据库的可用内存来缓冲事务,并且仅向 Debezium 提供已提交的更改。由于 Debezium 只接收已提交的更改,连接器可以在读取时立即分派更改,从而避免复杂的内存大小调整需求以及由于保存点或约束冲突而处理部分回滚的需要。
由于 Oracle LogMiner 现在负责缓冲事务直到提交被观察到,Oracle LogMiner 将依赖数据库的内存来处理此暂存要求。这意味着此暂存仅与 PGA_AGGREGATE_LIMIT 数据库管理员配置的 Oracle 数据库实例参数一样强大。当事务的内存需求超过此限制时,Oracle 将拒绝缓冲事务并抛出连接器错误。可以通过提高配置的限制、完全移除限制或调整事务大小以使其符合此 Oracle 限制的边界来解决此问题。
| 此功能目前处于孵化状态,即确切的语义、配置选项等可能在未来的修订版中发生变化,具体取决于我们收到的反馈。在使用此扩展时,如果您遇到任何问题,请告知我们。 |
按客户端 ID 过滤 Oracle LogMiner 结果
Oracle LogMiner 适配器提供了多种方法来通过将过滤器明确传递给数据库查询来排除事务,从而排除或仅包含特定数据库用户执行的事务。在此版本中,我们添加了另一个基于 Oracle LogMiner 字段 CLIENT_ID 的有趣过滤器标准,您可以在此字段的值基础上选择包含或排除更改(DBZ-8904)。
可以使用以下配置属性
log.mining.clientid.include.list-
指定一个逗号分隔的值列表,用于匹配捕获中的
CLIENT_ID字段。 log.mining.clientid.exclude.list-
指定一个逗号分隔的值列表,用于匹配排除在捕获之外的
CLIENT_ID字段。
与其他包含/排除配置属性一样,这些是互斥的。
在特定场景下降低了 CPU 利用率
在 Debezium 3.1 中,我们根据DBZ-8665引入了一项变更,旨在恢复 Debezium 2.7.0.Final 处理约束冲突或回滚保存点操作时的性能。虽然此变更成功降低了 Debezium 3.0 至 3.0.7 处理此类事件引起的延迟,但我们发现即使是 Debezium 2.7 的性能也总体不尽如人意。
我们已实现对事务缓冲解决方案的全面重构,以更有效地处理约束冲突和回滚保存点(DBZ-8860)。
在使用基于堆的缓冲时,我们将处理此类事件所需的时间缩短了近 90%,同时将堆外缓冲的时间复杂度降低了 97-99%。除了降低时间复杂度外,我们在处理这些事件时还降低了整体 CPU 使用率,以符合预期。
提高了 online_catalog 挖掘策略的性能
在添加 hybrid 挖掘策略之前,Debezium Oracle LogMiner 实现包含一个特定条件,用于包含 LogMiner 无法解析表名的表的事件。这种情况发生在对象 ID 和重做条目中的版本与在线数据字典不匹配时,这在执行特定 DDL 操作后会发生。
包含这些更改,特别是当用户执行批量操作且 LogMiner 无法解析表名时,会增加延迟、连接器开销,仅用于连接器记录未知表。鉴于仅仅为了记录而导致的性能下降,我们选择在后续的数据获取中省略包含这些事件(DBZ-8926)。
提高了 hybrid 挖掘策略的性能
我们还发现了另一个性能瓶颈,这次是在使用 hybrid 挖掘策略处理批量事件时,LogMiner 在对象 ID/版本不匹配时无法解析表名。hybrid 策略旨在处理这种情况并回退到 Debezium 的关系模型来解析表名;然而,尽管使用了缓存,但对于批量操作的缓存查找的成本开销却非常高。
为了降低成本并提高未知表上批量操作的吞吐量性能,我们对查找进行了重构,从而显著提高了吞吐量,使得批量操作能够更高效地处理,并降低了整体 CPU 利用率(DBZ-8925)。
改进部分回滚失败时的日志消息
在使用 Debezium for Oracle LogMiner 缓冲适配器时,当观察到部分回滚时,日志条目没有捕获对调试有用的关键信息。Debezium 3.2 现在包含与部分回滚重做条目相关的事务标识符和系统更改号(DBZ-8944)。
Debezium JDBC Sink
列/表命名策略可用的配置
Debezium JDBC Sink 提供了各种可配置的挂钩,包括定义特定部署的 TableNamingStrategy 或 ColumnNamingStrategy 实现的选项。然而,这些实现无法获取连接器部署的完整配置,使得这些挂钩的限制远不如预期。
使用 Debezium 3.2,这些策略实现提供了一个新的 configure 方法(DBZ-7051),如下所示
@Override
public void configure(Map<String, Object> config) {
} 为了向后兼容,此方法被定义为默认且没有实现,因此在不需要此配置步骤的地方不需要代码更改。
Debezium Embedded
添加新的轮询开始/结束回调
DebeziumEngine 接口提供了各种功能,包括知道连接器或任务何时启动或停止。但是,由于连接器是异步运行的,了解连接器何时进入特定用户驱动逻辑的轮询阶段可能很有用。
为了解决这个问题,在 ConnectorCallback 合同中添加了两个新方法(DBZ-8948)
/**
* Called after all the tasks have been successfully started and engine has moved to polling phase, but before actual polling is started.
*/
default void pollingStarted() {
// nothing by default
}
/**
* Called after all the tasks have successfully exited from the polling loop, i.e. the callback is not called when any of the tasks has thrown
* exception during polling or was interrupted abruptly.
*/
default void pollingStopped() {
// nothing by default
} 现在,在设置 DebeziumEngine 实例时,提供的 ConnectorCallback 实现可以根据需要包含在这些生命周期状态变化期间调用的逻辑。
Debezium 服务器
Milvus 允许展开 JSON 数据类型
Debezium 源连接器设计为将 JSON 数据类型值作为 io.debezium.data.Json 语义类型发出,该类型将 JSON 值编码为字符串。然而,在使用 Debezium Server 将更改同步到 Milvus Sink 时,这可能并不总是期望的结果。
已添加了一个新的配置属性 debezium.sink.milvus.unwind.json,它可以设置为 true 或 false(默认)。当此属性设置为 true 时,JSON 字符串值将被表示为 JsonObject(DBZ-8909)。
Redis 可以跳过心跳消息
Debezium 源连接器通常配置有心跳事件,以便在低活动期间,源的偏移量信息不会过时。然而,对于像 Redis 这样的某些 Sink,这些心跳事件对 Sink 目标没有用。
已添加了一个新的配置属性 debezium.sink.redis.skip.heartbeat.messages,它可以设置为 true 或 false(默认)。当此属性设置为 true 时,Redis Sink 将跳过向 Redis 目标发送心跳事件;但是,心跳事件将继续影响陈旧偏移量的管理(DBZ-8911)。
Debezium AI
为 Ollama 嵌入模型引入超时
我们为使用 FieldToEmbedding 转换的 Debezium AI Ollama 模型集成添加了一个新的配置属性 ollama.operation.timeout.ms。此配置属性指定了模型操作在请求超时之前允许执行的毫秒数。默认情况下,转换等待 15 秒,但可以相应地进行调整(DBZ-8908)。
Debezium 平台
改进转换的导航和工作流
我们在 Debezium Management Platform 界面中为转换添加了几个新功能(DBZ-8328),包括
-
一个新的主导航菜单选项,名为“**转换**”。
-
改进了管道创建工作流,允许在运行时添加转换。
-
支持修改和删除现有转换。
我们非常欢迎您对新的导航工作流和转换方面的改进提出反馈。
其他更改
-
流中
NumberOfEventsFiltered指标不正确 DBZ-8576 -
信号表列名是任意的,但 delete 策略期望名为 id 的列 DBZ-8723
-
在 PostgreSQL 中阻止在只读模式下进行写入操作。DBZ-8743
-
将 MariaDB 驱动程序升级到 3.5.3 DBZ-8758
-
向 UI 添加本地化支持 DBZ-8859
-
将 RocketMQ 版本从 5.1.4 升级到 5.2.0 DBZ-8864
-
升级 Chicory 版本并利用最新改进 DBZ-8867
-
当使用 Oracle 放宽的 SQL 解析器设置时,后跟逗号的撇号字符串会被截断 DBZ-8869
-
Oracle Ehcache 缓冲区在达到配置的大小时限制时会静默驱逐条目 DBZ-8874
-
提高 MySQL/MariaDB 连接器在模式恢复重新连接后的弹性 DBZ-8877
-
当事务事件计数超过阈值时,事务事件未被移除 DBZ-8880
-
将 Oracle 缓冲区类型设置为不支持/无效值未得到正确验证 DBZ-8886
-
当 temporal mode 设置为 ISOSTRING 时,Oracle 时间戳列被忽略 DBZ-8889
-
Kinesis 连接器在重试期间不发送失败的记录,而是发送原始批次的记录 DBZ-8893
-
DDL 解析在 "BY USER FOR STATISTICS" 虚拟列子句时失败 DBZ-8895
-
Postgres CapturedTables 指标未填充。 DBZ-8897
-
在后处理器配置不一致的情况下抛出更有意义的异常 DBZ-8901
-
将 Outbox Extension Quarkus 版本更新到 3.21.2 DBZ-8905
-
更新到最新的 LTS 版本 Quarkus 3.15.4 DBZ-8906
-
FieldToEmbedding SMT 对删除记录失败,出现 NPE DBZ-8907
-
当源字段名是嵌入名称的子字符串时,FieldToEmbedding SMT 崩溃 DBZ-8910
-
通过移除不必要的过滤器检查来提高性能 DBZ-8921
-
异步引擎在
StopEngineException发生时未能正常终止 DBZ-8936 -
移除不必要的元数据查询和映射获取调用 DBZ-8938
-
由于 MariaDB 的 DATETIME 数据类型中日期部分不完整,导致处理错误 DBZ-8940
-
[Conductor] 添加端点以验证信号数据收集的正确设置 DBZ-8941
-
ORA-08186 指定了无效的时间戳,在连接器启动时发生 DBZ-8943
-
多个谓词在 Operator API 中无效 DBZ-8975
非常感谢社区中所有为此次发布辛勤付出的贡献者:Andrea Peruffo, Anil Dasari, Anisha Mohanty, Ashok, Bhagyashree Goyal, Oskar Bonde, Chris Cranford, Gaurav Miglani, Giovanni Panice, Gunnar Morling, Gustavo Lira, Haris Bin Saif, Haris Osmanagić, Jiri Pechanec, Joseph Koshakow, Kavya R, Kavya Ramaiah, Mario Fiore Vitale, Micro Huang, Petar Kostov, Peter Hamer, Philipp Bouzid, Rajendra Dangwal, Robert Roldan, Vojtech Juranek, Yossi Shirizli
关于 Debezium
Debezium 是一个开源的分布式平台,可以将现有数据库转变为事件流,使应用程序能够几乎即时地看到并响应数据库中已提交的每个行级更改。Debezium 构建在 Kafka 之上,并提供了 Kafka Connect 兼容的连接器,用于监控特定的数据库管理系统。Debezium 将数据更改的历史记录在 Kafka 日志中,这样您的应用程序可以随时停止和重新启动,并可以轻松地消费在未运行时错过的所有事件,确保所有事件都被正确且完整地处理。Debezium 在 Apache 许可证 2.0 下是 开源 的。